@@ -1324,7 +1324,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1324
1324
{
1325
1325
uint8_t * keys ;
1326
1326
uint64_t hva ;
1327
- int i , r = 0 ;
1327
+ int srcu_idx , i , r = 0 ;
1328
1328
1329
1329
if (args -> flags != 0 )
1330
1330
return - EINVAL ;
@@ -1342,6 +1342,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1342
1342
return - ENOMEM ;
1343
1343
1344
1344
down_read (& current -> mm -> mmap_sem );
1345
+ srcu_idx = srcu_read_lock (& kvm -> srcu );
1345
1346
for (i = 0 ; i < args -> count ; i ++ ) {
1346
1347
hva = gfn_to_hva (kvm , args -> start_gfn + i );
1347
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
1354
if (r )
1354
1355
break ;
1355
1356
}
1357
+ srcu_read_unlock (& kvm -> srcu , srcu_idx );
1356
1358
up_read (& current -> mm -> mmap_sem );
1357
1359
1358
1360
if (!r ) {
@@ -1370,7 +1372,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1370
1372
{
1371
1373
uint8_t * keys ;
1372
1374
uint64_t hva ;
1373
- int i , r = 0 ;
1375
+ int srcu_idx , i , r = 0 ;
1374
1376
1375
1377
if (args -> flags != 0 )
1376
1378
return - EINVAL ;
@@ -1396,6 +1398,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
1396
1398
goto out ;
1397
1399
1398
1400
down_read (& current -> mm -> mmap_sem );
1401
+ srcu_idx = srcu_read_lock (& kvm -> srcu );
1399
1402
for (i = 0 ; i < args -> count ; i ++ ) {
1400
1403
hva = gfn_to_hva (kvm , args -> start_gfn + i );
1401
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
1416
if (r )
1414
1417
break ;
1415
1418
}
1419
+ srcu_read_unlock (& kvm -> srcu , srcu_idx );
1416
1420
up_read (& current -> mm -> mmap_sem );
1417
1421
out :
1418
1422
kvfree (keys );
0 commit comments