Only privileged domains can get PCI INTx/MSI PIRQ values for a domain. As such,
'xen_create_msi_irq' in non-privileged mode needs to only do kernel IRQ
book-keeping.
But, it still needs a PIRQ value to bind to its local IRQ - this PIRQ value is
now
being passed in as an argument.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
arch/x86/include/asm/xen/pci.h | 4 ++--
arch/x86/xen/pci.c | 2 +-
drivers/xen/events.c | 24 ++++++++++++++++--------
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h
index b72c858..4774ae0 100644
--- a/arch/x86/include/asm/xen/pci.h
+++ b/arch/x86/include/asm/xen/pci.h
@@ -5,7 +5,7 @@
int xen_register_gsi(u32 gsi, int triggering, int polarity);
int xen_create_msi_irq(struct pci_dev *dev,
struct msi_desc *msidesc,
- int type);
+ int type, int pirq_override);
int xen_destroy_irq(int irq);
#else
static inline int xen_register_gsi(u32 gsi, int triggering, int polarity)
@@ -15,7 +15,7 @@ static inline int xen_register_gsi(u32 gsi, int triggering,
int polarity)
static inline int xen_create_msi_irq(struct pci_dev *dev,
struct msi_desc *msidesc,
- int type)
+ int type, int pirq_override)
{
return -1;
}
diff --git a/arch/x86/xen/pci.c b/arch/x86/xen/pci.c
index 44d91ad..00b8b09 100644
--- a/arch/x86/xen/pci.c
+++ b/arch/x86/xen/pci.c
@@ -94,7 +94,7 @@ int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int
type)
struct msi_desc *msidesc;
list_for_each_entry(msidesc, &dev->msi_list, list) {
- irq = xen_create_msi_irq(dev, msidesc, type);
+ irq = xen_create_msi_irq(dev, msidesc, type, 0 /* for now. */);
if (irq < 0)
return -1;
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 48b806a..b791031 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -662,7 +662,8 @@ static int get_domid_for_dev(char *nodename, char *path,
char *val, void *data)
return 0;
}
-int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type)
+int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
+ int type, int pirq_override)
{
int irq = 0;
struct physdev_map_pirq map_irq;
@@ -703,17 +704,24 @@ int xen_create_msi_irq(struct pci_dev *dev, struct
msi_desc *msidesc, int type)
if (irq == -1)
goto out;
- if (xen_initial_domain()) {
+ /* Only the privileged domain can do this. For non-priv PV domains
+ * we have to make a call to pci_frontend_* before so that the priv
+ * domain can do it for us. The 'pirq_override' is its return value. */
+
+ if (xen_initial_domain())
rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);
- if (rc) {
+ else {
+ rc = pirq_override ? 0 : -ENODEV;
+ map_irq.pirq = pirq_override;
+ }
+ if (rc) {
- printk(KERN_WARNING "xen map irq failed %d\n", rc);
+ printk(KERN_WARNING "xen map irq failed %d\n", rc);
- dynamic_irq_cleanup(irq);
+ dynamic_irq_cleanup(irq);
- irq = -1;
- goto out;
- }
+ irq = -1;
+ goto out;
}
irq_info[irq] = mk_pirq_info(0, map_irq.pirq, map_irq.index);
if (domid)
--
1.6.2.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|