Date: Tue, 4 Sep 2012 12:05:13 +0300 From: Aleksandr Rybalko <ray@freebsd.org> To: mdf@FreeBSD.org Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r240067 - head/sys/kern Message-ID: <20120904120513.62c7e6b2.ray@freebsd.org> In-Reply-To: <CAMBSHm93ct9GCc_S6D8N15bAkitU3jTWr2_5P5Z4maQ5oim8PQ@mail.gmail.com> References: <201209030852.q838q6lC053405@svn.freebsd.org> <CAMBSHm93ct9GCc_S6D8N15bAkitU3jTWr2_5P5Z4maQ5oim8PQ@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 3 Sep 2012 09:09:08 -0700 mdf@FreeBSD.org wrote: >> On Mon, Sep 3, 2012 at 1:52 AM, Aleksandr Rybalko <ray@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@freebsd.org>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120904120513.62c7e6b2.ray>