Author: np
Date: Sat Jun 21 00:35:20 2014
New Revision: 267695
URL: http://svnweb.freebsd.org/changeset/base/267695

Log:
  MFC r267600:
  
  cxgbe(4):  Fix bug in the fast rx buffer recycle path.  In some cases rx
  buffers were getting recycled when they should have been left alone.

Modified:
  stable/9/sys/dev/cxgbe/adapter.h
  stable/9/sys/dev/cxgbe/t4_sge.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/cxgbe/adapter.h
==============================================================================
--- stable/9/sys/dev/cxgbe/adapter.h    Sat Jun 21 00:30:51 2014        
(r267694)
+++ stable/9/sys/dev/cxgbe/adapter.h    Sat Jun 21 00:35:20 2014        
(r267695)
@@ -253,7 +253,8 @@ struct cluster_metadata {
 
 struct fl_sdesc {
        caddr_t cl;
-       uint8_t nmbuf;
+       uint8_t nimbuf;         /* # of inline mbufs with ref on the cluster */
+       uint8_t nembuf;         /* # of allocated mbufs with ref */
        struct cluster_layout cll;
 };
 

Modified: stable/9/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_sge.c     Sat Jun 21 00:30:51 2014        
(r267694)
+++ stable/9/sys/dev/cxgbe/t4_sge.c     Sat Jun 21 00:35:20 2014        
(r267695)
@@ -1469,22 +1469,22 @@ get_scatter_segment(struct adapter *sc, 
                /* copy data to mbuf */
                bcopy(payload, mtod(m, caddr_t), len);
 
-       } else if (sd->nmbuf * MSIZE < cll->region1) {
+       } else if (sd->nimbuf * MSIZE < cll->region1) {
 
                /*
                 * There's spare room in the cluster for an mbuf.  Create one
-                * and associate it with the payload that's in the cluster too.
+                * and associate it with the payload that's in the cluster.
                 */
 
                MPASS(clm != NULL);
-               m = (struct mbuf *)(sd->cl + sd->nmbuf * MSIZE);
+               m = (struct mbuf *)(sd->cl + sd->nimbuf * MSIZE);
                /* No bzero required */
                if (m_init(m, NULL, 0, M_NOWAIT, MT_DATA, flags | M_NOFREE))
                        return (NULL);
                fl->mbuf_inlined++;
                m_extaddref(m, payload, padded_len, &clm->refcount, rxb_free,
                    swz->zone, sd->cl);
-               sd->nmbuf++;
+               sd->nimbuf++;
 
        } else {
 
@@ -1498,10 +1498,11 @@ get_scatter_segment(struct adapter *sc, 
                if (m == NULL)
                        return (NULL);
                fl->mbuf_allocated++;
-               if (clm != NULL)
+               if (clm != NULL) {
                        m_extaddref(m, payload, padded_len, &clm->refcount,
                            rxb_free, swz->zone, sd->cl);
-               else {
+                       sd->nembuf++;
+               } else {
                        m_cljset(m, sd->cl, swz->type);
                        sd->cl = NULL;  /* consumed, not a recycle candidate */
                }
@@ -3024,7 +3025,7 @@ refill_fl(struct adapter *sc, struct sge
 
                if (sd->cl != NULL) {
 
-                       if (sd->nmbuf == 0) {
+                       if (sd->nimbuf + sd->nembuf == 0) {
                                /*
                                 * Fast recycle without involving any atomics on
                                 * the cluster's metadata (if the cluster has
@@ -3033,6 +3034,11 @@ refill_fl(struct adapter *sc, struct sge
                                 * fit within a single mbuf each.
                                 */
                                fl->cl_fast_recycled++;
+#ifdef INVARIANTS
+                               clm = cl_metadata(sc, fl, &sd->cll, sd->cl);
+                               if (clm != NULL)
+                                       MPASS(clm->refcount == 1);
+#endif
                                goto recycled_fast;
                        }
 
@@ -3078,7 +3084,8 @@ recycled:
 #endif
                        clm->refcount = 1;
                }
-               sd->nmbuf = 0;
+               sd->nimbuf = 0;
+               sd->nembuf = 0;
 recycled_fast:
                fl->pending++;
                fl->needed--;
@@ -3147,7 +3154,7 @@ free_fl_sdesc(struct adapter *sc, struct
 
                cll = &sd->cll;
                clm = cl_metadata(sc, fl, cll, sd->cl);
-               if (sd->nmbuf == 0 ||
+               if (sd->nimbuf + sd->nembuf == 0 ||
                    (clm && atomic_fetchadd_int(&clm->refcount, -1) == 1)) {
                        uma_zfree(sc->sge.sw_zone_info[cll->zidx].zone, sd->cl);
                }
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to