[PATCH] Slub Freeoffset check overflow (updated)

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Mathieu Desnoyers
Date: Monday, March 3, 2008 - 11:17 pm

Check for overflow of the freeoffset version number.

I just thought adding this check in CONFIG_SLUB_DEBUG makes sense. It's
really unlikely that enough interrupt handlers will nest over the slub
fast path, and each of them do about a million alloc/free on 32 bits or
a huge amount of alloc/free on 64 bits, but just in case, it seems good
to warn if we detect we are half-way to a version overflow.

Changelog :
- Mask out the LSB because of alloc fast path. See comment in source.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
---
 mm/slub.c |   40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

Index: linux-2.6-lttng/mm/slub.c
===================================================================
--- linux-2.6-lttng.orig/mm/slub.c	2008-03-04 00:59:01.000000000 -0500
+++ linux-2.6-lttng/mm/slub.c	2008-03-04 01:03:44.000000000 -0500
@@ -1660,7 +1660,7 @@ static __always_inline void *slab_alloc(
  */
 
 #ifdef SLUB_FASTPATH
-	unsigned long freeoffset, newoffset;
+	unsigned long freeoffset, newoffset, resoffset;
 
 	c = get_cpu_slab(s, raw_smp_processor_id());
 	do {
@@ -1682,8 +1682,22 @@ static __always_inline void *slab_alloc(
 		newoffset = freeoffset;
 		newoffset &= ~c->off_mask;
 		newoffset |= (unsigned long)object[c->offset] & c->off_mask;
-	} while (cmpxchg_local(&c->freeoffset, freeoffset, newoffset)
-			!= freeoffset);
+		resoffset = cmpxchg_local(&c->freeoffset, freeoffset,
+				newoffset);
+#ifdef CONFIG_SLUB_DEBUG
+		/*
+		 * Just to be paranoid : warn if we detect that enough free or
+		 * slow paths nested on top of us to get the counter to go
+		 * half-way to overflow. That would be insane to do that much
+		 * allocations/free in interrupt handers, but check it anyway.
+		 * Mask out the LSBs because alloc fast path does not increment
+		 * the sequence number, which may cause the overall values to go
+		 * backward.
+		 */
+		WARN_ON((resoffset & ~c->off_mask)
+			- (freeoffset & ~c->off_mask) > -1UL >> 1);
+#endif
+	} while (resoffset != freeoffset);
 #else
 	unsigned long flags;
 
@@ -1822,7 +1836,7 @@ static __always_inline void slab_free(st
 	struct kmem_cache_cpu *c;
 
 #ifdef SLUB_FASTPATH
-	unsigned long freeoffset, newoffset;
+	unsigned long freeoffset, newoffset, resoffset;
 
 	c = get_cpu_slab(s, raw_smp_processor_id());
 	debug_check_no_locks_freed(object, s->objsize);
@@ -1850,8 +1864,22 @@ static __always_inline void slab_free(st
 		newoffset = freeoffset + c->off_mask + 1;
 		newoffset &= ~c->off_mask;
 		newoffset |= (unsigned long)object & c->off_mask;
-	} while (cmpxchg_local(&c->freeoffset, freeoffset, newoffset)
-			!= freeoffset);
+		resoffset = cmpxchg_local(&c->freeoffset, freeoffset,
+				newoffset);
+#ifdef CONFIG_SLUB_DEBUG
+		/*
+		 * Just to be paranoid : warn if we detect that enough free or
+		 * slow paths nested on top of us to get the counter to go
+		 * half-way to overflow. That would be insane to do that much
+		 * allocations/free in interrupt handers, but check it anyway.
+		 * Mask out the LSBs because alloc fast path does not increment
+		 * the sequence number, which may cause the overall values to go
+		 * backward.
+		 */
+		WARN_ON((resoffset & ~c->off_mask)
+			- (freeoffset & ~c->off_mask) > -1UL >> 1);
+#endif
+	} while (resoffset != freeoffset);
 #else
 	unsigned long flags;
 
-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Linux 2.6.25-rc2, Linus Torvalds, (Fri Feb 15, 2:23 pm)
Re: Linux 2.6.25-rc2, Rafael J. Wysocki, (Fri Feb 15, 7:08 pm)
[BUG] Linux 2.6.25-rc2 - Kernel Ooops while running dbench, Kamalesh Babulal, (Fri Feb 15, 10:44 pm)
[BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-git1 s ..., Kamalesh Babulal, (Fri Feb 15, 11:10 pm)
Re: Linux 2.6.25-rc2, Jan Engelhardt, (Sat Feb 16, 9:52 am)
Linux 2.6.25-rc2 regression: LVM cannot find volume group, Tilman Schmidt, (Sat Feb 16, 12:14 pm)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Sat Feb 16, 2:38 pm)
Re: [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-gi ..., Rafael J. Wysocki, (Sun Feb 17, 1:08 pm)
Re: Linux 2.6.25-rc2, Rafael J. Wysocki, (Sun Feb 17, 1:25 pm)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Sun Feb 17, 2:32 pm)
Re: Linux 2.6.25-rc2, Linus Torvalds, (Mon Feb 18, 4:54 pm)
Re: Linux 2.6.25-rc2 regression: LVM cannot find volume group, Alasdair G Kergon, (Mon Feb 18, 6:53 pm)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Mon Feb 18, 11:11 pm)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Mon Feb 18, 11:44 pm)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Mon Feb 18, 11:54 pm)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 12:21 am)
Re: [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-gi ..., KAMEZAWA Hiroyuki, (Tue Feb 19, 1:04 am)
Re: [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-gi ..., KAMEZAWA Hiroyuki, (Tue Feb 19, 1:47 am)
Re: [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-gi ..., KAMEZAWA Hiroyuki, (Tue Feb 19, 2:02 am)
Re: [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-gi ..., KAMEZAWA Hiroyuki, (Tue Feb 19, 2:07 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 3:27 am)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 3:45 am)
Re: Linux 2.6.25-rc2, Mathieu Desnoyers, (Tue Feb 19, 6:02 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 7:00 am)
Re: Linux 2.6.25-rc2, Mathieu Desnoyers, (Tue Feb 19, 7:02 am)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 7:21 am)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 7:38 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 7:55 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 7:57 am)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 8:52 am)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Tue Feb 19, 8:54 am)
Re: Linux 2.6.25-rc2, Linus Torvalds, (Tue Feb 19, 9:20 am)
Re: Linux 2.6.25-rc2, Eric Dumazet, (Tue Feb 19, 9:27 am)
Re: Linux 2.6.25-rc2, Linus Torvalds, (Tue Feb 19, 9:38 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 9:45 am)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Tue Feb 19, 9:48 am)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Tue Feb 19, 11:39 am)
Re: Linux 2.6.25-rc2, Torsten Kaiser, (Tue Feb 19, 12:27 pm)
Re: Linux 2.6.25-rc2, Mathieu Desnoyers, (Tue Feb 19, 1:03 pm)
Re: Linux 2.6.25-rc2, Mathieu Desnoyers, (Tue Feb 19, 1:08 pm)
Re: Linux 2.6.25-rc2, Zhang, Yanmin, (Tue Feb 19, 5:36 pm)
Re: Linux 2.6.25-rc2, Zhang, Yanmin, (Tue Feb 19, 7:08 pm)
Re: Linux 2.6.25-rc2, Zhang, Yanmin, (Tue Feb 19, 11:53 pm)
Re: Linux 2.6.25-rc2, Pekka Enberg, (Wed Feb 20, 12:10 am)
Re: Linux 2.6.25-rc2, Christoph Lameter, (Wed Feb 27, 4:32 pm)
Re: Linux 2.6.25-rc2, Christoph Lameter, (Wed Feb 27, 4:32 pm)
Re: Linux 2.6.25-rc2, Christoph Lameter, (Wed Feb 27, 4:34 pm)
Re: Linux 2.6.25-rc2, Andrew Morton, (Wed Feb 27, 6:57 pm)
Re: Linux 2.6.25-rc2, Christoph Lameter, (Wed Feb 27, 7:43 pm)
[PATCH] Implement slub fastpath in terms of freebase and f ..., Mathieu Desnoyers, (Wed Feb 27, 10:55 pm)
Re: Linux 2.6.25-rc2, Ingo Molnar, (Thu Feb 28, 1:14 am)
Re: Linux 2.6.25-rc2, Jiri Kosina, (Thu Feb 28, 4:13 am)
Re: Linux 2.6.25-rc2, Alan Cox, (Thu Feb 28, 4:15 am)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Christoph Lameter, (Thu Feb 28, 12:08 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Mathieu Desnoyers, (Thu Feb 28, 4:25 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Christoph Lameter, (Thu Feb 28, 5:57 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Mathieu Desnoyers, (Thu Feb 28, 6:56 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Christoph Lameter, (Thu Feb 28, 7:12 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Mathieu Desnoyers, (Thu Feb 28, 8:32 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Christoph Lameter, (Thu Feb 28, 10:11 pm)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Mathieu Desnoyers, (Fri Feb 29, 6:03 am)
[PATCH] Slub Freeoffset check overflow, Mathieu Desnoyers, (Fri Feb 29, 6:28 am)
Re: [PATCH] Implement slub fastpath in terms of freebase a ..., Christoph Lameter, (Fri Feb 29, 12:57 pm)
[PATCH] Slub Freeoffset check overflow (updated), Mathieu Desnoyers, (Mon Mar 3, 11:17 pm)
Re: [PATCH] Slub Freeoffset check overflow (updated), Christoph Lameter, (Tue Mar 4, 12:15 am)