Re: [PATCH v5 10/13] s390: vfio-ap: sysfs interface to view matrix mdev matrix

From: Pierre Morel
Date: Thu May 24 2018 - 04:18:08 EST


On 23/05/2018 16:38, Tony Krowiak wrote:
On 05/16/2018 03:55 AM, Pierre Morel wrote:
On 07/05/2018 17:11, Tony Krowiak wrote:
Provides a sysfs interface to view the AP matrix configured for the
mediated matrix device.

The relevant sysfs structures are:

/sys/devices/vfio_ap
... [matrix]
...... [mdev_supported_types]
......... [vfio_ap-passthrough]
............ [devices]
...............[$uuid]
.................. matrix

To view the matrix configured for the mediated matrix device,
print the matrix file:

This is the configured matrix, not the one used by the guest.
Nothing in the patches protect against binding a queue and assigning
a new AP when the guest runs.
The card and queue will be showed by this entry.

Of course, as stated above, this is the matrix configured for the
mediated matrix device. Are you suggesting here that the driver
should prevent assigning a new adapter or domain while a guest is
running? Couldn't this be a step in the process for hot (un)plugging
AP queues?

No, I mean what is the point to show this?
It is not what the guest sees.
Has it any use case?






ÂÂÂ cat matrix

Signed-off-by: Tony Krowiak <akrowiak@xxxxxxxxxxxxxxxxxx>
---
 drivers/s390/crypto/vfio_ap_ops.c | 31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
index 755be1d..81e03b8 100644
--- a/drivers/s390/crypto/vfio_ap_ops.c
+++ b/drivers/s390/crypto/vfio_ap_ops.c
@@ -716,6 +716,36 @@ static ssize_t control_domains_show(struct device *dev,
 }
 DEVICE_ATTR_RO(control_domains);

+static ssize_t matrix_show(struct device *dev, struct device_attribute *attr,
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ char *buf)
+{
+ÂÂÂ struct mdev_device *mdev = mdev_from_dev(dev);
+ÂÂÂ struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
+ÂÂÂ char *bufpos = buf;
+ÂÂÂ unsigned long apid;
+ÂÂÂ unsigned long apqi;
+ÂÂÂ unsigned long napm = matrix_mdev->matrix.apm_max + 1;
+ÂÂÂ unsigned long naqm = matrix_mdev->matrix.aqm_max + 1;
+ÂÂÂ int nchars = 0;
+ÂÂÂ int n;
+
+ÂÂÂ for_each_set_bit_inv(apid, matrix_mdev->matrix.apm, napm) {
+ÂÂÂÂÂÂÂ n = sprintf(bufpos, "%02lx\n", apid);
+ÂÂÂÂÂÂÂ bufpos += n;
+ÂÂÂÂÂÂÂ nchars += n;
+
+ÂÂÂÂÂÂÂ for_each_set_bit_inv(apqi, matrix_mdev->matrix.aqm, naqm) {
+ÂÂÂÂÂÂÂÂÂÂÂ n = sprintf(bufpos, "%02lx.%04lx\n", apid, apqi);
+ÂÂÂÂÂÂÂÂÂÂÂ bufpos += n;
+ÂÂÂÂÂÂÂÂÂÂÂ nchars += n;
+ÂÂÂÂÂÂÂ }
+ÂÂÂ }
+
+ÂÂÂ return nchars;
+}
+DEVICE_ATTR_RO(matrix);
+
+
 static struct attribute *vfio_ap_mdev_attrs[] = {
ÂÂÂÂÂ &dev_attr_assign_adapter.attr,
ÂÂÂÂÂ &dev_attr_unassign_adapter.attr,
@@ -724,6 +754,7 @@ static ssize_t control_domains_show(struct device *dev,
ÂÂÂÂÂ &dev_attr_assign_control_domain.attr,
ÂÂÂÂÂ &dev_attr_unassign_control_domain.attr,
ÂÂÂÂÂ &dev_attr_control_domains.attr,
+ÂÂÂ &dev_attr_matrix.attr,
ÂÂÂÂÂ NULL,
 };




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