lkml.org 
[lkml]   [2012]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Subjectcpumask: reduce cpumask allocation size for CONFIG_CPUMASK_OFFSTACK.
Date
I've had these sitting in my queue for almost 3 years, but since Thomas
and Linus converted mm_struct to a cpumask_var_t, it's gotten easier.
Refreshed them on top of -tip.

The aim is to allow 'struct cpumask' to be undefined (but declared) if
CONFIG_CPUMASK_OFFSTACK is set. This avoids assignment, pass-by-value,
etc, so we can finally safely allocate nr_cpu_ids bits instead of
NR_CPUS.

The last holdout is 'struct task_struct', and we use a similar
alloc-at-end style to mm_struct.

Of course, more testing is needed...
Thanks,
Rusty.

The following changes since commit 6541f3667d5aa8996c8a22e8c878a59564d9590d:

Merge branch 'linus' (2012-02-14 16:01:39 +0100)

are available in the git repository at:

git://github.com/rustyrussell/linux.git cpumask-tip-wip

Rusty Russell (8):
cpumask: prepare for reduced cpumask_allocation.
cpumask: make task_struct.cpus_allowed a cpumask_var_t
cpumask: select disabling obsolete cpumask functions on x86
cpumask: fix lg_lock/br_lock.
cpumask: get rid of cpumask_t.
irq: remove sizeof(struct cpumask)
cpumask: remove struct cpumask definition when CONFIG_CPUMASK_OFFSTACK=y
cpumask: reduce cpumask_size

arch/arm/mach-integrator/cpu.c | 4 +-
arch/ia64/kernel/cpufreq/acpi-cpufreq.c | 4 +-
arch/ia64/kernel/mca.c | 2 +-
arch/ia64/kernel/salinfo.c | 2 +-
arch/ia64/kernel/topology.c | 2 +-
arch/ia64/sn/kernel/sn2/sn_hwperf.c | 2 +-
arch/mips/include/asm/system.h | 3 +-
arch/mips/kernel/cpufreq/loongson2_cpufreq.c | 2 +-
arch/mips/kernel/traps.c | 8 +++---
arch/sh/kernel/cpufreq.c | 2 +-
arch/x86/kernel/cpu/mcheck/mce_intel.c | 2 +-
drivers/acpi/processor_throttling.c | 4 +-
drivers/firmware/dcdbas.c | 2 +-
fs/file_table.c | 2 +-
fs/namespace.c | 4 ++-
fs/proc/array.c | 4 +-
include/linux/cpumask.h | 25 ++++++++++++++++-----
include/linux/init_task.h | 9 +++++++-
include/linux/interrupt.h | 2 +-
include/linux/lglock.h | 23 +++++++++++--------
include/linux/mm_types.h | 23 +++++++++++++++++--
include/linux/sched.h | 6 ++--
kernel/cpuset.c | 4 +-
kernel/fork.c | 30 ++++++++++++++++---------
kernel/irq/irqdesc.c | 2 +-
kernel/rcutree_plugin.h | 4 +-
kernel/sched/core.c | 6 ++--
kernel/sched/cpupri.c | 4 +-
kernel/trace/trace_workqueue.c | 6 ++--
kernel/workqueue.c | 2 +-
lib/Kconfig | 8 +++++-
lib/cpu_rmap.c | 2 +-
lib/cpumask.c | 2 +
33 files changed, 132 insertions(+), 75 deletions(-)

commit 5fadb164e2a9e8d58e0662d803d7e43992c80a7c
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:11 2012 +1030

cpumask: prepare for reduced cpumask_allocation.

Thomas and Linus already made CONFIG_CPUMASK_OFFSTACK use a cpumask
at the end of struct mm_struct, this just changes it into a bitmap
and allocates it using cpumask_size().

This means it will shrink when cpumask_size() is changed to reflect
nr_cpu_ids not NR_CPUS.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: anton@samba.org
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mike Travis <travis@sgi.com>

include/linux/mm_types.h | 21 +++++++++++++++++++--
kernel/fork.c | 13 +++----------
2 files changed, 22 insertions(+), 12 deletions(-)

commit 3b40c642842881e71c70fd1496a406b53bcee62b
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:20 2012 +1030

cpumask: make task_struct.cpus_allowed a cpumask_var_t

This turns it into a pointer for everyone. No change for those
already using the tsk_cpus_allowed() accessor; I've enhanced some of
the sched/ code to use that. For others, I just changed them
directly.

For CONFIG_CPUMASK_OFFSTACK=y, we now allocate it off the end; it
would be better to avoid the indirection and use a dangling bitmap,
but I didn't want to alter the layout of task_struct and risk breaking
carefully balanced caches.

Even better would be to point to the fixed "one cpu" and "all cpus"
masks where possible, and make a copy when setting it to something
else. But you'd have to track down those naughty places which frob it
directly...

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: anton@samba.org
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mike Travis <travis@sgi.com>

arch/arm/mach-integrator/cpu.c | 4 ++--
arch/ia64/kernel/cpufreq/acpi-cpufreq.c | 4 ++--
arch/ia64/kernel/mca.c | 2 +-
arch/ia64/kernel/salinfo.c | 2 +-
arch/ia64/kernel/topology.c | 2 +-
arch/ia64/sn/kernel/sn2/sn_hwperf.c | 2 +-
arch/mips/include/asm/system.h | 3 ++-
arch/mips/kernel/cpufreq/loongson2_cpufreq.c | 2 +-
arch/mips/kernel/traps.c | 8 ++++----
arch/sh/kernel/cpufreq.c | 2 +-
arch/x86/kernel/cpu/mcheck/mce_intel.c | 2 +-
drivers/acpi/processor_throttling.c | 4 ++--
drivers/firmware/dcdbas.c | 2 +-
fs/proc/array.c | 4 ++--
include/linux/init_task.h | 9 ++++++++-
include/linux/sched.h | 4 ++--
kernel/cpuset.c | 4 ++--
kernel/fork.c | 17 ++++++++++++++++-
kernel/rcutree_plugin.h | 4 ++--
kernel/sched/core.c | 6 +++---
kernel/sched/cpupri.c | 4 ++--
kernel/trace/trace_workqueue.c | 6 +++---
kernel/workqueue.c | 2 +-
23 files changed, 61 insertions(+), 38 deletions(-)

commit 68f666acb7b838675fdf9488cb22f016c8d9922c
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:29 2012 +1030

cpumask: select disabling obsolete cpumask functions on x86

It currently depends on CONFIG_BROKEN; change to be set by
CONFIG_CPUMASK_OFFSTACK now it all compiles.

We also complete it: the header shouldn't refer to the deprected
CPU_MASK_LAST_WORD, and the deprecated implementations are removed.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: anton@samba.org
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mike Travis <travis@sgi.com>

include/linux/cpumask.h | 4 ++--
include/linux/sched.h | 2 +-
lib/Kconfig | 8 ++++++--
lib/cpumask.c | 2 ++
4 files changed, 11 insertions(+), 5 deletions(-)

commit 2d7109dfd6789444c49099574de603cc3bd089a1
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:39 2012 +1030

cpumask: fix lg_lock/br_lock.

Use a cpumask_var_t instead of cpumask_t. We're doing plenty of
allocations here anyway, so it's not really an issue, and it sets a
good example.

(cpumask_t is obsolescent, as are the cpus_* functions).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

fs/file_table.c | 2 +-
fs/namespace.c | 4 +++-
include/linux/lglock.h | 23 +++++++++++++----------
3 files changed, 17 insertions(+), 12 deletions(-)

commit f35bdd306dc92e247e9cc398e783be15417538e6
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:47 2012 +1030

cpumask: get rid of cpumask_t.

Very shortly, struct cpumask will be declared but undefined for
CONFIG_CPUMASK_OFFSTACK, so use 'struct cpumask' rather than
the obsolescent 'cpumask_t'.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

include/linux/interrupt.h | 2 +-
include/linux/mm_types.h | 2 +-
lib/cpu_rmap.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)

commit 41fa3963db50afaf7156901adf726ab2d054229a
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:26:55 2012 +1030

irq: remove sizeof(struct cpumask)

Very shortly, struct cpumask will be declared but undefined for
CONFIG_CPUMASK_OFFSTACK, so sizeof() won't compile. This is a Good
Thing, since we want to use cpumask_size() here anyway.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

kernel/irq/irqdesc.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

commit 365e3e26f8bf81a5abde817a00a0e6d442c53fe1
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:27:03 2012 +1030

cpumask: remove struct cpumask definition when CONFIG_CPUMASK_OFFSTACK=y

We're about to change CONFIG_CPUMASK_OFFSTACK so it only allocate
nr_cpu_ids bits for all cpumasks. We need to make sure that when
CONFIG_CPUMASK_OFFSTACK is set:

1) Noone uses the old bitmap ops, which use NR_CPUS bits (use cpumask_*)
2) Noone uses assignment of struct cpumask (use cpumask_copy)
3) Noone passes a struct cpumask (pass a pointer)
4) Noone declares them on the stack (use cpumask_var_t)

So we finally remove the definition of struct cpumask when
CONFIG_CPUMASK_OFFSTACK=y. This means that these usages will hit a compile
error the moment that config option is turned on.

Note that it also means you can't declare a static cpumask. You
should avoid this anyway (use cpumask_var_t), but there's a
deliberately-ugly workaround for special cases, using DECLARE_BITMAP()
and to_cpumask().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: anton@samba.org
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mike Travis <travis@sgi.com>

include/linux/cpumask.h | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)

commit 07ad9d8d49dd9c0c8c962a7bdae502c7ef168add
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Feb 16 14:27:10 2012 +1030

cpumask: reduce cpumask_size

Now we're sure noone is using old cpumask operators, nor *cpumask, we can
allocate less bits safely. This reduces the memory usage of off-stack
cpumasks when CONFIG_CPUMASK_OFFSTACK=y but we don't have NR_CPUS actual
cpus.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: anton@samba.org
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mike Travis <travis@sgi.com>

include/linux/cpumask.h | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)


\
 
 \ /
  Last update: 2012-02-16 05:15    [W:0.054 / U:1.856 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site