mempool: support block dequeue operation
[dpdk.git] / lib / librte_mempool / rte_mempool.c
index 68ae12f..cf5d124 100644 (file)
@@ -227,19 +227,15 @@ rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags,
 
 
 /*
- * Calculate maximum amount of memory required to store given number of objects.
+ * Internal function to calculate required memory chunk size shared
+ * by default implementation of the corresponding callback and
+ * deprecated external function.
  */
 size_t
-rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
-                     unsigned int flags)
+rte_mempool_calc_mem_size_helper(uint32_t elt_num, size_t total_elt_sz,
+                                uint32_t pg_shift)
 {
        size_t obj_per_page, pg_num, pg_sz;
-       unsigned int mask;
-
-       mask = MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS | MEMPOOL_F_CAPA_PHYS_CONTIG;
-       if ((flags & mask) == mask)
-               /* alignment need one additional object */
-               elt_num += 1;
 
        if (total_elt_sz == 0)
                return 0;
@@ -256,6 +252,17 @@ rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
        return pg_num << pg_shift;
 }
 
+/*
+ * Calculate maximum amount of memory required to store given number of objects.
+ */
+size_t
+rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
+                     __rte_unused unsigned int flags)
+{
+       return rte_mempool_calc_mem_size_helper(elt_num, total_elt_sz,
+                                               pg_shift);
+}
+
 /*
  * Calculate how much memory would be actually required with the
  * given memory footprint to store required number of elements.
@@ -263,18 +270,12 @@ rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
 ssize_t
 rte_mempool_xmem_usage(__rte_unused void *vaddr, uint32_t elt_num,
        size_t total_elt_sz, const rte_iova_t iova[], uint32_t pg_num,
-       uint32_t pg_shift, unsigned int flags)
+       uint32_t pg_shift, __rte_unused unsigned int flags)
 {
        uint32_t elt_cnt = 0;
        rte_iova_t start, end;
        uint32_t iova_idx;
        size_t pg_sz = (size_t)1 << pg_shift;
-       unsigned int mask;
-
-       mask = MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS | MEMPOOL_F_CAPA_PHYS_CONTIG;
-       if ((flags & mask) == mask)
-               /* alignment need one additional object */
-               elt_num += 1;
 
        /* if iova is NULL, assume contiguous memory */
        if (iova == NULL) {
@@ -368,8 +369,6 @@ 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)
 {
-       unsigned total_elt_sz;
-       unsigned int mp_capa_flags;
        unsigned i = 0;
        size_t off;
        struct rte_mempool_memhdr *memhdr;
@@ -379,26 +378,10 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
        if (ret != 0)
                return ret;
 
-       /* Notify memory area to mempool */
-       ret = rte_mempool_ops_register_memory_area(mp, vaddr, iova, len);
-       if (ret != -ENOTSUP && ret < 0)
-               return ret;
-
        /* mempool is already populated */
        if (mp->populated_size >= mp->size)
                return -ENOSPC;
 
-       total_elt_sz = mp->header_size + mp->elt_size + mp->trailer_size;
-
-       /* Get mempool capabilities */
-       mp_capa_flags = 0;
-       ret = rte_mempool_ops_get_capabilities(mp, &mp_capa_flags);
-       if ((ret < 0) && (ret != -ENOTSUP))
-               return ret;
-
-       /* update mempool capabilities */
-       mp->flags |= mp_capa_flags;
-
        memhdr = rte_zmalloc("MEMPOOL_MEMHDR", sizeof(*memhdr), 0);
        if (memhdr == NULL)
                return -ENOMEM;
@@ -410,10 +393,7 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
        memhdr->free_cb = free_cb;
        memhdr->opaque = opaque;
 
-       if (mp_capa_flags & MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS)
-               /* align object start address to a multiple of total_elt_sz */
-               off = total_elt_sz - ((uintptr_t)vaddr % total_elt_sz);
-       else if (mp->flags & MEMPOOL_F_NO_CACHE_ALIGN)
+       if (mp->flags & MEMPOOL_F_NO_CACHE_ALIGN)
                off = RTE_PTR_ALIGN_CEIL(vaddr, 8) - vaddr;
        else
                off = RTE_PTR_ALIGN_CEIL(vaddr, RTE_CACHE_LINE_SIZE) - vaddr;
@@ -1275,6 +1255,36 @@ void rte_mempool_check_cookies(const struct rte_mempool *mp,
 #endif
 }
 
+void
+rte_mempool_contig_blocks_check_cookies(const struct rte_mempool *mp,
+       void * const *first_obj_table_const, unsigned int n, int free)
+{
+#ifdef RTE_LIBRTE_MEMPOOL_DEBUG
+       struct rte_mempool_info info;
+       const size_t total_elt_sz =
+               mp->header_size + mp->elt_size + mp->trailer_size;
+       unsigned int i, j;
+
+       rte_mempool_ops_get_info(mp, &info);
+
+       for (i = 0; i < n; ++i) {
+               void *first_obj = first_obj_table_const[i];
+
+               for (j = 0; j < info.contig_block_size; ++j) {
+                       void *obj;
+
+                       obj = (void *)((uintptr_t)first_obj + j * total_elt_sz);
+                       rte_mempool_check_cookies(mp, &obj, 1, free);
+               }
+       }
+#else
+       RTE_SET_USED(mp);
+       RTE_SET_USED(first_obj_table_const);
+       RTE_SET_USED(n);
+       RTE_SET_USED(free);
+#endif
+}
+
 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
 static void
 mempool_obj_audit(struct rte_mempool *mp, __rte_unused void *opaque,
@@ -1340,6 +1350,7 @@ void
 rte_mempool_dump(FILE *f, struct rte_mempool *mp)
 {
 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
+       struct rte_mempool_info info;
        struct rte_mempool_debug_stats sum;
        unsigned lcore_id;
 #endif
@@ -1381,6 +1392,7 @@ rte_mempool_dump(FILE *f, struct rte_mempool *mp)
 
        /* sum and dump statistics */
 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
+       rte_mempool_ops_get_info(mp, &info);
        memset(&sum, 0, sizeof(sum));
        for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
                sum.put_bulk += mp->stats[lcore_id].put_bulk;
@@ -1389,6 +1401,8 @@ rte_mempool_dump(FILE *f, struct rte_mempool *mp)
                sum.get_success_objs += mp->stats[lcore_id].get_success_objs;
                sum.get_fail_bulk += mp->stats[lcore_id].get_fail_bulk;
                sum.get_fail_objs += mp->stats[lcore_id].get_fail_objs;
+               sum.get_success_blks += mp->stats[lcore_id].get_success_blks;
+               sum.get_fail_blks += mp->stats[lcore_id].get_fail_blks;
        }
        fprintf(f, "  stats:\n");
        fprintf(f, "    put_bulk=%"PRIu64"\n", sum.put_bulk);
@@ -1397,6 +1411,11 @@ rte_mempool_dump(FILE *f, struct rte_mempool *mp)
        fprintf(f, "    get_success_objs=%"PRIu64"\n", sum.get_success_objs);
        fprintf(f, "    get_fail_bulk=%"PRIu64"\n", sum.get_fail_bulk);
        fprintf(f, "    get_fail_objs=%"PRIu64"\n", sum.get_fail_objs);
+       if (info.contig_block_size > 0) {
+               fprintf(f, "    get_success_blks=%"PRIu64"\n",
+                       sum.get_success_blks);
+               fprintf(f, "    get_fail_blks=%"PRIu64"\n", sum.get_fail_blks);
+       }
 #else
        fprintf(f, "  no statistics available\n");
 #endif