svn commit: r240067 - head/sys/kern
Aleksandr Rybalko
ray at freebsd.org
Tue Sep 4 09:03:18 UTC 2012
On Mon, 3 Sep 2012 09:09:08 -0700
mdf at FreeBSD.org wrote:
>> 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.
Think that one is last version :)
http://people.freebsd.org/~ray/subr_hints.c.patch
Thank you Matthew!
WBW
--
Aleksandr Rybalko <ray at freebsd.org>
More information about the svn-src-all
mailing list