summaryrefslogtreecommitdiff
path: root/drivers/mempool
diff options
context:
space:
mode:
authorArtem V. Andreev <artem.andreev@oktetlabs.ru>2018-04-26 11:59:23 +0100
committerThomas Monjalon <thomas@monjalon.net>2018-04-26 23:34:07 +0200
commit363e56f9e23cfdd0ba73c9a49a97d95565052baf (patch)
tree22f0fce68ecb6b26cd86d16d985211b7ddcce053 /drivers/mempool
parentc24325b3c8d63dd50a7087b98dc9cb2f796b447e (diff)
downloaddpdk-363e56f9e23cfdd0ba73c9a49a97d95565052baf.zip
dpdk-363e56f9e23cfdd0ba73c9a49a97d95565052baf.tar.gz
dpdk-363e56f9e23cfdd0ba73c9a49a97d95565052baf.tar.xz
mempool/bucket: do not allow one lcore to grab all buckets
Signed-off-by: Artem V. Andreev <artem.andreev@oktetlabs.ru> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Diffstat (limited to 'drivers/mempool')
-rw-r--r--drivers/mempool/bucket/rte_mempool_bucket.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/mempool/bucket/rte_mempool_bucket.c b/drivers/mempool/bucket/rte_mempool_bucket.c
index 24be24e..78d2b9d 100644
--- a/drivers/mempool/bucket/rte_mempool_bucket.c
+++ b/drivers/mempool/bucket/rte_mempool_bucket.c
@@ -42,6 +42,7 @@ struct bucket_data {
unsigned int header_size;
unsigned int total_elt_size;
unsigned int obj_per_bucket;
+ unsigned int bucket_stack_thresh;
uintptr_t bucket_page_mask;
struct rte_ring *shared_bucket_ring;
struct bucket_stack *buckets[RTE_MAX_LCORE];
@@ -139,6 +140,7 @@ bucket_enqueue(struct rte_mempool *mp, void * const *obj_table,
unsigned int n)
{
struct bucket_data *bd = mp->pool_data;
+ struct bucket_stack *local_stack = bd->buckets[rte_lcore_id()];
unsigned int i;
int rc = 0;
@@ -146,6 +148,15 @@ bucket_enqueue(struct rte_mempool *mp, void * const *obj_table,
rc = bucket_enqueue_single(bd, obj_table[i]);
RTE_ASSERT(rc == 0);
}
+ if (local_stack->top > bd->bucket_stack_thresh) {
+ rte_ring_enqueue_bulk(bd->shared_bucket_ring,
+ &local_stack->objects
+ [bd->bucket_stack_thresh],
+ local_stack->top -
+ bd->bucket_stack_thresh,
+ NULL);
+ local_stack->top = bd->bucket_stack_thresh;
+ }
return rc;
}
@@ -409,6 +420,8 @@ bucket_alloc(struct rte_mempool *mp)
bd->obj_per_bucket = (bd->bucket_mem_size - bucket_header_size) /
bd->total_elt_size;
bd->bucket_page_mask = ~(rte_align64pow2(bd->bucket_mem_size) - 1);
+ /* eventually this should be a tunable parameter */
+ bd->bucket_stack_thresh = (mp->size / bd->obj_per_bucket) * 4 / 3;
if (mp->flags & MEMPOOL_F_SP_PUT)
rg_flags |= RING_F_SP_ENQ;