svn commit: r295906 - head/sys/dev/e1000

Marius Strobl marius at FreeBSD.org
Tue Feb 23 01:19:28 UTC 2016


Author: marius
Date: Tue Feb 23 01:19:26 2016
New Revision: 295906
URL: https://svnweb.freebsd.org/changeset/base/295906

Log:
  Fix and clean up usage of DMA and TSO segments:
  - At Intel it is believed that most of their products support "only"
    40 DMA segments so lower {EM,IGB}_MAX_SCATTER accordingly. Actually,
    40 is more than plenty to handle full size TSO packets so it doesn't
    make sense to further distinguish between MAC variants that really
    can do 64 DMA segments. Moreover, capping at 40 DMA segments limits
    the stack usage of {em,igb}_xmit() that - given the rare use of more
    than these - previously hardly was justifiable, while still being
    sufficient to avoid the problems seen with em(4) and EM_MAX_SCATTER
    set to 32.
  - In igb(4), pass the actually supported TSO parameters up the stack.
    Previously, the defaults set in if_attach_internal() were applied,
    i. e. a maximum of 35 TSO segments, which made supporting more than
    these in the driver pointless. However, this might explain why no
    problems were seen with IGB_MAX_SCATTER at 64.
  - In em(4), take the 5 m_pullup(9) invocations performed by em_xmit()
    in the TSO case into account when reporting TSO parameters upwards.
    In the worst case, each of these calls will add another mbuf and,
    thus, the requirement for an additional DMA segment. So for best
    performance, it doesn't make sense to advertize a maximum of TSO
    segments that typically will require defragmentation in em_xmit().
    Again, this leaves enough room to handle full size TSO packets.
  - Drop TSO macros from if_lem.h given that corresponding MACS don't
    support TSO in the first place.
  
  Reviewed by:	erj, sbruno, jeffrey.e.pieper_intel.com
  Approved by:	erj
  MFC after:	3 days
  Differential Revision:	https://reviews.freebsd.org/D5238

Modified:
  head/sys/dev/e1000/if_em.c
  head/sys/dev/e1000/if_em.h
  head/sys/dev/e1000/if_igb.c
  head/sys/dev/e1000/if_igb.h
  head/sys/dev/e1000/if_lem.h

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c	Tue Feb 23 01:09:35 2016	(r295905)
+++ head/sys/dev/e1000/if_em.c	Tue Feb 23 01:19:26 2016	(r295906)
@@ -3193,9 +3193,11 @@ em_setup_interface(device_t dev, struct 
 	if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
 	if_setioctlfn(ifp, em_ioctl);
 	if_setgetcounterfn(ifp, em_get_counter);
+
 	/* TSO parameters */
 	ifp->if_hw_tsomax = IP_MAXPACKET;
-	ifp->if_hw_tsomaxsegcount = EM_MAX_SCATTER;
+	/* Take m_pullup(9)'s in em_xmit() w/ TSO into acount. */
+	ifp->if_hw_tsomaxsegcount = EM_MAX_SCATTER - 5;
 	ifp->if_hw_tsomaxsegsize = EM_TSO_SEG_SIZE;
 
 #ifdef EM_MULTIQUEUE

Modified: head/sys/dev/e1000/if_em.h
==============================================================================
--- head/sys/dev/e1000/if_em.h	Tue Feb 23 01:09:35 2016	(r295905)
+++ head/sys/dev/e1000/if_em.h	Tue Feb 23 01:19:26 2016	(r295906)
@@ -269,7 +269,7 @@
 #define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
 #define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
 
-#define EM_MAX_SCATTER		64
+#define EM_MAX_SCATTER		40
 #define EM_VFTA_SIZE		128
 #define EM_TSO_SIZE		(65535 + sizeof(struct ether_vlan_header))
 #define EM_TSO_SEG_SIZE		4096	/* Max dma segment size */

Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c	Tue Feb 23 01:09:35 2016	(r295905)
+++ head/sys/dev/e1000/if_igb.c	Tue Feb 23 01:19:26 2016	(r295906)
@@ -3139,6 +3139,12 @@ igb_setup_interface(device_t dev, struct
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	ifp->if_ioctl = igb_ioctl;
 	ifp->if_get_counter = igb_get_counter;
+
+	/* TSO parameters */
+	ifp->if_hw_tsomax = IP_MAXPACKET;
+	ifp->if_hw_tsomaxsegcount = IGB_MAX_SCATTER;
+	ifp->if_hw_tsomaxsegsize = IGB_TSO_SEG_SIZE;
+
 #ifndef IGB_LEGACY_TX
 	ifp->if_transmit = igb_mq_start;
 	ifp->if_qflush = igb_qflush;

Modified: head/sys/dev/e1000/if_igb.h
==============================================================================
--- head/sys/dev/e1000/if_igb.h	Tue Feb 23 01:09:35 2016	(r295905)
+++ head/sys/dev/e1000/if_igb.h	Tue Feb 23 01:19:26 2016	(r295906)
@@ -278,7 +278,7 @@
 #define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
 #define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
 
-#define IGB_MAX_SCATTER		64
+#define IGB_MAX_SCATTER		40
 #define IGB_VFTA_SIZE		128
 #define IGB_BR_SIZE		4096	/* ring buf size */
 #define IGB_TSO_SIZE		(65535 + sizeof(struct ether_vlan_header))

Modified: head/sys/dev/e1000/if_lem.h
==============================================================================
--- head/sys/dev/e1000/if_lem.h	Tue Feb 23 01:09:35 2016	(r295905)
+++ head/sys/dev/e1000/if_lem.h	Tue Feb 23 01:19:26 2016	(r295906)
@@ -236,10 +236,8 @@
 #define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
 #define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
 
-#define EM_MAX_SCATTER		64
+#define EM_MAX_SCATTER		40
 #define EM_VFTA_SIZE		128
-#define EM_TSO_SIZE		(65535 + sizeof(struct ether_vlan_header))
-#define EM_TSO_SEG_SIZE		4096	/* Max dma segment size */
 #define EM_MSIX_MASK		0x01F00000 /* For 82574 use */
 #define ETH_ZLEN		60
 #define ETH_ADDR_LEN		6


More information about the svn-src-all mailing list