I will make another patch v5 with the changes.

On 7 August 2015 at 16:24, Maxim Uvarov <maxim.uva...@linaro.org> wrote:

> Balakrishna,
>
> please also update usage() how to use thread mask here. And please find
> one commend inside.
>
> Best regards,
> Maxim.
>
>
> On 08/05/15 21:09, Balakrishna.Garapati wrote:
>
>> Signed-off-by: Balakrishna.Garapati <balakrishna.garap...@linaro.org>
>> ---
>>   Fixed the comments
>>
>>   example/generator/odp_generator.c | 59
>> ++++++++++++++++++++++++++-------------
>>   1 file changed, 40 insertions(+), 19 deletions(-)
>>
>> diff --git a/example/generator/odp_generator.c
>> b/example/generator/odp_generator.c
>> index bdee222..e364afa 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,27 @@ 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);
>>
> here you got number mask from cmdline, convert it to count, but did not
> check that this count less then MAX_CPUS. So on access to
> array here might be seg. fault.  You can check it here or in page_args().
>
> +       } else {
>> +               num_workers = odp_cpumask_def_worker(&cpumask,
>> num_workers);
>>
>
> or call above function in both cases.
>
>
>
> +       }
>>   -     /* 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 +714,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 +736,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 +753,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 +838,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", required_argument, NULL, 'n'},
>>                 {"timeout", required_argument, NULL, 't'},
>> @@ -843,8 +858,8 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>         appl_args->timeout = -1;
>>         while (1) {
>> -               opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:h",
>> -                                       longopts, &long_index);
>> +               opt = getopt_long(argc, argv,
>> "+I:a:b:s:d:p:i:m:n:t:w:c:h",
>> +                                 longopts, &long_index);
>>                 if (opt == -1)
>>                         break;  /* No more options */
>>   @@ -852,6 +867,9 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>                 case 'w':
>>                         appl_args->cpu_count = atoi(optarg);
>>                         break;
>> +               case 'c':
>> +                       appl_args->mask = optarg;
>> +                       break;
>>                 /* parse packet-io interface names */
>>                 case 'I':
>>                         len = strlen(optarg);
>> @@ -920,7 +938,7 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>                         }
>>                         break;
>>   -             case 'c':
>> +               case 's':
>>                         if (scan_ip(optarg, &appl_args->srcip) != 1) {
>>                                 EXAMPLE_ERR("wrong src ip:%s\n", optarg);
>>                                 exit(EXIT_FAILURE);
>> @@ -934,7 +952,7 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>                         }
>>                         break;
>>   -             case 's':
>> +               case 'p':
>>                         appl_args->payload = atoi(optarg);
>>                         break;
>>   @@ -1033,14 +1051,17 @@ static void usage(char *progname)
>>                "  -I, --interface Eth interfaces (comma-separated, no
>> spaces)\n"
>>                "  -a, --srcmac src mac address\n"
>>                "  -b, --dstmac dst mac address\n"
>> -              "  -c, --srcip src ip address\n"
>> +              "  -s, --srcip src ip address\n"
>>                "  -d, --dstip dst ip address\n"
>> -              "  -s, --packetsize payload length of the packets\n"
>> +              "  -p, --packetsize payload length of the packets\n"
>>                "  -m, --mode work mode: send udp(u), receive(r), send
>> icmp(p)\n"
>>                "  -n, --count the number of packets to be send\n"
>>                "  -t, --timeout only for ping mode, wait ICMP reply
>> timeout seconds\n"
>>                "  -i, --interval wait interval ms between sending each
>> packet\n"
>>                "                 default is 1000ms. 0 for flood mode\n"
>> +              "  -w, --workers specify number of workers need to be
>> assigned to application\n"
>> +              "                 default is to assign all\n"
>> +              "  -c, --cpumask to set on cores\n"
>>                "\n"
>>                "Optional OPTIONS\n"
>>                "  -h, --help       Display help and exit.\n"
>>
>
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to