Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 May 2016 23:15:17 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r300097 - head/sys/kern
Message-ID:  <201605172315.u4HNFH1M028023@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Tue May 17 23:15:16 2016
New Revision: 300097
URL: https://svnweb.freebsd.org/changeset/base/300097

Log:
  Add a comment and KASSERT that a M_NOFREE mbuf has always EXT_EXTREF ext.
  
  Submitted by:	kmacy

Modified:
  head/sys/kern/kern_mbuf.c

Modified: head/sys/kern/kern_mbuf.c
==============================================================================
--- head/sys/kern/kern_mbuf.c	Tue May 17 23:14:17 2016	(r300096)
+++ head/sys/kern/kern_mbuf.c	Tue May 17 23:15:16 2016	(r300097)
@@ -638,9 +638,16 @@ mb_free_ext(struct mbuf *m)
 	 * Check if the header is embedded in the cluster.  It is
 	 * important that we can't touch any of the mbuf fields
 	 * after we have freed the external storage, since mbuf
-	 * could have been embedded in it.
+	 * could have been embedded in it.  For now, the mbufs
+	 * embedded into the cluster are always of type EXT_EXTREF,
+	 * and for this type we won't free the mref.
 	 */
-	freembuf = (m->m_flags & M_NOFREE) ? 0 : 1;
+	if (m->m_flags & M_NOFREE) {
+		freembuf = 0;
+		KASSERT(m->m_ext.ext_type == EXT_EXTREF,
+		    ("%s: no-free mbuf %p has wrong type", __func__, m));
+	} else
+		freembuf = 1;
 
 	/* Free attached storage if this mbuf is the only reference to it. */
 	if (*refcnt == 1 || atomic_fetchadd_int(refcnt, -1) == 1) {



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