From: Janosch Frank <frankja@linux.ibm.com>
To: Claudio Imbrenda <imbrenda@linux.ibm.com>, linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org,
borntraeger@de.ibm.com, david@kernel.org, seiden@linux.ibm.com,
nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com
Subject: Re: [PATCH v8 05/13] KVM: s390: ucontrol: Fix sca_clear_ext_call()
Date: Mon, 3 Aug 2026 16:50:30 +0200 [thread overview]
Message-ID: <8209fdba-9947-42e2-b124-81adf3419f15@linux.ibm.com> (raw)
In-Reply-To: <20260803124040.126471-6-imbrenda@linux.ibm.com>
On 8/3/26 14:40, Claudio Imbrenda wrote:
> When cleaning up a UCONTROL VM, sca_clear_ext_call() will touch memory
> outside of the allocated ESCA block, and UCONTROL VMs don't even use
> ESCA.
>
> Fix by not touching ESCA for UCONTROL VMs, and fence the
> KVM_S390_INTERRUPT ioctl altogether. Add extra checks in
> sca_ext_call_pending() and sca_inject_ext_call() to make sure UCONTROL
> VMs won't touch ESCA.
>
> Fencing does not cause regressions with userspace, since UCONTROL VMs
> never used KVM_S390_INTERRUPT ioctls.
>
> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> Fixes: 7d43bafcff17 ("KVM: s390: Make provisions for ESCA utilization")
> ---
> arch/s390/kvm/interrupt.c | 19 ++++++++++++++-----
> arch/s390/kvm/kvm-s390.c | 5 +++++
> 2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
> index 2acdff130fa6..6b3f97a7513b 100644
> --- a/arch/s390/kvm/interrupt.c
> +++ b/arch/s390/kvm/interrupt.c
> @@ -45,13 +45,16 @@ static struct kvm_s390_gib *gib;
> static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
> {
> struct esca_block *sca = vcpu->kvm->arch.sca;
> - union esca_sigp_ctrl sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
> + union esca_sigp_ctrl sigp_ctrl;
>
> if (!kvm_s390_test_cpuflags(vcpu, CPUSTAT_ECALL_PEND))
> return 0;
> + if (kvm_is_ucontrol(vcpu->kvm))
> + return 0;
>
> BUG_ON(!kvm_s390_use_sca_entries());
>
> + sigp_ctrl = sca->cpu[vcpu->vcpu_id].sigp_ctrl;
> if (src_id)
> *src_id = sigp_ctrl.scn;
>
> @@ -60,13 +63,16 @@ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id)
>
> static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
> {
> - struct esca_block *sca = vcpu->kvm->arch.sca;
> - union esca_sigp_ctrl *sigp_ctrl = &sca->cpu[vcpu->vcpu_id].sigp_ctrl;
> union esca_sigp_ctrl old_val, new_val = {.scn = src_id, .c = 1};
> + struct esca_block *sca = vcpu->kvm->arch.sca;
> + union esca_sigp_ctrl *sigp_ctrl;
> int expect, rc;
>
> BUG_ON(!kvm_s390_use_sca_entries());
> + if (kvm_is_ucontrol(vcpu->kvm))
> + return -EINVAL;
>
> + sigp_ctrl = &sca->cpu[vcpu->vcpu_id].sigp_ctrl;
> old_val = READ_ONCE(*sigp_ctrl);
> old_val.c = 0;
>
> @@ -84,10 +90,13 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
> static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
> {
> struct esca_block *sca = vcpu->kvm->arch.sca;
> - union esca_sigp_ctrl *sigp_ctrl = &sca->cpu[vcpu->vcpu_id].sigp_ctrl;
> + union esca_sigp_ctrl *sigp_ctrl;
>
> - if (!kvm_s390_use_sca_entries() || !vcpu->arch.initialized)
> + if (!kvm_s390_use_sca_entries() || !vcpu->arch.initialized || kvm_is_ucontrol(vcpu->kvm))
> return;
> +
> + /* Initialize after the above check, to prevent going out of bounds */
> + sigp_ctrl = &sca->cpu[vcpu->vcpu_id].sigp_ctrl;
Not sure why you only add this here and not at the other two occurences.
But I don't think we need these comments at all.
Dereferencing things before a check is not a great idea in most cases.
Especially if the check validates if the memory has been set up at all :)
> kvm_s390_clear_cpuflags(vcpu, CPUSTAT_ECALL_PEND);
>
> WRITE_ONCE(sigp_ctrl->value, 0);
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index 5b2727d7dfd1..21574f57be72 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -2934,6 +2934,9 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
> case KVM_S390_INTERRUPT: {
> struct kvm_s390_interrupt s390int;
>
> + r = -EINVAL;
> + if (kvm_is_ucontrol(kvm))
> + break;
> r = -EFAULT;
> if (copy_from_user(&s390int, argp, sizeof(s390int)))
> break;
> @@ -5456,6 +5459,8 @@ long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl,
> struct kvm_s390_interrupt s390int;
> struct kvm_s390_irq s390irq = {};
>
> + if (kvm_is_ucontrol(vcpu->kvm))
> + return -EINVAL;
> if (copy_from_user(&s390int, argp, sizeof(s390int)))
> return -EFAULT;
> if (s390int_to_s390irq(&s390int, &s390irq))
Do we need changes to the api documentation for this rc?
next prev parent reply other threads:[~2026-08-03 14:50 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 12:40 [PATCH v8 00/13] KVM: s390: Misc fixes Claudio Imbrenda
2026-08-03 12:40 ` [PATCH v8 01/13] KVM: s390: Fix unlikely NULL gmap dereference Claudio Imbrenda
2026-08-03 12:55 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 02/13] KVM: s390: Do not free SCA if it was not allocated Claudio Imbrenda
2026-08-03 12:55 ` sashiko-bot
2026-08-03 14:08 ` Christian Borntraeger
2026-08-03 14:13 ` Janosch Frank
2026-08-03 12:40 ` [PATCH v8 03/13] KVM: s390: Fix kvm_s390_vcpu_unsetup_cmma() Claudio Imbrenda
2026-08-03 13:19 ` sashiko-bot
2026-08-03 14:30 ` Janosch Frank
2026-08-03 14:54 ` Claudio Imbrenda
2026-08-03 12:40 ` [PATCH v8 04/13] KVM: s390: Fix overclearing ESCA in case of error Claudio Imbrenda
2026-08-03 13:05 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 05/13] KVM: s390: ucontrol: Fix sca_clear_ext_call() Claudio Imbrenda
2026-08-03 13:21 ` sashiko-bot
2026-08-03 14:50 ` Janosch Frank [this message]
2026-08-03 15:03 ` Claudio Imbrenda
2026-08-03 12:40 ` [PATCH v8 06/13] KVM: s390: Fix leaking of PGM_ADDRESSING to userspace Claudio Imbrenda
2026-08-03 13:01 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 07/13] KVM: s390: Fix race in __do_essa() Claudio Imbrenda
2026-08-03 12:56 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 08/13] KVM: s390: cmma: Fix dirty tracking when removing memslot Claudio Imbrenda
2026-08-03 13:08 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 09/13] KVM: s390: ucontrol: Add missing locking around gmap_remove_child() Claudio Imbrenda
2026-08-03 12:59 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 10/13] KVM: s390: Free the mmu cache when kvm_arch_vcpu_create() fails Claudio Imbrenda
2026-08-03 12:51 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 11/13] KVM: s390: Return -EINTR if a signal is pending while faulting-in Claudio Imbrenda
2026-08-03 13:19 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 12/13] KVM: s390: Fix ordering when adding to SCA Claudio Imbrenda
2026-08-03 13:03 ` sashiko-bot
2026-08-03 12:40 ` [PATCH v8 13/13] KVM: s390: Fix cleanup in kvm_s390_pv_create_cpu() Claudio Imbrenda
2026-08-03 13:05 ` sashiko-bot
2026-08-03 15:06 ` Janosch Frank
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8209fdba-9947-42e2-b124-81adf3419f15@linux.ibm.com \
--to=frankja@linux.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=david@kernel.org \
--cc=gra@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=nrb@linux.ibm.com \
--cc=schlameuss@linux.ibm.com \
--cc=seiden@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.