Merge tag 'zonefs-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal...
[sfrench/cifs-2.6.git] / drivers / s390 / crypto / vfio_ap_ops.c
index 983b3b16196c6b7638e023f121e5c937c83ce150..fc169bc61593955525368f56f5eb1bf3caa414b7 100644 (file)
@@ -659,6 +659,21 @@ static bool vfio_ap_mdev_filter_cdoms(struct ap_matrix_mdev *matrix_mdev)
                             AP_DOMAINS);
 }
 
+static bool _queue_passable(struct vfio_ap_queue *q)
+{
+       if (!q)
+               return false;
+
+       switch (q->reset_status.response_code) {
+       case AP_RESPONSE_NORMAL:
+       case AP_RESPONSE_DECONFIGURED:
+       case AP_RESPONSE_CHECKSTOPPED:
+               return true;
+       default:
+               return false;
+       }
+}
+
 /*
  * vfio_ap_mdev_filter_matrix - filter the APQNs assigned to the matrix mdev
  *                             to ensure no queue devices are passed through to
@@ -687,7 +702,6 @@ static bool vfio_ap_mdev_filter_matrix(struct ap_matrix_mdev *matrix_mdev,
        unsigned long apid, apqi, apqn;
        DECLARE_BITMAP(prev_shadow_apm, AP_DEVICES);
        DECLARE_BITMAP(prev_shadow_aqm, AP_DOMAINS);
-       struct vfio_ap_queue *q;
 
        bitmap_copy(prev_shadow_apm, matrix_mdev->shadow_apcb.apm, AP_DEVICES);
        bitmap_copy(prev_shadow_aqm, matrix_mdev->shadow_apcb.aqm, AP_DOMAINS);
@@ -716,8 +730,7 @@ static bool vfio_ap_mdev_filter_matrix(struct ap_matrix_mdev *matrix_mdev,
                         * hardware device.
                         */
                        apqn = AP_MKQID(apid, apqi);
-                       q = vfio_ap_mdev_get_queue(matrix_mdev, apqn);
-                       if (!q || q->reset_status.response_code) {
+                       if (!_queue_passable(vfio_ap_mdev_get_queue(matrix_mdev, apqn))) {
                                clear_bit_inv(apid, matrix_mdev->shadow_apcb.apm);
 
                                /*
@@ -1691,6 +1704,7 @@ static int apq_status_check(int apqn, struct ap_queue_status *status)
        switch (status->response_code) {
        case AP_RESPONSE_NORMAL:
        case AP_RESPONSE_DECONFIGURED:
+       case AP_RESPONSE_CHECKSTOPPED:
                return 0;
        case AP_RESPONSE_RESET_IN_PROGRESS:
        case AP_RESPONSE_BUSY:
@@ -1747,14 +1761,6 @@ static void apq_reset_check(struct work_struct *reset_work)
                                memcpy(&q->reset_status, &status, sizeof(status));
                                continue;
                        }
-                       /*
-                        * When an AP adapter is deconfigured, the
-                        * associated queues are reset, so let's set the
-                        * status response code to 0 so the queue may be
-                        * passed through (i.e., not filtered)
-                        */
-                       if (status.response_code == AP_RESPONSE_DECONFIGURED)
-                               q->reset_status.response_code = 0;
                        if (q->saved_isc != VFIO_AP_ISC_INVALID)
                                vfio_ap_free_aqic_resources(q);
                        break;
@@ -1781,12 +1787,7 @@ static void vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
                queue_work(system_long_wq, &q->reset_work);
                break;
        case AP_RESPONSE_DECONFIGURED:
-               /*
-                * When an AP adapter is deconfigured, the associated
-                * queues are reset, so let's set the status response code to 0
-                * so the queue may be passed through (i.e., not filtered).
-                */
-               q->reset_status.response_code = 0;
+       case AP_RESPONSE_CHECKSTOPPED:
                vfio_ap_free_aqic_resources(q);
                break;
        default: