WQ_NON_REENTRANT        = 1 << 2, /* guarantee non-reentrance */
        WQ_RESCUER              = 1 << 3, /* has an rescue worker */
        WQ_HIGHPRI              = 1 << 4, /* high priority */
+       WQ_CPU_INTENSIVE        = 1 << 5, /* cpu instensive workqueue */
 
        WQ_MAX_ACTIVE           = 512,    /* I like 512, better ideas? */
        WQ_DFL_ACTIVE           = WQ_MAX_ACTIVE / 2,
 
        WORKER_PREP             = 1 << 3,       /* preparing to run works */
        WORKER_ROGUE            = 1 << 4,       /* not bound to any cpu */
        WORKER_REBIND           = 1 << 5,       /* mom is home, come back */
+       WORKER_CPU_INTENSIVE    = 1 << 6,       /* cpu intensive */
 
-       WORKER_NOT_RUNNING      = WORKER_PREP | WORKER_ROGUE | WORKER_REBIND,
+       WORKER_NOT_RUNNING      = WORKER_PREP | WORKER_ROGUE | WORKER_REBIND |
+                                 WORKER_CPU_INTENSIVE,
 
        /* gcwq->trustee_state */
        TRUSTEE_START           = 0,            /* start */
        struct cpu_workqueue_struct *cwq = get_work_cwq(work);
        struct global_cwq *gcwq = cwq->gcwq;
        struct hlist_head *bwh = busy_worker_head(gcwq, work);
+       bool cpu_intensive = cwq->wq->flags & WQ_CPU_INTENSIVE;
        work_func_t f = work->func;
        int work_color;
        struct worker *collision;
                        gcwq->flags &= ~GCWQ_HIGHPRI_PENDING;
        }
 
+       /*
+        * CPU intensive works don't participate in concurrency
+        * management.  They're the scheduler's responsibility.
+        */
+       if (unlikely(cpu_intensive))
+               worker_set_flags(worker, WORKER_CPU_INTENSIVE, true);
+
        spin_unlock_irq(&gcwq->lock);
 
        work_clear_pending(work);
 
        spin_lock_irq(&gcwq->lock);
 
+       /* clear cpu intensive status */
+       if (unlikely(cpu_intensive))
+               worker_clr_flags(worker, WORKER_CPU_INTENSIVE);
+
        /* we're done with it, release */
        hlist_del_init(&worker->hentry);
        worker->current_work = NULL;