From: Ingo Molnar <mingo@elte.hu>
To: Christoph Lameter <clameter@sgi.com>
Cc: Michal Piotrowski <michal.k.k.piotrowski@gmail.com>,
Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org
Subject: Re: 2.6.16-rc6-mm2
Date: Mon, 12 Jun 2006 13:48:57 +0200 [thread overview]
Message-ID: <20060612114857.GA14616@elte.hu> (raw)
In-Reply-To: <20060612110537.GA11358@elte.hu>
* Ingo Molnar <mingo@elte.hu> wrote:
>
> * Christoph Lameter <clameter@sgi.com> wrote:
>
> > Sorry that patch was still against mm1. Here is a fixed up version
> > that applies cleanly against mm2:
>
> i have applied both patches you sent in this thread but it still
> triggers tons of messages:
> trying to fix it i realized that i'd have to touch tons of
> architectures, which all duplicate this piece of code:
below is an updated patch that includes fixups for i386 - but the real
fix should be to properly reduce the per-arch local.h footprint to the
bare minimum possible, and to do this fix on the asm-generic headers.
Ingo
---
include/asm-generic/local.h | 20 ++++++++++----------
include/asm-i386/local.h | 25 ++++++++++++++-----------
include/linux/page-flags.h | 14 +++++---------
mm/page_alloc.c | 8 ++++----
4 files changed, 33 insertions(+), 34 deletions(-)
Index: linux/include/asm-generic/local.h
===================================================================
--- linux.orig/include/asm-generic/local.h
+++ linux/include/asm-generic/local.h
@@ -44,19 +44,19 @@ typedef struct
* much more efficient than these naive implementations. Note they take
* a variable (eg. mystruct.foo), not an address.
*/
-#define cpu_local_read(v) local_read(&__get_cpu_var(v))
-#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i))
-#define cpu_local_inc(v) local_inc(&__get_cpu_var(v))
-#define cpu_local_dec(v) local_dec(&__get_cpu_var(v))
-#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v))
-#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v))
+#define cpu_local_read(v) local_read(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_set(v, i) local_set(&per_cpu(v, raw_smp_processor_id()), (i))
+#define cpu_local_inc(v) local_inc(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_dec(v) local_dec(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_add(i, v) local_add((i), &per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_sub(i, v) local_sub((i), &per_cpu(v, raw_smp_processor_id()))
/* Non-atomic increments, ie. preemption disabled and won't be touched
* in interrupt, etc. Some archs can optimize this case well.
*/
-#define __cpu_local_inc(v) __local_inc(&__get_cpu_var(v))
-#define __cpu_local_dec(v) __local_dec(&__get_cpu_var(v))
-#define __cpu_local_add(i, v) __local_add((i), &__get_cpu_var(v))
-#define __cpu_local_sub(i, v) __local_sub((i), &__get_cpu_var(v))
+#define __cpu_local_inc(v) __local_inc(&per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_dec(v) __local_dec(&per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_add(i, v) __local_add((i), &per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_sub(i, v) __local_sub((i), &per_cpu(v, raw_smp_processor_id()))
#endif /* _ASM_GENERIC_LOCAL_H */
Index: linux/include/asm-i386/local.h
===================================================================
--- linux.orig/include/asm-i386/local.h
+++ linux/include/asm-i386/local.h
@@ -53,18 +53,21 @@ static __inline__ void local_sub(long i,
/* Use these for per-cpu local_t variables: on some archs they are
* much more efficient than these naive implementations. Note they take
- * a variable, not an address.
+ * a variable (eg. mystruct.foo), not an address.
*/
-#define cpu_local_read(v) local_read(&__get_cpu_var(v))
-#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i))
-#define cpu_local_inc(v) local_inc(&__get_cpu_var(v))
-#define cpu_local_dec(v) local_dec(&__get_cpu_var(v))
-#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v))
-#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v))
+#define cpu_local_read(v) local_read(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_set(v, i) local_set(&per_cpu(v, raw_smp_processor_id()), (i))
+#define cpu_local_inc(v) local_inc(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_dec(v) local_dec(&per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_add(i, v) local_add((i), &per_cpu(v, raw_smp_processor_id()))
+#define cpu_local_sub(i, v) local_sub((i), &per_cpu(v, raw_smp_processor_id()))
-#define __cpu_local_inc(v) cpu_local_inc(v)
-#define __cpu_local_dec(v) cpu_local_dec(v)
-#define __cpu_local_add(i, v) cpu_local_add((i), (v))
-#define __cpu_local_sub(i, v) cpu_local_sub((i), (v))
+/* Non-atomic increments, ie. preemption disabled and won't be touched
+ * in interrupt, etc. Some archs can optimize this case well.
+ */
+#define __cpu_local_inc(v) __local_inc(&per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_dec(v) __local_dec(&per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_add(i, v) __local_add((i), &per_cpu(v, raw_smp_processor_id()))
+#define __cpu_local_sub(i, v) __local_sub((i), &per_cpu(v, raw_smp_processor_id()))
#endif /* _ARCH_I386_LOCAL_H */
Index: linux/include/linux/page-flags.h
===================================================================
--- linux.orig/include/linux/page-flags.h
+++ linux/include/linux/page-flags.h
@@ -8,7 +8,7 @@
#include <linux/percpu.h>
#include <linux/cache.h>
#include <linux/types.h>
-
+#include <asm/local.h>
#include <asm/pgtable.h>
/*
@@ -108,10 +108,6 @@
/*
* Light weight per cpu counter implementation.
*
- * Note that these can race. We do not bother to enable preemption
- * or care about interrupt races. All we care about is to have some
- * approximate count of events.
- *
* Counters should only be incremented and no critical kernel component
* should rely on the counter values.
*
@@ -134,24 +130,24 @@ enum vm_event_item { PGPGIN, PGPGOUT, PS
};
struct vm_event_state {
- unsigned long event[NR_VM_EVENT_ITEMS];
+ local_t event[NR_VM_EVENT_ITEMS];
};
DECLARE_PER_CPU(struct vm_event_state, vm_event_states);
static inline unsigned long get_cpu_vm_events(enum vm_event_item item)
{
- return __get_cpu_var(vm_event_states).event[item];
+ return cpu_local_read(vm_event_states.event[item]);
}
static inline void count_vm_event(enum vm_event_item item)
{
- __get_cpu_var(vm_event_states).event[item]++;
+ cpu_local_inc(vm_event_states.event[item]);
}
static inline void count_vm_events(enum vm_event_item item, long delta)
{
- __get_cpu_var(vm_event_states).event[item] += delta;
+ cpu_local_add(delta, vm_event_states.event[item]);
}
extern void all_vm_events(unsigned long *);
Index: linux/mm/page_alloc.c
===================================================================
--- linux.orig/mm/page_alloc.c
+++ linux/mm/page_alloc.c
@@ -1583,7 +1583,7 @@ static void show_node(struct zone *zone)
#endif
#ifdef CONFIG_VM_EVENT_COUNTERS
-DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}};
+DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{LOCAL_INIT(0)}};
EXPORT_PER_CPU_SYMBOL(vm_event_states);
static void sum_vm_events(unsigned long *ret, cpumask_t *cpumask)
@@ -1604,7 +1604,7 @@ static void sum_vm_events(unsigned long
for (i=0; i< NR_VM_EVENT_ITEMS; i++)
- ret[i] += this->event[i];
+ ret[i] += local_read(&this->event[i]);
}
}
@@ -2881,8 +2881,8 @@ static void vm_events_fold_cpu(int cpu)
int i;
for (i = 0; i < NR_VM_EVENT_ITEMS; i++) {
- count_vm_events(i, fold_state->event[i]);
- fold_state->event[i] = 0;
+ count_vm_events(i, local_read(&fold_state->event[i]));
+ local_set(&fold_state->event[i], 0);
}
}
next prev parent reply other threads:[~2006-06-12 11:49 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-10 4:40 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 10:23 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 16:24 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 16:43 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 16:51 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 17:03 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 18:04 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 18:14 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 18:31 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 18:35 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-12 11:05 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 11:48 ` Ingo Molnar [this message]
2006-06-12 12:14 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-12 13:07 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 13:41 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 3:28 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-13 4:56 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 5:08 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-13 5:18 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 5:43 ` 2.6.16-rc6-mm2 Nick Piggin
2006-06-13 5:48 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 11:45 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 12:41 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-12 16:37 ` broken local_t on i386 Christoph Lameter
2006-06-12 16:48 ` Andi Kleen
2006-06-12 16:54 ` Christoph Lameter
2006-06-12 17:06 ` Andi Kleen
2006-06-12 17:11 ` Christoph Lameter
2006-06-12 17:29 ` Andi Kleen
2006-06-12 18:14 ` Lee Revell
2006-06-12 18:46 ` Alan Cox
2006-06-12 18:27 ` Christoph Lameter
2006-06-12 17:35 ` Andi Kleen
2006-06-12 18:42 ` Christoph Lameter
2006-06-12 17:55 ` Andi Kleen
2006-06-12 18:59 ` Christoph Lameter
2006-06-12 18:11 ` Andi Kleen
2006-06-12 19:15 ` Christoph Lameter
2006-06-13 3:36 ` Andi Kleen
2006-06-12 20:12 ` Alan Cox
2006-06-13 4:02 ` Andi Kleen
2006-06-12 13:50 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-12 14:20 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 14:57 ` 2.6.16-rc6-mm2 Michal Piotrowski
[not found] ` <6bffcb0e0606101126v55cc20dbk275d8aa7fdcb0f1a@mail.gmail.com>
2006-06-10 18:36 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 19:08 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 16:58 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 14:56 ` 2.6.16-rc6-mm2 Martin J. Bligh
2006-06-10 16:43 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 16:18 ` 2.6.16-rc6-mm2 Dominik Karall
2006-06-10 16:25 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 17:42 ` 2.6.16-rc6-mm2 Dominik Karall
2006-06-10 18:43 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-06-11 10:17 ` 2.6.16-rc6-mm2 Jan Engelhardt
2006-06-11 10:58 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-06-12 16:56 ` 2.6.16-rc6-mm2 Zan Lynx
2006-06-12 17:35 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-12 22:16 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 0:24 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-14 21:56 ` 2.6.16-rc6-mm2 Trond Myklebust
2006-06-13 7:22 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-13 17:54 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 19:35 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 20:22 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-13 21:13 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 21:50 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-12 18:19 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-13 13:54 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 17:04 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-12 22:09 ` 2.6.16-rc6-mm2 Steve Fox
2006-06-13 13:54 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 14:10 ` 2.6.16-rc6-mm2 Sergei Shtylyov
2006-06-13 19:01 ` 2.6.16-rc6-mm2 Steve Fox
2006-06-13 21:43 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 21:51 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-13 22:36 ` 2.6.16-rc6-mm2 Steve Fox
-- strict thread matches above, loose matches on Subject: below --
2006-03-18 12:40 2.6.16-rc6-mm2 Andrew Morton
2006-03-18 20:21 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-03-18 20:54 ` 2.6.16-rc6-mm2 Andrew Morton
2006-03-18 21:24 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-03-22 8:41 ` 2.6.16-rc6-mm2 J.A. Magallon
2006-03-22 8:48 ` 2.6.16-rc6-mm2 Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060612114857.GA14616@elte.hu \
--to=mingo@elte.hu \
--cc=akpm@osdl.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.k.k.piotrowski@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox