|
|
| |
KTHREAD(9) |
FreeBSD Kernel Developer's Manual |
KTHREAD(9) |
kthread_start , kthread_shutdown ,
kthread_add , kthread_exit ,
kthread_resume ,
kthread_suspend ,
kthread_suspend_check —
kernel threads
#include <sys/kthread.h>
void
kthread_start (const
void *udata);
void
kthread_shutdown (void
*arg, int
howto);
void
kthread_exit (void);
int
kthread_resume (struct
thread *td);
int
kthread_suspend (struct
thread *td, int
timo);
void
kthread_suspend_check (void);
#include
<sys/unistd.h>
int
kthread_add (void (*func)(void
*), void *arg, struct proc
*procp, struct thread **newtdpp,
int flags, int pages,
const char *fmt, ...);
int
kproc_kthread_add (void (*func)(void
*), void *arg, struct proc
**procptr, struct thread **tdptr,
int flags, int pages,
char * procname, const char
*fmt, ...);
In FreeBSD 8.0, the older family of
kthread_* (9) functions was
renamed to be the kproc_* (9)
family of functions, as they were previously misnamed and actually produced
kernel processes. This new family of
kthread_* (9) functions was added
to produce real kernel threads. See the
kproc(9)
man page for more information on the renamed calls. Also note that the
kproc_kthread_add (9) function
appears in both pages as its functionality is split.
The function kthread_start () is used to
start “internal” daemons such as
bufdaemon , pagedaemon ,
vmdaemon , and the syncer and
is intended to be called from
SYSINIT(9).
The udata argument is actually a pointer to a
struct kthread_desc which describes the kernel thread
that should be created:
struct kthread_desc {
char *arg0;
void (*func)(void);
struct thread **global_threadpp;
};
The structure members are used by
kthread_start () as follows:
- arg0
- String to be used for the name of the thread. This string will be copied
into the td_name member of the new threads'
struct thread.
- func
- The main function for this kernel thread to run.
- global_threadpp
- A pointer to a struct thread pointer that should be
updated to point to the newly created thread's
thread structure. If this variable is
NULL , then it is ignored. The thread will be a
subthread of proc0 (PID 0).
The kthread_add () function is used to
create a kernel thread. The new thread runs in kernel mode only. It is added
to the process specified by the procp argument, or if
that is NULL , to proc0. The
func argument specifies the function that the thread
should execute. The arg argument is an arbitrary
pointer that is passed in as the only argument to func
when it is called by the new thread. The newtdpp
pointer points to a struct thread pointer that is to
be updated to point to the newly created thread. If this argument is
NULL , then it is ignored. The
flags argument may be set to
RFSTOPPED to leave the thread in a stopped state.
The caller must call sched_add () to start the
thread. The pages argument specifies the size of the
new kernel thread's stack in pages. If 0 is used, the default kernel stack
size is allocated. The rest of the arguments form a
printf(9)
argument list that is used to build the name of the new thread and is stored
in the td_name member of the new thread's
struct thread.
The kproc_kthread_add () function is much
like the kthread_add () function above except that if
the kproc does not already exist, it is created. This function is better
documented in the
kproc(9)
manual page.
The kthread_exit () function is used to
terminate kernel threads. It should be called by the main function of the
kernel thread rather than letting the main function return to its
caller.
The kthread_resume (),
kthread_suspend (), and
kthread_suspend_check () functions are used to
suspend and resume a kernel thread. During the main loop of its execution, a
kernel thread that wishes to allow itself to be suspended should call
kthread_suspend_check () in order to check if the it
has been asked to suspend. If it has, it will
msleep(9)
until it is told to resume. Once it has been told to resume it will return
allowing execution of the kernel thread to continue. The other two functions
are used to notify a kernel thread of a suspend or resume request. The
td argument points to the struct
thread of the kernel thread to suspend or resume. For
kthread_suspend (), the timo
argument specifies a timeout to wait for the kernel thread to acknowledge
the suspend request and suspend itself.
The kthread_shutdown () function is meant
to be registered as a shutdown event for kernel threads that need to be
suspended voluntarily during system shutdown so as not to interfere with
system shutdown activities. The actual suspension of the kernel thread is
done with kthread_suspend ().
The kthread_add (),
kthread_resume (), and
kthread_suspend () functions return zero on success and
non-zero on failure.
This example demonstrates the use of a struct kthread_desc
and the functions kthread_start (),
kthread_shutdown (), and
kthread_suspend_check () to run the
bufdaemon process.
static struct thread *bufdaemonthread;
static struct kthread_desc buf_kp = {
"bufdaemon",
buf_daemon,
&bufdaemonthread
};
SYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kthread_start,
&buf_kp)
static void
buf_daemon()
{
...
/*
* This process needs to be suspended prior to shutdown sync.
*/
EVENTHANDLER_REGISTER(shutdown_pre_sync, kthread_shutdown,
bufdaemonthread, SHUTDOWN_PRI_LAST);
...
for (;;) {
kthread_suspend_check();
...
}
}
The kthread_resume () and
kthread_suspend () functions will fail if:
- [
EINVAL ]
- The td argument does not reference a kernel
thread.
The kthread_add () function will fail
if:
- [
ENOMEM ]
- Memory for a thread's stack could not be allocated.
The kthread_start () function first appeared in
FreeBSD 2.2 where it created a whole process. It was
converted to create threads in FreeBSD 8.0. The
kthread_shutdown (),
kthread_exit (),
kthread_resume (),
kthread_suspend (), and
kthread_suspend_check () functions were introduced in
FreeBSD 4.0 and were converted to threads in
FreeBSD 8.0. The
kthread_create () call was renamed to
kthread_add () in FreeBSD 8.0.
The old functionality of creating a kernel process was renamed to
kproc_create(9).
Prior to FreeBSD 5.0, the
kthread_shutdown (),
kthread_resume (),
kthread_suspend (), and
kthread_suspend_check () functions were named
shutdown_kproc (),
resume_kproc (),
shutdown_kproc (), and
kproc_suspend_loop (), respectively.
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc. |