Loading drivers/mmc/mmc_queue.c +14 −27 Original line number Diff line number Diff line Loading @@ -10,13 +10,13 @@ */ #include <linux/module.h> #include <linux/blkdev.h> #include <linux/kthread.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include "mmc_queue.h" #define MMC_QUEUE_EXIT (1 << 0) #define MMC_QUEUE_SUSPENDED (1 << 1) #define MMC_QUEUE_SUSPENDED (1 << 0) /* * Prepare a MMC request. Essentially, this means passing the Loading Loading @@ -59,7 +59,6 @@ static int mmc_queue_thread(void *d) { struct mmc_queue *mq = d; struct request_queue *q = mq->queue; DECLARE_WAITQUEUE(wait, current); /* * Set iothread to ensure that we aren't put to sleep by Loading @@ -67,12 +66,7 @@ static int mmc_queue_thread(void *d) */ current->flags |= PF_MEMALLOC|PF_NOFREEZE; daemonize("mmcqd"); complete(&mq->thread_complete); down(&mq->thread_sem); add_wait_queue(&mq->thread_wq, &wait); do { struct request *req = NULL; Loading @@ -84,7 +78,7 @@ static int mmc_queue_thread(void *d) spin_unlock_irq(q->queue_lock); if (!req) { if (mq->flags & MMC_QUEUE_EXIT) if (kthread_should_stop()) break; up(&mq->thread_sem); schedule(); Loading @@ -95,10 +89,8 @@ static int mmc_queue_thread(void *d) mq->issue_fn(mq, req); } while (1); remove_wait_queue(&mq->thread_wq, &wait); up(&mq->thread_sem); complete_and_exit(&mq->thread_complete, 0); return 0; } Loading @@ -113,7 +105,7 @@ static void mmc_request(request_queue_t *q) struct mmc_queue *mq = q->queuedata; if (!mq->req) wake_up(&mq->thread_wq); wake_up_process(mq->thread); } /** Loading Loading @@ -152,36 +144,31 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock GFP_KERNEL); if (!mq->sg) { ret = -ENOMEM; goto cleanup; goto cleanup_queue; } init_completion(&mq->thread_complete); init_waitqueue_head(&mq->thread_wq); init_MUTEX(&mq->thread_sem); ret = kernel_thread(mmc_queue_thread, mq, CLONE_KERNEL); if (ret >= 0) { wait_for_completion(&mq->thread_complete); init_completion(&mq->thread_complete); ret = 0; goto out; mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd"); if (IS_ERR(mq->thread)) { ret = PTR_ERR(mq->thread); goto free_sg; } cleanup: return 0; free_sg: kfree(mq->sg); mq->sg = NULL; cleanup_queue: blk_cleanup_queue(mq->queue); out: return ret; } EXPORT_SYMBOL(mmc_init_queue); void mmc_cleanup_queue(struct mmc_queue *mq) { mq->flags |= MMC_QUEUE_EXIT; wake_up(&mq->thread_wq); wait_for_completion(&mq->thread_complete); kthread_stop(mq->thread); kfree(mq->sg); mq->sg = NULL; Loading drivers/mmc/mmc_queue.h +1 −2 Original line number Diff line number Diff line Loading @@ -6,8 +6,7 @@ struct task_struct; struct mmc_queue { struct mmc_card *card; struct completion thread_complete; wait_queue_head_t thread_wq; struct task_struct *thread; struct semaphore thread_sem; unsigned int flags; struct request *req; Loading Loading
drivers/mmc/mmc_queue.c +14 −27 Original line number Diff line number Diff line Loading @@ -10,13 +10,13 @@ */ #include <linux/module.h> #include <linux/blkdev.h> #include <linux/kthread.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include "mmc_queue.h" #define MMC_QUEUE_EXIT (1 << 0) #define MMC_QUEUE_SUSPENDED (1 << 1) #define MMC_QUEUE_SUSPENDED (1 << 0) /* * Prepare a MMC request. Essentially, this means passing the Loading Loading @@ -59,7 +59,6 @@ static int mmc_queue_thread(void *d) { struct mmc_queue *mq = d; struct request_queue *q = mq->queue; DECLARE_WAITQUEUE(wait, current); /* * Set iothread to ensure that we aren't put to sleep by Loading @@ -67,12 +66,7 @@ static int mmc_queue_thread(void *d) */ current->flags |= PF_MEMALLOC|PF_NOFREEZE; daemonize("mmcqd"); complete(&mq->thread_complete); down(&mq->thread_sem); add_wait_queue(&mq->thread_wq, &wait); do { struct request *req = NULL; Loading @@ -84,7 +78,7 @@ static int mmc_queue_thread(void *d) spin_unlock_irq(q->queue_lock); if (!req) { if (mq->flags & MMC_QUEUE_EXIT) if (kthread_should_stop()) break; up(&mq->thread_sem); schedule(); Loading @@ -95,10 +89,8 @@ static int mmc_queue_thread(void *d) mq->issue_fn(mq, req); } while (1); remove_wait_queue(&mq->thread_wq, &wait); up(&mq->thread_sem); complete_and_exit(&mq->thread_complete, 0); return 0; } Loading @@ -113,7 +105,7 @@ static void mmc_request(request_queue_t *q) struct mmc_queue *mq = q->queuedata; if (!mq->req) wake_up(&mq->thread_wq); wake_up_process(mq->thread); } /** Loading Loading @@ -152,36 +144,31 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock GFP_KERNEL); if (!mq->sg) { ret = -ENOMEM; goto cleanup; goto cleanup_queue; } init_completion(&mq->thread_complete); init_waitqueue_head(&mq->thread_wq); init_MUTEX(&mq->thread_sem); ret = kernel_thread(mmc_queue_thread, mq, CLONE_KERNEL); if (ret >= 0) { wait_for_completion(&mq->thread_complete); init_completion(&mq->thread_complete); ret = 0; goto out; mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd"); if (IS_ERR(mq->thread)) { ret = PTR_ERR(mq->thread); goto free_sg; } cleanup: return 0; free_sg: kfree(mq->sg); mq->sg = NULL; cleanup_queue: blk_cleanup_queue(mq->queue); out: return ret; } EXPORT_SYMBOL(mmc_init_queue); void mmc_cleanup_queue(struct mmc_queue *mq) { mq->flags |= MMC_QUEUE_EXIT; wake_up(&mq->thread_wq); wait_for_completion(&mq->thread_complete); kthread_stop(mq->thread); kfree(mq->sg); mq->sg = NULL; Loading
drivers/mmc/mmc_queue.h +1 −2 Original line number Diff line number Diff line Loading @@ -6,8 +6,7 @@ struct task_struct; struct mmc_queue { struct mmc_card *card; struct completion thread_complete; wait_queue_head_t thread_wq; struct task_struct *thread; struct semaphore thread_sem; unsigned int flags; struct request *req; Loading