lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ