mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 01:30:30 -04:00
Set TDP_KTHREAD before calling cpu_fork() and cpu_copy_thread().
This permits these routines to use special logic for initializing MD kthread state. For the kproc case, this required moving the logic to set these flags from kproc_create() into do_fork(). Reviewed by: kib MFC after: 1 week Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D29207
This commit is contained in:
parent
5a50eb6585
commit
640d54045b
3 changed files with 16 additions and 14 deletions
|
|
@ -497,9 +497,12 @@ do_fork(struct thread *td, struct fork_req *fr, struct proc *p2, struct thread *
|
|||
} else {
|
||||
sigacts_copy(newsigacts, p1->p_sigacts);
|
||||
p2->p_sigacts = newsigacts;
|
||||
if ((fr->fr_flags2 & FR2_DROPSIG_CAUGHT) != 0) {
|
||||
if ((fr->fr_flags2 & (FR2_DROPSIG_CAUGHT | FR2_KPROC)) != 0) {
|
||||
mtx_lock(&p2->p_sigacts->ps_mtx);
|
||||
sig_drop_caught(p2);
|
||||
if ((fr->fr_flags2 & FR2_DROPSIG_CAUGHT) != 0)
|
||||
sig_drop_caught(p2);
|
||||
if ((fr->fr_flags2 & FR2_KPROC) != 0)
|
||||
p2->p_sigacts->ps_flag |= PS_NOCLDWAIT;
|
||||
mtx_unlock(&p2->p_sigacts->ps_mtx);
|
||||
}
|
||||
}
|
||||
|
|
@ -511,6 +514,11 @@ do_fork(struct thread *td, struct fork_req *fr, struct proc *p2, struct thread *
|
|||
else
|
||||
p2->p_sigparent = SIGCHLD;
|
||||
|
||||
if ((fr->fr_flags2 & FR2_KPROC) != 0) {
|
||||
p2->p_flag |= P_SYSTEM | P_KPROC;
|
||||
td2->td_pflags |= TDP_KTHREAD;
|
||||
}
|
||||
|
||||
p2->p_textvp = p1->p_textvp;
|
||||
p2->p_fd = fd;
|
||||
p2->p_fdtol = fdtol;
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ kproc_create(void (*func)(void *), void *arg,
|
|||
|
||||
bzero(&fr, sizeof(fr));
|
||||
fr.fr_flags = RFMEM | RFFDG | RFPROC | RFSTOPPED | flags;
|
||||
fr.fr_flags2 = FR2_KPROC;
|
||||
fr.fr_pages = pages;
|
||||
fr.fr_procp = &p2;
|
||||
error = fork1(&thread0, &fr);
|
||||
|
|
@ -105,21 +106,11 @@ kproc_create(void (*func)(void *), void *arg,
|
|||
if (newpp != NULL)
|
||||
*newpp = p2;
|
||||
|
||||
/* this is a non-swapped system process */
|
||||
PROC_LOCK(p2);
|
||||
td = FIRST_THREAD_IN_PROC(p2);
|
||||
p2->p_flag |= P_SYSTEM | P_KPROC;
|
||||
td->td_pflags |= TDP_KTHREAD;
|
||||
mtx_lock(&p2->p_sigacts->ps_mtx);
|
||||
p2->p_sigacts->ps_flag |= PS_NOCLDWAIT;
|
||||
mtx_unlock(&p2->p_sigacts->ps_mtx);
|
||||
PROC_UNLOCK(p2);
|
||||
|
||||
/* set up arg0 for 'ps', et al */
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(p2->p_comm, sizeof(p2->p_comm), fmt, ap);
|
||||
va_end(ap);
|
||||
/* set up arg0 for 'ps', et al */
|
||||
td = FIRST_THREAD_IN_PROC(p2);
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(td->td_name, sizeof(td->td_name), fmt, ap);
|
||||
va_end(ap);
|
||||
|
|
@ -295,12 +286,14 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p,
|
|||
TSTHREAD(newtd, newtd->td_name);
|
||||
|
||||
newtd->td_proc = p; /* needed for cpu_copy_thread */
|
||||
newtd->td_pflags |= TDP_KTHREAD;
|
||||
|
||||
/* might be further optimized for kthread */
|
||||
cpu_copy_thread(newtd, oldtd);
|
||||
|
||||
/* put the designated function(arg) as the resume context */
|
||||
cpu_fork_kthread_handler(newtd, func, arg);
|
||||
|
||||
newtd->td_pflags |= TDP_KTHREAD;
|
||||
thread_cow_get_proc(newtd, p);
|
||||
|
||||
/* this code almost the same as create_thread() in kern_thr.c */
|
||||
|
|
|
|||
|
|
@ -1055,6 +1055,7 @@ struct fork_req {
|
|||
int fr_flags2;
|
||||
#define FR2_DROPSIG_CAUGHT 0x00000001 /* Drop caught non-DFL signals */
|
||||
#define FR2_SHARE_PATHS 0x00000002 /* Invert sense of RFFDG for paths */
|
||||
#define FR2_KPROC 0x00000004 /* Create a kernel process */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue