Commit 23b99237 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 's390-6.0-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fix from Vasily Gorbik:

 - Fix potential hangs in VFIO AP driver

* tag 's390-6.0-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/vfio-ap: bypass unnecessary processing of AP resources
parents 42f9508b 1918f2b2
...@@ -984,6 +984,11 @@ static ssize_t assign_adapter_store(struct device *dev, ...@@ -984,6 +984,11 @@ static ssize_t assign_adapter_store(struct device *dev,
goto done; goto done;
} }
if (test_bit_inv(apid, matrix_mdev->matrix.apm)) {
ret = count;
goto done;
}
set_bit_inv(apid, matrix_mdev->matrix.apm); set_bit_inv(apid, matrix_mdev->matrix.apm);
ret = vfio_ap_mdev_validate_masks(matrix_mdev); ret = vfio_ap_mdev_validate_masks(matrix_mdev);
...@@ -1109,6 +1114,11 @@ static ssize_t unassign_adapter_store(struct device *dev, ...@@ -1109,6 +1114,11 @@ static ssize_t unassign_adapter_store(struct device *dev,
goto done; goto done;
} }
if (!test_bit_inv(apid, matrix_mdev->matrix.apm)) {
ret = count;
goto done;
}
clear_bit_inv((unsigned long)apid, matrix_mdev->matrix.apm); clear_bit_inv((unsigned long)apid, matrix_mdev->matrix.apm);
vfio_ap_mdev_hot_unplug_adapter(matrix_mdev, apid); vfio_ap_mdev_hot_unplug_adapter(matrix_mdev, apid);
ret = count; ret = count;
...@@ -1183,6 +1193,11 @@ static ssize_t assign_domain_store(struct device *dev, ...@@ -1183,6 +1193,11 @@ static ssize_t assign_domain_store(struct device *dev,
goto done; goto done;
} }
if (test_bit_inv(apqi, matrix_mdev->matrix.aqm)) {
ret = count;
goto done;
}
set_bit_inv(apqi, matrix_mdev->matrix.aqm); set_bit_inv(apqi, matrix_mdev->matrix.aqm);
ret = vfio_ap_mdev_validate_masks(matrix_mdev); ret = vfio_ap_mdev_validate_masks(matrix_mdev);
...@@ -1286,6 +1301,11 @@ static ssize_t unassign_domain_store(struct device *dev, ...@@ -1286,6 +1301,11 @@ static ssize_t unassign_domain_store(struct device *dev,
goto done; goto done;
} }
if (!test_bit_inv(apqi, matrix_mdev->matrix.aqm)) {
ret = count;
goto done;
}
clear_bit_inv((unsigned long)apqi, matrix_mdev->matrix.aqm); clear_bit_inv((unsigned long)apqi, matrix_mdev->matrix.aqm);
vfio_ap_mdev_hot_unplug_domain(matrix_mdev, apqi); vfio_ap_mdev_hot_unplug_domain(matrix_mdev, apqi);
ret = count; ret = count;
...@@ -1329,6 +1349,11 @@ static ssize_t assign_control_domain_store(struct device *dev, ...@@ -1329,6 +1349,11 @@ static ssize_t assign_control_domain_store(struct device *dev,
goto done; goto done;
} }
if (test_bit_inv(id, matrix_mdev->matrix.adm)) {
ret = count;
goto done;
}
/* Set the bit in the ADM (bitmask) corresponding to the AP control /* Set the bit in the ADM (bitmask) corresponding to the AP control
* domain number (id). The bits in the mask, from most significant to * domain number (id). The bits in the mask, from most significant to
* least significant, correspond to IDs 0 up to the one less than the * least significant, correspond to IDs 0 up to the one less than the
...@@ -1378,6 +1403,11 @@ static ssize_t unassign_control_domain_store(struct device *dev, ...@@ -1378,6 +1403,11 @@ static ssize_t unassign_control_domain_store(struct device *dev,
goto done; goto done;
} }
if (!test_bit_inv(domid, matrix_mdev->matrix.adm)) {
ret = count;
goto done;
}
clear_bit_inv(domid, matrix_mdev->matrix.adm); clear_bit_inv(domid, matrix_mdev->matrix.adm);
if (test_bit_inv(domid, matrix_mdev->shadow_apcb.adm)) { if (test_bit_inv(domid, matrix_mdev->shadow_apcb.adm)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment