From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Harald Freudenberger <freude@linux.ibm.com>,
Heiko Carstens <heiko.carstens@de.ibm.com>,
Sasha Levin <sashal@kernel.org>,
linux-s390@vger.kernel.org
Subject: [PATCH AUTOSEL 5.1 44/70] s390/zcrypt: Fix wrong dispatching for control domain CPRBs
Date: Sat, 8 Jun 2019 07:39:23 -0400 [thread overview]
Message-ID: <20190608113950.8033-44-sashal@kernel.org> (raw)
In-Reply-To: <20190608113950.8033-1-sashal@kernel.org>
From: Harald Freudenberger <freude@linux.ibm.com>
[ Upstream commit 7379e652797c0b9b5f6caea1576f2dff9ce6a708 ]
The zcrypt device driver does not handle CPRBs which address
a control domain correctly. This fix introduces a workaround:
The domain field of the request CPRB is checked if there is
a valid domain value in there. If this is true and the value
is a control only domain (a domain which is enabled in the
crypto config ADM mask but disabled in the AQM mask) the
CPRB is forwarded to the default usage domain. If there is
no default domain, the request is rejected with an ENODEV.
This fix is important for maintaining crypto adapters. For
example one LPAR can use a crypto adapter domain ('Control
and Usage') but another LPAR needs to be able to maintain
this adapter domain ('Control'). Scenarios like this did
not work properly and the patch enables this.
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/s390/include/asm/ap.h | 4 ++--
drivers/s390/crypto/ap_bus.c | 26 ++++++++++++++++++++++----
drivers/s390/crypto/ap_bus.h | 3 +++
drivers/s390/crypto/zcrypt_api.c | 17 ++++++++++++++---
4 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/arch/s390/include/asm/ap.h b/arch/s390/include/asm/ap.h
index e94a0a28b5eb..aea32dda3d14 100644
--- a/arch/s390/include/asm/ap.h
+++ b/arch/s390/include/asm/ap.h
@@ -160,8 +160,8 @@ struct ap_config_info {
unsigned char Nd; /* max # of Domains - 1 */
unsigned char _reserved3[10];
unsigned int apm[8]; /* AP ID mask */
- unsigned int aqm[8]; /* AP queue mask */
- unsigned int adm[8]; /* AP domain mask */
+ unsigned int aqm[8]; /* AP (usage) queue mask */
+ unsigned int adm[8]; /* AP (control) domain mask */
unsigned char _reserved4[16];
} __aligned(8);
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index 1546389d71db..6717536a633c 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -254,19 +254,37 @@ static inline int ap_test_config_card_id(unsigned int id)
}
/*
- * ap_test_config_domain(): Test, whether an AP usage domain is configured.
+ * ap_test_config_usage_domain(): Test, whether an AP usage domain
+ * is configured.
* @domain AP usage domain ID
*
* Returns 0 if the usage domain is not configured
* 1 if the usage domain is configured or
* if the configuration information is not available
*/
-static inline int ap_test_config_domain(unsigned int domain)
+int ap_test_config_usage_domain(unsigned int domain)
{
if (!ap_configuration) /* QCI not supported */
return domain < 16;
return ap_test_config(ap_configuration->aqm, domain);
}
+EXPORT_SYMBOL(ap_test_config_usage_domain);
+
+/*
+ * ap_test_config_ctrl_domain(): Test, whether an AP control domain
+ * is configured.
+ * @domain AP control domain ID
+ *
+ * Returns 1 if the control domain is configured
+ * 0 in all other cases
+ */
+int ap_test_config_ctrl_domain(unsigned int domain)
+{
+ if (!ap_configuration) /* QCI not supported */
+ return 0;
+ return ap_test_config(ap_configuration->adm, domain);
+}
+EXPORT_SYMBOL(ap_test_config_ctrl_domain);
/**
* ap_query_queue(): Check if an AP queue is available.
@@ -1267,7 +1285,7 @@ static void ap_select_domain(void)
best_domain = -1;
max_count = 0;
for (i = 0; i < AP_DOMAINS; i++) {
- if (!ap_test_config_domain(i) ||
+ if (!ap_test_config_usage_domain(i) ||
!test_bit_inv(i, ap_perms.aqm))
continue;
count = 0;
@@ -1442,7 +1460,7 @@ static void _ap_scan_bus_adapter(int id)
(void *)(long) qid,
__match_queue_device_with_qid);
aq = dev ? to_ap_queue(dev) : NULL;
- if (!ap_test_config_domain(dom)) {
+ if (!ap_test_config_usage_domain(dom)) {
if (dev) {
/* Queue device exists but has been
* removed from configuration.
diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h
index 15a98a673c5c..6f3cf37776ca 100644
--- a/drivers/s390/crypto/ap_bus.h
+++ b/drivers/s390/crypto/ap_bus.h
@@ -251,6 +251,9 @@ void ap_wait(enum ap_wait wait);
void ap_request_timeout(struct timer_list *t);
void ap_bus_force_rescan(void);
+int ap_test_config_usage_domain(unsigned int domain);
+int ap_test_config_ctrl_domain(unsigned int domain);
+
void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg);
struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type);
void ap_queue_prepare_remove(struct ap_queue *aq);
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c
index c31b2d31cd83..03b1853464db 100644
--- a/drivers/s390/crypto/zcrypt_api.c
+++ b/drivers/s390/crypto/zcrypt_api.c
@@ -822,7 +822,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
struct ap_message ap_msg;
unsigned int weight, pref_weight;
unsigned int func_code;
- unsigned short *domain;
+ unsigned short *domain, tdom;
int qid = 0, rc = -ENODEV;
struct module *mod;
@@ -834,6 +834,17 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
if (rc)
goto out;
+ /*
+ * If a valid target domain is set and this domain is NOT a usage
+ * domain but a control only domain, use the default domain as target.
+ */
+ tdom = *domain;
+ if (tdom >= 0 && tdom < AP_DOMAINS &&
+ !ap_test_config_usage_domain(tdom) &&
+ ap_test_config_ctrl_domain(tdom) &&
+ ap_domain_index >= 0)
+ tdom = ap_domain_index;
+
pref_zc = NULL;
pref_zq = NULL;
spin_lock(&zcrypt_list_lock);
@@ -856,8 +867,8 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
/* check if device is online and eligible */
if (!zq->online ||
!zq->ops->send_cprb ||
- ((*domain != (unsigned short) AUTOSELECT) &&
- (*domain != AP_QID_QUEUE(zq->queue->qid))))
+ (tdom != (unsigned short) AUTOSELECT &&
+ tdom != AP_QID_QUEUE(zq->queue->qid)))
continue;
/* check if device node has admission for this queue */
if (!zcrypt_check_queue(perms,
--
2.20.1
next prev parent reply other threads:[~2019-06-08 11:41 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-08 11:38 [PATCH AUTOSEL 5.1 01/70] iio: adc: ads124: avoid buffer overflow Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 02/70] iio: imu: mpu6050: Fix FIFO layout for ICM20602 Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 03/70] iio: dac: ds4422/ds4424 fix chip verification Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 04/70] iio: adc: ti-ads8688: fix timestamp is not updated in buffer Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 05/70] staging: erofs: set sb->s_root to NULL when failing from __getname() Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 06/70] Staging: vc04_services: Fix a couple error codes Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 07/70] staging: wilc1000: Fix some double unlock bugs in wilc_wlan_cleanup() Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 08/70] pinctrl: intel: Clear interrupt status in mask/unmask callback Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 09/70] netfilter: nf_tables: fix oops during rule dump Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 10/70] perf/x86/intel/ds: Fix EVENT vs. UEVENT PEBS constraints Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 11/70] netfilter: nf_queue: fix reinject verdict handling Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 12/70] netfilter: nft_fib: Fix existence check support Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 13/70] ipvs: Fix use-after-free in ip_vs_in Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 14/70] selftests: netfilter: missing error check when setting up veth interface Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 15/70] netfilter: nat: fix udp checksum corruption Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 16/70] clk: ti: clkctrl: Fix clkdm_clk handling Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 17/70] powerpc/powernv: Return for invalid IMC domain Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 18/70] usb: xhci: Fix a potential null pointer dereference in xhci_debugfs_create_endpoint() Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 19/70] mISDN: make sure device name is NUL terminated Sasha Levin
2019-06-08 11:38 ` [PATCH AUTOSEL 5.1 20/70] x86/CPU/AMD: Don't force the CPB cap when running under a hypervisor Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 21/70] perf/ring_buffer: Fix exposing a temporarily decreased data_head Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 22/70] perf/ring_buffer: Add ordering to rb->nest increment Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 23/70] perf/ring-buffer: Always use {READ,WRITE}_ONCE() for rb->user_page data Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 24/70] gpio: fix gpio-adp5588 build errors Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 25/70] efi/x86/Add missing error handling to old_memmap 1:1 mapping code Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 26/70] net: stmmac: update rx tail pointer register to fix rx dma hang issue Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 27/70] net: stmmac: fix csr_clk can't be zero issue Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 28/70] net: stmmac: dwmac-mediatek: modify csr_clk value to fix mdio read/write fail Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 29/70] io_uring: Fix __io_uring_register() false success Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 30/70] dpaa2-eth: Fix potential spectre issue Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 31/70] dpaa2-eth: Use PTR_ERR_OR_ZERO where appropriate Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 32/70] net: tulip: de4x5: Drop redundant MODULE_DEVICE_TABLE() Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 33/70] ACPI/PCI: PM: Add missing wakeup.flags.valid checks Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 34/70] PCI: PM: Avoid possible suspend-to-idle issue Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 35/70] loop: Don't change loop device under exclusive opener Sasha Levin
2019-06-10 9:00 ` Jan Kara
2019-06-19 20:11 ` Sasha Levin
2019-06-20 9:08 ` Jan Kara
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 36/70] drm/etnaviv: lock MMU while dumping core Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 37/70] net: aquantia: tx clean budget logic error Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 38/70] net: aquantia: fix LRO with FCS error Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 39/70] i2c: dev: fix potential memory leak in i2cdev_ioctl_rdwr Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 40/70] i2c: mlxcpld: Fix wrong initialization order in probe Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 41/70] ALSA: hda - Force polling mode on CNL for fixing codec communication Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 42/70] configfs: Fix use-after-free when accessing sd->s_dentry Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 43/70] perf data: Fix 'strncat may truncate' build failure with recent gcc Sasha Levin
2019-06-08 11:39 ` Sasha Levin [this message]
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 45/70] perf namespace: Protect reading thread's namespace Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 46/70] perf record: Fix s390 missing module symbol and warning for non-root users Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 47/70] ia64: fix build errors by exporting paddr_to_nid() Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 48/70] dpaa_eth: use only online CPU portals Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 49/70] xen/pvcalls: Remove set but not used variable Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 50/70] xenbus: Avoid deadlock during suspend due to open transactions Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 51/70] dfs_cache: fix a wrong use of kfree in flush_cache_ent() Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 52/70] KVM: PPC: Book3S HV: Use new mutex to synchronize MMU setup Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 53/70] KVM: PPC: Book3S: Use new mutex to synchronize access to rtas token list Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 54/70] KVM: PPC: Book3S HV: Don't take kvm->lock around kvm_for_each_vcpu Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 55/70] ALSA: fireface: Use ULL suffixes for 64-bit constants Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 56/70] arm64: fix syscall_fn_t type Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 57/70] arm64: use the correct function type in SYSCALL_DEFINE0 Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 58/70] arm64: use the correct function type for __arm64_sys_ni_syscall Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 59/70] net: sh_eth: fix mdio access in sh_eth_close() for R-Car Gen2 and RZ/A1 SoCs Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 60/70] blk-mq: Fix memory leak in error handling Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 61/70] net: phylink: ensure consistent phy interface mode Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 62/70] net: phy: dp83867: fix speed 10 in sgmii mode Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 63/70] net: phy: dp83867: increase SGMII autoneg timer duration Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 64/70] net: phy: dp83867: Set up RGMII TX delay Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 65/70] scsi: libcxgbi: add a check for NULL pointer in cxgbi_check_route() Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 66/70] scsi: smartpqi: properly set both the DMA mask and the coherent DMA mask Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 67/70] scsi: scsi_dh_alua: Fix possible null-ptr-deref Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 68/70] scsi: libsas: delete sas port if expander discover failed Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 69/70] mlxsw: spectrum: Prevent force of 56G Sasha Levin
2019-06-08 11:39 ` [PATCH AUTOSEL 5.1 70/70] ocfs2: fix error path kobject memory leak Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190608113950.8033-44-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=freude@linux.ibm.com \
--cc=heiko.carstens@de.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox