[PATCH] ppc64 __ioremap_explicit() criterion change

From: Paul Mackerras
Date: Sat Oct 23 2004 - 02:53:12 EST


This patch is from John Rose <johnrose@xxxxxxxxxxxxxx>.

The function __ioremap_explicit() misses a possible (obscure) case when
reserving the imalloc area for the new region. This can result in the
unexpected DLPAR-add failure for an I/O slot. The failure will be
characterized by a kernel message resembling "could not obtain imalloc area for
ea 0x..." Here's an explanation:

At boot time, imalloc regions are created for the ranges of all PHBs. Upon
removal of a child slot for one of these PHBs, the imalloc region is split
so that the region for the child slot can be removed.

A GFW testcase revealed the following scenario. A PHB is remapped at boot for
virtual address range A through C. At boot, the partition owns a slot that
spans from A to B. This slot is DLPAR-removed, leaving an imalloc region from
B to C. At this point, the user DLPAR adds an EADS slot that was not present
at boot, but is a child of the PHB. The new slot happens to have a range that
directly matches the leftover PHB range, from B to C. The existing code does
not expect this, so the operation fails.

Signed-off-by: John Rose <johnrose@xxxxxxxxxxxxxx>
Signed-off-by: Paul Mackerras <paulus@xxxxxxxxx>

diff -urN linux-2.5/arch/ppc64/mm/init.c test/arch/ppc64/mm/init.c
--- linux-2.5/arch/ppc64/mm/init.c 2004-10-23 10:11:40.000000000 +1000
+++ test/arch/ppc64/mm/init.c 2004-10-23 16:49:48.102068672 +1000
@@ -263,7 +263,8 @@
*/
;
} else {
- area = im_get_area(ea, size, IM_REGION_UNUSED|IM_REGION_SUBSET);
+ area = im_get_area(ea, size,
+ IM_REGION_UNUSED|IM_REGION_SUBSET|IM_REGION_EXISTS);
if (area == NULL) {
/* Expected when PHB-dlpar is in play */
return 1;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/