From owner-freebsd-net@FreeBSD.ORG Thu Aug 29 22:58:34 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 9FA283A7 for ; Thu, 29 Aug 2013 22:58:34 +0000 (UTC) (envelope-from nparhar@gmail.com) Received: from mail-pb0-x232.google.com (mail-pb0-x232.google.com [IPv6:2607:f8b0:400e:c01::232]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 79BB620BE for ; Thu, 29 Aug 2013 22:58:34 +0000 (UTC) Received: by mail-pb0-f50.google.com with SMTP id uo5so1054151pbc.23 for ; Thu, 29 Aug 2013 15:58:34 -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=9rkCDT4G7LeQD9U1jM9zisyKCN2LL5mLf213x7qMhdw=; b=bheLelrRJvq0ikMuptz3sauC8/Bvw/s8yxTGd9qPTfBpgy0oy6H514cth4yxRao5/Q gD0kCNsGwGUmqyTnt71cVJA9r4W6/a+M8qX7XTuI+1hUPBf4/OuydO+t+iFpjpFTvruf j9TxNv6JmnZ0gw3oVZtFjOAP4C6ruItFYGE2F6rVZF2tTb4RBaQm1N7Y+YVAlumXIK6Z kFclPujmZ+/me53YtH59fowfHTdtgr0b2ZoMPUjLzc6ycEmWt+cPrvEusLcKC0aRSRZx +lfQJ1RjSKKcWlAnqsKgohpbq5Mvb5m2zgcZmgSDeYrymHndojEqHmjUBztvN22MBxi9 mwIg== X-Received: by 10.66.136.131 with SMTP id qa3mr6992943pab.77.1377817114195; Thu, 29 Aug 2013 15:58:34 -0700 (PDT) Received: from [10.192.166.0] (stargate.chelsio.com. [67.207.112.58]) by mx.google.com with ESMTPSA id sb9sm30759708pbb.0.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 29 Aug 2013 15:58:33 -0700 (PDT) Sender: Navdeep Parhar Message-ID: <521FD217.5080603@FreeBSD.org> Date: Thu, 29 Aug 2013 15:58:31 -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: lazy ext refcount initialization 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 22:58:34 -0000 I'd like to merge r254342 from user/np/cxl_tuning to head if there are no objections. http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/kern/kern_mbuf.c?r1=254334&r2=254342&diff_format=u http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/sys/mbuf.h?r1=254334&r2=254342&diff_format=u --------------------- Perform lazy initialization of a cluster's refcount if possible. This doesn't change anything for the common cases where the constructor is given an mbuf to attach to the cluster, or when the cluster is obtained with m_cljget(NULL, ...) and attached later with m_cljset(). But it allows for an alternate usage scenario where the cluster is managed EXT_EXTREF style without ever having to look up its "usual" refcount via uma_find_refcnt. --------------------- Regards, Navdeep diff -r 9753d3e51363 -r c9388a59fba6 sys/kern/kern_mbuf.c --- a/sys/kern/kern_mbuf.c Thu Aug 29 11:16:04 2013 -0700 +++ b/sys/kern/kern_mbuf.c Thu Aug 29 11:16:04 2013 -0700 @@ -503,8 +503,6 @@ mb_dtor_pack(void *mem, int size, void * static int mb_ctor_clust(void *mem, int size, void *arg, int how) { - struct mbuf *m; - u_int *refcnt; int type; uma_zone_t zone; @@ -535,10 +533,11 @@ mb_ctor_clust(void *mem, int size, void break; } - m = (struct mbuf *)arg; - refcnt = uma_find_refcnt(zone, mem); - *refcnt = 1; - if (m != NULL) { + if (arg != NULL) { + struct mbuf *m = arg; + u_int *refcnt = uma_find_refcnt(zone, mem); + + *refcnt = 1; m->m_ext.ext_buf = (caddr_t)mem; m->m_data = m->m_ext.ext_buf; m->m_flags |= M_EXT; @@ -549,6 +548,10 @@ mb_ctor_clust(void *mem, int size, void m->m_ext.ext_type = type; m->m_ext.ext_flags = 0; m->m_ext.ref_cnt = refcnt; + } else { +#ifdef INVARIANTS + *uma_find_refcnt(zone, mem) = 0; +#endif } return (0); diff -r 9753d3e51363 -r c9388a59fba6 sys/sys/mbuf.h --- a/sys/sys/mbuf.h Thu Aug 29 11:16:04 2013 -0700 +++ b/sys/sys/mbuf.h Thu Aug 29 11:16:04 2013 -0700 @@ -721,6 +721,7 @@ m_cljset(struct mbuf *m, void *cl, int t m->m_ext.ext_type = type; m->m_ext.ext_flags = 0; m->m_ext.ref_cnt = uma_find_refcnt(zone, cl); + *m->m_ext.ref_cnt = 1; m->m_flags |= M_EXT; }