Date: Thu, 31 May 2012 10:15:48 -0600 From: Warner Losh <imp@bsdimp.com> To: John Baldwin <jhb@freebsd.org> Cc: Norbert Koch <nkoch@demig.de>, freebsd-hackers@freebsd.org, Warner Losh <imp@freebsd.org> Subject: Re: bus device/ivars Message-ID: <2A30119B-0C5E-43A9-9B26-11FCF6685999@bsdimp.com> In-Reply-To: <201205311154.15062.jhb@freebsd.org> References: <4FC729A2.30205@demig.de> <201205311154.15062.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On May 31, 2012, at 9:54 AM, John Baldwin wrote: > On Thursday, May 31, 2012 4:19:46 am Norbert Koch wrote: >> Hello, >>=20 >> I have written a bus device driver >> which itself is a pci driver. Child devices >> may allocate resources from my bus device. >>=20 >> My bus device does the usual >> management of resources through >> the children's ivars. >>=20 >> My question is this: >>=20 >> The bus device mallocs the >> children's ivars in bus_add_child >> and frees the ivars in either >> bus_detach or bus_child_detached. >>=20 >> The children are added in identify >> methods through BUS_ADD_CHILD. >>=20 >> 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. >>=20 >> So, there seems to be a memory leak if >> I delete the child device in either >> identify or probe. >>=20 >> My current solution (not tested yet) is to >> explicitly call BUS_CHILD_DETACHED >> in the child device's code before >> calling device_delete_child. >>=20 >> Is this the correct way or is >> there a more elegant/cleaner solution? >>=20 >> I expected to find something like a >> BUS_DELETE_CHILD method. >=20 > We should perhaps have a BUS_CHILD_DELETED? I think that would do = what you=20 > want. We could maybe add a BUS_DELETE_CHILD(), but it would be = assymmetric to=20 > have device_delete_child() call BUS_DELETE_CHILD() when = device_add_child()=20 > does not call BUS_ADD_CHILD(). (Instead, BUS_ADD_CHILD() calls=20 > device_add_child, which is perhaps wrong.) >=20 > For now I would change your child code to call a wrapper = foo_delete_child()=20 > function from your child drivers directly rather than calling=20 > device_delete_child(). foo_delete_child() can do its cleanup and = then call=20 > device_delete_child(). We likely should have a BUS_CHILD_DELETED function that can get called = for each class in the stack when a child is deleted so you can remove = the ivars. The ivars should likely stay around when the device is = merely detached. Warner
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2A30119B-0C5E-43A9-9B26-11FCF6685999>