Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Aug 2017 19:09:42 +0000 (UTC)
From:      David C Somayajulu <davidcs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r322852 - head/sys/dev/qlnx/qlnxe
Message-ID:  <201708241909.v7OJ9gHD037061@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708241909.v7OJ9gHD037061>