All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Krowiak <akrowiak@linux.vnet.ibm.com>
To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org
Cc: freude@de.ibm.com, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, borntraeger@de.ibm.com,
	cohuck@redhat.com, kwankhede@nvidia.com,
	bjsdjshi@linux.vnet.ibm.com, pbonzini@redhat.com,
	alex.williamson@redhat.com, pmorel@linux.vnet.ibm.com,
	alifm@linux.vnet.ibm.com, mjrosato@linux.vnet.ibm.com,
	qemu-s390x@nongnu.org, jjherne@linux.vnet.ibm.com,
	thuth@redhat.com, pasic@linux.vnet.ibm.com,
	Tony Krowiak <akrowiak@linux.vnet.ibm.com>
Subject: [RFC 17/19] KVM: s390: validate input to AP matrix config interface
Date: Fri, 13 Oct 2017 13:39:02 -0400	[thread overview]
Message-ID: <1507916344-3896-18-git-send-email-akrowiak@linux.vnet.ibm.com> (raw)
In-Reply-To: <1507916344-3896-1-git-send-email-akrowiak@linux.vnet.ibm.com>

Verifies that the AP matrix assigned to the KVM guest is
not shared by any other KVM guest running on the same
system.

The Crypto Control Block referenced by a KVM guest's SIE
state description contains two bit mask fields that identify
the AP adapters and usage domains to assigned to the
guest: The AP Matrix (APM) identifies the AP adapters assigned
to the KVM guest; and the AP Queue Matrix (AQM) identifies
the usage domains assigned to the KVM guest. Each adapter and
usage domain is identified by a number from 0 to 255. The
bits in each mask, from left to right, correspond to the
numbers 0-255. When a bit is set, the corresponding adapter
or usage domain is assigned to the KVM guest.

AP instructions identify the AP device to use to perform the
cryptographic function contained in the instruction's
payload. The AP device is identified by and AP Queue
Number (APQN). The APQN is comprised of two fields: The
AP Identifier (APID) that specifies an adapter ID; and
an AP Queue Identifier (APQI) that specifies a domain ID.

The bits in the APM and AQM fields of the KVM guest's CRYCB
specify the list of APQNs that are valid for instructions
submitted from the KVM guest. When an AP instruction is
executed by the KVM guest, if the bit in the APM corresponding
to the APID contained in the APQN specified in the AP
instruction is not set, the instruction will fail. Likewise,
if the bit in the AQM corresponding to the APQI contained in
the APQN specified in the AP instruction is not set, the
instruction will fail.

The APQNs that can be derived from the bits set in the
APM and AQM fields of the KVM guest's CRYCB must not be
available to any other KVM guest running on the same
system. If any APQN is not unique to the KVM guest,
the ioctl will fail.

Signed-off-by: Tony Krowiak <akrowiak@linux.vnet.ibm.com>
---
 arch/s390/kvm/ap-config.c |   71 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/arch/s390/kvm/ap-config.c b/arch/s390/kvm/ap-config.c
index dc79798..4b0794d 100644
--- a/arch/s390/kvm/ap-config.c
+++ b/arch/s390/kvm/ap-config.c
@@ -138,6 +138,73 @@ static int ap_config_get_emasks(struct ap_config_masks *masks)
 	return 0;
 }
 
+static unsigned long ap_config_get_num_mask_bits(struct kvm *kvm)
+{
+	return is_format2_crycb(kvm) ? sizeof(u64) * APCB1_MASK_SIZE * 8 :
+				       sizeof(u64) * APCB0_MASK_SIZE * 8;
+}
+
+static int ap_config_validate_queue(struct kvm *kvm, unsigned long apid,
+				    unsigned long apqi)
+{
+	int ret = 0;
+	struct kvm *vm;
+	u64 *mask;
+
+	mutex_lock(&kvm->lock);
+
+	/* No other VM may share an AP Queue with the input VM */
+	list_for_each_entry(vm, &vm_list, vm_list) {
+		if (kvm == vm)
+			continue;
+
+		mask = ap_config_get_crycb_apm(vm);
+		if (!test_bit_inv(apid, (unsigned long *)mask))
+			continue;
+
+		mask = ap_config_get_crycb_aqm(vm);
+		if (!test_bit_inv(apqi, (unsigned long *)mask))
+			continue;
+
+		pr_err("%s: AP queue %02lx.%04lx is already registered to %s",
+		       __func__, apid, apqi, kvm->arch.dbf->name);
+		ret = -EBUSY;
+
+		goto done;
+	}
+
+done:
+	mutex_unlock(&kvm->lock);
+	return ret;
+}
+
+static int ap_config_validate_queues(struct kvm *kvm,
+				     struct ap_config_masks *masks)
+{
+	int ret;
+	const unsigned long *apm = (unsigned long *)masks->apm;
+	const unsigned long *aqm = (unsigned long *)masks->aqm;
+	unsigned long nbits = ap_config_get_num_mask_bits(kvm);
+	unsigned long apid;
+	unsigned long apqi;
+
+	apid = find_first_bit_inv(apm, nbits);
+	while (apid < nbits) {
+		apqi = find_first_bit_inv(aqm, nbits);
+		while (apqi < nbits) {
+			ret = ap_config_validate_queue(kvm, apid, apqi);
+			if (ret)
+				return ret;
+
+			apqi = find_next_bit_inv(aqm, nbits, apqi + 1);
+		}
+
+		apid = find_next_bit_inv(apm, nbits, apid + 1);
+	}
+
+	return 0;
+}
+
 int ap_config_matrix(struct kvm *kvm, struct ap_config_masks *masks)
 {
 	int ret;
@@ -146,6 +213,10 @@ int ap_config_matrix(struct kvm *kvm, struct ap_config_masks *masks)
 	if (ret)
 		return ret;
 
+	ret = ap_config_validate_queues(kvm, masks);
+	if (ret)
+		return ret;
+
 	ap_config_set_crycb_masks(kvm, masks);
 
 	return 0;
-- 
1.7.1

  parent reply	other threads:[~2017-10-13 17:41 UTC|newest]

Thread overview: 112+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-13 17:38 [RFC 00/19] KVM: s390/crypto/vfio: guest dedicated crypto adapters Tony Krowiak
2017-10-13 17:38 ` [RFC 01/19] KVM: s390: SIE considerations for AP Queue virtualization Tony Krowiak
2017-11-02 11:54   ` Christian Borntraeger
2017-11-02 19:53     ` Tony Krowiak
2017-10-13 17:38 ` [RFC 02/19] KVM: s390: refactor crypto initialization Tony Krowiak
2017-11-02 12:41   ` Christian Borntraeger
2017-11-14 11:50     ` Cornelia Huck
2017-11-14 15:53       ` Tony Krowiak
2017-10-13 17:38 ` [RFC 03/19] s390/zcrypt: new AP matrix bus Tony Krowiak
2017-10-16  8:47   ` Martin Schwidefsky
2017-10-16 15:02     ` Tony Krowiak
2017-11-14 11:58   ` Cornelia Huck
2017-11-14 13:19     ` Tony Krowiak
2017-11-14 15:54     ` Tony Krowiak
2017-11-14 16:07     ` Tony Krowiak
2017-10-13 17:38 ` [RFC 04/19] s390/zcrypt: create an AP matrix device on the " Tony Krowiak
2017-10-18 16:20   ` Cornelia Huck
2017-10-18 17:54     ` Tony Krowiak
2017-10-13 17:38 ` [RFC 05/19] s390/zcrypt: base implementation of AP matrix device driver Tony Krowiak
2017-10-16  8:59   ` Martin Schwidefsky
2017-10-16 15:56     ` Tony Krowiak
2017-11-14 12:40   ` Cornelia Huck
2017-11-14 16:37     ` Tony Krowiak
2017-11-14 17:00       ` Cornelia Huck
2017-11-14 18:15         ` Tony Krowiak
2017-11-15 10:31           ` Cornelia Huck
2017-11-16 12:02       ` Pierre Morel
2017-11-16 12:35         ` Cornelia Huck
2017-11-16 14:25           ` Tony Krowiak
2017-11-16 16:47             ` Cornelia Huck
2017-11-17 21:13               ` Tony Krowiak
2017-11-20 17:15                 ` Cornelia Huck
2017-11-16 14:25           ` Pierre Morel
2017-10-13 17:38 ` [RFC 06/19] s390/zcrypt: register matrix device with VFIO mediated device framework Tony Krowiak
2017-10-16  9:03   ` Martin Schwidefsky
2017-10-16 16:09     ` Tony Krowiak
2017-11-14 13:14   ` Cornelia Huck
2017-11-16 15:37     ` Tony Krowiak
2017-10-13 17:38 ` [RFC 07/19] KVM: s390: introduce AP matrix configuration interface Tony Krowiak
2017-10-16  9:10   ` Martin Schwidefsky
2017-10-16 16:26     ` Tony Krowiak
2017-11-14 13:16   ` Cornelia Huck
2017-11-16 15:41     ` Tony Krowiak
2017-10-13 17:38 ` [RFC 08/19] s390/zcrypt: support for assigning adapters to matrix mdev Tony Krowiak
2017-11-14 13:22   ` Cornelia Huck
2017-11-16 23:53     ` Tony Krowiak
2017-11-17  9:50       ` Cornelia Huck
2017-10-13 17:38 ` [RFC 09/19] s390/zcrypt: validate adapter assignment Tony Krowiak
2017-10-13 17:38 ` [RFC 10/19] s390/zcrypt: sysfs interfaces supporting AP domain assignment Tony Krowiak
2017-10-13 17:38 ` [RFC 11/19] s390/zcrypt: validate " Tony Krowiak
2017-10-13 17:38 ` [RFC 12/19] s390/zcrypt: sysfs support for control " Tony Krowiak
2017-10-13 17:38 ` [RFC 13/19] s390/zcrypt: validate " Tony Krowiak
2017-10-16  9:13   ` Martin Schwidefsky
2017-10-13 17:38 ` [RFC 14/19] KVM: s390: Connect the AP mediated matrix device to KVM Tony Krowiak
2017-10-13 17:39 ` [RFC 15/19] s390/zcrypt: introduce ioctl access to VFIO AP Matrix driver Tony Krowiak
2017-10-13 17:39 ` [RFC 16/19] KVM: s390: interface to configure KVM guest's AP matrix Tony Krowiak
2017-10-16 20:22   ` Tony Krowiak
2017-11-14 13:46   ` Cornelia Huck
2017-10-13 17:39 ` Tony Krowiak [this message]
2017-10-13 17:39 ` [RFC 18/19] KVM: s390: New ioctl " Tony Krowiak
2017-11-02 18:55   ` Tony Krowiak
2017-10-13 17:39 ` [RFC 19/19] s390/facilities: enable AP facilities needed by guest Tony Krowiak
2017-10-16  9:25   ` Martin Schwidefsky
2017-11-02 12:08     ` Christian Borntraeger
2017-11-02 12:23       ` Halil Pasic
     [not found]       ` <af1bb867-f9a0-458b-b7b2-c0bb9456eb7f@linux.vnet.ibm.com>
2017-11-02 15:53         ` Christian Borntraeger
2017-11-02 18:49           ` Tony Krowiak
2017-11-03  8:47             ` Christian Borntraeger
2017-12-02  1:30               ` Tony Krowiak
2017-12-05  7:52                 ` Harald Freudenberger
2017-12-05 14:04                   ` Cornelia Huck
2017-12-05 14:23                     ` Pierre Morel
2017-12-05 14:30                       ` Cornelia Huck
2017-12-05 14:47                         ` Pierre Morel
2017-12-05 15:14                       ` Tony Krowiak
2017-12-05 15:01                     ` Tony Krowiak
2017-12-06  9:15                       ` Pierre Morel
2017-12-06 10:15                         ` Cornelia Huck
2017-12-05 14:14                   ` Tony Krowiak
     [not found]         ` <OF182217F7.6A47A64E-ON002581CD.002BCF58-C12581CD.002D4127@notes.na.collabserv.com>
2017-11-03  8:49           ` Christian Borntraeger
2017-10-16  9:27 ` [RFC 00/19] KVM: s390/crypto/vfio: guest dedicated crypto adapters Martin Schwidefsky
2017-10-16 10:06   ` Christian Borntraeger
2017-10-16 16:30     ` Tony Krowiak
2017-10-16 10:05 ` Cornelia Huck
2017-10-16 16:27   ` Tony Krowiak
2017-10-18 16:43 ` Christian Borntraeger
2017-10-29 11:11 ` Cornelia Huck
2017-10-30  8:57   ` Christian Borntraeger
2017-10-30  8:57     ` [Qemu-devel] " Christian Borntraeger
2017-10-30 15:34     ` Tony Krowiak
2017-10-30 19:04     ` Tony Krowiak
2017-10-30 19:04       ` [Qemu-devel] " Tony Krowiak
2017-10-31 19:39 ` Tony Krowiak
2017-11-14 13:57   ` Cornelia Huck
2017-11-16 15:23     ` Tony Krowiak
2017-11-16 16:06       ` Pierre Morel
2017-11-16 17:03         ` Cornelia Huck
2017-11-16 20:25           ` Pierre Morel
2017-11-16 23:35             ` Tony Krowiak
2017-11-17  7:07               ` Pierre Morel
2017-11-17 10:07                 ` Cornelia Huck
2017-11-17 10:07                   ` Cornelia Huck
2017-11-17 20:28                   ` Tony Krowiak
2017-11-20 17:13                     ` Cornelia Huck
2017-11-21 16:08                       ` Tony Krowiak
2017-11-22 13:47                         ` Cornelia Huck
2017-11-28  0:39                           ` Tony Krowiak
2017-12-05 14:06                             ` Cornelia Huck
2017-12-05 15:09                               ` Tony Krowiak
2017-11-16 16:49       ` Cornelia Huck
2017-11-16 23:41         ` Tony Krowiak
2017-11-17  9:49           ` Cornelia Huck

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=1507916344-3896-18-git-send-email-akrowiak@linux.vnet.ibm.com \
    --to=akrowiak@linux.vnet.ibm.com \
    --cc=alex.williamson@redhat.com \
    --cc=alifm@linux.vnet.ibm.com \
    --cc=bjsdjshi@linux.vnet.ibm.com \
    --cc=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=freude@de.ibm.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=jjherne@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kwankhede@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mjrosato@linux.vnet.ibm.com \
    --cc=pasic@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=pmorel@linux.vnet.ibm.com \
    --cc=qemu-s390x@nongnu.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=thuth@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.