aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/scheduler
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2021-03-03 09:35:30 +0200
committerPetri Savolainen <petri.savolainen@nokia.com>2021-03-09 17:37:09 +0200
commite127f90447a03e4ccfd789254e36f5250ee89ae8 (patch)
tree6c03cfdee846e70a44018086a77a2d03e4766c05 /test/validation/api/scheduler
parent2cbc6e3c6d904e5bdac09daf8d9395e5a90df307 (diff)
validation: sched: add max queues test
Added a new test case, which creates maximum number of scheduled queues and checks that an event can be sent through all of those. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-by: Matias Elo <matias.elo@nokia.com> Tested-by: Shijith Thotton <sthotton@marvell.com>
Diffstat (limited to 'test/validation/api/scheduler')
-rw-r--r--test/validation/api/scheduler/scheduler.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/test/validation/api/scheduler/scheduler.c b/test/validation/api/scheduler/scheduler.c
index 7ef94ae72..8800350f2 100644
--- a/test/validation/api/scheduler/scheduler.c
+++ b/test/validation/api/scheduler/scheduler.c
@@ -629,6 +629,117 @@ static void scheduler_test_full_queues(void)
CU_ASSERT(odp_pool_destroy(pool) == 0);
}
+static void scheduler_test_max_queues(odp_schedule_sync_t sync)
+{
+ odp_pool_t pool;
+ odp_pool_param_t pool_param;
+ odp_schedule_capability_t sched_capa;
+ odp_queue_param_t queue_param;
+ odp_buffer_t buf;
+ odp_event_t ev;
+ odp_queue_t src_queue;
+ uint64_t wait_time;
+ uint32_t i, src_idx;
+ uint32_t num_rounds = 4;
+ uint32_t num_queues = 64 * 1024;
+
+ CU_ASSERT_FATAL(odp_schedule_capability(&sched_capa) == 0);
+ if (num_queues > sched_capa.max_queues)
+ num_queues = sched_capa.max_queues;
+
+ CU_ASSERT_FATAL(num_queues > 0);
+
+ odp_queue_t queue[num_queues];
+
+ odp_pool_param_init(&pool_param);
+ pool_param.type = ODP_POOL_BUFFER;
+ pool_param.buf.size = 100;
+ pool_param.buf.num = 1;
+
+ pool = odp_pool_create("test_max_queues", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ /* Ensure that scheduler is empty */
+ drain_queues();
+
+ sched_queue_param_init(&queue_param);
+ queue_param.sched.sync = sync;
+
+ for (i = 0; i < num_queues; i++) {
+ queue[i] = odp_queue_create("test_max_queues", &queue_param);
+ if (queue[i] == ODP_QUEUE_INVALID)
+ ODPH_ERR("Queue create failed %u/%u\n", i, num_queues);
+
+ CU_ASSERT_FATAL(queue[i] != ODP_QUEUE_INVALID);
+ }
+
+ buf = odp_buffer_alloc(pool);
+ CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
+ ev = odp_buffer_to_event(buf);
+
+ CU_ASSERT_FATAL(odp_queue_enq(queue[0], ev) == 0);
+
+ wait_time = odp_schedule_wait_time(500 * ODP_TIME_MSEC_IN_NS);
+ src_idx = 0;
+
+ /* Send one event through all queues couple of times */
+ for (i = 0; i < (num_rounds * num_queues); i++) {
+ uint32_t round = i / num_queues;
+
+ ev = odp_schedule(&src_queue, wait_time);
+ if (ev == ODP_EVENT_INVALID) {
+ ODPH_ERR("Event was lost. Round %u, queue idx %u\n", round, src_idx);
+ CU_FAIL("Event was lost\n");
+ break;
+ }
+
+ CU_ASSERT(src_queue == queue[src_idx]);
+
+ src_idx++;
+ if (src_idx == num_queues)
+ src_idx = 0;
+
+ if (odp_queue_enq(queue[src_idx], ev)) {
+ ODPH_ERR("Enqueue failed. Round %u, queue idx %u\n", round, src_idx);
+ CU_FAIL("Enqueue failed\n")
+ odp_event_free(ev);
+ break;
+ }
+ }
+
+ /* Free event and scheduling context */
+ for (i = 0; i < 2; i++) {
+ ev = odp_schedule(NULL, wait_time);
+
+ if (ev == ODP_EVENT_INVALID)
+ continue;
+
+ odp_event_free(ev);
+ }
+
+ CU_ASSERT(drain_queues() == 0);
+
+ for (i = 0; i < num_queues; i++)
+ CU_ASSERT_FATAL(odp_queue_destroy(queue[i]) == 0);
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+}
+
+static void scheduler_test_max_queues_p(void)
+{
+ scheduler_test_max_queues(ODP_SCHED_SYNC_PARALLEL);
+}
+
+static void scheduler_test_max_queues_a(void)
+{
+ scheduler_test_max_queues(ODP_SCHED_SYNC_ATOMIC);
+}
+
+static void scheduler_test_max_queues_o(void)
+{
+ scheduler_test_max_queues(ODP_SCHED_SYNC_ORDERED);
+}
+
static void scheduler_test_order_ignore(void)
{
odp_queue_capability_t queue_capa;
@@ -2920,6 +3031,9 @@ odp_testinfo_t scheduler_basic_suite[] = {
ODP_TEST_INFO(scheduler_test_wait),
ODP_TEST_INFO(scheduler_test_queue_size),
ODP_TEST_INFO(scheduler_test_full_queues),
+ ODP_TEST_INFO(scheduler_test_max_queues_p),
+ ODP_TEST_INFO(scheduler_test_max_queues_a),
+ ODP_TEST_INFO(scheduler_test_max_queues_o),
ODP_TEST_INFO(scheduler_test_order_ignore),
ODP_TEST_INFO(scheduler_test_create_group),
ODP_TEST_INFO(scheduler_test_create_max_groups),