mmc: queue: change mqrq_cur and mqrq_pre to mq qdepth
PATCH 3/5 mmc: queue: change mqrq_cur and mqrq_pre to mq qdepth
Use qdepth for mmc request fetching. Currently the request fetching mechanism indicate the qdepth is only 2.
Signed-off-by Chuanxiao Dong <[email protected]>
--- drivers/mmc/card/block.c | 43 ++++++---- drivers/mmc/card/queue.c | 198 ++++++++++++++++++++++------------------------ drivers/mmc/card/queue.h | 8 +- 3 files changed, 128 insertions(+), 121 deletions(-)
drivers/mmc/card/block.c +29 -14
@@ -122,6 +122,7 @@ struct mmc_blk_data {struct device_attribute force_ro;struct device_attribute power_ro_lock;int area_type; +struct mmc_queue *mq_curr; };static DEFINE_MUTEX (open_lock);
@@ -138,6 +139,7 @@ MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");static inline int mmc_blk_part_switch (struct mmc_card *card,struct mmc_blk_data *md);static int get_card_status (struct mmc_card *card,u32 *status,int retries); +static int mmc_blk_issue_rw_rq (struct mmc_queue *mq,struct request *rqc);static inline void mmc_blk_clear_packed (struct mmc_queue_req *mqrq) {
@@ -653,6 +655,13 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,if (mmc_card_mmc (card)) {u8 part_config = card->ext_csd.part_config; +/* +* before switching partition, needs to make +* sure there is no active transferring in previous +* queue +*/ +mmc_blk_issue_rw_rq (main_md->mq_curr,NULL ); + part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK ; part_config |= md->part_type;
@@ -666,6 +675,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card, } main_md->part_curr = md->part_type; + main_md->mq_curr = &md->queue;return 0 ; }
@@ -1827,11 +1837,13 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)const u8 packed_nr =2 ;u8 reqs =0 ; -if (!rqc && !mq->mqrq_prev->req) +if (!rqc && !atomic_read (&mq->active_slots))return 0 ; -if (rqc) +if (rqc) { reqs =mmc_blk_prep_packed_list (mq, rqc); +atomic_inc (&mq->active_slots); + } do { if (rqc) {
@@ -1856,11 +1868,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) }else areq =NULL ; areq =mmc_start_req (card->host, areq, (int *) &status); -if (!areq) { -if (status ==MMC_BLK_NEW_REQUEST ) - mq->flags |=MMC_QUEUE_NEW_REQUEST ; +if (!areq)return 0 ; - } mq_rq = container_of(areq, struct mmc_queue_req, mmc_active); brq = &mq_rq->brq;
@@ -1968,6 +1977,9 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) } }while (ret); +clear_bit_unlock (mq_rq->task_id, &mq->cmdqslot); +atomic_dec (&mq->active_slots); +return 1 ; cmd_abort:
@@ -1982,10 +1994,14 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) } start_new_req: +clear_bit_unlock (mq_rq->task_id, &mq->cmdqslot); +atomic_dec (&mq->active_slots);if (rqc) {if (mmc_card_removed (card)) { rqc->cmd_flags |=REQ_QUIET ;blk_end_request_all (rqc, -EIO ); +clear_bit_unlock (mq->mqrq_cur->task_id, &mq->cmdqslot); +atomic_dec (&mq->active_slots); }else {/* * If current request is packed, it needs to put back.
@@ -2011,7 +2027,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)unsigned long flags;unsigned int cmd_flags = req ? req->cmd_flags :0 ; -if (req && !mq->mqrq_prev->req) +if (!atomic_read (&mq->active_slots))/* claim host only for the first request */ mmc_get_card (card);
@@ -2024,10 +2040,9 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) goto out; } - mq->flags &= ~MMC_QUEUE_NEW_REQUEST ;if (cmd_flags &REQ_DISCARD ) {/* complete ongoing async transfer before issuing discard */ -if (card->host->areq) +if (atomic_read (&mq->active_slots))mmc_blk_issue_rw_rq (mq,NULL );if (req->cmd_flags &REQ_SECURE ) ret =mmc_blk_issue_secdiscard_rq (mq, req);
@@ -2035,11 +2050,11 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ret =mmc_blk_issue_discard_rq (mq, req); }else if (cmd_flags &REQ_FLUSH ) {/* complete ongoing async transfer before issuing flush */ -if (card->host->areq) +if (atomic_read (&mq->active_slots))mmc_blk_issue_rw_rq (mq,NULL ); ret =mmc_blk_issue_flush (mq, req); }else { -if (!req && host->areq) { +if (!req && (atomic_read (&mq->active_slots) ==1 )) {spin_lock_irqsave (&host->context_info.lock, flags); host->context_info.is_waiting_last_req = true;spin_unlock_irqrestore (&host->context_info.lock, flags);
@@ -2048,13 +2063,12 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) } out: -if ((!req && !(mq->flags &MMC_QUEUE_NEW_REQUEST )) || - (cmd_flags &MMC_REQ_SPECIAL_MASK )) +if (!atomic_read (&mq->active_slots))/* * 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'. +* the 'mmc_blk_issue_rq'. */ mmc_put_card (card);return ret;
@@ -2436,6 +2450,7 @@ static int mmc_blk_probe(struct device *dev) md =mmc_blk_alloc (card);if (IS_ERR (md))return PTR_ERR (md); + md->mq_curr = &md->queue;string_get_size ((u64 )get_capacity (md->disk) <<9 ,STRING_UNITS_2 , cap_str,sizeof (cap_str));
drivers/mmc/card/queue.c +94 -104
292 lines not on this page · raw message
drivers/mmc/card/queue.h +5 -3
@@ -42,6 +42,7 @@ struct mmc_queue_req {struct mmc_async_req mmc_active;enum mmc_packed_type cmd_type;struct mmc_packed *packed; +int task_id; };struct mmc_queue {
@@ -50,14 +51,15 @@ struct mmc_queue {struct semaphore thread_sem;unsigned int flags;#define MMC_QUEUE_SUSPENDED (1 << 0) -#define MMC_QUEUE_NEW_REQUEST (1 << 1)int (*issue_fn)(struct mmc_queue *,struct request *);void *data;struct request_queue *queue; -struct mmc_queue_req mqrq[2 ]; +struct mmc_queue_req *mqrq;struct mmc_queue_req *mqrq_cur; -struct mmc_queue_req *mqrq_prev; +unsigned long cmdqslot; +unsigned long qdepth; +atomic_t active_slots; }; extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
Signature · 1 line
1.7.10.4