> -----Original Message----- > From: Jan Beulich [mailto:JBeulich@xxxxxxxx] > Sent: Wednesday, January 30, 2013 3:59 AM > To: KY Srinivasan > Cc: olaf@xxxxxxxxx; bp@xxxxxxxxx; apw@xxxxxxxxxxxxx; x86@xxxxxxxxxx; > tglx@xxxxxxxxxxxxx; devel@xxxxxxxxxxxxxxxxxxxxxx; gregkh@xxxxxxxxxxxxxxxxxxx; > jasowang@xxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; hpa@xxxxxxxxx > Subject: Re: [PATCH 3/3] X86: Handle Hyper-V vmbus interrupts as special > hypervisor interrupts > > >>> 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 ... I will make the necessary adjustments to deal with this. > > > --- 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()). Linux is usable on Hyper-V in full emulation mode with the Hyper-V specific clocksource plugged in. The current code permits that. K. Y _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel