Commit c98f7d6a authored by Tzung-Bi Shih's avatar Tzung-Bi Shih
Browse files

Merge remote-tracking branch 'wq/for-7.1-devm-alloc-wq'



Merge branch adding support for device-managed workqueue allocation,
which allows cleaning up a chrome-platform driver.

Signed-off-by: default avatarTzung-Bi Shih <tzungbi@kernel.org>
parents 27d58498 1dfc9d60
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -464,3 +464,7 @@ SPI

WATCHDOG
  devm_watchdog_register_device()

WORKQUEUE
  devm_alloc_workqueue()
  devm_alloc_ordered_workqueue()
+22 −0
Original line number Diff line number Diff line
@@ -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
@@ -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))
+28 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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 *