#define WORKER_IDLE_TIMEOUT    (5 * HZ)
 
 enum {
-       IO_WORKER_F_UP          = 1,    /* up and active */
-       IO_WORKER_F_RUNNING     = 2,    /* account as running */
-       IO_WORKER_F_FREE        = 4,    /* worker on free list */
-       IO_WORKER_F_BOUND       = 8,    /* is doing bounded work */
+       IO_WORKER_F_UP          = 0,    /* up and active */
+       IO_WORKER_F_RUNNING     = 1,    /* account as running */
+       IO_WORKER_F_FREE        = 2,    /* worker on free list */
+       IO_WORKER_F_BOUND       = 3,    /* is doing bounded work */
 };
 
 enum {
  */
 struct io_worker {
        refcount_t ref;
-       unsigned flags;
+       int create_index;
+       unsigned long flags;
        struct hlist_nulls_node nulls_node;
        struct list_head all_list;
        struct task_struct *task;
 
        unsigned long create_state;
        struct callback_head create_work;
-       int create_index;
 
        union {
                struct rcu_head rcu;
 
 static inline struct io_wq_acct *io_wq_get_acct(struct io_worker *worker)
 {
-       return io_get_acct(worker->wq, worker->flags & IO_WORKER_F_BOUND);
+       return io_get_acct(worker->wq, test_bit(IO_WORKER_F_BOUND, &worker->flags));
 }
 
 static void io_worker_ref_put(struct io_wq *wq)
        wait_for_completion(&worker->ref_done);
 
        raw_spin_lock(&wq->lock);
-       if (worker->flags & IO_WORKER_F_FREE)
+       if (test_bit(IO_WORKER_F_FREE, &worker->flags))
                hlist_nulls_del_rcu(&worker->nulls_node);
        list_del_rcu(&worker->all_list);
        raw_spin_unlock(&wq->lock);
        struct io_wq_acct *acct = io_wq_get_acct(worker);
        struct io_wq *wq = worker->wq;
 
-       if (!(worker->flags & IO_WORKER_F_UP))
+       if (!test_bit(IO_WORKER_F_UP, &worker->flags))
                return;
 
        if (!atomic_dec_and_test(&acct->nr_running))
  */
 static void __io_worker_busy(struct io_wq *wq, struct io_worker *worker)
 {
-       if (worker->flags & IO_WORKER_F_FREE) {
-               worker->flags &= ~IO_WORKER_F_FREE;
+       if (test_bit(IO_WORKER_F_FREE, &worker->flags)) {
+               clear_bit(IO_WORKER_F_FREE, &worker->flags);
                raw_spin_lock(&wq->lock);
                hlist_nulls_del_init_rcu(&worker->nulls_node);
                raw_spin_unlock(&wq->lock);
 static void __io_worker_idle(struct io_wq *wq, struct io_worker *worker)
        __must_hold(wq->lock)
 {
-       if (!(worker->flags & IO_WORKER_F_FREE)) {
-               worker->flags |= IO_WORKER_F_FREE;
+       if (!test_bit(IO_WORKER_F_FREE, &worker->flags)) {
+               set_bit(IO_WORKER_F_FREE, &worker->flags);
                hlist_nulls_add_head_rcu(&worker->nulls_node, &wq->free_list);
        }
 }
        bool exit_mask = false, last_timeout = false;
        char buf[TASK_COMM_LEN];
 
-       worker->flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING);
+       set_mask_bits(&worker->flags, 0,
+                     BIT(IO_WORKER_F_UP) | BIT(IO_WORKER_F_RUNNING));
 
        snprintf(buf, sizeof(buf), "iou-wrk-%d", wq->task->pid);
        set_task_comm(current, buf);
 
        if (!worker)
                return;
-       if (!(worker->flags & IO_WORKER_F_UP))
+       if (!test_bit(IO_WORKER_F_UP, &worker->flags))
                return;
-       if (worker->flags & IO_WORKER_F_RUNNING)
+       if (test_bit(IO_WORKER_F_RUNNING, &worker->flags))
                return;
-       worker->flags |= IO_WORKER_F_RUNNING;
+       set_bit(IO_WORKER_F_RUNNING, &worker->flags);
        io_wq_inc_running(worker);
 }
 
 
        if (!worker)
                return;
-       if (!(worker->flags & IO_WORKER_F_UP))
+       if (!test_bit(IO_WORKER_F_UP, &worker->flags))
                return;
-       if (!(worker->flags & IO_WORKER_F_RUNNING))
+       if (!test_bit(IO_WORKER_F_RUNNING, &worker->flags))
                return;
 
-       worker->flags &= ~IO_WORKER_F_RUNNING;
+       clear_bit(IO_WORKER_F_RUNNING, &worker->flags);
        io_wq_dec_running(worker);
 }
 
        raw_spin_lock(&wq->lock);
        hlist_nulls_add_head_rcu(&worker->nulls_node, &wq->free_list);
        list_add_tail_rcu(&worker->all_list, &wq->all_list);
-       worker->flags |= IO_WORKER_F_FREE;
+       set_bit(IO_WORKER_F_FREE, &worker->flags);
        raw_spin_unlock(&wq->lock);
        wake_up_new_task(tsk);
 }
        init_completion(&worker->ref_done);
 
        if (index == IO_WQ_ACCT_BOUND)
-               worker->flags |= IO_WORKER_F_BOUND;
+               set_bit(IO_WORKER_F_BOUND, &worker->flags);
 
        tsk = create_io_thread(io_wq_worker, worker, NUMA_NO_NODE);
        if (!IS_ERR(tsk)) {
 void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work)
 {
        struct io_wq_acct *acct = io_work_get_acct(wq, work);
+       unsigned long work_flags = work->flags;
        struct io_cb_cancel_data match;
-       unsigned work_flags = work->flags;
        bool do_create;
 
        /*