Re: [PATCH] scsi: fix sense_slab/bio swapping livelock

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Linus Torvalds <torvalds@...>
Cc: Hugh Dickins <hugh@...>, Peter Zijlstra <a.p.zijlstra@...>, Christoph Lameter <clameter@...>, James Bottomley <James.Bottomley@...>, Andrew Morton <akpm@...>, FUJITA Tomonori <fujita.tomonori@...>, Jens Axboe <jens.axboe@...>, Rafael J. Wysocki <rjw@...>, <linux-kernel@...>
Date: Monday, April 7, 2008 - 6:05 pm

On Tue, 8 Apr 2008, Pekka Enberg wrote:

So something like the following (totally untested) patch modulo the 
pre-allocation bits.

		Pekka

diff --git a/mm/slub.c b/mm/slub.c
index acc975f..e8f7cf3 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -264,6 +264,67 @@ static inline void stat(struct kmem_cache_cpu *c, enum stat_item si)
 #endif
 }
 
+/*
+ * Emergency caches are for GFP_TEMPORARY allocations to dip into when we're
+ * OOM to make sure we can make some progress for writeback.
+ */
+
+#define MIN_EMERGENCY_SIZE 32
+#define NR_EMERGENCY_CACHES 4
+
+struct kmem_cache *emergency_caches[NR_EMERGENCY_CACHES];
+
+static void init_emergency_caches(void)
+{
+	unsigned long size = MIN_EMERGENCY_SIZE;
+	int i;
+
+	for (i = 0; i < NR_EMERGENCY_CACHES; i++) {
+		struct kmem_cache *cache;
+		char *name;
+
+		name = kasprintf(GFP_KERNEL, "kmalloc-%d", 1 << i);
+		BUG_ON(!name);
+
+		cache = kmem_cache_create(name, size, 0, 0, NULL);
+		BUG_ON(!cache);
+		kfree(name);
+
+		emergency_caches[i] = cache;
+
+		size *= 2;
+	}
+}
+
+static struct kmem_cache *lookup_emergency_cache(unsigned long size)
+{
+	unsigned long cache_size = MIN_EMERGENCY_SIZE;
+	int i;
+
+	for (i = 0; i < NR_EMERGENCY_CACHES; i++) {
+		if (size < cache_size)
+			return emergency_caches[i];
+
+		cache_size *= 2;
+	}
+	return NULL;
+}
+
+static void *emergency_alloc(struct kmem_cache *cache, gfp_t gfp)
+{
+	struct kmem_cache *emergency_cache;
+	void *p;
+
+	emergency_cache = lookup_emergency_cache(cache->objsize);
+	if (!emergency_cache)
+		return NULL;
+
+	p = kmem_cache_alloc(emergency_cache, gfp);
+	if (p && cache->ctor)
+		cache->ctor(cache, p);
+	return p;
+}
+
 /********************************************************************
  * 			Core slab cache functions
  *******************************************************************/
@@ -1528,6 +1589,9 @@ new_slab:
 		goto load_freelist;
 	}
 
+	if ((gfpflags & GFP_TEMPORARY) == GFP_TEMPORARY)
+		return emergency_alloc(s, gfpflags);
+
 	/*
 	 * No memory available.
 	 *
@@ -2970,6 +3034,7 @@ void __init kmem_cache_init(void)
 #else
 	kmem_size = sizeof(struct kmem_cache);
 #endif
+	init_emergency_caches();
 
 	printk(KERN_INFO
 		"SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d,"
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Sun Apr 6, 6:56 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Christoph Lameter, (Mon Apr 7, 1:26 am)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 3:40 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Christoph Lameter, (Tue Apr 8, 4:43 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Peter Zijlstra, (Mon Apr 7, 3:55 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 4:31 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 5:00 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 5:05 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 5:30 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 5:36 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Linus Torvalds, (Mon Apr 7, 5:15 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 5:34 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 5:39 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka J Enberg, (Mon Apr 7, 6:05 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Linus Torvalds, (Mon Apr 7, 6:17 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka J Enberg, (Tue Apr 8, 4:42 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Christoph Lameter, (Tue Apr 8, 4:45 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Tue Apr 8, 5:11 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Peter Zijlstra, (Tue Apr 8, 5:40 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Tue Apr 8, 4:44 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Pekka Enberg, (Mon Apr 7, 6:42 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Peter Zijlstra, (Mon Apr 7, 4:47 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, FUJITA Tomonori, (Sun Apr 6, 10:48 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 2:07 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, FUJITA Tomonori, (Tue Apr 8, 10:04 am)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, James Bottomley, (Sun Apr 6, 7:35 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Sun Apr 6, 9:01 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 1:51 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, James Bottomley, (Mon Apr 7, 2:04 pm)
Re: [PATCH] scsi: fix sense_slab/bio swapping livelock, Hugh Dickins, (Mon Apr 7, 2:26 pm)