]> git.droids-corp.org - dpdk.git/commitdiff
mempool: return 0 if area is too small on populate mempool_compat2
authorOlivier Matz <olivier.matz@6wind.com>
Sun, 26 Apr 2020 16:52:55 +0000 (18:52 +0200)
committerOlivier Matz <olivier.matz@6wind.com>
Mon, 4 May 2020 09:36:13 +0000 (11:36 +0200)
Change rte_mempool_populate_iova() and rte_mempool_populate_virt() 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 <olivier.matz@6wind.com>
Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
doc/guides/rel_notes/deprecation.rst
doc/guides/rel_notes/release_20_05.rst
examples/ntb/ntb_fwd.c
lib/librte_mempool/meson.build
lib/librte_mempool/rte_mempool.c
lib/librte_mempool/rte_mempool.h
lib/librte_mempool/rte_mempool_version.map

index 1339f54f5f5c80814e56f9b39c4a50423f91fe65..20aa745b7753fbb160a3247ef44a315c35c6bc74 100644 (file)
@@ -65,11 +65,6 @@ Deprecation Notices
   structure would be made internal (or removed if all dependencies are cleared)
   in future releases.
 
-* mempool: starting from v20.05, the API of rte_mempool_populate_iova()
-  and rte_mempool_populate_virt() will change to return 0 instead
-  of -EINVAL when there is not enough room to store one object. The ABI
-  will be preserved until 20.11.
-
 * ethdev: the legacy filter API, including
   ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well
   as filter types MACVLAN, ETHERTYPE, FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR,
index b124c3f2876f28e7da231a7754097b5a7637ddcd..ab20a7d021a67a27aff442420339526b481e3b55 100644 (file)
@@ -241,6 +241,10 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* mempool: The API of ``rte_mempool_populate_iova()`` and
+  ``rte_mempool_populate_virt()`` changed to return 0 instead of -EINVAL
+  when there is not enough room to store one object.
+
 
 ABI Changes
 -----------
index d49189e175cbf386922da9dfb217897162b91fdd..eba8ebf9fab02eee3e16ca7d43224583aa8c1689 100644 (file)
@@ -1319,7 +1319,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 <= 0) {
                        rte_memzone_free(mz);
                        rte_mempool_free(mp);
                        return NULL;
index a6e861cbfc9518c7aabfad755acdf1838328e829..7dbe6b9beac5378dafda5251782b6cbc325cfe24 100644 (file)
@@ -9,6 +9,8 @@ foreach flag: extra_flags
        endif
 endforeach
 
+use_function_versioning = true
+
 sources = files('rte_mempool.c', 'rte_mempool_ops.c',
                'rte_mempool_ops_default.c', 'mempool_trace_points.c')
 headers = files('rte_mempool.h', 'rte_mempool_trace.h',
index 0be8f9f59d099629acbac3853b54b51dfdd7f6cd..0bde995b5290b7415288b0c84d9c94642e984322 100644 (file)
@@ -31,6 +31,7 @@
 #include <rte_string_fns.h>
 #include <rte_spinlock.h>
 #include <rte_tailq.h>
+#include <rte_function_versioning.h>
 
 #include "rte_mempool.h"
 #include "rte_mempool_trace.h"
@@ -303,12 +304,17 @@ mempool_ops_alloc_once(struct rte_mempool *mp)
        return 0;
 }
 
+__vsym int
+rte_mempool_populate_iova_v21(struct rte_mempool *mp, char *vaddr,
+       rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb,
+       void *opaque);
+
 /* 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_v21(struct rte_mempool *mp, char *vaddr,
        rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb,
        void *opaque)
 {
@@ -359,6 +365,8 @@ __rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
 
        STAILQ_INSERT_TAIL(&mp->mem_list, memhdr, next);
        mp->nb_mem_chunks++;
+
+       rte_mempool_trace_populate_iova(mp, vaddr, iova, len, free_cb, opaque);
        return i;
 
 fail:
@@ -366,21 +374,34 @@ fail:
        return ret;
 }
 
-int
-rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
+BIND_DEFAULT_SYMBOL(rte_mempool_populate_iova, _v21, 21);
+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_v21);
+
+__vsym int
+rte_mempool_populate_iova_v20(struct rte_mempool *mp, char *vaddr,
+       rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb,
+       void *opaque);
+
+__vsym int
+rte_mempool_populate_iova_v20(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 = __rte_mempool_populate_iova(mp, vaddr, iova, len, free_cb,
+       ret = rte_mempool_populate_iova_v21(mp, vaddr, iova, len, free_cb,
                                        opaque);
        if (ret == 0)
                ret = -EINVAL;
 
-       rte_mempool_trace_populate_iova(mp, vaddr, iova, len, free_cb, opaque);
        return ret;
 }
+VERSION_SYMBOL(rte_mempool_populate_iova, _v20, 20.0);
 
 static rte_iova_t
 get_iova(void *addr)
@@ -395,11 +416,16 @@ get_iova(void *addr)
        return ms->iova + RTE_PTR_DIFF(addr, ms->addr);
 }
 
+__vsym int
+rte_mempool_populate_virt_v21(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_v21(struct rte_mempool *mp, char *addr,
        size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb,
        void *opaque)
 {
@@ -432,7 +458,7 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
                                break;
                }
 
-               ret = __rte_mempool_populate_iova(mp, addr + off, iova,
+               ret = rte_mempool_populate_iova_v21(mp, addr + off, iova,
                        phys_len, free_cb, opaque);
                if (ret == 0)
                        continue;
@@ -443,9 +469,6 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
                cnt += ret;
        }
 
-       if (cnt == 0)
-               return -EINVAL;
-
        rte_mempool_trace_populate_virt(mp, addr, len, pg_sz, free_cb, opaque);
        return cnt;
 
@@ -453,6 +476,35 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
        rte_mempool_free_memchunks(mp);
        return ret;
 }
+BIND_DEFAULT_SYMBOL(rte_mempool_populate_virt, _v21, 21);
+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_v21);
+
+__vsym int
+rte_mempool_populate_virt_v20(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(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 = rte_mempool_populate_virt_v21(mp, addr, len, pg_sz,
+                                               free_cb, opaque);
+
+       if (ret == 0)
+               ret = -EINVAL;
+
+       return ret;
+}
+VERSION_SYMBOL(rte_mempool_populate_virt, _v20, 20.0);
 
 /* Get the minimal page size used in a mempool before populating it. */
 int
@@ -609,6 +661,8 @@ rte_mempool_populate_default(struct rte_mempool *mp)
                                mz->len, pg_sz,
                                rte_mempool_memchunk_mz_free,
                                (void *)(uintptr_t)mz);
+               if (ret == 0) /* should not happen */
+                       ret = -ENOBUFS;
                if (ret < 0) {
                        rte_memzone_free(mz);
                        goto fail;
@@ -701,6 +755,8 @@ rte_mempool_populate_anon(struct rte_mempool *mp)
 
        ret = rte_mempool_populate_virt(mp, addr, size, getpagesize(),
                rte_mempool_memchunk_anon_free, addr);
+       if (ret == 0) /* should not happen */
+               ret = -ENOBUFS;
        if (ret < 0) {
                rte_errno = -ret;
                goto fail;
index 6e0573ea4298eb0b2afb8011cb9b80de4b92e6ab..652d19f9f1373f9349c4021eaab66244662f4349 100644 (file)
@@ -1112,9 +1112,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,
@@ -1139,9 +1142,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,
index 695dd6e04f3f5dbb01fb1504bf016aea14ae45ed..826a0b882488c7b89d4fdf066df76231bcbdb9af 100644 (file)
@@ -31,6 +31,13 @@ DPDK_20.0 {
        local: *;
 };
 
+DPDK_21 {
+       global:
+
+       rte_mempool_populate_iova;
+       rte_mempool_populate_virt;
+} DPDK_20.0;
+
 EXPERIMENTAL {
        global: