|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH V5 14/14] xen: register 3-level event channel
CPU hotplug is supported.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
arch/x86/xen/enlighten.c | 12 ++++++++++++
drivers/xen/events.c | 22 +++++++++++++++++++++-
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 3556678..18edf66 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -213,6 +213,18 @@ void xen_vcpu_restore(void)
HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL))
BUG();
}
+
+ /*
+ * If we use any extended event channel ABI, should try to
+ * re-setup it in restore path. Currently only 3-level ABI is
+ * implemented, so simplify the code a bit.
+ */
+ if (xen_evtchn_extended & EVTCHN_EXTENDED_L3) {
+ int rc;
+ rc = xen_event_channel_register_extended(EVTCHN_EXTENDED_L3);
+ if (rc)
+ xen_set_event_channel_extended(EVTCHN_EXTENDED_NONE);
+ }
}
static void __init xen_banner(void)
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 6f21f27..b7e5bc1 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -2368,6 +2368,11 @@ static int __cpuinit xen_events_notifier_cb(struct
notifier_block *self,
rc = NOTIFY_OK;
}
}
+ if (rc == NOTIFY_OK &&
+ xen_evtchn_extended & EVTCHN_EXTENDED_L3) {
+ rc = xen_event_channel_register_3level_l2selector(cpu);
+ rc = (rc == 0 ? NOTIFY_OK : NOTIFY_BAD);
+ }
break;
default:
break;
@@ -2383,8 +2388,23 @@ void __init xen_init_IRQ(void)
{
int i;
int cpu;
+ uint64_t evtchn_ext_abis;
+ int rc, fallback_to_default_evtchn = 0;
+
+ evtchn_ext_abis = xen_event_channel_query_extended_abis();
+
+ if (evtchn_ext_abis == EVTCHN_EXTENDED_NONE)
+ fallback_to_default_evtchn = 1;
+ else if (evtchn_ext_abis & EVTCHN_EXTENDED_L3) {
+ rc = xen_event_channel_register_extended(EVTCHN_EXTENDED_L3);
+ if (rc == 0)
+ xen_set_event_channel_extended(EVTCHN_EXTENDED_L3);
+ else
+ fallback_to_default_evtchn = 1;
+ }
- xen_set_event_channel_extended(EVTCHN_EXTENDED_NONE);
+ if (fallback_to_default_evtchn)
+ xen_set_event_channel_extended(EVTCHN_EXTENDED_NONE);
evtchn_to_irq = kcalloc(xen_nr_event_channels, sizeof(*evtchn_to_irq),
GFP_KERNEL);
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |