This is a simple comma separated list, so use the normal form. * Don't cease processing subsequent elements on an error * Do report -EINVAL for things like `dom0_nodes=4foo` * Don't opencode the cmdline_strcmp() helper
Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com> --- CC: Jan Beulich <jbeul...@suse.com> CC: Roger Pau Monné <roger....@citrix.com> CC: Wei Liu <w...@xen.org> CC: Jane Malalane <jane.malal...@citrix.com> --- xen/arch/x86/dom0_build.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c index fe24e11b37fb..5a7441ed5b79 100644 --- a/xen/arch/x86/dom0_build.c +++ b/xen/arch/x86/dom0_build.c @@ -169,30 +169,37 @@ bool __initdata dom0_affinity_relaxed; static int __init parse_dom0_nodes(const char *s) { + const char *ss; + int rc = 0; + do { + ss = strchr(s, ','); + if ( !ss ) + ss = strchr(s, '\0'); + if ( isdigit(*s) ) { + const char *endp; + if ( dom0_nr_pxms >= ARRAY_SIZE(dom0_pxms) ) - return -E2BIG; - dom0_pxms[dom0_nr_pxms] = simple_strtoul(s, &s, 0); - if ( !*s || *s == ',' ) - ++dom0_nr_pxms; + rc = -E2BIG; + else if ( (dom0_pxms[dom0_nr_pxms] = simple_strtoul(s, &endp, 0), + endp != ss) ) + rc = -EINVAL; + else + dom0_nr_pxms++; } - else if ( !strncmp(s, "relaxed", 7) && (!s[7] || s[7] == ',') ) - { + else if ( !cmdline_strcmp(s, "relaxed") ) dom0_affinity_relaxed = true; - s += 7; - } - else if ( !strncmp(s, "strict", 6) && (!s[6] || s[6] == ',') ) - { + else if ( !cmdline_strcmp(s, "strict") ) dom0_affinity_relaxed = false; - s += 6; - } else - return -EINVAL; - } while ( *s++ == ',' ); + rc = -EINVAL; - return s[-1] ? -EINVAL : 0; + s = ss + 1; + } while ( *ss ); + + return rc; } custom_param("dom0_nodes", parse_dom0_nodes); -- 2.11.0