Re: [PATCH 4/9] blkcg: implement REQ_CGROUP_PUNT
From: Jan Kara <jack@suse.cz>
Date: 2019-06-20 15:37:36
Also in:
linux-btrfs, lkml
On Sat 15-06-19 11:24:48, Tejun Heo wrote:
When a shared kthread needs to issue a bio for a cgroup, doing so synchronously can lead to priority inversions as the kthread can be trapped waiting for that cgroup. This patch implements REQ_CGROUP_PUNT flag which makes submit_bio() punt the actual issuing to a dedicated per-blkcg work item to avoid such priority inversions. This will be used to fix priority inversions in btrfs compression and should be generally useful as we grow filesystem support for comprehensive IO control. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Cc: Chris Mason <clm@fb.com>
...
+bool __blkcg_punt_bio_submit(struct bio *bio)
+{
+ struct blkcg_gq *blkg = bio->bi_blkg;
+
+ /* consume the flag first */
+ bio->bi_opf &= ~REQ_CGROUP_PUNT;
+
+ /* never bounce for the root cgroup */
+ if (!blkg->parent)
+ return false;
+
+ spin_lock_bh(&blkg->async_bio_lock);
+ bio_list_add(&blkg->async_bios, bio);
+ spin_unlock_bh(&blkg->async_bio_lock);
+
+ queue_work(blkcg_punt_bio_wq, &blkg->async_bio_work);
+ return true;
+}
+So does this mean that if there is some inode with lots of dirty data for a blkcg that is heavily throttled, that blkcg can occupy a ton of workers all being throttled in submit_bio()? Or what is constraining a number of workers one blkcg can consume? Honza -- Jan Kara [off-list ref] SUSE Labs, CR