pci_alloc_resource is broken

John Baldwin jhb at FreeBSD.org
Mon Mar 30 08:34:49 PDT 2009


On Sunday 29 March 2009 11:34:32 am Barney Cordoba wrote:
> 
> --- On Sat, 3/28/09, Barney Cordoba <barney_cordoba at yahoo.com> wrote:
> 
> > From: Barney Cordoba <barney_cordoba at yahoo.com>
> > Subject: Re: Bus Resource busy panic
> > To: current at freebsd.org
> > Date: Saturday, March 28, 2009, 8:03 PM
> > --- On Sat, 3/28/09, Barney Cordoba
> > <barney_cordoba at yahoo.com> wrote:
> > 
> > > From: Barney Cordoba <barney_cordoba at yahoo.com>
> > > Subject: Bus Resource busy panic
> > > To: current at freebsd.org
> > > Date: Saturday, March 28, 2009, 6:35 PM
> > > I have a situation that results in a panic in 8 that
> > runs
> > > happily in 7.
> > > Its a bus_alloc_resource of type SYS_RES_MEMORY that
> > is
> > > used by 2
> > > separate devices. 
> > > 
> > > I see there is an RF_SHAREABLE flag. That flag
> > hadn't
> > > been set, but is there
> > > something in 8 that now requires it?
> > > 
> > > As a side question, should a bus_alloc_resource call
> > panic
> > > the system just
> > > because the resource is busy?
> > > 
> > > Barney
> > 
> > Some more info on this. The panic is in
> > resource_list_alloc() and
> > setting SHAREABLE doesn't fix it. I see the same code
> > in 7 so 
> > I'm not sure why it would work in 7 and not 8.
> > 
> > Basically there are 2 devices that need to do IO on a
> > board, and they
> > are both doing
> > 
> > bus_alloc_resource_any(dev, SYS_RES_MEMORY,&rid,
> > RF_ACTIVE);
> > 
> > 
> > Barney
> > 
> 
> I'm not sure if anyone was reading the original thread, so I
> created another with my results.
> 
> Someone broke pci_alloc_resource. In the SYS_RES_MEMORY case, when
> rman_get_device() != dev (but rle->res is set), it erroneously
> falls to resource_list_alloc which will panic on device resource busy.
> 
> It seems that this would preclude the sharing of a resource, as any
> secondary request will not only fail, but panic the system

This was actually on purpose to prevent multiple allocations of a resource.  
Multiple allocations actually leak kernel memory since the resource only 
keeps track of the current mapping.  My question is why are you having one 
device allocate resources of another device?  If you have two functions of a 
multi-function PCI adapter that you want one logical driver for, then have 
each function's driver allocate its own resources and store the 'struct 
resource *' in a "global" softc.  You can then use whichever resource you 
need for bus_read/write when you do bit-banging.

-- 
John Baldwin


More information about the freebsd-current mailing list