block: cleanup the memory stall accounting in submit_bio
Instead of a convoluted chain just check for REQ_OP_READ directly, and keep all the memory stall code together in a single unlikely branch. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
3fdd40861d
commit
760f83ea63
@ -1148,10 +1148,6 @@ EXPORT_SYMBOL_GPL(direct_make_request);
|
|||||||
*/
|
*/
|
||||||
blk_qc_t submit_bio(struct bio *bio)
|
blk_qc_t submit_bio(struct bio *bio)
|
||||||
{
|
{
|
||||||
bool workingset_read = false;
|
|
||||||
unsigned long pflags;
|
|
||||||
blk_qc_t ret;
|
|
||||||
|
|
||||||
if (blkcg_punt_bio_submit(bio))
|
if (blkcg_punt_bio_submit(bio))
|
||||||
return BLK_QC_T_NONE;
|
return BLK_QC_T_NONE;
|
||||||
|
|
||||||
@ -1170,8 +1166,6 @@ blk_qc_t submit_bio(struct bio *bio)
|
|||||||
if (op_is_write(bio_op(bio))) {
|
if (op_is_write(bio_op(bio))) {
|
||||||
count_vm_events(PGPGOUT, count);
|
count_vm_events(PGPGOUT, count);
|
||||||
} else {
|
} else {
|
||||||
if (bio_flagged(bio, BIO_WORKINGSET))
|
|
||||||
workingset_read = true;
|
|
||||||
task_io_account_read(bio->bi_iter.bi_size);
|
task_io_account_read(bio->bi_iter.bi_size);
|
||||||
count_vm_events(PGPGIN, count);
|
count_vm_events(PGPGIN, count);
|
||||||
}
|
}
|
||||||
@ -1187,20 +1181,24 @@ blk_qc_t submit_bio(struct bio *bio)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we're reading data that is part of the userspace
|
* If we're reading data that is part of the userspace workingset, count
|
||||||
* workingset, count submission time as memory stall. When the
|
* submission time as memory stall. When the device is congested, or
|
||||||
* device is congested, or the submitting cgroup IO-throttled,
|
* the submitting cgroup IO-throttled, submission can be a significant
|
||||||
* submission can be a significant part of overall IO time.
|
* part of overall IO time.
|
||||||
*/
|
*/
|
||||||
if (workingset_read)
|
if (unlikely(bio_op(bio) == REQ_OP_READ &&
|
||||||
|
bio_flagged(bio, BIO_WORKINGSET))) {
|
||||||
|
unsigned long pflags;
|
||||||
|
blk_qc_t ret;
|
||||||
|
|
||||||
psi_memstall_enter(&pflags);
|
psi_memstall_enter(&pflags);
|
||||||
|
ret = generic_make_request(bio);
|
||||||
ret = generic_make_request(bio);
|
|
||||||
|
|
||||||
if (workingset_read)
|
|
||||||
psi_memstall_leave(&pflags);
|
psi_memstall_leave(&pflags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return generic_make_request(bio);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(submit_bio);
|
EXPORT_SYMBOL(submit_bio);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user