Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b4c38f4 authored by Jaegeuk Kim's avatar Jaegeuk Kim Committed by Gerrit - the friendly Code Review server
Browse files

block, ice, cfq: support back/front merges and update req->__dun



<4>[136765.870673] c6   4967 ------------[ cut here ]------------
<4>[136765.870717] c6   4967 WARNING: at block/blk-core.c:1534
<4>[136765.871328] c6   4967 [<ffffff8aaceddec0>] bio_attempt_front_merge+0x23c/0x280
<4>[136765.871335] c6   4967 [<ffffff8aacedd16c>] blk_queue_bio+0x314/0xaa8
<4>[136765.871344] c6   4967 [<ffffff8aaced6f68>] generic_make_request+0xfc/0x330
<4>[136765.871351] c6   4967 [<ffffff8aaced6cec>] submit_bio+0x15c/0x2dc
<4>[136765.871362] c6   4967 [<ffffff8aacdfeaf8>] __submit_bio+0x46c/0x4e0
<4>[136765.871371] c6   4967 [<ffffff8aace0abe8>] f2fs_mpage_readpages+0x57c/0x7e4

Assuming that this encrypted bio is mergeable,

blk_queue_bio()
  blk_attempt_plug_merge() = false, given by blk_try_merge()=ELEVATOR_NO_MERGE
  el_ret = elv_merge()
      if (q->last_merge)
          elv_bio_merge_ok() = true
          blk_try_merge() = ELEVATOR_NO_MERGE;
      }
      __rq = elv_rqhash_find();
      if (__rq = false && elv_bio_merge_ok() = true)
      e->type->ops.elevator_merge_fn() -- cfq_merge()
          elv_bio_merge_ok() = true
      return ELEVATOR_FRONT_MERGE
  if (el_ret == ELEVATOR_FRONT_MERGE)
     bio_attempt_front_merge()
         WARN_ON(dun exists)

So, it should update req->__dun having correct ICE configuration.

Bug: 118824609
Bug: 119454809
Change-Id: Ic79f9474b56b2b911c9083c3a80f3e686bb432bd
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@google.com>
[stummala@codeaurora.org: Fix merge conflicts]
Signed-off-by: default avatarSahitya Tummala <stummala@codeaurora.org>
parent 248d8d94
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1431,6 +1431,9 @@ static struct request *blk_old_get_request(struct request_queue *q,
	/* q->queue_lock is unlocked at this point */
	rq->__data_len = 0;
	rq->__sector = (sector_t) -1;
#ifdef CONFIG_PFK
	rq->__dun = 0;
#endif
	rq->bio = rq->biotail = NULL;
	return rq;
}
@@ -1655,7 +1658,7 @@ bool bio_attempt_front_merge(struct request_queue *q, struct request *req,
	req->bio = bio;

#ifdef CONFIG_PFK
	WARN_ON(req->__dun || bio->bi_iter.bi_dun);
	req->__dun = bio->bi_iter.bi_dun;
#endif
	req->__sector = bio->bi_iter.bi_sector;
	req->__data_len += bio->bi_iter.bi_size;
+14 −10
Original line number Diff line number Diff line
@@ -505,6 +505,8 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req,
	if (blk_integrity_rq(req) &&
	    integrity_req_gap_back_merge(req, bio))
		return 0;
	if (blk_try_merge(req, bio) != ELEVATOR_BACK_MERGE)
		return 0;
	if (blk_rq_sectors(req) + bio_sectors(bio) >
	    blk_rq_get_max_sectors(req, blk_rq_pos(req))) {
		req_set_nomerge(q, req);
@@ -527,6 +529,8 @@ int ll_front_merge_fn(struct request_queue *q, struct request *req,
	if (blk_integrity_rq(req) &&
	    integrity_req_gap_front_merge(req, bio))
		return 0;
	if (blk_try_merge(req, bio) != ELEVATOR_FRONT_MERGE)
		return 0;
	if (blk_rq_sectors(req) + bio_sectors(bio) >
	    blk_rq_get_max_sectors(req, bio->bi_iter.bi_sector)) {
		req_set_nomerge(q, req);
@@ -837,24 +841,24 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
	if (rq->write_hint != bio->bi_write_hint)
		return false;

	if (crypto_not_mergeable(rq->bio, bio))
		return false;

	return true;
}

enum elv_merge blk_try_merge(struct request *rq, struct bio *bio)
{
#ifdef CONFIG_PFK
	if (blk_rq_dun(rq) || bio_dun(bio))
		return ELEVATOR_NO_MERGE;
#endif
	if (req_op(rq) == REQ_OP_DISCARD &&
	    queue_max_discard_segments(rq->q) > 1)
	    queue_max_discard_segments(rq->q) > 1) {
		return ELEVATOR_DISCARD_MERGE;
	else if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector)
	} else if (blk_rq_pos(rq) + blk_rq_sectors(rq) ==
						bio->bi_iter.bi_sector) {
		if (crypto_not_mergeable(rq->bio, bio))
			return ELEVATOR_NO_MERGE;
		return ELEVATOR_BACK_MERGE;
	else if (blk_rq_pos(rq) - bio_sectors(bio) == bio->bi_iter.bi_sector)
	} else if (blk_rq_pos(rq) - bio_sectors(bio) ==
						bio->bi_iter.bi_sector) {
		if (crypto_not_mergeable(bio, rq->bio))
			return ELEVATOR_NO_MERGE;
		return ELEVATOR_FRONT_MERGE;
	}
	return ELEVATOR_NO_MERGE;
}