From: Rahul Rameshbabu <rrameshbabu@nvidia.com>
To: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Cc: Wojciech Drewek <wojciech.drewek@intel.com>,
netdev@vger.kernel.org, anthony.l.nguyen@intel.com,
horms@kernel.org, Jacob Keller <jacob.e.keller@intel.com>,
intel-wired-lan@lists.osuosl.org
Subject: Re: [Intel-wired-lan] [PATCH iwl-next v5 09/12] iavf: refactor iavf_clean_rx_irq to support legacy and flex descriptors
Date: Thu, 18 Apr 2024 13:00:40 -0700 [thread overview]
Message-ID: <87frvie8qf.fsf@nvidia.com> (raw)
In-Reply-To: <20240418052500.50678-10-mateusz.polchlopek@intel.com>
On Thu, 18 Apr, 2024 01:24:57 -0400 Mateusz Polchlopek <mateusz.polchlopek@intel.com> wrote:
> From: Jacob Keller <jacob.e.keller@intel.com>
>
> Using VIRTCHNL_VF_OFFLOAD_FLEX_DESC, the iAVF driver is capable of
> negotiating to enable the advanced flexible descriptor layout. Add the
> flexible NIC layout (RXDID=2) as a member of the Rx descriptor union.
>
> Also add bit position definitions for the status and error indications
> that are needed.
>
> The iavf_clean_rx_irq function needs to extract a few fields from the Rx
> descriptor, including the size, rx_ptype, and vlan_tag.
> Move the extraction to a separate function that decodes the fields into
> a structure. This will reduce the burden for handling multiple
> descriptor types by keeping the relevant extraction logic in one place.
>
> To support handling an additional descriptor format with minimal code
> duplication, refactor Rx checksum handling so that the general logic
> is separated from the bit calculations. Introduce an iavf_rx_desc_decoded
> structure which holds the relevant bits decoded from the Rx descriptor.
> This will enable implementing flexible descriptor handling without
> duplicating the general logic twice.
>
> Introduce an iavf_extract_flex_rx_fields, iavf_flex_rx_hash, and
> iavf_flex_rx_csum functions which operate on the flexible NIC descriptor
> format instead of the legacy 32 byte format. Based on the negotiated
> RXDID, select the correct function for processing the Rx descriptors.
>
> With this change, the Rx hot path should be functional when using either
> the default legacy 32byte format or when we switch to the flexible NIC
> layout.
>
> Modify the Rx hot path to add support for the flexible descriptor
> format and add request enabling Rx timestamps for all queues.
>
> As in ice, make sure we bump the checksum level if the hardware detected
> a packet type which could have an outer checksum. This is important
> because hardware only verifies the inner checksum.
>
> Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Co-developed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
> Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
> ---
> drivers/net/ethernet/intel/iavf/iavf_txrx.c | 354 +++++++++++++-----
> drivers/net/ethernet/intel/iavf/iavf_txrx.h | 8 +
> drivers/net/ethernet/intel/iavf/iavf_type.h | 149 ++++++--
> .../net/ethernet/intel/iavf/iavf_virtchnl.c | 5 +
> 4 files changed, 390 insertions(+), 126 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
<snip>
> +/**
> + * iavf_flex_rx_hash - set the hash value in the skb
> + * @ring: descriptor ring
> + * @rx_desc: specific descriptor
> + * @skb: skb currently being received and modified
> + * @rx_ptype: Rx packet type
> + *
> + * This function only operates on the VIRTCHNL_RXDID_2_FLEX_SQ_NIC flexible
> + * descriptor writeback format.
> + **/
> +static void iavf_flex_rx_hash(struct iavf_ring *ring,
> + union iavf_rx_desc *rx_desc,
> + struct sk_buff *skb, u16 rx_ptype)
> +{
> + __le16 status0;
> +
> + if (!(ring->netdev->features & NETIF_F_RXHASH))
> + return;
> +
> + status0 = rx_desc->flex_wb.status_error0;
Any reason to not convert rx_desc->flex_wb.status_error0 to
CPU-endianness for the bit check?
> + if (status0 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS0_RSS_VALID_M)) {
> + u32 hash = le32_to_cpu(rx_desc->flex_wb.rss_hash);
> +
> + skb_set_hash(skb, hash, iavf_ptype_to_htype(rx_ptype));
> + }
> +}
<snip>
> +/**
> + * iavf_extract_flex_rx_fields - Extract fields from the Rx descriptor
> + * @rx_ring: rx descriptor ring
> + * @rx_desc: the descriptor to process
> + * @fields: storage for extracted values
> + *
> + * Decode the Rx descriptor and extract relevant information including the
> + * size, VLAN tag, Rx packet type, end of packet field and RXE field value.
> + *
> + * This function only operates on the VIRTCHNL_RXDID_2_FLEX_SQ_NIC flexible
> + * descriptor writeback format.
> + */
> +static void iavf_extract_flex_rx_fields(struct iavf_ring *rx_ring,
> + union iavf_rx_desc *rx_desc,
> + struct iavf_rx_extracted *fields)
> +{
> + __le16 status0, status1, flexi_flags0;
> +
> + fields->size = FIELD_GET(IAVF_RX_FLEX_DESC_PKT_LEN_M,
> + le16_to_cpu(rx_desc->flex_wb.pkt_len));
> +
> + flexi_flags0 = rx_desc->flex_wb.ptype_flexi_flags0;
> +
> + fields->rx_ptype = FIELD_GET(IAVF_RX_FLEX_DESC_PTYPE_M,
> + le16_to_cpu(flexi_flags0));
> +
> + status0 = rx_desc->flex_wb.status_error0;
> + if (status0 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS0_L2TAG1P_M) &&
> + rx_ring->flags & IAVF_TXRX_FLAGS_VLAN_TAG_LOC_L2TAG1)
> + fields->vlan_tag = le16_to_cpu(rx_desc->flex_wb.l2tag1);
> +
> + status1 = rx_desc->flex_wb.status_error1;
Similar comment to previous in this function.
> + if (status1 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_M) &&
> + rx_ring->flags & IAVF_RXR_FLAGS_VLAN_TAG_LOC_L2TAG2_2)
> + fields->vlan_tag = le16_to_cpu(rx_desc->flex_wb.l2tag2_2nd);
> +
> + fields->end_of_packet = FIELD_GET(IAVF_RX_FLEX_DESC_STATUS_ERR0_EOP_BIT,
> + le16_to_cpu(status0));
> + fields->rxe = FIELD_GET(IAVF_RX_FLEX_DESC_STATUS_ERR0_RXE_BIT,
> + le16_to_cpu(status0));
> +}
> +
> +static void iavf_extract_rx_fields(struct iavf_ring *rx_ring,
> + union iavf_rx_desc *rx_desc,
> + struct iavf_rx_extracted *fields)
> +{
> + if (rx_ring->rxdid == VIRTCHNL_RXDID_1_32B_BASE)
> + iavf_extract_legacy_rx_fields(rx_ring, rx_desc, fields);
> + else
> + iavf_extract_flex_rx_fields(rx_ring, rx_desc, fields);
> +}
> +
<snip>
--
Thanks,
Rahul Rameshbabu
WARNING: multiple messages have this Message-ID (diff)
From: Rahul Rameshbabu <rrameshbabu@nvidia.com>
To: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org,
horms@kernel.org, anthony.l.nguyen@intel.com,
Jacob Keller <jacob.e.keller@intel.com>,
Wojciech Drewek <wojciech.drewek@intel.com>
Subject: Re: [Intel-wired-lan] [PATCH iwl-next v5 09/12] iavf: refactor iavf_clean_rx_irq to support legacy and flex descriptors
Date: Thu, 18 Apr 2024 13:00:40 -0700 [thread overview]
Message-ID: <87frvie8qf.fsf@nvidia.com> (raw)
In-Reply-To: <20240418052500.50678-10-mateusz.polchlopek@intel.com>
On Thu, 18 Apr, 2024 01:24:57 -0400 Mateusz Polchlopek <mateusz.polchlopek@intel.com> wrote:
> From: Jacob Keller <jacob.e.keller@intel.com>
>
> Using VIRTCHNL_VF_OFFLOAD_FLEX_DESC, the iAVF driver is capable of
> negotiating to enable the advanced flexible descriptor layout. Add the
> flexible NIC layout (RXDID=2) as a member of the Rx descriptor union.
>
> Also add bit position definitions for the status and error indications
> that are needed.
>
> The iavf_clean_rx_irq function needs to extract a few fields from the Rx
> descriptor, including the size, rx_ptype, and vlan_tag.
> Move the extraction to a separate function that decodes the fields into
> a structure. This will reduce the burden for handling multiple
> descriptor types by keeping the relevant extraction logic in one place.
>
> To support handling an additional descriptor format with minimal code
> duplication, refactor Rx checksum handling so that the general logic
> is separated from the bit calculations. Introduce an iavf_rx_desc_decoded
> structure which holds the relevant bits decoded from the Rx descriptor.
> This will enable implementing flexible descriptor handling without
> duplicating the general logic twice.
>
> Introduce an iavf_extract_flex_rx_fields, iavf_flex_rx_hash, and
> iavf_flex_rx_csum functions which operate on the flexible NIC descriptor
> format instead of the legacy 32 byte format. Based on the negotiated
> RXDID, select the correct function for processing the Rx descriptors.
>
> With this change, the Rx hot path should be functional when using either
> the default legacy 32byte format or when we switch to the flexible NIC
> layout.
>
> Modify the Rx hot path to add support for the flexible descriptor
> format and add request enabling Rx timestamps for all queues.
>
> As in ice, make sure we bump the checksum level if the hardware detected
> a packet type which could have an outer checksum. This is important
> because hardware only verifies the inner checksum.
>
> Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Co-developed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
> Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
> ---
> drivers/net/ethernet/intel/iavf/iavf_txrx.c | 354 +++++++++++++-----
> drivers/net/ethernet/intel/iavf/iavf_txrx.h | 8 +
> drivers/net/ethernet/intel/iavf/iavf_type.h | 149 ++++++--
> .../net/ethernet/intel/iavf/iavf_virtchnl.c | 5 +
> 4 files changed, 390 insertions(+), 126 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
<snip>
> +/**
> + * iavf_flex_rx_hash - set the hash value in the skb
> + * @ring: descriptor ring
> + * @rx_desc: specific descriptor
> + * @skb: skb currently being received and modified
> + * @rx_ptype: Rx packet type
> + *
> + * This function only operates on the VIRTCHNL_RXDID_2_FLEX_SQ_NIC flexible
> + * descriptor writeback format.
> + **/
> +static void iavf_flex_rx_hash(struct iavf_ring *ring,
> + union iavf_rx_desc *rx_desc,
> + struct sk_buff *skb, u16 rx_ptype)
> +{
> + __le16 status0;
> +
> + if (!(ring->netdev->features & NETIF_F_RXHASH))
> + return;
> +
> + status0 = rx_desc->flex_wb.status_error0;
Any reason to not convert rx_desc->flex_wb.status_error0 to
CPU-endianness for the bit check?
> + if (status0 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS0_RSS_VALID_M)) {
> + u32 hash = le32_to_cpu(rx_desc->flex_wb.rss_hash);
> +
> + skb_set_hash(skb, hash, iavf_ptype_to_htype(rx_ptype));
> + }
> +}
<snip>
> +/**
> + * iavf_extract_flex_rx_fields - Extract fields from the Rx descriptor
> + * @rx_ring: rx descriptor ring
> + * @rx_desc: the descriptor to process
> + * @fields: storage for extracted values
> + *
> + * Decode the Rx descriptor and extract relevant information including the
> + * size, VLAN tag, Rx packet type, end of packet field and RXE field value.
> + *
> + * This function only operates on the VIRTCHNL_RXDID_2_FLEX_SQ_NIC flexible
> + * descriptor writeback format.
> + */
> +static void iavf_extract_flex_rx_fields(struct iavf_ring *rx_ring,
> + union iavf_rx_desc *rx_desc,
> + struct iavf_rx_extracted *fields)
> +{
> + __le16 status0, status1, flexi_flags0;
> +
> + fields->size = FIELD_GET(IAVF_RX_FLEX_DESC_PKT_LEN_M,
> + le16_to_cpu(rx_desc->flex_wb.pkt_len));
> +
> + flexi_flags0 = rx_desc->flex_wb.ptype_flexi_flags0;
> +
> + fields->rx_ptype = FIELD_GET(IAVF_RX_FLEX_DESC_PTYPE_M,
> + le16_to_cpu(flexi_flags0));
> +
> + status0 = rx_desc->flex_wb.status_error0;
> + if (status0 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS0_L2TAG1P_M) &&
> + rx_ring->flags & IAVF_TXRX_FLAGS_VLAN_TAG_LOC_L2TAG1)
> + fields->vlan_tag = le16_to_cpu(rx_desc->flex_wb.l2tag1);
> +
> + status1 = rx_desc->flex_wb.status_error1;
Similar comment to previous in this function.
> + if (status1 & cpu_to_le16(IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_M) &&
> + rx_ring->flags & IAVF_RXR_FLAGS_VLAN_TAG_LOC_L2TAG2_2)
> + fields->vlan_tag = le16_to_cpu(rx_desc->flex_wb.l2tag2_2nd);
> +
> + fields->end_of_packet = FIELD_GET(IAVF_RX_FLEX_DESC_STATUS_ERR0_EOP_BIT,
> + le16_to_cpu(status0));
> + fields->rxe = FIELD_GET(IAVF_RX_FLEX_DESC_STATUS_ERR0_RXE_BIT,
> + le16_to_cpu(status0));
> +}
> +
> +static void iavf_extract_rx_fields(struct iavf_ring *rx_ring,
> + union iavf_rx_desc *rx_desc,
> + struct iavf_rx_extracted *fields)
> +{
> + if (rx_ring->rxdid == VIRTCHNL_RXDID_1_32B_BASE)
> + iavf_extract_legacy_rx_fields(rx_ring, rx_desc, fields);
> + else
> + iavf_extract_flex_rx_fields(rx_ring, rx_desc, fields);
> +}
> +
<snip>
--
Thanks,
Rahul Rameshbabu
next prev parent reply other threads:[~2024-04-18 20:08 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-18 5:24 [Intel-wired-lan] [PATCH iwl-next v5 00/12] Add support for Rx timestamping for both ice and iavf drivers Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 01/12] virtchnl: add support for enabling PTP on iAVF Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 18:49 ` Rahul Rameshbabu
2024-04-18 18:49 ` Rahul Rameshbabu
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 02/12] ice: support Rx timestamp on flex descriptor Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 18:57 ` Rahul Rameshbabu
2024-04-18 18:57 ` Rahul Rameshbabu
2024-04-22 9:34 ` Mateusz Polchlopek
2024-04-22 9:34 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 03/12] virtchnl: add enumeration for the rxdid format Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:05 ` Rahul Rameshbabu
2024-04-18 19:05 ` Rahul Rameshbabu
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 04/12] iavf: add support for negotiating flexible RXDID format Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:11 ` Rahul Rameshbabu
2024-04-18 19:11 ` Rahul Rameshbabu
2024-04-22 9:34 ` Mateusz Polchlopek
2024-04-22 9:34 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 05/12] iavf: negotiate PTP capabilities Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:16 ` Rahul Rameshbabu
2024-04-18 19:16 ` Rahul Rameshbabu
2024-04-22 9:33 ` Mateusz Polchlopek
2024-04-22 9:33 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 06/12] iavf: add initial framework for registering PTP clock Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:28 ` Rahul Rameshbabu
2024-04-18 19:28 ` Rahul Rameshbabu
2024-04-22 9:29 ` Mateusz Polchlopek
2024-04-22 9:29 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 07/12] iavf: add support for indirect access to PHC time Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:43 ` Rahul Rameshbabu
2024-04-18 19:43 ` Rahul Rameshbabu
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 08/12] iavf: periodically cache " Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 19:51 ` Rahul Rameshbabu
2024-04-18 19:51 ` Rahul Rameshbabu
2024-04-22 9:23 ` Mateusz Polchlopek
2024-04-22 9:23 ` Mateusz Polchlopek
2024-04-24 22:03 ` Keller, Jacob E
2024-04-24 22:03 ` Keller, Jacob E
2024-04-25 10:52 ` Przemek Kitszel
2024-04-25 10:52 ` Przemek Kitszel
2024-04-25 16:28 ` Keller, Jacob E
2024-04-25 16:28 ` Keller, Jacob E
2024-04-25 17:10 ` Rahul Rameshbabu
2024-04-25 17:10 ` Rahul Rameshbabu
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 09/12] iavf: refactor iavf_clean_rx_irq to support legacy and flex descriptors Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 20:00 ` Rahul Rameshbabu [this message]
2024-04-18 20:00 ` Rahul Rameshbabu
2024-04-22 9:22 ` Mateusz Polchlopek
2024-04-22 9:22 ` Mateusz Polchlopek
2024-04-23 10:51 ` Sunil Kovvuri Goutham
2024-04-23 10:51 ` Sunil Kovvuri Goutham
2024-04-26 7:15 ` Mateusz Polchlopek
2024-04-26 7:15 ` Mateusz Polchlopek
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 10/12] iavf: Implement checking DD desc field Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 20:07 ` Rahul Rameshbabu
2024-04-18 20:07 ` Rahul Rameshbabu
2024-04-18 5:24 ` [Intel-wired-lan] [PATCH iwl-next v5 11/12] iavf: handle SIOCSHWTSTAMP and SIOCGHWTSTAMP Mateusz Polchlopek
2024-04-18 5:24 ` Mateusz Polchlopek
2024-04-18 20:08 ` Rahul Rameshbabu
2024-04-18 20:08 ` Rahul Rameshbabu
2024-04-18 5:25 ` [Intel-wired-lan] [PATCH iwl-next v5 12/12] iavf: add support for Rx timestamps to hotpath Mateusz Polchlopek
2024-04-18 5:25 ` Mateusz Polchlopek
2024-04-18 20:12 ` Rahul Rameshbabu
2024-04-18 20:12 ` Rahul Rameshbabu
2024-04-23 10:47 ` Sunil Kovvuri Goutham
2024-04-23 10:47 ` Sunil Kovvuri Goutham
2024-04-18 20:19 ` [Intel-wired-lan] [PATCH iwl-next v5 00/12] Add support for Rx timestamping for both ice and iavf drivers Rahul Rameshbabu
2024-04-18 20:19 ` Rahul Rameshbabu
2024-04-22 9:37 ` Mateusz Polchlopek
2024-04-22 9:37 ` Mateusz Polchlopek
2024-04-23 5:57 ` Rahul Rameshbabu
2024-04-23 5:57 ` Rahul Rameshbabu
2024-04-23 6:08 ` Mateusz Polchlopek
2024-04-23 6:08 ` Mateusz Polchlopek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87frvie8qf.fsf@nvidia.com \
--to=rrameshbabu@nvidia.com \
--cc=anthony.l.nguyen@intel.com \
--cc=horms@kernel.org \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jacob.e.keller@intel.com \
--cc=mateusz.polchlopek@intel.com \
--cc=netdev@vger.kernel.org \
--cc=wojciech.drewek@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.