From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 42/46] Driver core: add bus_sort_breadthfirst() function
Date: Thu, 16 Oct 2008 10:10:43 -0700 [thread overview]
Message-ID: <1224177047-11859-42-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <20081016170954.GA11824@kroah.com>
The PCI core wants to reorder the devices in the bus list. So move this
functionality out of the pci core and into the driver core so that
anyone else can also do this if needed. This also lets us change how
struct device is attached to drivers in the future without messing with
the PCI core.
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
drivers/pci/probe.c | 50 ++++-------------------------------------------
include/linux/device.h | 3 ++
3 files changed, 58 insertions(+), 45 deletions(-)
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 39b9b58..5aee1c0 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -980,6 +980,56 @@ struct klist *bus_get_device_klist(struct bus_type *bus)
}
EXPORT_SYMBOL_GPL(bus_get_device_klist);
+/*
+ * Yes, this forcably breaks the klist abstraction temporarily. It
+ * just wants to sort the klist, not change reference counts and
+ * take/drop locks rapidly in the process. It does all this while
+ * holding the lock for the list, so objects can't otherwise be
+ * added/removed while we're swizzling.
+ */
+static void device_insertion_sort_klist(struct device *a, struct list_head *list,
+ int (*compare)(const struct device *a,
+ const struct device *b))
+{
+ struct list_head *pos;
+ struct klist_node *n;
+ struct device *b;
+
+ list_for_each(pos, list) {
+ n = container_of(pos, struct klist_node, n_node);
+ b = container_of(n, struct device, knode_bus);
+ if (compare(a, b) <= 0) {
+ list_move_tail(&a->knode_bus.n_node,
+ &b->knode_bus.n_node);
+ return;
+ }
+ }
+ list_move_tail(&a->knode_bus.n_node, list);
+}
+
+void bus_sort_breadthfirst(struct bus_type *bus,
+ int (*compare)(const struct device *a,
+ const struct device *b))
+{
+ LIST_HEAD(sorted_devices);
+ struct list_head *pos, *tmp;
+ struct klist_node *n;
+ struct device *dev;
+ struct klist *device_klist;
+
+ device_klist = bus_get_device_klist(bus);
+
+ spin_lock(&device_klist->k_lock);
+ list_for_each_safe(pos, tmp, &device_klist->k_list) {
+ n = container_of(pos, struct klist_node, n_node);
+ dev = container_of(n, struct device, knode_bus);
+ device_insertion_sort_klist(dev, &sorted_devices, compare);
+ }
+ list_splice(&sorted_devices, &device_klist->k_list);
+ spin_unlock(&device_klist->k_lock);
+}
+EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);
+
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 36698e5..dd9161a 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1237,8 +1237,11 @@ EXPORT_SYMBOL(pci_scan_bridge);
EXPORT_SYMBOL_GPL(pci_scan_child_bus);
#endif
-static int __init pci_sort_bf_cmp(const struct pci_dev *a, const struct pci_dev *b)
+static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
{
+ const struct pci_dev *a = to_pci_dev(d_a);
+ const struct pci_dev *b = to_pci_dev(d_b);
+
if (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return 1;
@@ -1251,50 +1254,7 @@ static int __init pci_sort_bf_cmp(const struct pci_dev *a, const struct pci_dev
return 0;
}
-/*
- * Yes, this forcably breaks the klist abstraction temporarily. It
- * just wants to sort the klist, not change reference counts and
- * take/drop locks rapidly in the process. It does all this while
- * holding the lock for the list, so objects can't otherwise be
- * added/removed while we're swizzling.
- */
-static void __init pci_insertion_sort_klist(struct pci_dev *a, struct list_head *list)
-{
- struct list_head *pos;
- struct klist_node *n;
- struct device *dev;
- struct pci_dev *b;
-
- list_for_each(pos, list) {
- n = container_of(pos, struct klist_node, n_node);
- dev = container_of(n, struct device, knode_bus);
- b = to_pci_dev(dev);
- if (pci_sort_bf_cmp(a, b) <= 0) {
- list_move_tail(&a->dev.knode_bus.n_node, &b->dev.knode_bus.n_node);
- return;
- }
- }
- list_move_tail(&a->dev.knode_bus.n_node, list);
-}
-
void __init pci_sort_breadthfirst(void)
{
- LIST_HEAD(sorted_devices);
- struct list_head *pos, *tmp;
- struct klist_node *n;
- struct device *dev;
- struct pci_dev *pdev;
- struct klist *device_klist;
-
- device_klist = bus_get_device_klist(&pci_bus_type);
-
- spin_lock(&device_klist->k_lock);
- list_for_each_safe(pos, tmp, &device_klist->k_list) {
- n = container_of(pos, struct klist_node, n_node);
- dev = container_of(n, struct device, knode_bus);
- pdev = to_pci_dev(dev);
- pci_insertion_sort_klist(pdev, &sorted_devices);
- }
- list_splice(&sorted_devices, &device_klist->k_list);
- spin_unlock(&device_klist->k_lock);
+ bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
}
diff --git a/include/linux/device.h b/include/linux/device.h
index ec90e79..987f591 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -90,6 +90,9 @@ int __must_check bus_for_each_drv(struct bus_type *bus,
struct device_driver *start, void *data,
int (*fn)(struct device_driver *, void *));
+void bus_sort_breadthfirst(struct bus_type *bus,
+ int (*compare)(const struct device *a,
+ const struct device *b));
/*
* Bus notifiers: Get notified of addition/removal of devices
* and binding/unbinding of drivers to devices.
--
1.6.0.2
next prev parent reply other threads:[~2008-10-16 17:30 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-16 17:09 [GIT PATCH] driver core patches for your 2.6-git tree Greg KH
2008-10-16 17:10 ` [PATCH 01/46] modules: fix module "notes" kobject leak Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 02/46] sysfs: crash debugging Greg Kroah-Hartman
2008-10-16 17:40 ` Mathieu Desnoyers
2008-10-20 20:57 ` Greg KH
2008-10-16 17:10 ` [PATCH 03/46] device create: block: convert device_create_drvdata to device_create Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 04/46] device create: char: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 05/46] device create: ieee1394: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 06/46] device create: infiniband: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 07/46] device create: misc: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 08/46] device create: net: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 09/46] device create: s390: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 10/46] device create: scsi: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 11/46] device create: sound: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 12/46] device create: usb: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 13/46] device create: video: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 14/46] device create: ide: " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 15/46] device create: remove device_create_drvdata Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 16/46] usb gadget: link fixes for serial gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 17/46] usb gadget: link fixes for gadget zero Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 18/46] usb gadget: link fixes for MIDI gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 19/46] usb gadget: link fixes for printer gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 20/46] usb gadget: link fixes for storage gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 21/46] usb gadget: link fixes for cdc composite gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 22/46] usb gadget: link fixes for network gadget Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 23/46] driver core: basic infrastructure for per-module dynamic debug messages Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 24/46] driver core: make struct platform_pm_ops static Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 25/46] sysfs: Support sysfs_notify from atomic context with new sysfs_notify_dirent Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 26/46] drivers/firmware/iscsi_ibft.c: make 3 functions static Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 27/46] Driver core: Clarify device cleanup Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 28/46] Driver core: Fix cleanup in device_create_vargs() Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 29/46] device model: Do a quickcheck for driver binding before doing an expensive check Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 30/46] sysfs: fix deadlock Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 31/46] debug: Introduce a dev_WARN() function Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 32/46] debug: use dev_WARN() rather than WARN_ON() in device_pm_add() Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 33/46] usb: turn dev_warn+WARN_ON combos into dev_WARN Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 34/46] Driver core: make bus_find_device_by_name() more robust Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 35/46] PNP: create device attributes via default device attributes Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 36/46] sysfs: use ilookup5() instead of ilookup5_nowait() Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 37/46] platform: add new device registration helper Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 38/46] sysfs: Make dir and name args to sysfs_notify() const Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 39/46] kobject: Fix kobject_rename and !CONFIG_SYSFS Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 40/46] kobject: Cleanup " Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 41/46] NET: convert the phy_device file to use bus_find_device_by_name Greg Kroah-Hartman
2008-10-16 17:10 ` Greg Kroah-Hartman [this message]
2008-10-16 17:10 ` [PATCH 43/46] UIO: Add alignment warnings for uio-mem Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 44/46] UIO: Change driver name of uio_pdrv Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 45/46] UIO: add automata sercos3 pci card support Greg Kroah-Hartman
2008-10-16 17:10 ` [PATCH 46/46] UIO: Fix mapping of logical and virtual memory Greg Kroah-Hartman
2008-10-17 15:31 ` [GIT PATCH] driver core patches for your 2.6-git tree Jason Baron
2008-10-17 18:01 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1224177047-11859-42-git-send-email-gregkh@suse.de \
--to=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®