ivshmem: add all memzones of mempool to metadata
authorFerruh Yigit <ferruh.yigit@intel.com>
Fri, 3 Jun 2016 16:38:38 +0000 (17:38 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 7 Jun 2016 10:11:40 +0000 (12:11 +0200)
Mempool consist of multiple memzones, at least from two of them.
ivshmem assumes mempool and elements are all in same memzone.

Updating code to add all memzones when a mempool added.

Fixes: d1d914ebbc25 ("mempool: allocate in several memory chunks by default")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_ivshmem/rte_ivshmem.c

index c8b332c..5c83920 100644 (file)
@@ -548,25 +548,39 @@ add_ring_to_metadata(const struct rte_ring * r,
 }
 
 static int
-add_mempool_to_metadata(const struct rte_mempool * mp,
-               struct ivshmem_config * config)
+add_mempool_memzone_to_metadata(const void *addr,
+               struct ivshmem_config *config)
 {
-       struct rte_memzone * mz;
-       int ret;
+       struct rte_memzone *mz;
 
-       mz = get_memzone_by_addr(mp);
-       ret = 0;
+       mz = get_memzone_by_addr(addr);
 
        if (!mz) {
                RTE_LOG(ERR, EAL, "Cannot find memzone for mempool!\n");
                return -1;
        }
 
-       /* mempool consists of memzone and ring */
-       ret = add_memzone_to_metadata(mz, config);
+       return add_memzone_to_metadata(mz, config);
+}
+
+static int
+add_mempool_to_metadata(const struct rte_mempool *mp,
+               struct ivshmem_config *config)
+{
+       struct rte_mempool_memhdr *memhdr;
+       int ret;
+
+       ret = add_mempool_memzone_to_metadata(mp, config);
        if (ret < 0)
                return -1;
 
+       STAILQ_FOREACH(memhdr, &mp->mem_list, next) {
+               ret = add_mempool_memzone_to_metadata(memhdr->addr, config);
+               if (ret < 0)
+                       return -1;
+       }
+
+       /* mempool consists of memzone and ring */
        return add_ring_to_metadata(mp->ring, config);
 }