Messages in this thread | | | Date | Thu, 4 Aug 2022 11:59:05 +0100 | Subject | Re: PCI MSI issue with reinserting a driver | From | John Garry <> |
| |
On 04/02/2021 10:45, John Garry wrote:
Hi Marc,
Just a friendly reminder that we still have the issue with reinseting a PCI driver which does not allocate a power-of-2 MSIs.
> On 03/02/2021 17:23, Marc Zyngier wrote: >>> >>> Before: >>> In free path, we have: >>> its_irq_domain_free(nvecs = 27) >>> bitmap_release_region(count order = 5 == 32bits) >>> >>> Current: >>> In free path, we have: >>> its_irq_domain_free(nvecs = 1) for free each 27 vecs >>> bitmap_release_region(count order = 0 == 1bit) >> >> Right. I was focusing on the patch and blindly ignored the explanation >> at the top of the email. Apologies for that. > > Yeah, it was a distraction. > >> >> I'm not overly keen on handling this in the ITS though, and I'd rather >> we try and do it in the generic code. How about this (compile tested >> only)? >> >> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c >> index 6aacd342cd14..cfccad83c2df 100644 >> --- a/kernel/irq/irqdomain.c >> +++ b/kernel/irq/irqdomain.c >> @@ -1399,8 +1399,19 @@ static void >> irq_domain_free_irqs_hierarchy(struct irq_domain *domain, >> return; >> >> for (i = 0; i < nr_irqs; i++) { >> - if (irq_domain_get_irq_data(domain, irq_base + i)) >> - domain->ops->free(domain, irq_base + i, 1); >> + int n ; >> + >> + /* Find the largest possible span of IRQs to free in one go */ >> + for (n = 0; >> + ((i + n) < nr_irqs && >> + irq_domain_get_irq_data(domain, irq_base + i + n)); >> + n++); >> + >> + if (!n) >> + continue; >> + >> + domain->ops->free(domain, irq_base + i, n); >> + i += n; >> } >> } > > That fixed my problem. > > For my benefit, if MSIs must be allocated in power of 2, could we check > a flag for the dealloc method? Like, if MSI domain, then do as before > 4615fbc3788d. But I'm not sure on the specific scenario which that > commit fixed. Or even whether you want specifics like that in core code.
Thanks, John
| |