diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2016-02-02 06:26:00 -0500 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2016-06-20 03:54:33 -0400 |
commit | e52f8b6112353e9e8eac64f082bfbc65e64bb2dd (patch) | |
tree | c6a4ef5a83a70a8ec09cdbff45316cb1ce1ea956 /arch/s390/kvm | |
parent | 0f7f84891516dc1ff7500fae12143710d2d9d11f (diff) |
s390/mm: take the mmap_sem in kvm_s390_shadow_fault()
Instead of doing it in the caller, let's just take the mmap_sem
in kvm_s390_shadow_fault(). By taking it as read, we allow parallel
faulting on shadow page tables, gmap shadow code is prepared for that.
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/gaccess.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index c5f79c1205cf..5b5eee2d51cd 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c | |||
@@ -1091,26 +1091,24 @@ int kvm_s390_shadow_fault(struct gmap *sg, unsigned long saddr, int write) | |||
1091 | int dat_protection; | 1091 | int dat_protection; |
1092 | int rc; | 1092 | int rc; |
1093 | 1093 | ||
1094 | down_read(&sg->mm->mmap_sem); | ||
1095 | |||
1094 | rc = gmap_shadow_pgt_lookup(sg, saddr, &pgt, &dat_protection); | 1096 | rc = gmap_shadow_pgt_lookup(sg, saddr, &pgt, &dat_protection); |
1095 | if (rc) { | 1097 | if (rc) |
1096 | rc = kvm_s390_shadow_tables(sg, saddr, &pgt, &dat_protection); | 1098 | rc = kvm_s390_shadow_tables(sg, saddr, &pgt, &dat_protection); |
1097 | if (rc) | ||
1098 | return rc; | ||
1099 | } | ||
1100 | 1099 | ||
1101 | vaddr.addr = saddr; | 1100 | vaddr.addr = saddr; |
1102 | rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); | 1101 | if (!rc) |
1103 | if (rc) | 1102 | rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); |
1104 | return rc; | 1103 | if (!rc && pte.i) |
1105 | if (pte.i) | 1104 | rc = PGM_PAGE_TRANSLATION; |
1106 | return PGM_PAGE_TRANSLATION; | 1105 | if (!rc && (pte.z || pte.co)) |
1107 | if (pte.z || pte.co) | 1106 | rc = PGM_TRANSLATION_SPEC; |
1108 | return PGM_TRANSLATION_SPEC; | ||
1109 | dat_protection |= pte.p; | 1107 | dat_protection |= pte.p; |
1110 | if (write && dat_protection) | 1108 | if (!rc && write && dat_protection) |
1111 | return PGM_PROTECTION; | 1109 | rc = PGM_PROTECTION; |
1112 | rc = gmap_shadow_page(sg, saddr, __pte(pte.val)); | 1110 | if (!rc) |
1113 | if (rc) | 1111 | rc = gmap_shadow_page(sg, saddr, __pte(pte.val)); |
1114 | return rc; | 1112 | up_read(&sg->mm->mmap_sem); |
1115 | return 0; | 1113 | return rc; |
1116 | } | 1114 | } |