Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / arch / s390 / mm / cmm.c
index cb29503..51596f4 100644 (file)
 
 #include <asm/pgalloc.h>
 #include <asm/uaccess.h>
-#include <asm/smp.h>
+
+static char *sender = "VMRMSVM";
+module_param(sender, charp, 0400);
+MODULE_PARM_DESC(sender,
+                "Guest name that may send SMSG messages (default VMRMSVM)");
 
 #include "../../../drivers/s390/net/smsgiucv.h"
 
@@ -38,8 +42,8 @@ static volatile long cmm_timed_pages_target = 0;
 static long cmm_timeout_pages = 0;
 static long cmm_timeout_seconds = 0;
 
-static struct cmm_page_array *cmm_page_list = 0;
-static struct cmm_page_array *cmm_timed_page_list = 0;
+static struct cmm_page_array *cmm_page_list = NULL;
+static struct cmm_page_array *cmm_timed_page_list = NULL;
 
 static unsigned long cmm_thread_active = 0;
 static struct work_struct cmm_thread_starter;
@@ -124,7 +128,6 @@ cmm_thread(void *dummy)
        int rc;
 
        daemonize("cmmthread");
-       set_cpus_allowed(current, cpumask_of_cpu(0));
        while (1) {
                rc = wait_event_interruptible(cmm_thread_wait,
                        (cmm_pages != cmm_pages_target ||
@@ -256,7 +259,7 @@ static struct ctl_table cmm_table[];
 
 static int
 cmm_pages_handler(ctl_table *ctl, int write, struct file *filp,
-                 void *buffer, size_t *lenp, loff_t *ppos)
+                 void __user *buffer, size_t *lenp, loff_t *ppos)
 {
        char buf[16], *p;
        long pages;
@@ -297,7 +300,7 @@ cmm_pages_handler(ctl_table *ctl, int write, struct file *filp,
 
 static int
 cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp,
-                   void *buffer, size_t *lenp, loff_t *ppos)
+                   void __user *buffer, size_t *lenp, loff_t *ppos)
 {
        char buf[64], *p;
        long pages, seconds;
@@ -336,19 +339,19 @@ static struct ctl_table cmm_table[] = {
        {
                .ctl_name       = VM_CMM_PAGES,
                .procname       = "cmm_pages",
-               .mode           = 0600,
+               .mode           = 0644,
                .proc_handler   = &cmm_pages_handler,
        },
        {
                .ctl_name       = VM_CMM_TIMED_PAGES,
                .procname       = "cmm_timed_pages",
-               .mode           = 0600,
+               .mode           = 0644,
                .proc_handler   = &cmm_pages_handler,
        },
        {
                .ctl_name       = VM_CMM_TIMEOUT,
                .procname       = "cmm_timeout",
-               .mode           = 0600,
+               .mode           = 0644,
                .proc_handler   = &cmm_timeout_handler,
        },
        { .ctl_name = 0 }
@@ -369,10 +372,12 @@ static struct ctl_table cmm_dir_table[] = {
 #ifdef CONFIG_CMM_IUCV
 #define SMSG_PREFIX "CMM"
 static void
-cmm_smsg_target(char *msg)
+cmm_smsg_target(char *from, char *msg)
 {
        long pages, seconds;
 
+       if (strlen(sender) > 0 && strcmp(from, sender) != 0)
+               return;
        if (!cmm_skip_blanks(msg + strlen(SMSG_PREFIX), &msg))
                return;
        if (strncmp(msg, "SHRINK", 6) == 0) {
@@ -408,21 +413,13 @@ struct ctl_table_header *cmm_sysctl_header;
 static int
 cmm_init (void)
 {
-       int rc;
-
-       /* Prevent logical cpu 0 from being set offline. */
-       rc = smp_get_cpu(cpumask_of_cpu(0));
-       if (rc) {
-               printk(KERN_ERR "CMM: unable to reserve cpu 0\n");
-               return rc;
-       }
 #ifdef CONFIG_CMM_PROC
        cmm_sysctl_header = register_sysctl_table(cmm_dir_table, 1);
 #endif
 #ifdef CONFIG_CMM_IUCV
        smsg_register_callback(SMSG_PREFIX, cmm_smsg_target);
 #endif
-       INIT_WORK(&cmm_thread_starter, (void *) cmm_start_thread, 0);
+       INIT_WORK(&cmm_thread_starter, (void *) cmm_start_thread, NULL);
        init_waitqueue_head(&cmm_thread_wait);
        init_timer(&cmm_timer);
        return 0;
@@ -439,8 +436,6 @@ cmm_exit(void)
 #ifdef CONFIG_CMM_IUCV
        smsg_unregister_callback(SMSG_PREFIX, cmm_smsg_target);
 #endif
-       /* Allow logical cpu 0 to be set offline again. */
-       smp_put_cpu(0);
 }
 
 module_init(cmm_init);