Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Aug 2002 07:33:59 -0400 (EDT)
From:      Andrew Gallatin <gallatin@cs.duke.edu>
To:        Terry Lambert <tlambert2@mindspring.com>
Cc:        freebsd-smp@FreeBSD.org
Subject:   Re: INTR_MPSAFE network drivers
Message-ID:  <15689.7335.156003.394975@grasshopper.cs.duke.edu>
In-Reply-To: <3D48D163.2213890@mindspring.com>
References:  <XFMail.20020729175342.jhb@FreeBSD.org> <20020730000345.E0D9F2A7D6@canning.wemm.org> <15686.48913.150407.307190@grasshopper.cs.duke.edu> <20020730171226.GA26599@cs.rice.edu> <15688.22002.772933.316104@grasshopper.cs.duke.edu> <20020801021235.GD9934@cs.rice.edu> <3D48D163.2213890@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Terry Lambert writes:
 > Alan Cox wrote:
 > > On Wed, Jul 31, 2002 at 05:26:10PM -0400, Andrew Gallatin wrote:
 > > >
 > > > For what its worth, this *seems* to work OK on a non-WITNESS,
 > > > non-INVARIENTs kernel.
 > > 
 > > That's what I would expect.  The difficult problem that we'll have
 > > with kmem_malloc() and friends stems from legacy drivers that rely on
 > > Giant, not a properly locked driver.  If a legacy driver sleeps because
 > > kmem_malloc() is unable to acquire the mb_map or kernel_map lock, they
 > > may wake up to an inconsistent state.  Right now, requiring Giant in
 > > the top half of the kernel to call kmem_malloc() et al. prevents this.
 > 
 > Why the heck is a driver calling this anyway?
 > 
 > Why the heck is there *anything* in the driver that needs a lock
 > that's not implicit in the fact that it's called to process an
 > interrupt?

I (and most network drivers) need to call MGETHDR to restock receive
buffers from the interrupt handler.  When the per-cpu container runs
out of mbufs, the system calls mb_pop_cont().  This calls
kmem_malloc() to allocate storage for more mbufs:


<...>
kmem_malloc(c1579000,1000,1,1fa,c03395de) at kmem_malloc+0x1b5
mb_pop_cont(c03a54a0,1,c156c120,283,0) at mb_pop_cont+0xa8
mb_alloc(c03a54a0,1,1,0,0) at mb_alloc+0x1ec
m_gethdr(1,1,c03a4400,c4203b4c,c158e100) at m_gethdr+0x34
gm_bsd_ether_rxeof(c4203000,34,7b3c,c0372040,0) at gm_bsd_ether_rxeof+0xcd
<...>


Drew

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




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