Message ID | 20231017155101.40677-1-nsaenz@amazon.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] KVM: x86: hyper-v: Don't auto-enable stimer on write from user-space | expand |
Nicolas Saenz Julienne <nsaenz@amazon.com> writes: > Don't apply the stimer's counter side effects when modifying its > value from user-space, as this may trigger spurious interrupts. > > For example: > - The stimer is configured in auto-enable mode. > - The stimer's count is set and the timer enabled. > - The stimer expires, an interrupt is injected. > - The VM is live migrated. > - The stimer config and count are deserialized, auto-enable is ON, the > stimer is re-enabled. > - The stimer expires right away, and injects an unwarranted interrupt. > > Cc: stable@vger.kernel.org > Fixes: 1f4b34f825e8 ("kvm/x86: Hyper-V SynIC timers") > Signed-off-by: Nicolas Saenz Julienne <nsaenz@amazon.com> > --- > > Changes since v2: > - reword commit message/subject. > > Changes since v1: > - Cover all 'stimer->config.enable' updates. > > arch/x86/kvm/hyperv.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index 7c2dac6824e2..238afd7335e4 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -727,10 +727,12 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count, > > stimer_cleanup(stimer); > stimer->count = count; > - if (stimer->count == 0) > - stimer->config.enable = 0; > - else if (stimer->config.auto_enable) > - stimer->config.enable = 1; > + if (!host) { > + if (stimer->count == 0) > + stimer->config.enable = 0; > + else if (stimer->config.auto_enable) > + stimer->config.enable = 1; > + } > > if (stimer->config.enable) > stimer_mark_pending(stimer, false); LGTM, thanks! Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
On Tue, 17 Oct 2023 15:51:02 +0000, Nicolas Saenz Julienne wrote: > Don't apply the stimer's counter side effects when modifying its > value from user-space, as this may trigger spurious interrupts. > > For example: > - The stimer is configured in auto-enable mode. > - The stimer's count is set and the timer enabled. > - The stimer expires, an interrupt is injected. > - The VM is live migrated. > - The stimer config and count are deserialized, auto-enable is ON, the > stimer is re-enabled. > - The stimer expires right away, and injects an unwarranted interrupt. > > [...] Applied to kvm-x86 misc, thanks! [1/1] KVM: x86: hyper-v: Don't auto-enable stimer on write from user-space https://github.com/kvm-x86/linux/commit/d6800af51c76 -- https://github.com/kvm-x86/linux/tree/next
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 7c2dac6824e2..238afd7335e4 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -727,10 +727,12 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count, stimer_cleanup(stimer); stimer->count = count; - if (stimer->count == 0) - stimer->config.enable = 0; - else if (stimer->config.auto_enable) - stimer->config.enable = 1; + if (!host) { + if (stimer->count == 0) + stimer->config.enable = 0; + else if (stimer->config.auto_enable) + stimer->config.enable = 1; + } if (stimer->config.enable) stimer_mark_pending(stimer, false);
Don't apply the stimer's counter side effects when modifying its value from user-space, as this may trigger spurious interrupts. For example: - The stimer is configured in auto-enable mode. - The stimer's count is set and the timer enabled. - The stimer expires, an interrupt is injected. - The VM is live migrated. - The stimer config and count are deserialized, auto-enable is ON, the stimer is re-enabled. - The stimer expires right away, and injects an unwarranted interrupt. Cc: stable@vger.kernel.org Fixes: 1f4b34f825e8 ("kvm/x86: Hyper-V SynIC timers") Signed-off-by: Nicolas Saenz Julienne <nsaenz@amazon.com> --- Changes since v2: - reword commit message/subject. Changes since v1: - Cover all 'stimer->config.enable' updates. arch/x86/kvm/hyperv.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)