|
@@ -556,6 +556,13 @@ static void set_work_cwq(struct work_struct *work,
|
|
|
WORK_STRUCT_PENDING | WORK_STRUCT_CWQ | extra_flags);
|
|
|
}
|
|
|
|
|
|
+static void set_work_pool_and_keep_pending(struct work_struct *work,
|
|
|
+ int pool_id)
|
|
|
+{
|
|
|
+ set_work_data(work, (unsigned long)pool_id << WORK_OFFQ_POOL_SHIFT,
|
|
|
+ WORK_STRUCT_PENDING);
|
|
|
+}
|
|
|
+
|
|
|
static void set_work_pool_and_clear_pending(struct work_struct *work,
|
|
|
int pool_id)
|
|
|
{
|
|
@@ -1115,6 +1122,9 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork,
|
|
|
cwq_dec_nr_in_flight(get_work_cwq(work),
|
|
|
get_work_color(work));
|
|
|
|
|
|
+ /* work->data points to cwq iff queued, point to pool */
|
|
|
+ set_work_pool_and_keep_pending(work, pool->id);
|
|
|
+
|
|
|
spin_unlock(&pool->lock);
|
|
|
return 1;
|
|
|
}
|