[PATCH RFC 09/39] mmc: queue: Add a function to control wake-up on new requests

Adrian Hunter
2017-02-10T13:45:40Z

Add a function to control wake-up on new requests. This will enable
Software Command Queuing to choose whether or not to queue new
requests immediately or wait for the current task to complete.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
drivers/mmc/core/queue.c | 16 ++++++++++++++++
drivers/mmc/core/queue.h | 2 ++
2 files changed, 18 insertions(+)

diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
index 479638bfb092..9e7e4eb9250c 100644
--- a/drivers/mmc/core/queue.c
+++ b/drivers/mmc/core/queue.c
@@ -97,6 +97,7 @@ static int mmc_queue_thread(void *d)
cntx->is_waiting_last_req = false;
cntx->is_new_req = false;
if (!req) {
+ mq->is_new_req = false;
/*
* Dispatch queue is empty so set flags for
* mmc_request_fn() to wake us up.
@@ -147,6 +148,8 @@ static void mmc_request_fn(struct request_queue *q)
return;
}

+ mq->is_new_req = true;
+
cntx = &mq->card->host->context_info;

if (cntx->is_waiting_last_req) {
@@ -158,6 +161,19 @@ static void mmc_request_fn(struct request_queue *q)
wake_up_process(mq->thread);
}

+void mmc_queue_set_wake(struct mmc_queue *mq, bool wake_me)
+{
+ struct mmc_context_info *cntx = &mq->card->host->context_info;
+ struct request_queue *q = mq->queue;
+
+ if (cntx->is_waiting_last_req != wake_me) {
+ spin_lock_irq(q->queue_lock);
+ cntx->is_waiting_last_req = wake_me;
+ cntx->is_new_req = wake_me && mq->is_new_req;
+ spin_unlock_irq(q->queue_lock);
+ }
+}
+
static struct scatterlist *mmc_alloc_sg(int sg_len)
{
struct scatterlist *sg;
diff --git a/drivers/mmc/core/queue.h b/drivers/mmc/core/queue.h
index 871796c3f406..c9ce0172dd08 100644
--- a/drivers/mmc/core/queue.h
+++ b/drivers/mmc/core/queue.h
@@ -43,6 +43,7 @@ struct mmc_queue {
struct semaphore thread_sem;
bool suspended;
bool asleep;
+ bool is_new_req;
struct mmc_blk_data *blkdata;
struct request_queue *queue;
struct mmc_queue_req *mqrq;
@@ -69,5 +70,6 @@ extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
extern struct mmc_queue_req *mmc_queue_req_find(struct mmc_queue *,
struct request *);
extern void mmc_queue_req_free(struct mmc_queue *, struct mmc_queue_req *);
+extern void mmc_queue_set_wake(struct mmc_queue *, bool);

#endif
--
1.9.1