[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y6DWGBQSP/DA7apC@slm.duckdns.org>
Date: Mon, 19 Dec 2022 11:22:32 -1000
From: Tejun Heo <tj@...nel.org>
To: Jinke Han <hanjinke.666@...edance.com>
Cc: josef@...icpanda.com, axboe@...nel.dk, cgroups@...r.kernel.org,
linux-block@...r.kernel.org, linux-kernel@...r.kernel.org,
yinxin.x@...edance.com
Subject: Re: [PATCH] blk-throtl: Introduce sync and async queues for
blk-throtl
Hello,
This looks generally fine to me. Some nits below.
> +static inline struct bio *throtl_qnode_bio_peek(struct throtl_qnode *qn)
> +{
> + struct bio *bio1, *bio2;
> +
> + /* qn for read ios */
> + if (qn->dispatch_sync_cnt == UINT_MAX)
> + return bio_list_peek(&qn->bios[SYNC]);
> +
> + /* qn for write ios */
> + bio1 = bio_list_peek(&qn->bios[SYNC]);
> + bio2 = bio_list_peek(&qn->bios[ASYNC]);
> +
> + if (bio1 && bio2) {
> + if (qn->dispatch_sync_cnt == THROTL_SYNC_FACTOR)
> + return bio2;
> + return bio1;
> + }
> +
> + return bio1 ?: bio2;
> +}
Wouldn't it be simpler to write:
if (qn->dispatch_sync_count < THROTL_SYNC_FACTOR)
return bio1 ?: bio2;
else
return bio2 ?: bio1;
> +/**
> + * throtl_qnode_bio_pop: pop a bio from a qnode
> + * @qn: the qnode to pop a bio from
> + *
> + * For read io qn, just pop bio from sync queu and return.
> + * For write io qn, the target queue to pop was determined by the dispatch_sync_cnt.
> + * Try to pop bio from target queue, fetch the bio and return when it is not empty.
> + * If the target queue empty, pop bio from other queue instead.
> + */
> +static inline struct bio *throtl_qnode_bio_pop(struct throtl_qnode *qn)
> +{
> + struct bio *bio;
> +
> + /* qn for read ios */
> + if (qn->dispatch_sync_cnt == UINT_MAX)
> + return bio_list_pop(&qn->bios[SYNC]);
> +
> + /* try to dispatch sync io */
> + if (qn->dispatch_sync_cnt < THROTL_SYNC_FACTOR) {
> + bio = bio_list_pop(&qn->bios[SYNC]);
> + if (bio) {
> + qn->dispatch_sync_cnt++;
> + return bio;
> + }
> + bio = bio_list_pop(&qn->bios[ASYNC]);
> + qn->dispatch_sync_cnt = 0;
> + return bio;
> + }
> +
> + /* try to dispatch async io */
> + bio = bio_list_pop(&qn->bios[ASYNC]);
> + if (bio) {
> + qn->dispatch_sync_cnt = 0;
> + return bio;
> + }
> + bio = bio_list_pop(&qn->bios[SYNC]);
> +
> + return bio;
> +}
This also seems like it can be simplified a bit.
Thanks.
--
tejun
Powered by blists - more mailing lists