aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-04-26 13:40:44 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-04-27 09:24:42 +0300
commit64f8fa212ef3008c66a37938faf011f67fb2cb0d (patch)
tree4ab5a0783723a57f3dfe6f1a47186fae955a6e0e
parent0151a42009aea4d749cf22caf08b2448ba123c00 (diff)
api: queue: replaced config api with capability structure
Added queue capability structure and replaced the config API definitions with it. 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>
-rw-r--r--include/odp/api/spec/config.h25
-rw-r--r--include/odp/api/spec/queue.h30
-rw-r--r--platform/linux-generic/include/odp/api/config.h36
-rw-r--r--platform/linux-generic/include/odp/api/plat/schedule_types.h4
-rw-r--r--platform/linux-generic/include/odp_config_internal.h20
-rw-r--r--platform/linux-generic/odp_queue.c12
-rw-r--r--platform/linux-generic/odp_schedule.c9
-rw-r--r--platform/linux-generic/odp_thread.c2
-rw-r--r--test/validation/classification/odp_classification_tests.c4
-rw-r--r--test/validation/scheduler/scheduler.c27
10 files changed, 96 insertions, 73 deletions
diff --git a/include/odp/api/spec/config.h b/include/odp/api/spec/config.h
index 2a1f621d4..4c1df4173 100644
--- a/include/odp/api/spec/config.h
+++ b/include/odp/api/spec/config.h
@@ -33,31 +33,6 @@ extern "C" {
*/
/**
- * Maximum number of queues
- * @return The maximum number of queues supported by this platform
- */
-int odp_config_queues(void);
-
-/**
- * Maximum number of ordered locks per queue
- * @return The maximum number of ordered locks per queue supported by
- * this platform.
- */
-int odp_config_max_ordered_locks_per_queue(void);
-
-/**
- * Number of scheduling priorities
- * @return The number of scheduling priorities supported by this platform
- */
-int odp_config_sched_prios(void);
-
-/**
- * Number of scheduling groups
- * @return Number of scheduling groups supported by this platofmr
- */
-int odp_config_sched_grps(void);
-
-/**
* @}
*/
diff --git a/include/odp/api/spec/queue.h b/include/odp/api/spec/queue.h
index 7cc031db9..e87df9f24 100644
--- a/include/odp/api/spec/queue.h
+++ b/include/odp/api/spec/queue.h
@@ -97,6 +97,24 @@ typedef enum odp_queue_op_mode_t {
} odp_queue_op_mode_t;
/**
+ * Queue capabilities
+ */
+typedef struct odp_queue_capability_t {
+ /** Maximum number of event queues */
+ uint32_t max_queues;
+
+ /** Maximum number of ordered locks per queue */
+ unsigned max_ordered_locks;
+
+ /** Maximum number of scheduling groups */
+ unsigned max_sched_groups;
+
+ /** Number of scheduling priorities */
+ unsigned sched_prios;
+
+} odp_queue_capability_t;
+
+/**
* ODP Queue parameters
*/
typedef struct odp_queue_param_t {
@@ -191,6 +209,18 @@ int odp_queue_destroy(odp_queue_t queue);
odp_queue_t odp_queue_lookup(const char *name);
/**
+ * Query queue capabilities
+ *
+ * Outputs queue capabilities on success.
+ *
+ * @param[out] capa Pointer to capability structure for output
+ *
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int odp_queue_capability(odp_queue_capability_t *capa);
+
+/**
* Set queue context
*
* It is the responsibility of the user to ensure that the queue context
diff --git a/platform/linux-generic/include/odp/api/config.h b/platform/linux-generic/include/odp/api/config.h
index 2fba933da..1f16438df 100644
--- a/platform/linux-generic/include/odp/api/config.h
+++ b/platform/linux-generic/include/odp/api/config.h
@@ -22,42 +22,6 @@ extern "C" {
* @{
*/
-/**
- * Maximum number of queues
- */
-#define ODP_CONFIG_QUEUES 1024
-static inline int odp_config_queues(void)
-{
- return ODP_CONFIG_QUEUES;
-}
-
-/**
- * Number of ordered locks per queue
- */
-#define ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE 2
-static inline int odp_config_max_ordered_locks_per_queue(void)
-{
- return ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
-}
-
-/**
- * Number of scheduling priorities
- */
-#define ODP_CONFIG_SCHED_PRIOS 8
-static inline int odp_config_sched_prios(void)
-{
- return ODP_CONFIG_SCHED_PRIOS;
-}
-
-/**
- * Number of scheduling groups
- */
-#define ODP_CONFIG_SCHED_GRPS 256
-static inline int odp_config_sched_grps(void)
-{
- return ODP_CONFIG_SCHED_GRPS;
-}
-
#include <odp/api/spec/config.h>
/**
diff --git a/platform/linux-generic/include/odp/api/plat/schedule_types.h b/platform/linux-generic/include/odp/api/plat/schedule_types.h
index a4a352c04..535fd6d05 100644
--- a/platform/linux-generic/include/odp/api/plat/schedule_types.h
+++ b/platform/linux-generic/include/odp/api/plat/schedule_types.h
@@ -29,9 +29,9 @@ typedef int odp_schedule_prio_t;
#define ODP_SCHED_PRIO_HIGHEST 0
-#define ODP_SCHED_PRIO_NORMAL (ODP_CONFIG_SCHED_PRIOS / 2)
+#define ODP_SCHED_PRIO_NORMAL 4
-#define ODP_SCHED_PRIO_LOWEST (ODP_CONFIG_SCHED_PRIOS - 1)
+#define ODP_SCHED_PRIO_LOWEST 7
#define ODP_SCHED_PRIO_DEFAULT ODP_SCHED_PRIO_NORMAL
diff --git a/platform/linux-generic/include/odp_config_internal.h b/platform/linux-generic/include/odp_config_internal.h
index fecfbec81..b2c00ddcb 100644
--- a/platform/linux-generic/include/odp_config_internal.h
+++ b/platform/linux-generic/include/odp_config_internal.h
@@ -130,6 +130,26 @@ extern "C" {
*/
#define ODP_CONFIG_PKTIO_ENTRIES 64
+/*
+ * Maximum number of queues
+ */
+#define ODP_CONFIG_QUEUES 1024
+
+/*
+ * Number of ordered locks per queue
+ */
+#define ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE 2
+
+/*
+ * Number of scheduling priorities
+ */
+#define ODP_CONFIG_SCHED_PRIOS 8
+
+/*
+ * Number of scheduling groups
+ */
+#define ODP_CONFIG_SCHED_GRPS 256
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c
index 95382402d..d4043f078 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -188,6 +188,18 @@ int odp_queue_term_global(void)
return rc;
}
+int odp_queue_capability(odp_queue_capability_t *capa)
+{
+ memset(capa, 0, sizeof(odp_queue_capability_t));
+
+ capa->max_queues = ODP_CONFIG_QUEUES;
+ capa->max_ordered_locks = ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
+ capa->max_sched_groups = ODP_CONFIG_SCHED_GRPS;
+ capa->sched_prios = ODP_CONFIG_SCHED_PRIOS;
+
+ return 0;
+}
+
odp_queue_type_t odp_queue_type(odp_queue_t handle)
{
queue_entry_t *queue;
diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c
index 0595e7056..1aaab9398 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -13,7 +13,7 @@
#include <odp/api/buffer.h>
#include <odp/api/pool.h>
#include <odp_internal.h>
-#include <odp/api/config.h>
+#include <odp_config_internal.h>
#include <odp_debug_internal.h>
#include <odp/api/thread.h>
#include <odp/api/time.h>
@@ -26,6 +26,13 @@
odp_thrmask_t sched_mask_all;
+ODP_STATIC_ASSERT(ODP_SCHED_PRIO_LOWEST == (ODP_CONFIG_SCHED_PRIOS - 1),
+ "lowest_prio_does_not_match_with_num_prios");
+
+ODP_STATIC_ASSERT((ODP_SCHED_PRIO_NORMAL > 0) &&
+ (ODP_SCHED_PRIO_NORMAL < (ODP_CONFIG_SCHED_PRIOS - 1)),
+ "normal_prio_is_not_between_highest_and_lowest");
+
/* Number of schedule commands.
* One per scheduled queue and packet interface */
#define NUM_SCHED_CMD (ODP_CONFIG_QUEUES + ODP_CONFIG_PKTIO_ENTRIES)
diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c
index 420e4eb2f..866d58f25 100644
--- a/platform/linux-generic/odp_thread.c
+++ b/platform/linux-generic/odp_thread.c
@@ -11,7 +11,7 @@
#include <odp/api/thrmask.h>
#include <odp_internal.h>
#include <odp/api/spinlock.h>
-#include <odp/api/config.h>
+#include <odp_config_internal.h>
#include <odp_debug_internal.h>
#include <odp/api/shared_memory.h>
#include <odp/api/align.h>
diff --git a/test/validation/classification/odp_classification_tests.c b/test/validation/classification/odp_classification_tests.c
index f33a2a6e1..12360569d 100644
--- a/test/validation/classification/odp_classification_tests.c
+++ b/test/validation/classification/odp_classification_tests.c
@@ -136,14 +136,16 @@ void configure_cls_pmr_chain(void)
uint32_t addr;
uint32_t mask;
odp_pmr_param_t pmr_param;
+ odp_queue_capability_t queue_capa;
+ CU_ASSERT_FATAL(odp_queue_capability(&queue_capa) == 0);
odp_queue_param_init(&qparam);
qparam.type = ODP_QUEUE_TYPE_SCHED;
qparam.sched.prio = ODP_SCHED_PRIO_NORMAL;
qparam.sched.sync = ODP_SCHED_SYNC_PARALLEL;
qparam.sched.group = ODP_SCHED_GROUP_ALL;
- qparam.sched.lock_count = ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
+ qparam.sched.lock_count = queue_capa.max_ordered_locks;
sprintf(queuename, "%s", "SrcQueue");
queue_list[CLS_PMR_CHAIN_SRC] = odp_queue_create(queuename, &qparam);
diff --git a/test/validation/scheduler/scheduler.c b/test/validation/scheduler/scheduler.c
index 5d2c04824..dce21cbac 100644
--- a/test/validation/scheduler/scheduler.c
+++ b/test/validation/scheduler/scheduler.c
@@ -9,6 +9,7 @@
#include "scheduler.h"
#define MAX_WORKERS_THREADS 32
+#define MAX_ORDERED_LOCKS 2
#define MSG_POOL_SIZE (4 * 1024 * 1024)
#define QUEUES_PER_PRIO 16
#define BUF_SIZE 64
@@ -79,7 +80,7 @@ typedef struct {
typedef struct {
uint64_t sequence;
- uint64_t lock_sequence[ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE];
+ uint64_t lock_sequence[MAX_ORDERED_LOCKS];
uint64_t output_sequence;
} buf_contents;
@@ -87,7 +88,7 @@ typedef struct {
odp_buffer_t ctx_handle;
odp_queue_t pq_handle;
uint64_t sequence;
- uint64_t lock_sequence[ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE];
+ uint64_t lock_sequence[MAX_ORDERED_LOCKS];
} queue_context;
typedef struct {
@@ -1319,11 +1320,24 @@ void scheduler_test_pause_resume(void)
static int create_queues(void)
{
int i, j, prios, rc;
+ odp_queue_capability_t capa;
odp_pool_param_t params;
odp_buffer_t queue_ctx_buf;
queue_context *qctx, *pqctx;
uint32_t ndx;
+ if (odp_queue_capability(&capa) < 0) {
+ printf("Queue capability query failed\n");
+ return -1;
+ }
+
+ /* Limit to test maximum */
+ if (capa.max_ordered_locks > MAX_ORDERED_LOCKS) {
+ capa.max_ordered_locks = MAX_ORDERED_LOCKS;
+ printf("Testing only %u ordered locks\n",
+ capa.max_ordered_locks);
+ }
+
prios = odp_schedule_num_prio();
odp_pool_param_init(&params);
params.buf.size = sizeof(queue_context);
@@ -1393,8 +1407,7 @@ static int create_queues(void)
snprintf(name, sizeof(name), "sched_%d_%d_o", i, j);
p.sched.sync = ODP_SCHED_SYNC_ORDERED;
- p.sched.lock_count =
- ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
+ p.sched.lock_count = capa.max_ordered_locks;
q = odp_queue_create(name, &p);
if (q == ODP_QUEUE_INVALID) {
@@ -1402,12 +1415,12 @@ static int create_queues(void)
return -1;
}
if (odp_queue_lock_count(q) !=
- ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE) {
+ (int)capa.max_ordered_locks) {
printf("Queue %" PRIu64 " created with "
"%d locks instead of expected %d\n",
odp_queue_to_u64(q),
odp_queue_lock_count(q),
- ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE);
+ capa.max_ordered_locks);
return -1;
}
@@ -1424,7 +1437,7 @@ static int create_queues(void)
qctx->sequence = 0;
for (ndx = 0;
- ndx < ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE;
+ ndx < capa.max_ordered_locks;
ndx++) {
qctx->lock_sequence[ndx] = 0;
}