]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
libafs: use kthread_run when available
authorTom Keiser <tkeiser@sinenomine.net>
Tue, 10 Apr 2012 20:26:42 +0000 (16:26 -0400)
committerStephan Wiesand <stephan.wiesand@desy.de>
Thu, 6 Dec 2012 17:17:32 +0000 (09:17 -0800)
Use the kthread_run interface on linux to create kernel
threads.  This interface allows all the cpus to schedule
afsd threads, instead of just inheriting the cpu affinity of
the main afsd thread.

Written by Tom Keiser.

Reviewed-on: http://gerrit.openafs.org/7915
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit b440d8ffcbb0ac58ecaa34a9c60fe27a0fc91026)

Change-Id: Id05360309db01ac13b8d887b1ef19596ed86b63a
Reviewed-on: http://gerrit.openafs.org/8604
Reviewed-by: Marc Dionne <marc.c.dionne@gmail.com>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Paul Smeddle <paul.smeddle@gmail.com>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
acinclude.m4
src/afs/afs_call.c

index 11a30b3a2e6a271d17c4266fd4ce111a95a0104c..003b0d9de176ace0d09f5e8996cdeb9beeecc185 100644 (file)
@@ -911,6 +911,10 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 AC_CHECK_LINUX_FUNC([noop_fsync],
                                     [#include <linux/fs.h>],
                                     [void *address = &noop_fsync; printk("%p\n", address)];)
+                AC_CHECK_LINUX_FUNC([kthread_run],
+                                    [#include <linux/kernel.h>
+                                     #include <linux/kthread.h>],
+                                    [kthread_run(NULL, NULL, "test");])
 
                 dnl Consequences - things which get set as a result of the
                 dnl                above tests
index 3d184b5d6525df2eacb17cfebe5de6ee3d9faffa..1b615174d2823f3960fb78d53f479a75cc9c9052 100644 (file)
 #include "afsincludes.h"       /* Afs-based standard headers */
 #include "afs/afs_stats.h"
 #include "rx/rx_globals.h"
-#if !defined(UKERNEL) && !defined(AFS_LINUX20_ENV)
-#include "net/if.h"
-#ifdef AFS_SGI62_ENV
-#include "h/hashing.h"
-#endif
-#if !defined(AFS_HPUX110_ENV) && !defined(AFS_DARWIN_ENV)
-#include "netinet/in_var.h"
-#endif
+#if !defined(UKERNEL)
+# if !defined(AFS_LINUX20_ENV)
+#  include "net/if.h"
+#  ifdef AFS_SGI62_ENV
+#   include "h/hashing.h"
+#  endif
+#  if !defined(AFS_HPUX110_ENV) && !defined(AFS_DARWIN_ENV)
+#   include "netinet/in_var.h"
+#  endif
+# endif
+# ifdef HAVE_LINUX_KTHREAD_RUN
+#  include "h/kthread.h"
+# endif
 #endif /* !defined(UKERNEL) */
 #ifdef AFS_SUN510_ENV
 #include "h/ksynch.h"
@@ -293,11 +298,13 @@ afsd_thread(void *rock)
 # ifdef SYS_SETPRIORITY_EXPORTED
     int (*sys_setpriority) (int, int, int) = sys_call_table[__NR_setpriority];
 # endif
-# if defined(AFS_LINUX26_ENV)
+# if !defined(HAVE_LINUX_KTHREAD_RUN)
+#  if defined(AFS_LINUX26_ENV)
     daemonize("afsd");
-# else
+#  else
     daemonize();
-# endif
+#  endif
+# endif /* !HAVE_LINUX_KTHREAD_RUN */
                                /* doesn't do much, since we were forked from keventd, but
                                 * does call mm_release, which wakes up our parent (since it
                                 * used CLONE_VFORK) */
@@ -430,8 +437,14 @@ afsd_launcher(void *rock)
     struct afsd_thread_info *rock = container_of(work, struct afsd_thread_info, tq);
 # endif
 
+# if defined(HAVE_LINUX_KTHREAD_RUN)
+    if (IS_ERR(kthread_run(afsd_thread, (void *)rock, "afsd"))) {
+       afs_warn("kthread_run failed; afs startup will not complete\n");
+    }
+# else /* !HAVE_LINUX_KTHREAD_RUN */
     if (!kernel_thread(afsd_thread, (void *)rock, CLONE_VFORK | SIGCHLD))
        afs_warn("kernel_thread failed. afs startup will not complete\n");
+# endif /* !HAVE_LINUX_KTHREAD_RUN */
 }
 
 void