aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-05-11 15:38:00 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-05-13 17:20:39 +0300
commit57011ec14cc8a5ad91ea6fe71a1ba01d50b7b207 (patch)
tree7522ccbec24b4312b5f34eeb432e2bd000bc9af3 /test
parentb481813941b97dd2b832f252b96b510d0ff7579a (diff)
test: scheduling: simplify code structure
Recorded queue and pool handles into shared data, so that multiple lookups (and related name generation code) can be avoided. Use single function (enqueue_events()) to enqueue events into queues on all test cases. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'test')
-rw-r--r--test/performance/odp_scheduling.c282
1 files changed, 87 insertions, 195 deletions
diff --git a/test/performance/odp_scheduling.c b/test/performance/odp_scheduling.c
index 6592277d1..ec913ae77 100644
--- a/test/performance/odp_scheduling.c
+++ b/test/performance/odp_scheduling.c
@@ -32,6 +32,7 @@
#define MSG_POOL_SIZE (4*1024*1024) /**< Message pool size */
#define MAX_ALLOCS 35 /**< Alloc burst size */
#define QUEUES_PER_PRIO 64 /**< Queue per priority */
+#define NUM_PRIOS 2 /**< Number of tested priorities */
#define QUEUE_ROUNDS (512*1024) /**< Queue test rounds */
#define ALLOC_ROUNDS (1024*1024) /**< Alloc test rounds */
#define MULTI_BUFS_MAX 4 /**< Buffer burst size */
@@ -52,13 +53,13 @@ typedef struct {
int proc_mode; /**< Process mode */
} test_args_t;
-
/** Test global variables */
typedef struct {
- odp_barrier_t barrier;/**< @private Barrier for test synchronisation */
+ odp_barrier_t barrier;
+ odp_pool_t pool;
+ odp_queue_t queue[NUM_PRIOS][QUEUES_PER_PRIO];
} test_globals_t;
-
/**
* @internal Clear all scheduled queues. Retry to be sure that all
* buffers have been scheduled.
@@ -78,89 +79,45 @@ static void clear_sched_queues(void)
}
/**
- * @internal Create a single queue from a pool of buffers
+ * @internal Enqueue events into queues
*
- * @param thr Thread
- * @param msg_pool Buffer pool
- * @param prio Queue priority
+ * @param thr Thread
+ * @param prio Queue priority
+ * @param num_queues Number of queues
+ * @param num_events Number of events
+ * @param globals Test shared data
*
* @return 0 if successful
*/
-static int create_queue(int thr, odp_pool_t msg_pool, int prio)
+static int enqueue_events(int thr, int prio, int num_queues, int num_events,
+ test_globals_t *globals)
{
- char name[] = "sched_XX_00";
odp_buffer_t buf;
odp_queue_t queue;
+ int i, j, k;
- buf = odp_buffer_alloc(msg_pool);
-
- if (!odp_buffer_is_valid(buf)) {
- LOG_ERR(" [%i] msg_pool alloc failed\n", thr);
- return -1;
- }
-
- name[6] = '0' + prio/10;
- name[7] = '0' + prio - 10*(prio/10);
-
- queue = odp_queue_lookup(name);
-
- if (queue == ODP_QUEUE_INVALID) {
- LOG_ERR(" [%i] Queue %s lookup failed.\n", thr, name);
- return -1;
- }
-
- if (odp_queue_enq(queue, odp_buffer_to_event(buf))) {
- LOG_ERR(" [%i] Queue enqueue failed.\n", thr);
- odp_buffer_free(buf);
- return -1;
- }
-
- return 0;
-}
-
-/**
- * @internal Create multiple queues from a pool of buffers
- *
- * @param thr Thread
- * @param msg_pool Buffer pool
- * @param prio Queue priority
- *
- * @return 0 if successful
- */
-static int create_queues(int thr, odp_pool_t msg_pool, int prio)
-{
- char name[] = "sched_XX_YY";
- odp_buffer_t buf;
- odp_queue_t queue;
- int i;
-
- name[6] = '0' + prio/10;
- name[7] = '0' + prio - 10*(prio/10);
+ if (prio == ODP_SCHED_PRIO_HIGHEST)
+ i = 0;
+ else
+ i = 1;
/* Alloc and enqueue a buffer per queue */
- for (i = 0; i < QUEUES_PER_PRIO; i++) {
- name[9] = '0' + i/10;
- name[10] = '0' + i - 10*(i/10);
-
- queue = odp_queue_lookup(name);
+ for (j = 0; j < num_queues; j++) {
+ queue = globals->queue[i][j];
- if (queue == ODP_QUEUE_INVALID) {
- LOG_ERR(" [%i] Queue %s lookup failed.\n", thr,
- name);
- return -1;
- }
+ for (k = 0; k < num_events; k++) {
+ buf = odp_buffer_alloc(globals->pool);
- buf = odp_buffer_alloc(msg_pool);
-
- if (!odp_buffer_is_valid(buf)) {
- LOG_ERR(" [%i] msg_pool alloc failed\n", thr);
- return -1;
- }
+ if (!odp_buffer_is_valid(buf)) {
+ LOG_ERR(" [%i] buffer alloc failed\n", thr);
+ return -1;
+ }
- if (odp_queue_enq(queue, odp_buffer_to_event(buf))) {
- LOG_ERR(" [%i] Queue enqueue failed.\n", thr);
- odp_buffer_free(buf);
- return -1;
+ if (odp_queue_enq(queue, odp_buffer_to_event(buf))) {
+ LOG_ERR(" [%i] Queue enqueue failed.\n", thr);
+ odp_buffer_free(buf);
+ return -1;
+ }
}
}
@@ -171,12 +128,12 @@ static int create_queues(int thr, odp_pool_t msg_pool, int prio)
/**
* @internal Test single buffer alloc and free
*
- * @param thr Thread
- * @param pool Buffer pool
+ * @param thr Thread
+ * @param globals Test shared data
*
* @return 0 if successful
*/
-static int test_alloc_single(int thr, odp_pool_t pool)
+static int test_alloc_single(int thr, test_globals_t *globals)
{
int i;
odp_buffer_t temp_buf;
@@ -185,7 +142,7 @@ static int test_alloc_single(int thr, odp_pool_t pool)
c1 = odp_cpu_cycles();
for (i = 0; i < ALLOC_ROUNDS; i++) {
- temp_buf = odp_buffer_alloc(pool);
+ temp_buf = odp_buffer_alloc(globals->pool);
if (!odp_buffer_is_valid(temp_buf)) {
LOG_ERR(" [%i] alloc_single failed\n", thr);
@@ -208,12 +165,12 @@ static int test_alloc_single(int thr, odp_pool_t pool)
/**
* @internal Test multiple buffers alloc and free
*
- * @param thr Thread
- * @param pool Buffer pool
+ * @param thr Thread
+ * @param globals Test shared data
*
* @return 0 if successful
*/
-static int test_alloc_multi(int thr, odp_pool_t pool)
+static int test_alloc_multi(int thr, test_globals_t *globals)
{
int i, j;
odp_buffer_t temp_buf[MAX_ALLOCS];
@@ -223,7 +180,7 @@ static int test_alloc_multi(int thr, odp_pool_t pool)
for (i = 0; i < ALLOC_ROUNDS; i++) {
for (j = 0; j < MAX_ALLOCS; j++) {
- temp_buf[j] = odp_buffer_alloc(pool);
+ temp_buf[j] = odp_buffer_alloc(globals->pool);
if (!odp_buffer_is_valid(temp_buf[j])) {
LOG_ERR(" [%i] alloc_multi failed\n", thr);
@@ -251,11 +208,11 @@ static int test_alloc_multi(int thr, odp_pool_t pool)
* Enqueue to and dequeue to/from a single shared queue.
*
* @param thr Thread
- * @param msg_pool Buffer pool
+ * @param globals Test shared data
*
* @return 0 if successful
*/
-static int test_plain_queue(int thr, odp_pool_t msg_pool)
+static int test_plain_queue(int thr, test_globals_t *globals)
{
odp_event_t ev;
odp_buffer_t buf;
@@ -265,10 +222,10 @@ static int test_plain_queue(int thr, odp_pool_t msg_pool)
int i;
/* Alloc test message */
- buf = odp_buffer_alloc(msg_pool);
+ buf = odp_buffer_alloc(globals->pool);
if (!odp_buffer_is_valid(buf)) {
- LOG_ERR(" [%i] msg_pool alloc failed\n", thr);
+ LOG_ERR(" [%i] buffer alloc failed\n", thr);
return -1;
}
@@ -325,15 +282,13 @@ static int test_plain_queue(int thr, odp_pool_t msg_pool)
*
* @param str Test case name string
* @param thr Thread
- * @param msg_pool Buffer pool
* @param prio Priority
- * @param barrier Barrier
+ * @param globals Test shared data
*
* @return 0 if successful
*/
static int test_schedule_single(const char *str, int thr,
- odp_pool_t msg_pool,
- int prio, odp_barrier_t *barrier)
+ int prio, test_globals_t *globals)
{
odp_event_t ev;
odp_queue_t queue;
@@ -341,7 +296,7 @@ static int test_schedule_single(const char *str, int thr,
uint32_t i;
uint32_t tot;
- if (create_queue(thr, msg_pool, prio))
+ if (enqueue_events(thr, prio, 1, 1, globals))
return -1;
c1 = odp_cpu_cycles();
@@ -381,7 +336,7 @@ static int test_schedule_single(const char *str, int thr,
c2 = odp_cpu_cycles();
cycles = odp_cpu_cycles_diff(c2, c1);
- odp_barrier_wait(barrier);
+ odp_barrier_wait(&globals->barrier);
clear_sched_queues();
cycles = cycles / tot;
@@ -400,15 +355,13 @@ static int test_schedule_single(const char *str, int thr,
*
* @param str Test case name string
* @param thr Thread
- * @param msg_pool Buffer pool
* @param prio Priority
- * @param barrier Barrier
+ * @param globals Test shared data
*
* @return 0 if successful
*/
static int test_schedule_many(const char *str, int thr,
- odp_pool_t msg_pool,
- int prio, odp_barrier_t *barrier)
+ int prio, test_globals_t *globals)
{
odp_event_t ev;
odp_queue_t queue;
@@ -416,7 +369,7 @@ static int test_schedule_many(const char *str, int thr,
uint32_t i;
uint32_t tot;
- if (create_queues(thr, msg_pool, prio))
+ if (enqueue_events(thr, prio, QUEUES_PER_PRIO, 1, globals))
return -1;
/* Start sched-enq loop */
@@ -457,7 +410,7 @@ static int test_schedule_many(const char *str, int thr,
c2 = odp_cpu_cycles();
cycles = odp_cpu_cycles_diff(c2, c1);
- odp_barrier_wait(barrier);
+ odp_barrier_wait(&globals->barrier);
clear_sched_queues();
cycles = cycles / tot;
@@ -472,65 +425,23 @@ static int test_schedule_many(const char *str, int thr,
*
* @param str Test case name string
* @param thr Thread
- * @param msg_pool Buffer pool
* @param prio Priority
- * @param barrier Barrier
+ * @param globals Test shared data
*
* @return 0 if successful
*/
static int test_schedule_multi(const char *str, int thr,
- odp_pool_t msg_pool,
- int prio, odp_barrier_t *barrier)
+ int prio, test_globals_t *globals)
{
odp_event_t ev[MULTI_BUFS_MAX];
odp_queue_t queue;
uint64_t c1, c2, cycles;
- int i, j;
+ int i;
int num;
uint32_t tot = 0;
- char name[] = "sched_XX_YY";
-
- name[6] = '0' + prio/10;
- name[7] = '0' + prio - 10*(prio/10);
-
- /* Alloc and enqueue a buffer per queue */
- for (i = 0; i < QUEUES_PER_PRIO; i++) {
- name[9] = '0' + i/10;
- name[10] = '0' + i - 10*(i/10);
-
- queue = odp_queue_lookup(name);
-
- if (queue == ODP_QUEUE_INVALID) {
- LOG_ERR(" [%i] Queue %s lookup failed.\n", thr,
- name);
- return -1;
- }
-
- for (j = 0; j < MULTI_BUFS_MAX; j++) {
- odp_buffer_t buf;
-
- buf = odp_buffer_alloc(msg_pool);
-
- if (!odp_buffer_is_valid(buf)) {
- LOG_ERR(" [%i] msg_pool alloc failed\n",
- thr);
- return -1;
- }
-
- ev[j] = odp_buffer_to_event(buf);
- }
- /* Assume we can enqueue all events */
- num = odp_queue_enq_multi(queue, ev, MULTI_BUFS_MAX);
- if (num != MULTI_BUFS_MAX) {
- LOG_ERR(" [%i] Queue enqueue failed.\n", thr);
- j = num < 0 ? 0 : num;
- for ( ; j < MULTI_BUFS_MAX; j++)
- odp_event_free(ev[j]);
-
- return -1;
- }
- }
+ if (enqueue_events(thr, prio, QUEUES_PER_PRIO, MULTI_BUFS_MAX, globals))
+ return -1;
/* Start sched-enq loop */
c1 = odp_cpu_cycles();
@@ -573,7 +484,7 @@ static int test_schedule_multi(const char *str, int thr,
c2 = odp_cpu_cycles();
cycles = odp_cpu_cycles_diff(c2, c1);
- odp_barrier_wait(barrier);
+ odp_barrier_wait(&globals->barrier);
clear_sched_queues();
if (tot)
@@ -596,7 +507,6 @@ static int test_schedule_multi(const char *str, int thr,
static void *run_thread(void *arg)
{
int thr;
- odp_pool_t msg_pool;
odp_shm_t shm;
test_globals_t *globals;
odp_barrier_t *barrier;
@@ -622,70 +532,59 @@ static void *run_thread(void *arg)
odp_barrier_wait(barrier);
odp_barrier_wait(barrier);
odp_barrier_wait(barrier);
-
- /*
- * Find the buffer pool
- */
- msg_pool = odp_pool_lookup("msg_pool");
-
- if (msg_pool == ODP_POOL_INVALID) {
- LOG_ERR(" [%i] msg_pool not found\n", thr);
- return NULL;
- }
-
odp_barrier_wait(barrier);
- if (test_alloc_single(thr, msg_pool))
+ if (test_alloc_single(thr, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_alloc_multi(thr, msg_pool))
+ if (test_alloc_multi(thr, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_plain_queue(thr, msg_pool))
+ if (test_plain_queue(thr, globals))
return NULL;
/* Low prio */
odp_barrier_wait(barrier);
- if (test_schedule_single("sched_____s_lo", thr, msg_pool,
- ODP_SCHED_PRIO_LOWEST, barrier))
+ if (test_schedule_single("sched_____s_lo", thr,
+ ODP_SCHED_PRIO_LOWEST, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_schedule_many("sched_____m_lo", thr, msg_pool,
- ODP_SCHED_PRIO_LOWEST, barrier))
+ if (test_schedule_many("sched_____m_lo", thr,
+ ODP_SCHED_PRIO_LOWEST, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_schedule_multi("sched_multi_lo", thr, msg_pool,
- ODP_SCHED_PRIO_LOWEST, barrier))
+ if (test_schedule_multi("sched_multi_lo", thr,
+ ODP_SCHED_PRIO_LOWEST, globals))
return NULL;
/* High prio */
odp_barrier_wait(barrier);
- if (test_schedule_single("sched_____s_hi", thr, msg_pool,
- ODP_SCHED_PRIO_HIGHEST, barrier))
+ if (test_schedule_single("sched_____s_hi", thr,
+ ODP_SCHED_PRIO_HIGHEST, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_schedule_many("sched_____m_hi", thr, msg_pool,
- ODP_SCHED_PRIO_HIGHEST, barrier))
+ if (test_schedule_many("sched_____m_hi", thr,
+ ODP_SCHED_PRIO_HIGHEST, globals))
return NULL;
odp_barrier_wait(barrier);
- if (test_schedule_multi("sched_multi_hi", thr, msg_pool,
- ODP_SCHED_PRIO_HIGHEST, barrier))
+ if (test_schedule_multi("sched_multi_hi", thr,
+ ODP_SCHED_PRIO_HIGHEST, globals))
return NULL;
@@ -808,13 +707,11 @@ int main(int argc, char *argv[])
odp_pool_t pool;
odp_queue_t plain_queue;
int i, j;
- int prios;
odp_shm_t shm;
test_globals_t *globals;
char cpumaskstr[ODP_CPUMASK_STR_SIZE];
odp_pool_param_t params;
int ret = 0;
- char name[] = "sched_XX_YY";
odp_instance_t instance;
odph_linux_thr_params_t thr_params;
@@ -901,6 +798,8 @@ int main(int argc, char *argv[])
return -1;
}
+ globals->pool = pool;
+
/* odp_pool_print(pool); */
/*
@@ -916,22 +815,23 @@ int main(int argc, char *argv[])
/*
* Create queues for schedule test. QUEUES_PER_PRIO per priority.
*/
- prios = odp_schedule_num_prio();
-
- for (i = 0; i < prios; i++) {
+ for (i = 0; i < NUM_PRIOS; i++) {
+ char name[] = "sched_XX_YY";
odp_queue_t queue;
odp_queue_param_t param;
+ int prio;
- if (i != ODP_SCHED_PRIO_HIGHEST &&
- i != ODP_SCHED_PRIO_LOWEST)
- continue;
+ if (i == 0)
+ prio = ODP_SCHED_PRIO_HIGHEST;
+ else
+ prio = ODP_SCHED_PRIO_LOWEST;
- name[6] = '0' + i/10;
- name[7] = '0' + i - 10*(i/10);
+ name[6] = '0' + (prio / 10);
+ name[7] = '0' + prio - (10 * (prio / 10));
odp_queue_param_init(&param);
param.type = ODP_QUEUE_TYPE_SCHED;
- param.sched.prio = i;
+ param.sched.prio = prio;
param.sched.sync = ODP_SCHED_SYNC_ATOMIC;
param.sched.group = ODP_SCHED_GROUP_ALL;
@@ -945,6 +845,8 @@ int main(int argc, char *argv[])
LOG_ERR("Schedule queue create failed.\n");
return -1;
}
+
+ globals->queue[i][j] = queue;
}
}
@@ -990,21 +892,11 @@ int main(int argc, char *argv[])
printf("ODP example complete\n\n");
}
- for (i = 0; i < prios; i++) {
+ for (i = 0; i < NUM_PRIOS; i++) {
odp_queue_t queue;
- if (i != ODP_SCHED_PRIO_HIGHEST &&
- i != ODP_SCHED_PRIO_LOWEST)
- continue;
-
- name[6] = '0' + i / 10;
- name[7] = '0' + i - 10 * (i / 10);
-
for (j = 0; j < QUEUES_PER_PRIO; j++) {
- name[9] = '0' + j / 10;
- name[10] = '0' + j - 10 * (j / 10);
-
- queue = odp_queue_lookup(name);
+ queue = globals->queue[i][j];
odp_queue_destroy(queue);
}
}