Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'pci/konstantin-runtime-pm' into next

* pci/konstantin-runtime-pm:
PCI/PM: Clear state_saved during suspend
PCI: Use atomic_inc_return() rather than atomic_add_return()
PCI: Catch attempts to disable already-disabled devices
PCI: Disable Bus Master unconditionally in pci_device_shutdown()

+10 -3
+5 -1
drivers/pci/pci-driver.c
··· 392 392 * Turn off Bus Master bit on the device to tell it to not 393 393 * continue to do DMA 394 394 */ 395 - pci_disable_device(pci_dev); 395 + pci_clear_master(pci_dev); 396 396 } 397 397 398 398 #ifdef CONFIG_PM ··· 628 628 goto Fixup; 629 629 } 630 630 631 + pci_dev->state_saved = false; 631 632 if (pm->suspend) { 632 633 pci_power_t prev = pci_dev->current_state; 633 634 int error; ··· 775 774 return 0; 776 775 } 777 776 777 + pci_dev->state_saved = false; 778 778 if (pm->freeze) { 779 779 int error; 780 780 ··· 864 862 goto Fixup; 865 863 } 866 864 865 + pci_dev->state_saved = false; 867 866 if (pm->poweroff) { 868 867 int error; 869 868 ··· 990 987 if (!pm || !pm->runtime_suspend) 991 988 return -ENOSYS; 992 989 990 + pci_dev->state_saved = false; 993 991 pci_dev->no_d3cold = false; 994 992 error = pm->runtime_suspend(dev); 995 993 suspend_report_result(pm->runtime_suspend, error);
+5 -2
drivers/pci/pci.c
··· 1168 1168 dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); 1169 1169 } 1170 1170 1171 - if (atomic_add_return(1, &dev->enable_cnt) > 1) 1171 + if (atomic_inc_return(&dev->enable_cnt) > 1) 1172 1172 return 0; /* already enabled */ 1173 1173 1174 1174 /* only skip sriov related */ ··· 1395 1395 if (dr) 1396 1396 dr->enabled = 0; 1397 1397 1398 - if (atomic_sub_return(1, &dev->enable_cnt) != 0) 1398 + dev_WARN_ONCE(&dev->dev, atomic_read(&dev->enable_cnt) <= 0, 1399 + "disabling already-disabled device"); 1400 + 1401 + if (atomic_dec_return(&dev->enable_cnt) != 0) 1399 1402 return; 1400 1403 1401 1404 do_pci_disable_device(dev);