History

workqueue: Remember whether a work item was on a BH workqueue

Add an off-queue flag, WORK_OFFQ_BH, that indicates whether the last workqueue the work item was on was a BH one. This will be used to test whether a work item is BH in cancel_sync path to implement atomic cancel_sync'ing for BH work items.

Tejun Heo committed 2 years ago

Commit 456a78e1 parent f09b10b2 files · +11 −3Browse files

Showing the changes to kernel/workqueue.c (1 of 2 files). Show all

Unified · Split

kernel/workqueue.c+8−2
@@ -764,6 +764,11 @@ static int work_next_color(int color) · 763 unmodified lines
764 return (color + 1) % WORK_NR_COLORS;764 return (color + 1) % WORK_NR_COLORS;
765}765}
766 766
767static unsigned long pool_offq_flags(struct worker_pool *pool)
768{
769 return (pool->flags & POOL_BH) ? WORK_OFFQ_BH : 0;
770}
771
767/*772/*
768 * While queued, %WORK_STRUCT_PWQ is set and non flag bits of a work's data773 * While queued, %WORK_STRUCT_PWQ is set and non flag bits of a work's data
769 * contain the pointer to the queued pwq. Once execution starts, the flag774 * contain the pointer to the queued pwq. Once execution starts, the flag
@@ -2122,7 +2127,8 @@ static int try_to_grab_pending(struct work_struct *work, u32 cflags, · 1352 unmodified lines
2122 * this destroys work->data needed by the next step, stash it.2127 * this destroys work->data needed by the next step, stash it.
2123 */2128 */
2124 work_data = *work_data_bits(work);2129 work_data = *work_data_bits(work);
2125 set_work_pool_and_keep_pending(work, pool->id, 0);2130 set_work_pool_and_keep_pending(work, pool->id,
2131 pool_offq_flags(pool));
2126 2132
2127 /* must be the last step, see the function comment */2133 /* must be the last step, see the function comment */
2128 pwq_dec_nr_in_flight(pwq, work_data);2134 pwq_dec_nr_in_flight(pwq, work_data);
@@ -3175,7 +3181,7 @@ __acquires(&pool->lock) · 1046 unmodified lines
3175 * PENDING and queued state changes happen together while IRQ is3181 * PENDING and queued state changes happen together while IRQ is
3176 * disabled.3182 * disabled.
3177 */3183 */
3178 set_work_pool_and_clear_pending(work, pool->id, 0);3184 set_work_pool_and_clear_pending(work, pool->id, pool_offq_flags(pool));
3179 3185
3180 pwq->stats[PWQ_STAT_STARTED]++;3186 pwq->stats[PWQ_STAT_STARTED]++;
3181 raw_spin_unlock_irq(&pool->lock);3187 raw_spin_unlock_irq(&pool->lock);