From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ilya Matveychikov Subject: Re: [PATCH v4] mbuf: fix mbuf free performance with non atomic refcnt Date: Fri, 8 Dec 2017 20:04:50 +0400 Message-ID: <60A7E7E9-91D7-48C0-BE51-D284318FD659@gmail.com> References: <20171115091413.27119-1-hhaim@cisco.com> <20171208154651.16546-1-olivier.matz@6wind.com> Mime-Version: 1.0 (Mac OS X Mail 11.1 \(3445.4.7\)) Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Cc: dev@dpdk.org, "Hanoch Haim (hhaim)" , konstantin.ananyev@intel.com To: Olivier Matz Return-path: Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id F12A3199B6 for ; Fri, 8 Dec 2017 17:04:53 +0100 (CET) Received: by mail-wm0-f68.google.com with SMTP id f9so3976332wmh.0 for ; Fri, 08 Dec 2017 08:04:53 -0800 (PST) In-Reply-To: <20171208154651.16546-1-olivier.matz@6wind.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Olivier, > On Dec 8, 2017, at 7:46 PM, Olivier Matz = wrote: >=20 >=20 > lib/librte_mbuf/rte_mbuf.h | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) >=20 > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > index ce8a05ddf..dd08cb72b 100644 > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -764,6 +764,13 @@ rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t = new_value) > rte_atomic16_set(&m->refcnt_atomic, new_value); > } >=20 > +/* internal */ > +static inline uint16_t > +__rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value) > +{ > + return (uint16_t)(rte_atomic16_add_return(&m->refcnt_atomic, = value)); What=E2=80=99s the purpose of using direct cast to uint16_t here and in = other places? > +} > + > /** > * Adds given value to an mbuf's refcnt and returns its new value. > * @param m > @@ -788,19 +795,26 @@ rte_mbuf_refcnt_update(struct rte_mbuf *m, = int16_t value) > return 1 + value; > } >=20 > - return (uint16_t)(rte_atomic16_add_return(&m->refcnt_atomic, = value)); > + return __rte_mbuf_refcnt_update(m, value); > } >=20 > #else /* ! RTE_MBUF_REFCNT_ATOMIC */ >=20 > +/* internal */ > +static inline uint16_t > +__rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value) > +{ > + m->refcnt =3D (uint16_t)(m->refcnt + value); > + return m->refcnt; > +} > + > /** > * Adds given value to an mbuf's refcnt and returns its new value. > */ > static inline uint16_t > rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value) > { > - m->refcnt =3D (uint16_t)(m->refcnt + value); > - return m->refcnt; > + return __rte_mbuf_refcnt_update(m, value); > } >=20 > /** > @@ -1364,8 +1378,7 @@ rte_pktmbuf_prefree_seg(struct rte_mbuf *m) >=20 > return m; >=20 > - } else if (rte_atomic16_add_return(&m->refcnt_atomic, -1) =3D=3D= 0) { > - > + } else if (__rte_mbuf_refcnt_update(m, -1) =3D=3D 0) { >=20 > if (RTE_MBUF_INDIRECT(m)) > rte_pktmbuf_detach(m); > --=20 > 2.11.0 >=20