On Mon, 2019-06-24 at 08:42 +0000, Koenig, Christian wrote: > Then we resize the VRAM BAR by calling pci_resize_resource(). That in > turn tries to resize and shuffle around the parent bridge resources > using pci_reassign_bridge_resources(). > > But pci_reassign_bridge_resources() does not assign any device > resources, it just tries to make sure the upstream bridges have enough > space to fit everything in. > > Independent if we succeeded or failed with handling the bridge(s) we > call pci_assign_unassigned_bus_resources() to re-assign the previously > freed up VRAM and doorbell BARs. > > So yeah, this definitely necessary, or otherwise the driver would crash > soon after because the resources are not assigned again. Oh, I missed that pci_reassign_bridge_resources() didn't reassign the resources under the bridge... ugh... that code is a bloody mess. We have 4 or 5 "assign bus resources" functions, all subtly different for no clear reasons (the historical changelogs from Yinghai may as well don't exist, they are basically encrypted), and in most case for no good reasons.... Question: Do you ever need to assign anything other than that one device though ? In my branch, I've added this typically for the case where a single device needs to be reassigned: +void pci_dev_assign_resources(struct pci_dev *dev) +{ + LIST_HEAD(head); + + /* Assign non-fixed resources */ + __dev_sort_resources(dev, &head); + __assign_resources_sorted(&head, NULL, NULL); + + /* Assign fixed ones if any */ + pdev_assign_fixed_resources(dev); +} +EXPORT_SYMBOL(pci_dev_assign_resources); Would that work for you ? If yes, I'll replace pci_assign_unassigned_bus_resources(). I'd like to eventually kill it.. Cheers, Ben.