[v2,1/4] test/stack: avoid trivial memory allocations
Checks
Commit Message
Replace the arguments array by one argument.
All objects in the args array have the same values, so there is no need
to use an array, only one struct is enough.
The args object is a lot smaller, and the allocation can be replaced
with a global variable.
The allocation of obj_table isn't needed either, because MAX_BULK is
small. The allocation can instead be replaced with a static array.
Signed-off-by: Steven Lariau <steven.lariau@arm.com>
Reviewed-by: Dharmik Thakkar <dharmik.thakkar@arm.com>
Reviewed-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
app/test/test_stack.c | 53 +++++++++++--------------------------------
1 file changed, 13 insertions(+), 40 deletions(-)
Comments
> -----Original Message-----
> From: Steven Lariau <steven.lariau@arm.com>
> Sent: Wednesday, August 12, 2020 2:19 PM
> To: Eads, Gage <gage.eads@intel.com>; Olivier Matz
> <olivier.matz@6wind.com>
> Cc: dev@dpdk.org; nd@arm.com; Steven Lariau <steven.lariau@arm.com>
> Subject: [PATCH v2 1/4] test/stack: avoid trivial memory allocations
>
> Replace the arguments array by one argument.
> All objects in the args array have the same values, so there is no need
> to use an array, only one struct is enough.
> The args object is a lot smaller, and the allocation can be replaced
> with a global variable.
>
> The allocation of obj_table isn't needed either, because MAX_BULK is
> small. The allocation can instead be replaced with a static array.
>
> Signed-off-by: Steven Lariau <steven.lariau@arm.com>
> Reviewed-by: Dharmik Thakkar <dharmik.thakkar@arm.com>
> Reviewed-by: Phil Yang <phil.yang@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Acked-by: Gage Eads <gage.eads@intel.com>
Thanks,
Gage
@@ -276,20 +276,14 @@ struct test_args {
rte_atomic64_t *sz;
};
+static struct test_args thread_test_args;
+
static int
-stack_thread_push_pop(void *args)
+stack_thread_push_pop(__rte_unused void *args)
{
- struct test_args *t = args;
- void **obj_table;
+ void *obj_table[MAX_BULK];
int i;
- obj_table = rte_calloc(NULL, STACK_SIZE, sizeof(void *), 0);
- if (obj_table == NULL) {
- printf("[%s():%u] failed to calloc %zu bytes\n",
- __func__, __LINE__, STACK_SIZE * sizeof(void *));
- return -1;
- }
-
for (i = 0; i < NUM_ITERS_PER_THREAD; i++) {
unsigned int success, num;
@@ -297,41 +291,37 @@ stack_thread_push_pop(void *args)
* then push and pop those stack entries.
*/
do {
- uint64_t sz = rte_atomic64_read(t->sz);
+ uint64_t sz = rte_atomic64_read(thread_test_args.sz);
volatile uint64_t *sz_addr;
- sz_addr = (volatile uint64_t *)t->sz;
+ sz_addr = (volatile uint64_t *)thread_test_args.sz;
num = RTE_MIN(rte_rand() % MAX_BULK, STACK_SIZE - sz);
success = rte_atomic64_cmpset(sz_addr, sz, sz + num);
} while (success == 0);
- if (rte_stack_push(t->s, obj_table, num) != num) {
+ if (rte_stack_push(thread_test_args.s, obj_table, num) != num) {
printf("[%s():%u] Failed to push %u pointers\n",
__func__, __LINE__, num);
- rte_free(obj_table);
return -1;
}
- if (rte_stack_pop(t->s, obj_table, num) != num) {
+ if (rte_stack_pop(thread_test_args.s, obj_table, num) != num) {
printf("[%s():%u] Failed to pop %u pointers\n",
__func__, __LINE__, num);
- rte_free(obj_table);
return -1;
}
- rte_atomic64_sub(t->sz, num);
+ rte_atomic64_sub(thread_test_args.sz, num);
}
- rte_free(obj_table);
return 0;
}
static int
test_stack_multithreaded(uint32_t flags)
{
- struct test_args *args;
unsigned int lcore_id;
struct rte_stack *s;
rte_atomic64_t size;
@@ -344,45 +334,28 @@ test_stack_multithreaded(uint32_t flags)
printf("[%s():%u] Running with %u lcores\n",
__func__, __LINE__, rte_lcore_count());
- args = rte_malloc(NULL, sizeof(struct test_args) * RTE_MAX_LCORE, 0);
- if (args == NULL) {
- printf("[%s():%u] failed to malloc %zu bytes\n",
- __func__, __LINE__,
- sizeof(struct test_args) * RTE_MAX_LCORE);
- return -1;
- }
-
s = rte_stack_create("test", STACK_SIZE, rte_socket_id(), flags);
if (s == NULL) {
printf("[%s():%u] Failed to create a stack\n",
__func__, __LINE__);
- rte_free(args);
return -1;
}
rte_atomic64_init(&size);
+ thread_test_args.s = s;
+ thread_test_args.sz = &size;
RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- args[lcore_id].s = s;
- args[lcore_id].sz = &size;
-
if (rte_eal_remote_launch(stack_thread_push_pop,
- &args[lcore_id], lcore_id))
+ NULL, lcore_id))
rte_panic("Failed to launch lcore %d\n", lcore_id);
}
- lcore_id = rte_lcore_id();
-
- args[lcore_id].s = s;
- args[lcore_id].sz = &size;
-
- stack_thread_push_pop(&args[lcore_id]);
+ stack_thread_push_pop(NULL);
rte_eal_mp_wait_lcore();
rte_stack_free(s);
- rte_free(args);
-
return 0;
}