Hello, Shaohua.

On Fri, Oct 13, 2017 at 11:10:29AM -0700, Shaohua Li wrote:
> If a bio is throttled and splitted after throttling, the bio could be
> resubmited and enters the throttling again. This will cause part of the
> bio is charged multiple times. If the cgroup has an IO limit, the double
> charge will significantly harm the performance. The bio split becomes
> quite common after arbitrary bio size change.

Missed the patch previously.  Sorry about that.

> Some sort of this patch probably should go into stable since v4.2

Seriously.

> @@ -2130,9 +2130,15 @@ bool blk_throtl_bio(struct request_queue *q, struct 
> blkcg_gq *blkg,
>  
>       WARN_ON_ONCE(!rcu_read_lock_held());
>  
> -     /* see throtl_charge_bio() */
> -     if (bio_flagged(bio, BIO_THROTTLED) || !tg->has_rules[rw])
> +     /*
> +      * see throtl_charge_bio() for BIO_THROTTLED. If a bio is throttled
> +      * against a disk but remapped to other disk, we should throttle it
> +      * again
> +      */
> +     if (bio_flagged(bio, BIO_THROTTLED) || !tg->has_rules[rw] ||
> +         (bio->bi_throttled_disk && bio->bi_throttled_disk == bio->bi_disk))
>               goto out;
> +     bio->bi_throttled_disk = NULL;

So, one question I have is whether we need both BIO_THROTTLED and
bi_throttled_disk.  Can't we replace BIO_THROTTLED w/
bi_throttled_disk?

Thanks.

-- 
tejun

Reply via email to