diff options
| -rw-r--r-- | drivers/mmc/core/block.c | 10 | ||||
| -rw-r--r-- | include/linux/mmc/card.h | 1 |
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index aef1185f383d..14f3fdb8c6bb 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c | |||
| @@ -2112,7 +2112,7 @@ static void mmc_blk_mq_req_done(struct mmc_request *mrq) | |||
| 2112 | if (waiting) | 2112 | if (waiting) |
| 2113 | wake_up(&mq->wait); | 2113 | wake_up(&mq->wait); |
| 2114 | else | 2114 | else |
| 2115 | kblockd_schedule_work(&mq->complete_work); | 2115 | queue_work(mq->card->complete_wq, &mq->complete_work); |
| 2116 | 2116 | ||
| 2117 | return; | 2117 | return; |
| 2118 | } | 2118 | } |
| @@ -2924,6 +2924,13 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
| 2924 | 2924 | ||
| 2925 | mmc_fixup_device(card, mmc_blk_fixups); | 2925 | mmc_fixup_device(card, mmc_blk_fixups); |
| 2926 | 2926 | ||
| 2927 | card->complete_wq = alloc_workqueue("mmc_complete", | ||
| 2928 | WQ_MEM_RECLAIM | WQ_HIGHPRI, 0); | ||
| 2929 | if (unlikely(!card->complete_wq)) { | ||
| 2930 | pr_err("Failed to create mmc completion workqueue"); | ||
| 2931 | return -ENOMEM; | ||
| 2932 | } | ||
| 2933 | |||
| 2927 | md = mmc_blk_alloc(card); | 2934 | md = mmc_blk_alloc(card); |
| 2928 | if (IS_ERR(md)) | 2935 | if (IS_ERR(md)) |
| 2929 | return PTR_ERR(md); | 2936 | return PTR_ERR(md); |
| @@ -2987,6 +2994,7 @@ static void mmc_blk_remove(struct mmc_card *card) | |||
| 2987 | pm_runtime_put_noidle(&card->dev); | 2994 | pm_runtime_put_noidle(&card->dev); |
| 2988 | mmc_blk_remove_req(md); | 2995 | mmc_blk_remove_req(md); |
| 2989 | dev_set_drvdata(&card->dev, NULL); | 2996 | dev_set_drvdata(&card->dev, NULL); |
| 2997 | destroy_workqueue(card->complete_wq); | ||
| 2990 | } | 2998 | } |
| 2991 | 2999 | ||
| 2992 | static int _mmc_blk_suspend(struct mmc_card *card) | 3000 | static int _mmc_blk_suspend(struct mmc_card *card) |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index de7377815b6b..8ef330027b13 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -308,6 +308,7 @@ struct mmc_card { | |||
| 308 | unsigned int nr_parts; | 308 | unsigned int nr_parts; |
| 309 | 309 | ||
| 310 | unsigned int bouncesz; /* Bounce buffer size */ | 310 | unsigned int bouncesz; /* Bounce buffer size */ |
| 311 | struct workqueue_struct *complete_wq; /* Private workqueue */ | ||
| 311 | }; | 312 | }; |
| 312 | 313 | ||
| 313 | static inline bool mmc_large_sector(struct mmc_card *card) | 314 | static inline bool mmc_large_sector(struct mmc_card *card) |
