s390x: vfio-ap: guest dedicated crypto adapters
v11 cover s390x: vfio-ap: guest dedicated crypto adapters
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in docs/vfio-ap.txt for a more complete discussion of the design introduced by this patch series.
v10 => v11 Change log:
=====================
* Replaced DO_UPCAST macros in ap.c
* Initializing GError in vfio_ap_get_group() function (BUG)
* Updated s390 maintainers with new files in MAINTAINERS
* Fixed memory leak in vfio_ap_get_group() function
v9 => v10 Change log:
====================
* Removed KVM_S390_VM_CPU_FEAT_AP feature from kvm.h
* Moved check for KVM_S390_VM_CRYPTO_ENABLE_APIE from patch 2/6 to patch 3/6
* Removed vfio from all function names in ap-bridge.c
* Removed unused macros and structure from ap-bridge.h
* Removed unused macros from ap-device.h
v8 => v9 Change log:
===================
* Removed all references to VFIO in AP bridge and bus
* Expose AP feature only if the KVM_S390_VM_CRYPTO_ENABLE_APIE VM attribute is exposed by KVM - i.e., if AP instructions are available on the linux host.
* Enable AP interpretation only if AP feature is switched on; no need to disable because it is disabled by default.
v7 => v8 Change log:
===================
* Enable SIE interpretation AP instructions if the CPU model feature for AP instructions is turned on for the guest.
v6 => v7 Change log;
===================
* Changed email address for Signed-off-by
v5 => v6 Change log:
===================
* Added reset handling fo vfio-ap device
* Added a bridge/bus to AP device object model - thanks to Halil Pasic
v4 => v5 Change log:
===================
* Added MAINTAINERS entries for VFIO AP
* Added explanation for why we are only supporting zEC12 and newer CPU models.
* Changed CPU model feature qci=on|off to apqci=on|off
* Misc. minor changes
v3 => v4 Change log:
===================
* Made vfio-ap device unpluggable for now
* Renamed command line CPU model feature for QCI: qci=on -> apqci=on
* Removed call to KVM_S390_VM_CRYPTO_INTERPRET_AP ioctl - ioctl was removed from kernel and AP instruction interpretation is set from the VFIO device driver
* Added check to ensure only one vfio-ap device can be configured per guest
* Removed AP instruction interception handlers: AP instructions will be interpreted by default if AP facilities are installed to handle the case where feature ap=on and no vfio-ap device is configured for the guest.
Tony Krowiak (6):
linux-headers: linux header updates for AP support s390x/cpumodel: Set up CPU model for AP device support s390x/kvm: enable AP instruction interpretation for guest s390x/ap: base Adjunct Processor (AP) object model s390x/vfio: ap: Introduce VFIO AP device
s390: doc: detailed specifications for AP virtualization
MAINTAINERS | 16 + default-configs/s390x-softmmu.mak | 1 + docs/vfio-ap.txt | 825 ++++++++++++++++++++++++++++++ hw/s390x/Makefile.objs | 2 + hw/s390x/ap-bridge.c | 78 +++ hw/s390x/ap-device.c | 38 ++ hw/s390x/s390-virtio-ccw.c | 4 + hw/vfio/Makefile.objs | 1 + hw/vfio/ap.c | 179 +++++++ include/hw/s390x/ap-bridge.h | 19 + include/hw/s390x/ap-device.h | 22 + include/hw/vfio/vfio-common.h | 1 + linux-headers/asm-s390/kvm.h | 2 + linux-headers/linux/vfio.h | 2 + target/s390x/cpu_features.c | 3 + target/s390x/cpu_features_def.h | 3 + target/s390x/cpu_models.c | 2 + target/s390x/gen-features.c | 3 + target/s390x/kvm.c | 19 + 19 files changed, 1220 insertions(+) create mode 100644 docs/vfio-ap.txt create mode 100644 hw/s390x/ap-bridge.c create mode 100644 hw/s390x/ap-device.c create mode 100644 hw/vfio/ap.c create mode 100644 include/hw/s390x/ap-bridge.h create mode 100644 include/hw/s390x/ap-device.h
Signature · 1 line
2.19.0.221.g150f307
PATCH v11 1/6 linux-headers: linux header updates for AP support
Updates the linux header files in preparation for introduction of the VFIO AP device:
* Added device attributes to the KVM_S390_VM_CRYPTO group to indicate whether AP instructions are to be interpreted
* Added VFIO device information for AP devices
--- linux-headers/asm-s390/kvm.h | 2 ++ linux-headers/linux/vfio.h | 2 ++ 2 files changed, 4 insertions(+)
linux-headers/asm-s390/kvm.h +2 -0
@@ -160,6 +160,8 @@ struct kvm_s390_vm_cpu_subfunc {#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3 +#define KVM_S390_VM_CRYPTO_ENABLE_APIE 4 +#define KVM_S390_VM_CRYPTO_DISABLE_APIE 5/* kvm attributes for migration mode */ #define KVM_S390_VM_MIGRATION_STOP 0
linux-headers/linux/vfio.h +2 -0
@@ -200,6 +200,7 @@ struct vfio_device_info {#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2)/* vfio-platform device */ #define VFIO_DEVICE_FLAGS_AMBA (1 << 3)/* vfio-amba device */ #define VFIO_DEVICE_FLAGS_CCW (1 << 4)/* vfio-ccw device */ +#define VFIO_DEVICE_FLAGS_AP (1 << 5)/* vfio-ap device */ __u32 num_regions;/* Max region index + 1 */ __u32 num_irqs;/* Max IRQ index + 1 */ };
@@ -215,6 +216,7 @@ struct vfio_device_info {#define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform"#define VFIO_DEVICE_API_AMBA_STRING "vfio-amba"#define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" +#define VFIO_DEVICE_API_AP_STRING "vfio-ap"/** * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8,
Signature · 1 line
2.19.0.221.g150f307
PATCH v11 2/6 s390x/cpumodel: Set up CPU model for AP device support
In reply to Tony KrowiakA new CPU model feature and two new CPU model facilities are introduced to support AP devices for a KVM guest.
CPU model features:
1. The S390_FEAT_AP CPU model feature indicates whether AP instructions are available to the guest. This feature will be enabled only if the AP instructions are available on the linux host as determined by the availability of the KVM_S390_VM_CRYPTO_ENABLE_APIE VM attribute which is exposed by KVM only if the AP instructions are available on the host.
This feature must be turned on from userspace to execute AP instructions on the KVM guest. The QEMU command line to turn this feature on looks something like this:
qemu-system-s390x ... -cpu xxx,ap=on ...
This feature will be supported for zEC12 and newer CPU models. The feature will not be supported for older models because there are few older systems on which to test and the older crypto cards will be going out of service in the relatively near future.
CPU model facilities:
1. The S390_FEAT_AP_QUERY_CONFIG_INFO feature indicates whether the AP Query Configuration Information (QCI) facility is available to the guest as determined by whether the facility is available on the host. This feature will be exposed by KVM only if the QCI facility is installed on the host.
2. The S390_FEAT_AP_FACILITY_TEST feature indicates whether the AP Facility Test (APFT) facility is available to the guest as determined by whether the facility is available on the host. This feature will be exposed by KVM only if APFT is installed on the host.
--- target/s390x/cpu_features.c | 3 +++ target/s390x/cpu_features_def.h | 3 +++ target/s390x/cpu_models.c | 2 ++ target/s390x/gen-features.c | 3 +++ 4 files changed, 11 insertions(+)
target/s390x/cpu_features.c +3 -0
@@ -39,8 +39,10 @@ static const S390FeatDef s390_features[] = {FEAT_INIT ("srs" ,S390_FEAT_TYPE_STFL ,9 ,"Sense-running-status facility" ),FEAT_INIT ("csske" ,S390_FEAT_TYPE_STFL ,10 ,"Conditional-SSKE facility" ),FEAT_INIT ("ctop" ,S390_FEAT_TYPE_STFL ,11 ,"Configuration-topology facility" ), +FEAT_INIT ("apqci" ,S390_FEAT_TYPE_STFL ,12 ,"Query AP Configuration Information facility" ),FEAT_INIT ("ipter" ,S390_FEAT_TYPE_STFL ,13 ,"IPTE-range facility" ),FEAT_INIT ("nonqks" ,S390_FEAT_TYPE_STFL ,14 ,"Nonquiescing key-setting facility" ), +FEAT_INIT ("apft" ,S390_FEAT_TYPE_STFL ,15 ,"AP Facilities Test facility" ),FEAT_INIT ("etf2" ,S390_FEAT_TYPE_STFL ,16 ,"Extended-translation facility 2" ),FEAT_INIT ("msa-base" ,S390_FEAT_TYPE_STFL ,17 ,"Message-security-assist facility (excluding subfunctions)" ), FEAT_INIT("ldisp", S390_FEAT_TYPE_STFL, 18, "Long-displacement facility"),
@@ -129,6 +131,7 @@ static const S390FeatDef s390_features[] = {FEAT_INIT_MISC ("dateh2" ,"DAT-enhancement facility 2" ),FEAT_INIT_MISC ("cmm" ,"Collaborative-memory-management facility" ), +FEAT_INIT_MISC ("ap" ,"AP instructions installed" ),FEAT_INIT ("plo-cl" ,S390_FEAT_TYPE_PLO ,0 ,"PLO Compare and load (32 bit in general registers)" ), FEAT_INIT("plo-clg", S390_FEAT_TYPE_PLO, 1, "PLO Compare and load (64 bit in parameter list)"),
target/s390x/cpu_features_def.h +3 -0
@@ -27,8 +27,10 @@ typedef enum {S390_FEAT_SENSE_RUNNING_STATUS ,S390_FEAT_CONDITIONAL_SSKE ,S390_FEAT_CONFIGURATION_TOPOLOGY , +S390_FEAT_AP_QUERY_CONFIG_INFO ,S390_FEAT_IPTE_RANGE ,S390_FEAT_NONQ_KEY_SETTING , +S390_FEAT_AP_FACILITIES_TEST ,S390_FEAT_EXTENDED_TRANSLATION_2 ,S390_FEAT_MSA , S390_FEAT_LONG_DISPLACEMENT,
@@ -119,6 +121,7 @@ typedef enum {/* Misc */ S390_FEAT_DAT_ENH_2 ,S390_FEAT_CMM , +S390_FEAT_AP ,/* PLO */ S390_FEAT_PLO_CL,
target/s390x/cpu_models.c +2 -0
@@ -786,6 +786,8 @@ static void check_consistency(const S390CPUModel *model) { S390_FEAT_PRNO_TRNG_QRTCR, S390_FEAT_MSA_EXT_5 }, { S390_FEAT_PRNO_TRNG, S390_FEAT_MSA_EXT_5 }, { S390_FEAT_SIE_KSS, S390_FEAT_SIE_F2 }, + { S390_FEAT_AP_QUERY_CONFIG_INFO, S390_FEAT_AP }, + { S390_FEAT_AP_FACILITIES_TEST, S390_FEAT_AP }, };int i;
target/s390x/gen-features.c +3 -0
@@ -447,6 +447,9 @@ static uint16_t full_GEN12_GA1[] = {S390_FEAT_ADAPTER_INT_SUPPRESSION ,S390_FEAT_EDAT_2 ,S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2 , +S390_FEAT_AP_QUERY_CONFIG_INFO , +S390_FEAT_AP_FACILITIES_TEST , + S390_FEAT_AP, }; static uint16_t full_GEN12_GA2[] = {
Signature · 1 line
2.19.0.221.g150f307
PATCH v11 3/6 s390x/kvm: enable AP instruction interpretation for guest
In reply to Tony KrowiakLet's use the KVM_SET_DEVICE_ATTR ioctl to enable hardware interpretation of AP instructions executed on the guest. If the S390_FEAT_AP feature is switched on for the guest, AP instructions must be interpreted by default; otherwise, they will be intercepted.
This attribute setting may be overridden by a device. For example, a device may want to provide AP instructions to the guest (i.e., S390_FEAT_AP turned on), but it may want to emulate them. In this case, the AP instructions executed on the guest must be intercepted; so when the device is realized, it must disable interpretation.
--- target/s390x/kvm.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
target/s390x/kvm.c +19 -0
@@ -2299,11 +2299,26 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)error_setg (errp,"KVM: host CPU model could not be identified" );return ; } +/* for now, we can only provide the AP feature with HW support */ +if (kvm_vm_check_attr (kvm_state,KVM_S390_VM_CRYPTO , +KVM_S390_VM_CRYPTO_ENABLE_APIE )) { +set_bit (S390_FEAT_AP , model->features); + }/* strip of features that are not part of the maximum model */ bitmap_and (model->features, model->features, model->def->full_feat,S390_FEAT_MAX ); } +static void kvm_s390_configure_apie (bool interpret) +{ +uint64_t attr = interpret ?KVM_S390_VM_CRYPTO_ENABLE_APIE : +KVM_S390_VM_CRYPTO_DISABLE_APIE ; + +if (kvm_vm_check_attr (kvm_state,KVM_S390_VM_CRYPTO , attr)) { +kvm_s390_set_attr (attr); + } +} +void kvm_s390_apply_cpu_model (const S390CPUModel *model,Error **errp) {struct kvm_s390_vm_cpu_processor prop = {
@@ -2353,6 +2368,10 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)if (test_bit (S390_FEAT_CMM , model->features)) {kvm_s390_enable_cmma (); } + +if (test_bit (S390_FEAT_AP , model->features)) { +kvm_s390_configure_apie (true); + } }void kvm_s390_restart_interrupt (S390CPU *cpu)
Signature · 1 line
2.19.0.221.g150f307
PATCH v11 4/6 s390x/ap: base Adjunct Processor (AP) object model
In reply to Tony KrowiakIntroduces the base object model for virtualizing AP devices.
--- MAINTAINERS | 12 ++++++ hw/s390x/Makefile.objs | 2 + hw/s390x/ap-bridge.c | 78 ++++++++++++++++++++++++++++++++++++ hw/s390x/ap-device.c | 38 ++++++++++++++++++ hw/s390x/s390-virtio-ccw.c | 4 ++ include/hw/s390x/ap-bridge.h | 19 +++++++++ include/hw/s390x/ap-device.h | 22 ++++++++++ 7 files changed, 175 insertions(+) create mode 100644 hw/s390x/ap-bridge.c create mode 100644 hw/s390x/ap-device.c create mode 100644 include/hw/s390x/ap-bridge.h create mode 100644 include/hw/s390x/ap-device.h
MAINTAINERS +12 -0
@@ -1207,6 +1207,18 @@ F: include/hw/s390x/s390-ccw.h T: git git://github.com/cohuck/qemu.git s390-next L: [email protected] +vfio-ap +M: Christian Borntraeger <[email protected]> +M: Tony Krowiak <[email protected]> +M: Halil Pasic <[email protected]> +M: Pierre Morel <[email protected]> +S: Supported +F: hw/s390x/ap-device.c +F: hw/s390x/ap-bridge.c +F: include/hw/s390x/ap-device.h +F: include/hw/s390x/ap-bridge.h +L: [email protected] + vhost M: Michael S. Tsirkin <[email protected]> S: Supported
hw/s390x/Makefile.objs +2 -0
@@ -31,3 +31,5 @@ obj-$(CONFIG_TCG) += tod-qemu.o obj-$(CONFIG_KVM) += s390-skeys-kvm.o obj-$(CONFIG_KVM) += s390-stattrib-kvm.o obj-y += s390-ccw.o +obj-y += ap-device.o +obj-y += ap-bridge.o
hw/s390x/ap-bridge.c new file +78 -0
78 lines not on this page · raw message
hw/s390x/ap-device.c new file +38 -0
@@ -0,0 +1,38 @@ +/* +* Adjunct Processor (AP) matrix device +* +* Copyright 2018 IBM Corp. +* +* This work is licensed under the terms of the GNU GPL, version 2 or (at +* your option) any later version. See the COPYING file in the top-level +* directory. +*/ +#include "qemu/osdep.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "hw/qdev.h" +#include "hw/s390x/ap-device.h" + +static void ap_class_init (ObjectClass *klass,void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="AP device class" ; + dc->hotpluggable = false; +} + +static const TypeInfo ap_device_info = { + .name =AP_DEVICE_TYPE , + .parent =TYPE_DEVICE , + .instance_size =sizeof (APDevice), + .class_size =sizeof (DeviceClass), + .class_init = ap_class_init, + .abstract = true, +}; + +static void ap_device_register (void ) +{ +type_register_static (&ap_device_info); +} + +type_init (ap_device_register)
hw/s390x/s390-virtio-ccw.c +4 -0
@@ -32,6 +32,7 @@#include "ipl.h" #include "hw/s390x/s390-virtio-ccw.h" #include "hw/s390x/css-bridge.h" +#include "hw/s390x/ap-bridge.h" #include "migration/register.h" #include "cpu_models.h" #include "hw/nmi.h"
@@ -263,6 +264,9 @@ static void ccw_init(MachineState *machine)/* init the SIGP facility */ s390_init_sigp (); +/* create AP bridge and bus(es) */ +s390_init_ap (); +/* get a BUS */ css_bus =virtual_css_bus_init (); s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
include/hw/s390x/ap-bridge.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* ap bridge +* +* Copyright 2018 IBM Corp. +* +* This work is licensed under the terms of the GNU GPL, version 2 or (at +* your option) any later version. See the COPYING file in the top-level +* directory. +*/ + +#ifndef HW_S390X_AP_BRIDGE_H +#define HW_S390X_AP_BRIDGE_H + +#define TYPE_AP_BRIDGE "ap-bridge" +#define TYPE_AP_BUS "ap-bus" + +void s390_init_ap (void ); + +#endif
include/hw/s390x/ap-device.h new file +22 -0
@@ -0,0 +1,22 @@ +/* +* Adjunct Processor (AP) matrix device interfaces +* +* Copyright 2018 IBM Corp. +* +* This work is licensed under the terms of the GNU GPL, version 2 or (at +* your option) any later version. See the COPYING file in the top-level +* directory. +*/ +#ifndef HW_S390X_AP_DEVICE_H +#define HW_S390X_AP_DEVICE_H + +#define AP_DEVICE_TYPE "ap-device" + +typedef struct APDevice { +DeviceState parent_obj; +}APDevice ; + +#define AP_DEVICE (obj) \ + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) + +#endif /* HW_S390X_AP_DEVICE_H */
Signature · 1 line
2.19.0.221.g150f307
PATCH v11 5/6 s390x/vfio: ap: Introduce VFIO AP device
In reply to Tony KrowiakIntroduces a VFIO based AP device. The device is defined via the QEMU command line by specifying:
-device vfio-ap,sysfsdev=<path-to-mediated-matrix-device>
There may be only one vfio-ap device configured for a guest.
The mediated matrix device is created by the VFIO AP device driver by writing a UUID to a sysfs attribute file (see docs/vfio-ap.txt). The mediated matrix device will be named after the UUID. Symbolic links to the $uuid are created in many places, so the path to the mediated matrix device $uuid can be specified in any of the following ways:
/sys/devices/vfio_ap/matrix/$uuid /sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/$uuid /sys/bus/mdev/devices/$uuid/sys/bus/mdev/drivers/vfio_mdev/$uuid
When the vfio-ap device is realized, it acquires and opens the VFIO iommu group to which the mediated matrix device is bound. This causes a VFIO group notification event to be signaled. The vfio_ap device driver's group notification handler will get called at which time the device driver will configure the the AP devices to which the guest will be granted access.
--- MAINTAINERS | 2 + default-configs/s390x-softmmu.mak | 1 + hw/vfio/Makefile.objs | 1 + hw/vfio/ap.c | 179 ++++++++++++++++++++++++++++++ include/hw/vfio/vfio-common.h | 1 + 5 files changed, 184 insertions(+) create mode 100644 hw/vfio/ap.c
MAINTAINERS +2 -0
@@ -88,6 +88,7 @@ F: hw/char/terminal3270.c F: hw/intc/s390_flic.c F: hw/intc/s390_flic_kvm.c F: hw/s390x/ +F: hw/vfio/ap.c F: hw/vfio/ccw.c F: hw/watchdog/wdt_diag288.c F: include/hw/s390x/
@@ -1217,6 +1218,7 @@ F: hw/s390x/ap-device.c F: hw/s390x/ap-bridge.c F: include/hw/s390x/ap-device.h F: include/hw/s390x/ap-bridge.h +F: hw/vfio/ap.c L: [email protected] vhost
default-configs/s390x-softmmu.mak +1 -0
@@ -7,3 +7,4 @@ CONFIG_S390_FLIC=y CONFIG_S390_FLIC_KVM=$(CONFIG_KVM) CONFIG_VFIO_CCW=$(CONFIG_LINUX) CONFIG_WDT_DIAG288=y +CONFIG_VFIO_AP=$(CONFIG_LINUX)
hw/vfio/Makefile.objs +1 -0
@@ -6,4 +6,5 @@ obj-$(CONFIG_SOFTMMU) += platform.o obj-$(CONFIG_VFIO_XGMAC) += calxeda-xgmac.o obj-$(CONFIG_VFIO_AMD_XGBE) += amd-xgbe.o obj-$(CONFIG_SOFTMMU) += spapr.o +obj-$(CONFIG_VFIO_AP) += ap.o endif
hw/vfio/ap.c new file +179 -0
179 lines not on this page · raw message
include/hw/vfio/vfio-common.h +1 -0
@@ -37,6 +37,7 @@ enum {VFIO_DEVICE_TYPE_PCI =0 ,VFIO_DEVICE_TYPE_PLATFORM =1 ,VFIO_DEVICE_TYPE_CCW =2 , + VFIO_DEVICE_TYPE_AP = 3, }; typedef struct VFIOMmap {
Signature · 1 line
2.19.0.221.g150f307
Re: [Qemu-devel] [qemu-s390x] [PATCH v11 5/6] s390x/vfio: ap: Introduce VFIO AP device
Quoted 153 lines · Tony Krowiak
Introduces a VFIO based AP device. The device is defined via the QEMU command line by specifying:
-device vfio-ap,sysfsdev=<path-to-mediated-matrix-device>
There may be only one vfio-ap device configured for a guest.
The mediated matrix device is created by the VFIO AP device driver by writing a UUID to a sysfs attribute file (see
docs/vfio-ap.txt). The mediated matrix device will be named after the UUID. Symbolic links to the $uuid are created in many places, so the path to the mediated matrix device $uuid can be specified in any of the following ways:
/sys/devices/vfio_ap/matrix/$uuid/sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/$uuid/sys/bus/mdev/devices/$uuid/sys/bus/mdev/drivers/vfio_mdev/$uuidWhen the vfio-ap device is realized, it acquires and opens the VFIO iommu group to which the mediated matrix device is bound. This causes a VFIO group notification event to be signaled. The
vfio_apdevice driver's group notification handler will get called at which time the device driver will configure the the AP devices to which the guest will be granted access.Signed-off-by Tony Krowiak <[email protected]>Tested-by Pierre Morel<[email protected]>Acked-by Halil Pasic <[email protected]>Tested-by Pierre Morel<[email protected]>--- MAINTAINERS | 2 + default-configs/s390x-softmmu.mak | 1 + hw/vfio/Makefile.objs | 1 + hw/vfio/ap.c | 179 ++++++++++++++++++++++++++++++ include/hw/vfio/vfio-common.h | 1 + 5 files changed, 184 insertions(+) create mode 100644 hw/vfio/ap.cMAINTAINERS +2
-0@@ -88,6 +88,7 @@ F: hw/char/terminal3270.c F: hw/intc/s390_flic.c F: hw/intc/s390_flic_kvm.c F: hw/s390x/ +F: hw/vfio/ap.c F: hw/vfio/ccw.c F: hw/watchdog/wdt_diag288.c F: include/hw/s390x/@@ -1217,6 +1218,7 @@ F: hw/s390x/ap-device.c F: hw/s390x/ap-bridge.c F: include/hw/s390x/ap-device.h F: include/hw/s390x/ap-bridge.h +F: hw/vfio/ap.c L: [email protected] vhostdefault-configs/s390x-softmmu.mak +1
-0@@ -7,3 +7,4 @@ CONFIG_S390_FLIC=y CONFIG_S390_FLIC_KVM=$(CONFIG_KVM) CONFIG_VFIO_CCW=$(CONFIG_LINUX) CONFIG_WDT_DIAG288=y +CONFIG_VFIO_AP=$(CONFIG_LINUX)hw/vfio/Makefile.objs +1
-0@@ -6,4 +6,5 @@ obj-$(CONFIG_SOFTMMU) += platform.o obj-$(CONFIG_VFIO_XGMAC) += calxeda-xgmac.o obj-$(CONFIG_VFIO_AMD_XGBE) += amd-xgbe.o obj-$(CONFIG_SOFTMMU) += spapr.o +obj-$(CONFIG_VFIO_AP) += ap.o endifhw/vfio/ap.c new file +67
-0@@ -0,0 +1,179 @@ +/* +* VFIO based AP matrix device assignment +* +* Copyright 2018 IBM Corp. +* Author(s): Tony Krowiak <[email protected]> +* Halil Pasic <[email protected]> +* +* This work is licensed under the terms of the GNU GPL, version 2 or (at +* your option) any later version. See the COPYING file in the top-level +* directory. +*/ + +#include <linux/vfio.h> +#include <sys/ioctl.h> +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/sysbus.h" +#include "hw/vfio/vfio.h" +#include "hw/vfio/vfio-common.h" +#include "hw/s390x/ap-device.h" +#include "qemu/error-report.h" +#include "qemu/queue.h" +#include "qemu/option.h" +#include "qemu/config-file.h" +#include "cpu.h" +#include "kvm_s390x.h" +#include "sysemu/sysemu.h" +#include "hw/s390x/ap-bridge.h" +#include "exec/address-spaces.h" + +#define VFIO_AP_DEVICE_TYPE "vfio-ap" + +typedef struct VFIOAPDevice { +APDevice apdev; +VFIODevice vdev; +}VFIOAPDevice ; + +#define VFIO_AP_DEVICE (obj) \ + OBJECT_CHECK(VFIOAPDevice, (obj), VFIO_AP_DEVICE_TYPE) + +static void vfio_ap_compute_needs_reset (VFIODevice *vdev) +{ + vdev->needs_reset = false; +} + +/* +* We don't need vfio_hot_reset_multi and vfio_eoi operations for +* vfio-ap device now. +*/ +struct VFIODeviceOps vfio_ap_ops = { + .vfio_compute_needs_reset = vfio_ap_compute_needs_reset, +}; + +static void vfio_ap_put_device (VFIOAPDevice *vapdev) +{ +g_free (vapdev->vdev.name); +vfio_put_base_device (&vapdev->vdev); +} + +static VFIOGroup *vfio_ap_get_group (VFIOAPDevice *vapdev,Error **errp) +{ +GError *gerror =NULL ; +char *symlink, *group_path; +int groupid; + + symlink =g_strdup_printf ("%s/iommu_group" , vapdev->vdev.sysfsdev); + group_path =g_file_read_link (symlink, &gerror);
hw/vfio/ap.c line 77
Quoted 10 lines
hw/vfio/ap.c new file +10
-0+g_free (symlink); + +if (!group_path) { +error_setg (errp,"%s: no iommu_group found for %s: %s" , +VFIO_AP_DEVICE_TYPE , vapdev->vdev.sysfsdev, gerror->message); +return NULL ; + } + +if (sscanf (basename (group_path),"%d" , &groupid) !=1 ) { +error_setg (errp,"vfio: failed to read %s" , group_path);
You also need to g_free(group_path) in this error case here. Maybe Cornelia could add this when picking the patch up...
With that fix:
Quoted 7 lines
hw/vfio/ap.c new file +7
-0+return NULL ; + } + +g_free (group_path); + +return vfio_get_group (groupid, &address_space_memory, errp); +}
Re: [Qemu-devel] [PATCH v11 5/6] s390x/vfio: ap: Introduce VFIO AP device
In reply to Tony KrowiakQuoted 17 lines · On Wed, 10 Oct 2018 13:03:07 -0400 Tony Krowiak <[email protected]> wrote:
hw/vfio/ap.c new file +17
-0+static void vfio_ap_class_init (ObjectClass *klass,void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->props = vfio_ap_properties; + dc->vmsd = &vfio_ap_vmstate; + dc->desc ="VFIO-based AP device assignment" ; + dc->realize = vfio_ap_realize; + dc->unrealize = vfio_ap_unrealize; + dc->hotpluggable = false; + dc->reset = vfio_ap_reset; + dc->bus_type =TYPE_AP_BUS ; +} + +static const TypeInfo vfio_ap_info = { + .name =VFIO_AP_DEVICE_TYPE , + .parent =AP_DEVICE_TYPE ,
hw/vfio/ap.c line 179
Quoted 10 lines
hw/vfio/ap.c new file +10
-0+ .instance_size = sizeof(VFIOAPDevice), + .class_init = vfio_ap_class_init, +}; + +static void vfio_ap_type_init (void ) +{ +type_register_static (&vfio_ap_info); +} + +type_init (vfio_ap_type_init)
This device is missing the categorization, which was already requested in a previous version. I added it to the misc category myself.
PATCH v11 6/6 s390: doc: detailed specifications for AP virtualization
In reply to Tony KrowiakThis 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.
--- MAINTAINERS | 2 + docs/vfio-ap.txt | 825 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 827 insertions(+) create mode 100644 docs/vfio-ap.txt
MAINTAINERS +2 -0
@@ -96,6 +96,7 @@ F: include/hw/watchdog/wdt_diag288.h F: pc-bios/s390-ccw/ F: pc-bios/s390-ccw.img F: target/s390x/ +F: docs/vfio-ap.txt K: ^Subject:.*(?i)s390x? T: git git://github.com/cohuck/qemu.git s390-next L: [email protected]
@@ -1219,6 +1220,7 @@ F: hw/s390x/ap-bridge.c F: include/hw/s390x/ap-device.h F: include/hw/s390x/ap-bridge.h F: hw/vfio/ap.c +F: docs/vfio-ap.txt L: [email protected] vhost
docs/vfio-ap.txt new file +825 -0
825 lines not on this page · raw message
Signature · 1 line
2.19.0.221.g150f307
Quoted 7 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
Quoted 5 lines
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.v10 => v11 Change log:
Series seems to work fine.
Christian
Quoted 49 lines
=====================
* ReplacedDO_UPCASTmacros inap.c
* Initializing GError invfio_ap_get_group()function (BUG)
* Updated s390 maintainers with new files inMAINTAINERS
* Fixed memory leak invfio_ap_get_group()functionv9 => v10 Change log:
====================
* RemovedKVM_S390_VM_CPU_FEAT_APfeature fromkvm.h
* Moved check forKVM_S390_VM_CRYPTO_ENABLE_APIEfrom patch 2/6 to patch 3/6
* Removed vfio from all function names inap-bridge.c
* Removed unused macros and structure fromap-bridge.h
* Removed unused macros fromap-device.hv8 => v9 Change log:
===================
* Removed all references to VFIO in AP bridge and bus
* Expose AP feature only if theKVM_S390_VM_CRYPTO_ENABLE_APIEVM attribute is exposed by KVM - i.e., if AP instructions are available on the linux host.
* Enable AP interpretation only if AP feature is switched on; no need to disable because it is disabled by default.v7 => v8 Change log:
===================
* Enable SIE interpretation AP instructions if the CPU model feature for AP instructions is turned on for the guest.v6 => v7 Change log;
===================
* Changed email address for Signed-off-byv5 => v6 Change log:
===================
* Added reset handling fo vfio-ap device
* Added a bridge/bus to AP device object model - thanks to Halil Pasicv4 => v5 Change log:
===================
* AddedMAINTAINERSentries for VFIO AP
* Added explanation for why we are only supporting zEC12 and newer CPU models.
* Changed CPU model feature qci=on|off to apqci=on|off
* Misc. minor changesv3 => v4 Change log:
===================
* Made vfio-ap device unpluggable for now
Quoted 13 lines · Christian Borntraeger
Quoted 11 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.
Quoted 7 lines
Quoted 1 line
v10 => v11 Change log:
Series seems to work fine.
Christian
Had a quick glimpse over all patches, looks good and clean to me.
Signature · 3 lines
Thanks, David / dhildenb
Quoted 14 lines · David Hildenbrand
Quoted 13 lines · Christian Borntraeger
Quoted 11 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.
Quoted 7 lines
Quoted 5 lines
Quoted 1 line
v10 => v11 Change log:
Series seems to work fine.
Christian
Had a quick glimpse over all patches, looks good and clean to me.
FWIW, with one additional g_free() in patch 5, the series now also looks fine to me.
Thomas
Quoted 12 lines · On Wed, 10 Oct 2018 20:15:55 +0200 Christian Borntraeger…
Quoted 11 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.
Quoted 7 lines
Quoted 1 line
v10 => v11 Change log:
Series seems to work fine.
Christian
Is that a Tested-by:, or just 'looks sane'?
Quoted 19 lines · Cornelia Huck
Quoted 16 lines · On Wed, 10 Oct 2018 20:15:55 +0200 Christian Borntraeger…
Quoted 12 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.v10 => v11 Change log:
Quoted 5 lines
Quoted 3 lines
Series seems to work fine.
Christian
Is that a Tested-by:, or just 'looks sane'?
It was limited to some cases, but lets make it a tested-by.
Quoted 22 lines · Christian Borntraeger
Quoted 19 lines · Cornelia Huck
Quoted 16 lines · On Wed, 10 Oct 2018 20:15:55 +0200 Christian Borntraeger…
Quoted 12 lines · Tony Krowiak
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.v10 => v11 Change log:
Quoted 9 lines
Quoted 5 lines
Quoted 3 lines
Series seems to work fine.
Christian
Is that a Tested-by:, or just 'looks sane'?
It was limited to some cases, but lets make it a tested-by.
I tested it yesterday, so you can keep my tested-by too.
Signature · 2 lines
Pierre Morel Linux/KVM/QEMU in Böblingen - Germany
Cornelia Huck
AppliedQuoted 10 lines · On Wed, 10 Oct 2018 13:03:02 -0400 Tony Krowiak <[email protected]> wrote:
This patch series is the QEMU counterpart to the KVM/kernel support for guest dedicated crypto adapters. The KVM/kernel model is built on the VFIO mediated device framework and provides the infrastructure for granting exclusive guest access to crypto devices installed on the linux host. This patch series introduces a new QEMU command line option, QEMU object model and CPU model features to exploit the KVM/kernel model.
See the detailed specifications for AP virtualization provided by this patch set in
docs/vfio-ap.txtfor a more complete discussion of the design introduced by this patch series.
I added the missing g_free and device category in patch 5 and replaced patch 1 with a headers-update against kvm/next.
Thanks, applied.