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: 49+ 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 1:05 ` Tetsuo Handa
2021-06-19 1:05 ` Tetsuo Handa
2021-06-19 3:24 ` kernel test robot
2021-06-19 3:24 ` kernel test robot
2021-06-19 3:24 ` kernel test robot
2021-06-19 3:24 ` kernel test robot
2021-06-19 6:14 ` kernel test robot
2021-06-19 6:14 ` kernel test robot
2021-06-19 6:14 ` kernel test robot
2021-06-19 6:14 ` kernel test robot
2021-06-19 6:44 ` Greg KH
2021-06-19 6:44 ` Greg KH
2021-06-19 6:44 ` Greg KH
2021-06-19 8:47 ` Tetsuo Handa
2021-06-19 8:47 ` Tetsuo Handa
2021-06-19 8:47 ` Tetsuo Handa
2021-06-20 2:44 ` Hillf Danton
2021-06-20 2:44 ` Hillf Danton
2021-06-20 13:54 ` Tetsuo Handa
2021-06-20 13:54 ` Tetsuo Handa
2021-06-20 13:54 ` Tetsuo Handa
2021-06-21 8:54 ` Greg KH
2021-06-21 8:54 ` Greg KH
2021-06-21 8:54 ` Greg KH
2021-06-21 6:18 ` Christoph Hellwig
2021-06-21 6:18 ` Christoph Hellwig
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 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.