diff options
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 8 |
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(¤t->mm->mmap_sem); | 1344 | down_read(¤t->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(¤t->mm->mmap_sem); | 1358 | up_read(¤t->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(¤t->mm->mmap_sem); | 1400 | down_read(¤t->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(¤t->mm->mmap_sem); | 1420 | up_read(¤t->mm->mmap_sem); |
1417 | out: | 1421 | out: |
1418 | kvfree(keys); | 1422 | kvfree(keys); |