Re: [PATCH v4 6/7] s390: ap: Cleanup on removing the AP device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/03/2019 22:53, Tony Krowiak wrote:
On 3/11/19 4:31 AM, Pierre Morel wrote:
On 08/03/2019 23:43, Tony Krowiak wrote:
On 2/22/19 10:29 AM, Pierre Morel wrote:
When the device is remove, we must make sure to
clear the interruption and reset the AP device.

We also need to clear the CRYCB of the guest.

Signed-off-by: Pierre Morel <pmorel@xxxxxxxxxxxxx>
---
  drivers/s390/crypto/vfio_ap_drv.c     | 35 +++++++++++++++++++++++++++++++++++
  drivers/s390/crypto/vfio_ap_ops.c     |  3 ++-
  drivers/s390/crypto/vfio_ap_private.h |  3 +++
  3 files changed, 40 insertions(+), 1 deletion(-)


...snip...

+ * vfio_ap_update_crycb
+ * @q: A pointer to the queue being removed
+ *
+ * We clear the APID of the queue, making this queue unusable for the guest. + * After this function we can reset the queue without to fear a race with
+ * the guest to access the queue again.
+ * We do not fear race with the host as we still get the devic
+ */
+static void vfio_ap_update_crycb(struct vfio_ap_queue *q)
+{
+    struct ap_matrix_mdev *matrix_mdev = q->matrix_mdev;
+
+    if (!matrix_mdev)
+        return;
+

You should probably check whether the APID has been cleared before
proceeding. Take the case where an AP with multiple queues is removed
from the configuration via the SE or SCLP. The AP bus is going to invoke
the vfio_ap_queue_dev_remove() function for each of the queues. The APID
will get cleared on the first remove, so it is not only unnecessary to
clear it on subsequent removes, it is kind of nasty to keep resetting
the masks in the guest's CRYCB (below) each time the remove callback is
invoked.

This can not happen.
The only way to clear the APM is when the matrix is not associated with KVM.

This case is tested and the masks are not changed.


+    clear_bit_inv(AP_QID_CARD(q->apqn), matrix_mdev->matrix.apm);
+
+    if (!matrix_mdev->kvm)
+        return;
+
+    kvm_arch_crypto_set_masks(matrix_mdev->kvm,
+                  matrix_mdev->matrix.apm,
+                  matrix_mdev->matrix.aqm,
+                  matrix_mdev->matrix.adm);
+}




--
Pierre Morel
Linux/KVM/QEMU in Böblingen - Germany




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux