From: Greg KH <gregkh@linuxfoundation.org>
To: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: Jens Axboe <axboe@kernel.dk>, Christoph Hellwig <hch@lst.de>,
Linus Torvalds <torvalds@linux-foundation.org>,
Hannes Reinecke <hare@suse.de>,
Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>,
Hillf Danton <hdanton@sina.com>,
Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>,
linux-block <linux-block@vger.kernel.org>,
Tyler Hicks <tyhicks@linux.microsoft.com>,
Pavel Tatashin <pasha.tatashin@soleen.com>
Subject: Re: [PATCH v4] block: genhd: don't call probe function with major_names_lock held
Date: Wed, 18 Aug 2021 15:27:37 +0200 [thread overview]
Message-ID: <YR0KySFfiDk+s7pn@kroah.com> (raw)
In-Reply-To: <d7d31bf1-33d3-b817-0ce3-943e6835de33@i-love.sakura.ne.jp>
On Wed, Aug 18, 2021 at 08:07:32PM +0900, Tetsuo Handa wrote:
> syzbot is reporting circular locking problem at __loop_clr_fd() [1], for
> commit a160c6159d4a0cf8 ("block: add an optional probe callback to
> major_names") is calling the module's probe function with major_names_lock
> held.
>
> When copying content of /proc/devices to another file via sendfile(),
>
> sb_writers#$N => &p->lock => major_names_lock
>
> dependency is recorded.
>
> When loop_process_work() from WQ context performs a write request,
>
> (wq_completion)loop$M => (work_completion)&lo->rootcg_work =>
> sb_writers#$N
>
> dependency is recorded.
>
> When flush_workqueue() from drain_workqueue() from destroy_workqueue()
> from __loop_clr_fd() from blkdev_put() from blkdev_close() from __fput()
> is called,
>
> &disk->open_mutex => &lo->lo_mutex => (wq_completion)loop$M
>
> dependency is recorded.
>
> When loop_control_remove() from loop_control_ioctl(LOOP_CTL_REMOVE) is
> called,
>
> loop_ctl_mutex => &lo->lo_mutex
>
> dependency is recorded.
>
> As a result, lockdep thinks that there is
>
> loop_ctl_mutex => &lo->lo_mutex => (wq_completion)loop$M =>
> (work_completion)&lo->rootcg_work => sb_writers#$N => &p->lock =>
> major_names_lock
>
> dependency chain.
>
> Then, if loop_add() from loop_probe() from blk_request_module() from
> blkdev_get_no_open() from blkdev_get_by_dev() from blkdev_open() from
> do_dentry_open() from path_openat() from do_filp_open() is called,
>
> major_names_lock => loop_ctl_mutex
>
> dependency is appended to the dependency chain.
>
> There would be two approaches for breaking this circular dependency.
> One is to kill loop_ctl_mutex => &lo->lo_mutex chain. The other is to
> kill major_names_lock => loop_ctl_mutex chain. This patch implements
> the latter, due to the following reasons.
>
> (1) sb_writers#$N => &p->lock => major_names_lock chain is unavoidable
>
> (2) this patch can also fix similar problem in other modules [2] which
> is caused by calling the probe function with major_names_lock held
>
> (3) I believe that this patch is principally safer than e.g.
> commit bd5c39edad535d9f ("loop: reduce loop_ctl_mutex coverage in
> loop_exit") which waits until the probe function finishes using
> global mutex in order to fix deadlock reproducible by sleep
> injection [3]
>
> This patch adds THIS_MODULE parameter to __register_blkdev() as with
> usb_register(), and drops major_names_lock before calling probe function
> by holding a reference to that module which contains that probe function.
>
> Since cdev uses register_chrdev() and __register_chrdev(), bdev should be
> able to preserve register_blkdev() and __register_blkdev() naming scheme.
Note, the cdev api is anything but good, so should not be used as an
excuse for anything. Don't copy it unless you have a very good reason.
Also, what changed in this version? I see no patch history here :(
thanks,
greg k-h
next prev parent reply other threads:[~2021-08-18 13:28 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-19 1:05 [PATCH v2] block: genhd: don't call probe function with major_names_lock held Tetsuo Handa
2021-06-19 3:24 ` kernel test robot
2021-06-19 6:14 ` kernel test robot
2021-06-19 6:44 ` Greg KH
2021-06-19 8:47 ` Tetsuo Handa
[not found] ` <20210620024403.820-1-hdanton@sina.com>
2021-06-20 13:54 ` Tetsuo Handa
2021-06-21 8:54 ` Greg KH
2021-06-21 6:18 ` Christoph Hellwig
2021-08-15 6:52 ` [PATCH v3] " Tetsuo Handa
2021-08-15 7:06 ` Greg KH
2021-08-15 7:49 ` Tetsuo Handa
2021-08-15 9:19 ` Greg KH
2021-08-18 11:07 ` [PATCH v4] " Tetsuo Handa
2021-08-18 13:27 ` Greg KH [this message]
2021-08-18 14:44 ` Tetsuo Handa
2021-08-18 15:28 ` Greg KH
2021-08-21 6:12 ` [PATCH v5] " Tetsuo Handa
2021-08-18 13:47 ` [PATCH v4] " Christoph Hellwig
2021-08-18 14:34 ` Tetsuo Handa
2021-08-18 14:41 ` Greg KH
2021-08-18 14:51 ` Tetsuo Handa
2021-08-19 9:16 ` Christoph Hellwig
2021-08-19 14:47 ` Tetsuo Handa
2021-08-19 9:19 ` Christoph Hellwig
2021-08-19 14:23 ` Tetsuo Handa
2021-08-19 15:10 ` Greg KH
2021-08-16 7:33 ` [PATCH v3] " Christoph Hellwig
2021-08-16 14:44 ` Tetsuo Handa
[not found] ` <20210817081045.3609-1-hdanton@sina.com>
2021-08-17 10:18 ` Tetsuo Handa
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=YR0KySFfiDk+s7pn@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=axboe@kernel.dk \
--cc=chaitanya.kulkarni@wdc.com \
--cc=desmondcheongzx@gmail.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=hdanton@sina.com \
--cc=linux-block@vger.kernel.org \
--cc=pasha.tatashin@soleen.com \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=torvalds@linux-foundation.org \
--cc=tyhicks@linux.microsoft.com \
/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;
as well as URLs for NNTP newsgroup(s).