git: d7e1bdfebacc - main - uipc: avoid circular pr_{slow, fast}timos

Kyle Evans kevans at freebsd.org
Wed Aug 18 17:55:02 UTC 2021


On Wed, Aug 18, 2021 at 12:54 PM Kyle Evans <kevans at freebsd.org> wrote:
>
> The branch main has been updated by kevans:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=d7e1bdfebacc4de25dc51e14a91d66bb429677c9
>
> commit d7e1bdfebacc4de25dc51e14a91d66bb429677c9
> Author:     Kyle Evans <kevans at FreeBSD.org>
> AuthorDate: 2021-08-18 17:31:45 +0000
> Commit:     Kyle Evans <kevans at FreeBSD.org>
> CommitDate: 2021-08-18 17:46:54 +0000
>
>     uipc: avoid circular pr_{slow,fast}timos
>

This should read "avoid circular pf{fast,slow}_list", sorry.

>     domain_init() gets reinvoked for each vnet on a system, so we must not
>     alter global state.  Practically speaking, we were creating circular
>     lists and tying up a softclock thread into an infinite loop.
>
>     The breakage here was most easily observed by simply creating a jail
>     in a new vnet and watching the system suddenly become erratic.
>
>     Reported by:    markj
>     Fixes:  e0a17c3f063f ("uipc: create dedicated lists for fast ...")
>     Pointy hat:     kevans
> ---
>  sys/kern/uipc_domain.c | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c
> index 0946a2a75326..d572e0ec19db 100644
> --- a/sys/kern/uipc_domain.c
> +++ b/sys/kern/uipc_domain.c
> @@ -194,12 +194,23 @@ domain_init(void *arg)
>                 (*dp->dom_init)();
>         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
>                 protosw_init(pr);
> -               rm_wlock(&pftimo_lock);
> -               if (pr->pr_fasttimo != NULL)
> -                       LIST_INSERT_HEAD(&pffast_list, pr, pr_fasttimos);
> -               if (pr->pr_slowtimo != NULL)
> -                       LIST_INSERT_HEAD(&pfslow_list, pr, pr_slowtimos);
> -               rm_wunlock(&pftimo_lock);
> +
> +               /*
> +                * Note that with VIMAGE enabled, domain_init() will be
> +                * re-invoked for each new vnet that's created.  The below lists
> +                * are intended to be system-wide, so avoid altering global
> +                * state for non-default vnets.
> +                */
> +               if (IS_DEFAULT_VNET(curvnet)) {
> +                       rm_wlock(&pftimo_lock);
> +                       if (pr->pr_fasttimo != NULL)
> +                               LIST_INSERT_HEAD(&pffast_list, pr,
> +                                   pr_fasttimos);
> +                       if (pr->pr_slowtimo != NULL)
> +                               LIST_INSERT_HEAD(&pfslow_list, pr,
> +                                   pr_slowtimos);
> +                       rm_wunlock(&pftimo_lock);
> +               }
>         }
>
>         /*


More information about the dev-commits-src-all mailing list