diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/lpar.c')
| -rw-r--r-- | arch/powerpc/platforms/pseries/lpar.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 0da39fed355..6d62072a7d5 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c @@ -109,7 +109,7 @@ void vpa_init(int cpu)  static long pSeries_lpar_hpte_insert(unsigned long hpte_group,  				     unsigned long vpn, unsigned long pa,  				     unsigned long rflags, unsigned long vflags, -				     int psize, int ssize) +				     int psize, int apsize, int ssize)  {  	unsigned long lpar_rc;  	unsigned long flags; @@ -121,8 +121,8 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group,  			 "pa=%016lx, rflags=%lx, vflags=%lx, psize=%d)\n",  			 hpte_group, vpn,  pa, rflags, vflags, psize); -	hpte_v = hpte_encode_v(vpn, psize, ssize) | vflags | HPTE_V_VALID; -	hpte_r = hpte_encode_r(pa, psize) | rflags; +	hpte_v = hpte_encode_v(vpn, psize, apsize, ssize) | vflags | HPTE_V_VALID; +	hpte_r = hpte_encode_r(pa, psize, apsize) | rflags;  	if (!(vflags & HPTE_V_BOLTED))  		pr_devel(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r); @@ -155,7 +155,7 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group,  	 */  	if (unlikely(lpar_rc != H_SUCCESS)) {  		if (!(vflags & HPTE_V_BOLTED)) -			pr_devel(" lpar err %lu\n", lpar_rc); +			pr_devel(" lpar err %ld\n", lpar_rc);  		return -2;  	}  	if (!(vflags & HPTE_V_BOLTED)) @@ -186,7 +186,13 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group)  					   (0x1UL << 4), &dummy1, &dummy2);  		if (lpar_rc == H_SUCCESS)  			return i; -		BUG_ON(lpar_rc != H_NOT_FOUND); + +		/* +		 * The test for adjunct partition is performed before the +		 * ANDCOND test.  H_RESOURCE may be returned, so we need to +		 * check for that as well. +		 */ +		BUG_ON(lpar_rc != H_NOT_FOUND && lpar_rc != H_RESOURCE);  		slot_offset++;  		slot_offset &= 0x7;  |