On Wed, Jul 21, 2021 at 07:16:06PM +0300, Yishai Hadas wrote: > From: Max Gurtovoy <mgurtovoy@xxxxxxxxxx> > > The new flag field is be used to allow PCI drivers to signal the core code > during driver matching and when generating the modules.alias information. > ... > @@ -152,10 +152,27 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv, > } > spin_unlock(&drv->dynids.lock); > > - if (!found_id) > - found_id = pci_match_id(drv->id_table, dev); > + if (found_id) > + return found_id; > + > + ids = drv->id_table; > + while ((found_id = pci_match_id(ids, dev))) { > + /* > + * The match table is split based on driver_override. Check the > + * flags as well so that any matching PCI_ID_F_DRIVER_OVERRIDE > + * entry is returned. > + */ > + if ((found_id->flags & PCI_ID_F_VFIO_DRIVER_OVERRIDE) && > + !dev->driver_override) > + ids = found_id + 1; > + else > + break; > + } > > - /* driver_override will always match, send a dummy id */ > + /* > + * if no static match, driver_override will always match, send a dummy > + * id. > + */ > if (!found_id && dev->driver_override) > found_id = &pci_device_id_any; Possibly more readable: while ((found_id = pci_match_id(ids, dev))) { /* * PCI_ID_F_VFIO_DRIVER_OVERRIDE entries only match when * driver_override matches this driver. */ if (found_id->flags & PCI_ID_F_VFIO_DRIVER_OVERRIDE) { if (dev->driver_override) return found_id; else ids = found_id + 1; } else { return found_id; } } /* Driver_override will always match; send a dummy ID */ if (dev->driver_override) return &pci_device_id_any; return NULL;