* [PATCH 1/3] PCI: take a reference on the bus object when we capture the struct pci_bus pointer
@ 2013-04-18 8:57 Gu Zheng
0 siblings, 0 replies; only message in thread
From: Gu Zheng @ 2013-04-18 8:57 UTC (permalink / raw)
To: linux-pci
Cc: Bjorn Helgaas, Yasuaki Ishimatsu, Taku Izumi, Yinghai Lu,
Jiang Liu, tangchen, 'Lin Feng', li guang
>From 067ec31ba1cb52c78c24196d5dea5ab0cb86dd9b Mon Sep 17 00:00:00 2001
From: Gu Zheng <guz.fnst@cn.fujitsu.com>
Date: Thu, 18 Apr 2013 16:51:48 +0900
Subject: [PATCH 1/3] PCI: take a reference on the bus object when we capture the struct pci_bus pointer
Take a reference on the bus object when we alloc a pci device on a target pci bus, in order to keep
the pci bus valid during the lifetime of devices downstream from it. And introduce pci_bus_get()/pci_bus_put()
to hide pci_bus' reference management.
Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
Reviewed-by: Tang Chen <tangchen@cn.fujitsu.com>
Reviewed-by: Li Guang <lig.fnst@cn.fujitsu.com>
---
arch/powerpc/kernel/pci_of_scan.c | 2 +-
drivers/pci/bus.c | 14 ++++++++++++++
drivers/pci/iov.c | 4 +++-
drivers/pci/probe.c | 2 +-
include/linux/pci.h | 3 +++
5 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c
index 2a67e9b..9e0f6fd 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -137,7 +137,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
pr_debug(" create device, devfn: %x, type: %s\n", devfn, type);
- dev->bus = bus;
+ dev->bus = pci_bus_get(bus);
dev->dev.of_node = of_node_get(node);
dev->dev.parent = bus->bridge;
dev->dev.bus = &pci_bus_type;
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 8647dc6..8e812bb 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -17,6 +17,20 @@
#include <linux/slab.h>
#include "pci.h"
+struct pci_bus *pci_bus_get(struct pci_bus *bus)
+{
+ if (bus)
+ get_device(&bus->dev);
+ return bus;
+}
+EXPORT_SYMBOL(pci_bus_get);
+
+void pci_bus_put(struct pci_bus *bus)
+{
+ if (bus)
+ put_device(&bus->dev);
+}
+EXPORT_SYMBOL(pci_bus_put);
void pci_add_resource_offset(struct list_head *resources, struct resource *res,
resource_size_t offset)
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index ee599f2..18798a7 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -73,6 +73,7 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
u64 size;
char buf[VIRTFN_ID_LEN];
struct pci_dev *virtfn;
+ struct pci_bus *bus;
struct resource *res;
struct pci_sriov *iov = dev->sriov;
@@ -81,7 +82,8 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
return -ENOMEM;
mutex_lock(&iov->dev->sriov->lock);
- virtfn->bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id));
+ bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id));
+ virtfn->bus = pci_bus_get(bus);
if (!virtfn->bus) {
kfree(virtfn);
mutex_unlock(&iov->dev->sriov->lock);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index b494066..44a6f7d 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1265,7 +1265,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
if (!dev)
return NULL;
- dev->bus = bus;
+ dev->bus = pci_bus_get(bus);
dev->devfn = devfn;
dev->vendor = l & 0xffff;
dev->device = (l >> 16) & 0xffff;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 710067f..c4d064d 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1000,6 +1000,9 @@ int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);
void pci_release_selected_regions(struct pci_dev *, int);
/* drivers/pci/bus.c */
+extern struct pci_bus *pci_bus_get(struct pci_bus *);
+extern void pci_bus_put(struct pci_bus *);
+
void pci_add_resource(struct list_head *resources, struct resource *res);
void pci_add_resource_offset(struct list_head *resources, struct resource *res,
resource_size_t offset);
--
1.7.1
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2013-04-18 8:59 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-18 8:57 [PATCH 1/3] PCI: take a reference on the bus object when we capture the struct pci_bus pointer Gu Zheng
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.