Signed-off-by: Balakrishna.Garapati balakrishna.garap...@linaro.org
---
boundry check for cpu count vs cpumask_last to limit mask
example/generator/odp_generator.c | 65 +++
1 file changed, 45 insertions(+), 20 deletions(-)
diff --git a/example/generator/odp_generator.c
b/example/generator/odp_generator.c
index bdee222..a2d8c66 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -43,6 +43,7 @@
*/
typedef struct {
int cpu_count; /** system CPU count */
+ const char *mask; /** s/core mask/CPU mask */
int if_count; /** Number of interfaces to be used */
char **if_names;/** Array of pointers to interface names */
char *if_str; /** Storage for interface names */
@@ -645,18 +646,31 @@ int main(int argc, char *argv[])
if (args-appl.cpu_count)
num_workers = args-appl.cpu_count;
- /* ping mode need two worker */
- if (args-appl.mode == APPL_MODE_PING)
- num_workers = 2;
+ if (args-appl.mask) {
+ odp_cpumask_from_str(cpumask, args-appl.mask);
+ num_workers = odp_cpumask_count(cpumask);
+ if (odp_cpu_count() (odp_cpumask_last(cpumask) + 1)) {
+ num_workers = odp_cpumask_def_worker(cpumask,
+num_workers);
+ }
+ } else {
+ num_workers = odp_cpumask_def_worker(cpumask, num_workers);
+ }
- /* 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);
+ /* ping mode need two workers */
+ if (args-appl.mode == APPL_MODE_PING) {
+ if (num_workers 2) {
+ EXAMPLE_ERR(Need at least two worker threads\n);
+ exit(EXIT_FAILURE);
+ }
+ }
+
/* Create packet pool */
memset(params, 0, sizeof(params));
params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
@@ -704,12 +718,13 @@ int main(int argc, char *argv[])
memset(thread_tbl, 0, sizeof(thread_tbl));
if (args-appl.mode == APPL_MODE_PING) {
- odp_cpumask_t cpu0_mask;
+ odp_cpumask_t cpu_mask;
odp_queue_t tq;
+ int cpu_first, cpu_next;
- /* Previous code forced both threads to CPU 0 */
- odp_cpumask_zero(cpu0_mask);
- odp_cpumask_set(cpu0_mask, 0);
+ odp_cpumask_zero(cpu_mask);
+ cpu_first = odp_cpumask_first(cpumask);
+ odp_cpumask_set(cpu_mask, cpu_first);
tq = odp_queue_create(, ODP_QUEUE_TYPE_POLL, NULL);
if (tq == ODP_QUEUE_INVALID)
@@ -725,7 +740,7 @@ int main(int argc, char *argv[])
if (args-thread[1].tmo_ev == ODP_TIMEOUT_INVALID)
abort();
args-thread[1].mode = args-appl.mode;
- odph_linux_pthread_create(thread_tbl[1], cpu0_mask,
+ odph_linux_pthread_create(thread_tbl[1], cpu_mask,
gen_recv_thread, args-thread[1]);
tq = odp_queue_create(, ODP_QUEUE_TYPE_POLL, NULL);
@@ -742,7 +757,10 @@ int main(int argc, char *argv[])
if (args-thread[0].tmo_ev == ODP_TIMEOUT_INVALID)
abort();
args-thread[0].mode = args-appl.mode;
- odph_linux_pthread_create(thread_tbl[0], cpu0_mask,
+ cpu_next = odp_cpumask_next(cpumask, cpu_first);
+ odp_cpumask_zero(cpu_mask);
+ odp_cpumask_set(cpu_mask, cpu_next);
+ odph_linux_pthread_create(thread_tbl[0], cpu_mask,
gen_send_thread, args-thread[0]);
/* only wait send thread to join */
@@ -824,11 +842,12 @@ static void parse_args(int argc, char *argv[],
appl_args_t *appl_args)
static struct option longopts[] = {
{interface, required_argument, NULL, 'I'},
{workers, required_argument, NULL, 'w'},
+ {cpumask, required_argument, NULL, 'c'},
{srcmac, required_argument, NULL, 'a'},
{dstmac, required_argument, NULL, 'b'},
- {srcip, required_argument, NULL, 'c'},
+ {srcip, required_argument, NULL, 's'},
{dstip, required_argument, NULL, 'd'},
- {packetsize, required_argument, NULL, 's'},
+ {packetsize, required_argument, NULL, 'p'},
{mode, required_argument, NULL, 'm'},
{count,