lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <200812172223.53079.rusty@rustcorp.com.au>
Date:	Wed, 17 Dec 2008 22:23:52 +1030
From:	Rusty Russell <rusty@...tcorp.com.au>
To:	Mike Travis <travis@....com>
Cc:	Ingo Molnar <mingo@...hat.com>, Jack Steiner <steiner@....com>,
	linux-kernel@...r.kernel.org, Greg KH <gregkh@...e.de>
Subject: Re: [PATCH 3/3] cpumask: add sysfs displays for configured and disabled cpu maps

On Tuesday 16 December 2008 14:56:48 Mike Travis wrote:
> Impact: add new functionality.
> 
> Add sysfs files "kernel_max" and "offline" to display the max CPU index
> allowed (NR_CPUS-1), and the map of cpus that are offline. 

I've applied this to the cpumask series, but Greg is sysfs maestro, so
I'll await his ack (I've quoted whole thing for easy reading).

Thanks,
Rusty.

> Cpus can be offlined via HOTPLUG, disabled by the BIOS ACPI tables, or
> if they exceed the number of cpus allowed by the NR_CPUS config option,
> or the "maxcpus=NUM" kernel start parameter.
> 
> The "possible_cpus=NUM" parameter can also extend the number of possible
> cpus allowed, in which case the cpus not present at startup will be
> in the offline state.  (These cpus can be HOTPLUGGED ON after system
> startup [pending a follow-on patch to provide the capability via the
> /sys/devices/sys/cpu/cpuN/online mechanism to bring them online.])
> 
> By design, the "offlined cpus > possible cpus" display will always
> use the following formats:
> 
>   * all possible cpus online:   "x$"    or "x-y$" 
>   * some possible cpus offline: ".*,x$" or ".*,x-y$"
> 
> where:
>   x == number of possible cpus (nr_cpu_ids); and
>   y == number of cpus >= NR_CPUS or maxcpus (if y > x).
> 
> One use of this feature is for distros to select (or configure) the
> appropriate kernel to install for the resident system.
> 
> Notes:
>   * cpus offlined <= possible cpus will be printed for all architectures.
>   * cpus offlined >  possible cpus will only be printed for arches that
>   	set 'total_cpus' [X86 only in this patch].
> 
> Based on tip/cpus4096 + .../rusty/linux-2.6-for-ingo.git/master +
> 	 x86-only-patches sent 12/15.
> 
> Signed-off-by: Mike Travis <travis@....com>
> Acked-by: Rusty Russell <rusty@...tcorp.com.au>
> ---
>  arch/x86/kernel/smpboot.c |    2 ++
>  drivers/base/cpu.c        |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/smp.h       |    3 +++
>  3 files changed, 50 insertions(+)
> 
> --- linux-2.6-for-ingo.orig/arch/x86/kernel/smpboot.c
> +++ linux-2.6-for-ingo/arch/x86/kernel/smpboot.c
> @@ -1293,6 +1293,8 @@ __init void prefill_possible_map(void)
>  	else
>  		possible = setup_possible_cpus;
>  
> +	total_cpus = max_t(int, possible, num_processors + disabled_cpus);
> +
>  	if (possible > CONFIG_NR_CPUS) {
>  		printk(KERN_WARNING
>  			"%d Processors exceeds NR_CPUS limit of %d\n",
> --- linux-2.6-for-ingo.orig/drivers/base/cpu.c
> +++ linux-2.6-for-ingo/drivers/base/cpu.c
> @@ -128,10 +128,55 @@ print_cpus_func(online);
>  print_cpus_func(possible);
>  print_cpus_func(present);
>  
> +/*
> + * Print values for NR_CPUS and offlined cpus
> + */
> +static ssize_t print_cpus_kernel_max(struct sysdev_class *class, char *buf)
> +{
> +	int n = snprintf(buf, PAGE_SIZE-2, "%d\n", CONFIG_NR_CPUS - 1);
> +	return n;
> +}
> +static SYSDEV_CLASS_ATTR(kernel_max, 0444, print_cpus_kernel_max, NULL);
> +
> +/* arch-optional setting to enable display of offline cpus >= nr_cpu_ids */
> +unsigned int total_cpus;
> +
> +static ssize_t print_cpus_offline(struct sysdev_class *class, char *buf)
> +{
> +	int n = 0, len = PAGE_SIZE-2;
> +	cpumask_var_t offline;
> +
> +	/* display offline cpus < nr_cpu_ids */
> +	if (!alloc_cpumask_var(&offline, GFP_KERNEL))
> +		goto next;
> +	cpumask_complement(offline, cpu_online_mask);
> +	n = cpulist_scnprintf(buf, len, offline);
> +	free_cpumask_var(offline);
> +
> +next:
> +	/* display offline cpus >= nr_cpu_ids */
> +	if (total_cpus && nr_cpu_ids < total_cpus) {
> +		if (n && n < len)
> +			buf[n++] = ',';
> +
> +		if (nr_cpu_ids == total_cpus-1)
> +			n += snprintf(&buf[n], len - n, "%d", nr_cpu_ids);
> +		else
> +			n += snprintf(&buf[n], len - n, "%d-%d",
> +						      nr_cpu_ids, total_cpus-1);
> +	}
> +
> +	n += snprintf(&buf[n], len - n, "\n");
> +	return n;
> +}
> +static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL);
> +
>  static struct sysdev_class_attribute *cpu_state_attr[] = {
>  	&attr_online_map,
>  	&attr_possible_map,
>  	&attr_present_map,
> +	&attr_kernel_max,
> +	&attr_offline,
>  };
>  
>  static int cpu_states_init(void)
> --- linux-2.6-for-ingo.orig/include/linux/smp.h
> +++ linux-2.6-for-ingo/include/linux/smp.h
> @@ -21,6 +21,9 @@ struct call_single_data {
>  	u16 priv;
>  };
>  
> +/* total number of cpus in this system (may exceed NR_CPUS) */
> +extern unsigned int total_cpus;
> +
>  #ifdef CONFIG_SMP
>  
>  #include <linux/preempt.h>
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ