From: Paolo Bonzini <pbonzini@redhat.com>
To: Sean Christopherson <seanjc@google.com>,
Al Viro <viro@zeniv.linux.org.uk>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH gmem FIXUP] kvm: guestmem: do not use a file system
Date: Wed, 11 Oct 2023 19:57:37 +0200 [thread overview]
Message-ID: <7c4b1c78-de74-5fff-7327-0863f403eb7e@redhat.com> (raw)
In-Reply-To: <ZSXeipdJcWZjLx8k@google.com>
On 10/11/23 01:30, Sean Christopherson wrote:
>> E.g. drivers/block/loop.c has this gem
>>
>> /* This is safe: open() is still holding a reference. */
>> module_put(THIS_MODULE);
>
> in __loop_clr_fd(), which is invoked from a .release() function. So open() quite
> clearly doesn't hold a reference, unless the comment is talking about the reference
> that was obtained by the core file systems layer and won't be put until after
> .release() completes. But then what on earth is the point of doing
> module_get(THIS_MODULE) and module_put(THIS_MODULE)?
Here the module_put() is called not just from .release() in autoclear
mode, but also from the LOOP_CLR_FD ioctl.
So the idea here is that while a /dev/loopN device exists you must keep
the module alive, to ensure that the devices don't disappear from /dev.
So the point here is to keep the module alive after /dev/loop-control
has been closed; but if /dev/loopN is open it will keep the module alive
on its own, and this makes module_get/module_put safe in this particular
case.
In general, safety is guaranteed if module_put is called while the
module's reference count is still elevated by someone else, which could
be a file descriptor or some core subsystem. But then you're right that
in many case there seems to be no point in doing module_get/module_put.
In drivers/watchdog/softdog.c, softdog_stop() is called while the
module's reference count is still elevated by the core watchdog code,
which makes the code safe. But why does softdog.c need to have its own
reference? Any attempt to unregister the softdog module will go through
hrtimer_cancel(&softdog_ticktock) - which waits for the timer callback
to be complete, just like flush_work() in your patch.
This module_get/module_put _is_ unnecessary. It was introduced as a
bandaid in commit 5889f06bd31d ("watchdog: refuse to unload softdog
module when its timer is running", 2015-12-27). Back then the core code
wasn't careful to keep the module refcount elevated if the watchdog was
still running in watchdog_release. When commit ee142889e32f ("watchdog:
Introduce WDOG_HW_RUNNING flag", 2016-03-16) fixed the race for real,
softdog.c wasn't adjusted.
I agree that in many cases, however, the safety does not seem to be
there. I cannot find a place that ensures that snd-aoa-soundbus-i2sbus
is kept alive while i2sbus_private_free runs, for example (though that
code is a maze).
Your patch 2 looks good, but perhaps instead of setting the owner we
could stash the struct module* in a global, and try_get/put it from open
and release respectively? That is, .owner keeps the kvm module alive
and the kvm module keeps kvm-intel/kvm-amd alive. That would subsume
patches 1 and 3.
Paolo
next prev parent reply other threads:[~2023-10-11 17:58 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-28 18:06 Paolo Bonzini
2023-09-29 2:22 ` Sean Christopherson
2023-10-09 2:22 ` Al Viro
2023-10-09 2:35 ` Al Viro
2023-10-09 14:32 ` Sean Christopherson
2023-10-09 20:06 ` Al Viro
2023-10-09 20:20 ` Sean Christopherson
2023-10-09 20:40 ` Al Viro
2023-10-09 21:26 ` Sean Christopherson
2023-10-10 0:09 ` Al Viro
2023-10-10 0:27 ` Sean Christopherson
2023-10-10 0:37 ` Al Viro
2023-10-10 23:30 ` Sean Christopherson
2023-10-11 15:06 ` Xu Yilun
2023-10-11 17:57 ` Paolo Bonzini [this message]
2023-10-13 16:55 ` Sean Christopherson
2023-10-16 15:19 ` Paolo Bonzini
2023-10-09 2:16 ` Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7c4b1c78-de74-5fff-7327-0863f403eb7e@redhat.com \
--to=pbonzini@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=seanjc@google.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®