WORK_OFFQ_CANCELING     = (1 << WORK_OFFQ_FLAG_BASE),
 
+       /*
+        * When a work item is off queue, its high bits point to the last
+        * cpu it was on.  Cap at 31 bits and use the highest number to
+        * indicate that no cpu is associated.
+        */
        WORK_OFFQ_FLAG_BITS     = 1,
        WORK_OFFQ_CPU_SHIFT     = WORK_OFFQ_FLAG_BASE + WORK_OFFQ_FLAG_BITS,
+       WORK_OFFQ_LEFT          = BITS_PER_LONG - WORK_OFFQ_CPU_SHIFT,
+       WORK_OFFQ_CPU_BITS      = WORK_OFFQ_LEFT <= 31 ? WORK_OFFQ_LEFT : 31,
+       WORK_OFFQ_CPU_NONE      = (1LU << WORK_OFFQ_CPU_BITS) - 1,
 
        /* convenience constants */
        WORK_STRUCT_FLAG_MASK   = (1UL << WORK_STRUCT_FLAG_BITS) - 1,
        WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK,
-       WORK_STRUCT_NO_CPU      = (unsigned long)WORK_CPU_NONE << WORK_OFFQ_CPU_SHIFT,
+       WORK_STRUCT_NO_CPU      = (unsigned long)WORK_OFFQ_CPU_NONE << WORK_OFFQ_CPU_SHIFT,
 
        /* bit mask for work_busy() return values */
        WORK_BUSY_PENDING       = 1 << 0,
 
                        (data & WORK_STRUCT_WQ_DATA_MASK))->pool->gcwq;
 
        cpu = data >> WORK_OFFQ_CPU_SHIFT;
-       if (cpu == WORK_CPU_NONE)
+       if (cpu == WORK_OFFQ_CPU_NONE)
                return NULL;
 
        BUG_ON(cpu >= nr_cpu_ids && cpu != WORK_CPU_UNBOUND);
 static void mark_work_canceling(struct work_struct *work)
 {
        struct global_cwq *gcwq = get_work_gcwq(work);
-       unsigned long cpu = gcwq ? gcwq->cpu : WORK_CPU_NONE;
+       unsigned long cpu = gcwq ? gcwq->cpu : WORK_OFFQ_CPU_NONE;
 
        set_work_data(work, (cpu << WORK_OFFQ_CPU_SHIFT) | WORK_OFFQ_CANCELING,
                      WORK_STRUCT_PENDING);