From: Ming Lei <ming.lei@canonical.com>
To: Jens Axboe <axboe@kernel.dk>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Christoph Hellwig <hch@infradead.org>, Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Jarod Wilson <jarod@redhat.com>,
David Herrmann <dh.herrmann@gmail.com>,
Markus Pargmann <mpa@pengutronix.de>,
"nbd-general@lists.sourceforge.net"
<nbd-general@lists.sourceforge.net>,
Stefan Haberland <stefan.haberland@de.ibm.com>,
Sebastian Ott <sebott@linux.vnet.ibm.com>,
Fabian Frederick <fabf@skynet.be>,
linux-s390@vger.kernel.org, Ming Lei <ming.lei@canonical.com>
Subject: Re: [PATCH 2/6] block: loop: don't hold lo_ctl_mutex in lo_open
Date: Mon, 6 Apr 2015 00:28:22 +0800 [thread overview]
Message-ID: <CACVXFVMFxAdG3BNtO82uhv8RTYErk5c9ts4+QVpbne+4WHnVqA@mail.gmail.com> (raw)
In-Reply-To: <1428218688-4092-3-git-send-email-ming.lei@canonical.com>
On Sun, Apr 5, 2015 at 3:24 PM, Ming Lei <ming.lei@canonical.com> wrote:
> The lo_ctl_mutex is held for running all ioctl handlers, and
> in some ioctl handlers, ioctl_by_bdev(BLKRRPART) is called for
> rereading partitions, which requires bd_mutex.
>
> So it is easy to cause failure because trylock(bd_mutex) may
> fail inside blkdev_reread_part(), and follows the lock context:
>
> blkid or other application:
> ->open()
> ->mutex_lock(bd_mutex)
> ->lo_open()
> ->mutex_lock(lo_ctl_mutex)
>
> losetup(set fd ioctl):
> ->mutex_lock(lo_ctl_mutex)
> ->ioctl_by_bdev(BLKRRPART)
> ->trylock(bd_mutex)
>
> This patch trys to eliminate the ABBA lock dependency by removing
> lo_ctl_mutext in lo_open() with the following approach:
>
> 1) introduce lo_open_mutex to protect lo_refcnt and avoid acquiring
> lo_ctl_mutex in lo_open():
> - for open vs. add/del loop, no any problem because of loop_index_mutex
> - lo_open_mutex is used for syncing open() and loop_clr_fd()
> - both open() and release() have been serialized by bd_mutex already
>
> 2) don't hold lo_ctl_mutex for decreasing/checking lo_refcnt in
> lo_release(), then lo_ctl_mutex is only required for the last release.
Another simpler way is to make lo_refcnt as atomic_t and remove
lo_ctrl_mutext in lo_open(), and freeze request queue during clearing
fd, and better to freeze queue during setting fd too, so will update in
v1 with this way.
Thanks,
Ming Lei
next prev parent reply other threads:[~2015-04-05 16:28 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-05 7:24 [PATCH 0/6] block: reread partitions changes and fix for loop Ming Lei
2015-04-05 7:24 ` [PATCH 1/6] block: export blkdev_reread_part() Ming Lei
2015-04-05 16:12 ` Christoph Hellwig
2015-04-05 16:40 ` Ming Lei
2015-04-06 13:42 ` Jarod Wilson
2015-04-06 13:48 ` Jarod Wilson
2015-04-07 2:43 ` Ming Lei
2015-04-06 14:50 ` Christoph Hellwig
2015-04-07 2:11 ` Ming Lei
2015-04-05 7:24 ` [PATCH 2/6] block: loop: don't hold lo_ctl_mutex in lo_open Ming Lei
2015-04-05 16:28 ` Ming Lei [this message]
2015-04-06 14:49 ` Christoph Hellwig
2015-04-05 7:24 ` [PATCH 3/6] block: loop: fix another reread part failure Ming Lei
2015-04-05 7:24 ` [PATCH 4/6] block: nbd: convert to blkdev_reread_part() Ming Lei
2015-04-05 7:24 ` [PATCH 5/6] block: dasd_genhd: convert to blkdev_reread_part Ming Lei
2015-04-06 13:46 ` Jarod Wilson
2015-04-06 13:51 ` Jarod Wilson
2015-04-07 1:59 ` Ming Lei
2015-04-07 0:47 ` Ming Lei
2015-04-05 7:24 ` [RFC PATCH 6/6] block: replace trylock with mutex_lock in __blkdev_reread_part() Ming Lei
2015-04-08 6:23 ` [PATCH 0/7] block: reread partitions improvements Jarod Wilson
2015-04-08 6:23 ` [PATCH 1/7] block: export blkdev_reread_part() and __blkdev_reread_part() Jarod Wilson
2015-04-08 14:50 ` Ming Lei
2015-04-08 15:03 ` Peter Zijlstra
2015-04-08 15:27 ` Jarod Wilson
2015-04-08 15:28 ` Ming Lei
2015-04-08 6:23 ` [PATCH 2/7] block: loop: don't hold lo_ctl_mutex in lo_open Jarod Wilson
2015-04-08 6:50 ` Ming Lei
2015-04-08 13:40 ` Jarod Wilson
2015-04-08 14:00 ` Jarod Wilson
2015-04-08 14:20 ` Ming Lei
2015-04-08 15:28 ` Jarod Wilson
2015-04-08 6:23 ` [PATCH 3/7] block: loop: fix another reread part failure Jarod Wilson
2015-04-08 6:23 ` [PATCH 4/7] block: nbd: convert to blkdev_reread_part() Jarod Wilson
2015-04-08 6:23 ` [PATCH 5/7] block: dasd_genhd: convert to blkdev_reread_part Jarod Wilson
2015-04-08 6:23 ` [PATCH 6/7] block: replace trylock with mutex_lock in blkdev_reread_part() Jarod Wilson
2015-04-08 6:23 ` [PATCH 7/7] s390/block/dasd: remove obsolete while -EBUSY loop Jarod Wilson
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=CACVXFVMFxAdG3BNtO82uhv8RTYErk5c9ts4+QVpbne+4WHnVqA@mail.gmail.com \
--to=ming.lei@canonical.com \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=dh.herrmann@gmail.com \
--cc=fabf@skynet.be \
--cc=hch@infradead.org \
--cc=jarod@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mpa@pengutronix.de \
--cc=nbd-general@lists.sourceforge.net \
--cc=sebott@linux.vnet.ibm.com \
--cc=stefan.haberland@de.ibm.com \
--cc=tj@kernel.org \
--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;
as well as URLs for NNTP newsgroup(s).