From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Christoph Lameter <clameter@sgi.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
mingo@redhat.com
Subject: [PATCH] SLUB: use have_arch_cmpxchg()
Date: Wed, 22 Aug 2007 11:02:48 -0400 [thread overview]
Message-ID: <20070822150248.GB8504@Krystal> (raw)
In-Reply-To: <Pine.LNX.4.64.0708211731410.3354@schroedinger.engr.sgi.com>
SLUB: use have_arch_cmpxchg()
* Christoph Lameter (clameter@sgi.com) wrote:
> If we really want to do this then the implementation of all of these
> components need to result in competitive performance on all platforms.
>
Patch 2 of 2
Use have_arch_cmpxchg() to select between irq disable and cmpxchg_local.
Pro:
- Should provide the same performances on architectures that does not provide
fast local_cmpxchg.
- Improved performances on architectures that provide fast local_cmpxchg.
Cons:
- Does not help code readability, i.e.:
if (have_arch_cmpxchg())
preempt_disable();
else
local_irq_save(flags);
It applies on top of the cmpxchg_local() slub patch.
It depends on the Add have_arch_cmpxchg() patch.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
---
mm/slub.c | 65 +++++++++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 46 insertions(+), 19 deletions(-)
Index: slab/mm/slub.c
===================================================================
--- slab.orig/mm/slub.c 2007-08-22 10:28:22.000000000 -0400
+++ slab/mm/slub.c 2007-08-22 10:51:53.000000000 -0400
@@ -1450,7 +1450,8 @@ static void *__slab_alloc(struct kmem_ca
void **freelist = NULL;
unsigned long flags;
- local_irq_save(flags);
+ if (have_arch_cmpxchg())
+ local_irq_save(flags);
c = get_cpu_slab(s, smp_processor_id());
if (!c->page)
/* Slab was flushed */
@@ -1482,7 +1483,8 @@ out_object:
c->freelist = object[c->offset];
out:
slab_unlock(c->page);
- local_irq_restore(flags);
+ if (have_arch_cmpxchg())
+ local_irq_restore(flags);
if (unlikely((gfpflags & __GFP_ZERO)))
memset(object, 0, c->objsize);
return object;
@@ -1525,7 +1527,8 @@ new_slab:
c->page = new;
goto load_freelist;
}
- local_irq_restore(flags);
+ if (have_arch_cmpxchg())
+ local_irq_restore(flags);
return NULL;
debug:
object = c->page->freelist;
@@ -1553,8 +1556,12 @@ static void __always_inline *slab_alloc(
{
void **object;
struct kmem_cache_cpu *c;
+ unsigned long flags;
- preempt_disable();
+ if (have_arch_cmpxchg())
+ preempt_disable();
+ else
+ local_irq_save(flags);
c = get_cpu_slab(s, raw_smp_processor_id());
if (unlikely(!node_match(c, node)))
goto slow;
@@ -1564,15 +1571,21 @@ redo:
if (unlikely(!object))
goto slow;
- if (unlikely(cmpxchg_local(&c->freelist, object,
- object[c->offset]) != object))
- goto redo;
- preempt_enable();
+ if (have_arch_cmpxchg()) {
+ if (unlikely(cmpxchg_local(&c->freelist, object,
+ object[c->offset]) != object))
+ goto redo;
+ preempt_enable();
+ } else {
+ c->freelist = object[c->offset];
+ local_irq_restore(flags);
+ }
if (unlikely((gfpflags & __GFP_ZERO)))
memset(object, 0, c->objsize);
return object;
slow:
- preempt_enable();
+ if (have_arch_cmpxchg())
+ preempt_enable();
return __slab_alloc(s, gfpflags, node, addr);
}
@@ -1605,7 +1618,8 @@ static void __slab_free(struct kmem_cach
void **object = (void *)x;
unsigned long flags;
- local_irq_save(flags);
+ if (have_arch_cmpxchg())
+ local_irq_save(flags);
slab_lock(page);
if (unlikely(SlabDebug(page)))
@@ -1631,7 +1645,8 @@ checks_ok:
out_unlock:
slab_unlock(page);
- local_irq_restore(flags);
+ if (have_arch_cmpxchg())
+ local_irq_restore(flags);
return;
slab_empty:
@@ -1642,7 +1657,8 @@ slab_empty:
remove_partial(s, page);
slab_unlock(page);
- local_irq_restore(flags);
+ if (have_arch_cmpxchg())
+ local_irq_restore(flags);
discard_slab(s, page);
return;
@@ -1669,27 +1685,38 @@ static void __always_inline slab_free(st
void **object = (void *)x;
void **freelist;
struct kmem_cache_cpu *c;
+ unsigned long flags;
- preempt_disable();
+ if (have_arch_cmpxchg())
+ preempt_disable();
+ else
+ local_irq_save(flags);
c = get_cpu_slab(s, raw_smp_processor_id());
if (unlikely(c->node < 0))
goto slow;
redo:
freelist = c->freelist;
- barrier(); /* Read freelist before page, wrt local interrupts */
+ if (have_arch_cmpxchg())
+ barrier(); /* Read freelist before page, wrt local interrupts */
if (unlikely(page != c->page))
goto slow;
object[c->offset] = freelist;
- if (unlikely(cmpxchg_local(&c->freelist,
- freelist, object) != freelist))
- goto redo;
- preempt_enable();
+ if (have_arch_cmpxchg()) {
+ if (unlikely(cmpxchg_local(&c->freelist,
+ freelist, object) != freelist))
+ goto redo;
+ preempt_enable();
+ } else {
+ c->freelist = object;
+ local_irq_restore(flags);
+ }
return;
slow:
- preempt_enable();
+ if (have_arch_cmpxchg())
+ preempt_enable();
__slab_free(s, page, x, addr, c->offset);
}
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2007-08-22 15:03 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-20 20:15 [patch 00/23] cmpxchg_local and cmpxchg64_local implementation Mathieu Desnoyers
2007-08-20 20:15 ` [patch 01/23] Fall back on interrupt disable in cmpxchg8b on 80386 and 80486 Mathieu Desnoyers
2007-08-20 20:32 ` Christoph Lameter
2007-08-20 20:41 ` Mathieu Desnoyers
2007-08-20 20:46 ` Christoph Lameter
2007-08-20 21:29 ` Mathieu Desnoyers
2007-08-20 21:49 ` Christoph Lameter
2007-08-20 21:54 ` Mathieu Desnoyers
2007-08-20 22:07 ` Christoph Lameter
2007-08-20 22:29 ` Mathieu Desnoyers
2007-08-21 17:38 ` [PATCH] SLUB Use cmpxchg() everywhere Mathieu Desnoyers
2007-08-21 17:38 ` [PATCH] SLUB use cmpxchg_local Mathieu Desnoyers
2007-08-21 17:44 ` Mathieu Desnoyers
2007-08-21 21:10 ` Christoph Lameter
2007-08-21 23:21 ` Mathieu Desnoyers
2007-08-21 23:35 ` Christoph Lameter
2007-08-21 23:38 ` Christoph Lameter
2007-08-21 20:41 ` Mathieu Desnoyers
2007-08-21 21:36 ` Christoph Lameter
2007-08-21 21:08 ` Christoph Lameter
2007-08-21 23:12 ` Mathieu Desnoyers
2007-08-21 23:17 ` Christoph Lameter
2007-08-21 23:39 ` Mathieu Desnoyers
2007-08-21 23:41 ` Christoph Lameter
2007-08-21 23:47 ` Mathieu Desnoyers
2007-08-21 23:51 ` Christoph Lameter
2007-08-22 0:03 ` Mathieu Desnoyers
2007-08-22 0:11 ` Christoph Lameter
2007-08-22 0:26 ` Mathieu Desnoyers
2007-08-22 0:34 ` Christoph Lameter
2007-08-22 1:18 ` Mathieu Desnoyers
2007-08-22 15:00 ` [PATCH] define have_arch_cmpxchg() Mathieu Desnoyers
2007-08-22 18:50 ` Christoph Lameter
2007-08-22 15:02 ` Mathieu Desnoyers [this message]
2007-08-22 16:24 ` [PATCH] SLUB: use have_arch_cmpxchg() Pekka Enberg
2007-08-27 14:56 ` Mathieu Desnoyers
2007-08-27 19:43 ` Christoph Lameter
2007-08-27 20:25 ` Mathieu Desnoyers
2007-08-22 1:28 ` [PATCH] SLUB use cmpxchg_local Andi Kleen
2007-08-22 0:38 ` Mathieu Desnoyers
2007-08-22 1:06 ` Christoph Lameter
2007-08-22 1:12 ` Mathieu Desnoyers
2007-08-22 9:39 ` Andi Kleen
2007-08-22 13:45 ` Mathieu Desnoyers
2007-08-22 13:46 ` Andi Kleen
2007-08-22 18:54 ` Christoph Lameter
2007-08-22 19:25 ` Christoph Lameter
2007-08-22 20:09 ` Mathieu Desnoyers
2007-08-22 20:19 ` Christoph Lameter
2007-08-22 20:29 ` Mathieu Desnoyers
2007-08-22 20:33 ` Christoph Lameter
2007-08-22 20:38 ` Christoph Lameter
2007-08-21 23:14 ` Christoph Lameter
2007-08-21 23:23 ` Mathieu Desnoyers
2007-08-21 23:50 ` Mathieu Desnoyers
2007-08-27 6:52 ` Peter Zijlstra
2007-08-27 19:39 ` Christoph Lameter
2007-08-27 20:22 ` Mathieu Desnoyers
2007-08-27 20:26 ` Christoph Lameter
2007-08-27 20:39 ` Mathieu Desnoyers
2007-08-27 21:04 ` Christoph Lameter
2007-08-27 21:10 ` Mathieu Desnoyers
2007-08-27 21:23 ` Christoph Lameter
2007-08-27 21:38 ` Mathieu Desnoyers
2007-08-27 22:12 ` Christoph Lameter
2007-08-27 22:27 ` Mathieu Desnoyers
2007-08-27 22:29 ` Christoph Lameter
2007-08-28 1:26 ` Christoph Lameter
2007-08-28 12:07 ` Mathieu Desnoyers
2007-08-28 19:42 ` Christoph Lameter
2007-09-04 20:02 ` Mathieu Desnoyers
2007-09-04 20:03 ` [PATCH] local_t protection (critical section) Mathieu Desnoyers
2007-09-04 20:04 ` [PATCH] slub - Use local_t protection Mathieu Desnoyers
2007-09-04 20:45 ` Christoph Lameter
2007-09-05 13:03 ` Mathieu Desnoyers
2007-09-05 13:04 ` [PATCH] local_t protection (critical section) Mathieu Desnoyers
2007-09-12 22:33 ` Christoph Lameter
2007-09-12 23:00 ` Mathieu Desnoyers
2007-09-05 13:06 ` [PATCH] slub - Use local_t protection Mathieu Desnoyers
2007-09-12 22:28 ` Christoph Lameter
2007-08-27 22:15 ` [PATCH] SLUB use cmpxchg_local Christoph Lameter
2007-08-28 7:12 ` Peter Zijlstra
2007-08-28 19:36 ` Christoph Lameter
2007-08-28 19:46 ` Peter Zijlstra
2007-08-20 20:15 ` [patch 02/23] Add cmpxchg_local to asm-generic for per cpu atomic operations Mathieu Desnoyers
2007-08-20 20:15 ` [patch 03/23] Add cmpxchg_local to arm Mathieu Desnoyers
2007-08-20 20:15 ` [patch 04/23] Add cmpxchg_local to avr32 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 05/23] Add cmpxchg_local to blackfin, replace __cmpxchg by generic cmpxchg Mathieu Desnoyers
2007-08-20 20:15 ` [patch 06/23] Add cmpxchg_local to cris Mathieu Desnoyers
2007-08-20 20:15 ` [patch 07/23] Add cmpxchg_local to frv Mathieu Desnoyers
2007-08-20 20:15 ` [patch 08/23] Add cmpxchg_local to h8300 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 09/23] Add cmpxchg_local, cmpxchg64 and cmpxchg64_local to ia64 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 10/23] New cmpxchg_local (optimized for UP case) for m32r Mathieu Desnoyers
2007-08-21 9:36 ` Hirokazu Takata
2007-08-20 20:15 ` [patch 11/23] Fix m32r __xchg Mathieu Desnoyers
2007-08-21 9:39 ` Hirokazu Takata
2007-08-20 20:15 ` [patch 12/23] local_t m32r use architecture specific cmpxchg_local Mathieu Desnoyers
2007-08-21 9:34 ` Hirokazu Takata
2007-08-21 14:01 ` Mathieu Desnoyers
2007-08-20 20:15 ` [patch 13/23] Add cmpxchg_local to m86k Mathieu Desnoyers
2007-08-20 20:15 ` [patch 14/23] Add cmpxchg_local to m68knommu Mathieu Desnoyers
2007-08-20 20:15 ` [patch 15/23] Add cmpxchg_local to parisc Mathieu Desnoyers
2007-08-20 20:15 ` [patch 16/23] Add cmpxchg_local to ppc Mathieu Desnoyers
2007-08-20 20:15 ` [patch 17/23] Add cmpxchg_local to s390 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 18/23] Add cmpxchg_local to sh, use generic cmpxchg() instead of cmpxchg_u32 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 19/23] Add cmpxchg_local to sh64 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 20/23] Add cmpxchg_local to sparc, move __cmpxchg to system.h Mathieu Desnoyers
2007-08-20 20:15 ` [patch 21/23] Add cmpxchg_local to sparc64 Mathieu Desnoyers
2007-08-20 23:34 ` Julian Calaby
2007-08-20 23:36 ` Christoph Lameter
2007-08-20 23:42 ` Julian Calaby
2007-08-20 23:43 ` [patch 21/23] Add cmpxchg_local to sparc64 (update) Mathieu Desnoyers
2007-08-20 20:15 ` [patch 22/23] Add cmpxchg_local to v850 Mathieu Desnoyers
2007-08-20 20:15 ` [patch 23/23] Add cmpxchg_local to xtensa Mathieu Desnoyers
2007-08-20 20:29 ` [patch 00/23] cmpxchg_local and cmpxchg64_local implementation Mathieu Desnoyers
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=20070822150248.GB8504@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=akpm@linux-foundation.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.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