[Cbe-oss-dev] [PATCH] 64K page support for kexec

Benjamin Herrenschmidt benh at kernel.crashing.org
Tue Apr 24 07:50:51 EST 2007


On Mon, 2007-04-23 at 14:53 -0300, Luke Browning wrote:
> This patch fixes a couple of kexec problems related to 64K page 
> support in the kernel.  kexec issues a tlbie for each pte.  The 
> parameters for the tlbie are the page size and the virtual address.
> Support was missing for the computation of these two parameters
> for 64K pages.  This patch adds that support.  
> 
> Signed-off-by: Luke Browning <lukebrowning at us.ibm.com>

Acked-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>

BTW. Your mailer is still mangling patches.... (wrapping them). Can't
you disable word wrap ? If you're using evolution, make sure to use the
"preformat" style, and do an "insert text file", that should keep
patches intact.

A couple of minor things that shouldn't block accepting the patch:

> -static unsigned long slot2va(unsigned long hpte_v, unsigned long slot)
> +static unsigned long slot2va(unsigned long hpte_v, unsigned long slot,
> int psize)
>  {
>  	unsigned long avpn = HPTE_V_AVPN_VAL(hpte_v);
>  	unsigned long va;
>  
>  	va = avpn << 23;
>  
> -	if (! (hpte_v & HPTE_V_LARGE)) {
> +	if (psize != MMU_PAGE_16M) {
>  		unsigned long vpi, pteg;

Maybe should be a test wether page shift > 23 ? One day we might
actually use the 16G pages option too :-) Though that would mean using
1T segment, which means a different hashing too... that's something we
haven't looked properly into yet. (We have had some patches for some
times but there are issues we haven't fully solved yet).

> +	if (pa & LP_MASK(0)) {
> +		for (i = 0; i < LP_BITS; i++) {
> +			if ((pa & LP_MASK(i+1)) == LP_MASK(i+1))
> +				break;
> +		}
> +		penc = LP_MASK(i+1) >> LP_SHIFT;
> +		for (i = MMU_PAGE_COUNT - 1; i > 0; i--) {
> +			if (!mmu_psize_defs[i].shift)
> +				continue;
> +			if (penc == mmu_psize_defs[i].penc)
> +				break;
> +		}
> +	}
> +	else {
> +		i = MMU_PAGE_16M;
> +	}
> +
> +	return i;
> +}

So you didn't like my idea of using a single loop ? Oh well, that should
do I suppose. One minor coding style nit, I would have preferred
something like

	if (!(pa & LP_MASK(0)))
		return MMU_PAGE_16M;

	for (...)

To limit the right shift of the whole function, but that's a detail.

>  		if (hpte_v & HPTE_V_VALID) {
> +			if (!(hpte_v & HPTE_V_LARGE))
> +				psize = MMU_PAGE_4K;
> +			else
> +				psize = hpte_decode_lpsize(hptep->r);

Another minor coding style nit, but maybe it would have been nicer to
have the 4K page also dealt within  hpte_decode_lpsize() ? Since the
function is likely to inline it, that will make no difference in
generated code but keeps the logic for getting the psize completely
within a single function...
 
> +			vpn = slot2va(hpte_v, slot, psize);
>  			hptep->v = 0;
> -			__tlbie(slot2va(hpte_v, slot), MMU_PAGE_4K);
> +			__tlbie(vpn, psize);
>  		}
>  	}

Cheers,
Ben.





More information about the cbe-oss-dev mailing list