From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mail.toke.dk (Postfix) with ESMTPS id A2A0DA1C3E3 for ; Wed, 26 Jul 2023 21:25:08 +0200 (CEST) Authentication-Results: mail.toke.dk; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Zvhu9Rxp DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1690399506; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cHY6puW3nOI/U4qtJv8yKQr5CJoUzjywbPXurWGe+CU=; b=Zvhu9Rxp9xDUCtP6skp/CC1m+qHhu+ypMEHXiEgJSK2V0InEO7RUPwAw72jQiqj1F5cs+D yue54Klb1Txy/AslqRsCwOCek8lSDiEBo3ywL4M2HYHjgJGJy5UDWjiNsMof0YcSbMGZYQ EP/lmMglS0nDxaLkfH8oG81TvSG+D8Y= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-686-wDYqBw4uP7mBTEtL7jBvKg-1; Wed, 26 Jul 2023 15:25:05 -0400 X-MC-Unique: wDYqBw4uP7mBTEtL7jBvKg-1 Received: by mail-lf1-f70.google.com with SMTP id 2adb3069b0e04-4fb7bd971aeso45684e87.0 for ; Wed, 26 Jul 2023 12:25:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690399504; x=1691004304; h=content-transfer-encoding:in-reply-to:references:to :content-language:subject:cc:user-agent:mime-version:date:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=cHY6puW3nOI/U4qtJv8yKQr5CJoUzjywbPXurWGe+CU=; b=kMG4ZI1vkqpHCPX7T+Vm94s/OQ4iDfjJtdvJcah6MzXFxoovqLiD3XBpbWa6IPGn84 oKii4fACSqNGzv5dV7eu71Obals9Dd0j3yzoGNm6xy510t3ggf4cQnzmsCYpNO4+rKOy OTiz7J5V3ZDmvPZWfUHL5ou4b+eVcvinYZzMtIugaMPxgzfs0lGwD+8h+fbQyIs6+6go dns2/GbEXVIGenaJarZ1gNgwmagXjD0VLa6BWfQI04lYdKmAjfR83sqVk+r7bdUSFwGx mTQYV6xOoNmzcxY6Js4iZ7cN4soZKFQ0ry1hu1GgIUkkg4Qn5lJFushSfzaTN3vz+Kn5 T9sQ== X-Gm-Message-State: ABy/qLbV3B+yVyUNAprcxFo/i+55V1ic8vg/aSjcqLZ03eZKbUwNgsUg /LVQ+HzRp+lJwHEc44WAP1fHf+TXWOqC41ezLWyba5wKbGU0Qfz7b2tBvLfyMvQQ4R29TVh3zAC wy7VYcB5vSsr1RmZHeiNX X-Received: by 2002:a05:6512:3b87:b0:4f8:6ac4:1aa9 with SMTP id g7-20020a0565123b8700b004f86ac41aa9mr2402lfv.21.1690399503951; Wed, 26 Jul 2023 12:25:03 -0700 (PDT) X-Google-Smtp-Source: APBJJlEjiKCpkX+P4Z3nt2t+ufZnzpxiL4Gj0TH3p3OJqMF5PL8k5Iv6RKEIjFlz16Dmr71XroFz7A== X-Received: by 2002:a05:6512:3b87:b0:4f8:6ac4:1aa9 with SMTP id g7-20020a0565123b8700b004f86ac41aa9mr2388lfv.21.1690399503524; Wed, 26 Jul 2023 12:25:03 -0700 (PDT) Received: from [192.168.41.200] (83-90-141-187-cable.dk.customer.tdc.net. [83.90.141.187]) by smtp.gmail.com with ESMTPSA id m26-20020a056512015a00b004fb745fd22fsm3428341lfo.32.2023.07.26.12.25.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 Jul 2023 12:25:02 -0700 (PDT) From: Jesper Dangaard Brouer X-Google-Original-From: Jesper Dangaard Brouer Message-ID: <383cc1ce-3c87-4b80-9e70-e0c10a7c1dcc@redhat.com> Date: Wed, 26 Jul 2023 21:25:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 To: Stanislav Fomichev , bpf@vger.kernel.org References: <20230724235957.1953861-1-sdf@google.com> <20230724235957.1953861-3-sdf@google.com> In-Reply-To: <20230724235957.1953861-3-sdf@google.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Message-ID-Hash: IXSBRZTAALJVWH7J25ZSGZ7LPYS7SIM5 X-Message-ID-Hash: IXSBRZTAALJVWH7J25ZSGZ7LPYS7SIM5 X-MailFrom: jbrouer@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: brouer@redhat.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, song@kernel.org, yhs@fb.com, john.fastabend@gmail.com, kpsingh@kernel.org, haoluo@google.com, jolsa@kernel.org, kuba@kernel.org, toke@kernel.org, willemb@google.com, dsahern@kernel.org, magnus.karlsson@intel.com, bjorn@kernel.org, maciej.fijalkowski@intel.com, hawk@kernel.org, netdev@vger.kernel.org, xdp-hints@xdp-project.net X-Mailman-Version: 3.3.8 Precedence: list Subject: [xdp-hints] Re: [RFC net-next v4 2/8] xsk: add TX timestamp and TX checksum offload support List-Id: XDP hardware hints design discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 25/07/2023 01.59, Stanislav Fomichev wrote: > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index 11652e464f5d..8b40c80557aa 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -1660,6 +1660,31 @@ struct xdp_metadata_ops { > enum xdp_rss_hash_type *rss_type); > }; > > +/* > + * This structure defines the AF_XDP TX metadata hooks for network devices. > + * The following hooks can be defined; unless noted otherwise, they are > + * optional and can be filled with a null pointer. > + * > + * int (*tmo_request_timestamp)(void *priv) > + * This function is called when AF_XDP frame requested egress timestamp. > + * > + * int (*tmo_fill_timestamp)(void *priv) > + * This function is called when AF_XDP frame, that had requested > + * egress timestamp, received a completion. The hook needs to return > + * the actual HW timestamp. > + * > + * int (*tmo_request_timestamp)(u16 csum_start, u16 csum_offset, void *priv) > + * This function is called when AF_XDP frame requested HW checksum > + * offload. csum_start indicates position where checksumming should start. > + * csum_offset indicates position where checksum should be stored. > + * > + */ > +struct xsk_tx_metadata_ops { > + void (*tmo_request_timestamp)(void *priv); > + u64 (*tmo_fill_timestamp)(void *priv); > + void (*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv); > +}; > + > /** > * enum netdev_priv_flags - &struct net_device priv_flags > * > @@ -1844,6 +1869,7 @@ enum netdev_ml_priv_type { > * @netdev_ops: Includes several pointers to callbacks, > * if one wants to override the ndo_*() functions > * @xdp_metadata_ops: Includes pointers to XDP metadata callbacks. > + * @xsk_tx_metadata_ops: Includes pointers to AF_XDP TX metadata callbacks. > * @ethtool_ops: Management operations > * @l3mdev_ops: Layer 3 master device operations > * @ndisc_ops: Includes callbacks for different IPv6 neighbour > @@ -2100,6 +2126,7 @@ struct net_device { > unsigned long long priv_flags; > const struct net_device_ops *netdev_ops; > const struct xdp_metadata_ops *xdp_metadata_ops; > + const struct xsk_tx_metadata_ops *xsk_tx_metadata_ops; > int ifindex; > unsigned short gflags; > unsigned short hard_header_len; > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index faaba050f843..5febc1a5131e 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -581,7 +581,10 @@ struct skb_shared_info { > /* Warning: this field is not always filled in (UFO)! */ > unsigned short gso_segs; > struct sk_buff *frag_list; > - struct skb_shared_hwtstamps hwtstamps; > + union { > + struct skb_shared_hwtstamps hwtstamps; > + struct xsk_tx_metadata *xsk_meta; > + }; > unsigned int gso_type; > u32 tskey; > > diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h > index 467b9fb56827..288fa58c4665 100644 > --- a/include/net/xdp_sock.h > +++ b/include/net/xdp_sock.h > @@ -90,6 +90,54 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp); > int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp); > void __xsk_map_flush(void); > > +/** > + * xsk_tx_metadata_request - Evaluate AF_XDP TX metadata at submission > + * and call appropriate xsk_tx_metadata_ops operation. > + * @meta: pointer to AF_XDP metadata area > + * @ops: pointer to struct xsk_tx_metadata_ops > + * @priv: pointer to driver-private aread > + * > + * This function should be called by the networking device when > + * it prepares AF_XDP egress packet. > + */ > +static inline void xsk_tx_metadata_request(const struct xsk_tx_metadata *meta, > + const struct xsk_tx_metadata_ops *ops, > + void *priv) (As you mentioned) this gets inlined in drivers for performance. > +{ > + if (!meta) > + return; > + > + if (ops->tmo_request_timestamp) > + if (meta->flags & XDP_TX_METADATA_TIMESTAMP) > + ops->tmo_request_timestamp(priv); We still have the overhead of function pointer call. With RETPOLINE this is costly. Measured on my testlab CPU E5-1650 v4 @ 3.60GHz Type:function_call_cost: 3 cycles(tsc) 1.010 ns Type:func_ptr_call_cost: 30 cycles(tsc) 8.341 ns Given this get inlined in drivers, perhaps we can add some INDIRECT_CALL_1 macros to avoid these indirect calls? > + > + if (ops->tmo_request_checksum) > + if (meta->flags & XDP_TX_METADATA_CHECKSUM) > + ops->tmo_request_checksum(meta->csum_start, meta->csum_offset, priv); > +} > +