Messages in this thread | | | Date | Mon, 19 Mar 2018 09:45:23 -0700 | From | Tejun Heo <> | Subject | Re: [PATCH 6/8] RCU, workqueue: Implement rcu_work |
| |
Hello, Lai.
On Fri, Mar 16, 2018 at 02:01:35PM +0800, Lai Jiangshan wrote: > > +bool flush_rcu_work(struct rcu_work *rwork) > > +{ > > + if (test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&rwork->work))) { > > + rcu_barrier(); > > + flush_work(&rwork->work); > > + return true; > > A possible tiny improvement: check if it was already queued on wq. > For example: > > if (test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&rwork->work))) { > if (!flush_work(&rwork->work)) { > rcu_barrier(); > flush_work(&rwork->work); > } > return true;
But this breaks the guarantee that flush_work waits for the latest queueing instance. Please consider the following scenario.
1. rcu-work is queued 2. rcu-work starts executing 3. rcu-work is queued again 4. rcu-work is flushed 5. execution finishes 6. flush finishes 7. execution finishes
6 should happen after 7 but it didn't.
Thanks.
-- tejun
| |