* module_put_and_exit() and free_module()
@ 2015-09-05 14:13 Aleksa Sarai
2015-09-08 18:43 ` Rusty Russell
0 siblings, 1 reply; 2+ messages in thread
From: Aleksa Sarai @ 2015-09-05 14:13 UTC (permalink / raw)
To: rusty; +Cc: linux-kernel
>From my understanding, module_put_and_exit() can be used inside a
module to (from within the module) kill itself. However, it doesn't
seem to properly free the modules references (and internal
bookkeeping) since module_put_and_exit() doesn't call free_module().
And attempting to remove the module after loading it and it running
module_put_and_exit() causes any attempt to remove the module to fail
with EBUSY.
Am I missing something here? Is the purpose of module_put_and_exit()
different, or does module_put() cause the module references to get
reaped later? If that's the case, why do you get EBUSY when trying to
remove the module (surely you should get an ENOENT)? Is it even safe
to attempt to remove a module from within itself?
Thanks in advance.
--
Aleksa Sarai (cyphar)
www.cyphar.com
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: module_put_and_exit() and free_module()
2015-09-05 14:13 module_put_and_exit() and free_module() Aleksa Sarai
@ 2015-09-08 18:43 ` Rusty Russell
0 siblings, 0 replies; 2+ messages in thread
From: Rusty Russell @ 2015-09-08 18:43 UTC (permalink / raw)
To: Aleksa Sarai; +Cc: linux-kernel
Aleksa Sarai <cyphar@cyphar.com> writes:
>>From my understanding, module_put_and_exit() can be used inside a
> module to (from within the module) kill itself. However, it doesn't
> seem to properly free the modules references (and internal
> bookkeeping) since module_put_and_exit() doesn't call free_module().
> And attempting to remove the module after loading it and it running
> module_put_and_exit() causes any attempt to remove the module to fail
> with EBUSY.
It's not a general mechanism! It's for kernel threads which want to
decrement module use counts as they exit: if they did this in the module
there would be a moment where they are still running but the module
could be unloaded.
> Am I missing something here? Is the purpose of module_put_and_exit()
> different, or does module_put() cause the module references to get
> reaped later? If that's the case, why do you get EBUSY when trying to
> remove the module (surely you should get an ENOENT)? Is it even safe
> to attempt to remove a module from within itself?
module_put() simply controls the reference count. Module removal only
succeeds if the reference count is 0.
I would guess that you called module_put_and_exit() without a thread,
and oopsed.
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-09-08 18:44 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-05 14:13 module_put_and_exit() and free_module() Aleksa Sarai
2015-09-08 18:43 ` Rusty Russell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox