Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 May 2012 11:54:14 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org
Cc:        Norbert Koch <nkoch@demig.de>, Warner Losh <imp@freebsd.org>
Subject:   Re: bus device/ivars
Message-ID:  <201205311154.15062.jhb@freebsd.org>
In-Reply-To: <4FC729A2.30205@demig.de>
References:  <4FC729A2.30205@demig.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday, May 31, 2012 4:19:46 am Norbert Koch wrote:
> Hello,
> 
> I have written a bus device driver
> which itself is a pci driver. Child devices
> may allocate resources from my bus device.
> 
> My bus device does the usual
> management of resources through
> the children's ivars.
> 
> My question is this:
> 
> The bus device mallocs the
> children's ivars in bus_add_child
> and frees the ivars in either
> bus_detach or bus_child_detached.
> 
> The children are added in identify
> methods through BUS_ADD_CHILD.
> 
> As I understand the code the bus device's
> bus_child_detached method is called
> in device_delete_child only if
> the child device is already attached.
> 
> So, there seems to be a memory leak if
> I delete the child device in either
> identify or probe.
> 
> My current solution (not tested yet) is to
> explicitly call BUS_CHILD_DETACHED
> in the child device's code before
> calling device_delete_child.
> 
> Is this the correct way or is
> there a more elegant/cleaner solution?
> 
> I expected to find something like a
> BUS_DELETE_CHILD method.

We should perhaps have a BUS_CHILD_DELETED?  I think that would do what you 
want.  We could maybe add a BUS_DELETE_CHILD(), but it would be assymmetric to 
have device_delete_child() call BUS_DELETE_CHILD() when device_add_child() 
does not call BUS_ADD_CHILD().  (Instead, BUS_ADD_CHILD() calls 
device_add_child, which is perhaps wrong.)

For now I would change your child code to call a wrapper foo_delete_child() 
function from your child drivers directly rather than calling 
device_delete_child().   foo_delete_child() can do its cleanup and then call 
device_delete_child().

-- 
John Baldwin



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