Skip to content

Commit

Permalink
dm: avoid indirect call in __dm_make_request
Browse files Browse the repository at this point in the history
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 <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
  • Loading branch information
Mikulas Patocka authored and Mike Snitzer committed Dec 18, 2018
1 parent cd19181 commit 24113d4
Showing 1 changed file with 6 additions and 23 deletions.
29 changes: 6 additions & 23 deletions drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1696,10 +1696,7 @@ static blk_qc_t __process_bio(struct mapped_device *md,
return ret;
}

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;
Expand All @@ -1719,26 +1716,15 @@ static blk_qc_t __dm_make_request(struct request_queue *q, struct bio *bio,
return 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;
Expand Down Expand Up @@ -2229,12 +2215,9 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
break;
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);
Expand Down

0 comments on commit 24113d4

Please sign in to comment.