svn commit: r240067 - head/sys/kern
mdf at FreeBSD.org
mdf at FreeBSD.org
Mon Sep 3 16:09:14 UTC 2012
On Mon, Sep 3, 2012 at 1:52 AM, Aleksandr Rybalko <ray at freebsd.org> wrote:
> Author: ray
> Date: Mon Sep 3 08:52:05 2012
> New Revision: 240067
> URL: http://svn.freebsd.org/changeset/base/240067
>
> Log:
> Add kern.hintmode sysctl variable to show current state of hints:
> 0 - loader hints in environment only;
> 1 - static hints only
> 2 - fallback mode (Dynamic KENV with fallback to kernel environment)
> Add kern.hintmode write handler, accept only value 2. That will switch
> static KENV to dynamic. So it will be possible to change device hints.
>
> Approved by: adrian (mentor)
>
> Modified:
> head/sys/kern/subr_hints.c
>
> Modified: head/sys/kern/subr_hints.c
> ==============================================================================
> --- head/sys/kern/subr_hints.c Mon Sep 3 07:18:24 2012 (r240066)
> +++ head/sys/kern/subr_hints.c Mon Sep 3 08:52:05 2012 (r240067)
> @@ -29,8 +29,10 @@ __FBSDID("$FreeBSD$");
>
> #include <sys/param.h>
> #include <sys/lock.h>
> +#include <sys/malloc.h>
> #include <sys/mutex.h>
> #include <sys/systm.h>
> +#include <sys/sysctl.h>
Putting on my style-nazi hat. sysctl comes before systm alphabetically.
> #include <sys/bus.h>
>
> /*
> @@ -42,6 +44,81 @@ static int use_kenv;
> static char *hintp;
>
> /*
> + * Define kern.hintmode sysctl, which only accept value 2, that cause to
> + * switch from Static KENV mode to Dynamic KENV. So systems that have hints
> + * compiled into kernel will be able to see/modify KENV (and hints too).
> + */
> +
> +static int
> +sysctl_hintmode(SYSCTL_HANDLER_ARGS)
> +{
> + int error, i, from_kenv, value, eqidx;
> + const char *cp;
> + char *line, *eq;
These are not sorted properly; pointers come before scalars, and
within the group they should be sorted alphabetically; e.g. "eqidx"
comes before all the other ints.
> +
> + from_kenv = 0;
> + cp = kern_envp;
> + value = hintmode;
> +
> + /* Fetch candidate for new hintmode value */
> + error = sysctl_handle_int(oidp, &value, 0, req);
> + if (error || !req->newptr)
This may be copying existing code, but style(9) explicitly forbids
using '!' except on boolean expressions. Since req->newptr is a
pointer, an explicit comparison to NULL should be made. This error is
repeated later.
Thanks,
matthew
> + return (error);
> +
> + if (value != 2)
> + /* Only accept swithing to hintmode 2 */
> + return (EINVAL);
> +
> + /* Migrate from static to dynamic hints */
> + switch (hintmode) {
> + case 0:
> + if (dynamic_kenv)
> + /* Already here */
> + hintmode = value; /* XXX: Need we switch or not ? */
> + return (0);
> + from_kenv = 1;
> + cp = kern_envp;
> + break;
> + case 1:
> + cp = static_hints;
> + break;
> + case 2:
> + /* Nothing to do, hintmode already 2 */
> + return (0);
> + }
> +
> + while (cp) {
> + i = strlen(cp);
> + if (i == 0)
> + break;
> + if (from_kenv) {
> + if (strncmp(cp, "hint.", 5) != 0)
> + /* kenv can have not only hints */
> + continue;
> + }
> + eq = strchr(cp, '=');
> + if (!eq)
> + /* Bad hint value */
> + continue;
> + eqidx = eq - cp;
> +
> + line = malloc(i+1, M_TEMP, M_WAITOK);
> + strcpy(line, cp);
> + line[eqidx] = '\0';
> + setenv(line, line + eqidx + 1);
> + free(line, M_TEMP);
> + cp += i + 1;
> + }
> +
> + hintmode = value;
> + use_kenv = 1;
> + return (0);
> +}
> +
> +SYSCTL_PROC(_kern, OID_AUTO, hintmode, CTLTYPE_INT|CTLFLAG_RW,
> + &hintmode, 0, sysctl_hintmode, "I", "Get/set current hintmode");
> +
> +/*
> * Evil wildcarding resource string lookup.
> * This walks the supplied env string table and returns a match.
> * The start point can be remembered for incremental searches.
More information about the svn-src-all
mailing list