diff options
author | Dominik Dingel <dingel@linux.vnet.ibm.com> | 2014-01-14 12:10:17 -0500 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-04-22 03:36:25 -0400 |
commit | 934bc131efc3e4be6a52f7dd6c4dbf99635e381a (patch) | |
tree | 67b5df8e42e7db5f1f59f7d851b97923b5336678 /arch/s390/mm | |
parent | d4cb11340be6a1613d40d2b546cb111ea2547066 (diff) |
KVM: s390: Allow skeys to be enabled for the current process
Introduce a new function s390_enable_skey(), which enables storage key
handling via setting the use_skey flag in the mmu context.
This function is only useful within the context of kvm.
Note that enabling storage keys will cause a one-time hickup when
walking the page table; however, it saves us special effort for cases
like clear reset while making it possible for us to be architecture
conform.
s390_enable_skey() takes the page table lock to prevent reseting
storage keys triggered from multiple vcpus.
Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/pgtable.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index be80f55a1b78..02a8607bbeb5 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -1378,6 +1378,29 @@ int s390_enable_sie(void) | |||
1378 | } | 1378 | } |
1379 | EXPORT_SYMBOL_GPL(s390_enable_sie); | 1379 | EXPORT_SYMBOL_GPL(s390_enable_sie); |
1380 | 1380 | ||
1381 | /* | ||
1382 | * Enable storage key handling from now on and initialize the storage | ||
1383 | * keys with the default key. | ||
1384 | */ | ||
1385 | void s390_enable_skey(void) | ||
1386 | { | ||
1387 | /* | ||
1388 | * To avoid races between multiple vcpus, ending in calling | ||
1389 | * page_table_reset twice or more, | ||
1390 | * the page_table_lock is taken for serialization. | ||
1391 | */ | ||
1392 | spin_lock(¤t->mm->page_table_lock); | ||
1393 | if (mm_use_skey(current->mm)) { | ||
1394 | spin_unlock(¤t->mm->page_table_lock); | ||
1395 | return; | ||
1396 | } | ||
1397 | |||
1398 | current->mm->context.use_skey = 1; | ||
1399 | spin_unlock(¤t->mm->page_table_lock); | ||
1400 | page_table_reset_pgste(current->mm, 0, TASK_SIZE, true); | ||
1401 | } | ||
1402 | EXPORT_SYMBOL_GPL(s390_enable_skey); | ||
1403 | |||
1381 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 1404 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
1382 | int pmdp_clear_flush_young(struct vm_area_struct *vma, unsigned long address, | 1405 | int pmdp_clear_flush_young(struct vm_area_struct *vma, unsigned long address, |
1383 | pmd_t *pmdp) | 1406 | pmd_t *pmdp) |