]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/powerpc/platforms/pseries/cmm.c
powerpc: Add reboot notifier to Collaborative Memory Manager
[net-next-2.6.git] / arch / powerpc / platforms / pseries / cmm.c
index 5cd4d276162085f43177ac56d7effb162dcdb090..6567439fe78dda4512e0524332255df66b5816a1 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/kthread.h>
 #include <linux/module.h>
 #include <linux/oom.h>
+#include <linux/reboot.h>
 #include <linux/sched.h>
 #include <linux/stringify.h>
 #include <linux/swap.h>
@@ -383,6 +384,26 @@ static void cmm_unregister_sysfs(struct sys_device *sysdev)
        sysdev_class_unregister(&cmm_sysdev_class);
 }
 
+/**
+ * cmm_reboot_notifier - Make sure pages are not still marked as "loaned"
+ *
+ **/
+static int cmm_reboot_notifier(struct notifier_block *nb,
+                              unsigned long action, void *unused)
+{
+       if (action == SYS_RESTART) {
+               if (cmm_thread_ptr)
+                       kthread_stop(cmm_thread_ptr);
+               cmm_thread_ptr = NULL;
+               cmm_free_pages(loaned_pages);
+       }
+       return NOTIFY_DONE;
+}
+
+static struct notifier_block cmm_reboot_nb = {
+       .notifier_call = cmm_reboot_notifier,
+};
+
 /**
  * cmm_init - Module initialization
  *
@@ -399,9 +420,12 @@ static int cmm_init(void)
        if ((rc = register_oom_notifier(&cmm_oom_nb)) < 0)
                return rc;
 
-       if ((rc = cmm_sysfs_register(&cmm_sysdev)))
+       if ((rc = register_reboot_notifier(&cmm_reboot_nb)))
                goto out_oom_notifier;
 
+       if ((rc = cmm_sysfs_register(&cmm_sysdev)))
+               goto out_reboot_notifier;
+
        if (cmm_disabled)
                return rc;
 
@@ -415,6 +439,8 @@ static int cmm_init(void)
 
 out_unregister_sysfs:
        cmm_unregister_sysfs(&cmm_sysdev);
+out_reboot_notifier:
+       unregister_reboot_notifier(&cmm_reboot_nb);
 out_oom_notifier:
        unregister_oom_notifier(&cmm_oom_nb);
        return rc;
@@ -431,6 +457,7 @@ static void cmm_exit(void)
        if (cmm_thread_ptr)
                kthread_stop(cmm_thread_ptr);
        unregister_oom_notifier(&cmm_oom_nb);
+       unregister_reboot_notifier(&cmm_reboot_nb);
        cmm_free_pages(loaned_pages);
        cmm_unregister_sysfs(&cmm_sysdev);
 }