Konrad Rzeszutek Wilk
2010-Dec-09 21:01 UTC
[Xen-devel] [PATCH] Fix when booting Xen+Linux under QEMU.
Please take a look. The first patch just cleans up the find_unbound_irq so it is easier to understand what it does. The second patch hardness the Xen IRQ (event channels) allocation finder if you try to boot a minimalistic 32-bit Linux kernel along with a Xen hypervisor under QEMU. We end up with a weird scenario where the nr_irq_gsi was greater than nr_irq by 16. This code hardness it by pointing out the issue to the user and tries to continue - BUT this might impact the PCI device allocation. Tested also on normal machine with no regressions found. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Konrad Rzeszutek Wilk
2010-Dec-09 21:01 UTC
[Xen-devel] [PATCH 1/2] xen/irq: Cleanup the find_unbound_irq
The "find_unbound_irq" is a bit unusual - it allocates virtual IRQ (event channels) in reverse order. This means starting at the "top" of the available IRQs (nr_irqs) down to the GSI/MSI IRQs (nr_irqs_gsi). Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> --- drivers/xen/events.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 31af0ac..4d4a23d 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -405,15 +405,21 @@ static int find_unbound_irq(void) { struct irq_data *data; int irq, res; - int start = get_nr_hw_irqs(); + int bottom = get_nr_hw_irqs(); + int top = nr_irqs-1; - if (start == nr_irqs) + if (bottom == nr_irqs) goto no_irqs; - /* nr_irqs is a magic value. Must not use it.*/ - for (irq = nr_irqs-1; irq > start; irq--) { + /* This loop starts from the top of IRQ space and goes down. + * We need this b/c if we have a PCI device in a Xen PV guest + * we do not have an IO-APIC (though the backend might have them) + * mapped in. To not have a collision of physical IRQs with the Xen + * event channels start at the top of the IRQ space for virtual IRQs. + */ + for (irq = top; irq > bottom; irq--) { data = irq_get_irq_data(irq); - /* only 0->15 have init''d desc; handle irq > 16 */ + /* only 15->0 have init''d desc; handle irq > 16 */ if (!data) break; if (data->chip == &no_irq_chip) @@ -424,7 +430,7 @@ static int find_unbound_irq(void) return irq; } - if (irq == start) + if (irq == bottom) goto no_irqs; res = irq_alloc_desc_at(irq, -1); -- 1.7.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Konrad Rzeszutek Wilk
2010-Dec-09 21:01 UTC
[Xen-devel] [PATCH 2/2] xen/irq: Don''t fall over when nr_irqs_gsi > nr_irqs.
This scenario where the nr_irq_gsi is greater than nr_irqs is rather strange but lets still try to survive. Make sure to print a warning so the user wouldn''t be surprised in case things don''t work. Solves a bootup-crash when booting Xen and Linux under QEMU. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> --- drivers/xen/events.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 4d4a23d..11687dd 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -411,6 +411,7 @@ static int find_unbound_irq(void) if (bottom == nr_irqs) goto no_irqs; +retry: /* This loop starts from the top of IRQ space and goes down. * We need this b/c if we have a PCI device in a Xen PV guest * we do not have an IO-APIC (though the backend might have them) @@ -434,6 +435,14 @@ static int find_unbound_irq(void) goto no_irqs; res = irq_alloc_desc_at(irq, -1); + if (res == -EEXIST) { + top--; + if (bottom > top) + printk(KERN_ERR "Eating in GSI/MSI space (%ld)!" \ + " Your PCI device might not work!\n", top); + if (top > NR_IRQS_LEGACY) + goto retry; + } if (WARN_ON(res != irq)) return -1; -- 1.7.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jeremy Fitzhardinge
2010-Dec-09 21:12 UTC
[Xen-devel] Re: [PATCH] Fix when booting Xen+Linux under QEMU.
On 12/09/2010 01:01 PM, Konrad Rzeszutek Wilk wrote:> Please take a look. The first patch just cleans up the find_unbound_irq > so it is easier to understand what it does. > > The second patch hardness the Xen IRQ (event channels) allocation finder > if you try to boot a minimalistic 32-bit Linux kernel along with a > Xen hypervisor under QEMU. > > We end up with a weird scenario where the nr_irq_gsi was greater than nr_irq > by 16. This code hardness it by pointing out the issue to the user and tries > to continue - BUT this might impact the PCI device allocation. > > Tested also on normal machine with no regressions found.I think I''d prefer to: 1. move to using all dynamic irqs, and use the core kernel irq allocator (ie, resurrect IanC''s patches) 2. kill the ioapic dummy page hack (I''m assuming that would be trivial - at least to make it all zero - because the kernel won''t care about the number of GSIs at that point) J _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Konrad Rzeszutek Wilk
2010-Dec-10 03:55 UTC
[Xen-devel] Re: [PATCH] Fix when booting Xen+Linux under QEMU.
> I think I''d prefer to: > > 1. move to using all dynamic irqs, and use the core kernel irq > allocator (ie, resurrect IanC''s patches)That would make it easier, except that they don''t work when you have DomU guest with Xen PCI front. Simply b/c the DomU guest has no idea of what GSI of the host machine is. Hence the find_unbound_irq that starts from the top (nr_irqs) and goes down to GSI count (nr_irq_gsi). Maybe we can stick it in the Xen PCIfronted/Xen PCI backend a mechanism (some key value) which will specify the host''s nr_irq_gsi value. Then the DomU guest can set that and then use the core kernel irq allocator... _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini
2010-Dec-10 13:02 UTC
[Xen-devel] Re: [PATCH] Fix when booting Xen+Linux under QEMU.
On Thu, 9 Dec 2010, Jeremy Fitzhardinge wrote:> 2. kill the ioapic dummy page hack (I''m assuming that would be > trivial - at least to make it all zero - because the kernel won''t > care about the number of GSIs at that point)That wouldn''t work: mp_register_ioapic reads the number of entries for each ioapic and it cannot be zero, because later on mp_find_ioapic is going to find the ioapic a particular gsi belongs to based on the previous results. Mp_register_ioapic also increases gsi_top that ends up influencing the value of nr_irqs_gsi. Considering that nr_irqs is not a real upper limit on Xen because you usually have at least 1024 evtchns anyway, I think we should reimplement arch_probe_nr_irqs on Xen to set nr_irqs appropriately. Something like this: #define NR_EVTCHNS (sizeof(unsigned long) * 8 * sizeof(unsigned long)) int __init arch_probe_nr_irqs(void) { if (xen_domain()) nr_irqs = NR_EVTCHNS; return NR_IRQS_LEGACY; } The problem is that #ifdef CONFIG_SPARSE_IRQ io_apic.c reimplements arch_probe_nr_irqs too but only if CONFIG_PCI_MSI is also defined nr_irqs is set high enough by that function. So to work around this problem we might have to redefine arch_probe_nr_irqs only #if !defined(CONFIG_SPARSE_IRQ) and we might also have to automatically enable CONFIG_PCI_MSI if the user selects CONFIG_SPARSE_IRQ on XEN somehow. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel