* Re: [Qemu-devel] [PATCH v9 0/6] s390x: vfio-ap: guest dedicated crypto adapters [not found] ` <20180927112852.71782355.cohuck@redhat.com> @ 2018-10-02 14:05 ` Tony Krowiak 0 siblings, 0 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-02 14:05 UTC (permalink / raw) To: Cornelia Huck, Tony Krowiak Cc: qemu-devel, qemu-s390x, schwidefsky, heiko.carstens, borntraeger, david, bjsdjshi, pmorel, alifm, mjrosato, jjherne, pasic, eskultet, berrange, alex.williamson, eric.auger, pbonzini, peter.maydell, agraf, rth, fiuczy, mimu On 09/27/2018 05:28 AM, Cornelia Huck wrote: > On Wed, 26 Sep 2018 18:54:34 -0400 > Tony Krowiak <akrowiak@linux.vnet.ibm.com> wrote: > >> From: Tony Krowiak <akrowiak@linux.ibm.com> >> >> 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. > > This seems to look sane in general. However, before I merge this: > > - This needs to wait for a proper headers sync, which can only be done > after the Linux code hits upstream. Shouldn't be long, I guess (I can > queue on a staging branch while waiting.) > - As I don't have the hardware, I cannot run more than some generic > "verify it does not break anything" testing. So, I'd like to see a > Tested-by by someone who actually does have access to the hardware. > - I'd like to see some more review/acks from others. If other (minor) > things crop up, I'd prefer a respin (I don't want to juggle too many > "minor changes"...) I am planning on a v10 series to address issues raised by Thomas, David and you. > ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20180926225440.6204-3-akrowiak@linux.vnet.ibm.com>]
* Re: [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support [not found] ` <20180926225440.6204-3-akrowiak@linux.vnet.ibm.com> @ 2018-10-02 14:56 ` Pierre Morel 2018-10-04 8:45 ` Pierre Morel 2018-10-04 8:53 ` Pierre Morel 2 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-02 14:56 UTC (permalink / raw) To: qemu-devel On 27/09/2018 00:54, Tony Krowiak wrote: > A 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. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > 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 | 5 +++++ > 5 files changed, 16 insertions(+) > > diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c > index 172fb18df718..60cfeba48f4e 100644 > --- a/target/s390x/cpu_features.c > +++ b/target/s390x/cpu_features.c > @@ -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)"), > diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h > index ac2c947f30a8..5fc7e7bf0116 100644 > --- a/target/s390x/cpu_features_def.h > +++ b/target/s390x/cpu_features_def.h > @@ -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, > diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c > index 265d25c937bb..7c253ff308c5 100644 > --- a/target/s390x/cpu_models.c > +++ b/target/s390x/cpu_models.c > @@ -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; > > diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c > index 384b61cd67b9..70015eaaf5df 100644 > --- a/target/s390x/gen-features.c > +++ b/target/s390x/gen-features.c > @@ -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[] = { > diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c > index 348e8cc5467a..5277acd79a2c 100644 > --- a/target/s390x/kvm.c > +++ b/target/s390x/kvm.c > @@ -2291,6 +2291,11 @@ 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); > Appart the last hunk (being moved as commented by david): Reviewed-by: Pierre Morel<pmorel@linux.ibm.com> Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support [not found] ` <20180926225440.6204-3-akrowiak@linux.vnet.ibm.com> 2018-10-02 14:56 ` [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support Pierre Morel @ 2018-10-04 8:45 ` Pierre Morel 2018-10-04 8:53 ` Pierre Morel 2 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 8:45 UTC (permalink / raw) To: qemu-devel On 27/09/2018 00:54, Tony Krowiak wrote: > A 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. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > 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 | 5 +++++ > 5 files changed, 16 insertions(+) > > diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c > index 172fb18df718..60cfeba48f4e 100644 > --- a/target/s390x/cpu_features.c > +++ b/target/s390x/cpu_features.c > @@ -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)"), > diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h > index ac2c947f30a8..5fc7e7bf0116 100644 > --- a/target/s390x/cpu_features_def.h > +++ b/target/s390x/cpu_features_def.h > @@ -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, > diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c > index 265d25c937bb..7c253ff308c5 100644 > --- a/target/s390x/cpu_models.c > +++ b/target/s390x/cpu_models.c > @@ -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; > > diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c > index 384b61cd67b9..70015eaaf5df 100644 > --- a/target/s390x/gen-features.c > +++ b/target/s390x/gen-features.c > @@ -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[] = { > diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c > index 348e8cc5467a..5277acd79a2c 100644 > --- a/target/s390x/kvm.c > +++ b/target/s390x/kvm.c > @@ -2291,6 +2291,11 @@ 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); > With all patches applied (as David said), functionality is OK. Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support [not found] ` <20180926225440.6204-3-akrowiak@linux.vnet.ibm.com> 2018-10-02 14:56 ` [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support Pierre Morel 2018-10-04 8:45 ` Pierre Morel @ 2018-10-04 8:53 ` Pierre Morel 2 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 8:53 UTC (permalink / raw) To: Tony Krowiak, qemu-devel Cc: peter.maydell, cohuck, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, Tony Krowiak, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky, pbonzini On 27/09/2018 00:54, Tony Krowiak wrote: > A 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. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > 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 | 5 +++++ > 5 files changed, 16 insertions(+) > > diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c > index 172fb18df718..60cfeba48f4e 100644 > --- a/target/s390x/cpu_features.c > +++ b/target/s390x/cpu_features.c > @@ -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)"), > diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h > index ac2c947f30a8..5fc7e7bf0116 100644 > --- a/target/s390x/cpu_features_def.h > +++ b/target/s390x/cpu_features_def.h > @@ -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, > diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c > index 265d25c937bb..7c253ff308c5 100644 > --- a/target/s390x/cpu_models.c > +++ b/target/s390x/cpu_models.c > @@ -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; > > diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c > index 384b61cd67b9..70015eaaf5df 100644 > --- a/target/s390x/gen-features.c > +++ b/target/s390x/gen-features.c > @@ -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[] = { > diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c > index 348e8cc5467a..5277acd79a2c 100644 > --- a/target/s390x/kvm.c > +++ b/target/s390x/kvm.c > @@ -2291,6 +2291,11 @@ 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); > (Sorry for multiple posting, I missed all the CCs) With all patches applied (as David said), functionality is OK. Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20180926225440.6204-4-akrowiak@linux.vnet.ibm.com>]
[parent not found: <1bb4b47c-5dda-cbea-ee4e-c6b8645ee288@redhat.com>]
* Re: [Qemu-devel] [PATCH v9 3/6] s390x/kvm: enable AP instruction interpretation for guest [not found] ` <1bb4b47c-5dda-cbea-ee4e-c6b8645ee288@redhat.com> @ 2018-10-02 15:36 ` Pierre Morel 0 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-02 15:36 UTC (permalink / raw) To: David Hildenbrand, Tony Krowiak, qemu-devel Cc: qemu-s390x, schwidefsky, heiko.carstens, borntraeger, cohuck, bjsdjshi, pmorel, alifm, mjrosato, jjherne, pasic, eskultet, berrange, alex.williamson, eric.auger, pbonzini, peter.maydell, agraf, rth, fiuczy, mimu, Tony Krowiak On 27/09/2018 09:52, David Hildenbrand wrote: > On 27/09/2018 00:54, Tony Krowiak wrote: >> From: Tony Krowiak <akrowiak@linux.ibm.com> >> >> Let'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. >> >> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >> --- >> target/s390x/kvm.c | 14 ++++++++++++++ >> 1 file changed, 14 insertions(+) >> >> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c >> index 5277acd79a2c..d55d24abfd78 100644 >> --- a/target/s390x/kvm.c >> +++ b/target/s390x/kvm.c >> @@ -2301,6 +2301,16 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp) >> 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); > > Wrong indentation, apart from that > > Reviewed-by: David Hildenbrand <david@redhat.com> > >> + } >> +} >> + >> void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp) >> { >> struct kvm_s390_vm_cpu_processor prop = { >> @@ -2350,6 +2360,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) >> > > Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20180926225440.6204-5-akrowiak@linux.vnet.ibm.com>]
* Re: [Qemu-devel] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model [not found] ` <20180926225440.6204-5-akrowiak@linux.vnet.ibm.com> @ 2018-10-04 8:57 ` Pierre Morel [not found] ` <6ae10841-43af-f37f-450e-7dcb4cc75747@redhat.com> 1 sibling, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 8:57 UTC (permalink / raw) To: Tony Krowiak, qemu-devel Cc: peter.maydell, cohuck, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, Tony Krowiak, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky, pbonzini On 27/09/2018 00:54, Tony Krowiak wrote: > From: Tony Krowiak <akrowiak@linux.ibm.com> > > Introduces the base object model for virtualizing AP devices. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > MAINTAINERS | 12 ++++++ > hw/s390x/Makefile.objs | 2 + > hw/s390x/ap-bridge.c | 81 ++++++++++++++++++++++++++++++++++++ > hw/s390x/ap-device.c | 39 +++++++++++++++++ > hw/s390x/s390-virtio-ccw.c | 4 ++ > include/hw/s390x/ap-bridge.h | 37 ++++++++++++++++ > include/hw/s390x/ap-device.h | 38 +++++++++++++++++ > 7 files changed, 213 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 > > diff --git a/MAINTAINERS b/MAINTAINERS > index d12518c08f10..97e8ed808bc0 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1199,6 +1199,18 @@ F: include/hw/s390x/s390-ccw.h > T: git git://github.com/cohuck/qemu.git s390-next > L: qemu-s390x@nongnu.org > > +vfio-ap > +M: Christian Borntraeger <borntraeger@de.ibm.com> > +M: Tony Krowiak <akrowiak@linux.ibm.com> > +M: Halil Pasic <pasic@linux.ibm.com> > +M: Pierre Morel <pmorel@linux.ibm.com> > +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: qemu-s390x@nongnu.org > + > vhost > M: Michael S. Tsirkin <mst@redhat.com> > S: Supported > diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs > index 93282f7c593c..add89b150d90 100644 > --- a/hw/s390x/Makefile.objs > +++ b/hw/s390x/Makefile.objs > @@ -20,3 +20,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 > diff --git a/hw/s390x/ap-bridge.c b/hw/s390x/ap-bridge.c > new file mode 100644 > index 000000000000..8564dfa96ee7 > --- /dev/null > +++ b/hw/s390x/ap-bridge.c > @@ -0,0 +1,81 @@ > +/* > + * ap bridge > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Halil Pasic <pasic@linux.ibm.com> > + * > + * 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 "qapi/error.h" > +#include "hw/sysbus.h" > +#include "qemu/bitops.h" > +#include "hw/s390x/ap-bridge.h" > +#include "cpu.h" > + > +static char *vfio_ap_bus_get_dev_path(DeviceState *dev) > +{ > + /* at most one */ > + return g_strdup_printf("/1"); > +} > + > +static void vfio_ap_bus_class_init(ObjectClass *klass, void *data) > +{ > + BusClass *k = BUS_CLASS(klass); > + > + k->get_dev_path = vfio_ap_bus_get_dev_path; > + /* More than one vfio-ap device does not make sense */ > + k->max_dev = 1; > +} > + > +static const TypeInfo vfio_ap_bus_info = { > + .name = TYPE_AP_BUS, > + .parent = TYPE_BUS, > + .instance_size = sizeof(APBus), > + .class_init = vfio_ap_bus_class_init, > +}; > + > +void s390_init_ap(void) > +{ > + DeviceState *dev; > + > + /* If no AP instructions then no need for AP bridge */ > + if (!s390_has_feat(S390_FEAT_AP)) { > + return; > + } > + > + /* Create bridge device */ > + dev = qdev_create(NULL, TYPE_AP_BRIDGE); > + object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE, > + OBJECT(dev), NULL); > + qdev_init_nofail(dev); > + > + /* Create bus on bridge device */ > + qbus_create(TYPE_AP_BUS, dev, TYPE_AP_BUS); > + } > + > + > + > +static void ap_bridge_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + > + set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); > +} > + > +static const TypeInfo ap_bridge_info = { > + .name = TYPE_AP_BRIDGE, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(APBridge), > + .class_init = ap_bridge_class_init, > +}; > + > +static void ap_register(void) > +{ > + type_register_static(&ap_bridge_info); > + type_register_static(&vfio_ap_bus_info); > +} > + > +type_init(ap_register) > diff --git a/hw/s390x/ap-device.c b/hw/s390x/ap-device.c > new file mode 100644 > index 000000000000..3cd4bae52591 > --- /dev/null > +++ b/hw/s390x/ap-device.c > @@ -0,0 +1,39 @@ > +/* > + * Adjunct Processor (AP) matrix device > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> > + * > + * 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(APDeviceClass), > + .class_init = ap_class_init, > + .abstract = true, > +}; > + > +static void ap_device_register(void) > +{ > + type_register_static(&ap_device_info); > +} > + > +type_init(ap_device_register) > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index f0f7fdcaddf2..3c100c24f3e8 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -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, > diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h > new file mode 100644 > index 000000000000..b6ca6ae4ab17 > --- /dev/null > +++ b/include/hw/s390x/ap-bridge.h > @@ -0,0 +1,37 @@ > +/* > + * ap bridge > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Halil Pasic <pasic@linux.ibm.com> > + * > + * 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 > +#include "qom/object.h" > +#include "hw/qdev-core.h" > +#include "hw/sysbus.h" > + > +typedef struct APBridge { > + SysBusDevice sysbus_dev; > + bool css_dev_path; > +} APBridge; > + > +#define TYPE_AP_BRIDGE "ap-bridge" > +#define AP_BRIDGE(obj) \ > + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) > + > +typedef struct APBus { > + BusState parent_obj; > +} APBus; > + > +#define TYPE_AP_BUS "ap-bus" > +#define AP_BUS(obj) \ > + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) > + > +void s390_init_ap(void); > + > +#endif > diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h > new file mode 100644 > index 000000000000..693df90cc041 > --- /dev/null > +++ b/include/hw/s390x/ap-device.h > @@ -0,0 +1,38 @@ > +/* > + * Adjunct Processor (AP) matrix device interfaces > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> > + * > + * 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; > + > +typedef struct APDeviceClass { > + DeviceClass parent_class; > +} APDeviceClass; > + > +static inline APDevice *to_ap_dev(DeviceState *dev) > +{ > + return container_of(dev, APDevice, parent_obj); > +} > + > +#define AP_DEVICE(obj) \ > + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) > + > +#define AP_DEVICE_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) > + > +#define AP_DEVICE_CLASS(klass) \ > + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) > + > +#endif /* HW_S390X_AP_DEVICE_H */ > Appart of the current discussions on the implementation: Bus and devices appear correctly on the qtree. Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <6ae10841-43af-f37f-450e-7dcb4cc75747@redhat.com>]
[parent not found: <20180927145240.7f8aba31.cohuck@redhat.com>]
[parent not found: <8a1b11b2-2145-d4fa-7415-8dc57402bdbe@linux.ibm.com>]
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model [not found] ` <8a1b11b2-2145-d4fa-7415-8dc57402bdbe@linux.ibm.com> @ 2018-10-02 15:18 ` Tony Krowiak 0 siblings, 0 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-02 15:18 UTC (permalink / raw) To: Halil Pasic, Cornelia Huck, Thomas Huth Cc: mjrosato, Tony Krowiak, fiuczy, eskultet, qemu-s390x, heiko.carstens, david, pmorel, qemu-devel, agraf, borntraeger, alex.williamson, pasic, jjherne, schwidefsky, mimu, bjsdjshi, alifm, eric.auger, rth On 09/28/2018 08:51 AM, Halil Pasic wrote: > > > On 09/27/2018 02:52 PM, Cornelia Huck wrote: >> On Thu, 27 Sep 2018 14:29:01 +0200 >> Thomas Huth <thuth@redhat.com> wrote: >> >>> On 2018-09-27 00:54, Tony Krowiak wrote: >>>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>>> >>>> Introduces the base object model for virtualizing AP devices. >>>> >>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>>> --- >> >>>> +typedef struct APBridge { >>>> + SysBusDevice sysbus_dev; >>>> + bool css_dev_path; >>> >>> What is this css_dev_path variable good for? I don't see it used in any >>> of the other patches? >>> If you don't need it, I think you could get rid of this struct completely? >> >> Huh, now I remember complaining about it before. Looks like a >> copy-and-paste from the css bridge; that variable is used for compat >> handling there (and should be ditched here). >> > > Yes, we definitively discussed this before. And yes, it is a copy-paste > error. > > >>> >>>> +} APBridge; >>>> + >>>> +#define TYPE_AP_BRIDGE "ap-bridge" >>>> +#define AP_BRIDGE(obj) \ >>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>>> + >>>> +typedef struct APBus { >>>> + BusState parent_obj; >>>> +} APBus; >>>> + >>>> +#define TYPE_AP_BUS "ap-bus" >>>> +#define AP_BUS(obj) \ >>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >>> >>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >>> struct APBus. >> >> If there's nothing interesting to put in these inherited structures, >> probably yes. >> > > I was under impression that this is how inheritance/subtyping is done in > QEMU. Was probably added for the sake of interface completeness. > >>> >>>> +void s390_init_ap(void); >>>> + >>>> +#endif >>>> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h >>>> new file mode 100644 >>>> index 000000000000..693df90cc041 >>>> --- /dev/null >>>> +++ b/include/hw/s390x/ap-device.h >>>> @@ -0,0 +1,38 @@ >>>> +/* >>>> + * Adjunct Processor (AP) matrix device interfaces >>>> + * >>>> + * Copyright 2018 IBM Corp. >>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>>> + * >>>> + * 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; >>>> + >>>> +typedef struct APDeviceClass { >>>> + DeviceClass parent_class; >>>> +} APDeviceClass; >>>> + >>>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>>> +{ >>>> + return container_of(dev, APDevice, parent_obj); >>>> +} >>>> + >>>> +#define AP_DEVICE(obj) \ >>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_GET_CLASS(obj) \ >>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_CLASS(klass) \ >>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >>> >>> Do you really need any of these definitions except AP_DEVICE_TYPE ? >> >> Same here, I think. >> > > I don't think the qom utility/casting macros will ever be used. I'm > fine with removing what is not needed. > > Regards, > Halil Per Thomas's suggestions and Connie's concurrence, I am going to remove the macros as well as the structures they reference. The ap_bridge.h will be relegated to defining the bridge and bus types and serve as a container for AP bridge and bus definitions that might be needed in the future. > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model [not found] ` <20180927145240.7f8aba31.cohuck@redhat.com> [not found] ` <8a1b11b2-2145-d4fa-7415-8dc57402bdbe@linux.ibm.com> @ 2018-10-08 14:20 ` Tony Krowiak 2018-10-08 14:22 ` David Hildenbrand 2018-10-08 14:44 ` Thomas Huth 1 sibling, 2 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-08 14:20 UTC (permalink / raw) To: Cornelia Huck, Thomas Huth Cc: Tony Krowiak, qemu-devel, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky On 09/27/2018 08:52 AM, Cornelia Huck wrote: > On Thu, 27 Sep 2018 14:29:01 +0200 > Thomas Huth <thuth@redhat.com> wrote: > >> On 2018-09-27 00:54, Tony Krowiak wrote: >>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>> >>> Introduces the base object model for virtualizing AP devices. >>> >>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>> --- > >>> +typedef struct APBridge { >>> + SysBusDevice sysbus_dev; >>> + bool css_dev_path; >> >> What is this css_dev_path variable good for? I don't see it used in any >> of the other patches? >> If you don't need it, I think you could get rid of this struct completely? > > Huh, now I remember complaining about it before. Looks like a > copy-and-paste from the css bridge; that variable is used for compat > handling there (and should be ditched here). > >> >>> +} APBridge; >>> + >>> +#define TYPE_AP_BRIDGE "ap-bridge" >>> +#define AP_BRIDGE(obj) \ >>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>> + >>> +typedef struct APBus { >>> + BusState parent_obj; >>> +} APBus; >>> + >>> +#define TYPE_AP_BUS "ap-bus" >>> +#define AP_BUS(obj) \ >>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >> >> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >> struct APBus. > > If there's nothing interesting to put in these inherited structures, > probably yes. > >> >>> +void s390_init_ap(void); >>> + >>> +#endif >>> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h >>> new file mode 100644 >>> index 000000000000..693df90cc041 >>> --- /dev/null >>> +++ b/include/hw/s390x/ap-device.h >>> @@ -0,0 +1,38 @@ >>> +/* >>> + * Adjunct Processor (AP) matrix device interfaces >>> + * >>> + * Copyright 2018 IBM Corp. >>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>> + * >>> + * 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; >>> + >>> +typedef struct APDeviceClass { >>> + DeviceClass parent_class; >>> +} APDeviceClass; >>> + >>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>> +{ >>> + return container_of(dev, APDevice, parent_obj); >>> +} >>> + >>> +#define AP_DEVICE(obj) \ >>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>> + >>> +#define AP_DEVICE_GET_CLASS(obj) \ >>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>> + >>> +#define AP_DEVICE_CLASS(klass) \ >>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >> >> Do you really need any of these definitions except AP_DEVICE_TYPE ? Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in patch 5/6. We can probably get rid of AP_DEVICE_GET_CLASS(obj) and AP_DEVICE_CLASS(klass), but aren't those typically included in all QOM definitions? > > Same here, I think. > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model 2018-10-08 14:20 ` Tony Krowiak @ 2018-10-08 14:22 ` David Hildenbrand 2018-10-08 14:35 ` Cornelia Huck 2018-10-08 14:44 ` Thomas Huth 1 sibling, 1 reply; 17+ messages in thread From: David Hildenbrand @ 2018-10-08 14:22 UTC (permalink / raw) To: Tony Krowiak, Cornelia Huck, Thomas Huth Cc: Tony Krowiak, qemu-devel, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky On 08/10/2018 16:20, Tony Krowiak wrote: > On 09/27/2018 08:52 AM, Cornelia Huck wrote: >> On Thu, 27 Sep 2018 14:29:01 +0200 >> Thomas Huth <thuth@redhat.com> wrote: >> >>> On 2018-09-27 00:54, Tony Krowiak wrote: >>>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>>> >>>> Introduces the base object model for virtualizing AP devices. >>>> >>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>>> --- >> >>>> +typedef struct APBridge { >>>> + SysBusDevice sysbus_dev; >>>> + bool css_dev_path; >>> >>> What is this css_dev_path variable good for? I don't see it used in any >>> of the other patches? >>> If you don't need it, I think you could get rid of this struct completely? >> >> Huh, now I remember complaining about it before. Looks like a >> copy-and-paste from the css bridge; that variable is used for compat >> handling there (and should be ditched here). >> >>> >>>> +} APBridge; >>>> + >>>> +#define TYPE_AP_BRIDGE "ap-bridge" >>>> +#define AP_BRIDGE(obj) \ >>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>>> + >>>> +typedef struct APBus { >>>> + BusState parent_obj; >>>> +} APBus; >>>> + >>>> +#define TYPE_AP_BUS "ap-bus" >>>> +#define AP_BUS(obj) \ >>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >>> >>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >>> struct APBus. >> >> If there's nothing interesting to put in these inherited structures, >> probably yes. >> >>> >>>> +void s390_init_ap(void); >>>> + >>>> +#endif >>>> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h >>>> new file mode 100644 >>>> index 000000000000..693df90cc041 >>>> --- /dev/null >>>> +++ b/include/hw/s390x/ap-device.h >>>> @@ -0,0 +1,38 @@ >>>> +/* >>>> + * Adjunct Processor (AP) matrix device interfaces >>>> + * >>>> + * Copyright 2018 IBM Corp. >>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>>> + * >>>> + * 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; >>>> + >>>> +typedef struct APDeviceClass { >>>> + DeviceClass parent_class; >>>> +} APDeviceClass; >>>> + >>>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>>> +{ >>>> + return container_of(dev, APDevice, parent_obj); >>>> +} >>>> + >>>> +#define AP_DEVICE(obj) \ >>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_GET_CLASS(obj) \ >>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_CLASS(klass) \ >>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >>> >>> Do you really need any of these definitions except AP_DEVICE_TYPE ? > > Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in > patch 5/6. We can probably get rid of AP_DEVICE_GET_CLASS(obj) and > AP_DEVICE_CLASS(klass), but aren't those typically included in all > QOM definitions? Yes, we usually add all of them although only some might actually be used. (adding a new device usually looks like filling out a template) -- Thanks, David / dhildenb ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model 2018-10-08 14:22 ` David Hildenbrand @ 2018-10-08 14:35 ` Cornelia Huck 2018-10-08 14:48 ` Tony Krowiak 0 siblings, 1 reply; 17+ messages in thread From: Cornelia Huck @ 2018-10-08 14:35 UTC (permalink / raw) To: David Hildenbrand Cc: Tony Krowiak, Thomas Huth, Tony Krowiak, qemu-devel, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky On Mon, 8 Oct 2018 16:22:27 +0200 David Hildenbrand <david@redhat.com> wrote: > On 08/10/2018 16:20, Tony Krowiak wrote: > > On 09/27/2018 08:52 AM, Cornelia Huck wrote: > >> On Thu, 27 Sep 2018 14:29:01 +0200 > >> Thomas Huth <thuth@redhat.com> wrote: > >> > >>> On 2018-09-27 00:54, Tony Krowiak wrote: > >>>> From: Tony Krowiak <akrowiak@linux.ibm.com> > >>>> > >>>> Introduces the base object model for virtualizing AP devices. > >>>> > >>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > >>>> --- > >> > >>>> +typedef struct APBridge { > >>>> + SysBusDevice sysbus_dev; > >>>> + bool css_dev_path; > >>> > >>> What is this css_dev_path variable good for? I don't see it used in any > >>> of the other patches? > >>> If you don't need it, I think you could get rid of this struct completely? > >> > >> Huh, now I remember complaining about it before. Looks like a > >> copy-and-paste from the css bridge; that variable is used for compat > >> handling there (and should be ditched here). > >> > >>> > >>>> +} APBridge; > >>>> + > >>>> +#define TYPE_AP_BRIDGE "ap-bridge" > >>>> +#define AP_BRIDGE(obj) \ > >>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) > >>>> + > >>>> +typedef struct APBus { > >>>> + BusState parent_obj; > >>>> +} APBus; > >>>> + > >>>> +#define TYPE_AP_BUS "ap-bus" > >>>> +#define AP_BUS(obj) \ > >>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) > >>> > >>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even > >>> struct APBus. > >> > >> If there's nothing interesting to put in these inherited structures, > >> probably yes. > >> > >>> > >>>> +void s390_init_ap(void); > >>>> + > >>>> +#endif > >>>> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h > >>>> new file mode 100644 > >>>> index 000000000000..693df90cc041 > >>>> --- /dev/null > >>>> +++ b/include/hw/s390x/ap-device.h > >>>> @@ -0,0 +1,38 @@ > >>>> +/* > >>>> + * Adjunct Processor (AP) matrix device interfaces > >>>> + * > >>>> + * Copyright 2018 IBM Corp. > >>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> > >>>> + * > >>>> + * 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; > >>>> + > >>>> +typedef struct APDeviceClass { > >>>> + DeviceClass parent_class; > >>>> +} APDeviceClass; > >>>> + > >>>> +static inline APDevice *to_ap_dev(DeviceState *dev) > >>>> +{ > >>>> + return container_of(dev, APDevice, parent_obj); > >>>> +} > >>>> + > >>>> +#define AP_DEVICE(obj) \ > >>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) > >>>> + > >>>> +#define AP_DEVICE_GET_CLASS(obj) \ > >>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) > >>>> + > >>>> +#define AP_DEVICE_CLASS(klass) \ > >>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) > >>> > >>> Do you really need any of these definitions except AP_DEVICE_TYPE ? > > > > Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in > > patch 5/6. We can probably get rid of AP_DEVICE_GET_CLASS(obj) and > > AP_DEVICE_CLASS(klass), but aren't those typically included in all > > QOM definitions? > > Yes, we usually add all of them although only some might actually be > used. (adding a new device usually looks like filling out a template) Much of this seems to be boilerplate in this case, and I'm not sure how much sense it makes. On the plus side, however, it looks like everything else :) So, I would merge both a complete version or a stripped-down-to-the-needed version, unless someone else has a strong argument. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model 2018-10-08 14:35 ` Cornelia Huck @ 2018-10-08 14:48 ` Tony Krowiak 0 siblings, 0 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-08 14:48 UTC (permalink / raw) To: Cornelia Huck, David Hildenbrand Cc: Thomas Huth, Tony Krowiak, qemu-devel, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky On 10/08/2018 10:35 AM, Cornelia Huck wrote: > On Mon, 8 Oct 2018 16:22:27 +0200 > David Hildenbrand <david@redhat.com> wrote: > >> On 08/10/2018 16:20, Tony Krowiak wrote: >>> On 09/27/2018 08:52 AM, Cornelia Huck wrote: >>>> On Thu, 27 Sep 2018 14:29:01 +0200 >>>> Thomas Huth <thuth@redhat.com> wrote: >>>> >>>>> On 2018-09-27 00:54, Tony Krowiak wrote: >>>>>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>>>>> >>>>>> Introduces the base object model for virtualizing AP devices. >>>>>> >>>>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>>>>> --- >>>> >>>>>> +typedef struct APBridge { >>>>>> + SysBusDevice sysbus_dev; >>>>>> + bool css_dev_path; >>>>> >>>>> What is this css_dev_path variable good for? I don't see it used in any >>>>> of the other patches? >>>>> If you don't need it, I think you could get rid of this struct completely? >>>> >>>> Huh, now I remember complaining about it before. Looks like a >>>> copy-and-paste from the css bridge; that variable is used for compat >>>> handling there (and should be ditched here). >>>> >>>>> >>>>>> +} APBridge; >>>>>> + >>>>>> +#define TYPE_AP_BRIDGE "ap-bridge" >>>>>> +#define AP_BRIDGE(obj) \ >>>>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>>>>> + >>>>>> +typedef struct APBus { >>>>>> + BusState parent_obj; >>>>>> +} APBus; >>>>>> + >>>>>> +#define TYPE_AP_BUS "ap-bus" >>>>>> +#define AP_BUS(obj) \ >>>>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >>>>> >>>>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >>>>> struct APBus. >>>> >>>> If there's nothing interesting to put in these inherited structures, >>>> probably yes. >>>> >>>>> >>>>>> +void s390_init_ap(void); >>>>>> + >>>>>> +#endif >>>>>> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h >>>>>> new file mode 100644 >>>>>> index 000000000000..693df90cc041 >>>>>> --- /dev/null >>>>>> +++ b/include/hw/s390x/ap-device.h >>>>>> @@ -0,0 +1,38 @@ >>>>>> +/* >>>>>> + * Adjunct Processor (AP) matrix device interfaces >>>>>> + * >>>>>> + * Copyright 2018 IBM Corp. >>>>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>>>>> + * >>>>>> + * 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; >>>>>> + >>>>>> +typedef struct APDeviceClass { >>>>>> + DeviceClass parent_class; >>>>>> +} APDeviceClass; >>>>>> + >>>>>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>>>>> +{ >>>>>> + return container_of(dev, APDevice, parent_obj); >>>>>> +} >>>>>> + >>>>>> +#define AP_DEVICE(obj) \ >>>>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>>>>> + >>>>>> +#define AP_DEVICE_GET_CLASS(obj) \ >>>>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>>>>> + >>>>>> +#define AP_DEVICE_CLASS(klass) \ >>>>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >>>>> >>>>> Do you really need any of these definitions except AP_DEVICE_TYPE ? >>> >>> Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in >>> patch 5/6. We can probably get rid of AP_DEVICE_GET_CLASS(obj) and >>> AP_DEVICE_CLASS(klass), but aren't those typically included in all >>> QOM definitions? >> >> Yes, we usually add all of them although only some might actually be >> used. (adding a new device usually looks like filling out a template) > > Much of this seems to be boilerplate in this case, and I'm not sure how > much sense it makes. On the plus side, however, it looks like > everything else :) > > So, I would merge both a complete version or a > stripped-down-to-the-needed version, unless someone else has a strong > argument. The 'I would merge both' implies you are asking for two versions, but the 'or' implies you are asking for one or the other; I'm going to assume you are asking for one or the other. I'll provide a stripped down version in v10 which I am planning on posting today. > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model 2018-10-08 14:20 ` Tony Krowiak 2018-10-08 14:22 ` David Hildenbrand @ 2018-10-08 14:44 ` Thomas Huth 2018-10-08 16:31 ` Tony Krowiak 1 sibling, 1 reply; 17+ messages in thread From: Thomas Huth @ 2018-10-08 14:44 UTC (permalink / raw) To: Tony Krowiak, Cornelia Huck Cc: mjrosato, Tony Krowiak, fiuczy, eskultet, qemu-s390x, heiko.carstens, david, pmorel, qemu-devel, agraf, borntraeger, alex.williamson, pasic, jjherne, schwidefsky, mimu, bjsdjshi, alifm, eric.auger, rth On 2018-10-08 16:20, Tony Krowiak wrote: > On 09/27/2018 08:52 AM, Cornelia Huck wrote: >> On Thu, 27 Sep 2018 14:29:01 +0200 >> Thomas Huth <thuth@redhat.com> wrote: >> >>> On 2018-09-27 00:54, Tony Krowiak wrote: >>>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>>> >>>> Introduces the base object model for virtualizing AP devices. >>>> >>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>>> --- >> >>>> +typedef struct APBridge { >>>> + SysBusDevice sysbus_dev; >>>> + bool css_dev_path; >>> >>> What is this css_dev_path variable good for? I don't see it used in any >>> of the other patches? >>> If you don't need it, I think you could get rid of this struct >>> completely? >> >> Huh, now I remember complaining about it before. Looks like a >> copy-and-paste from the css bridge; that variable is used for compat >> handling there (and should be ditched here). >> >>> >>>> +} APBridge; >>>> + >>>> +#define TYPE_AP_BRIDGE "ap-bridge" >>>> +#define AP_BRIDGE(obj) \ >>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>>> + >>>> +typedef struct APBus { >>>> + BusState parent_obj; >>>> +} APBus; >>>> + >>>> +#define TYPE_AP_BUS "ap-bus" >>>> +#define AP_BUS(obj) \ >>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >>> >>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >>> struct APBus. >> >> If there's nothing interesting to put in these inherited structures, >> probably yes. >> >>> >>>> +void s390_init_ap(void); >>>> + >>>> +#endif >>>> diff --git a/include/hw/s390x/ap-device.h >>>> b/include/hw/s390x/ap-device.h >>>> new file mode 100644 >>>> index 000000000000..693df90cc041 >>>> --- /dev/null >>>> +++ b/include/hw/s390x/ap-device.h >>>> @@ -0,0 +1,38 @@ >>>> +/* >>>> + * Adjunct Processor (AP) matrix device interfaces >>>> + * >>>> + * Copyright 2018 IBM Corp. >>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>>> + * >>>> + * 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; >>>> + >>>> +typedef struct APDeviceClass { >>>> + DeviceClass parent_class; >>>> +} APDeviceClass; >>>> + >>>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>>> +{ >>>> + return container_of(dev, APDevice, parent_obj); >>>> +} >>>> + >>>> +#define AP_DEVICE(obj) \ >>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_GET_CLASS(obj) \ >>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>>> + >>>> +#define AP_DEVICE_CLASS(klass) \ >>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >>> >>> Do you really need any of these definitions except AP_DEVICE_TYPE ? > > Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in > patch 5/6. Fine for me, if you replace the DO_UPCAST in patch 5 with AP_DEVICE(). > We can probably get rid of AP_DEVICE_GET_CLASS(obj) and > AP_DEVICE_CLASS(klass), but aren't those typically included in all > QOM definitions? As long as you don't really need them, I'd simply remove them. They can be added back when some code really needs them. Thomas ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model 2018-10-08 14:44 ` Thomas Huth @ 2018-10-08 16:31 ` Tony Krowiak 0 siblings, 0 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-08 16:31 UTC (permalink / raw) To: Thomas Huth, Cornelia Huck Cc: mjrosato, Tony Krowiak, fiuczy, eskultet, qemu-s390x, heiko.carstens, david, pmorel, qemu-devel, agraf, borntraeger, alex.williamson, pasic, jjherne, schwidefsky, mimu, bjsdjshi, alifm, eric.auger, rth On 10/08/2018 10:44 AM, Thomas Huth wrote: > On 2018-10-08 16:20, Tony Krowiak wrote: >> On 09/27/2018 08:52 AM, Cornelia Huck wrote: >>> On Thu, 27 Sep 2018 14:29:01 +0200 >>> Thomas Huth <thuth@redhat.com> wrote: >>> >>>> On 2018-09-27 00:54, Tony Krowiak wrote: >>>>> From: Tony Krowiak <akrowiak@linux.ibm.com> >>>>> >>>>> Introduces the base object model for virtualizing AP devices. >>>>> >>>>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >>>>> --- >>> >>>>> +typedef struct APBridge { >>>>> + SysBusDevice sysbus_dev; >>>>> + bool css_dev_path; >>>> >>>> What is this css_dev_path variable good for? I don't see it used in any >>>> of the other patches? >>>> If you don't need it, I think you could get rid of this struct >>>> completely? >>> >>> Huh, now I remember complaining about it before. Looks like a >>> copy-and-paste from the css bridge; that variable is used for compat >>> handling there (and should be ditched here). >>> >>>> >>>>> +} APBridge; >>>>> + >>>>> +#define TYPE_AP_BRIDGE "ap-bridge" >>>>> +#define AP_BRIDGE(obj) \ >>>>> + OBJECT_CHECK(APBridge, (obj), TYPE_AP_BRIDGE) >>>>> + >>>>> +typedef struct APBus { >>>>> + BusState parent_obj; >>>>> +} APBus; >>>>> + >>>>> +#define TYPE_AP_BUS "ap-bus" >>>>> +#define AP_BUS(obj) \ >>>>> + OBJECT_CHECK(APBus, (obj), TYPE_AP_BUS) >>>> >>>> I think you could also get rid of AP_BRIDGE(), AP_BUS() and maybe even >>>> struct APBus. >>> >>> If there's nothing interesting to put in these inherited structures, >>> probably yes. >>> >>>> >>>>> +void s390_init_ap(void); >>>>> + >>>>> +#endif >>>>> diff --git a/include/hw/s390x/ap-device.h >>>>> b/include/hw/s390x/ap-device.h >>>>> new file mode 100644 >>>>> index 000000000000..693df90cc041 >>>>> --- /dev/null >>>>> +++ b/include/hw/s390x/ap-device.h >>>>> @@ -0,0 +1,38 @@ >>>>> +/* >>>>> + * Adjunct Processor (AP) matrix device interfaces >>>>> + * >>>>> + * Copyright 2018 IBM Corp. >>>>> + * Author(s): Tony Krowiak <akrowiak@linux.vnet.ibm.com> >>>>> + * >>>>> + * 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; >>>>> + >>>>> +typedef struct APDeviceClass { >>>>> + DeviceClass parent_class; >>>>> +} APDeviceClass; >>>>> + >>>>> +static inline APDevice *to_ap_dev(DeviceState *dev) >>>>> +{ >>>>> + return container_of(dev, APDevice, parent_obj); >>>>> +} >>>>> + >>>>> +#define AP_DEVICE(obj) \ >>>>> + OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >>>>> + >>>>> +#define AP_DEVICE_GET_CLASS(obj) \ >>>>> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >>>>> + >>>>> +#define AP_DEVICE_CLASS(klass) \ >>>>> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) >>>> >>>> Do you really need any of these definitions except AP_DEVICE_TYPE ? >> >> Yes, we need AP_DEVICE(obj) and struct APDevice; they are both used in >> patch 5/6. > > Fine for me, if you replace the DO_UPCAST in patch 5 with AP_DEVICE(). > >> We can probably get rid of AP_DEVICE_GET_CLASS(obj) and >> AP_DEVICE_CLASS(klass), but aren't those typically included in all >> QOM definitions? > > As long as you don't really need them, I'd simply remove them. They can > be added back when some code really needs them. That is the plan > > Thomas > ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20180926225440.6204-6-akrowiak@linux.vnet.ibm.com>]
[parent not found: <2291104a-4cbf-e4fd-3496-fa0910beb96a@redhat.com>]
* Re: [Qemu-devel] [qemu-s390x] [PATCH v9 5/6] s390x/vfio: ap: Introduce VFIO AP device [not found] ` <2291104a-4cbf-e4fd-3496-fa0910beb96a@redhat.com> @ 2018-10-02 15:05 ` Tony Krowiak 0 siblings, 0 replies; 17+ messages in thread From: Tony Krowiak @ 2018-10-02 15:05 UTC (permalink / raw) To: Thomas Huth, Tony Krowiak, qemu-devel Cc: peter.maydell, cohuck, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, berrange, alifm, qemu-s390x, schwidefsky, pbonzini On 09/27/2018 09:56 AM, Thomas Huth wrote: > On 2018-09-27 00:54, Tony Krowiak wrote: >> 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/$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. >> >> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> >> --- > [...] >> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c >> new file mode 100644 >> index 000000000000..429988f23f98 >> --- /dev/null >> +++ b/hw/vfio/ap.c >> @@ -0,0 +1,181 @@ >> +/* >> + * VFIO based AP matrix device assignment >> + * >> + * Copyright 2018 IBM Corp. >> + * Author(s): Tony Krowiak <akrowiak@linux.ibm.com> >> + * Halil Pasic <pasic@linux.ibm.com> >> + * >> + * 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; >> + >> +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) >> +{ >> + char *tmp, group_path[PATH_MAX]; >> + ssize_t len; >> + int groupid; >> + >> + tmp = g_strdup_printf("%s/iommu_group", vapdev->vdev.sysfsdev); >> + len = readlink(tmp, group_path, sizeof(group_path)); >> + g_free(tmp); >> + >> + if (len <= 0 || len >= sizeof(group_path)) { >> + error_setg(errp, "%s: no iommu_group found for %s", >> + VFIO_AP_DEVICE_TYPE, vapdev->vdev.sysfsdev); >> + return NULL; >> + } >> + >> + group_path[len] = 0; > > You could maybe use g_file_read_link() instead to avoid the ugliness > that is needed around readlink(). I will make that change. > >> + if (sscanf(basename(group_path), "%d", &groupid) != 1) { >> + error_setg(errp, "vfio: failed to read %s", group_path); >> + return NULL; >> + } >> + >> + return vfio_get_group(groupid, &address_space_memory, errp); >> +} >> + >> +static void vfio_ap_realize(DeviceState *dev, Error **errp) >> +{ >> + int ret; >> + char *mdevid; >> + Error *local_err = NULL; >> + VFIOGroup *vfio_group; >> + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > > IIRC DO_UPCAST should be avoided in new code. So this is now here the > right place to finally use the AP_DEVICE() macro? Will do. > >> + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); >> + >> + vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > > Double assignment to vapdev. Ah, yes ... it needs to go > >> + vfio_group = vfio_ap_get_group(vapdev, &local_err); >> + if (!vfio_group) { >> + goto out_err; >> + } >> + >> + vapdev->vdev.ops = &vfio_ap_ops; >> + vapdev->vdev.type = VFIO_DEVICE_TYPE_AP; >> + mdevid = basename(vapdev->vdev.sysfsdev); >> + vapdev->vdev.name = g_strdup_printf("%s", mdevid); > > g_strdup instead of g_strdup_printf should be sufficient here, shouldn't it? Yes, it is sufficient, I'll change it. > >> + vapdev->vdev.dev = dev; >> + >> + ret = vfio_get_device(vfio_group, mdevid, &vapdev->vdev, &local_err); >> + if (ret) { >> + goto out_get_dev_err; >> + } >> + >> + /* Enable hardware to intepret AP instructions executed on the guest */ >> + object_property_set_bool(OBJECT(qdev_get_machine()), true, "apie", NULL); >> + >> + return; >> + >> +out_get_dev_err: >> + vfio_ap_put_device(vapdev); >> + vfio_put_group(vfio_group); >> +out_err: >> + error_propagate(errp, local_err); >> +} > > Thomas > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v9 5/6] s390x/vfio: ap: Introduce VFIO AP device [not found] ` <20180926225440.6204-6-akrowiak@linux.vnet.ibm.com> [not found] ` <2291104a-4cbf-e4fd-3496-fa0910beb96a@redhat.com> @ 2018-10-04 8:27 ` Pierre Morel 2018-10-04 9:07 ` Pierre Morel 2 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 8:27 UTC (permalink / raw) To: qemu-devel On 27/09/2018 00:54, Tony Krowiak wrote: > 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/$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. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > MAINTAINERS | 1 + > default-configs/s390x-softmmu.mak | 1 + > hw/vfio/Makefile.objs | 1 + > hw/vfio/ap.c | 181 ++++++++++++++++++++++++++++++ > include/hw/vfio/vfio-common.h | 1 + > 5 files changed, 185 insertions(+) > create mode 100644 hw/vfio/ap.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 97e8ed808bc0..29041da69237 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1209,6 +1209,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: qemu-s390x@nongnu.org > > vhost > diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak > index d6b67d50f0e4..5eef37592451 100644 > --- a/default-configs/s390x-softmmu.mak > +++ b/default-configs/s390x-softmmu.mak > @@ -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) > diff --git a/hw/vfio/Makefile.objs b/hw/vfio/Makefile.objs > index a2e7a0a7cf02..8b3f664d85f7 100644 > --- a/hw/vfio/Makefile.objs > +++ b/hw/vfio/Makefile.objs > @@ -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 > diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c > new file mode 100644 > index 000000000000..429988f23f98 > --- /dev/null > +++ b/hw/vfio/ap.c > @@ -0,0 +1,181 @@ > +/* > + * VFIO based AP matrix device assignment > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Tony Krowiak <akrowiak@linux.ibm.com> > + * Halil Pasic <pasic@linux.ibm.com> > + * > + * 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; > + > +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) > +{ > + char *tmp, group_path[PATH_MAX]; > + ssize_t len; > + int groupid; > + > + tmp = g_strdup_printf("%s/iommu_group", vapdev->vdev.sysfsdev); > + len = readlink(tmp, group_path, sizeof(group_path)); > + g_free(tmp); > + > + if (len <= 0 || len >= sizeof(group_path)) { > + error_setg(errp, "%s: no iommu_group found for %s", > + VFIO_AP_DEVICE_TYPE, vapdev->vdev.sysfsdev); > + return NULL; > + } > + > + group_path[len] = 0; > + > + if (sscanf(basename(group_path), "%d", &groupid) != 1) { > + error_setg(errp, "vfio: failed to read %s", group_path); > + return NULL; > + } > + > + return vfio_get_group(groupid, &address_space_memory, errp); > +} > + > +static void vfio_ap_realize(DeviceState *dev, Error **errp) > +{ > + int ret; > + char *mdevid; > + Error *local_err = NULL; > + VFIOGroup *vfio_group; > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + vfio_group = vfio_ap_get_group(vapdev, &local_err); > + if (!vfio_group) { > + goto out_err; > + } > + > + vapdev->vdev.ops = &vfio_ap_ops; > + vapdev->vdev.type = VFIO_DEVICE_TYPE_AP; > + mdevid = basename(vapdev->vdev.sysfsdev); > + vapdev->vdev.name = g_strdup_printf("%s", mdevid); > + vapdev->vdev.dev = dev; > + > + ret = vfio_get_device(vfio_group, mdevid, &vapdev->vdev, &local_err); > + if (ret) { > + goto out_get_dev_err; > + } > + > + /* Enable hardware to intepret AP instructions executed on the guest */ > + object_property_set_bool(OBJECT(qdev_get_machine()), true, "apie", NULL); > + > + return; > + > +out_get_dev_err: > + vfio_ap_put_device(vapdev); > + vfio_put_group(vfio_group); > +out_err: > + error_propagate(errp, local_err); > +} > + > +static void vfio_ap_unrealize(DeviceState *dev, Error **errp) > +{ > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + VFIOGroup *group = vapdev->vdev.group; > + > + vfio_ap_put_device(vapdev); > + vfio_put_group(group); > +} > + > +static Property vfio_ap_properties[] = { > + DEFINE_PROP_STRING("sysfsdev", VFIOAPDevice, vdev.sysfsdev), > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void vfio_ap_reset(DeviceState *dev) > +{ > + int ret; > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + ret = ioctl(vapdev->vdev.fd, VFIO_DEVICE_RESET); > + if (ret) { > + error_report("%s: failed to reset %s device: %s", __func__, > + vapdev->vdev.name, strerror(ret)); > + } > +} > + > +static const VMStateDescription vfio_ap_vmstate = { > + .name = VFIO_AP_DEVICE_TYPE, > + .unmigratable = 1, > +}; > + > +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, > + .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) > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index 821def05658f..6be9a93f611b 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -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 { > The functionality is working as expected. Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH v9 5/6] s390x/vfio: ap: Introduce VFIO AP device [not found] ` <20180926225440.6204-6-akrowiak@linux.vnet.ibm.com> [not found] ` <2291104a-4cbf-e4fd-3496-fa0910beb96a@redhat.com> 2018-10-04 8:27 ` [Qemu-devel] " Pierre Morel @ 2018-10-04 9:07 ` Pierre Morel 2 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 9:07 UTC (permalink / raw) To: Tony Krowiak, qemu-devel Cc: peter.maydell, cohuck, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, Tony Krowiak, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky, pbonzini On 27/09/2018 00:54, Tony Krowiak wrote: > 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/$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. > > Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com> > --- > MAINTAINERS | 1 + > default-configs/s390x-softmmu.mak | 1 + > hw/vfio/Makefile.objs | 1 + > hw/vfio/ap.c | 181 ++++++++++++++++++++++++++++++ > include/hw/vfio/vfio-common.h | 1 + > 5 files changed, 185 insertions(+) > create mode 100644 hw/vfio/ap.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 97e8ed808bc0..29041da69237 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1209,6 +1209,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: qemu-s390x@nongnu.org > > vhost > diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak > index d6b67d50f0e4..5eef37592451 100644 > --- a/default-configs/s390x-softmmu.mak > +++ b/default-configs/s390x-softmmu.mak > @@ -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) > diff --git a/hw/vfio/Makefile.objs b/hw/vfio/Makefile.objs > index a2e7a0a7cf02..8b3f664d85f7 100644 > --- a/hw/vfio/Makefile.objs > +++ b/hw/vfio/Makefile.objs > @@ -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 > diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c > new file mode 100644 > index 000000000000..429988f23f98 > --- /dev/null > +++ b/hw/vfio/ap.c > @@ -0,0 +1,181 @@ > +/* > + * VFIO based AP matrix device assignment > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Tony Krowiak <akrowiak@linux.ibm.com> > + * Halil Pasic <pasic@linux.ibm.com> > + * > + * 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; > + > +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) > +{ > + char *tmp, group_path[PATH_MAX]; > + ssize_t len; > + int groupid; > + > + tmp = g_strdup_printf("%s/iommu_group", vapdev->vdev.sysfsdev); > + len = readlink(tmp, group_path, sizeof(group_path)); > + g_free(tmp); > + > + if (len <= 0 || len >= sizeof(group_path)) { > + error_setg(errp, "%s: no iommu_group found for %s", > + VFIO_AP_DEVICE_TYPE, vapdev->vdev.sysfsdev); > + return NULL; > + } > + > + group_path[len] = 0; > + > + if (sscanf(basename(group_path), "%d", &groupid) != 1) { > + error_setg(errp, "vfio: failed to read %s", group_path); > + return NULL; > + } > + > + return vfio_get_group(groupid, &address_space_memory, errp); > +} > + > +static void vfio_ap_realize(DeviceState *dev, Error **errp) > +{ > + int ret; > + char *mdevid; > + Error *local_err = NULL; > + VFIOGroup *vfio_group; > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + vfio_group = vfio_ap_get_group(vapdev, &local_err); > + if (!vfio_group) { > + goto out_err; > + } > + > + vapdev->vdev.ops = &vfio_ap_ops; > + vapdev->vdev.type = VFIO_DEVICE_TYPE_AP; > + mdevid = basename(vapdev->vdev.sysfsdev); > + vapdev->vdev.name = g_strdup_printf("%s", mdevid); > + vapdev->vdev.dev = dev; > + > + ret = vfio_get_device(vfio_group, mdevid, &vapdev->vdev, &local_err); > + if (ret) { > + goto out_get_dev_err; > + } > + > + /* Enable hardware to intepret AP instructions executed on the guest */ > + object_property_set_bool(OBJECT(qdev_get_machine()), true, "apie", NULL); > + > + return; > + > +out_get_dev_err: > + vfio_ap_put_device(vapdev); > + vfio_put_group(vfio_group); > +out_err: > + error_propagate(errp, local_err); > +} > + > +static void vfio_ap_unrealize(DeviceState *dev, Error **errp) > +{ > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + VFIOGroup *group = vapdev->vdev.group; > + > + vfio_ap_put_device(vapdev); > + vfio_put_group(group); > +} > + > +static Property vfio_ap_properties[] = { > + DEFINE_PROP_STRING("sysfsdev", VFIOAPDevice, vdev.sysfsdev), > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void vfio_ap_reset(DeviceState *dev) > +{ > + int ret; > + APDevice *apdev = DO_UPCAST(APDevice, parent_obj, dev); > + VFIOAPDevice *vapdev = DO_UPCAST(VFIOAPDevice, apdev, apdev); > + > + ret = ioctl(vapdev->vdev.fd, VFIO_DEVICE_RESET); > + if (ret) { > + error_report("%s: failed to reset %s device: %s", __func__, > + vapdev->vdev.name, strerror(ret)); > + } > +} > + > +static const VMStateDescription vfio_ap_vmstate = { > + .name = VFIO_AP_DEVICE_TYPE, > + .unmigratable = 1, > +}; > + > +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, > + .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) > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index 821def05658f..6be9a93f611b 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -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 { > It works as expected. Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
[parent not found: <20180926225440.6204-7-akrowiak@linux.vnet.ibm.com>]
* Re: [Qemu-devel] [PATCH v9 6/6] s390: doc: detailed specifications for AP virtualization [not found] ` <20180926225440.6204-7-akrowiak@linux.vnet.ibm.com> @ 2018-10-04 10:38 ` Pierre Morel 0 siblings, 0 replies; 17+ messages in thread From: Pierre Morel @ 2018-10-04 10:38 UTC (permalink / raw) To: Tony Krowiak, qemu-devel Cc: peter.maydell, cohuck, david, pmorel, fiuczy, eskultet, agraf, borntraeger, jjherne, mimu, Tony Krowiak, heiko.carstens, eric.auger, alex.williamson, bjsdjshi, rth, mjrosato, pasic, alifm, qemu-s390x, schwidefsky, pbonzini On 27/09/2018 00:54, Tony Krowiak wrote: > 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> > --- > MAINTAINERS | 1 + > docs/vfio-ap.txt | 787 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 788 insertions(+) > create mode 100644 docs/vfio-ap.txt > > diff --git a/MAINTAINERS b/MAINTAINERS > index 29041da69237..b64a12034c2c 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1210,6 +1210,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: qemu-s390x@nongnu.org > > vhost > diff --git a/docs/vfio-ap.txt b/docs/vfio-ap.txt > new file mode 100644 > index 000000000000..fd17ce48967b > --- /dev/null > +++ b/docs/vfio-ap.txt > @@ -0,0 +1,787 @@ > +Adjunct Processor (AP) Device > +============================= > + > +Contents: > +========= > +* Introduction > +* AP Architectural Overview > +* Start Interpretive Execution (SIE) Instruction > +* AP Matrix Configuration on Linux Host > +* Starting a Linux Guest Configured with an AP Matrix > +* Example: Configure AP Matrices for Three Linux Guests > + > +Introduction: > +============ > +The IBM Adjunct Processor (AP) Cryptographic Facility is comprised > +of three AP instructions and from 1 to 256 PCIe cryptographic adapter cards. > +These AP devices provide cryptographic functions to all CPUs assigned to a > +linux system running in an IBM Z system LPAR. > + > +On s390x, AP adapter cards are exposed via the AP bus. This document > +describes how those cards may be made available to KVM guests using the > +VFIO mediated device framework. > + > +AP Architectural Overview: > +========================= > +In order understand the terminology used in the rest of this document, 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; however, > + the maximum adapter number allowed is determined by machine model. 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. > + > +* 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; however, the maximum domain number allowed is > + determined by machine model. 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. > + > +* AP Queue > + > + An AP queue is the means by which an AP command-request message is sent to an > + AP usage domain inside a specific AP. 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. > + > +* 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 > + > + AP instructions identify the domain that is targeted to process the AP > + command; this must be one of the usage domains. An AP command may modify a > + domain that is not one of the usage domains, but the modified domain > + must be one of the control domains. > + > +Start Interpretive Execution (SIE) Instruction > +============================================== > +A KVM guest is started by executing the Start Interpretive Execution (SIE) > +instruction. The SIE state description is a control block that contains the > +state information for a KVM guest and is supplied as input to the SIE > +instruction. The SIE state description contains a satellite control block called > +the Crypto Control Block (CRYCB). 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. > + > +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. > + > +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 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: Valid configuration: > + ------------------------------ > + Guest1: adapters 1,2 domains 5,6 > + Guest2: adapters 3,4 domains 5,6 > + > + This is also valid because both guests have a unique set of APQNs: > + Guest1 has APQNs (1,5), (1,6), (2,5), (2,6); > + Guest2 has APQNs (3,5), (3,6), (4,5), (4,6) > + > + Example 3: 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). > + > +AP Matrix Configuration on Linux Host: > +===================================== > +A linux system is a guest of the LPAR in which it is running and has access to > +the AP resources configured for the LPAR. The LPAR's AP matrix is > +configured via its Activation Profile which can be edited on the HMC. When the > +linux system is started, the AP bus will detect the AP devices assigned to the > +LPAR and create the following in sysfs: > + > +/sys/bus/ap > +... [devices] > +...... xx.yyyy > +...... ... > +...... cardxx > +...... ... > + > +Where: > + cardxx is AP adapter number xx (in hex) > +....xx.yyyy is an APQN with xx specifying the APID and yyyy specifying the > + APQI > + > +For example, if AP adapters 5 and 6 and domains 4, 71 (0x47), 171 (0xab) and > +255 (0xff) are configured for the LPAR, the sysfs representation on the linux > +host system would look like this: > + > +/sys/bus/ap > +... [devices] > +...... 05.0004 > +...... 05.0047 > +...... 05.00ab > +...... 05.00ff > +...... 06.0004 > +...... 06.0047 > +...... 06.00ab > +...... 06.00ff > +...... card05 > +...... card06 > + > +A set of default device drivers are also created to control each type of AP > +device that can be assigned to the LPAR on which a linux host is running: > + > +/sys/bus/ap > +... [drivers] > +...... [cex2acard] for Crypto Express 2/3 accelerator cards > +...... [cex2aqueue] for AP queues served by Crypto Express 2/3 > + accelerator cards > +...... [cex4card] for Crypto Express 4/5/6 accelerator and coprocessor > + cards > +...... [cex4queue] for AP queues served by Crypto Express 4/5/6 > + accelerator and coprocessor cards > +...... [pcixcccard] for Crypto Express 2/3 coprocessor cards > +...... [pcixccqueue] for AP queues served by Crypto Express 2/3 > + coprocessor cards > + > +Binding AP devices to device drivers > +------------------------------------ > +There are two sysfs files that specify bitmasks marking a subset of the APQN > +range as 'usable by the default AP queue device drivers' or 'not usable by the > +default device drivers' and thus available for use by the alternate device > +driver(s). The sysfs locations of the masks are: > + > + /sys/bus/ap/apmask > + /sys/bus/ap/aqmask > + > +The 'apmask' is a 256-bit mask that identifies a set of AP adapter IDs > +(APID). 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 APID is marked as > +usable only by the default AP queue device drivers; otherwise, the APID is > +usable by the vfio_ap device driver. > + > +The 'aqmask' is a 256-bit mask that identifies a set of AP queue indexes > +(APQI). Each bit in the mask, from most significant to least significant bit, > +corresponds to an APQI from 0-255. If a bit is set, the APQI is marked as > +usable only by the default AP queue device drivers; otherwise, the APQI is > +usable by the vfio_ap device driver. > + > +The APQN of each AP queue device assigned to the linux host is checked by the > +AP bus against the set of APQNs derived from the cross product of the APIDs > +and APQIs marked as usable only by the default AP queue device drivers. If a > +match is detected, only the default AP queue device drivers will be probed; > +otherwise, the alternate device driver(s) will be probed. > + > +By default, the two masks are set to mark all APQNs for use by the default > +AP queue device drivers. There are two ways the default masks can be changed: > + > + 1. The masks can be changed at boot time with the kernel command line > + like this: > + > + ap.apmask=0xffff ap.aqmask=0x40 > + > + This would give these two pools: > + > + default drivers pool: adapter 0-15, domain 1 > + alternate drivers pool: adapter 16-255, domains 2-255 > + > + 2. The sysfs mask files can also be edited by echoing a string into the > + respective file in one of two formats: > + > + * An absolute hex string starting with 0x - like "0x12345678" - sets > + the mask. If the given string is shorter than the mask, it is padded > + with 0s on the right. If the string is longer than the mask, the > + operation is terminated with an error (EINVAL). > + > + * A plus ('+') or minus ('-') followed by a numerical value. Valid > + examples are "+1", "-13", "+0x41", "-0xff" and even "+0" and "-0". Only > + the corresponding bit in the mask is switched on ('+') or off ('-'). The > + values may also be specified in a comma-separated list to switch more > + than one bit on or off. > + > +Configuring an AP matrix for a linux guest. > +------------------------------------------ > +The sysfs interfaces for configuring an AP matrix for a guest are built on the > +VFIO mediated device framework. To configure an AP matrix for a guest, a > +mediated matrix device must first be created for the /sys/devices/vfio_ap/matrix > +device. When the vfio_ap device driver is loaded, it registers with the VFIO > +mediated device framework. When the driver registers, the sysfs interfaces for > +creating mediated matrix devices is created: > + > +/sys/devices > +... [vfio_ap] > +......[matrix] > +......... [mdev_supported_types] > +............ [vfio_ap-passthrough] > +............... create > +............... [devices] > + > +A mediated AP matrix device is created by writing a UUID to the attribute file > +named 'create', for example: > + > + uuidgen > create > + > + or > + > + echo $uuid > create > + > +When a mediated AP matrix device is created, a sysfs directory named after > +the UUID is created in the 'devices' subdirectory: > + > +/sys/devices > +... [vfio_ap] > +......[matrix] > +......... [mdev_supported_types] > +............ [vfio_ap-passthrough] > +............... create > +............... [devices] > +.................. [$uuid] > + > +There will also be three sets of attribute files created in the mediated > +matrix device's sysfs directory to configure an AP matrix for the > +KVM guest: > + > +/sys/devices > +... [vfio_ap] > +......[matrix] > +......... [mdev_supported_types] > +............ [vfio_ap-passthrough] > +............... create > +............... [devices] > +.................. [$uuid] > +..................... assign_adapter > +..................... assign_control_domain > +..................... assign_domain > +..................... matrix > +..................... unassign_adapter > +..................... unassign_control_domain > +..................... unassign_domain > + > +assign_adapter > + To assign an AP adapter to the mediated matrix device, its APID is written > + to the 'assign_adapter' file. This may be done multiple times to assign more > + than one adapter. The APID may be specified using conventional semantics > + as a decimal, hexidecimal, or octal number. For example, to assign adapters > + 4, 5 and 16 to a mediated matrix device in decimal, hexidecimal and octal > + respectively: > + > + echo 4 > assign_adapter > + echo 0x5 > assign_adapter > + echo 020 > assign_adapter > + > + In order to successfully assign an adapter: > + > + * The adapter number specified must represent a value from 0 up to the > + maximum adapter number configured for the system. If an adapter number > + higher than the maximum is specified, the operation will terminate with > + an error (ENODEV). > + > + * All APQNs that can be derived from the adapter ID being assigned and the > + IDs of the previously assigned domains must be bound to the vfio_ap device > + driver. If no domains have yet been assigned, then there must be at least > + one APQN with the specified APID bound to the vfio_ap driver. If no such > + APQNs are bound to the driver, the operation will terminate with an > + error (EADDRNOTAVAIL). > + > + No APQN that can be derived from the adapter ID and the IDs of the > + previously assigned domains can be assigned to another mediated matrix > + device. If an APQN is assigned to another mediated matrix device, the > + operation will terminate with an error (EADDRINUSE). > + > +unassign_adapter > + To unassign an AP adapter, its APID is written to the 'unassign_adapter' > + file. This may also be done multiple times to unassign more than one adapter. > + > +assign_domain > + To assign a usage domain, the domain number is written into the > + 'assign_domain' file. This may be done multiple times to assign more than one > + usage domain. The domain number is specified using conventional semantics as > + a decimal, hexidecimal, or octal number. For example, to assign usage domains > + 4, 8, and 71 to a mediated matrix device in decimal, hexidecimal and octal > + respectively: > + > + echo 4 > assign_domain > + echo 0x8 > assign_domain > + echo 0107 > assign_domain > + > + In order to successfully assign a domain: > + > + * The domain number specified must represent a value from 0 up to the > + maximum domain number configured for the system. If a domain number > + higher than the maximum is specified, the operation will terminate with > + an error (ENODEV). > + > + * All APQNs that can be derived from the domain ID being assigned and the IDs > + of the previously assigned adapters must be bound to the vfio_ap device > + driver. If no domains have yet been assigned, then there must be at least > + one APQN with the specified APQI bound to the vfio_ap driver. If no such > + APQNs are bound to the driver, the operation will terminate with an > + error (EADDRNOTAVAIL). > + > + No APQN that can be derived from the domain ID being assigned and the IDs > + of the previously assigned adapters can be assigned to another mediated > + matrix device. If an APQN is assigned to another mediated matrix device, > + the operation will terminate with an error (EADDRINUSE). > + > +unassign_domain > + To unassign a usage domain, the domain number is written into the > + 'unassign_domain' file. This may be done multiple times to unassign more than > + one usage domain. > + > +assign_control_domain > + To assign a control domain, the domain number is written into the > + 'assign_control_domain' file. This may be done multiple times to > + assign more than one control domain. The domain number may be specified using > + conventional semantics as a decimal, hexidecimal, or octal number. For > + example, to assign control domains 4, 8, and 71 to a mediated matrix device > + in decimal, hexidecimal and octal respectively: > + > + echo 4 > assign_domain > + echo 0x8 > assign_domain > + echo 0107 > assign_domain > + > + In order to successfully assign a control domain, the domain number > + specified must represent a value from 0 up to the maximum domain number > + configured for the system. If a control domain number higher than the maximum > + is specified, the operation will terminate with an error (ENODEV). > + > +unassign_control_domain > + To unassign a control domain, the domain number is written into the > + 'unassign_domain' file. This may be done multiple times to unassign more than > + one control domain. > + > +Notes: Hot plug/unplug is not currently supported for mediated AP matrix > +devices, so no changes to the AP matrix will be allowed while a guest using > +the mediated matrix device is running. Attempts to assign an adapter, > +domain or control domain will be rejected and an error (EBUSY) returned. > + > +Starting a Linux Guest Configured with an AP Matrix: > +=================================================== > +To provide a mediated matrix device for use by a guest, the following option > +must be specified on the QEMU command line: > + > + -device vfio_ap,sysfsdev=$path-to-mdev > + > +The sysfsdev parameter specifies the path to the mediated matrix device. > +There are a number of ways to specify this path: > + > +/sys/devices/vfio_ap/matrix/$uuid > +/sys/bus/mdev/devices/$uuid > +/sys/bus/mdev/drivers/vfio_mdev/$uuid > +/sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/$uuid > + > +When the linux guest is started, the guest will open the mediated > +matrix device's file descriptor to get information about the mediated matrix > +device. The vfio_ap device driver will update the APM, AQM, and ADM fields in > +the guest's CRYCB with the adapter, usage domain and control domains assigned > +via the mediated matrix device's sysfs attribute files. Programs running on the > +linux guest will then: > + > +1. Have direct access to the APQNs derived from the cross product of the AP > + adapter numbers (APID) and queue indexes (APQI) specified in the APM and AQM > + fields of the guests's CRYCB respectively. These APQNs identify the AP queues > + that are valid for use by the guest; meaning, AP commands can be sent by the > + guest to any of these queues for processing. > + > +2. Have authorization to process AP commands to change a control domain > + identified in the ADM field of the guest's CRYCB. The AP command must be sent > + to a valid APQN (see 1 above). > + > +CPU model features: > + > +Three CPU model features are available for controlling guest access to AP > +facilities: > + > +1. AP facilities feature > + > + The AP facilities feature indicates that AP facilities are installed on the > + guest. This feature will be enabled by the kernel only if the AP facilities > + are installed on the host system. It will be turned on automatically for > + guests started with CPU model zEC12 or newer. The feature is s390-specific > + and is represented as a parameter of the -cpu option on the QEMU command > + line: > + > + qemu-system-s390x -cpu $model,ap=on|off > + > + Where: > + > + $model is the CPU model defined for the guest (defaults to the model of > + the host system if not specified). > + > + ap=on|off indicates whether AP facilities are installed (on) or not > + (off). The default for CPU models zEC12 or newer > + is ap=on. AP facilities must be installed on the guest if a > + vfio-ap device (-device vfio-ap,sysfsdev=$path) is configured > + for the guest or the guest will fail to start. > + > +2. Query Configuration Information (QCI) facility > + > + The QCI facility is used by the AP bus running on the guest to query the > + configuration of the AP facilities. This facility will be enabled by > + the kernel only if the QCI facility is installed on the host system. It will > + be turned on automatically for guests started with CPU model zEC12 or newer. > + The feature is s390-specific and is represented as a parameter of the -cpu > + option on the QEMU command line: > + > + qemu-system-s390x -cpu $model,apqci=on|off > + > + Where: > + > + $model is the CPU model defined for the guest > + > + apqci=on|off indicates whether the QCI facility is installed (on) or > + not (off). The default for CPU models zEC12 or newer > + is apqci=on; for older models, QCI will not be installed. > + > + If QCI is installed (apqci=on) but AP facilities are not > + (ap=off), an error message will be logged, but the guest > + will be allowed to start. It makes no sense to have QCI > + installed if the AP facilities are not; this is considered > + an invalid configuration. > + > + If the QCI facility is not installed, APQNs with an APQI > + greater than 15 will not be detected by the AP bus > + running on the guest. > + > +3. Adjunct Process Facility Test (APFT) facility > + > + The APFT facility is used by the AP bus running on the guest to test the > + AP facilities available for a given AP queue. This facility will be enabled > + by the kernel only if the APFT facility is installed on the host system. It > + will be turned on automatically for guests started with CPU model zEC12 or > + newer. The feature is s390-specific and is represented as a parameter of the > + -cpu option on the QEMU command line: > + > + qemu-system-s390x -cpu $model,apft=on|off > + > + Where: > + > + $model is the CPU model defined for the guest (defaults to the model of > + the host system if not specified). > + > + apft=on|off indicates whether the APFT facility is installed (on) or > + not (off). The default for CPU models zEC12 and > + newer is apft=on for older models, APFT will not be > + installed. > + > + If APFT is installed (apft=on) but AP facilities are not > + (ap=off), an error message will be logged, but the guest > + will be allowed to start. It makes no sense to have APFT > + installed if the AP facilities are not; this is considered > + an invalid configuration. > + > + It also makes no sense to turn APFT off because the AP bus > + running on the guest will not detect CEX4 and newer devices > + without it. Since only CEX4 and newer devices are supported > + for guest usage, no AP devices can be made accessible to a > + guest started without APFT installed. > + > +Example: Configure AP Matrixes for Three Linux Guests: > +===================================================== > +Let's now provide an example to illustrate how KVM guests may be given > +access to AP facilities. For this example, we will show how to configure > +three guests such that executing the lszcrypt command on the guests would > +look like this: > + > +Guest1 > +------ > +CARD.DOMAIN TYPE MODE > +------------------------------ > +05 CEX5C CCA-Coproc > +05.0004 CEX5C CCA-Coproc > +05.00ab CEX5C CCA-Coproc > +06 CEX5A Accelerator > +06.0004 CEX5A Accelerator > +06.00ab CEX5C CCA-Coproc > + > +Guest2 > +------ > +CARD.DOMAIN TYPE MODE > +------------------------------ > +05 CEX5A Accelerator > +05.0047 CEX5A Accelerator > +05.00ff CEX5A Accelerator (5,4), (5,171), (6,4), (6,171), > + > +Guest3 > +------ > +CARD.DOMAIN TYPE MODE > +------------------------------ > +06 CEX5A Accelerator > +06.0047 CEX5A Accelerator > +06.00ff CEX5A Accelerator > + > +These are the steps: > + > +1. Install the vfio_ap module on the linux host. The dependency chain for the > + vfio_ap module is: > + * iommu > + * s390 > + * zcrypt > + * vfio > + * vfio_mdev > + * vfio_mdev_device > + * KVM > + > + To build the vfio_ap module, the kernel build must be configured with the > + following Kconfig elements selected: > + * IOMMU_SUPPORT > + * S390 > + * ZCRYPT > + * S390_AP_IOMMU > + * VFIO > + * VFIO_MDEV > + * VFIO_MDEV_DEVICE > + * KVM > + > + If using make menuconfig select the following to build the vfio_ap module: > + -> Device Drivers > + -> IOMMU Hardware Support > + select S390 AP IOMMU Support > + -> VFIO Non-Privileged userspace driver framework > + -> Mediated device driver frramework > + -> VFIO driver for Mediated devices > + -> I/O subsystem > + -> VFIO support for AP devices > + > +2. Secure the AP queues to be used by the three guests so that the host can not > + access them. To secure the AP queues 05.0004, 05.0047, 05.00ab, 05.00ff, > + 06.0004, 06.0047, 06.00ab, and 06.00ff for use by the vfio_ap device driver, > + the corresponding APQNs must be removed from the default queue drivers pool > + as follows: > + > + echo -5,-6 > /sys/bus/ap/apmask > + > + echo -4,-0x47,-0xab,-0xff > /sys/bus/ap/aqmask > + > + This will result in AP queues 05.0004, 05.0047, 05.00ab, 05.00ff, 06.0004, > + 06.0047, 06.00ab, and 06.00ff getting bound to the vfio_ap device driver. The > + sysfs directory for the vfio_ap device driver will now contain symbolic links > + to the AP queue devices bound to it: > + > + /sys/bus/ap > + ... [drivers] > + ...... [vfio_ap] > + ......... [05.0004] > + ......... [05.0047] > + ......... [05.00ab] > + ......... [05.00ff] > + ......... [06.0004] > + ......... [06.0047] > + ......... [06.00ab] > + ......... [06.00ff] > + > + Keep in mind that only type 10 and newer adapters (i.e., CEX4 and later) > + can be bound to the vfio_ap device driver. The reason for this is to > + simplify the implementation by not needlessly complicating the design by > + supporting older devices that will go out of service in the relatively near > + future, and for which there are few older systems on which to test. > + > + The administrator, therefore, must take care to secure only AP queues that > + can be bound to the vfio_ap device driver. The device type for a given AP > + queue device can be read from the parent card's sysfs directory. For example, > + to see the hardware type of the queue 05.0004: > + > + cat /sys/bus/ap/devices/card05/hwtype > + > + The hwtype must be 10 or higher (CEX4 or newer) in order to be bound to the > + vfio_ap device driver. > + > +3. Create the mediated devices needed to configure the AP matrixes for the > + three guests and to provide an interface to the vfio_ap driver for > + use by the guests: > + > + /sys/devices/vfio_ap/matrix/ > + --- [mdev_supported_types] > + ------ [vfio_ap-passthrough] (passthrough mediated matrix device type) > + --------- create > + --------- [devices] > + > + To create the mediated devices for the three guests: > + > + uuidgen > create > + uuidgen > create > + uuidgen > create > + > + or > + > + echo $uuid1 > create > + echo $uuid2 > create > + echo $uuid3 > create > + > + This will create three mediated devices in the [devices] subdirectory named > + after the UUID used to create the mediated device. We'll call them $uuid1, > + $uuid2 and $uuid3 and this is the sysfs directory structure after creation: > + > + /sys/devices/vfio_ap/matrix/ > + --- [mdev_supported_types] > + ------ [vfio_ap-passthrough] > + --------- [devices] > + ------------ [$uuid1] > + --------------- assign_adapter > + --------------- assign_control_domain > + --------------- assign_domain > + --------------- matrix > + --------------- unassign_adapter > + --------------- unassign_control_domain > + --------------- unassign_domain > + > + ------------ [$uuid2] > + --------------- assign_adapter > + --------------- assign_control_domain > + --------------- assign_domain > + --------------- matrix > + --------------- unassign_adapter > + ----------------unassign_control_domain > + ----------------unassign_domain > + > + ------------ [$uuid3] > + --------------- assign_adapter > + --------------- assign_control_domain > + --------------- assign_domain > + --------------- matrix > + --------------- unassign_adapter > + ----------------unassign_control_domain > + ----------------unassign_domain > + > +4. The administrator now needs to configure the matrixes for the mediated > + devices $uuid1 (for Guest1), $uuid2 (for Guest2) and $uuid3 (for Guest3). > + > + This is how the matrix is configured for Guest1: > + > + echo 5 > assign_adapter > + echo 6 > assign_adapter > + echo 4 > assign_domain > + echo 0xab > assign_domain > + > + Control domains can similarly be assigned using the assign_control_domain > + sysfs file. > + > + If a mistake is made configuring an adapter, domain or control domain, > + you can use the unassign_xxx interfaces to unassign the adapter, domain or > + control domain. > + > + To display the matrix configuration for Guest1: > + > + cat matrix > + > + The output will display the APQNs in the format xx.yyyy, where xx is > + the adapter number and yyyy is the domain number. The output for Guest1 > + will look like this: > + > + 05.0004 > + 05.00ab > + 06.0004 > + 06.00ab > + > + This is how the matrix is configured for Guest2: > + > + echo 5 > assign_adapter > + echo 0x47 > assign_domain > + echo 0xff > assign_domain > + > + This is how the matrix is configured for Guest3: > + > + echo 6 > assign_adapter > + echo 0x47 > assign_domain > + echo 0xff > assign_domain > + > +5. Start Guest1: > + > + /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ > + -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid1 ... > + > +7. Start Guest2: > + > + /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ > + -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid2 ... > + > +7. Start Guest3: > + > + /usr/bin/qemu-system-s390x ... -cpu host,ap=on,apqci=on,apft=on \ > + -device vfio-ap,sysfsdev=/sys/devices/vfio_ap/matrix/$uuid3 ... > + > +When the guest is shut down, the mediated matrix devices may be removed. > + > +Using our example again, to remove the mediated matrix device $uuid1: > + > + /sys/devices/vfio_ap/matrix/ > + --- [mdev_supported_types] > + ------ [vfio_ap-passthrough] > + --------- [devices] > + ------------ [$uuid1] > + --------------- remove > + > + > + echo 1 > remove > + > + This will remove all of the mdev matrix device's sysfs structures including > + the mdev device itself. To recreate and reconfigure the mdev matrix device, > + all of the steps starting with step 3 will have to be performed again. Note > + that the remove will fail if a guest using the mdev is still running. > + > + It is not necessary to remove an mdev matrix device, but one may want to > + remove it if no guest will use it during the remaining lifetime of the linux > + host. If the mdev matrix device is removed, one may want to also reconfigure > + the pool of adapters and queues reserved for use by the default drivers. > + > +Limitations > +=========== > +* The KVM/kernel interfaces do not provide a way to prevent restoring an APQN > + to the default drivers pool of a queue that is still assigned to a mediated > + device in use by a guest. It is incumbent upon the administrator to > + ensure there is no mediated device in use by a guest to which the APQN is > + assigned lest the host be given access to the private data of the AP queue > + device, such as a private key configured specifically for the guest. > + > +* Dynamically modifying the AP matrix for a running guest (which would amount to > + hot(un)plug of AP devices for the guest) is currently not supported > + > +* Live guest migration is not supported for guests using AP devices. > obviously all remarks from Linux documentation for VFIO_AP are here to be handled too. With this: Reviewed-by: Pierre Morel<pmorel@linux.ibm.com> It also can be used as is to configure Linux/Qemu and make the guest working as expected: Tested-by: Pierre Morel<pmorel@linux.ibm.com> -- Pierre Morel Linux/KVM/QEMU in Böblingen - Germany ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2018-10-08 16:32 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20180926225440.6204-1-akrowiak@linux.vnet.ibm.com> [not found] ` <20180927112852.71782355.cohuck@redhat.com> 2018-10-02 14:05 ` [Qemu-devel] [PATCH v9 0/6] s390x: vfio-ap: guest dedicated crypto adapters Tony Krowiak [not found] ` <20180926225440.6204-3-akrowiak@linux.vnet.ibm.com> 2018-10-02 14:56 ` [Qemu-devel] [PATCH v9 2/6] s390x/cpumodel: Set up CPU model for AP device support Pierre Morel 2018-10-04 8:45 ` Pierre Morel 2018-10-04 8:53 ` Pierre Morel [not found] ` <20180926225440.6204-4-akrowiak@linux.vnet.ibm.com> [not found] ` <1bb4b47c-5dda-cbea-ee4e-c6b8645ee288@redhat.com> 2018-10-02 15:36 ` [Qemu-devel] [PATCH v9 3/6] s390x/kvm: enable AP instruction interpretation for guest Pierre Morel [not found] ` <20180926225440.6204-5-akrowiak@linux.vnet.ibm.com> 2018-10-04 8:57 ` [Qemu-devel] [PATCH v9 4/6] s390x/ap: base Adjunct Processor (AP) object model Pierre Morel [not found] ` <6ae10841-43af-f37f-450e-7dcb4cc75747@redhat.com> [not found] ` <20180927145240.7f8aba31.cohuck@redhat.com> [not found] ` <8a1b11b2-2145-d4fa-7415-8dc57402bdbe@linux.ibm.com> 2018-10-02 15:18 ` [Qemu-devel] [qemu-s390x] " Tony Krowiak 2018-10-08 14:20 ` Tony Krowiak 2018-10-08 14:22 ` David Hildenbrand 2018-10-08 14:35 ` Cornelia Huck 2018-10-08 14:48 ` Tony Krowiak 2018-10-08 14:44 ` Thomas Huth 2018-10-08 16:31 ` Tony Krowiak [not found] ` <20180926225440.6204-6-akrowiak@linux.vnet.ibm.com> [not found] ` <2291104a-4cbf-e4fd-3496-fa0910beb96a@redhat.com> 2018-10-02 15:05 ` [Qemu-devel] [qemu-s390x] [PATCH v9 5/6] s390x/vfio: ap: Introduce VFIO AP device Tony Krowiak 2018-10-04 8:27 ` [Qemu-devel] " Pierre Morel 2018-10-04 9:07 ` Pierre Morel [not found] ` <20180926225440.6204-7-akrowiak@linux.vnet.ibm.com> 2018-10-04 10:38 ` [Qemu-devel] [PATCH v9 6/6] s390: doc: detailed specifications for AP virtualization Pierre Morel
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).