On Wed, 2 Aug 2023 at 04:33, Yunlong Xing <yunlong.xing@xxxxxxxxxx> wrote: > > From: Yibin Ding <yibin.ding@xxxxxxxxxx> > > 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: 81196976ed94 ("mmc: block: Add blk-mq support") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Yibin Ding <yibin.ding@xxxxxxxxxx> > Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> Applied for fixes, thanks! Kind regards Uffe > --- > changes of v2: Sort local declarations in descending order of > line length > --- > drivers/mmc/core/block.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c > index f701efb1fa78..b6f4be25b31b 100644 > --- a/drivers/mmc/core/block.c > +++ b/drivers/mmc/core/block.c > @@ -2097,14 +2097,14 @@ static void mmc_blk_mq_poll_completion(struct mmc_queue *mq, > mmc_blk_urgent_bkops(mq, mqrq); > } > > -static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req) > +static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, enum mmc_issue_type issue_type) > { > unsigned long flags; > bool put_card; > > spin_lock_irqsave(&mq->lock, flags); > > - mq->in_flight[mmc_issue_type(mq, req)] -= 1; > + mq->in_flight[issue_type] -= 1; > > put_card = (mmc_tot_in_flight(mq) == 0); > > @@ -2117,6 +2117,7 @@ static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req) > static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req, > bool can_sleep) > { > + enum mmc_issue_type issue_type = mmc_issue_type(mq, req); > struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req); > struct mmc_request *mrq = &mqrq->brq.mrq; > 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, > blk_mq_complete_request(req); > } > > - mmc_blk_mq_dec_in_flight(mq, req); > + mmc_blk_mq_dec_in_flight(mq, issue_type); > } > > void mmc_blk_mq_recovery(struct mmc_queue *mq) > -- > 2.25.1 >