Message ID | 1490294224-3173-1-git-send-email-longli@exchange.microsoft.com |
---|---|
State | Not Applicable |
Headers | show |
Hi Long, [auto build test WARNING on pci/next] [also build test WARNING on v4.11-rc3 next-20170324] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Long-Li/pci-hyperv-properly-handle-pci-bus-remove/20170326-180444 base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next config: x86_64-randconfig-x016-201713 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All warnings (new ones prefixed by >>): drivers/pci/host/pci-hyperv.c: In function 'pci_devices_present_work': >> drivers/pci/host/pci-hyperv.c:1508:2: warning: enumeration value 'hv_pcibus_removed' not handled in switch [-Wswitch] switch(hbus->state) { ^~~~~~ >> drivers/pci/host/pci-hyperv.c:1508:2: warning: enumeration value 'hv_pcibus_maximum' not handled in switch [-Wswitch] vim +/hv_pcibus_removed +1508 drivers/pci/host/pci-hyperv.c 1492 put_pcichild(hpdev, hv_pcidev_ref_childlist); 1493 list_move_tail(&hpdev->list_entry, &removed); 1494 break; 1495 } 1496 } 1497 } while (found); 1498 spin_unlock_irqrestore(&hbus->device_list_lock, flags); 1499 1500 /* Delete everything that should no longer exist. */ 1501 while (!list_empty(&removed)) { 1502 hpdev = list_first_entry(&removed, struct hv_pci_dev, 1503 list_entry); 1504 list_del(&hpdev->list_entry); 1505 put_pcichild(hpdev, hv_pcidev_ref_initial); 1506 } 1507 > 1508 switch(hbus->state) { 1509 case hv_pcibus_installed: 1510 /* 1511 * Tell the core to rescan bus 1512 * because there may have been changes. 1513 */ 1514 pci_lock_rescan_remove(); 1515 pci_scan_child_bus(hbus->pci_bus); 1516 pci_unlock_rescan_remove(); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c index ada9856..8a92244 100644 --- a/drivers/pci/host/pci-hyperv.c +++ b/drivers/pci/host/pci-hyperv.c @@ -350,6 +350,7 @@ enum hv_pcibus_state { hv_pcibus_init = 0, hv_pcibus_probed, hv_pcibus_installed, + hv_pcibus_removed, hv_pcibus_maximum }; @@ -1504,12 +1505,19 @@ static void pci_devices_present_work(struct work_struct *work) put_pcichild(hpdev, hv_pcidev_ref_initial); } - /* Tell the core to rescan bus because there may have been changes. */ - if (hbus->state == hv_pcibus_installed) { + switch(hbus->state) { + case hv_pcibus_installed: + /* + * Tell the core to rescan bus + * because there may have been changes. + */ pci_lock_rescan_remove(); pci_scan_child_bus(hbus->pci_bus); pci_unlock_rescan_remove(); - } else { + break; + + case hv_pcibus_init: + case hv_pcibus_probed: survey_child_resources(hbus); } @@ -2185,6 +2193,7 @@ static int hv_pci_probe(struct hv_device *hdev, hbus = kzalloc(sizeof(*hbus), GFP_KERNEL); if (!hbus) return -ENOMEM; + hbus->state = hv_pcibus_init; /* * The PCI bus "domain" is what is called "segment" in ACPI and @@ -2348,6 +2357,7 @@ static int hv_pci_remove(struct hv_device *hdev) pci_stop_root_bus(hbus->pci_bus); pci_remove_root_bus(hbus->pci_bus); pci_unlock_rescan_remove(); + hbus->state = hv_pcibus_removed; } hv_pci_bus_exit(hdev);