Re: [RFCv3][PATCH 1/3] create slow_virt_to_phys()

H. Peter Anvin
2013-01-15T19:48:11Z

On 01/09/2013 10:59 AM, Dave Hansen wrote:
> + switch (level) {
> + case PG_LEVEL_4K:
> + psize = PAGE_SIZE;
> + pmask = PAGE_MASK;
> + break;
> + case PG_LEVEL_2M:
> + psize = PMD_PAGE_SIZE;
> + pmask = PMD_PAGE_MASK;
> + break;
> +#ifdef CONFIG_X86_64
> + case PG_LEVEL_1G:
> + psize = PUD_PAGE_SIZE;
> + pmask = PUD_PAGE_MASK;
> + break;
> +#endif
> + default:
> + BUG();
> + }

I object to this switch statement. If we are going to create new
primitives, let's create a primitive that embody this and put it in
pgtypes_types.h, especially since it is simply an algorithmic operation:

static inline unsigned long page_level_size(int level)
{
return (PAGE_SIZE/PGDIR_SIZE) << (PGDIR_SHIFT*level);
}
static inline unsigned long page_level_shift(int level)
{
return (PAGE_SHIFT-PGDIR_SHIFT) + (PGDIR_SHIFT*level);
}

--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.