[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re: Losing PS/2 Interrupts
On May 24, 2011, at 9:53 AM, Stefano Stabellini wrote: > On Mon, 23 May 2011, Thomas Goetz wrote: >> I'm running with the attached workaround and I'm the PS/2 issue is gone. >> >> drivers/xen/events.c :: xen_map_pirq_gsi >> >> if ((strcmp(name, "ioapic-edge") != 0) && pirq_needs_eoi(irq)) { >> set_irq_chip_and_handler_name(irq, &xen_pirq_chip, >> handle_fasteoi_irq, name); >> } else { >> set_irq_chip_and_handler_name(irq, &xen_pirq_chip, >> handle_edge_irq, name); >> } > > I had the same idea while reading your previous email. > I think the following patch is better than strcmp name: > > --- > > Use the trigger info we already have to choose the irq handler > > Do not use pirq_needs_eoi to decide which irq handler to use because Xen > always returns true if the guest does not support pirq_eoi_map. > Use the trigger information we already have from MP-tables and ACPI. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > diff --git a/drivers/xen/events.c b/drivers/xen/events.c > index 7f676f8..8418398 100644 > --- a/drivers/xen/events.c > +++ b/drivers/xen/events.c > @@ -627,6 +627,9 @@ int xen_allocate_pirq_gsi(unsigned gsi) > * > * Note: We don't assign an event channel until the irq actually started > * up. Return an existing irq if we've already got one for the gsi. > + * > + * Shareable implies level triggered, not shareable implies edge > + * triggered here. > */ > int xen_bind_pirq_gsi_to_irq(unsigned gsi, > unsigned pirq, int shareable, char *name) > @@ -665,16 +668,13 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, > > pirq_query_unmask(irq); > /* We try to use the handler with the appropriate semantic for the > - * type of interrupt: if the interrupt doesn't need an eoi > - * (pirq_needs_eoi returns false), we treat it like an edge > - * triggered interrupt so we use handle_edge_irq. > - * As a matter of fact this only happens when the corresponding > - * physical interrupt is edge triggered or an msi. > + * type of interrupt: if the interrupt is an edge triggered > + * interrupt we use handle_edge_irq. > * > - * On the other hand if the interrupt needs an eoi (pirq_needs_eoi > - * returns true) we treat it like a level triggered interrupt so we > - * use handle_fasteoi_irq like the native code does for this kind of > + * On the other hand if the interrupt is level triggered we use > + * handle_fasteoi_irq like the native code does for this kind of > * interrupts. > + * > * Depending on the Xen version, pirq_needs_eoi might return true > * not only for level triggered interrupts but for edge triggered > * interrupts too. In any case Xen always honors the eoi mechanism, > @@ -682,7 +682,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, > * hasn't received an eoi yet. Therefore using the fasteoi handler > * is the right choice either way. > */ > - if (pirq_needs_eoi(irq)) > + if (shareable) > irq_set_chip_and_handler_name(irq, &xen_pirq_chip, > handle_fasteoi_irq, name); > else > I tested this patch and it worked fine for me. It will go into nightly testing tonight and I'll let you know if we hit any issues. --- Tom Goetz tcgoetz@xxxxxxxxx _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |