[PATCH] irqbalance: fix invalid cpu mask parsing

Neil Horman nhorman at tuxdriver.com
Thu Dec 1 06:26:59 PST 2016


On Wed, Nov 30, 2016 at 03:32:22PM -0800, Tadeusz Struk wrote:
> Irq balancer scans the isolcpus and nohz_full kernel masks and adds the
> corresponding CPUs to the banned_cpus mask. This works fine for valid masks,
> but not for the default, emtpy masks. In this case when they read from the
> sysfs they return empty strings, "\n" or "0x0, \n":
> 
> # xxd /sys/devices/system/cpu/nohz_full
> 0000000: 000a
> # xxd /sys/devices/system/cpu/isolated
> 0000000: 0a
> 
> Irqbalancer reads them and blindly passes these values to the
> __bitmap_parselist() function, which expects ASCII string format.
> For this input the implementation always set the first bit indicating CPU 0.
> 
> Steps to Reproduce:
> 1. Make sure /sys/devices/system/cpu/nohz_full and
>    /sys/devices/system/cpu/isolated are empty
> 2. run $ /usr/sbin/irqbalance -d --oneshot | grep Isolated
> 
>    Actual results:
>    Isolated CPUs: 00000001
> 
>    Expected results:
>    Isolated CPUs: 00000000
> 
> Signed-off-by: Tadeusz Struk <tadeusz.struk at intel.com>
> ---
>  cputree.c |    6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/cputree.c b/cputree.c
> index a188ead..8762b64 100644
> --- a/cputree.c
> +++ b/cputree.c
> @@ -84,7 +84,8 @@ static void setup_banned_cpus(void)
>  	file = fopen("/sys/devices/system/cpu/isolated", "r");
>  	if (file) {
>  		if (getline(&line, &size, file) > 0) {
> -			cpulist_parse(line, size, isolated_cpus);
> +			if (strlen(line) && line[0] != '\n')
> +				cpulist_parse(line, strlen(line), isolated_cpus);
>  			free(line);
>  			line = NULL;
>  			size = 0;
> @@ -95,7 +96,8 @@ static void setup_banned_cpus(void)
>  	file = fopen("/sys/devices/system/cpu/nohz_full", "r");
>  	if (file) {
>  		if (getline(&line, &size, file) > 0) {
> -			cpulist_parse(line, size, nohz_full);
> +			if (strlen(line) && line[0] != '\n')
> +				cpulist_parse(line, strlen(line), nohz_full);
>  			free(line);
>  			line = NULL;
>  			size = 0;
> 
> 
> _______________________________________________
> irqbalance mailing list
> irqbalance at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/irqbalance
> 
Applied, thanks!
Neil




More information about the irqbalance mailing list