s390/mm: do not initialize storage keys
With dirty and referenced bits implemented in software it is unnecessary to initialize the storage key for every page. With this patch not a single storage key operation is done for a system that does not use KVM. For KVM set_pte_at/pgste_set_key will do the initialization for the guest view of the storage key when the mapping for the page is established in the host. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
6cef30034c
commit
127c1fefff
|
@ -30,7 +30,12 @@
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
void storage_key_init_range(unsigned long start, unsigned long end);
|
static inline void storage_key_init_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
#if PAGE_DEFAULT_KEY
|
||||||
|
__storage_key_init_range(start, end);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline void clear_page(void *page)
|
static inline void clear_page(void *page)
|
||||||
{
|
{
|
||||||
|
|
|
@ -206,6 +206,7 @@ static noinline __init void clear_bss_section(void)
|
||||||
*/
|
*/
|
||||||
static noinline __init void init_kernel_storage_key(void)
|
static noinline __init void init_kernel_storage_key(void)
|
||||||
{
|
{
|
||||||
|
#if PAGE_DEFAULT_KEY
|
||||||
unsigned long end_pfn, init_pfn;
|
unsigned long end_pfn, init_pfn;
|
||||||
|
|
||||||
end_pfn = PFN_UP(__pa(&_end));
|
end_pfn = PFN_UP(__pa(&_end));
|
||||||
|
@ -213,6 +214,7 @@ static noinline __init void init_kernel_storage_key(void)
|
||||||
for (init_pfn = 0 ; init_pfn < end_pfn; init_pfn++)
|
for (init_pfn = 0 ; init_pfn < end_pfn; init_pfn++)
|
||||||
page_set_storage_key(init_pfn << PAGE_SHIFT,
|
page_set_storage_key(init_pfn << PAGE_SHIFT,
|
||||||
PAGE_DEFAULT_KEY, 0);
|
PAGE_DEFAULT_KEY, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static __initdata char sysinfo_page[PAGE_SIZE] __aligned(PAGE_SIZE);
|
static __initdata char sysinfo_page[PAGE_SIZE] __aligned(PAGE_SIZE);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
|
#if PAGE_DEFAULT_KEY
|
||||||
static inline unsigned long sske_frame(unsigned long addr, unsigned char skey)
|
static inline unsigned long sske_frame(unsigned long addr, unsigned char skey)
|
||||||
{
|
{
|
||||||
asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],9,0"
|
asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],9,0"
|
||||||
|
@ -16,7 +17,7 @@ static inline unsigned long sske_frame(unsigned long addr, unsigned char skey)
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void storage_key_init_range(unsigned long start, unsigned long end)
|
void __storage_key_init_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
unsigned long boundary, size;
|
unsigned long boundary, size;
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@ void storage_key_init_range(unsigned long start, unsigned long end)
|
||||||
start += PAGE_SIZE;
|
start += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static pte_t *walk_page_table(unsigned long addr)
|
static pte_t *walk_page_table(unsigned long addr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue