dm: avoid indirect call in __dm_make_request
Mikulas Patocka
maintainerPATCH 1/5 dm: avoid indirect call in __dm_make_request
Indirect calls are inefficient because of retpolines that are used for spectre workaround. This patch replaces an indirect call with a condition (that can be predicted by the branch predictor).
Signed-off-by Mikulas Patocka <[email protected]>
--- drivers/md/dm.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-)
drivers/md/dm.c +6 -21
@@ -1687,8 +1687,7 @@ out:typedef blk_qc_t (process_bio_fn )(struct mapped_device *,struct dm_table *,struct bio *); -static blk_qc_t __dm_make_request (struct request_queue *q,struct bio *bio, -process_bio_fn process_bio) +static blk_qc_t dm_make_request (struct request_queue *q,struct bio *bio) {struct mapped_device *md = q->queuedata;blk_qc_t ret =BLK_QC_T_NONE ;
@@ -1708,26 +1707,15 @@ static blk_qc_t __dm_make_request(structreturn ret; } - ret =process_bio (md, map, bio); +if (dm_get_md_type (md) ==DM_TYPE_NVME_BIO_BASED ) + ret =__process_bio (md, map, bio); +else + ret =__split_and_process_bio (md, map, bio);dm_put_live_table (md, srcu_idx);return ret; } -/* -* The request function that remaps the bio to one target and -* splits off any remainder. -*/ -static blk_qc_t dm_make_request (struct request_queue *q,struct bio *bio) -{ -return __dm_make_request (q, bio, __split_and_process_bio); -} - -static blk_qc_t dm_make_request_nvme (struct request_queue *q,struct bio *bio) -{ -return __dm_make_request (q, bio, __process_bio); -} -static int dm_any_congested (void *congested_data,int bdi_bits) {int r = bdi_bits;
@@ -2235,12 +2223,9 @@ int dm_setup_md_queue(struct mapped_devibreak ;case DM_TYPE_BIO_BASED :case DM_TYPE_DAX_BIO_BASED : -dm_init_normal_md_queue (md); -blk_queue_make_request (md->queue, dm_make_request); -break ;case DM_TYPE_NVME_BIO_BASED :dm_init_normal_md_queue (md); -blk_queue_make_request (md->queue, dm_make_request_nvme); +blk_queue_make_request (md->queue, dm_make_request);break ;case DM_TYPE_NONE :WARN_ON_ONCE (true);