Home Home > GIT Browse > SLE15-SP1
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
commiteecf2f8f3856f7006e03403510365e256a45e7fa (patch)
treef31fa3cca79ba13e6d606f670f566c4219917091
parentb0dc51c85ff65146b44640359760785196f49ec8 (diff)
virtio/s390: make airq summary indicators DMA (jsc#SLE-6197
FATE#327012 bsc#1140559 LTC#173150).
-rw-r--r--patches.suse/virtio-s390-make-airq-summary-indicators-dma116
-rw-r--r--series.conf1
2 files changed, 117 insertions, 0 deletions
diff --git a/patches.suse/virtio-s390-make-airq-summary-indicators-dma b/patches.suse/virtio-s390-make-airq-summary-indicators-dma
new file mode 100644
index 0000000000..64a7342e63
--- /dev/null
+++ b/patches.suse/virtio-s390-make-airq-summary-indicators-dma
@@ -0,0 +1,116 @@
+From: Halil Pasic <pasic@linux.ibm.com>
+Date: Tue, 26 Mar 2019 19:03:47 +0100
+Subject: virtio/s390: make airq summary indicators DMA
+Git-commit: 39c7dcb158924f84e04f4c2433d164eee845a732
+Patch-mainline: v5.2-rc1
+References: jsc#SLE-6197 FATE#327012 bsc#1140559 LTC#173150
+
+The hypervisor needs to interact with the summary indicators, so these
+need to be DMA memory as well (at least for protected virtualization
+guests).
+
+Signed-off-by: Halil Pasic <pasic@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 | 32 ++++++++++++++++++++++++--------
+ 1 file changed, 24 insertions(+), 8 deletions(-)
+
+--- a/drivers/s390/virtio/virtio_ccw.c
++++ b/drivers/s390/virtio/virtio_ccw.c
+@@ -143,11 +143,17 @@ static int virtio_ccw_use_airq = 1;
+
+ struct airq_info {
+ rwlock_t lock;
+- u8 summary_indicator;
++ u8 summary_indicator_idx;
+ struct airq_struct airq;
+ struct airq_iv *aiv;
+ };
+ static struct airq_info *airq_areas[MAX_AIRQ_AREAS];
++static u8 *summary_indicators;
++
++static inline u8 *get_summary_indicator(struct airq_info *info)
++{
++ return summary_indicators + info->summary_indicator_idx;
++}
+
+ #define CCW_CMD_SET_VQ 0x13
+ #define CCW_CMD_VDEV_RESET 0x33
+@@ -212,7 +218,7 @@ static void virtio_airq_handler(struct a
+ break;
+ vring_interrupt(0, (void *)airq_iv_get_ptr(info->aiv, ai));
+ }
+- info->summary_indicator = 0;
++ *(get_summary_indicator(info)) = 0;
+ smp_wmb();
+ /* Walk through indicators field, summary indicator not active. */
+ for (ai = 0;;) {
+@@ -224,7 +230,7 @@ static void virtio_airq_handler(struct a
+ read_unlock(&info->lock);
+ }
+
+-static struct airq_info *new_airq_info(void)
++static struct airq_info *new_airq_info(int index)
+ {
+ struct airq_info *info;
+ int rc;
+@@ -240,7 +246,8 @@ static struct airq_info *new_airq_info(v
+ return NULL;
+ }
+ info->airq.handler = virtio_airq_handler;
+- info->airq.lsi_ptr = &info->summary_indicator;
++ info->summary_indicator_idx = index;
++ info->airq.lsi_ptr = get_summary_indicator(info);
+ info->airq.lsi_mask = 0xff;
+ info->airq.isc = VIRTIO_AIRQ_ISC;
+ rc = register_adapter_interrupt(&info->airq);
+@@ -262,7 +269,7 @@ static unsigned long get_airq_indicator(
+
+ for (i = 0; i < MAX_AIRQ_AREAS && !indicator_addr; i++) {
+ if (!airq_areas[i])
+- airq_areas[i] = new_airq_info();
++ airq_areas[i] = new_airq_info(i);
+ info = airq_areas[i];
+ if (!info)
+ return 0;
+@@ -348,7 +355,7 @@ static void virtio_ccw_drop_indicator(st
+ if (!thinint_area)
+ return;
+ thinint_area->summary_indicator =
+- (unsigned long) &airq_info->summary_indicator;
++ (unsigned long) get_summary_indicator(airq_info);
+ thinint_area->isc = VIRTIO_AIRQ_ISC;
+ ccw->cmd_code = CCW_CMD_SET_IND_ADAPTER;
+ ccw->count = sizeof(*thinint_area);
+@@ -616,7 +623,7 @@ static int virtio_ccw_register_adapter_i
+ }
+ info = vcdev->airq_info;
+ thinint_area->summary_indicator =
+- (unsigned long) &info->summary_indicator;
++ (unsigned long) get_summary_indicator(info);
+ thinint_area->isc = VIRTIO_AIRQ_ISC;
+ ccw->cmd_code = CCW_CMD_SET_IND_ADAPTER;
+ ccw->flags = CCW_FLAG_SLI;
+@@ -1443,8 +1450,17 @@ static void __init no_auto_parse(void)
+
+ static int __init virtio_ccw_init(void)
+ {
++ int rc;
++
+ /* parse no_auto string before we do anything further */
+ no_auto_parse();
+- return ccw_driver_register(&virtio_ccw_driver);
++
++ summary_indicators = cio_dma_zalloc(MAX_AIRQ_AREAS);
++ if (!summary_indicators)
++ return -ENOMEM;
++ rc = ccw_driver_register(&virtio_ccw_driver);
++ if (rc)
++ cio_dma_free(summary_indicators, MAX_AIRQ_AREAS);
++ return rc;
+ }
+ device_initcall(virtio_ccw_init);
diff --git a/series.conf b/series.conf
index 8e8b61e3ee..5c40bc96b8 100644
--- a/series.conf
+++ b/series.conf
@@ -47727,6 +47727,7 @@
patches.suse/virtio-s390-use-cacheline-aligned-airq-bit-vectors
patches.suse/virtio-s390-add-indirection-to-indicators-access
patches.suse/virtio-s390-use-dma-memory-for-ccw-i-o-and-classic-notifiers
+ patches.suse/virtio-s390-make-airq-summary-indicators-dma
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