Skip to contentSkip to conversation

x86: smp_scan_config - use signed long as scan area size

PATCH In review Cyrill Gorcunov 3 participants 3 messages Aug 20, 2009 – Aug 21, 2009 x86

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 x86: smp_scan_config - use signed long as scan area size

Unsigned value potentially could be overlapped if length parameter is that: length % 16 != 0.

This is not a problem at moment since all values we pass now are 16 divisible (0x400 and 0x10000).

Though there is no need unsigned value anyway. Max range pointed out by MP specification is in kilobytes so plain "signed long" is enough.

This allow us to be on a safe side.

---

(I doubt if we ever will need to scan 1G of physical
memory with 16 byte step at booting procedure 'xcept memtest case)

Please review. Not sure if the patch is that worth but anyway :)

 arch/x86/kernel/mpparse.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/mpparse.c +1 -1
Index: linux-2.6.git/arch/x86/kernel/mpparse.c
=====================================================================
@@ -705,7 +705,7 @@ static void __init smp_reserve_bootmem(s
 #endif
 }
 
-static int __init smp_scan_config(unsigned long base, unsigned long length,
+static int __init smp_scan_config(unsigned long base, long length,
 				  unsigned reserve)
 {
 	unsigned int *bp = phys_to_virt(base);
#1 lore raw
Quoted 30 lines · Cyrill Gorcunov

Unsigned value potentially could be overlapped if length parameter is that: length % 16 != 0.

This is not a problem at moment since all values we pass now are 16 divisible (0x400 and 0x10000).

Though there is no need unsigned value anyway. Max range pointed out by MP specification is in kilobytes so plain "signed long" is enough.

This allow us to be on a safe side.

---

(I doubt if we ever will need to scan 1G of physical
memory with 16 byte step at booting procedure 'xcept memtest case)

Please review. Not sure if the patch is that worth but anyway :)

 arch/x86/kernel/mpparse.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Index: linux-2.6.git/arch/x86/kernel/mpparse.c
=====================================================================

arch/x86/kernel/mpparse.c static void __init smp_reserve_bootmem(s · line 711

Quoted 8 lines
arch/x86/kernel/mpparse.c +1 -1
@@ -705,7 +705,7 @@ static void __init smp_reserve_bootmem(s
 #endif
 }
 
-static int __init smp_scan_config(unsigned long base, unsigned long length,
+static int __init smp_scan_config(unsigned long base, long length,
 				  unsigned reserve)
 {
 	unsigned int *bp = phys_to_virt(base);

Hm, does a BUILD_BUG_ON((length & 15) != 0) line catch incorrectly aligned length parameters?

Ingo

#2 lore raw

[Ingo Molnar - Fri, Aug 21, 2009 at 06:04:26PM +0200]

| 
| * Cyrill Gorcunov <[email protected]> wrote:
| 
| > Unsigned value potentially could be overlapped
| > if length parameter is that: length % 16 != 0.
| > 
| > This is not a problem at moment since all values
| > we pass now are 16 divisible (0x400 and 0x10000).
| > 
| > Though there is no need unsigned value anyway.
| > Max range pointed out by MP specification is
| > in kilobytes so plain "signed long" is enough.
| > 
| > This allow us to be on a safe side.
| > 
| > Signed-off-by: Cyrill Gorcunov <[email protected]>
| > ---
| > 
...
| 
| Hm, does a BUILD_BUG_ON((length & 15) != 0) line catch incorrectly 
| aligned length parameters?
| 
| 	Ingo
| 

For my gcc it doesn't (gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3). Perhaps
some clever future gcc version would be able to note that constant is passed as argument and catch it. But at moment it doesn't. (Or maybe there is some cmd option which force compiler to inspect calls more precisely?)

We could use BUG_ON as well here but I think it doesn't worth it. 0xefffffff is enough to scan 1G of physical memory which we hard to believe ever do (note 16 byte step size here). And code is not getting bigger.

Ingo, current situation is not a problem since we know which values we're passing so I thought about possible (if ever) errors only.

Also we could introduce inline helper to check the size alignment (in this case gcc will recognize constants I believe and catch
nits on build time). But I really doubt it is worth thing to do.

-- Cyrill