[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y7xbpidpq7+DqJan@slm.duckdns.org>
Date: Mon, 9 Jan 2023 08:23:34 -1000
From: Tejun Heo <tj@...nel.org>
To: Yu Kuai <yukuai1@...weicloud.com>
Cc: hch@...radead.org, josef@...icpanda.com, axboe@...nel.dk,
cgroups@...r.kernel.org, linux-block@...r.kernel.org,
linux-kernel@...r.kernel.org, yi.zhang@...wei.com,
"yukuai (C)" <yukuai3@...wei.com>
Subject: Re: [PATCH v2 1/2] blk-iocost: add refcounting for iocg
Hello,
On Mon, Jan 09, 2023 at 09:32:46AM +0800, Yu Kuai wrote:
> > 59b57717fff8 ("blkcg: delay blkg destruction until after writeback has finished")
> > d866dbf61787 ("blkcg: rename blkcg->cgwb_refcnt to ->online_pin and always use it")
>
> These two commits are applied for three years, I don't check the details
> yet but they seem can't guarantee that no io will be handled by
> rq_qos_throttle() after pd_offline_fn(), because I just reproduced this
> in another problem:
>
> f02be9002c48 ("block, bfq: fix null pointer dereference in bfq_bio_bfqg()")
>
> User thread can issue async io, and io can be throttled by
> blk-throttle(not writeback), then user thread can exit and cgroup can be
> removed before such io is dispatched to rq_qos_throttle.
I see.
> > After the above two commits, ->pd_offline_fn() is called only after all
> > possible writebacks are complete, so it shouldn't allow mass escapes to
> > root. With writebacks out of the picture, it might be that there can be no
> > further IOs once ->pd_offline_fn() is called too as there can be no tasks
> > left in it and no dirty pages, but best to confirm that.
> >
> > So, yeah, the original approach you took should work although I'm not sure
> > the patches that you added to make offline blkg to bypass are necessary
> > (that also contributed to my assumption that there will be more IOs on those
> > blkg's). Have you seen more IOs coming down the pipeline after offline? If
> > so, can you dump some backtraces and see where they're coming from?
>
> Currently I'm sure such IOs can come from blk-throttle, and I'm not sure
> yet but I also suspect io_uring can do this.
Yeah, that's unfortunate. There are several options here:
1. Do what you originally suggested - bypass to root after offline. I feel
uneasy about this. Both iolatency and throtl clear their configs on
offline but that's punting to the parent. For iocost it'd be bypassing
all controls, which can actually be exploited.
2. Make all possible IO issuers use blkcg_[un]pin_online() and shift the
iocost shutdown to pd_offline_fn(). This likely is the most canonical
solution given the current situation but it's kinda nasty to add another
layer of refcnting all over the place.
3. Order blkg free so that parents are never freed before children. You did
this by adding refcnts in iocost but shouldn't it be possible to simply
shift blkg_put(blkg->parent) in __blkg_release() to blkg_free_workfn()?
#3 seems the most logical to me. What do you thinK?
Thanks.
--
tejun
Powered by blists - more mailing lists