diff mbox

mmc: block: fix the host's claim-release in special request

Message ID 001101ce207b$91e60440$b5b20cc0$%jun@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Seungwon Jeon March 14, 2013, 6:17 a.m. UTC
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)
...

Reported-by: Johan Rudholm <jrudholm@gmail.com>
Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
---
 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(-)

Comments

Johan Rudholm March 14, 2013, 11:56 a.m. UTC | #1
Hi Seungwon,

2013/3/14 Seungwon Jeon <tgih.jun@samsung.com>:
> 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)
> ...
>
> Reported-by: Johan Rudholm <jrudholm@gmail.com>
> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>

Thank you for the quick response and fix! This fixes the problem. So
please include my

Tested-by: Johan Rudholm <johan.rudholm@stericsson.com>

Kind regards, Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ulf Hansson March 14, 2013, 2:49 p.m. UTC | #2
On 14 March 2013 12:56, Johan Rudholm <jrudholm@gmail.com> wrote:
> Hi Seungwon,
>
> 2013/3/14 Seungwon Jeon <tgih.jun@samsung.com>:
>> 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)
>> ...
>>
>> Reported-by: Johan Rudholm <jrudholm@gmail.com>
>> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
>
> Thank you for the quick response and fix! This fixes the problem. So
> please include my
>
> Tested-by: Johan Rudholm <johan.rudholm@stericsson.com>
>
> Kind regards, Johan
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Ball March 22, 2013, 5:05 p.m. UTC | #3
Hi,

On Thu, Mar 14 2013, Ulf Hansson wrote:
>> 2013/3/14 Seungwon Jeon <tgih.jun@samsung.com>:
>>> 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)
>>> ...
>>>
>>> Reported-by: Johan Rudholm <jrudholm@gmail.com>
>>> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
>>
>> Thank you for the quick response and fix! This fixes the problem. So
>> please include my
>>
>> Tested-by: Johan Rudholm <johan.rudholm@stericsson.com>
>
> 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.
diff mbox

Patch

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 5bab73b..71c5ce7 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -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;
 }
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
index fa4e44e..9447a0e 100644
--- a/drivers/mmc/card/queue.c
+++ b/drivers/mmc/card/queue.c
@@ -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.
  */
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
index 031bf63..5752d50 100644
--- a/drivers/mmc/card/queue.h
+++ b/drivers/mmc/card/queue.h
@@ -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;