提交 5adc55da 编写于 作者: A Adrian Bunk 提交者: Greg Kroah-Hartman

PCI: remove the broken PCI_MULTITHREAD_PROBE option

This patch removes the PCI_MULTITHREAD_PROBE option that had already 
been marked as broken.
Signed-off-by: NAdrian Bunk <bunk@stusta.de>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 032de8e2
...@@ -124,10 +124,6 @@ initialization with a pointer to a structure describing the driver ...@@ -124,10 +124,6 @@ initialization with a pointer to a structure describing the driver
err_handler See Documentation/pci-error-recovery.txt err_handler See Documentation/pci-error-recovery.txt
multithread_probe Enable multi-threaded probe/scan. Driver must
provide its own locking/syncronization for init
operations if this is enabled.
The ID table is an array of struct pci_device_id entries ending with an The ID table is an array of struct pci_device_id entries ending with an
all-zero entry. Each entry consists of: all-zero entry. Each entry consists of:
......
...@@ -226,12 +226,10 @@ static int device_probe_drivers(void *data) ...@@ -226,12 +226,10 @@ static int device_probe_drivers(void *data)
* *
* Walk the list of drivers that the bus has and call * Walk the list of drivers that the bus has and call
* driver_probe_device() for each pair. If a compatible * driver_probe_device() for each pair. If a compatible
* pair is found, break out and return. If the bus specifies * pair is found, break out and return.
* multithreaded probing, walking the list of drivers is done
* on a probing thread.
* *
* Returns 1 if the device was bound to a driver; * Returns 1 if the device was bound to a driver;
* 0 if no matching device was found or multithreaded probing is done; * 0 if no matching device was found;
* -ENODEV if the device is not registered. * -ENODEV if the device is not registered.
* *
* When called for a USB interface, @dev->parent->sem must be held. * When called for a USB interface, @dev->parent->sem must be held.
...@@ -239,7 +237,6 @@ static int device_probe_drivers(void *data) ...@@ -239,7 +237,6 @@ static int device_probe_drivers(void *data)
int device_attach(struct device * dev) int device_attach(struct device * dev)
{ {
int ret = 0; int ret = 0;
struct task_struct *probe_task = ERR_PTR(-ENOMEM);
down(&dev->sem); down(&dev->sem);
if (dev->driver) { if (dev->driver) {
...@@ -251,12 +248,7 @@ int device_attach(struct device * dev) ...@@ -251,12 +248,7 @@ int device_attach(struct device * dev)
ret = 0; ret = 0;
} }
} else { } else {
if (dev->bus->multithread_probe) ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
probe_task = kthread_run(device_probe_drivers, dev,
"probe-%s", dev->bus_id);
if(IS_ERR(probe_task))
ret = bus_for_each_drv(dev->bus, NULL, dev,
__device_attach);
} }
up(&dev->sem); up(&dev->sem);
return ret; return ret;
...@@ -383,33 +375,6 @@ void driver_detach(struct device_driver * drv) ...@@ -383,33 +375,6 @@ void driver_detach(struct device_driver * drv)
} }
} }
#ifdef CONFIG_PCI_MULTITHREAD_PROBE
static int __init wait_for_probes(void)
{
DEFINE_WAIT(wait);
printk(KERN_INFO "%s: waiting for %d threads\n", __FUNCTION__,
atomic_read(&probe_count));
if (!atomic_read(&probe_count))
return 0;
while (atomic_read(&probe_count)) {
prepare_to_wait(&probe_waitqueue, &wait, TASK_UNINTERRUPTIBLE);
if (atomic_read(&probe_count))
schedule();
}
finish_wait(&probe_waitqueue, &wait);
return 0;
}
core_initcall_sync(wait_for_probes);
postcore_initcall_sync(wait_for_probes);
arch_initcall_sync(wait_for_probes);
subsys_initcall_sync(wait_for_probes);
fs_initcall_sync(wait_for_probes);
device_initcall_sync(wait_for_probes);
late_initcall_sync(wait_for_probes);
#endif
EXPORT_SYMBOL_GPL(device_bind_driver); EXPORT_SYMBOL_GPL(device_bind_driver);
EXPORT_SYMBOL_GPL(device_release_driver); EXPORT_SYMBOL_GPL(device_release_driver);
EXPORT_SYMBOL_GPL(device_attach); EXPORT_SYMBOL_GPL(device_attach);
......
...@@ -21,31 +21,6 @@ config PCI_MSI ...@@ -21,31 +21,6 @@ config PCI_MSI
If you don't know what to do here, say N. If you don't know what to do here, say N.
config PCI_MULTITHREAD_PROBE
bool "PCI Multi-threaded probe (EXPERIMENTAL)"
depends on PCI && EXPERIMENTAL && BROKEN
help
Say Y here if you want the PCI core to spawn a new thread for
every PCI device that is probed. This can cause a huge
speedup in boot times on multiprocessor machines, and even a
smaller speedup on single processor machines.
But it can also cause lots of bad things to happen. A number
of PCI drivers cannot properly handle running in this way,
some will just not work properly at all, while others might
decide to blow up power supplies with a huge load all at once,
so use this option at your own risk.
It is very unwise to use this option if you are not using a
boot process that can handle devices being created in any
order. A program that can create persistent block and network
device names (like udev) is a good idea if you wish to use
this option.
Again, use this option at your own risk, you have been warned!
When in doubt, say N.
config PCI_DEBUG config PCI_DEBUG
bool "PCI Debugging" bool "PCI Debugging"
depends on PCI && DEBUG_KERNEL depends on PCI && DEBUG_KERNEL
......
...@@ -13,20 +13,6 @@ ...@@ -13,20 +13,6 @@
#include <linux/sched.h> #include <linux/sched.h>
#include "pci.h" #include "pci.h"
/*
* Registration of PCI drivers and handling of hot-pluggable devices.
*/
/* multithreaded probe logic */
static int pci_multithread_probe =
#ifdef CONFIG_PCI_MULTITHREAD_PROBE
1;
#else
0;
#endif
__module_param_call("", pci_multithread_probe, param_set_bool, param_get_bool, &pci_multithread_probe, 0644);
/* /*
* Dynamic device IDs are disabled for !CONFIG_HOTPLUG * Dynamic device IDs are disabled for !CONFIG_HOTPLUG
*/ */
...@@ -569,7 +555,6 @@ struct bus_type pci_bus_type = { ...@@ -569,7 +555,6 @@ struct bus_type pci_bus_type = {
static int __init pci_driver_init(void) static int __init pci_driver_init(void)
{ {
pci_bus_type.multithread_probe = pci_multithread_probe;
return bus_register(&pci_bus_type); return bus_register(&pci_bus_type);
} }
......
...@@ -80,7 +80,6 @@ struct bus_type { ...@@ -80,7 +80,6 @@ struct bus_type {
int (*resume)(struct device * dev); int (*resume)(struct device * dev);
unsigned int drivers_autoprobe:1; unsigned int drivers_autoprobe:1;
unsigned int multithread_probe:1;
}; };
extern int __must_check bus_register(struct bus_type * bus); extern int __must_check bus_register(struct bus_type * bus);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册