path: root/drivers/s390/crypto/ap_bus.c
diff options
authorHarald Freudenberger <freude@linux.ibm.com>2019-02-05 17:22:36 +0100
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2019-02-13 08:27:44 +0100
commitb1af7528d27e450a1a4492678454b15177398a26 (patch)
tree6546e4303c4bf211a58a9fade03abb7ed3602b11 /drivers/s390/crypto/ap_bus.c
parentb96027d3b760184d48b819983f13b318dabbf95c (diff)
s390/zcrypt: use new state UNBOUND during queue driver rebind
When an alternate driver (vfio-ap) has bound an ap queue and this binding is revised the ap queue device is in an intermittent state not bound to any driver. The internal state variable covered this with the state AP_STATE_BORKED which is also used to reflect broken devices. When now an ap bus scan runs such a device is destroyed and on the next scan reconstructed. So a stress test with high frequency switching the queue driver between the default and the vfio-ap driver hit this gap and the queue was removed until the next ap bus scan. This fix now introduces another state for the in-between condition for a queue momentary not bound to a driver and so the ap bus scan function skips this device instead of removing it. Also some very slight but maybe helpful debug feature messages come with this patch - in particular a message showing that a broken card/queue device will get removed. Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> Reviewed-by: Ingo Franzki <ifranzki@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/crypto/ap_bus.c')
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index 48ea0004a56d..f07632da815e 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -1335,6 +1335,16 @@ static int __match_queue_device_with_qid(struct device *dev, void *data)
+ * Helper function to be used with bus_find_dev
+ * matches any queue device with given queue id
+ */
+static int __match_queue_device_with_queue_id(struct device *dev, void *data)
+ return is_queue_dev(dev)
+ && AP_QID_QUEUE(to_ap_queue(dev)->qid) == (int)(long) data;
* Helper function for ap_scan_bus().
* Does the scan bus job for the given adapter id.
@@ -1434,8 +1444,13 @@ static void _ap_scan_bus_adapter(int id)
borked = aq->state == AP_STATE_BORKED;
- if (borked) /* Remove broken device */
+ if (borked) {
+ /* Remove broken device */
+ "removing broken queue=%02x.%04x\n",
+ id, dom);
+ }
@@ -1505,7 +1520,7 @@ static void ap_scan_bus(struct work_struct *unused)
struct device *dev =
bus_find_device(&ap_bus_type, NULL,
(void *)(long) ap_domain_index,
- __match_queue_device_with_qid);
+ __match_queue_device_with_queue_id);
if (dev)

Privacy Policy