aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cmdline.c
diff options
context:
space:
mode:
authorDerek Fults <dfults@sgi.com>2006-12-06 23:37:11 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-07 11:39:35 -0500
commit22f2e280179946b8be1e2205b8654f2cb4abbf64 (patch)
treebf40a2070381fc83a365eff736763264c466db16 /lib/cmdline.c
parent8f63fdbbd6de7d734c036948bf7c4b2bebe3ad99 (diff)
[PATCH] get_options to allow a hypenated range for isolcpus
This allows a hyphenated range of positive numbers in the string passed to command line helper function, get_options. Currently the command line option "isolcpus=" takes as its argument a list of cpus. Format: <cpu number>,...,<cpu number> Valid values of <cpu_number> include all cpus, 0 to "number of CPUs in system - 1". This can get extremely long when isolating the majority of cpus on a large system. The kernel isolcpus code would not need any changing to use this feature. To use it, the change would be in the command line format for 'isolcpus=' Format: <cpu number>,...,<cpu number> or <cpu number>-<cpu number> (must be a positive range in ascending order.) or a mixture <cpu number>,...,<cpu number>-<cpu number> Signed-off-by: Derek Fults <dfults@sgi.com> Cc: "Randy.Dunlap" <rdunlap@xenotime.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'lib/cmdline.c')
-rw-r--r--lib/cmdline.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/lib/cmdline.c b/lib/cmdline.c
index 0331ed825ea7..8a5b5303bd4f 100644
--- a/lib/cmdline.c
+++ b/lib/cmdline.c
@@ -16,6 +16,23 @@
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/string.h> 17#include <linux/string.h>
18 18
19/*
20 * If a hyphen was found in get_option, this will handle the
21 * range of numbers, M-N. This will expand the range and insert
22 * the values[M, M+1, ..., N] into the ints array in get_options.
23 */
24
25static int get_range(char **str, int *pint)
26{
27 int x, inc_counter, upper_range;
28
29 (*str)++;
30 upper_range = simple_strtol((*str), NULL, 0);
31 inc_counter = upper_range - *pint;
32 for (x = *pint; x < upper_range; x++)
33 *pint++ = x;
34 return inc_counter;
35}
19 36
20/** 37/**
21 * get_option - Parse integer from an option string 38 * get_option - Parse integer from an option string
@@ -29,6 +46,7 @@
29 * 0 : no int in string 46 * 0 : no int in string
30 * 1 : int found, no subsequent comma 47 * 1 : int found, no subsequent comma
31 * 2 : int found including a subsequent comma 48 * 2 : int found including a subsequent comma
49 * 3 : hyphen found to denote a range
32 */ 50 */
33 51
34int get_option (char **str, int *pint) 52int get_option (char **str, int *pint)
@@ -44,6 +62,8 @@ int get_option (char **str, int *pint)
44 (*str)++; 62 (*str)++;
45 return 2; 63 return 2;
46 } 64 }
65 if (**str == '-')
66 return 3;
47 67
48 return 1; 68 return 1;
49} 69}
@@ -55,7 +75,8 @@ int get_option (char **str, int *pint)
55 * @ints: integer array 75 * @ints: integer array
56 * 76 *
57 * This function parses a string containing a comma-separated 77 * This function parses a string containing a comma-separated
58 * list of integers. The parse halts when the array is 78 * list of integers, a hyphen-separated range of _positive_ integers,
79 * or a combination of both. The parse halts when the array is
59 * full, or when no more numbers can be retrieved from the 80 * full, or when no more numbers can be retrieved from the
60 * string. 81 * string.
61 * 82 *
@@ -72,6 +93,18 @@ char *get_options(const char *str, int nints, int *ints)
72 res = get_option ((char **)&str, ints + i); 93 res = get_option ((char **)&str, ints + i);
73 if (res == 0) 94 if (res == 0)
74 break; 95 break;
96 if (res == 3) {
97 int range_nums;
98 range_nums = get_range((char **)&str, ints + i);
99 if (range_nums < 0)
100 break;
101 /*
102 * Decrement the result by one to leave out the
103 * last number in the range. The next iteration
104 * will handle the upper number in the range
105 */
106 i += (range_nums - 1);
107 }
75 i++; 108 i++;
76 if (res == 1) 109 if (res == 1)
77 break; 110 break;