linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Cornelia Huck <cohuck@redhat.com>
To: Tony Krowiak <akrowiak@linux.vnet.ibm.com>
Cc: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org, freude@de.ibm.com, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, borntraeger@de.ibm.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, jjherne@linux.vnet.ibm.com,
	thuth@redhat.com, pasic@linux.vnet.ibm.com, berrange@redhat.com,
	fiuczy@linux.vnet.ibm.com, buendgen@de.ibm.com,
	frankja@linux.ibm.com, Tony Krowiak <akrowiak@linux.ibm.com>
Subject: Re: [PATCH v9 22/22] s390: doc: detailed specifications for AP virtualization
Date: Mon, 20 Aug 2018 18:03:59 +0200	[thread overview]
Message-ID: <20180820180359.38cc4af3.cohuck@redhat.com> (raw)
In-Reply-To: <1534196899-16987-23-git-send-email-akrowiak@linux.vnet.ibm.com>

On Mon, 13 Aug 2018 17:48:19 -0400
Tony Krowiak <akrowiak@linux.vnet.ibm.com> wrote:

> From: Tony Krowiak <akrowiak@linux.ibm.com>
> 
> This patch provides documentation describing the AP architecture and
> design concepts behind the virtualization of AP devices. It also
> includes an example of how to configure AP devices for exclusive
> use of KVM guests.
> 
> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
> Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  Documentation/s390/vfio-ap.txt |  615 ++++++++++++++++++++++++++++++++++++++++
>  MAINTAINERS                    |    1 +
>  2 files changed, 616 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/s390/vfio-ap.txt
> 

> +AP Architectural Overview:
> +=========================
> +To facilitate the comprehension of the design, let's start with some
> +definitions:
> +
> +* AP adapter
> +
> +  An AP adapter is an IBM Z adapter card that can perform cryptographic
> +  functions. There can be from 0 to 256 adapters assigned to an LPAR. Adapters
> +  assigned to the LPAR in which a linux host is running will be available to
> +  the linux host. Each adapter is identified by a number from 0 to 255. When
> +  installed, an AP adapter is accessed by AP instructions executed by any CPU.
> +
> +  The AP adapter cards are assigned to a given LPAR via the system's Activation
> +  Profile which can be edited via the HMC. When the system is IPL'd, the AP bus

There's lots of s390 jargon in here... but one hopes that someone
trying to understand AP is already familiar with the basics...

> +  module is loaded and detects the AP adapter cards assigned to the LPAR. The AP
> +  bus creates a sysfs device for each adapter as they are detected. For example,
> +  if AP adapters 4 and 10 (0x0a) are assigned to the LPAR, the AP bus will
> +  create the following sysfs entries:
> +
> +    /sys/devices/ap/card04
> +    /sys/devices/ap/card0a
> +
> +  Symbolic links to these devices will also be created in the AP bus devices
> +  sub-directory:
> +
> +    /sys/bus/ap/devices/[card04]
> +    /sys/bus/ap/devices/[card04]
> +
> +* AP domain
> +
> +  An adapter is partitioned into domains. Each domain can be thought of as
> +  a set of hardware registers for processing AP instructions. An adapter can
> +  hold up to 256 domains. Each domain is identified by a number from 0 to 255.
> +  Domains can be further classified into two types:
> +
> +    * Usage domains are domains that can be accessed directly to process AP
> +      commands.
> +
> +    * Control domains are domains that are accessed indirectly by AP
> +      commands sent to a usage domain to control or change the domain; for
> +      example, to set a secure private key for the domain.
> +
> +  The AP usage and control domains are assigned to a given LPAR via the system's
> +  Activation Profile which can be edited via the HMC. When the system is IPL'd,
> +  the AP bus module is loaded and detects the AP usage and control domains
> +  assigned to the LPAR. The domain number of each usage domain will be coupled
> +  with the adapter number of each AP adapter assigned to the LPAR to identify
> +  the AP queues (see AP Queue section below). The domain number of each control
> +  domain will be represented in a bitmask and stored in a sysfs file
> +  /sys/bus/ap/ap_control_domain_mask created by the bus. The bits in the mask,
> +  from most to least significant bit, correspond to domains 0-255.
> +
> +  A domain may be assigned to a system as both a usage and control domain, or
> +  as a control domain only. Consequently, all domains assigned as both a usage
> +  and control domain can both process AP commands as well as be changed by an AP
> +  command sent to any usage domain assigned to the same system. Domains assigned
> +  only as control domains can not process AP commands but can be changed by AP
> +  commands sent to any usage domain assigned to the system.

I'm struggling a bit with this paragraph. Does that mean that you can
use control domains as the target of an instruction changing
configuration on the system? (Or on the VM, if they are listed in the
relevant control block?)

> +
> +* AP Queue
> +
> +  An AP queue is the means by which an AP command-request message is sent to a
> +  usage domain inside a specific adapter. An AP queue is identified by a tuple
> +  comprised of an AP adapter ID (APID) and an AP queue index (APQI). The
> +  APQI corresponds to a given usage domain number within the adapter. This tuple
> +  forms an AP Queue Number (APQN) uniquely identifying an AP queue. AP
> +  instructions include a field containing the APQN to identify the AP queue to
> +  which the AP command-request message is to be sent for processing.
> +
> +  The AP bus will create a sysfs device for each APQN that can be derived from
> +  the cross product of the AP adapter and usage domain numbers detected when the
> +  AP bus module is loaded. For example, if adapters 4 and 10 (0x0a) and usage
> +  domains 6 and 71 (0x47) are assigned to the LPAR, the AP bus will create the
> +  following sysfs entries:
> +
> +    /sys/devices/ap/card04/04.0006
> +    /sys/devices/ap/card04/04.0047
> +    /sys/devices/ap/card0a/0a.0006
> +    /sys/devices/ap/card0a/0a.0047
> +
> +  The following symbolic links to these devices will be created in the AP bus
> +  devices subdirectory:
> +
> +    /sys/bus/ap/devices/[04.0006]
> +    /sys/bus/ap/devices/[04.0047]
> +    /sys/bus/ap/devices/[0a.0006]
> +    /sys/bus/ap/devices/[0a.0047]
> +
> +* AP Instructions:
> +
> +  There are three AP instructions:
> +
> +  * NQAP: to enqueue an AP command-request message to a queue
> +  * DQAP: to dequeue an AP command-reply message from a queue
> +  * PQAP: to administer the queues

So, NQAP/DQAP need usage domains, while PQAP needs a control domain? Or
is it that all of them need usage domains, but PQAP can target a control
domain as well?

[I don't want to dive deeply into the AP architecture here, just far
enough to really understand the design implications.]

> +
> +AP and SIE:
> +==========
> +Let's now take a look at how AP instructions executed on a guest are interpreted
> +by the hardware.
> +
> +A satellite control block called the Crypto Control Block (CRYCB) is attached to
> +our main hardware virtualization control block. The CRYCB contains three fields
> +to identify the adapters, usage domains and control domains assigned to the KVM
> +guest:
> +
> +* The AP Mask (APM) field is a bit mask that identifies the AP adapters assigned
> +  to the KVM guest. Each bit in the mask, from most significant to least
> +  significant bit, corresponds to an APID from 0-255. If a bit is set, the
> +  corresponding adapter is valid for use by the KVM guest.
> +
> +* The AP Queue Mask (AQM) field is a bit mask identifying the AP usage domains
> +  assigned to the KVM guest. Each bit in the mask, from most significant to
> +  least significant bit, corresponds to an AP queue index (APQI) from 0-255. If
> +  a bit is set, the corresponding queue is valid for use by the KVM guest.
> +
> +* The AP Domain Mask field is a bit mask that identifies the AP control domains
> +  assigned to the KVM guest. The ADM bit mask controls which domains can be
> +  changed by an AP command-request message sent to a usage domain from the
> +  guest. Each bit in the mask, from least significant to most significant bit,
> +  corresponds to a domain from 0-255. If a bit is set, the corresponding domain
> +  can be modified by an AP command-request message sent to a usage domain
> +  configured for the KVM guest.

OK, that seems to imply that you modify a control domain by sending a
request to (any) usage domain? I do not doubt that, but the whole
architecture is really confusing :)

> +
> +If you recall from the description of an AP Queue, AP instructions include
> +an APQN to identify the AP adapter and AP queue to which an AP command-request
> +message is to be sent (NQAP and PQAP instructions), or from which a
> +command-reply message is to be received (DQAP instruction). The validity of an
> +APQN is defined by the matrix calculated from the APM and AQM; it is the
> +cross product of all assigned adapter numbers (APM) with all assigned queue
> +indexes (AQM). For example, if adapters 1 and 2 and usage domains 5 and 6 are
> +assigned to a guest, the APQNs (1,5), (1,6), (2,5) and (2,6) will be valid for
> +the guest.

How does the control domain mask interact with that? Can you send a
command to an APQN valid for the guest to modify any control domain
specified in the mask? Does the SIE complain if you specify a control
domain that the host does not have access to (I'd guess so)?

> +
> +The APQNs can provide secure key functionality - i.e., a private key is stored
> +on the adapter card for each of its domains - so each APQN must be assigned to
> +at most one guest or to the linux host.
> +
> +   Example 1: Valid configuration:
> +   ------------------------------
> +   Guest1: adapters 1,2  domains 5,6
> +   Guest2: adapter  1,2  domain 7
> +
> +   This is valid because both guests have a unique set of APQNs: Guest1 has
> +   APQNs (1,5), (1,6), (2,5) and (2,6); Guest2 has APQNs (1,7) and (2,7).
> +
> +   Example 2: Invalid configuration:
> +   Guest1: adapters 1,2  domains 5,6
> +   Guest2: adapter  1    domains 6,7
> +
> +   This is an invalid configuration because both guests have access to
> +   APQN (1,6).

So, the adapters or the domains can overlap , but the cross product
mustn't? If I had

Guest1: adapters 1,2 domains 5,6
Guest2: adapters 3,4 domains 5,6

would that be fine?

Is there any rule about shared control domains?

(...)

> +Limitations
> +===========
> +* The KVM/kernel interfaces do not provide a way to prevent unbinding an AP
> +  queue that is still assigned to a mediated device. Even if the device
> +  'remove' callback returns an error, the device core detaches the AP
> +  queue from the VFIO AP driver. It is therefore incumbent upon the
> +  administrator to make sure there is no mediated device to which the
> +  APQN - for the AP queue being unbound - is assigned.
> +
> +* Hot plug/unplug of AP devices is not supported for guests.

Not sure what that sentence means. Adding/removing devices by the
hypervisor is not supported? Or some guest actions, respectively
injecting notifications that would trigger some actions on the real
hardware?

Do you want to add (some of) this in the future?

> +
> +* Live guest migration is not supported for guests using AP devices.

Migration and vfio is an interesting area in general :) Would be great
if vfio-ap could benefit from any generic efforts in that area, but
that probably requires that someone with access to documentation and
hardware keeps an eye on developments.

> \ No newline at end of file

Please add one :)

  reply	other threads:[~2018-08-20 16:04 UTC|newest]

Thread overview: 138+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-13 21:47 [PATCH v9 00/22] guest dedicated crypto adapters Tony Krowiak
2018-08-13 21:47 ` [PATCH v9 01/22] s390/zcrypt: Add ZAPQ inline function Tony Krowiak
2018-08-13 21:47 ` [PATCH v9 02/22] s390/zcrypt: Review inline assembler constraints Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 03/22] s390/zcrypt: Show load of cards and queues in sysfs Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 04/22] s390/zcrypt: Integrate ap_asm.h into include/asm/ap.h Tony Krowiak
2018-08-14  8:43   ` Cornelia Huck
2018-08-17 13:18     ` Tony Krowiak
2018-08-17 13:27       ` Cornelia Huck
2018-08-17 19:09         ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 05/22] KVM: s390: vsie: simulate VCPU SIE entry/exit Tony Krowiak
2018-08-14  8:50   ` Cornelia Huck
2018-08-14 12:46     ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 06/22] KVM: s390: introduce and use KVM_REQ_VSIE_RESTART Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 07/22] KVM: s390: refactor crypto initialization Tony Krowiak
2018-08-20 16:41   ` David Hildenbrand
2018-08-20 20:33     ` Tony Krowiak
2018-08-20 20:41       ` David Hildenbrand
2018-08-21 13:29         ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 08/22] s390: vfio-ap: base implementation of VFIO AP device driver Tony Krowiak
2018-08-14 10:42   ` Cornelia Huck
2018-08-14 23:30     ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 09/22] s390: vfio-ap: register matrix device with VFIO mdev framework Tony Krowiak
2018-08-14 11:19   ` Cornelia Huck
2018-08-15 16:51     ` Tony Krowiak
2018-08-16 16:24     ` Tony Krowiak
2018-08-17  8:43       ` Cornelia Huck
2018-08-17 19:02         ` Tony Krowiak
2018-09-06  8:49   ` Pierre Morel
2018-09-10 13:38     ` Tony Krowiak
2018-09-10 21:58       ` Halil Pasic
2018-08-13 21:48 ` [PATCH v9 10/22] s390: vfio-ap: sysfs interfaces to configure adapters Tony Krowiak
2018-08-15  9:52   ` Cornelia Huck
2018-08-15 16:59     ` Tony Krowiak
2018-08-16  7:30       ` Cornelia Huck
2018-08-17 13:23         ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 11/22] s390: vfio-ap: sysfs interfaces to configure domains Tony Krowiak
2018-08-15 12:05   ` Cornelia Huck
2018-08-15 17:00     ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 12/22] s390: vfio-ap: sysfs interfaces to configure control domains Tony Krowiak
2018-08-20 14:23   ` Cornelia Huck
2018-08-20 16:43     ` Halil Pasic
2018-08-20 17:41     ` Tony Krowiak
2018-08-21 15:25       ` Cornelia Huck
2018-08-21 17:07         ` Tony Krowiak
2018-08-21 23:18           ` Halil Pasic
2018-08-22  9:42             ` Cornelia Huck
2018-08-22 10:43               ` Halil Pasic
2018-08-22 11:03               ` Pierre Morel
2018-08-22 15:11                 ` Christian Borntraeger
2018-08-22 15:34                   ` Pierre Morel
2018-08-22 15:48                     ` Christian Borntraeger
2018-08-22 15:53                       ` Pierre Morel
2018-08-22 17:11                       ` Halil Pasic
2018-08-22 19:16                         ` Tony Krowiak
2018-08-23  9:26                           ` Halil Pasic
2018-08-23 10:41                             ` Pierre Morel
2018-08-23 10:25                           ` Cornelia Huck
2018-08-23 10:43                             ` Pierre Morel
2018-08-23 11:31                               ` Cornelia Huck
2018-08-23 11:44                                 ` Pierre Morel
2018-08-23 14:16                             ` Tony Krowiak
2018-08-27  8:33                               ` Cornelia Huck
2018-08-27 13:47                                 ` Tony Krowiak
2018-08-27 13:51                                   ` Cornelia Huck
2018-08-27 15:39                                     ` Halil Pasic
2018-09-10 13:27                                     ` Tony Krowiak
2018-08-22 15:18               ` Tony Krowiak
2018-08-22 14:31             ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 13/22] s390: vfio-ap: sysfs interface to view matrix mdev matrix Tony Krowiak
2018-08-20 14:08   ` Cornelia Huck
2018-09-12 17:01     ` Tony Krowiak
2018-09-13  9:12       ` Halil Pasic
2018-08-13 21:48 ` [PATCH v9 14/22] KVM: s390: interfaces to clear CRYCB masks Tony Krowiak
2018-08-15 13:10   ` Cornelia Huck
2018-08-15 17:55     ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 15/22] s390: vfio-ap: implement mediated device open callback Tony Krowiak
2018-08-15 16:08   ` Cornelia Huck
2018-08-15 18:21     ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 16/22] s390: vfio-ap: implement VFIO_DEVICE_GET_INFO ioctl Tony Krowiak
2018-08-20 14:24   ` Cornelia Huck
2018-08-13 21:48 ` [PATCH v9 17/22] s390: vfio-ap: zeroize the AP queues Tony Krowiak
2018-08-15 16:24   ` Cornelia Huck
2018-08-15 20:36     ` Tony Krowiak
2018-08-17  9:34       ` Cornelia Huck
2018-08-13 21:48 ` [PATCH v9 18/22] s390: vfio-ap: implement VFIO_DEVICE_RESET ioctl Tony Krowiak
2018-08-15 16:38   ` Cornelia Huck
2018-08-15 21:05     ` Tony Krowiak
2018-08-17  9:38       ` Cornelia Huck
2018-08-17 19:03         ` Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 19/22] KVM: s390: Clear Crypto Control Block when using vSIE Tony Krowiak
2018-08-13 21:48 ` [PATCH v9 20/22] KVM: s390: Handling of Cypto control block in VSIE Tony Krowiak
2018-08-21  8:30   ` David Hildenbrand
2018-08-13 21:48 ` [PATCH v9 21/22] KVM: s390: CPU model support for AP virtualization Tony Krowiak
2018-08-20 14:26   ` Cornelia Huck
2018-08-21  8:03   ` David Hildenbrand
2018-08-22 11:19   ` David Hildenbrand
2018-08-22 11:24     ` David Hildenbrand
2018-08-22 20:16       ` Tony Krowiak
2018-08-23  7:44         ` David Hildenbrand
2018-08-23 10:00           ` Halil Pasic
2018-08-23 10:28             ` David Hildenbrand
2018-08-23 11:10               ` Pierre Morel
2018-08-23 11:12                 ` David Hildenbrand
2018-08-23 12:47                   ` Pierre Morel
2018-08-23 13:22                     ` Halil Pasic
2018-08-23 13:38                       ` David Hildenbrand
2018-08-23 14:59                         ` Pierre Morel
2018-08-23 17:35                           ` Tony Krowiak
2018-08-23 17:40                             ` David Hildenbrand
2018-08-24 10:28                               ` Halil Pasic
2018-08-22 14:33     ` Pierre Morel
2018-08-22 15:04       ` David Hildenbrand
2018-08-22 15:50         ` Pierre Morel
2018-08-22 16:57           ` David Hildenbrand
2018-08-22 21:05             ` Tony Krowiak
2018-08-23  7:42               ` David Hildenbrand
2018-08-22 20:54     ` Tony Krowiak
2018-08-23  7:48       ` David Hildenbrand
2018-08-23  8:24         ` Cornelia Huck
2018-09-12 17:42           ` Tony Krowiak
2018-09-17  7:57             ` David Hildenbrand
2018-08-23  8:26         ` Pierre Morel
2018-08-13 21:48 ` [PATCH v9 22/22] s390: doc: detailed specifications " Tony Krowiak
2018-08-20 16:03   ` Cornelia Huck [this message]
2018-08-20 20:16     ` Tony Krowiak
2018-08-21 16:13       ` Cornelia Huck
2018-08-21 19:21         ` Tony Krowiak
2018-08-21 18:54       ` Halil Pasic
2018-08-22  7:38         ` Cornelia Huck
2018-08-21  9:00     ` Harald Freudenberger
2018-08-21 15:53       ` Cornelia Huck
2018-08-22  7:04         ` Harald Freudenberger
2018-08-22 10:09           ` Cornelia Huck
2018-08-22 10:13         ` Harald Freudenberger
2018-08-22 10:45           ` Halil Pasic
2018-08-22 10:19 ` [PATCH v9 00/22] guest dedicated crypto adapters Cornelia Huck
2018-08-22 10:58   ` Pierre Morel
2018-08-22 18:59   ` Tony Krowiak

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=20180820180359.38cc4af3.cohuck@redhat.com \
    --to=cohuck@redhat.com \
    --cc=akrowiak@linux.ibm.com \
    --cc=akrowiak@linux.vnet.ibm.com \
    --cc=alex.williamson@redhat.com \
    --cc=alifm@linux.vnet.ibm.com \
    --cc=berrange@redhat.com \
    --cc=bjsdjshi@linux.vnet.ibm.com \
    --cc=borntraeger@de.ibm.com \
    --cc=buendgen@de.ibm.com \
    --cc=fiuczy@linux.vnet.ibm.com \
    --cc=frankja@linux.ibm.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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).