From: nfshp Date: Thu, 12 Dec 2002 12:53:11 +0000 (+0000) Subject: initial checking of b_io branch. X-Git-Tag: v1_7_100~1^90~102 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c1342f9f34eccc16489e8f71cdd43df1558824fc;p=fs%2Flustre-release.git initial checking of b_io branch. - mark page/inode dirty when ll_commit_write - sync dirty pages in ll_call_back - start kernel thread 'liod' during mounting - quit liod when umount TODO - find a way to sense memory pressure - do actual sync work in liod - do things according memory pressure in ll_commit_write --- diff --git a/lustre/llite/iod.c b/lustre/llite/iod.c new file mode 100644 index 0000000..c748064 --- /dev/null +++ b/lustre/llite/iod.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEBUG_SUBSYSTEM S_LLITE +#include + +/* wakeup every 30s */ +#define LIOD_WAKEUP_CYCLE (30) + +static int liod_main(void *arg) +{ + struct ll_io_daemon *iod = (struct ll_io_daemon *)arg; + + ENTRY; + + lock_kernel(); + daemonize(); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) + spin_lock_irq(¤t->sigmask_lock); + sigfillset(¤t->blocked); + our_recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); +#else + sigfillset(¤t->blocked); + our_recalc_sigpending(current); +#endif + + sprintf(current->comm, "liod"); + unlock_kernel(); + + /* declear we are ready */ + spin_lock(&iod->io_lock); + iod->io_flag |= LIOD_FLAG_ALIVE; + wake_up(&iod->io_waitq); + spin_unlock(&iod->io_lock); + + CDEBUG(D_NET, "liod(%d) started\n", current->pid); + while (1) { + int t; + + /* check the stop command */ + if (iod->io_flag & LIOD_FLAG_STOP) + break; + + t = interruptible_sleep_on_timeout(&iod->io_sleepq, + LIOD_WAKEUP_CYCLE*HZ); + CDEBUG(D_NET, "liod(%d) active due to %s\n", + (t ? "wakeup" : "timeout")); + } + + spin_lock(&iod->io_lock); + iod->io_flag &= ~LIOD_FLAG_ALIVE; + iod->io_flag |= LIOD_FLAG_STOPPED; + wake_up(&iod->io_waitq); + spin_unlock(&iod->io_lock); + + CDEBUG(D_NET, "liod(%d) exit\n", current->pid); + RETURN(0); +} + +int liod_start(struct ll_io_daemon *iod) +{ + DECLARE_WAITQUEUE(queue, current); + int rc; + + /* initialize */ + iod->io_flag = 0; + spin_lock_init(&iod->io_lock); + init_waitqueue_head(&iod->io_sleepq); + init_waitqueue_head(&iod->io_waitq); + + spin_lock(&iod->io_lock); + + rc = kernel_thread(liod_main, (void *) iod, + CLONE_VM | CLONE_FS | CLONE_FILES); + + if (rc < 0) { + CERROR("fail to start liod, error %d\n", rc); + spin_unlock(&iod->io_lock); + return rc; + } + + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&iod->io_waitq, &queue); + spin_unlock(&iod->io_lock); + + /* wait liod start */ + schedule(); + + set_current_state(TASK_RUNNING); + remove_wait_queue(&iod->io_waitq, &queue); + + if (iod->io_flag & LIOD_FLAG_ALIVE) + return 0; + else + return -ENOMEM; +} + +void liod_wakeup(struct ll_io_daemon *iod) +{ + wake_up(&iod->io_sleepq); +} + +void liod_stop(struct ll_io_daemon *iod) +{ + DECLARE_WAITQUEUE(queue, current); + + spin_lock(&iod->io_lock); + + /* send the kill command */ + iod->io_flag |= LIOD_FLAG_STOP; + + /* if wakeup daemon */ + wake_up(&iod->io_sleepq); + + /* wait daemon's exit */ + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&iod->io_waitq, &queue); + spin_unlock(&iod->io_lock); + + schedule(); + /* must woken up by liod */ + + return; +}