[PATCH] __ioremap_explicit() criterion change

John Rose johnrose at austin.ibm.com
Thu Oct 21 02:35:32 EST 2004

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 at austin.ibm.com>

diff -Nru a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c
--- a/arch/ppc64/mm/init.c	Wed Oct 20 11:17:47 2004
+++ b/arch/ppc64/mm/init.c	Wed Oct 20 11:17:47 2004
@@ -263,7 +263,8 @@
 	} else {
-		area = im_get_area(ea, size, IM_REGION_UNUSED|IM_REGION_SUBSET);
+		area = im_get_area(ea, size,
 		if (area == NULL) {
 			printk(KERN_ERR "could not obtain imalloc area for ea 0x%lx\n", ea);
 			return 1;

More information about the Linuxppc64-dev mailing list