Thread (6 messages) flat view 6 messages, 4 authors, 2021-08-09

Re: [PATCH v2] once: Fix panic when module unload

From: Jakub Kicinski <kuba@kernel.org>
Date: 2021-08-06 13:43:32
Also in: lkml

On Fri, 6 Aug 2021 16:21:24 +0800 Kefeng Wang wrote:
DO_ONCE
DEFINE_STATIC_KEY_TRUE(___once_key);
__do_once_done
  once_disable_jump(once_key);
    INIT_WORK(&w->work, once_deferred);
    struct once_work *w;
    w->key = key;
    schedule_work(&w->work);                     module unload
                                                   //*the key is
destroy*
process_one_work
  once_deferred
    BUG_ON(!static_key_enabled(work->key));
       static_key_count((struct static_key *)x)    //*access key, crash*

When module uses DO_ONCE mechanism, it could crash due to the above
concurrency problem, we could reproduce it with link[1].

Fix it by add/put module refcount in the once work process.

[1] https://lore.kernel.org/netdev/eaa6c371-465e-57eb-6be9-f4b16b9d7cbf@huawei.com/ (local)
Seems reasonable. Greg does it look good to you?

I think we can take it thru networking since nobody cared to pick up v1.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help