void scheduler_test_num_prio(void) { int prio; prio = odp_schedule_num_prio(); CU_ASSERT(prio > 0); CU_ASSERT(prio == odp_schedule_num_prio()); }
/* Many queues many threads check priority ODP_SCHED_SYNC_ORDERED */ void scheduler_test_mq_mt_prio_o(void) { int prio = odp_schedule_num_prio(); parallel_execute(ODP_SCHED_SYNC_ORDERED, MANY_QS, prio, SCHD_ONE, DISABLE_EXCL_ATOMIC); }
static int destroy_queues(void) { int i, j, prios; prios = odp_schedule_num_prio(); for (i = 0; i < prios; i++) { for (j = 0; j < QUEUES_PER_PRIO; j++) { char name[32]; snprintf(name, sizeof(name), "sched_%d_%d_n", i, j); if (destroy_queue(name) != 0) return -1; snprintf(name, sizeof(name), "sched_%d_%d_a", i, j); if (destroy_queue(name) != 0) return -1; snprintf(name, sizeof(name), "sched_%d_%d_o", i, j); if (destroy_queue(name) != 0) return -1; snprintf(name, sizeof(name), "plain_%d_%d_o", i, j); if (destroy_queue(name) != 0) return -1; } } if (odp_pool_destroy(queue_ctx_pool) != 0) { fprintf(stderr, "error: failed to destroy queue ctx pool\n"); return -1; } return 0; }
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; odp_queue_param_t p; 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(¶ms); params.buf.size = sizeof(queue_context); params.buf.num = prios * QUEUES_PER_PRIO * 2; params.type = ODP_POOL_BUFFER; queue_ctx_pool = odp_pool_create(QUEUE_CTX_POOL_NAME, ¶ms); if (queue_ctx_pool == ODP_POOL_INVALID) { printf("Pool creation failed (queue ctx).\n"); return -1; } for (i = 0; i < prios; i++) { odp_queue_param_init(&p); p.type = ODP_QUEUE_TYPE_SCHED; p.sched.prio = i; for (j = 0; j < QUEUES_PER_PRIO; j++) { /* Per sched sync type */ char name[32]; odp_queue_t q, pq; snprintf(name, sizeof(name), "sched_%d_%d_n", i, j); p.sched.sync = ODP_SCHED_SYNC_PARALLEL; q = odp_queue_create(name, &p); if (q == ODP_QUEUE_INVALID) { printf("Schedule queue create failed.\n"); return -1; } snprintf(name, sizeof(name), "sched_%d_%d_a", i, j); p.sched.sync = ODP_SCHED_SYNC_ATOMIC; q = odp_queue_create(name, &p); if (q == ODP_QUEUE_INVALID) { printf("Schedule queue create failed.\n"); return -1; } snprintf(name, sizeof(name), "plain_%d_%d_o", i, j); pq = odp_queue_create(name, NULL); if (pq == ODP_QUEUE_INVALID) { printf("Plain queue create failed.\n"); return -1; } queue_ctx_buf = odp_buffer_alloc(queue_ctx_pool); if (queue_ctx_buf == ODP_BUFFER_INVALID) { printf("Cannot allocate plain queue ctx buf\n"); return -1; } pqctx = odp_buffer_addr(queue_ctx_buf); pqctx->ctx_handle = queue_ctx_buf; pqctx->sequence = 0; rc = odp_queue_context_set(pq, pqctx, 0); if (rc != 0) { printf("Cannot set plain queue context\n"); return -1; } snprintf(name, sizeof(name), "sched_%d_%d_o", i, j); p.sched.sync = ODP_SCHED_SYNC_ORDERED; p.sched.lock_count = capa.max_ordered_locks; q = odp_queue_create(name, &p); if (q == ODP_QUEUE_INVALID) { printf("Schedule queue create failed.\n"); return -1; } if (odp_queue_lock_count(q) != (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), capa.max_ordered_locks); return -1; } queue_ctx_buf = odp_buffer_alloc(queue_ctx_pool); if (queue_ctx_buf == ODP_BUFFER_INVALID) { printf("Cannot allocate queue ctx buf\n"); return -1; } qctx = odp_buffer_addr(queue_ctx_buf); qctx->ctx_handle = queue_ctx_buf; qctx->pq_handle = pq; qctx->sequence = 0; for (ndx = 0; ndx < capa.max_ordered_locks; ndx++) { qctx->lock_sequence[ndx] = 0; } rc = odp_queue_context_set(q, qctx, 0); if (rc != 0) { printf("Cannot set queue context\n"); return -1; } } } return 0; }
/* Many queues many threads check priority ODP_SCHED_SYNC_ORDERED multi */ void scheduler_test_multi_mq_mt_prio_o(void) { int prio = odp_schedule_num_prio(); parallel_execute(ODP_SCHED_SYNC_ORDERED, MANY_QS, prio, SCHD_MULTI, 0); }
/* Many queues 1 thread check priority ODP_SCHED_SYNC_ORDERED multi */ void scheduler_test_multi_mq_1t_prio_o(void) { int prio = odp_schedule_num_prio(); schedule_common(ODP_SCHED_SYNC_ORDERED, MANY_QS, prio, SCHD_MULTI); }
/* Many queues 1 thread check priority ODP_SCHED_SYNC_ATOMIC */ void scheduler_test_mq_1t_prio_a(void) { int prio = odp_schedule_num_prio(); schedule_common(ODP_SCHED_SYNC_ATOMIC, MANY_QS, prio, SCHD_ONE); }
static int create_queues(void) { int i, j, prios, rc; odp_pool_param_t params; odp_buffer_t queue_ctx_buf; queue_context *qctx, *pqctx; uint32_t ndx; prios = odp_schedule_num_prio(); odp_pool_param_init(¶ms); params.buf.size = sizeof(queue_context); params.buf.num = prios * QUEUES_PER_PRIO * 2; params.type = ODP_POOL_BUFFER; queue_ctx_pool = odp_pool_create(QUEUE_CTX_POOL_NAME, ¶ms); if (queue_ctx_pool == ODP_POOL_INVALID) { printf("Pool creation failed (queue ctx).\n"); return -1; } for (i = 0; i < prios; i++) { odp_queue_param_t p; odp_queue_param_init(&p); p.sched.prio = i; for (j = 0; j < QUEUES_PER_PRIO; j++) { /* Per sched sync type */ char name[32]; odp_queue_t q, pq; snprintf(name, sizeof(name), "sched_%d_%d_n", i, j); p.sched.sync = ODP_SCHED_SYNC_NONE; q = odp_queue_create(name, ODP_QUEUE_TYPE_SCHED, &p); if (q == ODP_QUEUE_INVALID) { printf("Schedule queue create failed.\n"); return -1; } snprintf(name, sizeof(name), "sched_%d_%d_a", i, j); p.sched.sync = ODP_SCHED_SYNC_ATOMIC; q = odp_queue_create(name, ODP_QUEUE_TYPE_SCHED, &p); if (q == ODP_QUEUE_INVALID) { printf("Schedule queue create failed.\n"); return -1; } snprintf(name, sizeof(name), "poll_%d_%d_o", i, j); pq = odp_queue_create(name, ODP_QUEUE_TYPE_POLL, NULL); if (pq == ODP_QUEUE_INVALID) { printf("Poll queue create failed.\n"); return -1; } queue_ctx_buf = odp_buffer_alloc(queue_ctx_pool); if (queue_ctx_buf == ODP_BUFFER_INVALID) { printf("Cannot allocate poll queue ctx buf\n"); return -1; } pqctx = odp_buffer_addr(queue_ctx_buf); pqctx->ctx_handle = queue_ctx_buf; pqctx->sequence = 0; rc = odp_queue_context_set(pq, pqctx); if (rc != 0) { printf("Cannot set poll queue context\n"); return -1; } /* 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; */ /* q = odp_queue_create(name, ODP_QUEUE_TYPE_SCHED, &p); */ /* if (q == ODP_QUEUE_INVALID) { */ /* printf("Schedule queue create failed.\n"); */ /* return -1; */ /* } */ /* if (odp_queue_lock_count(q) != */ /* ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE) { */ /* 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); */ /* return -1; */ /* } */ queue_ctx_buf = odp_buffer_alloc(queue_ctx_pool); if (queue_ctx_buf == ODP_BUFFER_INVALID) { printf("Cannot allocate queue ctx buf\n"); return -1; } qctx = odp_buffer_addr(queue_ctx_buf); qctx->ctx_handle = queue_ctx_buf; qctx->pq_handle = pq; qctx->sequence = 0; for (ndx = 0; ndx < ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE; ndx++) { qctx->lock_sequence[ndx] = 0; } rc = odp_queue_context_set(q, qctx); if (rc != 0) { printf("Cannot set queue context\n"); return -1; } } } return 0; }