Merge "mmc: card: use blk_cleanup_queue() during shutdown/reboot"

This commit is contained in:
Linux Build Service Account 2017-01-28 00:46:51 -08:00 committed by Gerrit - the friendly Code Review server
commit c6eacb9bdb
2 changed files with 12 additions and 8 deletions

View file

@ -4068,7 +4068,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
INIT_LIST_HEAD(&md->part); INIT_LIST_HEAD(&md->part);
md->usage = 1; md->usage = 1;
ret = mmc_init_queue(&md->queue, card, &md->lock, subname, area_type); ret = mmc_init_queue(&md->queue, card, NULL, subname, area_type);
if (ret) if (ret)
goto err_putdisk; goto err_putdisk;

View file

@ -724,15 +724,13 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait)
if (wait) { if (wait) {
/* /*
* After blk_stop_queue is called, wait for all * After blk_cleanup_queue is called, wait for all
* active_reqs to complete. * active_reqs to complete.
* Then wait for cmdq thread to exit before calling * Then wait for cmdq thread to exit before calling
* cmdq shutdown to avoid race between issuing * cmdq shutdown to avoid race between issuing
* requests and shutdown of cmdq. * requests and shutdown of cmdq.
*/ */
spin_lock_irqsave(q->queue_lock, flags); blk_cleanup_queue(q);
blk_stop_queue(q);
spin_unlock_irqrestore(q->queue_lock, flags);
if (host->cmdq_ctx.active_reqs) if (host->cmdq_ctx.active_reqs)
wait_for_completion( wait_for_completion(
@ -757,9 +755,15 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait)
} }
if (!(test_and_set_bit(MMC_QUEUE_SUSPENDED, &mq->flags))) { if (!(test_and_set_bit(MMC_QUEUE_SUSPENDED, &mq->flags))) {
if (!wait) {
/* suspend/stop the queue in case of suspend */
spin_lock_irqsave(q->queue_lock, flags); spin_lock_irqsave(q->queue_lock, flags);
blk_stop_queue(q); blk_stop_queue(q);
spin_unlock_irqrestore(q->queue_lock, flags); spin_unlock_irqrestore(q->queue_lock, flags);
} else {
/* shutdown the queue in case of shutdown/reboot */
blk_cleanup_queue(q);
}
rc = down_trylock(&mq->thread_sem); rc = down_trylock(&mq->thread_sem);
if (rc && !wait) { if (rc && !wait) {