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