diff mbox series

mmc: block: use REQ_HIPRI flag to complete request directly in own complete workqueue

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

Commit Message

liu xiang Jan. 21, 2021, 8:13 a.m. UTC
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(-)

Comments

Ulf Hansson Feb. 5, 2021, 2:24 p.m. UTC | #1
+ 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 mbox series

Patch

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);
 }