gov->free(policy_dbs);
 }
 
+static void cpufreq_dbs_data_release(struct kobject *kobj)
+{
+       struct dbs_data *dbs_data = to_dbs_data(to_gov_attr_set(kobj));
+       struct dbs_governor *gov = dbs_data->gov;
+
+       gov->exit(dbs_data);
+       kfree(dbs_data);
+}
+
 int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
 {
        struct dbs_governor *gov = dbs_governor_of(policy);
                goto free_policy_dbs_info;
        }
 
+       dbs_data->gov = gov;
        gov_attr_set_init(&dbs_data->attr_set, &policy_dbs->list);
 
        ret = gov->init(dbs_data);
        policy->governor_data = policy_dbs;
 
        gov->kobj_type.sysfs_ops = &governor_sysfs_ops;
+       gov->kobj_type.release = cpufreq_dbs_data_release;
        ret = kobject_init_and_add(&dbs_data->attr_set.kobj, &gov->kobj_type,
                                   get_governor_parent_kobj(policy),
                                   "%s", gov->gov.name);
 
        policy->governor_data = NULL;
 
-       if (!count) {
-               if (!have_governor_per_policy())
-                       gov->gdbs_data = NULL;
-
-               gov->exit(dbs_data);
-               kfree(dbs_data);
-       }
+       if (!count && !have_governor_per_policy())
+               gov->gdbs_data = NULL;
 
        free_policy_dbs_info(policy_dbs, gov);
 
 
 /* Governor demand based switching data (per-policy or global). */
 struct dbs_data {
        struct gov_attr_set attr_set;
+       struct dbs_governor *gov;
        void *tuners;
        unsigned int ignore_nice_load;
        unsigned int sampling_rate;