Skip to content

Commit

Permalink
Merge tag 'pci-v4.18-fixes-5' of git://git.kernel.org/pub/scm/linux/k…
Browse files Browse the repository at this point in the history
…ernel/git/helgaas/pci

Pull PCI fixes from Bjorn Helgaas:

 - Fix integer overflow in new mobiveil driver (Dan Carpenter)

 - Fix race during NVMe removal/rescan (Hari Vyas)

* tag 'pci-v4.18-fixes-5' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
  PCI: Fix is_added/is_busmaster race condition
  PCI: mobiveil: Avoid integer overflow in IB_WIN_SIZE
  • Loading branch information
torvalds committed Aug 2, 2018
2 parents 8cda548 + 44bda4b commit ef46808
Show file tree
Hide file tree
Showing 10 changed files with 28 additions and 13 deletions.
4 changes: 3 additions & 1 deletion arch/powerpc/kernel/pci-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#include <asm/ppc-pci.h>
#include <asm/eeh.h>

#include "../../../drivers/pci/pci.h"

/* hose_spinlock protects accesses to the the phb_bitmap. */
static DEFINE_SPINLOCK(hose_spinlock);
LIST_HEAD(hose_list);
Expand Down Expand Up @@ -1014,7 +1016,7 @@ void pcibios_setup_bus_devices(struct pci_bus *bus)
/* Cardbus can call us to add new devices to a bus, so ignore
* those who are already fully discovered
*/
if (dev->is_added)
if (pci_dev_is_added(dev))
continue;

pcibios_setup_device(dev);
Expand Down
3 changes: 2 additions & 1 deletion arch/powerpc/platforms/powernv/pci-ioda.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@

#include "powernv.h"
#include "pci.h"
#include "../../../../drivers/pci/pci.h"

#define PNV_IODA1_M64_NUM 16 /* Number of M64 BARs */
#define PNV_IODA1_M64_SEGS 8 /* Segments per M64 BAR */
Expand Down Expand Up @@ -3138,7 +3139,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
struct pci_dn *pdn;
int mul, total_vfs;

if (!pdev->is_physfn || pdev->is_added)
if (!pdev->is_physfn || pci_dev_is_added(pdev))
return;

pdn = pci_get_pdn(pdev);
Expand Down
3 changes: 2 additions & 1 deletion arch/powerpc/platforms/pseries/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
#include <asm/security_features.h>

#include "pseries.h"
#include "../../../../drivers/pci/pci.h"

int CMO_PrPSP = -1;
int CMO_SecPSP = -1;
Expand Down Expand Up @@ -664,7 +665,7 @@ static void pseries_pci_fixup_iov_resources(struct pci_dev *pdev)
const int *indexes;
struct device_node *dn = pci_device_to_OF_node(pdev);

if (!pdev->is_physfn || pdev->is_added)
if (!pdev->is_physfn || pci_dev_is_added(pdev))
return;
/*Firmware must support open sriov otherwise dont configure*/
indexes = of_get_property(dn, "ibm,open-sriov-vf-bar-info", NULL);
Expand Down
6 changes: 3 additions & 3 deletions drivers/pci/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ void pci_bus_add_device(struct pci_dev *dev)
return;
}

dev->is_added = 1;
pci_dev_assign_added(dev, true);
}
EXPORT_SYMBOL_GPL(pci_bus_add_device);

Expand All @@ -347,14 +347,14 @@ void pci_bus_add_devices(const struct pci_bus *bus)

list_for_each_entry(dev, &bus->devices, bus_list) {
/* Skip already-added devices */
if (dev->is_added)
if (pci_dev_is_added(dev))
continue;
pci_bus_add_device(dev);
}

list_for_each_entry(dev, &bus->devices, bus_list) {
/* Skip if device attach failed */
if (!dev->is_added)
if (!pci_dev_is_added(dev))
continue;
child = dev->subordinate;
if (child)
Expand Down
2 changes: 1 addition & 1 deletion drivers/pci/controller/pcie-mobiveil.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
#define CFG_WINDOW_TYPE 0
#define IO_WINDOW_TYPE 1
#define MEM_WINDOW_TYPE 2
#define IB_WIN_SIZE (256 * 1024 * 1024 * 1024)
#define IB_WIN_SIZE ((u64)256 * 1024 * 1024 * 1024)
#define MAX_PIO_WINDOWS 8

/* Parameters for the waiting for link up routine */
Expand Down
2 changes: 1 addition & 1 deletion drivers/pci/hotplug/acpiphp_glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ static void enable_slot(struct acpiphp_slot *slot)

list_for_each_entry(dev, &bus->devices, bus_list) {
/* Assume that newly added devices are powered on already. */
if (!dev->is_added)
if (!pci_dev_is_added(dev))
dev->current_state = PCI_D0;
}

Expand Down
11 changes: 11 additions & 0 deletions drivers/pci/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ struct pci_sriov {

/* pci_dev priv_flags */
#define PCI_DEV_DISCONNECTED 0
#define PCI_DEV_ADDED 1

static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused)
{
Expand All @@ -300,6 +301,16 @@ static inline bool pci_dev_is_disconnected(const struct pci_dev *dev)
return test_bit(PCI_DEV_DISCONNECTED, &dev->priv_flags);
}

static inline void pci_dev_assign_added(struct pci_dev *dev, bool added)
{
assign_bit(PCI_DEV_ADDED, &dev->priv_flags, added);
}

static inline bool pci_dev_is_added(const struct pci_dev *dev)
{
return test_bit(PCI_DEV_ADDED, &dev->priv_flags);
}

#ifdef CONFIG_PCI_ATS
void pci_restore_ats_state(struct pci_dev *dev);
#else
Expand Down
4 changes: 2 additions & 2 deletions drivers/pci/probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -2433,13 +2433,13 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
dev = pci_scan_single_device(bus, devfn);
if (!dev)
return 0;
if (!dev->is_added)
if (!pci_dev_is_added(dev))
nr++;

for (fn = next_fn(bus, dev, 0); fn > 0; fn = next_fn(bus, dev, fn)) {
dev = pci_scan_single_device(bus, devfn + fn);
if (dev) {
if (!dev->is_added)
if (!pci_dev_is_added(dev))
nr++;
dev->multifunction = 1;
}
Expand Down
5 changes: 3 additions & 2 deletions drivers/pci/remove.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ static void pci_stop_dev(struct pci_dev *dev)
{
pci_pme_active(dev, false);

if (dev->is_added) {
if (pci_dev_is_added(dev)) {
device_release_driver(&dev->dev);
pci_proc_detach_device(dev);
pci_remove_sysfs_dev_files(dev);
dev->is_added = 0;

pci_dev_assign_added(dev, false);
}

if (dev->bus->self)
Expand Down
1 change: 0 additions & 1 deletion include/linux/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,6 @@ struct pci_dev {
unsigned int transparent:1; /* Subtractive decode bridge */
unsigned int multifunction:1; /* Multi-function device */

unsigned int is_added:1;
unsigned int is_busmaster:1; /* Is busmaster */
unsigned int no_msi:1; /* May not use MSI */
unsigned int no_64bit_msi:1; /* May only use 32-bit MSIs */
Expand Down

0 comments on commit ef46808

Please sign in to comment.