bootmem.c cleanup
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 calldump_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 */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.
Quoted 4 lines · you
Please don't put expressions whihc actually change state inside
BUG_ON(). Someone may decide to makeBUG_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 */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 makeBUG_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
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 makeBUG_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
@@ -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
@@ -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