Re: git: 69413598d266 - main - signal: use proc_iterate to save on work
Date: Mon, 05 Sep 2022 12:16:35 UTC
On Mon, Sep 05, 2022 at 11:56:15AM +0000, Mateusz Guzik wrote:
> The branch main has been updated by mjg:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=69413598d2660054e29cac9454fe18c08e3bf36d
>
> commit 69413598d2660054e29cac9454fe18c08e3bf36d
> Author: Mateusz Guzik <mjg@FreeBSD.org>
> AuthorDate: 2022-03-10 18:58:12 +0000
> Commit: Mateusz Guzik <mjg@FreeBSD.org>
> CommitDate: 2022-09-05 11:54:47 +0000
>
> signal: use proc_iterate to save on work
>
> Most notably poudriere performs kill -9 -1 in jails for each port
> being built. This reduces the scan from hundrends of processes to
> literally 1.
>
> Reviewed by: jamie, markj
> Differential Revision: https://reviews.freebsd.org/D34522
> ---
> sys/kern/kern_sig.c | 39 ++++++++++++++++++++++++++++-----------
> 1 file changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
> index 6fd3eca0a14e..c50a37de07e6 100644
> --- a/sys/kern/kern_sig.c
> +++ b/sys/kern/kern_sig.c
> @@ -1776,18 +1776,13 @@ struct killpg1_ctx {
> };
>
> static void
> -killpg1_sendsig(struct proc *p, bool notself, struct killpg1_ctx *arg)
> +killpg1_sendsig_locked(struct proc *p, struct killpg1_ctx *arg)
> {
> int err;
>
> - if (p->p_pid <= 1 || (p->p_flag & P_SYSTEM) != 0 ||
> - (notself && p == arg->td->td_proc) || p->p_state == PRS_NEW)
> - return;
> - PROC_LOCK(p);
> err = p_cansignal(arg->td, p, arg->sig);
> if (err == 0 && arg->sig != 0)
> pksignal(p, arg->sig, arg->ksi);
> - PROC_UNLOCK(p);
> if (err != ESRCH)
> arg->found = true;
> if (err == 0)
> @@ -1796,6 +1791,31 @@ killpg1_sendsig(struct proc *p, bool notself, struct killpg1_ctx *arg)
> arg->ret = err;
> }
>
> +static void
> +killpg1_sendsig(struct proc *p, bool notself, struct killpg1_ctx *arg)
> +{
> +
> + if (p->p_pid <= 1 || (p->p_flag & P_SYSTEM) != 0 ||
> + (notself && p == arg->td->td_proc) || p->p_state == PRS_NEW)
> + return;
> +
> + PROC_LOCK(p);
> + killpg1_sendsig_locked(p, arg);
> + PROC_UNLOCK(p);
> +}
> +
> +static void
> +kill_processes_prison_cb(struct proc *p, void *arg)
> +{
> + struct killpg1_ctx *ctx = arg;
> +
> + if (p->p_pid <= 1 || (p->p_flag & P_SYSTEM) != 0 ||
> + (p == ctx->td->td_proc) || p->p_state == PRS_NEW)
Extra ()
> + return;
> +
> + killpg1_sendsig_locked(p, ctx);
> +}
> +
> /*
> * Common code for kill process group/broadcast kill.
> * cp is calling process.
> @@ -1817,11 +1837,8 @@ killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi)
> /*
> * broadcast
> */
> - sx_slock(&allproc_lock);
> - FOREACH_PROC_IN_SYSTEM(p) {
> - killpg1_sendsig(p, true, &arg);
> - }
> - sx_sunlock(&allproc_lock);
> + prison_proc_iterate(td->td_ucred->cr_prison,
> + kill_processes_prison_cb, &arg);
> } else {
> sx_slock(&proctree_lock);
> if (pgid == 0) {
I believe before your change, kill(-1) would kill all processes in the
jail, which includes all processes in the nested jails. Now, it seems
that linkage prevents iterating over the nested jails, am I missing it?