From b440d8ffcbb0ac58ecaa34a9c60fe27a0fc91026 Mon Sep 17 00:00:00 2001 From: Tom Keiser Date: Tue, 10 Apr 2012 16:26:42 -0400 Subject: [PATCH] libafs: use kthread_run when available 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. Change-Id: I69eb852d168bd85e9aa7ec075013c0346207dbcf Reviewed-on: http://gerrit.openafs.org/7915 Reviewed-by: Derrick Brashear Tested-by: BuildBot --- acinclude.m4 | 4 ++++ src/afs/afs_call.c | 35 ++++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 7f69dadb3..385550994 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -921,6 +921,10 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) AC_CHECK_LINUX_FUNC([noop_fsync], [#include ], [void *address = &noop_fsync; printk("%p\n", address)];) + AC_CHECK_LINUX_FUNC([kthread_run], + [#include + #include ], + [kthread_run(NULL, NULL, "test");]) dnl Consequences - things which get set as a result of the dnl above tests diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 858dc5c11..aebc56728 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -15,14 +15,19 @@ #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" @@ -292,11 +297,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) */ @@ -433,8 +440,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 -- 2.39.5