svn commit: r343622 - head/sys/dev/ixgbe

Eric Joyner erj at FreeBSD.org
Thu Jan 31 21:53:05 UTC 2019


Author: erj
Date: Thu Jan 31 21:53:03 2019
New Revision: 343622
URL: https://svnweb.freebsd.org/changeset/base/343622

Log:
  ix(4),ixv(4): Fix TSO offloads when TXCSUM is disabled
  
  This patch and commit message are based on r340256 created by Jacob Keller:
  
  The iflib stack does not disable TSO automatically when TXCSUM is
  disabled, instead assuming that the driver will correctly handle TSOs
  even when CSUM_IP is not set.
  
  This results in iflib calling ixgbe_isc_txd_encap with packets which have
  CSUM_IP_TSO, but do not have CSUM_IP or CSUM_IP_TCP set. Because of
  this, ixgbe_tx_ctx_setup will not setup the IPv4 checksum offloading.
  
  This results in bad TSO packets being sent if a user disables TXCSUM
  without disabling TSO.
  
  Fix this by updating the ixgbe_tx_ctx_setup function to check both
  CSUM_IP and CSUM_IP_TSO when deciding whether to enable checksums.
  
  Once this is corrected, another issue for TSO packets is revealed. The
  driver sets IFLIB_NEED_ZERO_CSUM in order to enable a work around that
  causes the ip->sum field to be zero'd. This is necessary for ix
  hardware to correctly perform TSOs.
  
  However, if TXCSUM is disabled, then the work around is not enabled, as
  CSUM_IP will not be set when the iflib stack checks to see if it should
  clear the sum field.
  
  Fix this by adding IFLIB_TSO_INIT_IP to the iflib flags for the ix and
  ixv interface files.
  
  Once both of these changes are made, the ix and ixv drivers should
  correctly offload TSO packets when TSO offload is enabled, regardless
  of whether TXCSUM is enabled or disabled.
  
  Submitted by:	Piotr Pietruszewski <piotr.pietruszewski at intel.com>
  Reviewed by:	IntelNetworking
  Sponsored by:	Intel Corporation
  Differential Revision:	https://reviews.freebsd.org/D18470

Modified:
  head/sys/dev/ixgbe/if_ix.c
  head/sys/dev/ixgbe/if_ixv.c
  head/sys/dev/ixgbe/ix_txrx.c

Modified: head/sys/dev/ixgbe/if_ix.c
==============================================================================
--- head/sys/dev/ixgbe/if_ix.c	Thu Jan 31 21:44:33 2019	(r343621)
+++ head/sys/dev/ixgbe/if_ix.c	Thu Jan 31 21:53:03 2019	(r343622)
@@ -379,6 +379,7 @@ static struct if_shared_ctx ixgbe_sctx_init = {
 	.isc_vendor_info = ixgbe_vendor_info_array,
 	.isc_driver_version = ixgbe_driver_version,
 	.isc_driver = &ixgbe_if_driver,
+	.isc_flags = IFLIB_TSO_INIT_IP,
 
 	.isc_nrxd_min = {MIN_RXD},
 	.isc_ntxd_min = {MIN_TXD},

Modified: head/sys/dev/ixgbe/if_ixv.c
==============================================================================
--- head/sys/dev/ixgbe/if_ixv.c	Thu Jan 31 21:44:33 2019	(r343621)
+++ head/sys/dev/ixgbe/if_ixv.c	Thu Jan 31 21:53:03 2019	(r343622)
@@ -220,6 +220,7 @@ static struct if_shared_ctx ixv_sctx_init = {
 	.isc_vendor_info = ixv_vendor_info_array,
 	.isc_driver_version = ixv_driver_version,
 	.isc_driver = &ixv_if_driver,
+	.isc_flags = IFLIB_TSO_INIT_IP,
 
 	.isc_nrxd_min = {MIN_RXD},
 	.isc_ntxd_min = {MIN_TXD},

Modified: head/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- head/sys/dev/ixgbe/ix_txrx.c	Thu Jan 31 21:44:33 2019	(r343621)
+++ head/sys/dev/ixgbe/ix_txrx.c	Thu Jan 31 21:53:03 2019	(r343622)
@@ -131,7 +131,7 @@ ixgbe_tx_ctx_setup(struct ixgbe_adv_tx_context_desc *T
 
 	switch (pi->ipi_ipproto) {
 	case IPPROTO_TCP:
-		if (pi->ipi_csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP))
+		if (pi->ipi_csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP | CSUM_TSO))
 			type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
 		else
 			offload = FALSE;


More information about the svn-src-all mailing list