Skip to content

Commit

Permalink
mmc: remove kernel_thread()
Browse files Browse the repository at this point in the history
Replace kernel_thread() with kthread_run()/kthread_stop().

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
  • Loading branch information
Christoph Hellwig authored and Pierre Ossman committed Dec 1, 2006
1 parent 0215ffb commit 87598a2
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 29 deletions.
41 changes: 14 additions & 27 deletions drivers/mmc/mmc_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -59,20 +59,14 @@ 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
* the process freezing. We handle suspension ourselves.
*/
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;

Expand All @@ -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();
Expand All @@ -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;
}

Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions drivers/mmc/mmc_queue.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 87598a2

Please sign in to comment.