On 19 December 2016 at 14:57, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > Commit e0097cf5f2f1 ("mmc: queue: Fix queue thread wake-up") did not go far > enough. mmc_wait_for_data_req_done() still contains some problems and can > be further simplified. First it should not touch > context_info->is_waiting_last_req because that is a wake-up control used by > the owner of the context. Secondly, it should always return when one of its > wake-up conditions is met because, again, that is contolled by the owner of > the context. > > While the current block driver does not have an issue, these problems were > exposed during testing of the Software Command Queue patches. > > Fixes: e0097cf5f2f1 ("mmc: queue: Fix queue thread wake-up") > Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> Thanks, applied for fixes! Kind regards Uffe > --- > drivers/mmc/core/core.c | 12 +++++------- > 1 file changed, 5 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 543eadd230e5..1076b9d89df3 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -496,8 +496,7 @@ static int __mmc_start_req(struct mmc_host *host, struct mmc_request *mrq) > * Returns enum mmc_blk_status after checking errors. > */ > static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host, > - struct mmc_request *mrq, > - struct mmc_async_req *next_req) > + struct mmc_request *mrq) > { > struct mmc_command *cmd; > struct mmc_context_info *context_info = &host->context_info; > @@ -507,7 +506,7 @@ static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host, > wait_event_interruptible(context_info->wait, > (context_info->is_done_rcv || > context_info->is_new_req)); > - context_info->is_waiting_last_req = false; > + > if (context_info->is_done_rcv) { > context_info->is_done_rcv = false; > cmd = mrq->cmd; > @@ -527,10 +526,9 @@ static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host, > __mmc_start_request(host, mrq); > continue; /* wait for done/new event again */ > } > - } else if (context_info->is_new_req) { > - if (!next_req) > - return MMC_BLK_NEW_REQUEST; > } > + > + return MMC_BLK_NEW_REQUEST; > } > mmc_retune_release(host); > return status; > @@ -660,7 +658,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, > mmc_pre_req(host, areq->mrq); > > if (host->areq) { > - status = mmc_wait_for_data_req_done(host, host->areq->mrq, areq); > + status = mmc_wait_for_data_req_done(host, host->areq->mrq); > if (status == MMC_BLK_NEW_REQUEST) { > if (ret_stat) > *ret_stat = status; > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html