示例#1
0
void cpumask_test_odp_cpumask_def(void)
{
	unsigned mask_count;
	unsigned num_worker;
	unsigned num_control;
	unsigned max_cpus = mask_capacity();
	unsigned available_cpus = odp_cpu_count();
	unsigned requested_cpus;
	odp_cpumask_t mask;

	CU_ASSERT(available_cpus <= max_cpus);

	if (available_cpus > 1)
		requested_cpus = available_cpus - 1;
	else
		requested_cpus = available_cpus;
	num_worker = odp_cpumask_def_worker(&mask, requested_cpus);
	mask_count = odp_cpumask_count(&mask);
	CU_ASSERT(mask_count == num_worker);

	num_control = odp_cpumask_def_control(&mask, 1);
	mask_count = odp_cpumask_count(&mask);
	CU_ASSERT(mask_count == num_control);

	CU_ASSERT(num_control == 1);
	CU_ASSERT(num_worker <= available_cpus);
	CU_ASSERT(num_worker > 0);
}
示例#2
0
文件: odp_atomic.c 项目: leitao/odp
/** create test thread */
int odp_test_thread_create(void *func_ptr(void *), pthrd_arg *arg)
{
	odp_cpumask_t cpumask;

	/* Create and init additional threads */
	odp_cpumask_def_worker(&cpumask, arg->numthrds);
	odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr,
				  (void *)arg);

	return 0;
}
示例#3
0
void cpumask_test_odp_cpumask_def_worker(void)
{
	unsigned num;
	unsigned mask_count;
	unsigned max_cpus = mask_capacity();
	odp_cpumask_t mask;

	num = odp_cpumask_def_worker(&mask, ALL_AVAILABLE);
	mask_count = odp_cpumask_count(&mask);

	CU_ASSERT(mask_count == num);
	CU_ASSERT(num > 0);
	CU_ASSERT(num <= max_cpus);
}
示例#4
0
/**
 * ODP L2 forwarding main function
 */
int main(int argc, char *argv[])
{
	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
	odp_pool_t pool;
	int i;
	int cpu;
	int num_workers;
	odp_shm_t shm;
	odp_cpumask_t cpumask;
	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
	odp_pool_param_t params;

	/* Init ODP before calling anything else */
	if (odp_init_global(NULL, NULL)) {
		LOG_ERR("Error: ODP global init failed.\n");
		exit(EXIT_FAILURE);
	}

	/* Init this thread */
	if (odp_init_local(ODP_THREAD_CONTROL)) {
		LOG_ERR("Error: ODP local init failed.\n");
		exit(EXIT_FAILURE);
	}

	/* Reserve memory for args from shared mem */
	shm = odp_shm_reserve("shm_args", sizeof(args_t),
			      ODP_CACHE_LINE_SIZE, 0);
	gbl_args = odp_shm_addr(shm);

	if (gbl_args == NULL) {
		LOG_ERR("Error: shared mem alloc failed.\n");
		exit(EXIT_FAILURE);
	}
	memset(gbl_args, 0, sizeof(*gbl_args));

	/* Parse and store the application arguments */
	parse_args(argc, argv, &gbl_args->appl);

	/* Print both system and application information */
	print_info(NO_PATH(argv[0]), &gbl_args->appl);

	/* Default to system CPU count unless user specified */
	num_workers = MAX_WORKERS;
	if (gbl_args->appl.cpu_count)
		num_workers = gbl_args->appl.cpu_count;

	/* Get default worker cpumask */
	num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
	(void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));

	printf("num worker threads: %i\n", num_workers);
	printf("first CPU:          %i\n", odp_cpumask_first(&cpumask));
	printf("cpu mask:           %s\n", cpumaskstr);

	if (num_workers < gbl_args->appl.if_count) {
		LOG_ERR("Error: CPU count %d less than interface count\n",
			num_workers);
		exit(EXIT_FAILURE);
	}
	if (gbl_args->appl.if_count % 2 != 0) {
		LOG_ERR("Error: interface count %d is odd in fwd appl.\n",
			gbl_args->appl.if_count);
		exit(EXIT_FAILURE);
	}

	/* Create packet pool */
	memset(&params, 0, sizeof(params));
	params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
	params.pkt.len     = SHM_PKT_POOL_BUF_SIZE;
	params.pkt.num     = SHM_PKT_POOL_SIZE/SHM_PKT_POOL_BUF_SIZE;
	params.type        = ODP_POOL_PACKET;

	pool = odp_pool_create("packet pool", &params);

	if (pool == ODP_POOL_INVALID) {
		LOG_ERR("Error: packet pool create failed.\n");
		exit(EXIT_FAILURE);
	}
	odp_pool_print(pool);

	for (i = 0; i < gbl_args->appl.if_count; ++i) {
		gbl_args->pktios[i] = create_pktio(gbl_args->appl.if_names[i],
						   pool, gbl_args->appl.mode);
		if (gbl_args->pktios[i] == ODP_PKTIO_INVALID)
			exit(EXIT_FAILURE);
	}
	gbl_args->pktios[i] = ODP_PKTIO_INVALID;

	memset(thread_tbl, 0, sizeof(thread_tbl));

	stats_t **stats = calloc(1, sizeof(stats_t) * num_workers);

	odp_barrier_init(&barrier, num_workers + 1);

	/* Create worker threads */
	cpu = odp_cpumask_first(&cpumask);
	for (i = 0; i < num_workers; ++i) {
		odp_cpumask_t thd_mask;
		void *(*thr_run_func) (void *);

		if (gbl_args->appl.mode == APPL_MODE_PKT_BURST)
			thr_run_func = pktio_ifburst_thread;
		else /* APPL_MODE_PKT_QUEUE */
			thr_run_func = pktio_queue_thread;

		gbl_args->thread[i].src_idx = i % gbl_args->appl.if_count;
		gbl_args->thread[i].stats = &stats[i];

		odp_cpumask_zero(&thd_mask);
		odp_cpumask_set(&thd_mask, cpu);
		odph_linux_pthread_create(&thread_tbl[i], &thd_mask,
					  thr_run_func,
					  &gbl_args->thread[i]);
		cpu = odp_cpumask_next(&cpumask, cpu);
	}

	print_speed_stats(num_workers, stats, gbl_args->appl.time,
			  gbl_args->appl.accuracy);
	free(stats);
	exit_threads = 1;

	/* Master thread waits for other threads to exit */
	odph_linux_pthread_join(thread_tbl, num_workers);

	free(gbl_args->appl.if_names);
	free(gbl_args->appl.if_str);
	printf("Exit\n\n");

	return 0;
}
/**
 * Test main function
 */
int main(int argc, char *argv[])
{
    odph_linux_pthread_t thread_tbl[MAX_WORKERS];
    int num_workers;
    odp_queue_t queue;
    uint64_t    cycles, ns;
    odp_queue_param_t   param;
    odp_pool_param_t    params;
    odp_timer_pool_param_t  tparams;
    odp_timer_pool_info_t   tpinfo;
    odp_cpumask_t   cpumask;
    char cpumaskstr[ODP_CPUMASK_STR_SIZE];
    odp_shm_t       shm;
    test_globals_t *gbls;

    printf("\nODP timer example starts\n");

    if (odp_init_global(NULL, NULL)) {
        printf("ODP global init failed.\n");
        return -1;
    }

    /* Init this thread. */
    if (odp_init_local(ODP_THREAD_CONTROL)) {
        printf("ODP local init failed.\n");
        return -1;
    }

    printf("\n");
    printf("ODP system info\n");
    printf("---------------\n");
    printf("ODP API version: %s\n", odp_version_api_str());
    printf("CPU model:       %s\n", odp_sys_cpu_model_str());
    printf("CPU freq (hz):   %d\n", odp_sys_cpu_hz());
    printf("Cache line size: %i\n", odp_sys_cache_line_size());
    printf("Max CPU count:   %i\n", odp_cpu_count());

    printf("\n");

    /* Reserve memory for test_globals_t from shared mem */
    shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
                          ODP_CACHE_LINE_SIZE, 0);
    if (ODP_SHM_INVALID == shm) {
        EXAMPLE_ERR("Error: shared mem reserve failed.\n");
        return -1;
    }

    gbls = odp_shm_addr(shm);
    if (NULL == gbls) {
        EXAMPLE_ERR("Error: shared mem alloc failed.\n");
        return -1;
    }

    memset(gbls, 0, sizeof(test_globals_t));

    parse_args(argc, argv, &gbls->args);

    memset(thread_tbl, 0, sizeof(thread_tbl));

    /* Default to system CPU count unless user specified */
    num_workers = MAX_WORKERS;
    if (gbls->args.cpu_count)
        num_workers = gbls->args.cpu_count;

    /* Get default worker cpumask */
    num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
    (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));

    printf("num worker threads: %i\n", num_workers);
    printf("first CPU:          %i\n", odp_cpumask_first(&cpumask));
    printf("cpu mask:           %s\n", cpumaskstr);

    printf("resolution:         %i usec\n", gbls->args.resolution_us);
    printf("min timeout:        %i usec\n", gbls->args.min_us);
    printf("max timeout:        %i usec\n", gbls->args.max_us);
    printf("period:             %i usec\n", gbls->args.period_us);
    printf("timeouts:           %i\n", gbls->args.tmo_count);

    /*
     * Create pool for timeouts
     */
    params.tmo.num = NUM_TMOS;
    params.type    = ODP_POOL_TIMEOUT;

    gbls->pool = odp_pool_create("msg_pool", &params);

    if (gbls->pool == ODP_POOL_INVALID) {
        EXAMPLE_ERR("Pool create failed.\n");
        return -1;
    }

    tparams.res_ns     = gbls->args.resolution_us * ODP_TIME_USEC;
    tparams.min_tmo    = gbls->args.min_us * ODP_TIME_USEC;
    tparams.max_tmo    = gbls->args.max_us * ODP_TIME_USEC;
    tparams.num_timers = num_workers;   /* One timer per worker */
    tparams.priv = 0;                   /* Shared */
    tparams.clk_src    = ODP_CLOCK_CPU;
    gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
    if (gbls->tp == ODP_TIMER_POOL_INVALID) {
        EXAMPLE_ERR("Timer pool create failed.\n");
        return -1;
    }

    odp_timer_pool_start();

    odp_shm_print_all();
    (void)odp_timer_pool_info(gbls->tp, &tpinfo);
    printf("Timer pool\n");
    printf("----------\n");
    printf("  name: %s\n", tpinfo.name);
    printf("  resolution: %d ns\n", tpinfo.param.res_ns);
    printf("  min tmo: %d ticks\n", tpinfo.param.min_tmo);
    printf("  max tmo: %d ticks\n", tpinfo.param.max_tmo);
    printf("\n");

    /*
     * Create a queue for timer test
     */
    memset(&param, 0, sizeof(param));
    param.sched.prio   = ODP_SCHED_PRIO_DEFAULT;
    param.sched.sync   = ODP_SCHED_SYNC_NONE;
    param.sched.group  = ODP_SCHED_GROUP_DEFAULT;

    queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED, &param);

    if (queue == ODP_QUEUE_INVALID) {
        EXAMPLE_ERR("Timer queue create failed.\n");
        return -1;
    }

    printf("CPU freq %d Hz\n", odp_sys_cpu_hz());
    printf("Cycles vs nanoseconds:\n");
    ns = 0;
    cycles = odp_time_ns_to_cycles(ns);

    printf("  %12d ns      ->  %12d cycles\n", ns, cycles);
    printf("  %12d cycles  ->  %12d ns\n", cycles,
           odp_time_cycles_to_ns(cycles));

    for (ns = 1; ns <= 100 * ODP_TIME_SEC; ns *= 10) {
        cycles = odp_time_ns_to_cycles(ns);

        printf("  %12d ns      ->  %12d cycles\n", ns,
               cycles);
        printf("  %12d cycles  ->  %12d ns\n", cycles,
               odp_time_cycles_to_ns(cycles));
    }

    printf("\n");

    gbls->num_workers = num_workers;

    /* Initialize number of timeouts to receive */
    odp_atomic_init_u32(&gbls->remain, gbls->args.tmo_count * num_workers);

    /* Barrier to sync test case execution */
    odp_barrier_init(&gbls->test_barrier, num_workers);

    /* Create and launch worker threads */
    odph_linux_pthread_create(thread_tbl, &cpumask,
                              run_thread, gbls);

    /* Wait for worker threads to exit */
    odph_linux_pthread_join(thread_tbl, num_workers);

    printf("ODP timer test complete\n\n");

    return 0;
}
示例#6
0
文件: app_main.c 项目: babubalu/ofp
int main(int argc, char *argv[])
{
	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
	appl_args_t params;
	int core_count, num_workers;
	odp_cpumask_t cpumask;
	char cpumaskstr[64];

	struct rlimit rlp;
	getrlimit(RLIMIT_CORE, &rlp);
	printf("RLIMIT_CORE: %ld/%ld\n", rlp.rlim_cur, rlp.rlim_max);
	rlp.rlim_cur = 200000000;
	printf("Setting to max: %d\n", setrlimit(RLIMIT_CORE, &rlp));

	/* Parse and store the application arguments */
	parse_args(argc, argv, &params);

	/* Print both system and application information */
	print_info(NO_PATH(argv[0]), &params);

	if (odp_init_global(NULL, NULL)) {
		OFP_ERR("Error: ODP global init failed.\n");
		exit(EXIT_FAILURE);
	}
	if (odp_init_local(ODP_THREAD_CONTROL)) {
		OFP_ERR("Error: ODP local init failed.\n");
		exit(EXIT_FAILURE);
	}

	core_count = odp_cpu_count();
	num_workers = core_count;

	if (params.core_count)
		num_workers = params.core_count;
	if (num_workers > MAX_WORKERS)
		num_workers = MAX_WORKERS;

	/*
	 * By default core #0 runs Linux kernel background tasks.
	 * Start mapping thread from core #1
	 */
	memset(&app_init_params, 0, sizeof(app_init_params));

	app_init_params.linux_core_id = 0;

	if (core_count > 1)
		num_workers--;

#if ODP_VERSION < 104
	num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
#else
	num_workers = odp_cpumask_default_worker(&cpumask, num_workers);
#endif
	odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));

	printf("Num worker threads: %i\n", num_workers);
	printf("first CPU:          %i\n", odp_cpumask_first(&cpumask));
	printf("cpu mask:           %s\n", cpumaskstr);

	app_init_params.if_count = params.if_count;
	app_init_params.if_names = params.if_names;
	app_init_params.pkt_hook[OFP_HOOK_LOCAL] = fastpath_local_hook;
	if (ofp_init_global(&app_init_params)) {
		OFP_ERR("Error: OFP global init failed.\n");
		exit(EXIT_FAILURE);
	}

	memset(thread_tbl, 0, sizeof(thread_tbl));
	/* Start dataplane dispatcher worker threads */

	odph_linux_pthread_create(thread_tbl,
				  &cpumask,
				  default_event_dispatcher,
				  ofp_eth_vlan_processing);

	/* other app code here.*/
	/* Start CLI */
	ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file);

	/* webserver */
	ofp_start_webserver_thread(app_init_params.linux_core_id);

	odph_linux_pthread_join(thread_tbl, num_workers);
	printf("End Main()\n");

	return 0;
}
示例#7
0
/** main() Application entry point
 *
 * @param argc int
 * @param argv[] char*
 * @return int
 *
 */
int main(int argc, char *argv[])
{
	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
	appl_args_t params;
	int core_count, num_workers;
	odp_cpumask_t cpumask;
	char cpumaskstr[64];

	/* Parse and store the application arguments */
	parse_args(argc, argv, &params);

	/* Print both system and application information */
	print_info(NO_PATH(argv[0]), &params);

	if (odp_init_global(NULL, NULL)) {
		OFP_ERR("Error: ODP global init failed.\n");
		exit(EXIT_FAILURE);
	}
	if (odp_init_local(ODP_THREAD_CONTROL)) {
		OFP_ERR("Error: ODP local init failed.\n");
		exit(EXIT_FAILURE);
	}

	core_count = odp_cpu_count();
	num_workers = core_count;

	if (params.core_count)
		num_workers = params.core_count;
	if (num_workers > MAX_WORKERS)
		num_workers = MAX_WORKERS;

	if (core_count > 1)
		num_workers--;

#if ODP_VERSION < 104
	num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
#else
	num_workers = odp_cpumask_default_worker(&cpumask, num_workers);
#endif
	odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));

	printf("Num worker threads: %i\n", num_workers);
	printf("first CPU:          %i\n", odp_cpumask_first(&cpumask));
	printf("cpu mask:           %s\n", cpumaskstr);

	memset(&app_init_params, 0, sizeof(app_init_params));
	app_init_params.linux_core_id = 0;
	app_init_params.if_count = params.if_count;
	app_init_params.if_names = params.if_names;

	if (ofp_init_global(&app_init_params)) {
		OFP_ERR("Error: OFP global init failed.\n");
		exit(EXIT_FAILURE);
	}
	if (ofp_init_local()) {
		OFP_ERR("Error: OFP local init failed.\n");
		exit(EXIT_FAILURE);
	}

	build_classifier(app_init_params.if_count, app_init_params.if_names);

	/* Start CLI */
	ofp_start_cli_thread(app_init_params.linux_core_id, params.conf_file);
	sleep(1);

	memset(thread_tbl, 0, sizeof(thread_tbl));
	/* Start dataplane dispatcher worker threads */
	odph_linux_pthread_create(thread_tbl,
				  &cpumask,
				  default_event_dispatcher,
				  ofp_udp4_processing);

	app_processing();

	odph_linux_pthread_join(thread_tbl, num_workers);
	printf("End Main()\n");

	return 0;
}