Commit 2771374d authored by Mukesh Rathor's avatar Mukesh Rathor Committed by Konrad Rzeszutek Wilk

xen/pvh: Piggyback on PVHVM for event channels (v2)

PVH is a PV guest with a twist - there are certain things
that work in it like HVM and some like PV. There is
a similar mode - PVHVM where we run in HVM mode with
PV code enabled - and this patch explores that.

The most notable PV interfaces are the XenBus and event channels.

We will piggyback on how the event channel mechanism is
used in PVHVM - that is we want the normal native IRQ mechanism
and we will install a vector (hvm callback) for which we
will call the event channel mechanism.

This means that from a pvops perspective, we can use
native_irq_ops instead of the Xen PV specific. Albeit in the
future we could support pirq_eoi_map. But that is
a feature request that can be shared with PVHVM.
Signed-off-by: default avatarMukesh Rathor <mukesh.rathor@oracle.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
Acked-by: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
parent 9103bb0f
...@@ -1144,8 +1144,9 @@ void xen_setup_vcpu_info_placement(void) ...@@ -1144,8 +1144,9 @@ void xen_setup_vcpu_info_placement(void)
xen_vcpu_setup(cpu); xen_vcpu_setup(cpu);
/* xen_vcpu_setup managed to place the vcpu_info within the /* xen_vcpu_setup managed to place the vcpu_info within the
percpu area for all cpus, so make use of it */ * percpu area for all cpus, so make use of it. Note that for
if (have_vcpu_info_placement) { * PVH we want to use native IRQ mechanism. */
if (have_vcpu_info_placement && !xen_pvh_domain()) {
pv_irq_ops.save_fl = __PV_IS_CALLEE_SAVE(xen_save_fl_direct); pv_irq_ops.save_fl = __PV_IS_CALLEE_SAVE(xen_save_fl_direct);
pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(xen_restore_fl_direct); pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(xen_restore_fl_direct);
pv_irq_ops.irq_disable = __PV_IS_CALLEE_SAVE(xen_irq_disable_direct); pv_irq_ops.irq_disable = __PV_IS_CALLEE_SAVE(xen_irq_disable_direct);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <xen/interface/xen.h> #include <xen/interface/xen.h>
#include <xen/interface/sched.h> #include <xen/interface/sched.h>
#include <xen/interface/vcpu.h> #include <xen/interface/vcpu.h>
#include <xen/features.h>
#include <xen/events.h> #include <xen/events.h>
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
...@@ -128,6 +129,8 @@ static const struct pv_irq_ops xen_irq_ops __initconst = { ...@@ -128,6 +129,8 @@ static const struct pv_irq_ops xen_irq_ops __initconst = {
void __init xen_init_irq_ops(void) void __init xen_init_irq_ops(void)
{ {
pv_irq_ops = xen_irq_ops; /* For PVH we use default pv_irq_ops settings. */
if (!xen_feature(XENFEAT_hvm_callback_vector))
pv_irq_ops = xen_irq_ops;
x86_init.irqs.intr_init = xen_init_IRQ; x86_init.irqs.intr_init = xen_init_IRQ;
} }
...@@ -1685,8 +1685,15 @@ void __init xen_init_IRQ(void) ...@@ -1685,8 +1685,15 @@ void __init xen_init_IRQ(void)
pirq_needs_eoi = pirq_needs_eoi_flag; pirq_needs_eoi = pirq_needs_eoi_flag;
#ifdef CONFIG_X86 #ifdef CONFIG_X86
if (xen_hvm_domain()) { if (xen_pv_domain()) {
irq_ctx_init(smp_processor_id());
if (xen_initial_domain())
pci_xen_initial_domain();
}
if (xen_feature(XENFEAT_hvm_callback_vector))
xen_callback_vector(); xen_callback_vector();
if (xen_hvm_domain()) {
native_init_IRQ(); native_init_IRQ();
/* pci_xen_hvm_init must be called after native_init_IRQ so that /* pci_xen_hvm_init must be called after native_init_IRQ so that
* __acpi_register_gsi can point at the right function */ * __acpi_register_gsi can point at the right function */
...@@ -1695,13 +1702,10 @@ void __init xen_init_IRQ(void) ...@@ -1695,13 +1702,10 @@ void __init xen_init_IRQ(void)
int rc; int rc;
struct physdev_pirq_eoi_gmfn eoi_gmfn; struct physdev_pirq_eoi_gmfn eoi_gmfn;
irq_ctx_init(smp_processor_id());
if (xen_initial_domain())
pci_xen_initial_domain();
pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map); eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map);
rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn); rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn);
/* TODO: No PVH support for PIRQ EOI */
if (rc != 0) { if (rc != 0) {
free_page((unsigned long) pirq_eoi_map); free_page((unsigned long) pirq_eoi_map);
pirq_eoi_map = NULL; pirq_eoi_map = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment