Skip to content

Commit

Permalink
powerpc: Add reboot notifier to Collaborative Memory Manager
Browse files Browse the repository at this point in the history
When running Active Memory Sharing, pages can get marked as
"loaned" with the hypervisor by the CMM driver. This state gets
cleared by the system firmware when rebooting the partition.
When using kexec to boot a new kernel, this state never gets
cleared and the hypervisor and CMM driver can get out of sync
with respect to the number of pages currently marked "loaned".
Fix this by adding a reboot notifier to the CMM driver to deflate
the balloon and mark all pages as active.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Brian King authored and Paul Mackerras committed Dec 21, 2008
1 parent 2218108 commit fecba96
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion arch/powerpc/platforms/pseries/cmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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
*
Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -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);
}
Expand Down

0 comments on commit fecba96

Please sign in to comment.