summaryrefslogtreecommitdiffstats
path: root/arch/x86/xen/suspend_hvm.c
diff options
context:
space:
mode:
authorJane Malalane <jane.malalane@citrix.com>2022-07-29 09:04:16 +0200
committerJuergen Gross <jgross@suse.com>2022-08-12 11:28:21 +0200
commitb1c3497e604ddccea5af4071831ed0e4680fb35e (patch)
tree108b8bd765f1e0496592013bb988ac329ca19de9 /arch/x86/xen/suspend_hvm.c
parentxen: don't require virtio with grants for non-PV guests (diff)
downloadlinux-b1c3497e604ddccea5af4071831ed0e4680fb35e.tar.xz
linux-b1c3497e604ddccea5af4071831ed0e4680fb35e.zip
x86/xen: Add support for HVMOP_set_evtchn_upcall_vector
Implement support for the HVMOP_set_evtchn_upcall_vector hypercall in order to set the per-vCPU event channel vector callback on Linux and use it in preference of HVM_PARAM_CALLBACK_IRQ. If the per-VCPU vector setup is successful on BSP, use this method for the APs. If not, fallback to the global vector-type callback. Also register callback_irq at per-vCPU event channel setup to trick toolstack to think the domain is enlightened. Suggested-by: "Roger Pau Monné" <roger.pau@citrix.com> Signed-off-by: Jane Malalane <jane.malalane@citrix.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Link: https://lore.kernel.org/r/20220729070416.23306-1-jane.malalane@citrix.com Signed-off-by: Juergen Gross <jgross@suse.com>
Diffstat (limited to 'arch/x86/xen/suspend_hvm.c')
-rw-r--r--arch/x86/xen/suspend_hvm.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/xen/suspend_hvm.c b/arch/x86/xen/suspend_hvm.c
index 9d548b0c772f..0c4f7554b7cc 100644
--- a/arch/x86/xen/suspend_hvm.c
+++ b/arch/x86/xen/suspend_hvm.c
@@ -5,6 +5,7 @@
#include <xen/hvm.h>
#include <xen/features.h>
#include <xen/interface/features.h>
+#include <xen/events.h>
#include "xen-ops.h"
@@ -14,6 +15,13 @@ void xen_hvm_post_suspend(int suspend_cancelled)
xen_hvm_init_shared_info();
xen_vcpu_restore();
}
- xen_setup_callback_vector();
+ if (xen_percpu_upcall) {
+ unsigned int cpu;
+
+ for_each_online_cpu(cpu)
+ BUG_ON(xen_set_upcall_vector(cpu));
+ } else {
+ xen_setup_callback_vector();
+ }
xen_unplug_emulated_devices();
}