aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/kvm/kvm-s390.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 3f2884e99ed4..af09d3437631 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1324,7 +1324,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1324{ 1324{
1325 uint8_t *keys; 1325 uint8_t *keys;
1326 uint64_t hva; 1326 uint64_t hva;
1327 int i, r = 0; 1327 int srcu_idx, i, r = 0;
1328 1328
1329 if (args->flags != 0) 1329 if (args->flags != 0)
1330 return -EINVAL; 1330 return -EINVAL;
@@ -1342,6 +1342,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1342 return -ENOMEM; 1342 return -ENOMEM;
1343 1343
1344 down_read(&current->mm->mmap_sem); 1344 down_read(&current->mm->mmap_sem);
1345 srcu_idx = srcu_read_lock(&kvm->srcu);
1345 for (i = 0; i < args->count; i++) { 1346 for (i = 0; i < args->count; i++) {
1346 hva = gfn_to_hva(kvm, args->start_gfn + i); 1347 hva = gfn_to_hva(kvm, args->start_gfn + i);
1347 if (kvm_is_error_hva(hva)) { 1348 if (kvm_is_error_hva(hva)) {
@@ -1353,6 +1354,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1353 if (r) 1354 if (r)
1354 break; 1355 break;
1355 } 1356 }
1357 srcu_read_unlock(&kvm->srcu, srcu_idx);
1356 up_read(&current->mm->mmap_sem); 1358 up_read(&current->mm->mmap_sem);
1357 1359
1358 if (!r) { 1360 if (!r) {
@@ -1370,7 +1372,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1370{ 1372{
1371 uint8_t *keys; 1373 uint8_t *keys;
1372 uint64_t hva; 1374 uint64_t hva;
1373 int i, r = 0; 1375 int srcu_idx, i, r = 0;
1374 1376
1375 if (args->flags != 0) 1377 if (args->flags != 0)
1376 return -EINVAL; 1378 return -EINVAL;
@@ -1396,6 +1398,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1396 goto out; 1398 goto out;
1397 1399
1398 down_read(&current->mm->mmap_sem); 1400 down_read(&current->mm->mmap_sem);
1401 srcu_idx = srcu_read_lock(&kvm->srcu);
1399 for (i = 0; i < args->count; i++) { 1402 for (i = 0; i < args->count; i++) {
1400 hva = gfn_to_hva(kvm, args->start_gfn + i); 1403 hva = gfn_to_hva(kvm, args->start_gfn + i);
1401 if (kvm_is_error_hva(hva)) { 1404 if (kvm_is_error_hva(hva)) {
@@ -1413,6 +1416,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1413 if (r) 1416 if (r)
1414 break; 1417 break;
1415 } 1418 }
1419 srcu_read_unlock(&kvm->srcu, srcu_idx);
1416 up_read(&current->mm->mmap_sem); 1420 up_read(&current->mm->mmap_sem);
1417out: 1421out:
1418 kvfree(keys); 1422 kvfree(keys);