[FIX] kernel crash when removing swap_energy module
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 22 Oct 2013 11:22:29 +0000 (15:22 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 23 Oct 2013 10:25:52 +0000 (14:25 +0400)
remove module, when running energy profiling

Change-Id: I5f51c87483b42f8d49f7d4201767522bd2623c2c
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
energy/energy.c
energy/energy.h
parser/features.c

index 1617cbd..da510b3 100644 (file)
@@ -469,7 +469,7 @@ u64 get_parameter_energy(enum parameter_energy pe)
        return val;
 }
 
-int set_energy(void)
+int do_set_energy(void)
 {
        int ret = 0;
 
@@ -503,9 +503,8 @@ unregister_sys_write:
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(set_energy);
 
-void unset_energy(void)
+void do_unset_energy(void)
 {
        dbi_unregister_kretprobe(&switch_to_krp);
        dbi_unregister_kretprobe(&sys_write_krp);
@@ -513,6 +512,50 @@ void unset_energy(void)
 
        uninit_data_energy();
 }
+
+static DEFINE_MUTEX(mutex_enable);
+static int energy_enable = 0;
+
+int set_energy(void)
+{
+       int ret = -EINVAL;
+
+       mutex_lock(&mutex_enable);
+       if (energy_enable) {
+               printk("energy profiling is already run!\n");
+               goto unlock;
+       }
+
+       ret = do_set_energy();
+       if (ret == 0)
+               energy_enable = 1;
+
+unlock:
+       mutex_unlock(&mutex_enable);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(set_energy);
+
+int unset_energy(void)
+{
+       int ret = 0;
+
+       mutex_lock(&mutex_enable);
+       if (energy_enable == 0) {
+               printk("energy profiling is not running!\n");
+               ret = -EINVAL;
+               goto unlock;
+       }
+
+       do_unset_energy();
+
+       energy_enable = 0;
+unlock:
+       mutex_unlock(&mutex_enable);
+
+       return ret;
+}
 EXPORT_SYMBOL_GPL(unset_energy);
 
 int energy_init(void)
@@ -549,4 +592,7 @@ int energy_init(void)
 void energy_uninit(void)
 {
        uninit_feature();
+
+       if (energy_enable)
+               do_unset_energy();
 }
index b77efc8..ef2f651 100644 (file)
@@ -44,7 +44,7 @@ int energy_init(void);
 void energy_uninit(void);
 
 int set_energy(void);
-void unset_energy(void);
+int unset_energy(void);
 
 u64 get_parameter_energy(enum parameter_energy pe);
 
index 74e560d..57f27fb 100644 (file)
@@ -210,8 +210,7 @@ static int set_func_energy(struct conf_data *conf)
 
 static int unset_func_energy(void)
 {
-       unset_energy();
-       return 0;
+       return unset_energy();
 }
 
 struct feature_item {