Re: gigaset: freeing an active object
From: Paul Bolle <hidden>
Date: 2015-12-06 13:31:37
Also in:
lkml
On wo, 2015-12-02 at 18:48 -0500, Peter Hurley wrote:
On 11/30/2015 01:01 PM, Paul Bolle wrote:quoted
Should (something like) this go into stable too?Definitely for stable since it has a userspace triggerable component.
Thanks, will do.
quoted
--- a/drivers/isdn/gigaset/ser-gigaset.c +++ b/drivers/isdn/gigaset/ser-gigaset.c@@ -42,8 +42,9 @@ MODULE_PARM_DESC(cidmode, "stay in CID mode whenidle"); static struct gigaset_driver *driver; +static struct platform_device pdev; + struct ser_cardstate { - struct platform_device dev; struct tty_struct *tty; atomic_t refcnt; struct completion dead_cmp;@@ -370,8 +371,8 @@ static void gigaset_freecshw(struct cardstate*cs) tasklet_kill(&cs->write_tasklet); if (!cs->hw.ser) return; - dev_set_drvdata(&cs->hw.ser->dev.dev, NULL); - platform_device_unregister(&cs->hw.ser->dev); + dev_set_drvdata(&pdev.dev, NULL); + platform_device_unregister(&pdev); kfree(cs->hw.ser);Tilman, Is there a 1:1 correspondence and lifetime for the embedded platform device and it's containing memory?
(Haven't heard from Tilman, so I'll give this a try.) That containing memory is a struct ser_cardstate. And currently instances of struct _ser_cardstate are malloced and freed in routines that also call platform_device_register() and platform_device_unregister(). So yes, I think there's a 1:1 correspondence.
I ask because the typical approach for device teardown is to put the kfree() in the release method;
(Side note: the (struct device) release method of this driver -gigaset_device_release() - is actually a nop. It only frees device ->platform_data and platform_device->resource, but neither are actually used: they remain NULL through their entire life.)
naturally, that won't work if there is some other lifetime issue.
I'm not sure I follow what you mean here. Could you point me at a driver that uses that approach, so that I can have a look at it? Thanks, Paul Bolle