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.
Showing the changes to kernel/workqueue.c (1 of 2 files). Show all
Unified · Split
| @@ -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 | ||
| 767 | static 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 data | 773 | * 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 flag | 774 | * 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 is | 3181 | * 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); |