On Fri, 18 Oct 2019 14:13:39 -0700, Jeff Kirsher wrote: > From: Sasha Neftin <sasha.nef...@intel.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.nef...@intel.com> > Tested-by: Aaron Brown <aaron.f.br...@intel.com> > Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.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;