From: Christoph Lameter <clameter@sgi.com>
To: akpm@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, Pekka Enberg <penberg@cs.helsinki.fi>
Cc: linux-fsdevel@vger.kernel.org
Cc: Mel Gorman <mel@skynet.ie>
Cc: andi@firstfloor.org
Cc: Rik van Riel <riel@redhat.com>
Cc: mpm@selenic.com
Subject: [patch 06/21] slub: Add KICKABLE to avoid repeated kick() attempts
Date: Fri, 09 May 2008 20:08:37 -0700 [thread overview]
Message-ID: <20080510030915.978978961@sgi.com> (raw)
In-Reply-To: <20080510030831.796641881@sgi.com>
[-- Attachment #1: 0006-SLUB-Add-KICKABLE-to-avoid-repeated-kick-attempts.patch --]
[-- Type: text/plain, Size: 3168 bytes --]
Add a flag KICKABLE to be set on slabs with a defragmentation method
Clear the flag if a kick action is not successful in reducing the
number of objects in a slab. This will avoid future attempts to
kick objects out.
The KICKABLE flag is set again when all objects of the slab have been
allocated (Occurs during removal of a slab from the partial lists).
Reviewed-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
---
mm/slub.c | 35 ++++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
Index: linux-2.6/mm/slub.c
===================================================================
--- linux-2.6.orig/mm/slub.c 2008-05-05 18:49:00.043910468 -0700
+++ linux-2.6/mm/slub.c 2008-05-05 18:49:10.851410275 -0700
@@ -103,6 +103,7 @@
*/
#define FROZEN (1 << PG_active)
+#define KICKABLE (1 << PG_dirty)
#ifdef CONFIG_SLUB_DEBUG
#define SLABDEBUG (1 << PG_error)
@@ -140,6 +141,21 @@ static inline void ClearSlabDebug(struct
page->flags &= ~SLABDEBUG;
}
+static inline int SlabKickable(struct page *page)
+{
+ return page->flags & KICKABLE;
+}
+
+static inline void SetSlabKickable(struct page *page)
+{
+ page->flags |= KICKABLE;
+}
+
+static inline void ClearSlabKickable(struct page *page)
+{
+ page->flags &= ~KICKABLE;
+}
+
/*
* Issues still to be resolved:
*
@@ -1163,6 +1179,9 @@ static struct page *new_slab(struct kmem
SLAB_STORE_USER | SLAB_TRACE))
SetSlabDebug(page);
+ if (s->kick)
+ SetSlabKickable(page);
+
start = page_address(page);
if (unlikely(s->flags & SLAB_POISON))
@@ -1203,6 +1222,7 @@ static void __free_slab(struct kmem_cach
NR_SLAB_RECLAIMABLE : NR_SLAB_UNRECLAIMABLE,
-pages);
+ ClearSlabKickable(page);
__ClearPageSlab(page);
reset_page_mapcount(page);
__free_pages(page, order);
@@ -1412,6 +1432,8 @@ static void unfreeze_slab(struct kmem_ca
stat(c, DEACTIVATE_FULL);
if (SlabDebug(page) && (s->flags & SLAB_STORE_USER))
add_full(n, page);
+ if (s->kick)
+ SetSlabKickable(page);
}
slab_unlock(page);
} else {
@@ -2836,7 +2858,7 @@ static int kmem_cache_vacate(struct page
s = page->slab;
objects = page->objects;
map = scratch + objects * sizeof(void **);
- if (!page->inuse || !s->kick)
+ if (!page->inuse || !s->kick || !SlabKickable(page))
goto out;
/* Determine used objects */
@@ -2874,6 +2896,9 @@ out:
* Check the result and unfreeze the slab
*/
leftover = page->inuse;
+ if (leftover)
+ /* Unsuccessful reclaim. Avoid future reclaim attempts. */
+ ClearSlabKickable(page);
unfreeze_slab(s, page, leftover > 0);
local_irq_restore(flags);
return leftover;
@@ -2930,10 +2955,14 @@ static unsigned long __kmem_cache_shrink
continue;
if (page->inuse) {
- if (page->inuse * 100 >=
+ if (!SlabKickable(page) || page->inuse * 100 >=
s->defrag_ratio * page->objects) {
slab_unlock(page);
- /* Slab contains enough objects */
+ /*
+ * Slab contains enough objects
+ * or we alrady tried reclaim before and
+ * it failed. Skip this one.
+ */
continue;
}
--
next prev parent reply other threads:[~2008-05-10 3:11 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-10 3:08 [patch 00/21] Slab Fragmentation Reduction V12 Christoph Lameter
2008-05-10 3:08 ` [patch 01/21] slub: Add defrag_ratio field and sysfs support Christoph Lameter
2008-05-10 3:08 ` [patch 02/21] slub: Replace ctor field with ops field in /sys/slab/* Christoph Lameter
2008-05-10 3:08 ` [patch 03/21] slub: Add get() and kick() methods Christoph Lameter
2008-05-10 3:08 ` [patch 04/21] slub: Sort slab cache list and establish maximum objects for defrag slabs Christoph Lameter
2008-05-10 3:08 ` [patch 05/21] slub: Slab defrag core Christoph Lameter
2008-05-10 3:08 ` Christoph Lameter [this message]
2008-05-10 3:08 ` [patch 07/21] slub: Extend slabinfo to support -D and -F options Christoph Lameter
2008-05-10 3:08 ` [patch 08/21] slub: add defrag statistics Christoph Lameter
2008-05-10 3:08 ` [patch 09/21] slub: Trigger defragmentation from memory reclaim Christoph Lameter
2008-05-10 3:08 ` [patch 10/21] buffer heads: Support slab defrag Christoph Lameter
2008-05-12 0:24 ` David Chinner
2008-05-15 17:42 ` Christoph Lameter
2008-05-15 23:10 ` David Chinner
2008-05-16 17:01 ` Christoph Lameter
2008-05-19 5:45 ` David Chinner
2008-05-19 16:44 ` Christoph Lameter
2008-05-20 0:25 ` David Chinner
2008-05-20 6:56 ` Evgeniy Polyakov
2008-05-20 21:46 ` David Chinner
2008-05-20 22:25 ` Evgeniy Polyakov
2008-05-20 23:19 ` David Chinner
2008-05-20 23:28 ` Andrew Morton
2008-05-21 6:15 ` Evgeniy Polyakov
2008-05-21 6:24 ` Andrew Morton
2008-05-21 17:52 ` iput() in reclaim context Hugh Dickins
2008-05-21 17:58 ` Evgeniy Polyakov
2008-05-21 18:12 ` Andrew Morton
2008-05-20 23:22 ` [patch 10/21] buffer heads: Support slab defrag Evgeniy Polyakov
2008-05-20 23:30 ` David Chinner
2008-05-21 6:20 ` Evgeniy Polyakov
2008-05-21 1:56 ` Christoph Lameter
2008-05-20 22:53 ` Jamie Lokier
2008-05-10 3:08 ` [patch 11/21] inodes: Support generic defragmentation Christoph Lameter
2008-05-10 3:08 ` [patch 12/21] Filesystem: Ext2 filesystem defrag Christoph Lameter
2008-05-10 3:08 ` [patch 13/21] Filesystem: Ext3 " Christoph Lameter
2008-05-10 3:08 ` [patch 14/21] Filesystem: Ext4 " Christoph Lameter
2008-05-10 3:08 ` [patch 15/21] Filesystem: XFS slab defragmentation Christoph Lameter
2008-05-10 6:55 ` Christoph Hellwig
2008-05-10 3:08 ` [patch 16/21] Filesystem: /proc filesystem support for slab defrag Christoph Lameter
2008-05-10 3:08 ` [patch 17/21] Filesystem: Slab defrag: Reiserfs support Christoph Lameter
2008-05-10 3:08 ` [patch 18/21] Filesystem: Socket inode defragmentation Christoph Lameter
2008-05-13 13:28 ` Evgeniy Polyakov
2008-05-15 17:40 ` Christoph Lameter
2008-05-15 18:23 ` Evgeniy Polyakov
2008-05-10 3:08 ` [patch 19/21] dentries: Add constructor Christoph Lameter
2008-05-10 3:08 ` [patch 20/21] dentries: dentry defragmentation Christoph Lameter
2008-05-10 3:08 ` [patch 21/21] slab defrag: Obsolete SLAB Christoph Lameter
2008-05-10 9:53 ` Andi Kleen
2008-05-11 2:15 ` Rik van Riel
2008-05-12 7:38 ` KOSAKI Motohiro
2008-05-12 7:54 ` Pekka Enberg
2008-05-12 10:08 ` Andi Kleen
2008-05-12 10:23 ` Pekka Enberg
2008-05-14 17:30 ` Christoph Lameter
2008-05-14 17:29 ` Christoph Lameter
2008-05-14 17:49 ` Andi Kleen
2008-05-14 18:03 ` Christoph Lameter
2008-05-14 18:18 ` Matt Mackall
2008-05-14 19:21 ` Christoph Lameter
2008-05-14 19:49 ` Matt Mackall
2008-05-14 20:33 ` Christoph Lameter
2008-05-14 21:02 ` Matt Mackall
2008-05-14 21:26 ` Christoph Lameter
2008-05-14 21:54 ` Matt Mackall
2008-05-15 17:15 ` Christoph Lameter
2008-05-15 3:26 ` Zhang, Yanmin
2008-05-15 17:05 ` Christoph Lameter
2008-05-15 17:49 ` Matthew Wilcox
2008-05-15 17:58 ` Christoph Lameter
2008-05-15 18:13 ` Matthew Wilcox
2008-05-15 18:43 ` Christoph Lameter
2008-05-15 18:51 ` Matthew Wilcox
2008-05-15 19:09 ` Christoph Lameter
2008-05-15 19:29 ` Matthew Wilcox
2008-05-15 20:14 ` Matthew Wilcox
2008-05-15 20:30 ` Pekka Enberg
2008-05-16 19:17 ` Christoph Lameter
2008-05-16 19:06 ` Christoph Lameter
2008-05-15 18:19 ` Eric Dumazet
2008-05-15 18:29 ` Vegard Nossum
2008-05-16 5:16 ` Zhang, Yanmin
2008-05-14 18:05 ` Christoph Lameter
2008-05-14 20:46 ` Christoph Lameter
2008-05-14 20:58 ` Matthew Wilcox
2008-05-14 21:00 ` Christoph Lameter
2008-05-14 21:21 ` Matthew Wilcox
2008-05-14 21:33 ` Christoph Lameter
2008-05-14 21:43 ` Matthew Wilcox
2008-05-14 21:53 ` Christoph Lameter
2008-05-14 22:00 ` Matthew Wilcox
2008-05-14 22:32 ` Christoph Lameter
2008-05-14 22:34 ` Christoph Lameter
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=20080510030915.978978961@sgi.com \
--to=clameter@sgi.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=penberg@cs.helsinki.fi \
/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
all inboxes | Powered by JetHome®