From 1e8b8ffbfde6f76fb3cd94e54dbfd5615751fde9 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Tue, 17 Jan 2006 17:09:47 +0000 Subject: [PATCH] STABLE14-darwin-use-kthreads-20060117 FIXES 25542 use kernel threads for afsd processes instead of forked pids (cherry picked from commit 47d2ab228517deb7c3097ca4c5f46afd84e26098) --- src/afs/afs_call.c | 129 +++++++++++++++++++++++++++++++++++++++- src/rx/DARWIN/rx_knet.c | 4 +- 2 files changed, 129 insertions(+), 4 deletions(-) diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 97d751f861..b32f5210ef 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -150,6 +150,133 @@ afs_InitSetup(int preallocs) return code; } +#if defined(AFS_DARWIN80_ENV) +struct afsd_thread_info { + unsigned long parm; +}; +static int +afsd_thread(int *rock) +{ + struct afsd_thread_info *arg = (struct afsd_thread_info *)rock; + unsigned long parm = arg->parm; + + switch (parm) { + case AFSOP_START_RXCALLBACK: + AFS_GLOCK(); + wakeup(arg); + afs_CB_Running = 1; + while (afs_RX_Running != 2) + afs_osi_Sleep(&afs_RX_Running); + afs_RXCallBackServer(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_START_AFS: + AFS_GLOCK(); + wakeup(arg); + AFS_Running = 1; + while (afs_initState < AFSOP_START_AFS) + afs_osi_Sleep(&afs_initState); + afs_initState = AFSOP_START_BKG; + afs_osi_Wakeup(&afs_initState); + afs_Daemon(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_START_BKG: + AFS_GLOCK(); + wakeup(arg); + while (afs_initState < AFSOP_START_BKG) + afs_osi_Sleep(&afs_initState); + if (afs_initState < AFSOP_GO) { + afs_initState = AFSOP_GO; + afs_osi_Wakeup(&afs_initState); + } + afs_BackgroundDaemon(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_START_TRUNCDAEMON: + AFS_GLOCK(); + wakeup(arg); + while (afs_initState < AFSOP_GO) + afs_osi_Sleep(&afs_initState); + afs_CacheTruncateDaemon(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_START_CS: + AFS_GLOCK(); + wakeup(arg); + afs_CheckServerDaemon(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_RXEVENT_DAEMON: + AFS_GLOCK(); + wakeup(arg); + while (afs_initState < AFSOP_START_BKG) + afs_osi_Sleep(&afs_initState); + afs_rxevent_daemon(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + case AFSOP_RXLISTENER_DAEMON: + AFS_GLOCK(); + wakeup(arg); + afs_initState = AFSOP_START_AFS; + afs_osi_Wakeup(&afs_initState); + afs_RX_Running = 2; + afs_osi_Wakeup(&afs_RX_Running); + afs_osi_RxkRegister(); + rxk_Listener(); + AFS_GUNLOCK(); + thread_terminate(current_thread()); + break; + default: + printf("Unknown op %ld in StartDaemon()\n", (long)parm); + break; + } +} + +void +afs_DaemonOp(long parm, long parm2, long parm3, long parm4, long parm5, + long parm6) +{ + int code; + struct afsd_thread_info info; + thread_t thread; + + if (parm == AFSOP_START_RXCALLBACK) { + if (afs_CB_Running) + return; + } else if (parm == AFSOP_RXLISTENER_DAEMON) { + if (afs_RX_Running) + return; + afs_RX_Running = 1; + code = afs_InitSetup(parm2); + if (parm3) { + rx_enablePeerRPCStats(); + } + if (parm4) { + rx_enableProcessRPCStats(); + } + if (code) + return; + } else if (parm == AFSOP_START_AFS) { + if (AFS_Running) + return; + } /* other functions don't need setup in the parent */ + info.parm = parm; + kernel_thread_start((thread_continue_t)afsd_thread, &info, &thread); + AFS_GUNLOCK(); + /* we need to wait cause we passed stack pointers around.... */ + msleep(&info, NULL, PVFS, "afs_DaemonOp", NULL); + AFS_GLOCK(); + thread_deallocate(thread); +} +#endif + #if defined(AFS_LINUX24_ENV) && defined(COMPLETION_H_EXISTS) struct afsd_thread_info { @@ -381,7 +508,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6) #ifdef AFS_DARWIN80_ENV put_vfs_context(); #endif -#if defined(AFS_LINUX24_ENV) && defined(COMPLETION_H_EXISTS) && !defined(UKERNEL) +#if ((defined(AFS_LINUX24_ENV) && defined(COMPLETION_H_EXISTS)) || defined(AFS_DARWIN80_ENV)) && !defined(UKERNEL) if (parm < AFSOP_ADDCELL || parm == AFSOP_RXEVENT_DAEMON || parm == AFSOP_RXLISTENER_DAEMON) { afs_DaemonOp(parm, parm2, parm3, parm4, parm5, parm6); diff --git a/src/rx/DARWIN/rx_knet.c b/src/rx/DARWIN/rx_knet.c index 4422f81186..934521400b 100644 --- a/src/rx/DARWIN/rx_knet.c +++ b/src/rx/DARWIN/rx_knet.c @@ -145,9 +145,7 @@ osi_StopListener(void) #if defined(KERNEL_FUNNEL) thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL); #endif -#ifdef AFS_DARWIN80_ENV - proc_signal(rxk_ListenerPid, SIGUSR1); -#else +#ifndef AFS_DARWIN80_ENV p = pfind(rxk_ListenerPid); if (p) psignal(p, SIGUSR1);