Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22df02bb authored by Tejun Heo's avatar Tejun Heo
Browse files

workqueue: define masks for work flags and conditionalize STATIC flags



Work flags are about to see more traditional mask handling.  Define
WORK_STRUCT_*_BIT as the bit position constant and redefine
WORK_STRUCT_* as bit masks.  Also, make WORK_STRUCT_STATIC_* flags
conditional

While at it, re-define these constants as enums and use
WORK_STRUCT_STATIC instead of hard-coding 2 in
WORK_DATA_STATIC_INIT().

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 97e37d7b
Loading
Loading
Loading
Loading
+21 −8
Original line number Original line Diff line number Diff line
@@ -22,12 +22,25 @@ typedef void (*work_func_t)(struct work_struct *work);
 */
 */
#define work_data_bits(work) ((unsigned long *)(&(work)->data))
#define work_data_bits(work) ((unsigned long *)(&(work)->data))


enum {
	WORK_STRUCT_PENDING_BIT	= 0,	/* work item is pending execution */
#ifdef CONFIG_DEBUG_OBJECTS_WORK
	WORK_STRUCT_STATIC_BIT	= 1,	/* static initializer (debugobjects) */
#endif

	WORK_STRUCT_PENDING	= 1 << WORK_STRUCT_PENDING_BIT,
#ifdef CONFIG_DEBUG_OBJECTS_WORK
	WORK_STRUCT_STATIC	= 1 << WORK_STRUCT_STATIC_BIT,
#else
	WORK_STRUCT_STATIC	= 0,
#endif

	WORK_STRUCT_FLAG_MASK	= 3UL,
	WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK,
};

struct work_struct {
struct work_struct {
	atomic_long_t data;
	atomic_long_t data;
#define WORK_STRUCT_PENDING 0		/* T if work item pending execution */
#define WORK_STRUCT_STATIC  1		/* static initializer (debugobjects) */
#define WORK_STRUCT_FLAG_MASK (3UL)
#define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK)
	struct list_head entry;
	struct list_head entry;
	work_func_t func;
	work_func_t func;
#ifdef CONFIG_LOCKDEP
#ifdef CONFIG_LOCKDEP
@@ -36,7 +49,7 @@ struct work_struct {
};
};


#define WORK_DATA_INIT()	ATOMIC_LONG_INIT(0)
#define WORK_DATA_INIT()	ATOMIC_LONG_INIT(0)
#define WORK_DATA_STATIC_INIT()	ATOMIC_LONG_INIT(2)
#define WORK_DATA_STATIC_INIT()	ATOMIC_LONG_INIT(WORK_STRUCT_STATIC)


struct delayed_work {
struct delayed_work {
	struct work_struct work;
	struct work_struct work;
@@ -98,7 +111,7 @@ extern void __init_work(struct work_struct *work, int onstack);
extern void destroy_work_on_stack(struct work_struct *work);
extern void destroy_work_on_stack(struct work_struct *work);
static inline unsigned int work_static(struct work_struct *work)
static inline unsigned int work_static(struct work_struct *work)
{
{
	return *work_data_bits(work) & (1 << WORK_STRUCT_STATIC);
	return *work_data_bits(work) & WORK_STRUCT_STATIC;
}
}
#else
#else
static inline void __init_work(struct work_struct *work, int onstack) { }
static inline void __init_work(struct work_struct *work, int onstack) { }
@@ -167,7 +180,7 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; }
 * @work: The work item in question
 * @work: The work item in question
 */
 */
#define work_pending(work) \
#define work_pending(work) \
	test_bit(WORK_STRUCT_PENDING, work_data_bits(work))
	test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))


/**
/**
 * delayed_work_pending - Find out whether a delayable work item is currently
 * delayed_work_pending - Find out whether a delayable work item is currently
@@ -182,7 +195,7 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; }
 * @work: The work item in question
 * @work: The work item in question
 */
 */
#define work_clear_pending(work) \
#define work_clear_pending(work) \
	clear_bit(WORK_STRUCT_PENDING, work_data_bits(work))
	clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))


enum {
enum {
	WQ_FREEZEABLE		= 1 << 0, /* freeze during suspend */
	WQ_FREEZEABLE		= 1 << 0, /* freeze during suspend */
+6 −6
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@ static int work_fixup_activate(void *addr, enum debug_obj_state state)
		 * statically initialized. We just make sure that it
		 * statically initialized. We just make sure that it
		 * is tracked in the object tracker.
		 * is tracked in the object tracker.
		 */
		 */
		if (test_bit(WORK_STRUCT_STATIC, work_data_bits(work))) {
		if (test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work))) {
			debug_object_init(work, &work_debug_descr);
			debug_object_init(work, &work_debug_descr);
			debug_object_activate(work, &work_debug_descr);
			debug_object_activate(work, &work_debug_descr);
			return 0;
			return 0;
@@ -232,7 +232,7 @@ static inline void set_wq_data(struct work_struct *work,
	BUG_ON(!work_pending(work));
	BUG_ON(!work_pending(work));


	atomic_long_set(&work->data, (unsigned long)cwq | work_static(work) |
	atomic_long_set(&work->data, (unsigned long)cwq | work_static(work) |
			(1UL << WORK_STRUCT_PENDING) | extra_flags);
			WORK_STRUCT_PENDING | extra_flags);
}
}


/*
/*
@@ -330,7 +330,7 @@ queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work)
{
{
	int ret = 0;
	int ret = 0;


	if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
		__queue_work(cpu, wq, work);
		__queue_work(cpu, wq, work);
		ret = 1;
		ret = 1;
	}
	}
@@ -380,7 +380,7 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
	struct timer_list *timer = &dwork->timer;
	struct timer_list *timer = &dwork->timer;
	struct work_struct *work = &dwork->work;
	struct work_struct *work = &dwork->work;


	if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
		BUG_ON(timer_pending(timer));
		BUG_ON(timer_pending(timer));
		BUG_ON(!list_empty(&work->entry));
		BUG_ON(!list_empty(&work->entry));


@@ -516,7 +516,7 @@ static void insert_wq_barrier(struct cpu_workqueue_struct *cwq,
	 * might deadlock.
	 * might deadlock.
	 */
	 */
	INIT_WORK_ON_STACK(&barr->work, wq_barrier_func);
	INIT_WORK_ON_STACK(&barr->work, wq_barrier_func);
	__set_bit(WORK_STRUCT_PENDING, work_data_bits(&barr->work));
	__set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work));
	init_completion(&barr->done);
	init_completion(&barr->done);


	debug_work_activate(&barr->work);
	debug_work_activate(&barr->work);
@@ -628,7 +628,7 @@ static int try_to_grab_pending(struct work_struct *work)
	struct cpu_workqueue_struct *cwq;
	struct cpu_workqueue_struct *cwq;
	int ret = -1;
	int ret = -1;


	if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work)))
	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)))
		return 0;
		return 0;


	/*
	/*