Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Sep 2001 17:28:29 +0300
From:      Peter Pentchev <roam@ringlet.net>
To:        neckpain@nettaxi.com
Cc:        Andrzej Bialecki <abial@FreeBSD.org>, cc@devcon.net, current@FreeBSD.ORG, audit@FreeBSD.org
Subject:   Re: problem with dynamic sysctls in -current
Message-ID:  <20010910172829.A1983@ringworld.oblivion.bg>
In-Reply-To: <200109090052.RAA03215@taxismtp2.alchemyfx.com>; from neckpain@nettaxi.com on Sun, Sep 09, 2001 at 09:49:59AM %2B0900
References:  <Pine.BSF.4.33.0109082222050.1392-100000@albert.gate5.de> <200109090052.RAA03215@taxismtp2.alchemyfx.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Sep 09, 2001 at 09:49:59AM +0900, neckpain@nettaxi.com wrote:
> On Sat, Sep 08, 2001 at 10:27:10PM +0200, Christian Carstensen wrote:
> > 
> > hmm,
> > 
> > i've posted the attached mail a week ago to this list, but got no
> > response. could someone please comment on this issue?
> 
> I've also posted a patch(much less refined than yours, though) last month
> but still got no response. Maybe you need to talk to the person who committed
> rev 1.112 of kern_sysctl.c ?

Ouch!  I was wondering why no one complained about the way I broke
dynamic module unloading..  Guess I don't read -current as much as
I should..

Anyway - yes, I am aware of the breakage that rev 1.112 introduced,
although I only became aware of it a week or so ago, when I tried
to MFC it to 4.4-RC..  I wrote up a quick patch to make things work
again, a short discussion on -arch followed, resulting in no real
agreement except for "it's broken, somebody should fix it".
This, of course, is definitely not an appropriate way to end
a discussion about a FreeBSD kernel breakage, but I've been a bit
held up by real work events lately, and my -current system went
a-bye-bye due to unrelated issues, so I had no system to test any
kind of fixes on.

I am CC'ing this to Andrej Bialecki, who seems to know a bit more
than me about kern_sysctl.c; Andrej, is the attached patch good
enough to be committed as an interim fix, until somebody actually
gets around to fixing the sysctl_ctx_free() algorithm?  This patch
is definitely way better than my hack, which added a bogus new
argument to sysctl_add_oid() :)

If there are no objections, I could commit this in the next few
days and take on the responsibility to really look into this in
a week or two, and really clean up the mess I made..

G'luck,
Peter

-- 
Nostalgia ain't what it used to be.

> > ---------- Forwarded message ----------
> > Date: Sat, 1 Sep 2001 03:26:46 +0200 (CEST)
> > From: Christian Carstensen <cc@devcon.net>
> > To: current@freebsd.org
> > Subject: dynamic sysctl problem and proposed hot fix
> > 
> > 
> > hi,
> > 
> > i just came across a problem with dynamic sysctls:
> > when unloading a driver module that used dyn sysctls, my system paniced
> > with "oid too high". that problem is caused by sysctl_ctx_free() in
> > kern/kern_sysctl.c, that first deregisters all oids in the list to see if
> > a error occurs. then, all oids are being reregistered and, if there was no
> > error, they're finally removed.
> > during the second phase, sysctl_register_oid(e1->entry) is called with
> > n := e1->entry->oid_number being the old oid number with n > CTL_AUTO_START.
> > that leads to panic("static sysctl too high") in sysctl_register_oid.
> > one approach might be to initialize the oid_number field to contain the
> > value OID_AUTO before calling sysctl_regiser_oid, but i'm unsure about the
> > side effects of doing that in sysctl_ctx_free().
> > alternatively, the "old" oid number could be reused, the following patch
> > should do, but it's just a workaround.
> > 
> > 
> > best,
> >   christian
> > 
> > --
> > "Sorry, no defects found. Please try a different search"
> >                           [http://www.cisco.com/support/bugtools/bugtool.shtml]
> > 
> > 
> > Index: kern_sysctl.c
> > ===================================================================
> > RCS file: /usr/cvs/src/sys/kern/kern_sysctl.c,v
> > retrieving revision 1.113
> > diff -r1.113 kern_sysctl.c
> > 83a84,96
> > > static struct sysctl_oid *
> > > sysctl_find_oidnumber(const int number, struct sysctl_oid_list *list)
> > > {
> > >       struct sysctl_oid *oidp;
> > >
> > >       SLIST_FOREACH(oidp, list, oid_link) {
> > >               if (oidp->oid_number == number) {
> > >                       return (oidp);
> > >               }
> > >       }
> > >       return (NULL);
> > > }
> > >
> > 125c138,139
> > <               panic("static sysctl oid too high: %d", oidp->oid_number);
> > ---
> > >               if (sysctl_find_oidnumber(oidp->oid_number, parent))
> > >                       panic("static sysctl oid too high: %d", oidp->oid_number);

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010910172829.A1983>