aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--Documentation/kernel-parameters.txt7
-rw-r--r--lib/cmdline.c35
2 files changed, 40 insertions, 2 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 1e183bd33d71..8fe6b834ef27 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -714,7 +714,12 @@ and is between 256 and 4096 characters. It is defined in the file
714 Format: <RDP>,<reset>,<pci_scan>,<verbosity> 714 Format: <RDP>,<reset>,<pci_scan>,<verbosity>
715 715
716 isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler. 716 isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
717 Format: <cpu number>,...,<cpu number> 717 Format:
718 <cpu number>,...,<cpu number>
719 or
720 <cpu number>-<cpu number> (must be a positive range in ascending order)
721 or a mixture
722 <cpu number>,...,<cpu number>-<cpu number>
718 This option can be used to specify one or more CPUs 723 This option can be used to specify one or more CPUs
719 to isolate from the general SMP balancing and scheduling 724 to isolate from the general SMP balancing and scheduling
720 algorithms. The only way to move a process onto or off 725 algorithms. The only way to move a process onto or off
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;