mmc: block: fix the host's claim-release in special request
PATCH 1/1 mmc: block: fix the host's claim-release in special request
For normal request mmc_blk_issue_rq is called twice with asynchronous transfer(cur and prev). Host's claim and release can be done in each mmc_blk_issue_rq. However, Special request is currently excluded in asynchronous transfer. After special request is finished, if there is no new request, mmc_release_host won't be called in mmc_blk_issue_rq. The problem is founded during mmc_suspend.
[<c0541124>] (__schedule+0x0/0x78c) from [<c05419e8>] (schedule+0x38/0x78) [<c05419b0>] (schedule+0x0/0x78) from [<c03a843c>] (__mmc_claim_host+0xac/0x1b4) [<c03a8390>] (__mmc_claim_host+0x0/0x1b4) from [<c03ac98c>] (mmc_suspend+0x28/0x9c) [<c03ac964>] (mmc_suspend+0x0/0x9c) from [<c03aad24>] (mmc_suspend_host+0xb4/0x194)
...
--- drivers/mmc/card/block.c | 10 ++++++++-- drivers/mmc/card/queue.c | 3 --- drivers/mmc/card/queue.h | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-)
drivers/mmc/card/block.c +8 -2
@@ -1932,8 +1932,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) } out: -if (!req && !(mq->flags &MMC_QUEUE_NEW_REQUEST )) -/* release host only when there are no more requests */ +if (!req && !(mq->flags &MMC_QUEUE_NEW_REQUEST ) || + req && (req->cmd_flags &MMC_REQ_SPECIAL_MASK )) +/* +* Release host when there are no more requests +* and after special request(discard, flush) is done. +* In case sepecial request, there is no reentry to +* the 'mmc_blk_issue_rq' with 'mqrq_prev->req'. +*/ mmc_release_host (card->host);return ret; }
drivers/mmc/card/queue.c +0 -3
@@ -22,9 +22,6 @@#define MMC_QUEUE_BOUNCESZ 65536 - -#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) -/* * Prepare a MMC request. This just filters out odd stuff. */
drivers/mmc/card/queue.h +2 -0
@@ -1,6 +1,8 @@#ifndef MMC_QUEUE_H #define MMC_QUEUE_H +#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) +struct request ;struct task_struct ;
Signature · 1 line
1.7.0.4
Hi Seungwon,
2013/3/14 Seungwon Jeon <[email protected]>:
Quoted 7 lines
For normal request
mmc_blk_issue_rqis called twice with asynchronous transfer(cur and prev). Host's claim and release can be done in eachmmc_blk_issue_rq. However, Special request is currently excluded in asynchronous transfer. After special request is finished, if there is no new request,mmc_release_hostwon't be called inmmc_blk_issue_rq. The problem is founded duringmmc_suspend.
Quoted 8 lines
[<
c0541124>] (__schedule+0x0/0x78c) from [<c05419e8>] (schedule+0x38/0x78) [<c05419b0>] (schedule+0x0/0x78) from [<c03a843c>] (__mmc_claim_host+0xac/0x1b4) [<c03a8390>] (__mmc_claim_host+0x0/0x1b4) from [<c03ac98c>] (mmc_suspend+0x28/0x9c) [<c03ac964>] (mmc_suspend+0x0/0x9c) from [<c03aad24>] (mmc_suspend_host+0xb4/0x194)
...Reported-by Johan Rudholm <[email protected]>Signed-off-by Seungwon Jeon <[email protected]>
Thank you for the quick response and fix! This fixes the problem. So please include my
Kind regards, Johan
Quoted 22 lines · Johan Rudholm
Hi Seungwon,
2013/3/14 Seungwon Jeon <[email protected]>:
Quoted 7 lines
For normal request
mmc_blk_issue_rqis called twice with asynchronous transfer(cur and prev). Host's claim and release can be done in eachmmc_blk_issue_rq. However, Special request is currently excluded in asynchronous transfer. After special request is finished, if there is no new request,mmc_release_hostwon't be called inmmc_blk_issue_rq. The problem is founded duringmmc_suspend.Quoted 8 lines
[<
c0541124>] (__schedule+0x0/0x78c) from [<c05419e8>] (schedule+0x38/0x78) [<c05419b0>] (schedule+0x0/0x78) from [<c03a843c>] (__mmc_claim_host+0xac/0x1b4) [<c03a8390>] (__mmc_claim_host+0x0/0x1b4) from [<c03ac98c>] (mmc_suspend+0x28/0x9c) [<c03ac964>] (mmc_suspend+0x0/0x9c) from [<c03aad24>] (mmc_suspend_host+0xb4/0x194)
...Reported-by Johan Rudholm <[email protected]>Signed-off-by Seungwon Jeon <[email protected]>Thank you for the quick response and fix! This fixes the problem. So please include my
Quoted 7 lines
Tested-by Johan Rudholm <[email protected]>Kind regards, Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Chris, could you send this for the 3.9 rc, since it is a bugfix?
Kind regards
Ulf Hansson
Hi,
Quoted 20 lines · Ulf Hansson
Quoted 20 lines
2013/3/14 Seungwon Jeon <[email protected]>:
Quoted 18 lines
For normal request
mmc_blk_issue_rqis called twice with asynchronous transfer(cur and prev). Host's claim and release can be done in eachmmc_blk_issue_rq. However, Special request is currently excluded in asynchronous transfer. After special request is finished, if there is no new request,mmc_release_hostwon't be called inmmc_blk_issue_rq. The problem is founded duringmmc_suspend.[<
c0541124>] (__schedule+0x0/0x78c) from [<c05419e8>] (schedule+0x38/0x78) [<c05419b0>] (schedule+0x0/0x78) from [<c03a843c>] (__mmc_claim_host+0xac/0x1b4)
[<c03a8390>] (__mmc_claim_host+0x0/0x1b4) from [<c03ac98c>] (mmc_suspend+0x28/0x9c)
[<c03ac964>] (mmc_suspend+0x0/0x9c) from [<c03aad24>] (mmc_suspend_host+0xb4/0x194)
...Reported-by Johan Rudholm <[email protected]>Signed-off-by Seungwon Jeon <[email protected]>
Quoted 6 lines
Quoted 4 lines
Thank you for the quick response and fix! This fixes the problem. So please include my
Tested-by Johan Rudholm <[email protected]>Chris, could you send this for the 3.9 rc, since it is a bugfix?
Thanks, pushed to mmc-next for 3.9-rc.
- Chris.
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child