From owner-freebsd-net@FreeBSD.ORG Thu Aug 29 19:57:10 2013 Return-Path: Delivered-To: freebsd-net@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 57BA2E2A for ; Thu, 29 Aug 2013 19:57:10 +0000 (UTC) (envelope-from nparhar@gmail.com) Received: from mail-pa0-x22d.google.com (mail-pa0-x22d.google.com [IPv6:2607:f8b0:400e:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 30D2424EB for ; Thu, 29 Aug 2013 19:57:10 +0000 (UTC) Received: by mail-pa0-f45.google.com with SMTP id bg4so1356247pad.18 for ; Thu, 29 Aug 2013 12:57:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=CLIfD9kglveWVuPmeYgqi8K88nOIp9F7MaUw9nG4QS8=; b=Rtz4lid0AptAiqvvprO0IIQSUg0Do3ZE+BK3/vDhl1vTDiaVjr/MTRYeyMfxXsVWYY +GfVFHo1mdR38QDatsKIPfJ9Y4wcC2faCaqk6IXFiHD2V4UyhbzzpRk4Zo0WVyPNCP3H N2YiVHet08fbp5JTsQMIYyC0gAbiyITqd4FbfAZeBG0t9Yp+gYy4JF6/MsK5Yopm/olJ OXHIbm1yMxOBtqCdCsv5KqV89p8UshaaoR2A1mClcZn4Qf4sYg1hxlsJAMi2wjCtqZ/l HNvc4iUyU2N9kQ+q6TBZ5ey639ZASmf/v5X6bS0plcu7wtmSbnop17IcG8wVh6cFEnHx iVOA== X-Received: by 10.66.253.4 with SMTP id zw4mr6341755pac.119.1377806229909; Thu, 29 Aug 2013 12:57:09 -0700 (PDT) Received: from [10.192.166.0] (stargate.chelsio.com. [67.207.112.58]) by mx.google.com with ESMTPSA id yg3sm42772653pab.16.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 29 Aug 2013 12:57:08 -0700 (PDT) Sender: Navdeep Parhar Message-ID: <521FA792.9000807@FreeBSD.org> Date: Thu, 29 Aug 2013 12:57:06 -0700 From: Navdeep Parhar User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130819 Thunderbird/17.0.8 MIME-Version: 1.0 To: freebsd-net@FreeBSD.org Subject: Please review: atomic updates to mbuf's external refcount Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Aug 2013 19:57:10 -0000 I'd like to merge r254341 from user/np/cxl_tuning to head if there are no objections. It eliminates a couple of iffy looking constructs in uipc_mbuf.c http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/kern/uipc_mbuf.c?r1=254334&r2=254341&diff_format=u --------------------- 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. --------------------- Regards, Navdeep diff -r 9e9639a7df80 -r 9753d3e51363 sys/kern/uipc_mbuf.c --- a/sys/kern/uipc_mbuf.c Thu Aug 29 11:16:04 2013 -0700 +++ b/sys/kern/uipc_mbuf.c Thu Aug 29 11:16:04 2013 -0700 @@ -282,7 +282,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) @@ -298,8 +298,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) @@ -367,10 +366,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;