Message ID | 20210121081349.8266-1-liu.xiang@zlingsmart.com |
---|---|
State | New |
Headers | show |
Series | mmc: block: use REQ_HIPRI flag to complete request directly in own complete workqueue | expand |
+ Adrian, Christoph On Thu, 21 Jan 2021 at 09:13, Liu Xiang <liu.xiang@zlingsmart.com> wrote: > > After commit "40d09b53bfc557af7481b9d80f060a7ac9c7d314", request is > completed in softirq. This may cause the system to suffer bad preemptoff > time. > The mmc driver has its own complete workqueue, but it can not work > well now. > The REQ_HIPRI flag can be used to complete request directly in its own > complete workqueue and the preemptoff problem could be avoided. I am trying to understand all of the problem, but I don't quite get it, sorry. Would it be possible for you to extend the description in the commit message a bit? More exactly, what will happen if we tag a request with REQ_HIPRI before completing it? Apologize for my ignorance, but I am currently a bit overwhelmed with work, so I didn't have the time to really look it up myself. > > Signed-off-by: Liu Xiang <liu.xiang@zlingsmart.com> > --- > drivers/mmc/core/block.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c > index 42e27a298..c27239a89 100644 > --- a/drivers/mmc/core/block.c > +++ b/drivers/mmc/core/block.c > @@ -1985,8 +1985,10 @@ static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req) > */ > if (mq->in_recovery) > mmc_blk_mq_complete_rq(mq, req); > - else if (likely(!blk_should_fake_timeout(req->q))) > + else if (likely(!blk_should_fake_timeout(req->q))) { > + req->cmd_flags |= REQ_HIPRI; > blk_mq_complete_request(req); Is there a specific reason why REQ_HIPRI is applicable only for mmc_blk_mq_post_req() case? We have other paths where we complete requests for MMC as well, are those not relevant? > + } > > mmc_blk_mq_dec_in_flight(mq, req); > } > -- > 2.17.1 > Kind regards Uffe
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 42e27a298..c27239a89 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -1985,8 +1985,10 @@ static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req) */ if (mq->in_recovery) mmc_blk_mq_complete_rq(mq, req); - else if (likely(!blk_should_fake_timeout(req->q))) + else if (likely(!blk_should_fake_timeout(req->q))) { + req->cmd_flags |= REQ_HIPRI; blk_mq_complete_request(req); + } mmc_blk_mq_dec_in_flight(mq, req); }
After commit "40d09b53bfc557af7481b9d80f060a7ac9c7d314", request is completed in softirq. This may cause the system to suffer bad preemptoff time. The mmc driver has its own complete workqueue, but it can not work well now. The REQ_HIPRI flag can be used to complete request directly in its own complete workqueue and the preemptoff problem could be avoided. Signed-off-by: Liu Xiang <liu.xiang@zlingsmart.com> --- drivers/mmc/core/block.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)