| From c6b5e7d98ebc62937b152786f5654044aeaf1569 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 Sep 2018 15:23:03 +0200 |
| Subject: s390/zcrypt: enable AP bus scan without a valid default domain |
| |
| From: Halil Pasic <pasic@linux.ibm.com> |
| |
| [ Upstream commit 1c472d46283263497adccd7a0bec64ee2f9c09e5 ] |
| |
| The AP bus scan is aborted before doing anything worth mentioning if |
| ap_select_domain() fails, e.g. if the ap_rights.aqm mask is all zeros. |
| As the result of this the ap bus fails to manage (e.g. create and |
| register) devices like it is supposed to. |
| |
| Let us make ap_scan_bus() work even if ap_select_domain() can't select a |
| default domain. Let's also make ap_select_domain() return void, as there |
| are no more callers interested in its return value. |
| |
| Signed-off-by: Halil Pasic <pasic@linux.ibm.com> |
| Reported-by: Michael Mueller <mimu@linux.ibm.com> |
| Fixes: 7e0bdbe5c21c "s390/zcrypt: AP bus support for alternate driver(s)" |
| [freude@linux.ibm.com: title and patch header slightly modified] |
| Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/s390/crypto/ap_bus.c | 18 ++++++------------ |
| 1 file changed, 6 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c |
| index 3be54651698a3..027a53eec42a5 100644 |
| --- a/drivers/s390/crypto/ap_bus.c |
| +++ b/drivers/s390/crypto/ap_bus.c |
| @@ -1223,11 +1223,10 @@ static struct bus_attribute *const ap_bus_attrs[] = { |
| }; |
| |
| /** |
| - * ap_select_domain(): Select an AP domain. |
| - * |
| - * Pick one of the 16 AP domains. |
| + * ap_select_domain(): Select an AP domain if possible and we haven't |
| + * already done so before. |
| */ |
| -static int ap_select_domain(void) |
| +static void ap_select_domain(void) |
| { |
| int count, max_count, best_domain; |
| struct ap_queue_status status; |
| @@ -1242,7 +1241,7 @@ static int ap_select_domain(void) |
| if (ap_domain_index >= 0) { |
| /* Domain has already been selected. */ |
| spin_unlock_bh(&ap_domain_lock); |
| - return 0; |
| + return; |
| } |
| best_domain = -1; |
| max_count = 0; |
| @@ -1269,11 +1268,8 @@ static int ap_select_domain(void) |
| if (best_domain >= 0) { |
| ap_domain_index = best_domain; |
| AP_DBF(DBF_DEBUG, "new ap_domain_index=%d\n", ap_domain_index); |
| - spin_unlock_bh(&ap_domain_lock); |
| - return 0; |
| } |
| spin_unlock_bh(&ap_domain_lock); |
| - return -ENODEV; |
| } |
| |
| /* |
| @@ -1351,8 +1347,7 @@ static void ap_scan_bus(struct work_struct *unused) |
| AP_DBF(DBF_DEBUG, "%s running\n", __func__); |
| |
| ap_query_configuration(ap_configuration); |
| - if (ap_select_domain() != 0) |
| - goto out; |
| + ap_select_domain(); |
| |
| for (id = 0; id < AP_DEVICES; id++) { |
| /* check if device is registered */ |
| @@ -1468,12 +1463,11 @@ static void ap_scan_bus(struct work_struct *unused) |
| } |
| } /* end device loop */ |
| |
| - if (defdomdevs < 1) |
| + if (ap_domain_index >= 0 && defdomdevs < 1) |
| AP_DBF(DBF_INFO, |
| "no queue device with default domain %d available\n", |
| ap_domain_index); |
| |
| -out: |
| mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ); |
| } |
| |
| -- |
| 2.20.1 |
| |