Skip to contentSkip to conversation

bootmem.c cleanup

PATCH In review Michael Buesch 4 participants 5 messages May 14, 2004 – May 18, 2004

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 bootmem.c cleanup

Hi,

This patch does some cleanup in mm/bootmem.c . It replaces some if (...) BUG(); with BUG_ON(...);, and fixes a typo.

Some comment on my own patch:
BUG() already dumps the stack, so we needn't call
dump_stack() here, correct?
@@ -152,7 +147,6 @@

if(!size) {
printk("__alloc_bootmem_core(): zero-sized request\n");
- dump_stack();
BUG();
}
BUG_ON(align & (align-1));

Signature · 85 lines
Regards Michael Buesch  [ http://www.tuxsoft.de.vu ]





--- linux-2.6.6/mm/bootmem.c.orig	2004-05-14 21:55:00.000000000 +0200
+++ linux-2.6.6/mm/bootmem.c	2004-05-14 21:55:15.000000000 +0200
@@ -82,14 +82,11 @@
 							PAGE_SIZE-1)/PAGE_SIZE;
 	unsigned long end = (addr + size + PAGE_SIZE-1)/PAGE_SIZE;
 
-	if (!size) BUG();
+	BUG_ON(!size);
+	BUG_ON(sidx >= eidx);
+	BUG_ON((addr >> PAGE_SHIFT) >= bdata->node_low_pfn);
+	BUG_ON(end > bdata->node_low_pfn);
 
-	if (sidx >= eidx)
-		BUG();
-	if ((addr >> PAGE_SHIFT) >= bdata->node_low_pfn)
-		BUG();
-	if (end > bdata->node_low_pfn)
-		BUG();
 	for (i = sidx; i < eidx; i++)
 		if (test_and_set_bit(i, bdata->node_bootmem_map)) {
 #ifdef CONFIG_DEBUG_BOOTMEM
@@ -110,9 +107,8 @@
 	unsigned long eidx = (addr + size - bdata->node_boot_start)/PAGE_SIZE;
 	unsigned long end = (addr + size)/PAGE_SIZE;
 
-	if (!size) BUG();
-	if (end > bdata->node_low_pfn)
-		BUG();
+	BUG_ON(!size);
+	BUG_ON(end > bdata->node_low_pfn);
 
 	if (addr < bdata->last_success)
 		bdata->last_success = addr;
@@ -124,8 +120,7 @@
 	sidx = start - (bdata->node_boot_start/PAGE_SIZE);
 
 	for (i = sidx; i < eidx; i++) {
-		if (!test_and_clear_bit(i, bdata->node_bootmem_map))
-			BUG();
+		BUG_ON(!test_and_clear_bit(i, bdata->node_bootmem_map));
 	}
 }
 
@@ -140,7 +135,7 @@
  *
  * alignment has to be a power of 2 value.
  *
- * NOTE:  This function is _not_ reenetrant.
+ * NOTE:  This function is _not_ reentrant.
  */
 static void * __init
 __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
@@ -152,7 +147,6 @@
 
 	if(!size) {
 		printk("__alloc_bootmem_core(): zero-sized request\n");
-		dump_stack();
 		BUG();
 	}
 	BUG_ON(align & (align-1));
@@ -246,8 +240,7 @@
 	 * Reserve the area now:
 	 */
 	for (i = start; i < start+areasize; i++)
-		if (unlikely(test_and_set_bit(i, bdata->node_bootmem_map)))
-			BUG();
+		BUG_ON(test_and_set_bit(i, bdata->node_bootmem_map));
 	memset(ret, 0, size);
 	return ret;
 }
@@ -260,7 +253,7 @@
 	unsigned long idx;
 	unsigned long *map; 
 
-	if (!bdata->node_bootmem_map) BUG();
+	BUG_ON(!bdata->node_bootmem_map);
 
 	count = 0;
 	/* first extant page of the node */
#1 lore raw
Quoted 4 lines · Michael Buesch

- if (!test_and_clear_bit(i, bdata->node_bootmem_map))
- BUG();
+ BUG_ON(!test_and_clear_bit(i, bdata->node_bootmem_map));

Please don't put expressions whihc actually change state inside BUG_ON(). Someone may decide to make BUG_ON() a no-op to save space.

I'm not aware of anyone actually trying that, but it's a good objective.

#2 lore raw
Quoted 4 lines · you

Please don't put expressions whihc actually change state inside BUG_ON(). Someone may decide to make BUG_ON() a no-op to save space.

I'm not aware of anyone actually trying that, but it's a good objective.

Ok, so what about the following?

Signature · 73 lines
Regards Michael Buesch  [ http://www.tuxsoft.de.vu ]




--- linux-2.6.6/mm/bootmem.c.orig	2004-05-14 21:55:00.000000000 +0200
+++ linux-2.6.6/mm/bootmem.c	2004-05-14 22:42:48.000000000 +0200
@@ -82,14 +82,11 @@
 							PAGE_SIZE-1)/PAGE_SIZE;
 	unsigned long end = (addr + size + PAGE_SIZE-1)/PAGE_SIZE;
 
-	if (!size) BUG();
+	BUG_ON(!size);
+	BUG_ON(sidx >= eidx);
+	BUG_ON((addr >> PAGE_SHIFT) >= bdata->node_low_pfn);
+	BUG_ON(end > bdata->node_low_pfn);
 
-	if (sidx >= eidx)
-		BUG();
-	if ((addr >> PAGE_SHIFT) >= bdata->node_low_pfn)
-		BUG();
-	if (end > bdata->node_low_pfn)
-		BUG();
 	for (i = sidx; i < eidx; i++)
 		if (test_and_set_bit(i, bdata->node_bootmem_map)) {
 #ifdef CONFIG_DEBUG_BOOTMEM
@@ -110,9 +107,8 @@
 	unsigned long eidx = (addr + size - bdata->node_boot_start)/PAGE_SIZE;
 	unsigned long end = (addr + size)/PAGE_SIZE;
 
-	if (!size) BUG();
-	if (end > bdata->node_low_pfn)
-		BUG();
+	BUG_ON(!size);
+	BUG_ON(end > bdata->node_low_pfn);
 
 	if (addr < bdata->last_success)
 		bdata->last_success = addr;
@@ -124,7 +120,7 @@
 	sidx = start - (bdata->node_boot_start/PAGE_SIZE);
 
 	for (i = sidx; i < eidx; i++) {
-		if (!test_and_clear_bit(i, bdata->node_bootmem_map))
+		if (unlikely(!test_and_clear_bit(i, bdata->node_bootmem_map)))
 			BUG();
 	}
 }
@@ -140,7 +136,7 @@
  *
  * alignment has to be a power of 2 value.
  *
- * NOTE:  This function is _not_ reenetrant.
+ * NOTE:  This function is _not_ reentrant.
  */
 static void * __init
 __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
@@ -152,7 +148,6 @@
 
 	if(!size) {
 		printk("__alloc_bootmem_core(): zero-sized request\n");
-		dump_stack();
 		BUG();
 	}
 	BUG_ON(align & (align-1));
@@ -260,7 +255,7 @@
 	unsigned long idx;
 	unsigned long *map; 
 
-	if (!bdata->node_bootmem_map) BUG();
+	BUG_ON(!bdata->node_bootmem_map);
 
 	count = 0;
 	/* first extant page of the node */
#3 lore raw
In reply to Andrew Morton
Followup to:  <[email protected]>
By author:    Andrew Morton <[email protected]>
In newsgroup: linux.dev.kernel
Quoted 12 lines
Quoted 4 lines · Michael Buesch

- if (!test_and_clear_bit(i, bdata->node_bootmem_map))
- BUG();
+ BUG_ON(!test_and_clear_bit(i, bdata->node_bootmem_map));

Please don't put expressions whihc actually change state inside BUG_ON(). Someone may decide to make BUG_ON() a no-op to save space.

I'm not aware of anyone actually trying that, but it's a good objective.

If so they should make it:

#define BUG_ON(x) ((void)(x))

.. which preserves side effects while generating no object code for a side-effect-free expression.

The only reason for the cast to (void) at all is to keep gcc from complaining about an ignored expression.

-hpa

#4 lore raw
In reply to Andrew Morton
Quoted 8 lines · Andrew Morton
Quoted 4 lines · Michael Buesch

- if (!test_and_clear_bit(i, bdata->node_bootmem_map))
- BUG();
+ BUG_ON(!test_and_clear_bit(i, bdata->node_bootmem_map));

Please don't put expressions whihc actually change state inside BUG_ON(). Someone may decide to make BUG_ON() a no-op to save space.

I've done it and it's fine, we just need to evaluate the condition and let the compiler optimize it away if it has no side effects.

configurable no-op of BUG and WARN

 tiny-mpm/include/asm-i386/bug.h |    7 +++++++
 tiny-mpm/init/Kconfig           |   11 ++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)
include/asm-i386/bug.h +7 -0
Index: tiny/include/asm-i386/bug.h
===================================================================
@@ -9,6 +9,12 @@
  * undefined" opcode for parsing in the trap handler.
  */
 
+#ifndef CONFIG_BUG
+#define BUG()
+#define WARN_ON(condition) do { if (condition) ; } while(0)
+#define BUG_ON(condition) do { if (condition) ; } while(0)
+#define PAGE_BUG(page)
+#else
 #ifdef CONFIG_FULL_BUG
 #define BUG()				\
  __asm__ __volatile__(	"ud2\n"		\
@@ -40,3 +46,4 @@
 } while (0)
 
 #endif
+#endif
init/Kconfig +10 -1
Index: tiny/init/Kconfig
===================================================================
@@ -274,8 +274,17 @@
           very difficult to diagnose system problems, saying N here on
           non-embedded systems is strongly discouraged.
 
+config BUG
+ 	depends X86
+ 	default y
+	bool "Enable BUG and WARN code" if EMBEDDED
+	help
+	  Disabling this completely removes BUG and WARN checking
+          code. Warning: this may result in data loss if a bug goes
+          undetected.
+
 config FULL_BUG
-	depends X86
+	depends X86 && BUG
 	default y
 	bool "Full BUG reporting code" if EMBEDDED
 	help
Quoted 7 lines

I'm not aware of anyone actually trying that, but it's a good objective. -
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Signature · 1 line
Matt Mackall : http://www.selenic.com : Linux development and consulting