All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] kthread_worker: Fix race between kthread_mod_delayed_work() and kthread_cancel_delayed_work_sync()
@ 2021-06-10 13:30 Petr Mladek
  2021-06-10 13:30 ` [PATCH 1/3] kthread_worker: Split code for canceling the delayed work timer Petr Mladek
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Petr Mladek @ 2021-06-10 13:30 UTC (permalink / raw)
  To: Andrew Morton, Martin Liu
  Cc: Oleg Nesterov, Nathan Chancellor, Nick Desaulniers, Tejun Heo,
	minchan, davidchao, jenhaochen, clang-built-linux, linux-kernel,
	Petr Mladek

This patchset fixes the race between kthread_mod_delayed_work() and
kthread_cancel_delayed_work_sync() including proper return value
handling.

The original fix, from Martin Liu [1], opened discussion [2] about
the return value. It took me some time to realize that the original
patch was not a correct fix.

The problem is that the return value might be used for reference counting
of the queued works. The return value is boolean. It could distinguish
only two situations where the work is:

    + newly queued => inc(refcnt)                   (ret == false)
    + was queued, removed, added => nope(refcntn)   (ret == true)

The original fix, introduced another situation:

    + was queued, removed => dec(refcnt)   (ret == ???)

The proper solution is to remove the work from the list only when
it can be added again. Fortunately, it can be fixed relatively
easily. I have split it into 3 small steps.

[1] https://lore.kernel.org/r/20210513065458.941403-1-liumartin@google.com
[2] https://lore.kernel.org/r/20210520214737.MrGGKbPrJ%akpm@linux-foundation.org


Petr Mladek (3):
  kthread_worker: Split code for canceling the delayed work timer.
  kthread: Prevent deadlock when kthread_mod_delayed_work() races with
    kthread_cancel_delayed_work_sync()
  kthread_worker: Fix return value when kthread_mod_delayed_work() races
    with kthread_cancel_delayed_work_sync()

 kernel/kthread.c | 96 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 63 insertions(+), 33 deletions(-)

-- 
2.26.2


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

end of thread, other threads:[~2021-06-14  7:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-10 13:30 [PATCH 0/3] kthread_worker: Fix race between kthread_mod_delayed_work() and kthread_cancel_delayed_work_sync() Petr Mladek
2021-06-10 13:30 ` [PATCH 1/3] kthread_worker: Split code for canceling the delayed work timer Petr Mladek
2021-06-10 13:30 ` [PATCH 2/3] kthread: Prevent deadlock when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync() Petr Mladek
2021-06-10 21:30   ` Andrew Morton
2021-06-11  7:16     ` Petr Mladek
2021-06-11 20:41       ` Andrew Morton
2021-06-14  7:10         ` Petr Mladek
2021-06-10 13:30 ` [PATCH 3/3] kthread_worker: Fix return value " Petr Mladek

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.