summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/s390/include/asm/page-states.h38
-rw-r--r--arch/s390/mm/page-states.c47
2 files changed, 43 insertions, 42 deletions
diff --git a/arch/s390/include/asm/page-states.h b/arch/s390/include/asm/page-states.h
index 659e3c963ce6..1eae4046c07d 100644
--- a/arch/s390/include/asm/page-states.h
+++ b/arch/s390/include/asm/page-states.h
@@ -8,6 +8,7 @@
#define PAGE_STATES_H
#include <asm/sections.h>
+#include <asm/page.h>
#define ESSA_GET_STATE 0
#define ESSA_SET_STABLE 1
@@ -22,4 +23,41 @@
extern int __bootdata_preserved(cmma_flag);
+static __always_inline unsigned long essa(unsigned long paddr, unsigned char cmd)
+{
+ unsigned long rc;
+
+ asm volatile(
+ " .insn rrf,0xb9ab0000,%[rc],%[paddr],%[cmd],0"
+ : [rc] "=d" (rc)
+ : [paddr] "d" (paddr),
+ [cmd] "i" (cmd));
+ return rc;
+}
+
+static __always_inline void __set_page_state(void *addr, unsigned long num_pages, unsigned char cmd)
+{
+ unsigned long paddr = __pa(addr) & PAGE_MASK;
+
+ while (num_pages--) {
+ essa(paddr, cmd);
+ paddr += PAGE_SIZE;
+ }
+}
+
+static inline void __set_page_unused(void *addr, unsigned long num_pages)
+{
+ __set_page_state(addr, num_pages, ESSA_SET_UNUSED);
+}
+
+static inline void __set_page_stable_dat(void *addr, unsigned long num_pages)
+{
+ __set_page_state(addr, num_pages, ESSA_SET_STABLE);
+}
+
+static inline void __set_page_stable_nodat(void *addr, unsigned long num_pages)
+{
+ __set_page_state(addr, num_pages, ESSA_SET_STABLE_NODAT);
+}
+
#endif
diff --git a/arch/s390/mm/page-states.c b/arch/s390/mm/page-states.c
index b68fef3d1230..7dc75dd05f48 100644
--- a/arch/s390/mm/page-states.c
+++ b/arch/s390/mm/page-states.c
@@ -20,43 +20,6 @@
int __bootdata_preserved(cmma_flag);
-static __always_inline void essa(unsigned long paddr, unsigned char cmd)
-{
- unsigned long rc;
-
- asm volatile(
- " .insn rrf,0xb9ab0000,%[rc],%[paddr],%[cmd],0"
- : [rc] "=d" (rc)
- : [paddr] "d" (paddr),
- [cmd] "i" (cmd));
-}
-
-static __always_inline void __set_page_state(struct page *page, int order, unsigned char cmd)
-{
- unsigned long paddr = page_to_phys(page);
- unsigned long num_pages = 1UL << order;
-
- while (num_pages--) {
- essa(paddr, cmd);
- paddr += PAGE_SIZE;
- }
-}
-
-static inline void set_page_unused(struct page *page, int order)
-{
- __set_page_state(page, order, ESSA_SET_UNUSED);
-}
-
-static inline void set_page_stable_dat(struct page *page, int order)
-{
- __set_page_state(page, order, ESSA_SET_STABLE);
-}
-
-static inline void set_page_stable_nodat(struct page *page, int order)
-{
- __set_page_state(page, order, ESSA_SET_STABLE_NODAT);
-}
-
static void mark_kernel_pmd(pud_t *pud, unsigned long addr, unsigned long end)
{
unsigned long next;
@@ -169,7 +132,7 @@ void __init cmma_init_nodat(void)
continue; /* skip page table pages */
if (!list_empty(&page->lru))
continue; /* skip free pages */
- set_page_stable_nodat(page, 0);
+ __set_page_stable_nodat(page_to_virt(page), 1);
}
}
}
@@ -178,7 +141,7 @@ void arch_free_page(struct page *page, int order)
{
if (!cmma_flag)
return;
- set_page_unused(page, order);
+ __set_page_unused(page_to_virt(page), 1UL << order);
}
void arch_alloc_page(struct page *page, int order)
@@ -186,14 +149,14 @@ void arch_alloc_page(struct page *page, int order)
if (!cmma_flag)
return;
if (cmma_flag < 2)
- set_page_stable_dat(page, order);
+ __set_page_stable_dat(page_to_virt(page), 1UL << order);
else
- set_page_stable_nodat(page, order);
+ __set_page_stable_nodat(page_to_virt(page), 1UL << order);
}
void arch_set_page_dat(struct page *page, int order)
{
if (!cmma_flag)
return;
- set_page_stable_dat(page, order);
+ __set_page_stable_dat(page_to_virt(page), 1UL << order);
}