On Fri, 2009-05-15 at 13:59 +0900, Hidetoshi Seto wrote: > In current code it continues setup even if alloc_msi_entry for MSI-X > is failed due to lack of memory. It means arch_setup_msi_irqs() might > be called with msi_desc entries less than its argument nvec. > > At least x86's arch_setup_msi_irqs() uses list_for_each_entry() for > dev->msi_list that suspected to have entries same numbers as nvec, and > it doesn't check the number of allocated vectors and passed arg nvec. > Therefore it will result in success of pci_enable_msix(), with less > vectors allocated than requested. > > This patch fixes the error route to return the number of entries can be > allocated, instead of continuing the setup. It will let drivers to > retry pci_enable_msix() with less number of entries. > > Signed-off-by: Hidetoshi Seto <seto.hidetoshi@xxxxxxxxxxxxxx> > --- > drivers/pci/msi.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index 6f2e629..952432a 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -445,8 +445,10 @@ static int msix_capability_init(struct pci_dev *dev, > /* MSI-X Table Initialization */ > for (i = 0; i < nvec; i++) { > entry = alloc_msi_entry(dev); > - if (!entry) > - break; > + if (!entry) { > + msi_free_irqs(dev); > + return i; > + } > > j = entries[i].entry; > entry->msi_attrib.is_msix = 1; That looks right to me. Have you tested it? By faking allocation failure in alloc_msi_entry(). As requested: Acked-by: Michael Ellerman <michael@xxxxxxxxxxxxxx> I guess this would be a nice fix for 30, but no one's hit it yet so it's not urgent and could wait for 31. cheers
Attachment:
signature.asc
Description: This is a digitally signed message part