Loading Documentation/driver-api/driver-model/devres.rst +4 −0 Original line number Diff line number Diff line Loading @@ -464,3 +464,7 @@ SPI WATCHDOG devm_watchdog_register_device() WORKQUEUE devm_alloc_workqueue() devm_alloc_ordered_workqueue() include/linux/workqueue.h +22 −0 Original line number Diff line number Diff line Loading @@ -512,6 +512,26 @@ __printf(1, 4) struct workqueue_struct * alloc_workqueue_noprof(const char *fmt, unsigned int flags, int max_active, ...); #define alloc_workqueue(...) alloc_hooks(alloc_workqueue_noprof(__VA_ARGS__)) /** * devm_alloc_workqueue - Resource-managed allocate a workqueue * @dev: Device to allocate workqueue for * @fmt: printf format for the name of the workqueue * @flags: WQ_* flags * @max_active: max in-flight work items, 0 for default * @...: args for @fmt * * Resource managed workqueue, see alloc_workqueue() for details. * * The workqueue will be automatically destroyed on driver detach. Typically * this should be used in drivers already relying on devm interafaces. * * RETURNS: * Pointer to the allocated workqueue on success, %NULL on failure. */ __printf(2, 5) struct workqueue_struct * devm_alloc_workqueue(struct device *dev, const char *fmt, unsigned int flags, int max_active, ...); #ifdef CONFIG_LOCKDEP /** * alloc_workqueue_lockdep_map - allocate a workqueue with user-defined lockdep_map Loading Loading @@ -568,6 +588,8 @@ alloc_workqueue_lockdep_map(const char *fmt, unsigned int flags, int max_active, */ #define alloc_ordered_workqueue(fmt, flags, args...) \ alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) #define devm_alloc_ordered_workqueue(dev, fmt, flags, args...) \ devm_alloc_workqueue(dev, fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) #define create_workqueue(name) \ alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_PERCPU, 1, (name)) Loading kernel/workqueue.c +28 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/mempolicy.h> #include <linux/freezer.h> #include <linux/debug_locks.h> #include <linux/device/devres.h> #include <linux/lockdep.h> #include <linux/idr.h> #include <linux/jhash.h> Loading Loading @@ -5891,6 +5892,33 @@ struct workqueue_struct *alloc_workqueue_noprof(const char *fmt, } EXPORT_SYMBOL_GPL(alloc_workqueue_noprof); static void devm_workqueue_release(void *res) { destroy_workqueue(res); } __printf(2, 5) struct workqueue_struct * devm_alloc_workqueue(struct device *dev, const char *fmt, unsigned int flags, int max_active, ...) { struct workqueue_struct *wq; va_list args; int ret; va_start(args, max_active); wq = alloc_workqueue(fmt, flags, max_active, args); va_end(args); if (!wq) return NULL; ret = devm_add_action_or_reset(dev, devm_workqueue_release, wq); if (ret) return NULL; return wq; } EXPORT_SYMBOL_GPL(devm_alloc_workqueue); #ifdef CONFIG_LOCKDEP __printf(1, 5) struct workqueue_struct * Loading Loading
Documentation/driver-api/driver-model/devres.rst +4 −0 Original line number Diff line number Diff line Loading @@ -464,3 +464,7 @@ SPI WATCHDOG devm_watchdog_register_device() WORKQUEUE devm_alloc_workqueue() devm_alloc_ordered_workqueue()
include/linux/workqueue.h +22 −0 Original line number Diff line number Diff line Loading @@ -512,6 +512,26 @@ __printf(1, 4) struct workqueue_struct * alloc_workqueue_noprof(const char *fmt, unsigned int flags, int max_active, ...); #define alloc_workqueue(...) alloc_hooks(alloc_workqueue_noprof(__VA_ARGS__)) /** * devm_alloc_workqueue - Resource-managed allocate a workqueue * @dev: Device to allocate workqueue for * @fmt: printf format for the name of the workqueue * @flags: WQ_* flags * @max_active: max in-flight work items, 0 for default * @...: args for @fmt * * Resource managed workqueue, see alloc_workqueue() for details. * * The workqueue will be automatically destroyed on driver detach. Typically * this should be used in drivers already relying on devm interafaces. * * RETURNS: * Pointer to the allocated workqueue on success, %NULL on failure. */ __printf(2, 5) struct workqueue_struct * devm_alloc_workqueue(struct device *dev, const char *fmt, unsigned int flags, int max_active, ...); #ifdef CONFIG_LOCKDEP /** * alloc_workqueue_lockdep_map - allocate a workqueue with user-defined lockdep_map Loading Loading @@ -568,6 +588,8 @@ alloc_workqueue_lockdep_map(const char *fmt, unsigned int flags, int max_active, */ #define alloc_ordered_workqueue(fmt, flags, args...) \ alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) #define devm_alloc_ordered_workqueue(dev, fmt, flags, args...) \ devm_alloc_workqueue(dev, fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) #define create_workqueue(name) \ alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_PERCPU, 1, (name)) Loading
kernel/workqueue.c +28 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/mempolicy.h> #include <linux/freezer.h> #include <linux/debug_locks.h> #include <linux/device/devres.h> #include <linux/lockdep.h> #include <linux/idr.h> #include <linux/jhash.h> Loading Loading @@ -5891,6 +5892,33 @@ struct workqueue_struct *alloc_workqueue_noprof(const char *fmt, } EXPORT_SYMBOL_GPL(alloc_workqueue_noprof); static void devm_workqueue_release(void *res) { destroy_workqueue(res); } __printf(2, 5) struct workqueue_struct * devm_alloc_workqueue(struct device *dev, const char *fmt, unsigned int flags, int max_active, ...) { struct workqueue_struct *wq; va_list args; int ret; va_start(args, max_active); wq = alloc_workqueue(fmt, flags, max_active, args); va_end(args); if (!wq) return NULL; ret = devm_add_action_or_reset(dev, devm_workqueue_release, wq); if (ret) return NULL; return wq; } EXPORT_SYMBOL_GPL(devm_alloc_workqueue); #ifdef CONFIG_LOCKDEP __printf(1, 5) struct workqueue_struct * Loading