On Fri, May 05, 2017 at 10:00:36AM +0200, Juergen Gross wrote: > Revert commit 72a9b186292 ("xen: Remove event channel notification > through Xen PCI platform device") as the original analysis was wrong > that all the removed code isn't in use any more. As commit da72ff5bfcb0 > ("partially revert xen: Remove event channel notification through Xen > PCI platform device") reverted already some parts of it revert this > commit, too. > > It is still necessary for old Xen versions (< 4.0) and for being able > to run the Linux kernel as dom0 in a nested Xen environment. > > Upstream commit is 84d582d236dc1f9085e741affc72e9ba061a67c2. > > Cc: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxxxxx> > Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> > Cc: x86@xxxxxxxxxx > Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> > Cc: Julien Grall <julien.grall@xxxxxxx> > Cc: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> > Cc: Paul Gortmaker <paul.gortmaker@xxxxxxxxxxxxx> > Cc: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> > Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx > Cc: linux-pci@xxxxxxxxxxxxxxx > Cc: Anthony Liguori <aliguori@xxxxxxxxxx> > Cc: KarimAllah Ahmed <karahmed@xxxxxxxxx> > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> > --- > Please apply to stable-4.10.y and stable-4.11.y > --- > arch/x86/include/asm/xen/events.h | 11 +++++++++++ > arch/x86/pci/xen.c | 2 +- > arch/x86/xen/enlighten.c | 21 +++++++++++++++------ > arch/x86/xen/smp.c | 2 ++ > arch/x86/xen/time.c | 5 +++++ > drivers/xen/events/events_base.c | 26 +++++++++++++++++--------- > drivers/xen/platform-pci.c | 13 +++---------- > include/xen/xen.h | 3 ++- > 8 files changed, 56 insertions(+), 27 deletions(-) > > diff --git a/arch/x86/include/asm/xen/events.h > b/arch/x86/include/asm/xen/events.h > index 608a79d5a466..e6911caf5bbf 100644 > --- a/arch/x86/include/asm/xen/events.h > +++ b/arch/x86/include/asm/xen/events.h > @@ -20,4 +20,15 @@ static inline int xen_irqs_disabled(struct pt_regs *regs) > /* No need for a barrier -- XCHG is a barrier on x86. */ > #define xchg_xen_ulong(ptr, val) xchg((ptr), (val)) > +extern int xen_have_vector_callback; > + > +/* > + * Events delivered via platform PCI interrupts are always > + * routed to vcpu 0 and hence cannot be rebound. > + */ > +static inline bool xen_support_evtchn_rebind(void) > +{ > + return (!xen_hvm_domain() || xen_have_vector_callback); > +} > + > #endif /* _ASM_X86_XEN_EVENTS_H */ > diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c > index 292ab0364a89..c4b3646bd04c 100644 > --- a/arch/x86/pci/xen.c > +++ b/arch/x86/pci/xen.c > @@ -447,7 +447,7 @@ void __init xen_msi_init(void) > int __init pci_xen_hvm_init(void) > { > - if (!xen_feature(XENFEAT_hvm_pirqs)) > + if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs)) > return 0; > #ifdef CONFIG_ACPI > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c > index 51ef95232725..6623867cc0d4 100644 > --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -137,6 +137,8 @@ struct shared_info xen_dummy_shared_info; > void *xen_initial_gdt; > RESERVE_BRK(shared_info_page_brk, PAGE_SIZE); > +__read_mostly int xen_have_vector_callback; > +EXPORT_SYMBOL_GPL(xen_have_vector_callback); > static int xen_cpu_up_prepare(unsigned int cpu); > static int xen_cpu_up_online(unsigned int cpu); > @@ -1508,7 +1510,10 @@ static void __init xen_pvh_early_guest_init(void) > if (!xen_feature(XENFEAT_auto_translated_physmap)) > return; > - BUG_ON(!xen_feature(XENFEAT_hvm_callback_vector)); > + if (!xen_feature(XENFEAT_hvm_callback_vector)) > + return; > + > + xen_have_vector_callback = 1; > xen_pvh_early_cpu_init(0, false); > xen_pvh_set_cr_flags(0); > @@ -1847,7 +1852,9 @@ static int xen_cpu_up_prepare(unsigned int cpu) > xen_vcpu_setup(cpu); > } > - if (xen_pv_domain() || xen_feature(XENFEAT_hvm_safe_pvclock)) > + if (xen_pv_domain() || > + (xen_have_vector_callback && > + xen_feature(XENFEAT_hvm_safe_pvclock))) > xen_setup_timer(cpu); > rc = xen_smp_intr_init(cpu); > @@ -1863,7 +1870,9 @@ static int xen_cpu_dead(unsigned int cpu) > { > xen_smp_intr_free(cpu); > - if (xen_pv_domain() || xen_feature(XENFEAT_hvm_safe_pvclock)) > + if (xen_pv_domain() || > + (xen_have_vector_callback && > + xen_feature(XENFEAT_hvm_safe_pvclock))) > xen_teardown_timer(cpu); > return 0; > @@ -1902,8 +1911,8 @@ static void __init xen_hvm_guest_init(void) > xen_panic_handler_init(); > - BUG_ON(!xen_feature(XENFEAT_hvm_callback_vector)); > - > + if (xen_feature(XENFEAT_hvm_callback_vector)) > + xen_have_vector_callback = 1; > xen_hvm_smp_init(); > WARN_ON(xen_cpuhp_setup()); > xen_unplug_emulated_devices(); > @@ -1941,7 +1950,7 @@ bool xen_hvm_need_lapic(void) > return false; > if (!xen_hvm_domain()) > return false; > - if (xen_feature(XENFEAT_hvm_pirqs)) > + if (xen_feature(XENFEAT_hvm_pirqs) && xen_have_vector_callback) > return false; > return true; > } > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > index 311acad7dad2..137afbbd0590 100644 > --- a/arch/x86/xen/smp.c > +++ b/arch/x86/xen/smp.c > @@ -765,6 +765,8 @@ static void __init xen_hvm_smp_prepare_cpus(unsigned > int max_cpus) > void __init xen_hvm_smp_init(void) > { > + if (!xen_have_vector_callback) > + return; > smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus; > smp_ops.smp_send_reschedule = xen_smp_send_reschedule; > smp_ops.cpu_die = xen_cpu_die; > diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c > index 1e69956d7852..4535627cf532 100644 > --- a/arch/x86/xen/time.c > +++ b/arch/x86/xen/time.c > @@ -432,6 +432,11 @@ static void xen_hvm_setup_cpu_clockevents(void) > void __init xen_hvm_init_time_ops(void) > { > + /* vector callback is needed otherwise we cannot receive interrupts > + * on cpu > 0 and at this point we don't know how many cpus are > + * available */ > + if (!xen_have_vector_callback) > + return; > if (!xen_feature(XENFEAT_hvm_safe_pvclock)) { > printk(KERN_INFO "Xen doesn't support pvclock on HVM," > "disable pv timer\n"); > diff --git a/drivers/xen/events/events_base.c > b/drivers/xen/events/events_base.c > index fd8e872d2943..86199f31bc57 100644 > --- a/drivers/xen/events/events_base.c > +++ b/drivers/xen/events/events_base.c > @@ -1312,6 +1312,9 @@ static int rebind_irq_to_cpu(unsigned irq, > unsigned tcpu) Your patch is line-wrapped and can not be applied :( can you fix this up and resend both this, and the 4.9 patch? thanks, greg k-h