|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 2/2] xentrace: Implement cpu mask range parsing of human values (-c).
On Tue, Jun 24, 2014 at 6:17 PM, George Dunlap
<george.dunlap@xxxxxxxxxxxxx> wrote:
> On 06/20/2014 08:33 PM, Konrad Rzeszutek Wilk wrote:
>>
>> @@ -966,6 +969,129 @@ static int parse_cpumask(const char *arg)
>> return 0;
>> }
>>
>> +#define ZERO_DIGIT '0'
>> +
>> +static int parse_cpumask_range(const char *arg)
>> +{
>> + xc_cpumap_t map;
>> + unsigned int a, b, buflen = strlen(arg);
>> + int c, c_old, totaldigits, nmaskbits;
>> + int in_range;
>> + const char *s;
>> +
>> + if ( !buflen )
>> + {
>> + fprintf(stderr, "Invalid option argument: %s\n", arg);
>> + return EINVAL;
>> + }
>> + nmaskbits = xc_get_max_cpus(xc_handle);
>> + if ( nmaskbits <= 0 )
>> + {
>> + fprintf(stderr, "Failed to get max number of CPUs! rc: %d\n",
>> nmaskbits);
>> + return -ENOSPC;
>> + }
>> + map = xc_cpumap_alloc(xc_handle);
>> + if ( !map )
>> + {
>> + fprintf(stderr, "Out of memory!\n");
>> + return -ENOMEM;
>> + }
>> + c = c_old = totaldigits = 0;
>> + s = arg;
>> + do {
>> + in_range = 0;
>> + a = b = 0;
>> + while ( buflen )
>> + {
>> + c_old = c;
>> + c = *s++;
>> + buflen--;
>
>
> Hmm, tricksy -- "buflen" may be non-zero above, but then may end up zero in
> the "} while()" below. This caused me a bit of confusion -- might be worth
> a comment?
>
>
>> +
>> + if ( isspace(c) )
>> + continue;
>> +
>> + if ( totaldigits && c && isspace(c_old) )
>> + {
>> + fprintf(stderr, "No embedded whitespaces allowed in:
>> %s\n", arg);
>> + goto err_out;
>> + }
>> +
>> + /* A '\0' or a ',' signal the end of a cpu# or range */
>> + if ( c == '\0' || c == ',' )
>> + break;
>> +
>> + if ( c == '-' )
>> + {
>> + if ( in_range )
>> + goto err_out;
>> + b = 0;
>> + in_range = 1;
>
>
> This would appear to accept both of the following:
> -c -5 # equivalent to 0-5
> -c 2,-6 # equivalent to 2, 0-6
>
> Is that what you want?
>
> If not, maybe in_range needs to be tristate: RANGE_INIT, RANGE_ONE,
> RANGE_TWO.
>
> Alternately, you might consider accepting both "-N" as meaning "0-N", and
> "N-" as meaning "N-MAX_CPUS". I think you could do that by adding "if(b==0)
> { b=nmaskbits-1; }" just after the inner loop.
>
> The rest of the parsing here looks correct to me.
>
>
>> +/**
>> + * Figure out which of the CPU types the user has provided - either the
>> hex
>> + * variant or the cpu-list. Once done set the CPU mask.
>> + */
>> +static int figure_cpu_mask(void)
>> +{
>> + int ret = 0;
>> + int buflen;
>> +
>> + if ( opts.cpu_mask_str )
>> + {
>> + buflen = strlen(opts.cpu_mask_str);
>> + if ( buflen < 2 )
>
>
> Isn't "-c 1" (i.e., just pinning to a single cpu) a valid option?
>
>
>> + goto out;
>> +
>> + if ( strncmp("0x", opts.cpu_mask_str, 2) == 0 )
>
>
> I think it should be safe to just to strcmp(), if one of your arguments is a
> static string, shouldn't it? It's not that big a deal to me either way,
> though.
Dur... of course you only want to compare the first two characters,
not the null terminator. N/m.
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |