svn commit: r322852 - head/sys/dev/qlnx/qlnxe

David C Somayajulu davidcs at FreeBSD.org
Thu Aug 24 19:09:43 UTC 2017


Author: davidcs
Date: Thu Aug 24 19:09:42 2017
New Revision: 322852
URL: https://svnweb.freebsd.org/changeset/base/322852

Log:
  Fix qlnx_tso_check() so that every window of
  (ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr) has atleast
  ETH_TX_LSO_WINDOW_MIN_LEN bytes
  
  MFC after:5 days

Modified:
  head/sys/dev/qlnx/qlnxe/qlnx_os.c

Modified: head/sys/dev/qlnx/qlnxe/qlnx_os.c
==============================================================================
--- head/sys/dev/qlnx/qlnxe/qlnx_os.c	Thu Aug 24 18:51:55 2017	(r322851)
+++ head/sys/dev/qlnx/qlnxe/qlnx_os.c	Thu Aug 24 19:09:42 2017	(r322852)
@@ -2921,25 +2921,35 @@ qlnx_tso_check(struct qlnx_fastpath *fp, bus_dma_segme
 {
 	int			i;
 	uint32_t		sum, nbds_in_hdr = 1;
-	bus_dma_segment_t	*t_segs = segs;
+	uint32_t		window;
+        bus_dma_segment_t	*s_seg;
 
-	/* count the number of segments spanned by TCP header */
+	/* If the header spans mulitple segments, skip those segments */
 
+	if (nsegs < ETH_TX_LSO_WINDOW_BDS_NUM)
+		return (0);
+
 	i = 0;
-	while ((i < nsegs) && (offset > t_segs->ds_len)) {
-		nbds_in_hdr++;
-		offset = offset - t_segs->ds_len;
-		t_segs++;
+
+	while ((i < nsegs) && (offset >= segs->ds_len)) {
+		offset = offset - segs->ds_len;
+		segs++;
 		i++;
+		nbds_in_hdr++;
 	}
 
-	while (nsegs >= QLNX_MAX_SEGMENTS_NON_TSO) {
+	window = ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr;
 
+	nsegs = nsegs - i;
+
+	while (nsegs >= window) {
+
 		sum = 0;
+		s_seg = segs;
 
-		for (i = 0; i < (ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr); i++){
-			sum += segs->ds_len;
-			segs++;
+		for (i = 0; i < window; i++){
+			sum += s_seg->ds_len;
+			s_seg++;
 		}
 
 		if (sum < ETH_TX_LSO_WINDOW_MIN_LEN) {
@@ -2947,7 +2957,8 @@ qlnx_tso_check(struct qlnx_fastpath *fp, bus_dma_segme
 			return (-1);
 		}
 
-		nsegs -= QLNX_MAX_SEGMENTS_NON_TSO;
+		nsegs = nsegs - 1;
+		segs++;
 	}
 
 	return (0);


More information about the svn-src-all mailing list