Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Tesarik <ptesarik@suse.cz>2019-07-18 11:02:34 +0200
committerPetr Tesarik <ptesarik@suse.cz>2019-07-19 14:09:51 +0200
commitbd699b0871aa58d0320f9bfe37a3c415576128b8 (patch)
tree470169d5ee7de08f0dd8f49e4e529d8d7a677e62
parent240d75e192e635bb80328ae057929a9d260d5104 (diff)
virtio/s390: add indirection to indicators access (jsc#SLE-6197
FATE#327012 bsc#1140559 LTC#173150).
-rw-r--r--patches.suse/virtio-s390-add-indirection-to-indicators-access125
-rw-r--r--series.conf1
2 files changed, 126 insertions, 0 deletions
diff --git a/patches.suse/virtio-s390-add-indirection-to-indicators-access b/patches.suse/virtio-s390-add-indirection-to-indicators-access
new file mode 100644
index 0000000000..1f80e1283e
--- /dev/null
+++ b/patches.suse/virtio-s390-add-indirection-to-indicators-access
@@ -0,0 +1,125 @@
+From: Halil Pasic <pasic@linux.ibm.com>
+Date: Mon, 3 Dec 2018 17:18:07 +0100
+Subject: virtio/s390: add indirection to indicators access
+Git-commit: 22a4a639b9cebff4568f32202e96d6f286251b72
+Patch-mainline: v5.2-rc1
+References: jsc#SLE-6197 FATE#327012 bsc#1140559 LTC#173150
+
+This will come in handy soon when we pull out the indicators from
+virtio_ccw_device to a memory area that is shared with the hypervisor
+(in particular for protected virtualization guests).
+
+Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
+Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Reviewed-by: Michael Mueller <mimu@linux.ibm.com>
+Tested-by: Michael Mueller <mimu@linux.ibm.com>
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Acked-by: Petr Tesarik <ptesarik@suse.com>
+---
+ drivers/s390/virtio/virtio_ccw.c | 40 ++++++++++++++++++++++++---------------
+ 1 file changed, 25 insertions(+), 15 deletions(-)
+
+--- a/drivers/s390/virtio/virtio_ccw.c
++++ b/drivers/s390/virtio/virtio_ccw.c
+@@ -71,6 +71,16 @@ struct virtio_ccw_device {
+ void *airq_info;
+ };
+
++static inline unsigned long *indicators(struct virtio_ccw_device *vcdev)
++{
++ return &vcdev->indicators;
++}
++
++static inline unsigned long *indicators2(struct virtio_ccw_device *vcdev)
++{
++ return &vcdev->indicators2;
++}
++
+ struct vq_info_block_legacy {
+ __u64 queue;
+ __u32 align;
+@@ -341,17 +351,17 @@ static void virtio_ccw_drop_indicator(st
+ ccw->cda = (__u32)(unsigned long) thinint_area;
+ } else {
+ /* payload is the address of the indicators */
+- indicatorp = kmalloc(sizeof(&vcdev->indicators),
++ indicatorp = kmalloc(sizeof(indicators(vcdev)),
+ GFP_DMA | GFP_KERNEL);
+ if (!indicatorp)
+ return;
+ *indicatorp = 0;
+ ccw->cmd_code = CCW_CMD_SET_IND;
+- ccw->count = sizeof(&vcdev->indicators);
++ ccw->count = sizeof(indicators(vcdev));
+ ccw->cda = (__u32)(unsigned long) indicatorp;
+ }
+ /* Deregister indicators from host. */
+- vcdev->indicators = 0;
++ *indicators(vcdev) = 0;
+ ccw->flags = 0;
+ ret = ccw_io_helper(vcdev, ccw,
+ vcdev->is_thinint ?
+@@ -654,10 +664,10 @@ static int virtio_ccw_find_vqs(struct vi
+ * We need a data area under 2G to communicate. Our payload is
+ * the address of the indicators.
+ */
+- indicatorp = kmalloc(sizeof(&vcdev->indicators), GFP_DMA | GFP_KERNEL);
++ indicatorp = kmalloc(sizeof(indicators(vcdev)), GFP_DMA | GFP_KERNEL);
+ if (!indicatorp)
+ goto out;
+- *indicatorp = (unsigned long) &vcdev->indicators;
++ *indicatorp = (unsigned long) indicators(vcdev);
+ if (vcdev->is_thinint) {
+ ret = virtio_ccw_register_adapter_ind(vcdev, vqs, nvqs, ccw);
+ if (ret)
+@@ -666,21 +676,21 @@ static int virtio_ccw_find_vqs(struct vi
+ }
+ if (!vcdev->is_thinint) {
+ /* Register queue indicators with host. */
+- vcdev->indicators = 0;
++ *indicators(vcdev) = 0;
+ ccw->cmd_code = CCW_CMD_SET_IND;
+ ccw->flags = 0;
+- ccw->count = sizeof(&vcdev->indicators);
++ ccw->count = sizeof(indicators(vcdev));
+ ccw->cda = (__u32)(unsigned long) indicatorp;
+ ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND);
+ if (ret)
+ goto out;
+ }
+ /* Register indicators2 with host for config changes */
+- *indicatorp = (unsigned long) &vcdev->indicators2;
+- vcdev->indicators2 = 0;
++ *indicatorp = (unsigned long) indicators2(vcdev);
++ *indicators2(vcdev) = 0;
+ ccw->cmd_code = CCW_CMD_SET_CONF_IND;
+ ccw->flags = 0;
+- ccw->count = sizeof(&vcdev->indicators2);
++ ccw->count = sizeof(indicators2(vcdev));
+ ccw->cda = (__u32)(unsigned long) indicatorp;
+ ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_CONF_IND);
+ if (ret)
+@@ -1072,17 +1082,17 @@ static void virtio_ccw_int_handler(struc
+ vcdev->err = -EIO;
+ }
+ virtio_ccw_check_activity(vcdev, activity);
+- for_each_set_bit(i, &vcdev->indicators,
+- sizeof(vcdev->indicators) * BITS_PER_BYTE) {
++ for_each_set_bit(i, indicators(vcdev),
++ sizeof(*indicators(vcdev)) * BITS_PER_BYTE) {
+ /* The bit clear must happen before the vring kick. */
+- clear_bit(i, &vcdev->indicators);
++ clear_bit(i, indicators(vcdev));
+ barrier();
+ vq = virtio_ccw_vq_by_ind(vcdev, i);
+ vring_interrupt(0, vq);
+ }
+- if (test_bit(0, &vcdev->indicators2)) {
++ if (test_bit(0, indicators2(vcdev))) {
+ virtio_config_changed(&vcdev->vdev);
+- clear_bit(0, &vcdev->indicators2);
++ clear_bit(0, indicators2(vcdev));
+ }
+ }
+
diff --git a/series.conf b/series.conf
index c8aa0df2be..357a2d5ef5 100644
--- a/series.conf
+++ b/series.conf
@@ -47725,6 +47725,7 @@
patches.suse/s390-cio-add-basic-protected-virtualization-support
patches.suse/s390-airq-use-dma-memory-for-adapter-interrupts
patches.suse/virtio-s390-use-cacheline-aligned-airq-bit-vectors
+ patches.suse/virtio-s390-add-indirection-to-indicators-access
patches.fixes/crypto-ccp-fix-AES-CFB-error-exposed-by-new-test-vec.patch
patches.fixes/crypto-ccp-Fix-3DES-complaint-from-ccp-crypto-module.patch
patches.fixes/crypto-talitos-rename-alternative-AEAD-algos.patch