53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
/*
|
|
* Copyright 2010 Tilera Corporation. All Rights Reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
|
* NON INFRINGEMENT. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#include <linux/cpumask.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/smp.h>
|
|
|
|
/*
|
|
* Allow cropping out bits beyond the end of the array.
|
|
* Move to "lib" directory if more clients want to use this routine.
|
|
*/
|
|
int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits)
|
|
{
|
|
unsigned a, b;
|
|
|
|
bitmap_zero(maskp, nmaskbits);
|
|
do {
|
|
if (!isdigit(*bp))
|
|
return -EINVAL;
|
|
a = simple_strtoul(bp, (char **)&bp, 10);
|
|
b = a;
|
|
if (*bp == '-') {
|
|
bp++;
|
|
if (!isdigit(*bp))
|
|
return -EINVAL;
|
|
b = simple_strtoul(bp, (char **)&bp, 10);
|
|
}
|
|
if (!(a <= b))
|
|
return -EINVAL;
|
|
if (b >= nmaskbits)
|
|
b = nmaskbits-1;
|
|
while (a <= b) {
|
|
set_bit(a, maskp);
|
|
a++;
|
|
}
|
|
if (*bp == ',')
|
|
bp++;
|
|
} while (*bp != '\0' && *bp != '\n');
|
|
return 0;
|
|
}
|