summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-09-25 10:57:00 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-09-25 11:01:27 +0200
commit2efddb5575cd9f5f4d61ad417c92365a5f18d2f1 (patch)
tree66c36488cb3e9c2a8d2f392401c8476e9d6c2994 /drivers
parentec1fcbae1918084b5dea2e72cc6297c32f7792da (diff)
downloadlwn-2efddb5575cd9f5f4d61ad417c92365a5f18d2f1.tar.gz
lwn-2efddb5575cd9f5f4d61ad417c92365a5f18d2f1.zip
Revert "driver core: shut down devices asynchronously"
This reverts commit 8064952c65045f05ee2671fe437770e50c151776. The series is being reverted before -rc1 as there are still reports of lockups on shutdown, so it's not quite ready for "prime time." Reported-by: Andrey Skvortsov <andrej.skvortzov@gmail.com> Link: https://lore.kernel.org/r/ZvMkkhyJrohaajuk@skv.local Cc: Christoph Hellwig <hch@lst.de> Cc: David Jeffery <djeffery@redhat.com> Cc: Keith Busch <kbusch@kernel.org> Cc: Laurence Oberman <loberman@redhat.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: Stuart Hayes <stuart.w.hayes@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/base.h4
-rw-r--r--drivers/base/core.c54
2 files changed, 1 insertions, 57 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h
index ea18aa70f151..8cf04a557bdb 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -10,7 +10,6 @@
* shared outside of the drivers/base/ directory.
*
*/
-#include <linux/async.h>
#include <linux/notifier.h>
/**
@@ -98,8 +97,6 @@ struct driver_private {
* the device; typically because it depends on another driver getting
* probed first.
* @async_driver - pointer to device driver awaiting probe via async_probe
- * @shutdown_after - used during device shutdown to ensure correct shutdown
- * ordering.
* @device - pointer back to the struct device that this structure is
* associated with.
* @dead - This device is currently either in the process of or has been
@@ -117,7 +114,6 @@ struct device_private {
struct list_head deferred_probe;
const struct device_driver *async_driver;
char *deferred_probe_reason;
- async_cookie_t shutdown_after;
struct device *device;
u8 dead:1;
};
diff --git a/drivers/base/core.c b/drivers/base/core.c
index b69b82da8837..4482382fb947 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -9,7 +9,6 @@
*/
#include <linux/acpi.h>
-#include <linux/async.h>
#include <linux/blkdev.h>
#include <linux/cleanup.h>
#include <linux/cpufreq.h>
@@ -3525,7 +3524,6 @@ static int device_private_init(struct device *dev)
klist_init(&dev->p->klist_children, klist_children_get,
klist_children_put);
INIT_LIST_HEAD(&dev->p->deferred_probe);
- dev->p->shutdown_after = 0;
return 0;
}
@@ -4781,8 +4779,6 @@ out:
}
EXPORT_SYMBOL_GPL(device_change_owner);
-static ASYNC_DOMAIN(sd_domain);
-
static void shutdown_one_device(struct device *dev)
{
/* hold lock to avoid race with probe/release */
@@ -4819,33 +4815,11 @@ static void shutdown_one_device(struct device *dev)
}
/**
- * shutdown_one_device_async
- * @data: the pointer to the struct device to be shutdown
- * @cookie: not used
- *
- * Shuts down one device, after waiting for shutdown_after to complete.
- * shutdown_after should be set to the cookie of the last child or consumer
- * of this device to be shutdown (if any), or to the cookie of the previous
- * device to be shut down for devices that don't enable asynchronous shutdown.
- */
-static void shutdown_one_device_async(void *data, async_cookie_t cookie)
-{
- struct device *dev = data;
-
- async_synchronize_cookie_domain(dev->p->shutdown_after + 1, &sd_domain);
-
- shutdown_one_device(dev);
-}
-
-/**
* device_shutdown - call ->shutdown() on each device to shutdown.
*/
void device_shutdown(void)
{
struct device *dev, *parent;
- async_cookie_t cookie = 0;
- struct device_link *link;
- int idx;
wait_for_device_probe();
device_block_probing();
@@ -4876,37 +4850,11 @@ void device_shutdown(void)
list_del_init(&dev->kobj.entry);
spin_unlock(&devices_kset->list_lock);
-
- /*
- * Set cookie for devices that will be shut down synchronously
- */
- if (!dev->driver || !dev->driver->async_shutdown_enable)
- dev->p->shutdown_after = cookie;
-
- get_device(dev);
- get_device(parent);
-
- cookie = async_schedule_domain(shutdown_one_device_async,
- dev, &sd_domain);
- /*
- * Ensure parent & suppliers wait for this device to shut down
- */
- if (parent) {
- parent->p->shutdown_after = cookie;
- put_device(parent);
- }
-
- idx = device_links_read_lock();
- list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
- device_links_read_lock_held())
- link->supplier->p->shutdown_after = cookie;
- device_links_read_unlock(idx);
- put_device(dev);
+ shutdown_one_device(dev);
spin_lock(&devices_kset->list_lock);
}
spin_unlock(&devices_kset->list_lock);
- async_synchronize_full_domain(&sd_domain);
}
/*