Re: pci_alloc_resource is broken

From: Barney Cordoba <barney_cordoba_at_yahoo.com>
Date: Mon, 30 Mar 2009 08:53:02 -0700 (PDT)
--- On Mon, 3/30/09, John Baldwin <jhb_at_FreeBSD.org> wrote:

> From: John Baldwin <jhb_at_FreeBSD.org>
> Subject: Re: pci_alloc_resource is broken
> To: freebsd-current_at_FreeBSD.org, barney_cordoba_at_yahoo.com
> Date: Monday, March 30, 2009, 10:59 AM
> 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

We're remapping in another driver because in the commercial world,
we don't always have access to kernel source, and there is a strong
desire to separate the NIC driver from the secondary function so 
customers can get patches for the OS without having to worry about
incompatibility with the secondary modules.

I can add a function to the NIC driver also, but the goal is to be
able to distribute a module that doesn't require modification to the
stock driver for the system.

Barney


      
Received on Mon Mar 30 2009 - 13:53:03 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:45 UTC