Skip to content

Commit 4b430d4

Browse files
yibin123-unisocstorulf
authored andcommitted
mmc: block: Fix in_flight[issue_type] value error
For a completed request, after the mmc_blk_mq_complete_rq(mq, req) function is executed, the bitmap_tags corresponding to the request will be cleared, that is, the request will be regarded as idle. If the request is acquired by a different type of process at this time, the issue_type of the request may change. It further caused the value of mq->in_flight[issue_type] to be abnormal, and a large number of requests could not be sent. p1: p2: mmc_blk_mq_complete_rq blk_mq_free_request blk_mq_get_request blk_mq_rq_ctx_init mmc_blk_mq_dec_in_flight mmc_issue_type(mq, req) This strategy can ensure the consistency of issue_type before and after executing mmc_blk_mq_complete_rq. Fixes: 8119697 ("mmc: block: Add blk-mq support") Cc: stable@vger.kernel.org Signed-off-by: Yibin Ding <yibin.ding@unisoc.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Link: https://lore.kernel.org/r/20230802023023.1318134-1-yunlong.xing@unisoc.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent 5def5c1 commit 4b430d4

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

drivers/mmc/core/block.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,14 +2097,14 @@ static void mmc_blk_mq_poll_completion(struct mmc_queue *mq,
20972097
mmc_blk_urgent_bkops(mq, mqrq);
20982098
}
20992099

2100-
static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req)
2100+
static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, enum mmc_issue_type issue_type)
21012101
{
21022102
unsigned long flags;
21032103
bool put_card;
21042104

21052105
spin_lock_irqsave(&mq->lock, flags);
21062106

2107-
mq->in_flight[mmc_issue_type(mq, req)] -= 1;
2107+
mq->in_flight[issue_type] -= 1;
21082108

21092109
put_card = (mmc_tot_in_flight(mq) == 0);
21102110

@@ -2117,6 +2117,7 @@ static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req)
21172117
static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req,
21182118
bool can_sleep)
21192119
{
2120+
enum mmc_issue_type issue_type = mmc_issue_type(mq, req);
21202121
struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req);
21212122
struct mmc_request *mrq = &mqrq->brq.mrq;
21222123
struct mmc_host *host = mq->card->host;
@@ -2136,7 +2137,7 @@ static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req,
21362137
blk_mq_complete_request(req);
21372138
}
21382139

2139-
mmc_blk_mq_dec_in_flight(mq, req);
2140+
mmc_blk_mq_dec_in_flight(mq, issue_type);
21402141
}
21412142

21422143
void mmc_blk_mq_recovery(struct mmc_queue *mq)

0 commit comments

Comments
 (0)