kernelnewbies.kernelnewbies.org archive mirror
 help / color / mirror / Atom feed
* workqueue - queue + drain
@ 2022-08-11 16:03 Martin Kaiser
  2022-09-27 12:50 ` Fabio M. De Francesco
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Kaiser @ 2022-08-11 16:03 UTC (permalink / raw)
  To: kernelnewbies

Dear all,

would you mind helping me understand how workers and workqueues act in a
seemingly simple scenario? I'm calling

queue_work(my_queue, my_worker)

to add a worker to a queue that was created by calling
create_singlethread_workqueue().

This goes into

queue_work
   queue_work_on
         ...
         if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
            __queue_work(cpu, wq, work);
            ret = true;
         }
         ... return false if __queue_work hasn't been called...


with

static void __queue_work(int cpu, struct workqueue_struct *wq, struct work_struct *work)
   ...
   /* if draining, only works from the same workqueue are allowed */
   if (unlikely(wq->flags & __WQ_DRAINING) &&
       WARN_ON_ONCE(!is_chained_work(wq)))
      return;


If drain_workqueue(my_queue) is running while
queue_work(my_queue, my_worker)
is called, my_worker will have WORK_STRUCT_PENDING_BIT set, but it's not
queued and no error is returned.

With WORK_STRUCT_PENDING_BIT set, all further attempts to
queue_work(my_queue, my_worker)
later, after draining is done, will fail.

This code has been unchanged since at least 4.14. Could anyone shed some
light on this, where am I getting things wrong?

Thanks and best regards,

   Martin

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-09-27 12:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-11 16:03 workqueue - queue + drain Martin Kaiser
2022-09-27 12:50 ` Fabio M. De Francesco

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).