[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] x86/evtchn: make use of PHYSDEVOP_map_pirq


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-linux-2.6.18-xen <patchbot@xxxxxxx>
  • Date: Fri, 16 Oct 2015 14:55:03 +0000
  • Delivery-date: Fri, 16 Oct 2015 14:55:14 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1445003840 -7200
# Node ID 3f51e783c26a52086fb349313fad1758e4e35297
# Parent  47161cb7bd45c059b8e75c09d59ee1124953ad46
x86/evtchn: make use of PHYSDEVOP_map_pirq

Xen commit 669d4b85c4 ("x86/IO-APIC: don't create pIRQ mapping from
masked RTE") revealed that for any interrupts which get set up masked
(commonly at least level triggered ones), the pIRQ <-> IRQ mapping
never gets established (since the IO-APIC RTE writes now don't have
that effect anymore when the mask bit is set), resulting in subsequent
binding of the pIRQ to fail.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r 47161cb7bd45 -r 3f51e783c26a drivers/xen/core/evtchn.c
--- a/drivers/xen/core/evtchn.c Mon Sep 28 10:38:54 2015 +0200
+++ b/drivers/xen/core/evtchn.c Fri Oct 16 15:57:20 2015 +0200
@@ -1113,13 +1113,34 @@ void irq_resume(void)
 #define identity_mapped_irq(irq) (1)
 #endif
 
-void evtchn_register_pirq(int irq)
+int evtchn_register_pirq(int irq)
 {
+       struct physdev_map_pirq map_pirq = {
+               .domid = DOMID_SELF,
+               .type = MAP_PIRQ_TYPE_GSI,
+               .index = irq,
+               .pirq = irq
+       };
+
        BUG_ON(irq < PIRQ_BASE || irq - PIRQ_BASE >= NR_PIRQS);
-       if (identity_mapped_irq(irq) || type_from_irq(irq) != IRQT_UNBOUND)
-               return;
-       irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0);
-       irq_desc[irq].chip = &pirq_type;
+
+       switch (type_from_irq(irq)) {
+       case IRQT_UNBOUND:
+               break;
+       case IRQT_PIRQ:
+               if (index_from_irq(irq) == irq)
+                       return -EEXIST;
+       default:
+               return -EBUSY;
+       }
+
+       if (!identity_mapped_irq(irq)) {
+               irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0);
+               irq_desc[irq].chip = &pirq_type;
+       }
+
+       return is_initial_xendomain()
+              ? HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_pirq) : 0;
 }
 
 int evtchn_map_pirq(int irq, int xen_pirq)
diff -r 47161cb7bd45 -r 3f51e783c26a include/xen/evtchn.h
--- a/include/xen/evtchn.h      Mon Sep 28 10:38:54 2015 +0200
+++ b/include/xen/evtchn.h      Fri Oct 16 15:57:20 2015 +0200
@@ -102,7 +102,7 @@ asmlinkage void evtchn_do_upcall(struct 
 void evtchn_device_upcall(int port);
 
 /* Mark a PIRQ as unavailable for dynamic allocation. */
-void evtchn_register_pirq(int irq);
+int evtchn_register_pirq(int irq);
 /* Map a Xen-supplied PIRQ to a dynamically allocated one. */
 int evtchn_map_pirq(int irq, int xen_pirq);
 /* Look up a Xen-supplied PIRQ for a dynamically allocated one. */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.