From ab16f5f6989292ac3f4d947290cea9b33cdee441 Mon Sep 17 00:00:00 2001 From: Jianguo Wu Date: Fri, 7 Sep 2012 10:17:43 +1000 Subject: [PATCH] mm/ia64: fix a memory block size bug I found following definition in include/linux/memory.h, in my IA64 platform, SECTION_SIZE_BITS is equal to 32, and MIN_MEMORY_BLOCK_SIZE will be 0. #define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) will equal to 0. This will cause wrong system memory infomation in sysfs. I think it should be: #define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) linux-drf:/sys/devices/system/memory # ll total 0 -r--r--r-- 1 root root 65536 Aug 20 02:35 block_size_bytes drwxr-xr-x 3 root root 0 Aug 20 02:19 memory0 drwxr-xr-x 2 root root 0 Aug 20 02:35 power -rw-r--r-- 1 root root 65536 Aug 20 02:35 uevent linux-drf:/sys/devices/system/memory # cat block_size_bytes 0 linux-drf:/sys/devices/system/memory/memory0 # cat * 8000000000000000 cat: node0: Is a directory cat: node1: Is a directory cat: node2: Is a directory cat: node3: Is a directory 0 8000000000000000 cat: power: Is a directory 1 online cat: subsystem: Is a directory And "echo offline > memory0/state" will cause following call trace: kernel BUG at mm/memory_hotplug.c:885! sh[6455]: bugcheck! 0 [1] Pid: 6455, CPU 0, comm: sh psr : 0000101008526030 ifs : 8000000000000fa4 ip : [] Not tainted (3.6.0-rc1) ip is at offline_pages+0x210/0xee0 unat: 0000000000000000 pfs : 0000000000000fa4 rsc : 0000000000000003 rnat: a0000001008f2d50 bsps: 0000000000000000 pr : 65519a96659a9565 ldrs: 0000000000000000 ccv : 0000010b9263f310 fpsr: 0009804c0270033f csd : 0000000000000000 ssd : 0000000000000000 b0 : a0000001008c40f0 b6 : a000000100473980 b7 : a0000001000106d0 f6 : 000000000000000000000 f7 : 1003e0000000085c9354c f8 : 1003e0044b82fa09b5a53 f9 : 1003e000000d65cd62abf f10 : 1003efd02efdec682803d f11 : 1003e0000000000000042 r1 : a00000010152c2e0 r2 : 0000000000006ada r3 : 000000000000fffe r8 : 0000000000000026 r9 : a00000010121cc18 r10 : a0000001013309f0 r11 : 65519a96659a19e9 r12 : e00000070a91fdf0 r13 : e00000070a910000 r14 : 0000000000006ada r15 : 0000000000004000 r16 : 000000006ad8356c r17 : a0000001019a525e r18 : 0000000000007fff r19 : 0000000000000000 r20 : 0000000000006ad6 r21 : 0000000000006ad6 r22 : a00000010133bec8 r23 : 0000000000006ad4 r24 : 0000000000000002 r25 : 8200000000260038 r26 : 00000000000004f9 r27 : 00000000000004f8 r28 : 000000000001cf98 r29 : 0000000000000038 r30 : a0000001019a5ae0 r31 : 000000000001cf60 Call Trace: [] show_stack+0x80/0xa0 sp=e00000070a91f9b0 bsp=e00000070a9115e0 [] show_regs+0x640/0x920 sp=e00000070a91fb80 bsp=e00000070a911588 [] die+0x190/0x2c0 sp=e00000070a91fb90 bsp=e00000070a911548 [] die_if_kernel+0x50/0x80 sp=e00000070a91fb90 bsp=e00000070a911518 [] ia64_bad_break+0x3d0/0x6e0 sp=e00000070a91fb90 bsp=e00000070a9114f0 [] ia64_native_leave_kernel+0x0/0x270 sp=e00000070a91fc20 bsp=e00000070a9114f0 [] offline_pages+0x210/0xee0 sp=e00000070a91fdf0 bsp=e00000070a9113c8 [] alloc_pages_current+0x180/0x2a0 sp=e00000070a91fe20 bsp=e00000070a9113a Signed-off-by: Jianguo Wu Cc: "Luck, Tony" Cc: Signed-off-by: Andrew Morton --- include/linux/memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/memory.h b/include/linux/memory.h index 1ac7f6e405f9..ff9a9f8e0ed9 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -19,7 +19,7 @@ #include #include -#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) +#define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) struct memory_block { unsigned long start_section_nr; -- 2.39.5