From: Jeff Layton <jlayton@redhat.com>
To: linux-nfs@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, nfsv4@linux-nfs.org
Subject: [PATCH 6/7] NLM: Convert lockd to use kthreads
Date: Tue, 18 Dec 2007 11:42:38 -0500 [thread overview]
Message-ID: <1197996159-20799-7-git-send-email-jlayton@redhat.com> (raw)
In-Reply-To: <1197996159-20799-6-git-send-email-jlayton@redhat.com>
Have lockd_up start lockd using svc_create_kthread. With this change,
lockd_down now blocks until lockd actually exits, so there's no longer
need for the waitqueue code at the end of lockd_down. This also means
that only one lockd can be running at a time which simplifies the code
within lockd's main loop a bit.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
fs/lockd/svc.c | 64 +++++++++++++++++++++++--------------------------------
1 files changed, 27 insertions(+), 37 deletions(-)
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 03a83a0..28c290c 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -25,6 +25,7 @@
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/mutex.h>
+#include <linux/kthread.h>
#include <linux/freezer.h>
#include <linux/sunrpc/types.h>
@@ -48,13 +49,12 @@ EXPORT_SYMBOL(nlmsvc_ops);
static DEFINE_MUTEX(nlmsvc_mutex);
static unsigned int nlmsvc_users;
-static pid_t nlmsvc_pid;
-static struct svc_serv *nlmsvc_serv;
+static struct task_struct * nlmsvc_task;
+static struct svc_serv * nlmsvc_serv;
int nlmsvc_grace_period;
unsigned long nlmsvc_timeout;
static DECLARE_COMPLETION(lockd_start_done);
-static DECLARE_WAIT_QUEUE_HEAD(lockd_exit);
/*
* These can be set at insmod time (useful for NFS as root filesystem),
@@ -128,11 +128,10 @@ lockd(struct svc_rqst *rqstp)
/*
* Let our maker know we're running.
*/
- nlmsvc_pid = current->pid;
+ nlmsvc_task = current;
nlmsvc_serv = rqstp->rq_server;
complete(&lockd_start_done);
- daemonize("lockd");
set_freezable();
/* Process request with signals blocked, but allow SIGKILL. */
@@ -151,7 +150,7 @@ lockd(struct svc_rqst *rqstp)
* NFS mount or NFS daemon has gone away, and we've been sent a
* signal, or else another process has taken over our job.
*/
- while ((nlmsvc_users || !signalled()) && nlmsvc_pid == current->pid) {
+ while (!kthread_should_stop()) {
long timeout = MAX_SCHEDULE_TIMEOUT;
char buf[RPC_MAX_ADDRBUFLEN];
@@ -203,23 +202,18 @@ lockd(struct svc_rqst *rqstp)
* Check whether there's a new lockd process before
* shutting down the hosts and clearing the slot.
*/
- if (!nlmsvc_pid || current->pid == nlmsvc_pid) {
- if (nlmsvc_ops)
- nlmsvc_invalidate_all();
- nlm_shutdown_hosts();
- nlmsvc_pid = 0;
- nlmsvc_serv = NULL;
- } else
- printk(KERN_DEBUG
- "lockd: new process, skipping host shutdown\n");
- wake_up(&lockd_exit);
+ if (nlmsvc_ops)
+ nlmsvc_invalidate_all();
+ nlm_shutdown_hosts();
+ nlmsvc_task = NULL;
+ nlmsvc_serv = NULL;
/* Exit the RPC thread */
svc_exit_thread(rqstp);
/* Release module */
unlock_kernel();
- module_put_and_exit(0);
+ module_put(THIS_MODULE);
}
@@ -270,13 +264,14 @@ int
lockd_up(int proto) /* Maybe add a 'family' option when IPv6 is supported ?? */
{
struct svc_serv * serv;
+ struct svc_rqst * rqstp;
int error = 0;
mutex_lock(&nlmsvc_mutex);
/*
* Check whether we're already up and running.
*/
- if (nlmsvc_pid) {
+ if (nlmsvc_task) {
if (proto)
error = make_socks(nlmsvc_serv, proto);
goto out;
@@ -303,11 +298,21 @@ lockd_up(int proto) /* Maybe add a 'family' option when IPv6 is supported ?? */
/*
* Create the kernel thread and wait for it to start.
*/
+ rqstp = svc_prepare_thread(serv, &serv->sv_pools[0]);
+ if (IS_ERR(rqstp)) {
+ error = PTR_ERR(rqstp);
+ printk(KERN_WARNING
+ "lockd_up: svc_rqst allocation failed, error=%d\n",
+ error);
+ goto destroy_and_out;
+ }
+
init_completion(&lockd_start_done);
- error = svc_create_thread(lockd, serv);
+ error = svc_create_kthread(lockd, rqstp);
if (error) {
printk(KERN_WARNING
"lockd_up: create thread failed, error=%d\n", error);
+ svc_exit_thread(rqstp);
goto destroy_and_out;
}
wait_for_completion(&lockd_start_done);
@@ -339,30 +344,15 @@ lockd_down(void)
if (--nlmsvc_users)
goto out;
} else
- printk(KERN_WARNING "lockd_down: no users! pid=%d\n", nlmsvc_pid);
+ printk(KERN_WARNING "lockd_down: no users! task=%p\n", nlmsvc_task);
- if (!nlmsvc_pid) {
+ if (!nlmsvc_task) {
if (warned++ == 0)
printk(KERN_WARNING "lockd_down: no lockd running.\n");
goto out;
}
warned = 0;
-
- kill_proc(nlmsvc_pid, SIGKILL, 1);
- /*
- * Wait for the lockd process to exit, but since we're holding
- * the lockd semaphore, we can't wait around forever ...
- */
- clear_thread_flag(TIF_SIGPENDING);
- interruptible_sleep_on_timeout(&lockd_exit, HZ);
- if (nlmsvc_pid) {
- printk(KERN_WARNING
- "lockd_down: lockd failed to exit, clearing pid\n");
- nlmsvc_pid = 0;
- }
- spin_lock_irq(¤t->sighand->siglock);
- recalc_sigpending();
- spin_unlock_irq(¤t->sighand->siglock);
+ kthread_stop(nlmsvc_task);
out:
mutex_unlock(&nlmsvc_mutex);
}
--
1.5.3.3
next prev parent reply other threads:[~2007-12-18 16:43 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-18 16:42 [PATCH 0/7] Intro: convert lockd to kthread and fix use-after-free (try #2) Jeff Layton
2007-12-18 16:42 ` [PATCH 1/7] SUNRPC: Allow svc_pool_map_set_cpumask to work with any task Jeff Layton
2007-12-18 16:42 ` [PATCH 2/7] SUNRPC: spin svc_rqst initialization to its own function Jeff Layton
2007-12-18 16:42 ` [PATCH 3/7] SUNRPC: make new svc_create_kthread function Jeff Layton
2007-12-18 16:42 ` [PATCH 4/7] NLM: Initialize completion variable in lockd_up Jeff Layton
2007-12-18 16:42 ` [PATCH 5/7] NLM: Have lockd call try_to_freeze Jeff Layton
2007-12-18 16:42 ` Jeff Layton [this message]
2007-12-18 16:42 ` [PATCH 7/7] NLM: Add reference counting to lockd Jeff Layton
2007-12-18 17:10 ` [PATCH 3/7] SUNRPC: make new svc_create_kthread function Christoph Hellwig
2007-12-18 20:19 [PATCH 0/7] Intro: convert lockd to kthread and fix use-after-free (try #3) Jeff Layton
2007-12-18 20:19 ` [PATCH 1/7] SUNRPC: Allow svc_pool_map_set_cpumask to work with any task Jeff Layton
2007-12-18 20:19 ` [PATCH 2/7] SUNRPC: spin svc_rqst initialization to its own function Jeff Layton
2007-12-18 20:19 ` [PATCH 3/7] SUNRPC: export svc_sock_update_bufs Jeff Layton
2007-12-18 20:19 ` [PATCH 4/7] NLM: Initialize completion variable in lockd_up Jeff Layton
2007-12-18 20:19 ` [PATCH 5/7] NLM: Have lockd call try_to_freeze Jeff Layton
2007-12-18 20:19 ` [PATCH 6/7] NLM: Convert lockd to use kthreads Jeff Layton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1197996159-20799-7-git-send-email-jlayton@redhat.com \
--to=jlayton@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=nfsv4@linux-nfs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome