* [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
@ 2026-09-18 9:43 Paolo Bonzini
2026-09-21 22:52 ` Sean Christopherson
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2026-09-18 9:43 UTC (permalink / raw)
To: linux-kernel, kvm; +Cc: stable
When a guest makes a slow HVCALL_SIGNAL_EVENT hypercall with a connection ID
that is valid in userspace but not registered in the kernel conn_to_evt,
kvm_hvcall_signal_event() reads the connection ID and overwrites hc->ingpa.
However, hc->param still signals that the hypercall was a slow one, and
userspace will then treat the connection ID as an address.
Cc: stable@vger.kernel.org
Fixes: bd38b32053eb ("KVM: hyper-v: Collect hypercall params into struct")
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
originally reported by sashiko at
https://lore.kernel.org/kvm/20260918083322.C87F11F000FF@smtp.kernel.org/,
but the issue is preexisting and unrelated to the patch that was being
reviewed.
arch/x86/kvm/hyperv.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index 9f5adcd26cba..e3a8e8236230 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -2501,6 +2501,7 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
{
struct kvm_hv *hv = to_kvm_hv(vcpu->kvm);
struct eventfd_ctx *eventfd;
+ u64 conn_id;
int ret;
ret = kvm_hv_hypercall_check_params(vcpu, hc);
@@ -2511,14 +2512,16 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
int ret;
gpa_t gpa = hc->ingpa;
- if ((gpa & (__alignof__(hc->ingpa) - 1)) ||
- offset_in_page(gpa) + sizeof(hc->ingpa) > PAGE_SIZE)
+ if ((gpa & (__alignof__(conn_id) - 1)) ||
+ offset_in_page(gpa) + sizeof(conn_id) > PAGE_SIZE)
return HV_STATUS_INVALID_ALIGNMENT;
ret = kvm_vcpu_read_guest(vcpu, gpa,
- &hc->ingpa, sizeof(hc->ingpa));
+ &conn_id, sizeof(conn_id));
if (ret < 0)
return HV_STATUS_INVALID_ALIGNMENT;
+ } else {
+ conn_id = hc->ingpa;
}
/*
@@ -2526,15 +2529,15 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
* have no use for it, and in all known usecases it is zero, so just
* report lookup failure if it isn't.
*/
- if (hc->ingpa & 0xffff00000000ULL)
+ if (conn_id & 0xffff00000000ULL)
return HV_STATUS_INVALID_PORT_ID;
/* remaining bits are reserved-zero */
- if (hc->ingpa & ~KVM_HYPERV_CONN_ID_MASK)
+ if (conn_id & ~KVM_HYPERV_CONN_ID_MASK)
return HV_STATUS_INVALID_HYPERCALL_INPUT;
/* the eventfd is protected by vcpu->kvm->srcu, but conn_to_evt isn't */
rcu_read_lock();
- eventfd = idr_find(&hv->conn_to_evt, hc->ingpa);
+ eventfd = idr_find(&hv->conn_to_evt, conn_id);
rcu_read_unlock();
if (!eventfd)
return HV_STATUS_INVALID_PORT_ID;
--
2.52.0
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-18 9:43 [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall Paolo Bonzini
@ 2026-09-21 22:52 ` Sean Christopherson
2026-09-21 22:55 ` Paolo Bonzini
0 siblings, 1 reply; 8+ messages in thread
From: Sean Christopherson @ 2026-09-21 22:52 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: linux-kernel, kvm, stable
On Fri, Sep 18, 2026, Paolo Bonzini wrote:
> When a guest makes a slow HVCALL_SIGNAL_EVENT hypercall with a connection ID
> that is valid in userspace but not registered in the kernel conn_to_evt,
> kvm_hvcall_signal_event() reads the connection ID and overwrites hc->ingpa.
> However, hc->param still signals that the hypercall was a slow one, and
> userspace will then treat the connection ID as an address.
>
> Cc: stable@vger.kernel.org
> Fixes: bd38b32053eb ("KVM: hyper-v: Collect hypercall params into struct")
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> originally reported by sashiko at
> https://lore.kernel.org/kvm/20260918083322.C87F11F000FF@smtp.kernel.org/,
> but the issue is preexisting and unrelated to the patch that was being
> reviewed.
>
> arch/x86/kvm/hyperv.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
> index 9f5adcd26cba..e3a8e8236230 100644
> --- a/arch/x86/kvm/hyperv.c
> +++ b/arch/x86/kvm/hyperv.c
> @@ -2501,6 +2501,7 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> {
> struct kvm_hv *hv = to_kvm_hv(vcpu->kvm);
> struct eventfd_ctx *eventfd;
> + u64 conn_id;
> int ret;
This doesn't apply to any branch I can find, and there is some unnecessary variable
shadowing going on here as well.
The actual change looks good, but the diff is wonky.
> ret = kvm_hv_hypercall_check_params(vcpu, hc);
> @@ -2511,14 +2512,16 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> int ret;
> gpa_t gpa = hc->ingpa;
>
> - if ((gpa & (__alignof__(hc->ingpa) - 1)) ||
> - offset_in_page(gpa) + sizeof(hc->ingpa) > PAGE_SIZE)
> + if ((gpa & (__alignof__(conn_id) - 1)) ||
> + offset_in_page(gpa) + sizeof(conn_id) > PAGE_SIZE)
> return HV_STATUS_INVALID_ALIGNMENT;
>
> ret = kvm_vcpu_read_guest(vcpu, gpa,
> - &hc->ingpa, sizeof(hc->ingpa));
> + &conn_id, sizeof(conn_id));
> if (ret < 0)
> return HV_STATUS_INVALID_ALIGNMENT;
> + } else {
> + conn_id = hc->ingpa;
> }
>
> /*
> @@ -2526,15 +2529,15 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> * have no use for it, and in all known usecases it is zero, so just
> * report lookup failure if it isn't.
> */
> - if (hc->ingpa & 0xffff00000000ULL)
> + if (conn_id & 0xffff00000000ULL)
> return HV_STATUS_INVALID_PORT_ID;
> /* remaining bits are reserved-zero */
> - if (hc->ingpa & ~KVM_HYPERV_CONN_ID_MASK)
> + if (conn_id & ~KVM_HYPERV_CONN_ID_MASK)
> return HV_STATUS_INVALID_HYPERCALL_INPUT;
>
> /* the eventfd is protected by vcpu->kvm->srcu, but conn_to_evt isn't */
> rcu_read_lock();
> - eventfd = idr_find(&hv->conn_to_evt, hc->ingpa);
> + eventfd = idr_find(&hv->conn_to_evt, conn_id);
> rcu_read_unlock();
> if (!eventfd)
> return HV_STATUS_INVALID_PORT_ID;
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 22:52 ` Sean Christopherson
@ 2026-09-21 22:55 ` Paolo Bonzini
2026-09-21 23:01 ` Sean Christopherson
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2026-09-21 22:55 UTC (permalink / raw)
To: Sean Christopherson; +Cc: linux-kernel, kvm, stable
On Tue, Sep 22, 2026 at 12:52 AM Sean Christopherson <seanjc@google.com> wrote:
> > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
> > index 9f5adcd26cba..e3a8e8236230 100644
> > --- a/arch/x86/kvm/hyperv.c
> > +++ b/arch/x86/kvm/hyperv.c
> > @@ -2501,6 +2501,7 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> > {
> > struct kvm_hv *hv = to_kvm_hv(vcpu->kvm);
> > struct eventfd_ctx *eventfd;
> > + u64 conn_id;
> > int ret;
>
> This doesn't apply to any branch I can find, and there is some unnecessary variable
> shadowing going on here as well.
>
> The actual change looks good, but the diff is wonky.
You're right, I probably generated this from the wrong branch (or
machine). The right patch is at
https://lore.kernel.org/kvm/20260918135030.171564-2-pbonzini@redhat.com/.
(BTW, I would like to talk about memory attributes and kvm-userfault
next Wednesday... and whether those are two different things at all).
Paolo
> > ret = kvm_hv_hypercall_check_params(vcpu, hc);
> > @@ -2511,14 +2512,16 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> > int ret;
> > gpa_t gpa = hc->ingpa;
> >
> > - if ((gpa & (__alignof__(hc->ingpa) - 1)) ||
> > - offset_in_page(gpa) + sizeof(hc->ingpa) > PAGE_SIZE)
> > + if ((gpa & (__alignof__(conn_id) - 1)) ||
> > + offset_in_page(gpa) + sizeof(conn_id) > PAGE_SIZE)
> > return HV_STATUS_INVALID_ALIGNMENT;
> >
> > ret = kvm_vcpu_read_guest(vcpu, gpa,
> > - &hc->ingpa, sizeof(hc->ingpa));
> > + &conn_id, sizeof(conn_id));
> > if (ret < 0)
> > return HV_STATUS_INVALID_ALIGNMENT;
> > + } else {
> > + conn_id = hc->ingpa;
> > }
> >
> > /*
> > @@ -2526,15 +2529,15 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> > * have no use for it, and in all known usecases it is zero, so just
> > * report lookup failure if it isn't.
> > */
> > - if (hc->ingpa & 0xffff00000000ULL)
> > + if (conn_id & 0xffff00000000ULL)
> > return HV_STATUS_INVALID_PORT_ID;
> > /* remaining bits are reserved-zero */
> > - if (hc->ingpa & ~KVM_HYPERV_CONN_ID_MASK)
> > + if (conn_id & ~KVM_HYPERV_CONN_ID_MASK)
> > return HV_STATUS_INVALID_HYPERCALL_INPUT;
> >
> > /* the eventfd is protected by vcpu->kvm->srcu, but conn_to_evt isn't */
> > rcu_read_lock();
> > - eventfd = idr_find(&hv->conn_to_evt, hc->ingpa);
> > + eventfd = idr_find(&hv->conn_to_evt, conn_id);
> > rcu_read_unlock();
> > if (!eventfd)
> > return HV_STATUS_INVALID_PORT_ID;
> > --
> > 2.52.0
> >
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 22:55 ` Paolo Bonzini
@ 2026-09-21 23:01 ` Sean Christopherson
2026-09-21 23:02 ` Paolo Bonzini
0 siblings, 1 reply; 8+ messages in thread
From: Sean Christopherson @ 2026-09-21 23:01 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: linux-kernel, kvm, stable
+James
On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> On Tue, Sep 22, 2026 at 12:52 AM Sean Christopherson <seanjc@google.com> wrote:
> > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
> > > index 9f5adcd26cba..e3a8e8236230 100644
> > > --- a/arch/x86/kvm/hyperv.c
> > > +++ b/arch/x86/kvm/hyperv.c
> > > @@ -2501,6 +2501,7 @@ static int kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *h
> > > {
> > > struct kvm_hv *hv = to_kvm_hv(vcpu->kvm);
> > > struct eventfd_ctx *eventfd;
> > > + u64 conn_id;
> > > int ret;
> >
> > This doesn't apply to any branch I can find, and there is some unnecessary variable
> > shadowing going on here as well.
> >
> > The actual change looks good, but the diff is wonky.
>
> You're right, I probably generated this from the wrong branch (or
> machine). The right patch is at
> https://lore.kernel.org/kvm/20260918135030.171564-2-pbonzini@redhat.com/.
>
> (BTW, I would like to talk about memory attributes and kvm-userfault
> next Wednesday... and whether those are two different things at all).
By "next" Wednesday, do you mean the 23rd or the 30th? I want to make sure James
is pulled into the discussion as he know a lot more than I do with respect to
Google's use cases for KVM Userfault.
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 23:01 ` Sean Christopherson
@ 2026-09-21 23:02 ` Paolo Bonzini
2026-09-21 23:11 ` Sean Christopherson
0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2026-09-21 23:02 UTC (permalink / raw)
To: Sean Christopherson; +Cc: linux-kernel, kvm, stable
On Tue, Sep 22, 2026 at 1:01 AM Sean Christopherson <seanjc@google.com> wrote:
>
> +James
>
> On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> > (BTW, I would like to talk about memory attributes and kvm-userfault
> > next Wednesday... and whether those are two different things at all).
>
> By "next" Wednesday, do you mean the 23rd or the 30th? I want to make sure James
> is pulled into the discussion as he know a lot more than I do with respect to
> Google's use cases for KVM Userfault.
Either is fine, of course 23rd is better if there are no other topics planned.
Paolo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 23:02 ` Paolo Bonzini
@ 2026-09-21 23:11 ` Sean Christopherson
2026-09-21 23:23 ` James Houghton
0 siblings, 1 reply; 8+ messages in thread
From: Sean Christopherson @ 2026-09-21 23:11 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: linux-kernel, kvm, James Houghton
+James for real this time.
On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> On Tue, Sep 22, 2026 at 1:01 AM Sean Christopherson <seanjc@google.com> wrote:
> >
> > +James
> >
> > On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> > > (BTW, I would like to talk about memory attributes and kvm-userfault
> > > next Wednesday... and whether those are two different things at all).
> >
> > By "next" Wednesday, do you mean the 23rd or the 30th? I want to make sure James
> > is pulled into the discussion as he know a lot more than I do with respect to
> > Google's use cases for KVM Userfault.
>
> Either is fine, of course 23rd is better if there are no other topics planned.
James, how are you feeling about an early morning PUCK in the near future?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 23:11 ` Sean Christopherson
@ 2026-09-21 23:23 ` James Houghton
2026-09-21 23:33 ` Paolo Bonzini
0 siblings, 1 reply; 8+ messages in thread
From: James Houghton @ 2026-09-21 23:23 UTC (permalink / raw)
To: Sean Christopherson; +Cc: Paolo Bonzini, linux-kernel, kvm
On Mon, Sep 21, 2026 at 4:11 PM Sean Christopherson <seanjc@google.com> wrote:
>
> +James for real this time.
>
> On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> > On Tue, Sep 22, 2026 at 1:01 AM Sean Christopherson <seanjc@google.com> wrote:
> > >
> > > +James
> > >
> > > On Tue, Sep 22, 2026, Paolo Bonzini wrote:
> > > > (BTW, I would like to talk about memory attributes and kvm-userfault
> > > > next Wednesday... and whether those are two different things at all).
> > >
> > > By "next" Wednesday, do you mean the 23rd or the 30th? I want to make sure James
> > > is pulled into the discussion as he know a lot more than I do with respect to
> > > Google's use cases for KVM Userfault.
> >
> > Either is fine, of course 23rd is better if there are no other topics planned.
>
> James, how are you feeling about an early morning PUCK in the near future?
No problems here; the 23rd is fine. The only day I can't do in the
near-ish future is Oct 14. Thanks!
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall
2026-09-21 23:23 ` James Houghton
@ 2026-09-21 23:33 ` Paolo Bonzini
0 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2026-09-21 23:33 UTC (permalink / raw)
To: James Houghton, Sean Christopherson; +Cc: linux-kernel, kvm
On 9/22/26 01:23, James Houghton wrote:
>> James, how are you feeling about an early morning PUCK in the near future?
> No problems here; the 23rd is fine. The only day I can't do in the
> near-ish future is Oct 14. Thanks!
Great. To sum up what I would like to understand, this is it:
1) the overlap between memory protection attributes and kvm-userfault.
It seems to me that they are almost the same, but I may be wrong.
In particular, they are almost the same in that they are both
stop-and-retry interfaces, unlike userfaultfd which hides the
stop-and-retry behind a page fault and a stopped thread.
2) what strategy you have implemented, or you have in mind, to handle
stop-and-retry for code that does many consecutive memory accesses. The
main one is nested vmentry/vmexit. I have here some mostly untested
code that splits them into prepare/commit/cancel phases, but I haven't
dared posting it.
(Secondarily, we have a TDX-sized dependency between planes, memory
attributes, VBS, and kvm-userfault. That is probably something worth
discussing too, sooner or later).
Paolo
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-09-21 23:33 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-18 9:43 [PATCH] KVM: x86/hyperv: do not overwrite hc->ingpa for slow SIGNAL_EVENT hypercall Paolo Bonzini
2026-09-21 22:52 ` Sean Christopherson
2026-09-21 22:55 ` Paolo Bonzini
2026-09-21 23:01 ` Sean Christopherson
2026-09-21 23:02 ` Paolo Bonzini
2026-09-21 23:11 ` Sean Christopherson
2026-09-21 23:23 ` James Houghton
2026-09-21 23:33 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®