x86: cpa create set_and_clr function
Create a set_and_clr function to avoid the duplicate loops. Allows also to do combined operations for optimization. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
72932c7ad2
commit
ff31452b6e
@ -282,6 +282,45 @@ static int change_page_attr_addr(unsigned long address, pgprot_t prot)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __change_page_attr_set_clr(unsigned long addr, int numpages,
|
||||||
|
pgprot_t mask_set, pgprot_t mask_clr)
|
||||||
|
{
|
||||||
|
pgprot_t new_prot;
|
||||||
|
int level;
|
||||||
|
pte_t *pte;
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
for (i = 0; i < numpages ; i++) {
|
||||||
|
|
||||||
|
pte = lookup_address(addr, &level);
|
||||||
|
if (!pte)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
new_prot = pte_pgprot(*pte);
|
||||||
|
|
||||||
|
pgprot_val(new_prot) &= ~pgprot_val(mask_clr);
|
||||||
|
pgprot_val(new_prot) |= pgprot_val(mask_set);
|
||||||
|
|
||||||
|
ret = change_page_attr_addr(addr, new_prot);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
addr += PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int change_page_attr_set_clr(unsigned long addr, int numpages,
|
||||||
|
pgprot_t mask_set, pgprot_t mask_clr)
|
||||||
|
{
|
||||||
|
int ret = __change_page_attr_set_clr(addr, numpages, mask_set,
|
||||||
|
mask_clr);
|
||||||
|
|
||||||
|
global_flush_tlb();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* change_page_attr_set - Change page table attributes in the linear mapping.
|
* change_page_attr_set - Change page table attributes in the linear mapping.
|
||||||
* @addr: Virtual address in linear mapping.
|
* @addr: Virtual address in linear mapping.
|
||||||
|
Loading…
Reference in New Issue
Block a user