STABLE14-darwin-use-kthreads-20060117

FIXES 25542

use kernel threads for afsd processes instead of forked pids


(cherry picked from commit 47d2ab228517deb7c3097ca4c5f46afd84e26098)
This commit is contained in:
Chaskiel M Grundman 2006-01-17 17:09:47 +00:00 committed by Derrick Brashear
parent 6392ea2d49
commit 1e8b8ffbfd
2 changed files with 129 additions and 4 deletions

View File

@ -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);

View File

@ -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);