From: clameter@sgi.com
To: akpm@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Pekka Enberg <penberg@cs.helsinki.fi>,
suresh.b.siddha@intel.com
Subject: [patch 25/26] SLUB: Add an object counter to the kmem_cache_cpu structure
Date: Mon, 18 Jun 2007 02:59:03 -0700 [thread overview]
Message-ID: <20070618095919.344572612@sgi.com> (raw)
In-Reply-To: <20070618095838.238615343@sgi.com>
[-- Attachment #1: slub_performance_cpuslab_counter --]
[-- Type: text/plain, Size: 4726 bytes --]
The kmem_cache_cpu structure is now 2 1/2 words. Allocation sizes are rounded
to word boundaries so we can place an additional integer in the
kmem_cache_structure without increasing its size.
The counter is useful to keep track of the numbers of objects left in the
lockless per cpu list. If we have this number then the merging of the
per cpu objects back into the slab (when a slab is deactivated) can be very fast
since we have no need anymore to count the objects.
Pros:
- The benefit is that requests to rapidly changing node numbers
from a single processor are improved on NUMA.
Switching from a slab on one node to another becomes faster
since the back spilling of objects is simplified.
Cons:
- Additional need to increase and decrease a counter in slab_alloc
and slab_free. But the counter is in a cacheline already written to
so its cheap to do.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
include/linux/slub_def.h | 1
mm/slub.c | 48 ++++++++++++++++++++++++++++++++++++-----------
2 files changed, 38 insertions(+), 11 deletions(-)
Index: linux-2.6.22-rc4-mm2/include/linux/slub_def.h
===================================================================
--- linux-2.6.22-rc4-mm2.orig/include/linux/slub_def.h 2007-06-17 23:51:36.000000000 -0700
+++ linux-2.6.22-rc4-mm2/include/linux/slub_def.h 2007-06-18 00:45:54.000000000 -0700
@@ -14,6 +14,7 @@
struct kmem_cache_cpu {
void **lockless_freelist;
struct page *page;
+ int objects; /* Saved page->inuse */
int node;
/* Lots of wasted space */
} ____cacheline_aligned_in_smp;
Index: linux-2.6.22-rc4-mm2/mm/slub.c
===================================================================
--- linux-2.6.22-rc4-mm2.orig/mm/slub.c 2007-06-18 00:40:04.000000000 -0700
+++ linux-2.6.22-rc4-mm2/mm/slub.c 2007-06-18 00:45:54.000000000 -0700
@@ -1398,23 +1398,47 @@ static void unfreeze_slab(struct kmem_ca
static void deactivate_slab(struct kmem_cache *s, struct kmem_cache_cpu *c)
{
struct page *page = c->page;
+
/*
* Merge cpu freelist into freelist. Typically we get here
* because both freelists are empty. So this is unlikely
* to occur.
*/
- while (unlikely(c->lockless_freelist)) {
- void **object;
+ if (unlikely(c->lockless_freelist)) {
- /* Retrieve object from cpu_freelist */
- object = c->lockless_freelist;
- c->lockless_freelist = c->lockless_freelist[page->offset];
+ /*
+ * Special case in which no remote frees have occurred.
+ * Then we can simply have the lockless_freelist become
+ * the page->freelist and put the counter back.
+ */
+ if (!page->freelist) {
+ page->freelist = c->lockless_freelist;
+ page->inuse = c->objects;
+ c->lockless_freelist = NULL;
+ } else {
- /* And put onto the regular freelist */
- object[page->offset] = page->freelist;
- page->freelist = object;
- page->inuse--;
+ /*
+ * Objects both on page freelist and cpu freelist.
+ * We need to merge both lists. By doing that
+ * we reverse the object order in the slab.
+ * Sigh. But we rarely get here.
+ */
+ while (c->lockless_freelist) {
+ void **object;
+
+ /* Retrieve object from lockless freelist */
+ object = c->lockless_freelist;
+ c->lockless_freelist =
+ c->lockless_freelist[page->offset];
+
+ /* And put onto the regular freelist */
+ object[page->offset] = page->freelist;
+ page->freelist = object;
+ page->inuse--;
+ }
+ }
}
+
c->page = NULL;
unfreeze_slab(s, page);
}
@@ -1508,6 +1532,7 @@ load_freelist:
object = c->page->freelist;
c->lockless_freelist = object[c->page->offset];
+ c->objects = c->page->inuse + 1;
c->page->inuse = s->objects;
c->page->freelist = NULL;
c->node = page_to_nid(c->page);
@@ -1583,14 +1608,14 @@ static void __always_inline *slab_alloc(
local_irq_save(flags);
c = get_cpu_slab(s, smp_processor_id());
- if (unlikely(!c->page || !c->lockless_freelist ||
- !node_match(c, node)))
+ if (unlikely(!c->lockless_freelist || !node_match(c, node)))
object = __slab_alloc(s, gfpflags, node, addr, c);
else {
object = c->lockless_freelist;
c->lockless_freelist = object[c->page->offset];
+ c->objects++;
}
local_irq_restore(flags);
@@ -1697,6 +1722,7 @@ static void __always_inline slab_free(st
if (likely(page == c->page && !SlabDebug(page))) {
object[page->offset] = c->lockless_freelist;
c->lockless_freelist = object;
+ c->objects--;
} else
__slab_free(s, page, x, addr);
--
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2007-06-18 9:59 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-18 9:58 [patch 00/26] Current slab allocator / SLUB patch queue clameter
2007-06-18 9:58 ` [patch 01/26] SLUB Debug: Fix initial object debug state of NUMA bootstrap objects clameter
2007-06-18 9:58 ` [patch 02/26] Slab allocators: Consolidate code for krealloc in mm/util.c clameter
2007-06-18 20:03 ` Pekka Enberg
2007-06-18 9:58 ` [patch 03/26] Slab allocators: Consistent ZERO_SIZE_PTR support and NULL result semantics clameter
2007-06-18 20:08 ` Pekka Enberg
2007-06-18 9:58 ` [patch 04/26] Slab allocators: Support __GFP_ZERO in all allocators clameter
2007-06-18 10:09 ` Paul Mundt
2007-06-18 16:17 ` Christoph Lameter
2007-06-18 20:11 ` Pekka Enberg
2007-06-18 9:58 ` [patch 05/26] Slab allocators: Cleanup zeroing allocations clameter
2007-06-18 20:16 ` Pekka Enberg
2007-06-18 20:26 ` Pekka Enberg
2007-06-18 22:34 ` Christoph Lameter
2007-06-19 5:48 ` Pekka Enberg
2007-06-18 21:55 ` Christoph Lameter
2007-06-19 21:00 ` Matt Mackall
2007-06-19 22:33 ` Christoph Lameter
2007-06-20 6:14 ` Pekka J Enberg
2007-06-18 9:58 ` [patch 06/26] Slab allocators: Replace explicit zeroing with __GFP_ZERO clameter
2007-06-19 20:55 ` Pekka Enberg
2007-06-28 6:09 ` Andrew Morton
2007-06-18 9:58 ` [patch 07/26] SLUB: Add some more inlines and #ifdef CONFIG_SLUB_DEBUG clameter
2007-06-18 9:58 ` [patch 08/26] SLUB: Extract dma_kmalloc_cache from get_cache clameter
2007-06-18 9:58 ` [patch 09/26] SLUB: Do proper locking during dma slab creation clameter
2007-06-18 9:58 ` [patch 10/26] SLUB: Faster more efficient slab determination for __kmalloc clameter
2007-06-19 20:08 ` Andrew Morton
2007-06-19 22:22 ` Christoph Lameter
2007-06-19 22:29 ` Andrew Morton
2007-06-19 22:38 ` Christoph Lameter
2007-06-19 22:46 ` Andrew Morton
2007-06-25 6:41 ` Nick Piggin
2007-06-18 9:58 ` [patch 11/26] SLUB: Add support for kmem_cache_ops clameter
2007-06-19 20:58 ` Pekka Enberg
2007-06-19 22:32 ` Christoph Lameter
2007-06-18 9:58 ` [patch 12/26] SLUB: Slab defragmentation core clameter
2007-06-26 8:18 ` Andrew Morton
2007-06-26 18:19 ` Christoph Lameter
2007-06-26 18:38 ` Andrew Morton
2007-06-26 18:52 ` Christoph Lameter
2007-06-26 19:13 ` Nish Aravamudan
2007-06-26 19:19 ` Christoph Lameter
2007-06-18 9:58 ` [patch 13/26] SLUB: Extend slabinfo to support -D and -C options clameter
2007-06-18 9:58 ` [patch 14/26] SLUB: Logic to trigger slab defragmentation from memory reclaim clameter
2007-06-18 9:58 ` [patch 15/26] Slab defrag: Support generic defragmentation for inode slab caches clameter
2007-06-26 8:18 ` Andrew Morton
2007-06-26 18:21 ` Christoph Lameter
2007-06-26 19:28 ` Christoph Lameter
2007-06-26 19:37 ` Andrew Morton
2007-06-26 19:41 ` Christoph Lameter
2007-06-18 9:58 ` [patch 16/26] Slab defragmentation: Support defragmentation for extX filesystem inodes clameter
2007-06-18 9:58 ` [patch 17/26] Slab defragmentation: Support inode defragmentation for xfs clameter
2007-06-18 9:58 ` [patch 18/26] Slab defragmentation: Support procfs inode defragmentation clameter
2007-06-18 9:58 ` [patch 19/26] Slab defragmentation: Support reiserfs " clameter
2007-06-18 9:58 ` [patch 20/26] Slab defragmentation: Support inode defragmentation for sockets clameter
2007-06-18 9:58 ` [patch 21/26] Slab defragmentation: support dentry defragmentation clameter
2007-06-26 8:18 ` Andrew Morton
2007-06-26 18:23 ` Christoph Lameter
2007-06-18 9:59 ` [patch 22/26] SLUB: kmem_cache_vacate to support page allocator memory defragmentation clameter
2007-06-18 9:59 ` [patch 23/26] SLUB: Move sysfs operations outside of slub_lock clameter
2007-06-18 9:59 ` [patch 24/26] SLUB: Avoid page struct cacheline bouncing due to remote frees to cpu slab clameter
2007-06-18 9:59 ` clameter [this message]
2007-06-18 9:59 ` [patch 26/26] SLUB: Place kmem_cache_cpu structures in a NUMA aware way clameter
2007-06-19 23:17 ` Christoph Lameter
2007-06-18 11:57 ` [patch 00/26] Current slab allocator / SLUB patch queue Michal Piotrowski
2007-06-18 16:46 ` Christoph Lameter
2007-06-18 17:38 ` Michal Piotrowski
2007-06-18 18:05 ` Christoph Lameter
2007-06-18 18:58 ` Michal Piotrowski
2007-06-18 19:00 ` Christoph Lameter
2007-06-18 19:09 ` Michal Piotrowski
2007-06-18 19:19 ` Christoph Lameter
2007-06-18 20:43 ` Michal Piotrowski
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=20070618095919.344572612@sgi.com \
--to=clameter@sgi.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=penberg@cs.helsinki.fi \
--cc=suresh.b.siddha@intel.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