Test queue capability API and create the maximum number of
queues.

Signed-off-by: Petri Savolainen <[email protected]>
---
 platform/linux-generic/odp_queue.c |  5 ++-
 test/validation/queue/queue.c      | 62 ++++++++++++++++++++++++++++++++++++--
 test/validation/queue/queue.h      |  3 +-
 3 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index f3e589e..1166a72 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -25,6 +25,8 @@
 #include <odp/api/traffic_mngr.h>
 #include <odp_schedule_ordered_internal.h>
 
+#define NUM_INTERNAL_QUEUES 64
+
 #ifdef USE_TICKETLOCK
 #include <odp/api/ticketlock.h>
 #define LOCK(a)      odp_ticketlock_lock(a)
@@ -184,7 +186,8 @@ int odp_queue_capability(odp_queue_capability_t *capa)
 {
        memset(capa, 0, sizeof(odp_queue_capability_t));
 
-       capa->max_queues        = ODP_CONFIG_QUEUES;
+       /* Reserve some queues for internal use */
+       capa->max_queues        = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES;
        capa->max_ordered_locks = SCHEDULE_ORDERED_LOCKS_PER_QUEUE;
        capa->max_sched_groups  = sched_fn->num_grps();
        capa->sched_prios       = odp_schedule_num_prio();
diff --git a/test/validation/queue/queue.c b/test/validation/queue/queue.c
index 1e60cd7..b554aa3 100644
--- a/test/validation/queue/queue.c
+++ b/test/validation/queue/queue.c
@@ -11,10 +11,22 @@
 #define MAX_BUFFER_QUEUE        (8)
 #define MSG_POOL_SIZE           (4 * 1024 * 1024)
 #define CONFIG_MAX_ITERATION    (100)
+#define MAX_QUEUES              (64 * 1024)
 
 static int queue_context = 0xff;
 static odp_pool_t pool;
 
+static void generate_name(char *name, uint32_t index)
+{
+       /* Uniqueue name for up to 300M queues */
+       name[0] = 'A' + ((index / (26 * 26 * 26 * 26 * 26)) % 26);
+       name[1] = 'A' + ((index / (26 * 26 * 26 * 26)) % 26);
+       name[2] = 'A' + ((index / (26 * 26 * 26)) % 26);
+       name[3] = 'A' + ((index / (26 * 26)) % 26);
+       name[4] = 'A' + ((index / 26) % 26);
+       name[5] = 'A' + (index % 26);
+}
+
 int queue_suite_init(void)
 {
        odp_pool_param_t params;
@@ -38,7 +50,52 @@ int queue_suite_term(void)
        return odp_pool_destroy(pool);
 }
 
-void queue_test_sunnydays(void)
+void queue_test_capa(void)
+{
+       odp_queue_capability_t capa;
+       odp_queue_param_t qparams;
+       char name[ODP_QUEUE_NAME_LEN];
+       odp_queue_t queue[MAX_QUEUES];
+       uint32_t num_queues, i;
+
+       memset(&capa, 0, sizeof(odp_queue_capability_t));
+       CU_ASSERT(odp_queue_capability(&capa) == 0);
+
+       CU_ASSERT(capa.max_queues != 0);
+       CU_ASSERT(capa.max_ordered_locks != 0);
+       CU_ASSERT(capa.max_sched_groups != 0);
+       CU_ASSERT(capa.sched_prios != 0);
+
+       for (i = 0; i < ODP_QUEUE_NAME_LEN; i++)
+               name[i] = 'A' + (i % 26);
+
+       name[ODP_QUEUE_NAME_LEN - 1] = 0;
+
+       if (capa.max_queues > MAX_QUEUES)
+               num_queues = MAX_QUEUES;
+       else
+               num_queues = capa.max_queues;
+
+       odp_queue_param_init(&qparams);
+
+       for (i = 0; i < num_queues; i++) {
+               generate_name(name, i);
+               queue[i] = odp_queue_create(name, &qparams);
+
+               if (queue[i] == ODP_QUEUE_INVALID) {
+                       CU_FAIL("Queue create failed");
+                       num_queues = i - 1;
+                       break;
+               }
+
+               CU_ASSERT(odp_queue_lookup(name) != ODP_QUEUE_INVALID);
+       }
+
+       for (i = 0; i < num_queues; i++)
+               CU_ASSERT(odp_queue_destroy(queue[i]) == 0);
+}
+
+void queue_test_param(void)
 {
        odp_queue_t queue_creat_id, queue_id;
        odp_event_t enev[MAX_BUFFER_QUEUE];
@@ -189,7 +246,8 @@ void queue_test_info(void)
 }
 
 odp_testinfo_t queue_suite[] = {
-       ODP_TEST_INFO(queue_test_sunnydays),
+       ODP_TEST_INFO(queue_test_capa),
+       ODP_TEST_INFO(queue_test_param),
        ODP_TEST_INFO(queue_test_info),
        ODP_TEST_INFO_NULL,
 };
diff --git a/test/validation/queue/queue.h b/test/validation/queue/queue.h
index 4ef52f5..1d3164d 100644
--- a/test/validation/queue/queue.h
+++ b/test/validation/queue/queue.h
@@ -10,7 +10,8 @@
 #include <odp_cunit_common.h>
 
 /* test functions: */
-void queue_test_sunnydays(void);
+void queue_test_capa(void);
+void queue_test_param(void);
 void queue_test_info(void);
 
 /* test arrays: */
-- 
2.8.1

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to