From: Luis Chamberlain <mcgrof@kernel.org>
To: axboe@kernel.dk, viro@zeniv.linux.org.uk,
gregkh@linuxfoundation.org, rostedt@goodmis.org,
mingo@redhat.com, jack@suse.cz, ming.lei@redhat.com,
nstange@suse.de, akpm@linux-foundation.org
Cc: mhocko@suse.com, yukuai3@huawei.com, linux-block@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Luis Chamberlain <mcgrof@kernel.org>,
Bart Van Assche <bvanassche@acm.org>,
Omar Sandoval <osandov@fb.com>, Hannes Reinecke <hare@suse.com>,
Michal Hocko <mhocko@kernel.org>
Subject: [RFC v2 4/5] mm/swapfile: refcount block and queue before using blkcg_schedule_throttle()
Date: Thu, 9 Apr 2020 21:45:29 +0000 [thread overview]
Message-ID: <20200409214530.2413-5-mcgrof@kernel.org> (raw)
In-Reply-To: <20200409214530.2413-1-mcgrof@kernel.org>
block device are refcounted so to ensure once its final user goes away it
can be cleaned up by the lower layers properly. The block device's
request_queue structure is also refcounted, however if the last
blk_put_queue() is called under atomic context the block layer has
to defer removal.
By refcounting the block device during the use of blkcg_schedule_throttle(),
we ensure ensure two things:
1) the block device remains available during the call
2) we ensure avoid having to deal with the fact we're using the
request_queue structure in atomic context, since the last
blk_put_queue() will be called upon disk_release(), *after*
our own bdput().
This means this code path is *not* going to remove the request_queue
structure, as we are ensuring some later upper layer disk_release()
will be the one to release the request_queue structure for us.
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Omar Sandoval <osandov@fb.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Nicolai Stange <nstange@suse.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: yu kuai <yukuai3@huawei.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
mm/swapfile.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 6659ab563448..5f6f3a61b5c0 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -3753,6 +3753,7 @@ static void free_swap_count_continuations(struct swap_info_struct *si)
void mem_cgroup_throttle_swaprate(struct mem_cgroup *memcg, int node,
gfp_t gfp_mask)
{
+ struct block_device *bdev;
struct swap_info_struct *si, *next;
if (!(gfp_mask & __GFP_IO) || !memcg)
return;
@@ -3771,8 +3772,18 @@ void mem_cgroup_throttle_swaprate(struct mem_cgroup *memcg, int node,
plist_for_each_entry_safe(si, next, &swap_avail_heads[node],
avail_lists[node]) {
if (si->bdev) {
+ bdev = bdgrab(si->bdev);
+ if (!bdev)
+ continue;
+ /*
+ * By adding our own bdgrab() we ensure the queue
+ * sticks around until disk_release(), and so we ensure
+ * our release of the request_queue does not happen in
+ * atomic context.
+ */
blkcg_schedule_throttle(bdev_get_queue(si->bdev),
true);
+ bdput(bdev);
break;
}
}
--
2.25.1
next prev parent reply other threads:[~2020-04-09 21:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-09 21:45 [RFC v2 0/5] blktrace: fix use after free Luis Chamberlain
2020-04-09 21:45 ` [RFC v2 1/5] block: move main block debugfs initialization to its own file Luis Chamberlain
2020-04-10 2:48 ` Bart Van Assche
2020-04-09 21:45 ` [RFC v2 2/5] blktrace: fix debugfs use after free Luis Chamberlain
2020-04-10 2:52 ` Bart Van Assche
2020-04-10 19:58 ` Luis Chamberlain
2020-04-11 23:09 ` Bart Van Assche
2020-04-14 3:32 ` Luis Chamberlain
2020-04-09 21:45 ` [RFC v2 3/5] blktrace: ref count the request_queue during ioctl Luis Chamberlain
2020-04-10 2:58 ` Bart Van Assche
2020-04-09 21:45 ` Luis Chamberlain [this message]
2020-04-10 3:02 ` [RFC v2 4/5] mm/swapfile: refcount block and queue before using blkcg_schedule_throttle() Bart Van Assche
2020-04-10 14:34 ` Luis Chamberlain
2020-04-09 21:45 ` [RFC v2 5/5] block: revert back to synchronous request_queue removal Luis Chamberlain
2020-04-10 3:12 ` Bart Van Assche
2020-04-10 14:34 ` Luis Chamberlain
2020-04-10 20:50 ` Luis Chamberlain
2020-04-10 21:27 ` Luis Chamberlain
2020-04-11 23:21 ` Bart Van Assche
2020-04-14 3:38 ` Luis Chamberlain
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=20200409214530.2413-5-mcgrof@kernel.org \
--to=mcgrof@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=bvanassche@acm.org \
--cc=gregkh@linuxfoundation.org \
--cc=hare@suse.com \
--cc=jack@suse.cz \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=mhocko@suse.com \
--cc=ming.lei@redhat.com \
--cc=mingo@redhat.com \
--cc=nstange@suse.de \
--cc=osandov@fb.com \
--cc=rostedt@goodmis.org \
--cc=viro@zeniv.linux.org.uk \
--cc=yukuai3@huawei.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.