2023-07-28 10:19:42

by Steffen Eiden

[permalink] [raw]
Subject: [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests

This series enables general KVM support for AP-passthrough for Secure
Execution guests (pv-guests).

To enable AP inside pv-guests two things have to be done/considered:
1) set corresponding flags in the Create Secure Configuration UVC ifi
firmware supports AP for pv-guests (patch 3).
2) enable/disable AP in pv-guests if the VMM wants this (patch 2).

since v1:
- PATCH 1: r-b from Claudio
- PATCH 2: fixed formatting issues (Claudio)
- PATCH 3: removed unnecessary checks (Claudio)

Steffen

Steffen Eiden (3):
s390: uv: UV feature check utility
KVM: s390: Add UV feature negotiation
KVM: s390: pv: Allow AP-instructions for pv guests

arch/s390/include/asm/kvm_host.h | 2 ++
arch/s390/include/asm/uv.h | 17 ++++++++-
arch/s390/include/uapi/asm/kvm.h | 25 +++++++++++++
arch/s390/kernel/uv.c | 2 +-
arch/s390/kvm/kvm-s390.c | 62 +++++++++++++++++++++++++++++++-
arch/s390/kvm/pv.c | 6 ++--
arch/s390/mm/fault.c | 2 +-
7 files changed, 110 insertions(+), 6 deletions(-)

--
2.40.1



2023-07-28 10:24:47

by Steffen Eiden

[permalink] [raw]
Subject: [PATCH v2 1/3] s390: uv: UV feature check utility

Introduces a function to check the existence of an UV feature.
Refactor feature bit checks to use the new function.

Reviewed-by: Claudio Imbrenda <[email protected]>
Signed-off-by: Steffen Eiden <[email protected]>
---
arch/s390/include/asm/uv.h | 5 +++++
arch/s390/kernel/uv.c | 2 +-
arch/s390/kvm/kvm-s390.c | 2 +-
arch/s390/mm/fault.c | 2 +-
4 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
index d6bb2f4f78d1..338845402324 100644
--- a/arch/s390/include/asm/uv.h
+++ b/arch/s390/include/asm/uv.h
@@ -397,6 +397,11 @@ struct uv_info {

extern struct uv_info uv_info;

+static inline bool uv_has_feature(u8 feature_bit)
+{
+ return test_bit_inv(feature_bit, &uv_info.uv_feature_indications);
+}
+
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
extern int prot_virt_guest;

diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index 66f0eb1c872b..152fd3e554c7 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -257,7 +257,7 @@ static bool should_export_before_import(struct uv_cb_header *uvcb, struct mm_str
* shared page from a different protected VM will automatically also
* transfer its ownership.
*/
- if (test_bit_inv(BIT_UV_FEAT_MISC, &uv_info.uv_feature_indications))
+ if (uv_has_feature(BIT_UV_FEAT_MISC))
return false;
if (uvcb->cmd == UVC_CMD_UNPIN_PAGE_SHARED)
return false;
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index e6511608280c..813cc3d59c90 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -2406,7 +2406,7 @@ static int kvm_s390_cpus_to_pv(struct kvm *kvm, u16 *rc, u16 *rrc)
struct kvm_vcpu *vcpu;

/* Disable the GISA if the ultravisor does not support AIV. */
- if (!test_bit_inv(BIT_UV_FEAT_AIV, &uv_info.uv_feature_indications))
+ if (!uv_has_feature(BIT_UV_FEAT_AIV))
kvm_s390_gisa_disable(kvm);

kvm_for_each_vcpu(i, vcpu, kvm) {
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index b5e1bea9194c..8a86dd725870 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -599,7 +599,7 @@ void do_secure_storage_access(struct pt_regs *regs)
* reliable without the misc UV feature so we need to check
* for that as well.
*/
- if (test_bit_inv(BIT_UV_FEAT_MISC, &uv_info.uv_feature_indications) &&
+ if (uv_has_feature(BIT_UV_FEAT_MISC) &&
!test_bit_inv(61, &regs->int_parm_long)) {
/*
* When this happens, userspace did something that it
--
2.40.1


2023-07-28 10:30:54

by Steffen Eiden

[permalink] [raw]
Subject: [PATCH v2 3/3] KVM: s390: pv: Allow AP-instructions for pv guests

Introduces new feature bits and enablement flags for AP and AP IRQ
support.

Signed-off-by: Steffen Eiden <[email protected]>
---
arch/s390/include/asm/uv.h | 12 +++++++++++-
arch/s390/kvm/pv.c | 6 ++++--
2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
index 338845402324..913ccfaa9d76 100644
--- a/arch/s390/include/asm/uv.h
+++ b/arch/s390/include/asm/uv.h
@@ -99,6 +99,8 @@ enum uv_cmds_inst {
enum uv_feat_ind {
BIT_UV_FEAT_MISC = 0,
BIT_UV_FEAT_AIV = 1,
+ BIT_UV_FEAT_AP = 4,
+ BIT_UV_FEAT_AP_INTR = 5,
};

struct uv_cb_header {
@@ -159,7 +161,15 @@ struct uv_cb_cgc {
u64 guest_handle;
u64 conf_base_stor_origin;
u64 conf_virt_stor_origin;
- u64 reserved30;
+ u8 reserved30[6];
+ union {
+ struct {
+ u16 reserved : 14;
+ u16 ap_instr_intr : 1;
+ u16 ap_allow_instr : 1;
+ };
+ u16 raw;
+ } flags;
u64 guest_stor_origin;
u64 guest_stor_len;
u64 guest_sca;
diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
index bf1fdc7bf89e..61d7712466c3 100644
--- a/arch/s390/kvm/pv.c
+++ b/arch/s390/kvm/pv.c
@@ -561,12 +561,14 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
uvcb.conf_base_stor_origin =
virt_to_phys((void *)kvm->arch.pv.stor_base);
uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var;
+ uvcb.flags.ap_allow_instr = kvm->arch.model.uv_feat_guest.ap;
+ uvcb.flags.ap_instr_intr = kvm->arch.model.uv_feat_guest.ap_intr;

cc = uv_call_sched(0, (u64)&uvcb);
*rc = uvcb.header.rc;
*rrc = uvcb.header.rrc;
- KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x",
- uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc);
+ KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x",
+ uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc, uvcb.flags.raw);

/* Outputs */
kvm->arch.pv.handle = uvcb.guest_handle;
--
2.40.1