Re: [PATCH v9 02/15] s390/vfio-ap: use new AP bus interface to search for queue devices

From: Tony Krowiak
Date: Mon Jul 27 2020 - 09:42:18 EST




On 7/24/20 4:38 AM, Pierre Morel wrote:


On 2020-07-20 17:03, Tony Krowiak wrote:
This patch refactor's the vfio_ap device driver to use the AP bus's
ap_get_qdev() function to retrieve the vfio_ap_queue struct containing
information about a queue that is bound to the vfio_ap device driver.
The bus's ap_get_qdev() function retrieves the queue device from a
hashtable keyed by APQN. This is much more efficient than looping over
the list of devices attached to the AP bus by several orders of
magnitude.

The patch does much more than modifying this line. ;)

Yes it does, I'll be sure to include the additional details.



Signed-off-by: Tony Krowiak <akrowiak@xxxxxxxxxxxxx>
Reported-by: kernel test robot <lkp@xxxxxxxxx>
---
 drivers/s390/crypto/vfio_ap_drv.c | 27 ++-------
 drivers/s390/crypto/vfio_ap_ops.c | 86 +++++++++++++++------------
 drivers/s390/crypto/vfio_ap_private.h | 8 ++-
 3 files changed, 59 insertions(+), 62 deletions(-)

diff --git a/drivers/s390/crypto/vfio_ap_drv.c b/drivers/s390/crypto/vfio_ap_drv.c
index f4ceb380dd61..24cdef60039a 100644
--- a/drivers/s390/crypto/vfio_ap_drv.c
+++ b/drivers/s390/crypto/vfio_ap_drv.c
@@ -53,15 +53,9 @@ MODULE_DEVICE_TABLE(vfio_ap, ap_queue_ids);
ÂÂ */
 static int vfio_ap_queue_dev_probe(struct ap_device *apdev)
 {
-ÂÂÂ struct vfio_ap_queue *q;
-
-ÂÂÂ q = kzalloc(sizeof(*q), GFP_KERNEL);
-ÂÂÂ if (!q)
-ÂÂÂÂÂÂÂ return -ENOMEM;
-ÂÂÂ dev_set_drvdata(&apdev->device, q);
-ÂÂÂ q->apqn = to_ap_queue(&apdev->device)->qid;
-ÂÂÂ q->saved_isc = VFIO_AP_ISC_INVALID;
-ÂÂÂ return 0;
+ÂÂÂ struct ap_queue *queue = to_ap_queue(&apdev->device);
+
+ÂÂÂ return vfio_ap_mdev_probe_queue(queue);
 }

You should explain the reason why this function is modified.

  /**
@@ -72,18 +66,9 @@ static int vfio_ap_queue_dev_probe(struct ap_device *apdev)
ÂÂ */
 static void vfio_ap_queue_dev_remove(struct ap_device *apdev)
 {
-ÂÂÂ struct vfio_ap_queue *q;
-ÂÂÂ int apid, apqi;
-
-ÂÂÂ mutex_lock(&matrix_dev->lock);
-ÂÂÂ q = dev_get_drvdata(&apdev->device);
-ÂÂÂ dev_set_drvdata(&apdev->device, NULL);
-ÂÂÂ apid = AP_QID_CARD(q->apqn);
-ÂÂÂ apqi = AP_QID_QUEUE(q->apqn);
-ÂÂÂ vfio_ap_mdev_reset_queue(apid, apqi, 1);
-ÂÂÂ vfio_ap_irq_disable(q);
-ÂÂÂ kfree(q);
-ÂÂÂ mutex_unlock(&matrix_dev->lock);
+ÂÂÂ struct ap_queue *queue = to_ap_queue(&apdev->device);
+
+ÂÂÂ vfio_ap_mdev_remove_queue(queue);
 }

... and this one?

  static void vfio_ap_matrix_dev_release(struct device *dev)
diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
index e0bde8518745..ad3925f04f61 100644
--- a/drivers/s390/crypto/vfio_ap_ops.c
+++ b/drivers/s390/crypto/vfio_ap_ops.c
@@ -26,43 +26,26 @@
  static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev);
 -static int match_apqn(struct device *dev, const void *data)
-{
-ÂÂÂ struct vfio_ap_queue *q = dev_get_drvdata(dev);
-
-ÂÂÂ return (q->apqn == *(int *)(data)) ? 1 : 0;
-}
-
 /**
- * vfio_ap_get_queue: Retrieve a queue with a specific APQN from a list
- * @matrix_mdev: the associated mediated matrix
+ * vfio_ap_get_queue: Retrieve a queue with a specific APQN.
ÂÂ * @apqn: The queue APQN
ÂÂ *
- * Retrieve a queue with a specific APQN from the list of the
- * devices of the vfio_ap_drv.
- * Verify that the APID and the APQI are set in the matrix.
+ * Retrieve a queue with a specific APQN from the AP queue devices attached to
+ * the AP bus.
ÂÂ *
- * Returns the pointer to the associated vfio_ap_queue
+ * Returns the pointer to the vfio_ap_queue with the specified APQN, or NULL.
ÂÂ */
-static struct vfio_ap_queue *vfio_ap_get_queue(
-ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ struct ap_matrix_mdev *matrix_mdev,
-ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ int apqn)
+static struct vfio_ap_queue *vfio_ap_get_queue(unsigned long apqn)
 {
+ÂÂÂ struct ap_queue *queue;
ÂÂÂÂÂ struct vfio_ap_queue *q;
-ÂÂÂ struct device *dev;
 - if (!test_bit_inv(AP_QID_CARD(apqn), matrix_mdev->matrix.apm))
-ÂÂÂÂÂÂÂ return NULL;
-ÂÂÂ if (!test_bit_inv(AP_QID_QUEUE(apqn), matrix_mdev->matrix.aqm))
+ÂÂÂ queue = ap_get_qdev(apqn);
+ÂÂÂ if (!queue)
ÂÂÂÂÂÂÂÂÂ return NULL;
 - dev = driver_find_device(&matrix_dev->vfio_ap_drv->driver, NULL,
-ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ &apqn, match_apqn);
-ÂÂÂ if (!dev)
-ÂÂÂÂÂÂÂ return NULL;
-ÂÂÂ q = dev_get_drvdata(dev);
-ÂÂÂ q->matrix_mdev = matrix_mdev;
-ÂÂÂ put_device(dev);
+ÂÂÂ q = dev_get_drvdata(&queue->ap_dev.device);
+ÂÂÂ put_device(&queue->ap_dev.device);
 Â return q;
 }

this function changed a lot too, you should explain the goal in the patch comment.

...snip...

Regards,
Pierre