* [PATCH 5/5] cpumask: reduce cpumask_size
@ 2010-06-25 13:05 Rusty Russell
2010-06-28 3:12 ` KOSAKI Motohiro
0 siblings, 1 reply; 4+ messages in thread
From: Rusty Russell @ 2010-06-25 13:05 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnd Bergmann, anton, KOSAKI Motohiro, Mike Travis,
anton, KOSAKI Motohiro, Mike Travis
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 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -1014,13 +1014,11 @@ static inline int cpulist_parse(const ch
/**
* cpumask_size - size to allocate for a 'struct cpumask' in bytes
*
- * This will eventually be a runtime variable, depending on nr_cpu_ids.
+ * This can be a runtime variable, depending on nr_cpu_ids.
*/
static inline size_t cpumask_size(void)
{
- /* FIXME: Once all cpumask assignments are eliminated, this
- * can be nr_cpumask_bits */
- return BITS_TO_LONGS(NR_CPUS) * sizeof(long);
+ return BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long);
}
/*
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 5/5] cpumask: reduce cpumask_size 2010-06-25 13:05 [PATCH 5/5] cpumask: reduce cpumask_size Rusty Russell @ 2010-06-28 3:12 ` KOSAKI Motohiro 2010-06-28 10:27 ` Rusty Russell 0 siblings, 1 reply; 4+ messages in thread From: KOSAKI Motohiro @ 2010-06-28 3:12 UTC (permalink / raw) To: Rusty Russell Cc: kosaki.motohiro, Ingo Molnar, linux-kernel, Arnd Bergmann, anton, Mike Travis > 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. I have to say I'm sorry. Probably I broke your assumption. If this patch applied, we reintroduce exposing nr_cpu_ids issue and break libnuma again. I think following change is necessary too. Or, Am I missing something? ================================================================== diff --git a/kernel/compat.c b/kernel/compat.c index 5adab05..5fbee3e 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -506,7 +506,8 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len, ret = sched_getaffinity(pid, mask); if (ret == 0) { - size_t retlen = min_t(size_t, len, cpumask_size()); + size_t retlen = min_t(size_t, len, + BITS_TO_LONGS(NR_CPUS) * sizeof(long)); if (compat_put_bitmap(user_mask_ptr, cpumask_bits(mask), retlen * 8)) ret = -EFAULT; diff --git a/kernel/sched.c b/kernel/sched.c index 18faf4d..c14acad 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4823,7 +4823,9 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, ret = sched_getaffinity(pid, mask); if (ret == 0) { - size_t retlen = min_t(size_t, len, cpumask_size()); + size_t retlen = min_t(size_t, len, + BITS_TO_LONGS(NR_CPUS) * sizeof(long)); > 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 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h > --- a/include/linux/cpumask.h > +++ b/include/linux/cpumask.h > @@ -1014,13 +1014,11 @@ static inline int cpulist_parse(const ch > /** > * cpumask_size - size to allocate for a 'struct cpumask' in bytes > * > - * This will eventually be a runtime variable, depending on nr_cpu_ids. > + * This can be a runtime variable, depending on nr_cpu_ids. > */ > static inline size_t cpumask_size(void) > { > - /* FIXME: Once all cpumask assignments are eliminated, this > - * can be nr_cpumask_bits */ > - return BITS_TO_LONGS(NR_CPUS) * sizeof(long); > + return BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long); > } > > /* > ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 5/5] cpumask: reduce cpumask_size 2010-06-28 3:12 ` KOSAKI Motohiro @ 2010-06-28 10:27 ` Rusty Russell 2010-06-28 10:31 ` KOSAKI Motohiro 0 siblings, 1 reply; 4+ messages in thread From: Rusty Russell @ 2010-06-28 10:27 UTC (permalink / raw) To: KOSAKI Motohiro Cc: Ingo Molnar, linux-kernel, Arnd Bergmann, anton, Mike Travis On Mon, 28 Jun 2010 12:42:23 pm KOSAKI Motohiro wrote: > > 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. > > I have to say I'm sorry. Probably I broke your assumption. > If this patch applied, we reintroduce exposing nr_cpu_ids issue and > break libnuma again. I think following change is necessary too. > > Or, Am I missing something? I cc'd you because I remembered you being involved in that libnuma issue and couldn't remember the details. Unfortunately, this solution doesn't work: > diff --git a/kernel/sched.c b/kernel/sched.c > index 18faf4d..c14acad 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -4823,7 +4823,9 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, > > ret = sched_getaffinity(pid, mask); > if (ret == 0) { > - size_t retlen = min_t(size_t, len, cpumask_size()); > + size_t retlen = min_t(size_t, len, > + BITS_TO_LONGS(NR_CPUS) * sizeof(long)); > Since mask is a cpumask_var_t, only cpumask_size() is allocated. We can't copy NR_CPUS bits. But I think it's OK, anyway. libnuma is broken because it gets upset if the number of cpus it reads from /sys/.../cpumap is more than the cpumask size returned from sys_sched_getaffinity. Currently, getaffinity returns cpumask_size() (ie. based on NR_CPUS), and the printing routines use nr_cpumask_bits (ie. based on NR_CPUS for !CPUMASK_OFFSTACK, nr_cpu_ids for CPUMASK_OFFSTACK). (libnuma is OK on CONFIG_CPUMASK_OFFSTACK=y because the sysfs output is *shorter* than expected. I checked the code). With this patch, cpumask_size() becomes based on nr_cpumask_bits, so both getaffinity and sysfs are using the same basis. Do you agree? Rusty. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/5] cpumask: reduce cpumask_size 2010-06-28 10:27 ` Rusty Russell @ 2010-06-28 10:31 ` KOSAKI Motohiro 0 siblings, 0 replies; 4+ messages in thread From: KOSAKI Motohiro @ 2010-06-28 10:31 UTC (permalink / raw) To: Rusty Russell Cc: kosaki.motohiro, Ingo Molnar, linux-kernel, Arnd Bergmann, anton, Mike Travis > On Mon, 28 Jun 2010 12:42:23 pm KOSAKI Motohiro wrote: > > > 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. > > > > I have to say I'm sorry. Probably I broke your assumption. > > If this patch applied, we reintroduce exposing nr_cpu_ids issue and > > break libnuma again. I think following change is necessary too. > > > > Or, Am I missing something? > > I cc'd you because I remembered you being involved in that libnuma issue > and couldn't remember the details. > > Unfortunately, this solution doesn't work: > > > diff --git a/kernel/sched.c b/kernel/sched.c > > index 18faf4d..c14acad 100644 > > --- a/kernel/sched.c > > +++ b/kernel/sched.c > > @@ -4823,7 +4823,9 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, > > > > ret = sched_getaffinity(pid, mask); > > if (ret == 0) { > > - size_t retlen = min_t(size_t, len, cpumask_size()); > > + size_t retlen = min_t(size_t, len, > > + BITS_TO_LONGS(NR_CPUS) * sizeof(long)); > > > > Since mask is a cpumask_var_t, only cpumask_size() is allocated. We can't > copy NR_CPUS bits. Ahh, yes. It's purely broken. > But I think it's OK, anyway. libnuma is broken because it gets upset if the > number of cpus it reads from /sys/.../cpumap is more than the cpumask size > returned from sys_sched_getaffinity. > > Currently, getaffinity returns cpumask_size() (ie. based on NR_CPUS), and > the printing routines use nr_cpumask_bits (ie. based on NR_CPUS for > !CPUMASK_OFFSTACK, nr_cpu_ids for CPUMASK_OFFSTACK). > > (libnuma is OK on CONFIG_CPUMASK_OFFSTACK=y because the sysfs output is > *shorter* than expected. I checked the code). > > With this patch, cpumask_size() becomes based on nr_cpumask_bits, so both > getaffinity and sysfs are using the same basis. > > Do you agree? Sure. I agree I missed. Thank you for very kindful explanation! ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-06-28 10:31 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-06-25 13:05 [PATCH 5/5] cpumask: reduce cpumask_size Rusty Russell 2010-06-28 3:12 ` KOSAKI Motohiro 2010-06-28 10:27 ` Rusty Russell 2010-06-28 10:31 ` KOSAKI Motohiro
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox