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: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
97e37d7b9e
commit
22df02bb3f
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user