From: Christoph Lameter <cl@linux.com>
To: Tejun Heo <tj@kernel.org>
Cc: akpm@linux-foundation.org, Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: linux-kernel@vger.kernel.org
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: [cpuops cmpxchg V2 3/5] irq_work: Use per cpu atomics instead of regular atomics
Date: Tue, 14 Dec 2010 10:28:45 -0600 [thread overview]
Message-ID: <20101214162854.218751478@linux.com> (raw)
In-Reply-To: 20101214162842.542421046@linux.com
[-- Attachment #1: cpuops_cmpxchg_irq --]
[-- Type: text/plain, Size: 2112 bytes --]
The irq work queue is a per cpu object and it is sufficient for
synchronization if per cpu atomics are used. Doing so simplifies
the code and reduces the overhead of the code.
Before:
christoph@linux-2.6$ size kernel/irq_work.o
text data bss dec hex filename
451 8 1 460 1cc kernel/irq_work.o
After:
christoph@linux-2.6$ size kernel/irq_work.o
text data bss dec hex filename
438 8 1 447 1bf kernel/irq_work.o
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Christoph Lameter <cl@linux.com>
---
kernel/irq_work.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
Index: linux-2.6/kernel/irq_work.c
===================================================================
--- linux-2.6.orig/kernel/irq_work.c 2010-12-07 10:24:30.000000000 -0600
+++ linux-2.6/kernel/irq_work.c 2010-12-07 10:26:45.000000000 -0600
@@ -77,21 +77,21 @@ void __weak arch_irq_work_raise(void)
*/
static void __irq_work_queue(struct irq_work *entry)
{
- struct irq_work **head, *next;
+ struct irq_work *next;
- head = &get_cpu_var(irq_work_list);
+ preempt_disable();
do {
- next = *head;
+ next = __this_cpu_read(irq_work_list);
/* Can assign non-atomic because we keep the flags set. */
entry->next = next_flags(next, IRQ_WORK_FLAGS);
- } while (cmpxchg(head, next, entry) != next);
+ } while (this_cpu_cmpxchg(irq_work_list, next, entry) != next);
/* The list was empty, raise self-interrupt to start processing. */
if (!irq_work_next(entry))
arch_irq_work_raise();
- put_cpu_var(irq_work_list);
+ preempt_enable();
}
/*
@@ -120,16 +120,16 @@ EXPORT_SYMBOL_GPL(irq_work_queue);
*/
void irq_work_run(void)
{
- struct irq_work *list, **head;
+ struct irq_work *list;
- head = &__get_cpu_var(irq_work_list);
- if (*head == NULL)
+ if (this_cpu_read(irq_work_list) == NULL)
return;
BUG_ON(!in_irq());
BUG_ON(!irqs_disabled());
- list = xchg(head, NULL);
+ list = this_cpu_xchg(irq_work_list, NULL);
+
while (list != NULL) {
struct irq_work *entry = list;
next prev parent reply other threads:[~2010-12-14 16:29 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-14 16:28 [cpuops cmpxchg V2 0/5] Cmpxchg and xchg operations Christoph Lameter
2010-12-14 16:28 ` [cpuops cmpxchg V2 1/5] percpu: Generic this_cpu_cmpxchg() and this_cpu_xchg support Christoph Lameter
2010-12-17 14:55 ` Tejun Heo
2010-12-14 16:28 ` [cpuops cmpxchg V2 2/5] x86: this_cpu_cmpxchg and this_cpu_xchg operations Christoph Lameter
2010-12-17 15:22 ` Tejun Heo
2010-12-14 16:28 ` Christoph Lameter [this message]
2010-12-15 16:32 ` [cpuops cmpxchg V2 3/5] irq_work: Use per cpu atomics instead of regular atomics Tejun Heo
2010-12-15 16:34 ` H. Peter Anvin
2010-12-15 16:50 ` Peter Zijlstra
2010-12-15 17:04 ` Christoph Lameter
2010-12-15 17:18 ` Peter Zijlstra
2010-12-15 17:31 ` H. Peter Anvin
2010-12-15 17:32 ` Christoph Lameter
2010-12-18 15:32 ` Tejun Heo
2010-12-14 16:28 ` [cpuops cmpxchg V2 4/5] vmstat: User per cpu atomics to avoid interrupt disable / enable Christoph Lameter
2010-12-15 16:45 ` Tejun Heo
2010-12-15 17:01 ` Christoph Lameter
2010-12-14 16:28 ` [cpuops cmpxchg V2 5/5] cpuops: Use cmpxchg for xchg to avoid lock semantics Christoph Lameter
2010-12-14 16:35 ` Mathieu Desnoyers
2010-12-14 16:44 ` Eric Dumazet
2010-12-14 16:55 ` Christoph Lameter
2010-12-14 17:00 ` H. Peter Anvin
2010-12-14 17:19 ` Christoph Lameter
2010-12-14 17:22 ` H. Peter Anvin
2010-12-14 17:29 ` Tejun Heo
2010-12-14 17:35 ` Christoph Lameter
2010-12-15 1:06 ` H. Peter Anvin
2010-12-15 16:29 ` Tejun Heo
2010-12-15 16:35 ` H. Peter Anvin
2010-12-15 16:39 ` Tejun Heo
2010-12-16 16:14 ` Tejun Heo
2010-12-16 18:13 ` x86: Use this_cpu_has for thermal_interrupt Christoph Lameter
2010-12-18 15:35 ` Tejun Heo
2010-12-21 0:56 ` H. Peter Anvin
2010-12-30 11:29 ` Tejun Heo
2010-12-30 18:19 ` H. Peter Anvin
2010-12-31 12:43 ` Tejun Heo
2010-12-16 18:14 ` x86: udelay: Use this_cpu_read to avoid address calculation Christoph Lameter
2010-12-16 18:15 ` gameport: use this_cpu_read instead of lookup Christoph Lameter
2010-12-18 15:34 ` Tejun Heo
2010-12-16 18:16 ` acpi throttling: Use this_cpu_has and simplify code Christoph Lameter
2010-12-18 15:50 ` Tejun Heo
2010-12-21 1:52 ` ykzhao
2010-12-21 22:43 ` Christoph Lameter
2010-12-21 4:28 ` Len Brown
2010-12-16 18:19 ` [cpuops cmpxchg V2 5/5] cpuops: Use cmpxchg for xchg to avoid lock semantics H. Peter Anvin
2010-12-16 18:55 ` Tejun Heo
2010-12-16 20:42 ` H. Peter Anvin
2010-12-15 16:47 ` Tejun Heo
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=20101214162854.218751478@linux.com \
--to=cl@linux.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=tj@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.