aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-02-02 06:26:00 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-20 03:54:33 -0400
commite52f8b6112353e9e8eac64f082bfbc65e64bb2dd (patch)
treec6a4ef5a83a70a8ec09cdbff45316cb1ce1ea956 /arch/s390/kvm
parent0f7f84891516dc1ff7500fae12143710d2d9d11f (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.c32
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}