void scheduler_test_pause_resume(void) { odp_queue_t queue; odp_buffer_t buf; odp_event_t ev; odp_queue_t from; int i; int local_bufs = 0; queue = odp_queue_lookup("sched_0_0_n"); CU_ASSERT(queue != ODP_QUEUE_INVALID); pool = odp_pool_lookup(MSG_POOL_NAME); CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); for (i = 0; i < NUM_BUFS_PAUSE; i++) { buf = odp_buffer_alloc(pool); CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID); ev = odp_buffer_to_event(buf); if (odp_queue_enq(queue, ev)) odp_buffer_free(buf); } for (i = 0; i < NUM_BUFS_BEFORE_PAUSE; i++) { from = ODP_QUEUE_INVALID; ev = odp_schedule(&from, ODP_SCHED_WAIT); CU_ASSERT(from == queue); buf = odp_buffer_from_event(ev); odp_buffer_free(buf); } odp_schedule_pause(); while (1) { ev = odp_schedule(&from, ODP_SCHED_NO_WAIT); if (ev == ODP_EVENT_INVALID) break; CU_ASSERT(from == queue); buf = odp_buffer_from_event(ev); odp_buffer_free(buf); local_bufs++; } CU_ASSERT(local_bufs < NUM_BUFS_PAUSE - NUM_BUFS_BEFORE_PAUSE); odp_schedule_resume(); for (i = local_bufs + NUM_BUFS_BEFORE_PAUSE; i < NUM_BUFS_PAUSE; i++) { ev = odp_schedule(&from, ODP_SCHED_WAIT); CU_ASSERT(from == queue); buf = odp_buffer_from_event(ev); odp_buffer_free(buf); } CU_ASSERT(exit_schedule_loop() == 0); }
static int exit_schedule_loop(void) { odp_event_t ev; int ret = 0; odp_schedule_pause(); while ((ev = odp_schedule(NULL, ODP_SCHED_NO_WAIT)) != ODP_EVENT_INVALID) { odp_event_free(ev); ret++; } odp_schedule_resume(); return ret; }
int ofp_init_global(ofp_init_global_t *params) { int i; HANDLE_ERROR(ofp_init_pre_global(NULL, NULL, params->pkt_hook, NULL, ARP_AGE_INTERVAL, ARP_ENTRY_TIMEOUT)); /* cpu mask for slow path threads */ odp_cpumask_zero(&cpumask); odp_cpumask_set(&cpumask, params->linux_core_id); OFP_INFO("Slow path threads on core %d", odp_cpumask_first(&cpumask)); HANDLE_ERROR(ofp_set_vxlan_interface_queue()); /* Create interfaces */ for (i = 0; i < params->if_count; ++i) HANDLE_ERROR(ofp_ifnet_create(params->if_names[i], params->burst_recv_mode ? ODP_PKTIN_MODE_RECV : ODP_PKTIN_MODE_SCHED)); #ifdef SP /* Start Netlink server process */ if (!ofp_linux_pthread_create(&shm->nl_thread, &cpumask, START_NL_SERVER, NULL, ODP_THREAD_CONTROL)) { OFP_ERR("Failed to start Netlink thread."); return -1; } shm->nl_thread_is_running = 1; #endif /* SP */ odp_schedule_resume(); return 0; }