summaryrefslogtreecommitdiffstats
path: root/drivers/devfreq/governor_userspace.c
diff options
context:
space:
mode:
authorChris Diamand <chris.diamand@arm.com>2017-01-12 14:57:41 +0000
committerMyungJoo Ham <myungjoo.ham@samsung.com>2017-01-31 14:12:18 +0900
commit924b9111a14f2c913782597d9d0795c67f1a6898 (patch)
treecf0fb141a28d59409fc0a80dd7a418260b1dba93 /drivers/devfreq/governor_userspace.c
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
downloadlinux-924b9111a14f2c913782597d9d0795c67f1a6898.tar.bz2
PM / devfreq: Don't delete sysfs group twice
The 'userspace' governor adds a sysfs entry, which is removed when the governor is changed, or the devfreq device is released. However, when the latter occurs via device_unregister(), device_del() is called first, which removes the sysfs entries recursively and deletes the kobject. This means we get an Oops when the governor calls sysfs_remove_group() on the deleted kobject. Fix this by only doing the call when kobj *hasn't* been kobject_del()'d. Note that we can't just remove the call to sysfs_remove_group() entirely - it's needed for when the governor is changed to one which doesn't need a sysfs entry. Signed-off-by: Chris Diamand <chris.diamand@arm.com> Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Diffstat (limited to 'drivers/devfreq/governor_userspace.c')
-rw-r--r--drivers/devfreq/governor_userspace.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c
index 35de6e83c1fe..9db4d6f2006a 100644
--- a/drivers/devfreq/governor_userspace.c
+++ b/drivers/devfreq/governor_userspace.c
@@ -112,7 +112,13 @@ out:
static void userspace_exit(struct devfreq *devfreq)
{
- sysfs_remove_group(&devfreq->dev.kobj, &dev_attr_group);
+ /*
+ * Remove the sysfs entry, unless this is being called after
+ * device_del(), which should have done this already via kobject_del().
+ */
+ if (devfreq->dev.kobj.sd)
+ sysfs_remove_group(&devfreq->dev.kobj, &dev_attr_group);
+
kfree(devfreq->data);
devfreq->data = NULL;
}