From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 659B5A051C; Fri, 17 Jan 2020 21:32:55 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2A95F2BF9; Fri, 17 Jan 2020 21:32:53 +0100 (CET) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by dpdk.org (Postfix) with ESMTP id 7810429D6 for ; Fri, 17 Jan 2020 21:32:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1579293170; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Njkvrg0mdj1FFF9T1g/1QUwlnmvnLB/1nEWP+GsnUfU=; b=O+AF6lQ+AdyNyys00W1EjAqU7/yO5W70tUroMvWVnLiTlV0ziSgX6bMp+fkYlfroX/AtCS NVPFEoXjm65OqDqBlTBvEcN4O5o59H7ZsnZyCduAQ1GDSwg+9554IFoehxS//3HUWht4q3 VjvyKqlTIrDELzBPl7kiX2BoQGGkWc0= Received: from mail-vk1-f198.google.com (mail-vk1-f198.google.com [209.85.221.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-101-Njr3SIYONQ6eaFtw7AoOWA-1; Fri, 17 Jan 2020 15:32:49 -0500 Received: by mail-vk1-f198.google.com with SMTP id s4so10218897vkk.7 for ; Fri, 17 Jan 2020 12:32:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=eXjVJi7OFDwMgZYkzYpx0NEFmbyz7d/pGmpAcReBVds=; b=BxUxvm9v6qEkiMS4D0TbBAyBbH37M3Mr8lDerIAukn2SLayWM+OpMk/EeHk1Lp9ALB o+isqowLz8TfOmmu54+sDWq6iMU/R4RZPlKXmRMhWYggTIcEf13b/Gw/nZTJ0YQoJseV nSrJfDuthzOdXTMG/WqXpztxL797rnciU/C9dCYtK4DTh583SjUXgzseAhuSo4SnxYMJ 2/CzqcpsgeSV9eLdP326aCCjMXQeb5MLzOmQa/FsoJcZ12cnPAf2M6YT/QzouTr0AvGY ar+JMIcgiL2LxBElntwVzgSU0ouLT4BwZYs+PwI0jhW1NYttgbPs9yXrJ/CIwcZDl008 DlUA== X-Gm-Message-State: APjAAAXJ39VkS8geHNL5zjernecPY19W7LAFM02Mey3zdFpr8Or56KeU Gin4Q5ZoayI1+2ZCW8eonQ/UlVEIuar4mA+8KQDEqf4iT7qVmEX3U8GzOcSKzzWAjdeimLvMU/C AWbRPJgtWJNqtX0yM6YE= X-Received: by 2002:a67:b303:: with SMTP id a3mr5977597vsm.141.1579293168675; Fri, 17 Jan 2020 12:32:48 -0800 (PST) X-Google-Smtp-Source: APXvYqyN2oIU46dsRqIKD5cmxjyO3PMt33miUcqZefASiAO1DqumNytzKSfaWE3ydK5mihIJByK3W3Xa5UeNIIV+XQA= X-Received: by 2002:a67:b303:: with SMTP id a3mr5977582vsm.141.1579293168220; Fri, 17 Jan 2020 12:32:48 -0800 (PST) MIME-Version: 1.0 References: <20200109132720.15664-1-olivier.matz@6wind.com> <20200117145754.11682-1-olivier.matz@6wind.com> <20200117145754.11682-4-olivier.matz@6wind.com> In-Reply-To: <20200117145754.11682-4-olivier.matz@6wind.com> From: David Marchand Date: Fri, 17 Jan 2020 21:32:36 +0100 Message-ID: To: Olivier Matz Cc: dev , "Zhang, AlvinX" , "Burakov, Anatoly" , Andrew Rybchenko , Bruce Richardson , dpdk stable X-MC-Unique: Njr3SIYONQ6eaFtw7AoOWA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: Re: [dpdk-dev] [PATCH v2 3/3] [20.05] mempool: return 0 if area is too small on populate X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Fri, Jan 17, 2020 at 3:58 PM Olivier Matz wrote= : > > Change rte_mempool_populate_iova() and rte_mempool_populate_iova() to > return 0 instead of -EINVAL when there is not enough room to store one > object, as it can be helpful for applications to distinguish this > specific case. > > As this is an ABI change, use symbol versioning to preserve old > behavior for binary applications. > > Signed-off-by: Olivier Matz > --- > examples/ntb/ntb_fwd.c | 2 +- > lib/librte_mempool/meson.build | 1 + > lib/librte_mempool/rte_mempool.c | 76 ++++++++++++++++++---- > lib/librte_mempool/rte_mempool.h | 14 ++-- > lib/librte_mempool/rte_mempool_version.map | 7 ++ > 5 files changed, 84 insertions(+), 16 deletions(-) > > diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c > index c914256dd..99a43688c 100644 > --- a/examples/ntb/ntb_fwd.c > +++ b/examples/ntb/ntb_fwd.c > @@ -1313,7 +1313,7 @@ ntb_mbuf_pool_create(uint16_t mbuf_seg_size, uint32= _t nb_mbuf, > mz->len - ntb_info.ntb_hdr_size, > ntb_mempool_mz_free, > (void *)(uintptr_t)mz); > - if (ret < 0) { > + if (ret <=3D 0) { > rte_memzone_free(mz); > rte_mempool_free(mp); > return NULL; > diff --git a/lib/librte_mempool/meson.build b/lib/librte_mempool/meson.bu= ild > index f8710b61b..4fe267cd8 100644 > --- a/lib/librte_mempool/meson.build > +++ b/lib/librte_mempool/meson.build > @@ -18,3 +18,4 @@ deps +=3D ['ring'] > > # memseg walk is not yet part of stable API > allow_experimental_apis =3D true > +use_function_versioning =3D true > diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_me= mpool.c > index b434d9f17..0ebb21eec 100644 > --- a/lib/librte_mempool/rte_mempool.c > +++ b/lib/librte_mempool/rte_mempool.c > @@ -31,6 +31,7 @@ > #include > #include > #include > +#include > > #include "rte_mempool.h" > > @@ -293,12 +294,17 @@ mempool_ops_alloc_once(struct rte_mempool *mp) > return 0; > } > > +__vsym int > +rte_mempool_populate_iova_v20_0_1(struct rte_mempool *mp, char *vaddr, > + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free= _cb, > + void *opaque); > + For 20.05, this should be 20.0.2. > /* Add objects in the pool, using a physically contiguous memory > * zone. Return the number of objects added, or a negative value > * on error. > */ > -static int > -__rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, > +__vsym int > +rte_mempool_populate_iova_v20_0_1(struct rte_mempool *mp, char *vaddr, > rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free= _cb, > void *opaque) > { > @@ -355,21 +361,34 @@ __rte_mempool_populate_iova(struct rte_mempool *mp,= char *vaddr, > rte_free(memhdr); > return ret; > } > +BIND_DEFAULT_SYMBOL(rte_mempool_populate_iova, _v20_0_1, 20.0.1); > +MAP_STATIC_SYMBOL( > + int rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr= , > + rte_iova_t iova, size_t len, > + rte_mempool_memchunk_free_cb_t *free_cb, > + void *opaque), > + rte_mempool_populate_iova_v20_0_1); > + > +__vsym int > +rte_mempool_populate_iova_v20_0(struct rte_mempool *mp, char *vaddr, > + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free= _cb, > + void *opaque); > > -int > -rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, > +__vsym int > +rte_mempool_populate_iova_v20_0(struct rte_mempool *mp, char *vaddr, > rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free= _cb, > void *opaque) > { > int ret; > > - ret =3D __rte_mempool_populate_iova(mp, vaddr, iova, len, free_cb= , > + ret =3D rte_mempool_populate_iova_v20_0_1(mp, vaddr, iova, len, f= ree_cb, > opaque); > if (ret =3D=3D 0) > ret =3D -EINVAL; > > return ret; > } > +VERSION_SYMBOL(rte_mempool_populate_iova, _v20_0, 20.0); > > static rte_iova_t > get_iova(void *addr) > @@ -384,11 +403,16 @@ get_iova(void *addr) > return ms->iova + RTE_PTR_DIFF(addr, ms->addr); > } > > +__vsym int > +rte_mempool_populate_virt_v20_0_1(struct rte_mempool *mp, char *addr, > + size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb= , > + void *opaque); > + > /* Populate the mempool with a virtual area. Return the number of > * objects added, or a negative value on error. > */ > -int > -rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, > +__vsym int > +rte_mempool_populate_virt_v20_0_1(struct rte_mempool *mp, char *addr, > size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb= , > void *opaque) > { > @@ -421,7 +445,7 @@ rte_mempool_populate_virt(struct rte_mempool *mp, cha= r *addr, > break; > } > > - ret =3D __rte_mempool_populate_iova(mp, addr + off, iova, > + ret =3D rte_mempool_populate_iova_v20_0_1(mp, addr + off,= iova, > phys_len, free_cb, opaque); > if (ret =3D=3D 0) > continue; > @@ -432,15 +456,41 @@ rte_mempool_populate_virt(struct rte_mempool *mp, c= har *addr, > cnt +=3D ret; > } > > - if (cnt =3D=3D 0) > - return -EINVAL; > - > return cnt; > > fail: > rte_mempool_free_memchunks(mp); > return ret; > } > +BIND_DEFAULT_SYMBOL(rte_mempool_populate_virt, _v20_0_1, 20.0.1); > +MAP_STATIC_SYMBOL( > + int rte_mempool_populate_virt(struct rte_mempool *mp, > + char *addr, size_t len, size_t pg_sz, > + rte_mempool_memchunk_free_cb_t *free_cb, > + void *opaque), > + rte_mempool_populate_virt_v20_0_1); > + > +__vsym int > +rte_mempool_populate_virt_v20_0(struct rte_mempool *mp, char *addr, > + size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb= , > + void *opaque); > + > +__vsym int > +rte_mempool_populate_virt_v20_0(struct rte_mempool *mp, char *addr, > + size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb= , > + void *opaque) > +{ > + int ret; > + > + ret =3D rte_mempool_populate_virt_v20_0_1(mp, addr, len, pg_sz, > + free_cb, opaque); > + > + if (ret =3D=3D 0) > + ret =3D -EINVAL; > + > + return ret; > +} > +VERSION_SYMBOL(rte_mempool_populate_virt, _v20_0, 20.0); > > /* Get the minimal page size used in a mempool before populating it. */ > int > @@ -601,6 +651,8 @@ rte_mempool_populate_default(struct rte_mempool *mp) > mz->len, pg_sz, > rte_mempool_memchunk_mz_free, > (void *)(uintptr_t)mz); > + if (ret =3D=3D 0) /* should not happen */ > + ret =3D -ENOBUFS; > if (ret < 0) { > rte_memzone_free(mz); > goto fail; > @@ -692,6 +744,8 @@ rte_mempool_populate_anon(struct rte_mempool *mp) > > ret =3D rte_mempool_populate_virt(mp, addr, size, getpagesize(), > rte_mempool_memchunk_anon_free, addr); > + if (ret =3D=3D 0) /* should not happen */ > + ret =3D -ENOBUFS; > if (ret < 0) { > rte_errno =3D -ret; > goto fail; > diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_me= mpool.h > index 0a1dc6059..5a106a432 100644 > --- a/lib/librte_mempool/rte_mempool.h > +++ b/lib/librte_mempool/rte_mempool.h > @@ -1106,9 +1106,12 @@ rte_mempool_free(struct rte_mempool *mp); > * @param opaque > * An opaque argument passed to free_cb. > * @return > - * The number of objects added on success. > + * The number of objects added on success (strictly positive). > * On error, the chunk is not added in the memory list of the > - * mempool and a negative errno is returned. > + * mempool the following code is returned: > + * (0): not enough room in chunk for one object. > + * (-ENOSPC): mempool is already populated. > + * (-ENOMEM): allocation failure. > */ > int rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, > rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free= _cb, > @@ -1133,9 +1136,12 @@ int rte_mempool_populate_iova(struct rte_mempool *= mp, char *vaddr, > * @param opaque > * An opaque argument passed to free_cb. > * @return > - * The number of objects added on success. > + * The number of objects added on success (strictly positive). > * On error, the chunk is not added in the memory list of the > - * mempool and a negative errno is returned. > + * mempool the following code is returned: > + * (0): not enough room in chunk for one object. > + * (-ENOSPC): mempool is already populated. > + * (-ENOMEM): allocation failure. > */ > int > rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, > diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_memp= ool/rte_mempool_version.map > index d002dfc46..34d977e47 100644 > --- a/lib/librte_mempool/rte_mempool_version.map > +++ b/lib/librte_mempool/rte_mempool_version.map > @@ -35,6 +35,13 @@ DPDK_20.0 { > local: *; > }; > > +DPDK_20.0.1 { > + global: > + > + rte_mempool_populate_iova; > + rte_mempool_populate_virt; > +} DPDK_20.0; > + > EXPERIMENTAL { > global: > > -- > 2.20.1 >