block/loop: make loop cgroup aware
authorShaohua Li <shli@fb.com>
Mon, 25 Sep 2017 19:07:22 +0000 (13:07 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 26 Sep 2017 13:41:22 +0000 (07:41 -0600)
commitd4478e92d6186ce37947a36994de407c27446266
tree1eb773ad4b1a6cdf2b3d56a2f1240f476612f436
parent902ec5b6de0678ac2effba0faaafdd1c3e7fcf2e
block/loop: make loop cgroup aware

loop block device handles IO in a separate thread. The actual IO
dispatched isn't cloned from the IO loop device received, so the
dispatched IO loses the cgroup context.

I'm ignoring buffer IO case now, which is quite complicated.  Making the
loop thread aware cgroup context doesn't really help. The loop device
only writes to a single file. In current writeback cgroup
implementation, the file can only belong to one cgroup.

For direct IO case, we could workaround the issue in theory. For
example, say we assign cgroup1 5M/s BW for loop device and cgroup2
10M/s. We can create a special cgroup for loop thread and assign at
least 15M/s for the underlayer disk. In this way, we correctly throttle
the two cgroups. But this is tricky to setup.

This patch tries to address the issue. We record bio's css in loop
command. When loop thread is handling the command, we then use the API
provided in patch 1 to set the css for current task. The bio layer will
use the css for new IO (from patch 3).

Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c
drivers/block/loop.h