| From 6ff53f6a438f72998f56e82e76694a1df9d1ea2c Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <seanjc@google.com> |
| Date: Fri, 8 Oct 2021 17:11:04 -0700 |
| Subject: x86/irq: Ensure PI wakeup handler is unregistered before module unload |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| commit 6ff53f6a438f72998f56e82e76694a1df9d1ea2c upstream. |
| |
| Add a synchronize_rcu() after clearing the posted interrupt wakeup handler |
| to ensure all readers, i.e. in-flight IRQ handlers, see the new handler |
| before returning to the caller. If the caller is an exiting module and |
| is unregistering its handler, failure to wait could result in the IRQ |
| handler jumping into an unloaded module. |
| |
| The registration path doesn't require synchronization, as it's the |
| caller's responsibility to not generate interrupts it cares about until |
| after its handler is registered. |
| |
| Fixes: f6b3c72c2366 ("x86/irq: Define a global vector for VT-d Posted-Interrupts") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| Message-Id: <20211009001107.3936588-2-seanjc@google.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kernel/irq.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/irq.c |
| +++ b/arch/x86/kernel/irq.c |
| @@ -295,8 +295,10 @@ void kvm_set_posted_intr_wakeup_handler( |
| { |
| if (handler) |
| kvm_posted_intr_wakeup_handler = handler; |
| - else |
| + else { |
| kvm_posted_intr_wakeup_handler = dummy_handler; |
| + synchronize_rcu(); |
| + } |
| } |
| EXPORT_SYMBOL_GPL(kvm_set_posted_intr_wakeup_handler); |
| |