public inbox for linux-mmc@vger.kernel.org
 help / color / mirror / Atom feed
From: Ritesh Harjani <riteshh@codeaurora.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>,
	linux-mmc <linux-mmc@vger.kernel.org>,
	Alex Lemberg <alex.lemberg@sandisk.com>,
	Mateusz Nowak <mateusz.nowak@intel.com>,
	Yuliy Izrailov <Yuliy.Izrailov@sandisk.com>,
	Jaehoon Chung <jh80.chung@samsung.com>,
	Dong Aisheng <dongas86@gmail.com>,
	Das Asutosh <asutoshd@codeaurora.org>,
	Zhangfei Gao <zhangfei.gao@gmail.com>,
	Dorfman Konstantin <kdorfman@codeaurora.org>,
	David Griego <david.griego@linaro.org>,
	Sahitya Tummala <stummala@codeaurora.org>,
	Venu Byravarasu <vbyravarasu@nvidia.com>,
	Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH V7 01/25] mmc: queue: Fix queue thread wake-up
Date: Mon, 28 Nov 2016 09:02:47 +0530	[thread overview]
Message-ID: <5bdc24b0-61ee-b245-0d91-7d8953505d17@codeaurora.org> (raw)
In-Reply-To: <1480068442-5169-2-git-send-email-adrian.hunter@intel.com>



On 11/25/2016 3:36 PM, Adrian Hunter wrote:
> The only time the driver sleeps expecting to be woken upon the arrival of
> a new request, is when the dispatch queue is empty. The only time that it
> is known whether the dispatch queue is empty is after NULL is returned
> from blk_fetch_request() while under the queue lock.
>
> Recognizing those facts, simplify the synchronization between the queue
> thread and the request function. A couple of flags tell the request
> function what to do, and the queue lock and barriers associated with
> wake-ups ensure synchronization.
>
> The result is simpler and allows the removal of the context_info lock.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>

Looks good!!
Reviewed-by: Harjani Ritesh <riteshh@codeaurora.org>

Regards
Ritesh

> ---
>  drivers/mmc/card/block.c |  7 -------
>  drivers/mmc/card/queue.c | 35 +++++++++++++++++++++--------------
>  drivers/mmc/card/queue.h |  1 +
>  drivers/mmc/core/core.c  |  6 ------
>  include/linux/mmc/host.h |  2 --
>  5 files changed, 22 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 6618126fcb9f..f8e51640596e 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -2193,8 +2193,6 @@ int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
>  	int ret;
>  	struct mmc_blk_data *md = mq->blkdata;
>  	struct mmc_card *card = md->queue.card;
> -	struct mmc_host *host = card->host;
> -	unsigned long flags;
>  	bool req_is_special = mmc_req_is_special(req);
>
>  	if (req && !mq->mqrq_prev->req)
> @@ -2227,11 +2225,6 @@ int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
>  			mmc_blk_issue_rw_rq(mq, NULL);
>  		ret = mmc_blk_issue_flush(mq, req);
>  	} else {
> -		if (!req && host->areq) {
> -			spin_lock_irqsave(&host->context_info.lock, flags);
> -			host->context_info.is_waiting_last_req = true;
> -			spin_unlock_irqrestore(&host->context_info.lock, flags);
> -		}
>  		ret = mmc_blk_issue_rw_rq(mq, req);
>  	}
>
> diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
> index 3f6a2463ab30..c4ac4b8a1a98 100644
> --- a/drivers/mmc/card/queue.c
> +++ b/drivers/mmc/card/queue.c
> @@ -53,6 +53,7 @@ static int mmc_queue_thread(void *d)
>  {
>  	struct mmc_queue *mq = d;
>  	struct request_queue *q = mq->queue;
> +	struct mmc_context_info *cntx = &mq->card->host->context_info;
>
>  	current->flags |= PF_MEMALLOC;
>
> @@ -63,6 +64,19 @@ static int mmc_queue_thread(void *d)
>  		spin_lock_irq(q->queue_lock);
>  		set_current_state(TASK_INTERRUPTIBLE);
>  		req = blk_fetch_request(q);
> +		mq->asleep = false;
> +		cntx->is_waiting_last_req = false;
> +		cntx->is_new_req = false;
> +		if (!req) {
> +			/*
> +			 * Dispatch queue is empty so set flags for
> +			 * mmc_request_fn() to wake us up.
> +			 */
> +			if (mq->mqrq_prev->req)
> +				cntx->is_waiting_last_req = true;
> +			else
> +				mq->asleep = true;
> +		}
>  		mq->mqrq_cur->req = req;
>  		spin_unlock_irq(q->queue_lock);
>
> @@ -115,7 +129,6 @@ static void mmc_request_fn(struct request_queue *q)
>  {
>  	struct mmc_queue *mq = q->queuedata;
>  	struct request *req;
> -	unsigned long flags;
>  	struct mmc_context_info *cntx;
>
>  	if (!mq) {
> @@ -127,19 +140,13 @@ static void mmc_request_fn(struct request_queue *q)
>  	}
>
>  	cntx = &mq->card->host->context_info;
> -	if (!mq->mqrq_cur->req && mq->mqrq_prev->req) {
> -		/*
> -		 * New MMC request arrived when MMC thread may be
> -		 * blocked on the previous request to be complete
> -		 * with no current request fetched
> -		 */
> -		spin_lock_irqsave(&cntx->lock, flags);
> -		if (cntx->is_waiting_last_req) {
> -			cntx->is_new_req = true;
> -			wake_up_interruptible(&cntx->wait);
> -		}
> -		spin_unlock_irqrestore(&cntx->lock, flags);
> -	} else if (!mq->mqrq_cur->req && !mq->mqrq_prev->req)
> +
> +	if (cntx->is_waiting_last_req) {
> +		cntx->is_new_req = true;
> +		wake_up_interruptible(&cntx->wait);
> +	}
> +
> +	if (mq->asleep)
>  		wake_up_process(mq->thread);
>  }
>
> diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
> index 334c9306070f..0e8133c626c9 100644
> --- a/drivers/mmc/card/queue.h
> +++ b/drivers/mmc/card/queue.h
> @@ -58,6 +58,7 @@ struct mmc_queue {
>  	unsigned int		flags;
>  #define MMC_QUEUE_SUSPENDED	(1 << 0)
>  #define MMC_QUEUE_NEW_REQUEST	(1 << 1)
> +	bool			asleep;
>  	struct mmc_blk_data	*blkdata;
>  	struct request_queue	*queue;
>  	struct mmc_queue_req	mqrq[2];
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index f39397f7c8dc..dc1f27ee50b8 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -504,18 +504,14 @@ static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host,
>  	struct mmc_command *cmd;
>  	struct mmc_context_info *context_info = &host->context_info;
>  	enum mmc_blk_status status;
> -	unsigned long flags;
>
>  	while (1) {
>  		wait_event_interruptible(context_info->wait,
>  				(context_info->is_done_rcv ||
>  				 context_info->is_new_req));
> -		spin_lock_irqsave(&context_info->lock, flags);
>  		context_info->is_waiting_last_req = false;
> -		spin_unlock_irqrestore(&context_info->lock, flags);
>  		if (context_info->is_done_rcv) {
>  			context_info->is_done_rcv = false;
> -			context_info->is_new_req = false;
>  			cmd = mrq->cmd;
>
>  			if (!cmd->error || !cmd->retries ||
> @@ -534,7 +530,6 @@ static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host,
>  				continue; /* wait for done/new event again */
>  			}
>  		} else if (context_info->is_new_req) {
> -			context_info->is_new_req = false;
>  			if (!next_req)
>  				return MMC_BLK_NEW_REQUEST;
>  		}
> @@ -3016,7 +3011,6 @@ void mmc_unregister_pm_notifier(struct mmc_host *host)
>   */
>  void mmc_init_context_info(struct mmc_host *host)
>  {
> -	spin_lock_init(&host->context_info.lock);
>  	host->context_info.is_new_req = false;
>  	host->context_info.is_done_rcv = false;
>  	host->context_info.is_waiting_last_req = false;
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 2a6418d0c343..bcf6d252ec67 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -197,14 +197,12 @@ struct mmc_slot {
>   * @is_new_req		wake up reason was new request
>   * @is_waiting_last_req	mmc context waiting for single running request
>   * @wait		wait queue
> - * @lock		lock to protect data fields
>   */
>  struct mmc_context_info {
>  	bool			is_done_rcv;
>  	bool			is_new_req;
>  	bool			is_waiting_last_req;
>  	wait_queue_head_t	wait;
> -	spinlock_t		lock;
>  };
>
>  struct regulator;
>

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

  parent reply	other threads:[~2016-11-28  3:32 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-25 10:06 [PATCH V7 00/25] mmc: mmc: Add Software Command Queuing Adrian Hunter
2016-11-25 10:06 ` [PATCH V7 01/25] mmc: queue: Fix queue thread wake-up Adrian Hunter
2016-11-25 14:37   ` Linus Walleij
2016-11-28  3:32   ` Ritesh Harjani [this message]
2016-11-25 10:06 ` [PATCH V7 02/25] mmc: queue: Factor out mmc_queue_alloc_bounce_bufs() Adrian Hunter
2016-11-25 14:38   ` Linus Walleij
2016-11-28  3:36   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 03/25] mmc: queue: Factor out mmc_queue_alloc_bounce_sgs() Adrian Hunter
2016-11-25 14:39   ` Linus Walleij
2016-11-28  3:48   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 04/25] mmc: queue: Factor out mmc_queue_alloc_sgs() Adrian Hunter
2016-11-25 14:41   ` Linus Walleij
2016-11-28  3:49   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 05/25] mmc: queue: Factor out mmc_queue_reqs_free_bufs() Adrian Hunter
2016-11-25 14:42   ` Linus Walleij
2016-11-28  3:50   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 06/25] mmc: queue: Introduce queue depth Adrian Hunter
2016-11-25 14:43   ` Linus Walleij
2016-11-25 17:20     ` Adrian Hunter
2016-11-28  4:19   ` Ritesh Harjani
2016-11-28 12:45     ` Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 07/25] mmc: queue: Use queue depth to allocate and free Adrian Hunter
2016-11-28  4:21   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 08/25] mmc: queue: Allocate queue of size qdepth Adrian Hunter
2016-11-28  4:22   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 09/25] mmc: mmc: Add Command Queue definitions Adrian Hunter
2016-11-28  4:29   ` Ritesh Harjani
2016-11-28 13:08     ` Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 10/25] mmc: mmc: Add functions to enable / disable the Command Queue Adrian Hunter
2016-11-28  4:36   ` Ritesh Harjani
2016-11-28 13:23     ` Adrian Hunter
2016-11-28 14:00       ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 11/25] mmc: mmc_test: Disable Command Queue while mmc_test is used Adrian Hunter
2016-11-28  4:40   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 12/25] mmc: block: Disable Command Queue while RPMB " Adrian Hunter
2016-11-28  4:46   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 13/25] mmc: core: Do not prepare a new request twice Adrian Hunter
2016-11-28  4:48   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 14/25] mmc: core: Export mmc_retune_hold() and mmc_retune_release() Adrian Hunter
2016-11-28  4:49   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 15/25] mmc: block: Factor out mmc_blk_requeue() Adrian Hunter
2016-11-28  4:51   ` Ritesh Harjani
2016-11-25 10:07 ` [PATCH V7 16/25] mmc: block: Fix 4K native sector check Adrian Hunter
2016-11-25 14:51   ` Linus Walleij
2016-11-25 10:07 ` [PATCH V7 17/25] mmc: block: Use local var for mqrq_cur Adrian Hunter
2016-11-25 14:52   ` Linus Walleij
2016-11-25 10:07 ` [PATCH V7 18/25] mmc: block: Pass mqrq to mmc_blk_prep_packed_list() Adrian Hunter
2016-11-25 14:53   ` Linus Walleij
2016-11-25 10:07 ` [PATCH V7 19/25] mmc: block: Introduce queue semantics Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 20/25] mmc: queue: Share mmc request array between partitions Adrian Hunter
2016-11-25 15:01   ` Linus Walleij
2016-11-29 10:14     ` Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 21/25] mmc: queue: Add a function to control wake-up on new requests Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 22/25] mmc: block: Add Software Command Queuing Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 23/25] mmc: mmc: Enable " Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 24/25] mmc: sdhci-pci: Enable Software Command Queuing for some Intel controllers Adrian Hunter
2016-11-25 10:07 ` [PATCH V7 25/25] mmc: sdhci-acpi: " Adrian Hunter
2016-11-25 15:15   ` Linus Walleij
2016-11-28 13:55     ` Adrian Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5bdc24b0-61ee-b245-0d91-7d8953505d17@codeaurora.org \
    --to=riteshh@codeaurora.org \
    --cc=Yuliy.Izrailov@sandisk.com \
    --cc=adrian.hunter@intel.com \
    --cc=alex.lemberg@sandisk.com \
    --cc=asutoshd@codeaurora.org \
    --cc=david.griego@linaro.org \
    --cc=dongas86@gmail.com \
    --cc=jh80.chung@samsung.com \
    --cc=kdorfman@codeaurora.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=mateusz.nowak@intel.com \
    --cc=stummala@codeaurora.org \
    --cc=ulf.hansson@linaro.org \
    --cc=vbyravarasu@nvidia.com \
    --cc=zhangfei.gao@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox