From owner-svn-src-user@FreeBSD.ORG Wed Aug 14 22:55:06 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 061E28E8; Wed, 14 Aug 2013 22:55:06 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E7DA12CEA; Wed, 14 Aug 2013 22:55:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7EMt58g006759; Wed, 14 Aug 2013 22:55:05 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7EMt5an006758; Wed, 14 Aug 2013 22:55:05 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201308142255.r7EMt5an006758@svn.freebsd.org> From: Navdeep Parhar Date: Wed, 14 Aug 2013 22:55:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r254341 - user/np/cxl_tuning/sys/kern X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Aug 2013 22:55:06 -0000 Author: np Date: Wed Aug 14 22:55:05 2013 New Revision: 254341 URL: http://svnweb.freebsd.org/changeset/base/254341 Log: Always increment or decrement an mbuf's external refcount atomically. Always decrement it in mb_free_ext() so that an external free routine can safely assert the refcount is 0 (and not 0 or 1) when it's called. Modified: user/np/cxl_tuning/sys/kern/uipc_mbuf.c Modified: user/np/cxl_tuning/sys/kern/uipc_mbuf.c ============================================================================== --- user/np/cxl_tuning/sys/kern/uipc_mbuf.c Wed Aug 14 22:19:29 2013 (r254340) +++ user/np/cxl_tuning/sys/kern/uipc_mbuf.c Wed Aug 14 22:55:05 2013 (r254341) @@ -273,7 +273,7 @@ m_extadd(struct mbuf *mb, caddr_t buf, u /* * Non-directly-exported function to clean up after mbufs with M_EXT - * storage attached to them if the reference count hits 1. + * storage attached to them if the reference count hits 0. */ void mb_free_ext(struct mbuf *m) @@ -290,8 +290,7 @@ mb_free_ext(struct mbuf *m) skipmbuf = (m->m_flags & M_NOFREE); /* Free attached storage if this mbuf is the only reference to it. */ - if (*(m->m_ext.ref_cnt) == 1 || - atomic_fetchadd_int(m->m_ext.ref_cnt, -1) == 1) { + if (atomic_fetchadd_int(m->m_ext.ref_cnt, -1) == 1) { switch (m->m_ext.ext_type) { case EXT_PACKET: /* The packet zone is special. */ if (*(m->m_ext.ref_cnt) == 0) @@ -358,10 +357,7 @@ mb_dupcl(struct mbuf *n, struct mbuf *m) KASSERT(m->m_ext.ref_cnt != NULL, ("%s: ref_cnt not set", __func__)); KASSERT((n->m_flags & M_EXT) == 0, ("%s: M_EXT set", __func__)); - if (*(m->m_ext.ref_cnt) == 1) - *(m->m_ext.ref_cnt) += 1; - else - atomic_add_int(m->m_ext.ref_cnt, 1); + atomic_add_int(m->m_ext.ref_cnt, 1); n->m_ext.ext_buf = m->m_ext.ext_buf; n->m_ext.ext_free = m->m_ext.ext_free; n->m_ext.ext_arg1 = m->m_ext.ext_arg1;