>>> On 30.01.13 at 01:51, "K. Y. Srinivasan" <kys@xxxxxxxxxxxxx> wrote: > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -14,10 +14,15 @@ > #include <linux/time.h> > #include <linux/clocksource.h> > #include <linux/module.h> > +#include <linux/hardirq.h> > +#include <linux/interrupt.h> > #include <asm/processor.h> > #include <asm/hypervisor.h> > #include <asm/hyperv.h> > #include <asm/mshyperv.h> > +#include <asm/desc.h> > +#include <asm/idle.h> > +#include <asm/irq_regs.h> > > struct ms_hyperv_info ms_hyperv; > EXPORT_SYMBOL_GPL(ms_hyperv); > @@ -77,6 +82,12 @@ static void __init ms_hyperv_init_platform(void) > > if (ms_hyperv.features & HV_X64_MSR_TIME_REF_COUNT_AVAILABLE) > clocksource_register_hz(&hyperv_cs, NSEC_PER_SEC/100); > +#if IS_ENABLED(CONFIG_HYPERV) > + /* > + * Setup the IDT for hypervisor callback. > + */ > + alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, hyperv_callback_vector); > +#endif > } > > const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > @@ -85,3 +96,30 @@ const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > .init_platform = ms_hyperv_init_platform, > }; > EXPORT_SYMBOL(x86_hyper_ms_hyperv); > + > +static int vmbus_irq = -1; > +static irq_handler_t vmbus_isr; > + > +void hv_register_vmbus_handler(int irq, irq_handler_t handler) > +{ > + vmbus_irq = irq; > + vmbus_isr = handler; > +} > +EXPORT_SYMBOL_GPL(hv_register_vmbus_handler); > + > +void hyperv_vector_handler(struct pt_regs *regs) > +{ > + struct pt_regs *old_regs = set_irq_regs(regs); > + struct irq_desc *desc; > + > + irq_enter(); > + exit_idle(); > + > + desc = irq_to_desc(vmbus_irq); > + > + if (desc) > + generic_handle_irq_desc(vmbus_irq, desc); > + > + irq_exit(); > + set_irq_regs(old_regs); > +} This function appears to be dead code when !CONFIG_HYPERV, because ... > --- a/arch/x86/kernel/entry_32.S > +++ b/arch/x86/kernel/entry_32.S > @@ -1046,11 +1046,18 @@ ENTRY(xen_failsafe_callback) > _ASM_EXTABLE(4b,9b) > ENDPROC(xen_failsafe_callback) > > -BUILD_INTERRUPT3(xen_hvm_callback_vector, XEN_HVM_EVTCHN_CALLBACK, > +BUILD_INTERRUPT3(xen_hvm_callback_vector, HYPERVISOR_CALLBACK_VECTOR, > xen_evtchn_do_upcall) > > #endif /* CONFIG_XEN */ > > +#if IS_ENABLED(CONFIG_HYPERV) > + > +BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR, > + hyperv_vector_handler) > + > +#endif /* CONFIG_HYPERV */ > + > #ifdef CONFIG_FUNCTION_TRACER > #ifdef CONFIG_DYNAMIC_FTRACE > ... the consumers here and below are conditional. I also wonder why arch/x86/kernel/cpu/mshyperv.c is being built at all when !CONFIG_HYPERV (which would eliminate the need for the conditional the patch adds to ms_hyperv_init_platform()). Jan > diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S > index d5113c3..c1d01e6 100644 > --- a/arch/x86/kernel/entry_64.S > +++ b/arch/x86/kernel/entry_64.S > @@ -1446,11 +1446,16 @@ ENTRY(xen_failsafe_callback) > CFI_ENDPROC > END(xen_failsafe_callback) > > -apicinterrupt XEN_HVM_EVTCHN_CALLBACK \ > +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \ > xen_hvm_callback_vector xen_evtchn_do_upcall > > #endif /* CONFIG_XEN */ > > +#if IS_ENABLED(CONFIG_HYPERV) > +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \ > + hyperv_callback_vector hyperv_vector_handler > +#endif /* CONFIG_HYPERV */ > + > /* > * Some functions should be protected against kprobes > */ _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel