summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/mm/pageattr-test.c8
-rw-r--r--arch/x86/mm/pageattr.c87
2 files changed, 43 insertions, 52 deletions
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c
index fe73905d075e..4e8b8c6baccd 100644
--- a/arch/x86/mm/pageattr-test.c
+++ b/arch/x86/mm/pageattr-test.c
@@ -162,8 +162,8 @@ static __init int exercise_pageattr(void)
continue;
}
- err = change_page_attr_clear(addr[i], len[i],
- __pgprot(_PAGE_GLOBAL));
+ err = __change_page_attr_clear(addr[i], len[i],
+ __pgprot(_PAGE_GLOBAL));
if (err < 0) {
printk(KERN_ERR "CPA %d failed %d\n", i, err);
failed++;
@@ -197,8 +197,8 @@ static __init int exercise_pageattr(void)
failed++;
continue;
}
- err = change_page_attr_set(addr[i], len[i],
- __pgprot(_PAGE_GLOBAL));
+ err = __change_page_attr_set(addr[i], len[i],
+ __pgprot(_PAGE_GLOBAL));
if (err < 0) {
printk(KERN_ERR "CPA reverting failed: %d\n", err);
failed++;
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 145f5edf488a..55f5b5cdb12e 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -301,8 +301,8 @@ static int change_page_attr_addr(unsigned long address, pgprot_t prot)
* This function is different from change_page_attr() in that only selected bits
* are impacted, all other bits remain as is.
*/
-static int change_page_attr_set(unsigned long addr, int numpages,
- pgprot_t prot)
+static int __change_page_attr_set(unsigned long addr, int numpages,
+ pgprot_t prot)
{
pgprot_t current_prot, new_prot;
int level;
@@ -325,9 +325,19 @@ static int change_page_attr_set(unsigned long addr, int numpages,
return ret;
addr += PAGE_SIZE;
}
+
return 0;
}
+static int change_page_attr_set(unsigned long addr, int numpages, pgprot_t prot)
+{
+ int ret = __change_page_attr_set(addr, numpages, prot);
+
+ global_flush_tlb();
+ return ret;
+
+}
+
/**
* change_page_attr_clear - Change page table attributes in the linear mapping.
* @addr: Virtual address in linear mapping.
@@ -347,8 +357,8 @@ static int change_page_attr_set(unsigned long addr, int numpages,
* This function is different from change_page_attr() in that only selected bits
* are impacted, all other bits remain as is.
*/
-static int change_page_attr_clear(unsigned long addr, int numpages,
- pgprot_t prot)
+static int __change_page_attr_clear(unsigned long addr, int numpages,
+ pgprot_t prot)
{
pgprot_t current_prot, new_prot;
int level;
@@ -371,81 +381,59 @@ static int change_page_attr_clear(unsigned long addr, int numpages,
return ret;
addr += PAGE_SIZE;
}
+
return 0;
}
-int set_memory_uc(unsigned long addr, int numpages)
+static int change_page_attr_clear(unsigned long addr, int numpages,
+ pgprot_t prot)
{
- int err;
+ int ret = __change_page_attr_clear(addr, numpages, prot);
- err = change_page_attr_set(addr, numpages,
- __pgprot(_PAGE_PCD | _PAGE_PWT));
global_flush_tlb();
- return err;
+ return ret;
+
+}
+
+int set_memory_uc(unsigned long addr, int numpages)
+{
+ return change_page_attr_set(addr, numpages,
+ __pgprot(_PAGE_PCD | _PAGE_PWT));
}
EXPORT_SYMBOL(set_memory_uc);
int set_memory_wb(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_clear(addr, numpages,
- __pgprot(_PAGE_PCD | _PAGE_PWT));
- global_flush_tlb();
- return err;
+ return change_page_attr_clear(addr, numpages,
+ __pgprot(_PAGE_PCD | _PAGE_PWT));
}
EXPORT_SYMBOL(set_memory_wb);
int set_memory_x(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_clear(addr, numpages,
- __pgprot(_PAGE_NX));
- global_flush_tlb();
- return err;
+ return change_page_attr_clear(addr, numpages, __pgprot(_PAGE_NX));
}
EXPORT_SYMBOL(set_memory_x);
int set_memory_nx(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_set(addr, numpages,
- __pgprot(_PAGE_NX));
- global_flush_tlb();
- return err;
+ return change_page_attr_set(addr, numpages, __pgprot(_PAGE_NX));
}
EXPORT_SYMBOL(set_memory_nx);
int set_memory_ro(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_clear(addr, numpages,
- __pgprot(_PAGE_RW));
- global_flush_tlb();
- return err;
+ return change_page_attr_clear(addr, numpages, __pgprot(_PAGE_RW));
}
int set_memory_rw(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_set(addr, numpages,
- __pgprot(_PAGE_RW));
- global_flush_tlb();
- return err;
+ return change_page_attr_set(addr, numpages, __pgprot(_PAGE_RW));
}
int set_memory_np(unsigned long addr, int numpages)
{
- int err;
-
- err = change_page_attr_clear(addr, numpages,
- __pgprot(_PAGE_PRESENT));
- global_flush_tlb();
- return err;
+ return change_page_attr_clear(addr, numpages, __pgprot(_PAGE_PRESENT));
}
int set_pages_uc(struct page *page, int numpages)
@@ -500,14 +488,17 @@ int set_pages_rw(struct page *page, int numpages)
static int __set_pages_p(struct page *page, int numpages)
{
unsigned long addr = (unsigned long)page_address(page);
- return change_page_attr_set(addr, numpages,
- __pgprot(_PAGE_PRESENT | _PAGE_RW));
+
+ return __change_page_attr_set(addr, numpages,
+ __pgprot(_PAGE_PRESENT | _PAGE_RW));
}
static int __set_pages_np(struct page *page, int numpages)
{
unsigned long addr = (unsigned long)page_address(page);
- return change_page_attr_clear(addr, numpages, __pgprot(_PAGE_PRESENT));
+
+ return __change_page_attr_clear(addr, numpages,
+ __pgprot(_PAGE_PRESENT));
}
void kernel_map_pages(struct page *page, int numpages, int enable)
OpenPOWER on IntegriCloud