[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20191018160507.025c0918@cakuba.netronome.com>
Date: Fri, 18 Oct 2019 16:05:07 -0700
From: Jakub Kicinski <jakub.kicinski@...ronome.com>
To: Jeff Kirsher <jeffrey.t.kirsher@...el.com>
Cc: davem@...emloft.net, Sasha Neftin <sasha.neftin@...el.com>,
netdev@...r.kernel.org, nhorman@...hat.com, sassmann@...hat.com,
Aaron Brown <aaron.f.brown@...el.com>
Subject: Re: [net-next v2 4/5] igc: Add Rx checksum support
On Fri, 18 Oct 2019 14:13:39 -0700, Jeff Kirsher wrote:
> From: Sasha Neftin <sasha.neftin@...el.com>
>
> Extend the socket buffer field process and add Rx checksum functionality
> Minor: fix indentation with tab instead of spaces.
>
> Signed-off-by: Sasha Neftin <sasha.neftin@...el.com>
> Tested-by: Aaron Brown <aaron.f.brown@...el.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@...el.com>
> ---
> drivers/net/ethernet/intel/igc/igc_defines.h | 5 ++-
> drivers/net/ethernet/intel/igc/igc_main.c | 43 ++++++++++++++++++++
> 2 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h
> index 03f1aca3f57f..f3788f0b95b4 100644
> --- a/drivers/net/ethernet/intel/igc/igc_defines.h
> +++ b/drivers/net/ethernet/intel/igc/igc_defines.h
> @@ -282,7 +282,10 @@
> #define IGC_RCTL_BAM 0x00008000 /* broadcast enable */
>
> /* Receive Descriptor bit definitions */
> -#define IGC_RXD_STAT_EOP 0x02 /* End of Packet */
> +#define IGC_RXD_STAT_EOP 0x02 /* End of Packet */
> +#define IGC_RXD_STAT_IXSM 0x04 /* Ignore checksum */
> +#define IGC_RXD_STAT_UDPCS 0x10 /* UDP xsum calculated */
> +#define IGC_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */
>
> #define IGC_RXDEXT_STATERR_CE 0x01000000
> #define IGC_RXDEXT_STATERR_SE 0x02000000
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
> index 7d2f479b57cf..c1aa2762dc87 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -1201,6 +1201,46 @@ static netdev_tx_t igc_xmit_frame(struct sk_buff *skb,
> return igc_xmit_frame_ring(skb, igc_tx_queue_mapping(adapter, skb));
> }
>
> +static inline void igc_rx_checksum(struct igc_ring *ring,
Sorry about the piecemeal review, but we don't really like static
inlines in C files :(
It's called once it will definitely get inlined.
> + union igc_adv_rx_desc *rx_desc,
> + struct sk_buff *skb)
> +{
> + skb_checksum_none_assert(skb);
> +
> + /* Ignore Checksum bit is set */
> + if (igc_test_staterr(rx_desc, IGC_RXD_STAT_IXSM))
> + return;
> +
> + /* Rx checksum disabled via ethtool */
> + if (!(ring->netdev->features & NETIF_F_RXCSUM))
> + return;
> +
> + /* TCP/UDP checksum error bit is set */
> + if (igc_test_staterr(rx_desc,
> + IGC_RXDEXT_STATERR_TCPE |
> + IGC_RXDEXT_STATERR_IPE)) {
consider unlikely() on the error case? not sure the performance matter
that much for IGC, up to you
> + /* work around errata with sctp packets where the TCPE aka
> + * L4E bit is set incorrectly on 64 byte (60 byte w/o crc)
> + * packets, (aka let the stack check the crc32c)
Looks like there is a loose comma towards the end there
> + */
> + if (!(skb->len == 60 &&
> + test_bit(IGC_RING_FLAG_RX_SCTP_CSUM, &ring->flags))) {
> + u64_stats_update_begin(&ring->rx_syncp);
> + ring->rx_stats.csum_err++;
> + u64_stats_update_end(&ring->rx_syncp);
> + }
> + /* let the stack verify checksum errors */
> + return;
> + }
> + /* It must be a TCP or UDP packet with a valid checksum */
> + if (igc_test_staterr(rx_desc, IGC_RXD_STAT_TCPCS |
> + IGC_RXD_STAT_UDPCS))
> + skb->ip_summed = CHECKSUM_UNNECESSARY;
> +
> + dev_dbg(ring->dev, "cksum success: bits %08X\n",
> + le32_to_cpu(rx_desc->wb.upper.status_error));
This could be replaced with a well placed kprobe, but up to you..
> +}
> +
> static inline void igc_rx_hash(struct igc_ring *ring,
> union igc_adv_rx_desc *rx_desc,
> struct sk_buff *skb)
> @@ -1227,6 +1267,8 @@ static void igc_process_skb_fields(struct igc_ring *rx_ring,
> {
> igc_rx_hash(rx_ring, rx_desc, skb);
>
> + igc_rx_checksum(rx_ring, rx_desc, skb);
> +
> skb_record_rx_queue(skb, rx_ring->queue_index);
>
> skb->protocol = eth_type_trans(skb, rx_ring->netdev);
> @@ -4391,6 +4433,7 @@ static int igc_probe(struct pci_dev *pdev,
> goto err_sw_init;
>
> /* Add supported features to the features list*/
> + netdev->features |= NETIF_F_RXCSUM;
> netdev->features |= NETIF_F_HW_CSUM;
> netdev->features |= NETIF_F_SCTP_CRC;
Powered by blists - more mailing lists