I don't think so. There's *never* address subtraction, there'sHm, I guess, so long as you assume the kernel data segment is always below the kernel heap.
sometimes 32 bit wrap (glibc uses this to effect subtraction, sure).
But there's no wrap here.
To test, I changed the following:limit is a size, rather than the end address, so this isn't quite right.
--- smpboot.c.~8~ 2006-09-25 15:51:50.000000000 +1000
+++ smpboot.c 2006-09-25 16:00:36.000000000 +1000
@@ -926,8 +926,9 @@
unsigned long per_cpu_off)
{
unsigned limit, flags;
+ extern char __per_cpu_end[];
- limit = (1 << 20);
+ limit = PAGE_ALIGN((long)__per_cpu_end) >> PAGE_SHIFT;