| .. | .. |
|---|
| 19 | 19 | #include <linux/swap.h> |
|---|
| 20 | 20 | #include <linux/kthread.h> |
|---|
| 21 | 21 | #include <linux/oom.h> |
|---|
| 22 | | -#include <linux/suspend.h> |
|---|
| 23 | 22 | #include <linux/uaccess.h> |
|---|
| 24 | 23 | |
|---|
| 25 | | -#include <asm/pgalloc.h> |
|---|
| 26 | 24 | #include <asm/diag.h> |
|---|
| 27 | 25 | |
|---|
| 28 | 26 | #ifdef CONFIG_CMM_IUCV |
|---|
| .. | .. |
|---|
| 49 | 47 | static volatile long cmm_timed_pages_target; |
|---|
| 50 | 48 | static long cmm_timeout_pages; |
|---|
| 51 | 49 | static long cmm_timeout_seconds; |
|---|
| 52 | | -static int cmm_suspended; |
|---|
| 53 | 50 | |
|---|
| 54 | 51 | static struct cmm_page_array *cmm_page_list; |
|---|
| 55 | 52 | static struct cmm_page_array *cmm_timed_page_list; |
|---|
| .. | .. |
|---|
| 151 | 148 | |
|---|
| 152 | 149 | while (1) { |
|---|
| 153 | 150 | rc = wait_event_interruptible(cmm_thread_wait, |
|---|
| 154 | | - (!cmm_suspended && (cmm_pages != cmm_pages_target || |
|---|
| 155 | | - cmm_timed_pages != cmm_timed_pages_target)) || |
|---|
| 156 | | - kthread_should_stop()); |
|---|
| 151 | + cmm_pages != cmm_pages_target || |
|---|
| 152 | + cmm_timed_pages != cmm_timed_pages_target || |
|---|
| 153 | + kthread_should_stop()); |
|---|
| 157 | 154 | if (kthread_should_stop() || rc == -ERESTARTSYS) { |
|---|
| 158 | 155 | cmm_pages_target = cmm_pages; |
|---|
| 159 | 156 | cmm_timed_pages_target = cmm_timed_pages; |
|---|
| .. | .. |
|---|
| 191 | 188 | del_timer(&cmm_timer); |
|---|
| 192 | 189 | return; |
|---|
| 193 | 190 | } |
|---|
| 194 | | - mod_timer(&cmm_timer, jiffies + cmm_timeout_seconds * HZ); |
|---|
| 191 | + mod_timer(&cmm_timer, jiffies + msecs_to_jiffies(cmm_timeout_seconds * MSEC_PER_SEC)); |
|---|
| 195 | 192 | } |
|---|
| 196 | 193 | |
|---|
| 197 | 194 | static void cmm_timer_fn(struct timer_list *unused) |
|---|
| .. | .. |
|---|
| 247 | 244 | } |
|---|
| 248 | 245 | |
|---|
| 249 | 246 | static int cmm_pages_handler(struct ctl_table *ctl, int write, |
|---|
| 250 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 247 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 251 | 248 | { |
|---|
| 252 | 249 | long nr = cmm_get_pages(); |
|---|
| 253 | 250 | struct ctl_table ctl_entry = { |
|---|
| .. | .. |
|---|
| 266 | 263 | } |
|---|
| 267 | 264 | |
|---|
| 268 | 265 | static int cmm_timed_pages_handler(struct ctl_table *ctl, int write, |
|---|
| 269 | | - void __user *buffer, size_t *lenp, |
|---|
| 266 | + void *buffer, size_t *lenp, |
|---|
| 270 | 267 | loff_t *ppos) |
|---|
| 271 | 268 | { |
|---|
| 272 | 269 | long nr = cmm_get_timed_pages(); |
|---|
| .. | .. |
|---|
| 286 | 283 | } |
|---|
| 287 | 284 | |
|---|
| 288 | 285 | static int cmm_timeout_handler(struct ctl_table *ctl, int write, |
|---|
| 289 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 286 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 290 | 287 | { |
|---|
| 291 | 288 | char buf[64], *p; |
|---|
| 292 | 289 | long nr, seconds; |
|---|
| .. | .. |
|---|
| 299 | 296 | |
|---|
| 300 | 297 | if (write) { |
|---|
| 301 | 298 | len = min(*lenp, sizeof(buf)); |
|---|
| 302 | | - if (copy_from_user(buf, buffer, len)) |
|---|
| 303 | | - return -EFAULT; |
|---|
| 299 | + memcpy(buf, buffer, len); |
|---|
| 304 | 300 | buf[len - 1] = '\0'; |
|---|
| 305 | 301 | cmm_skip_blanks(buf, &p); |
|---|
| 306 | 302 | nr = simple_strtoul(p, &p, 0); |
|---|
| .. | .. |
|---|
| 313 | 309 | cmm_timeout_pages, cmm_timeout_seconds); |
|---|
| 314 | 310 | if (len > *lenp) |
|---|
| 315 | 311 | len = *lenp; |
|---|
| 316 | | - if (copy_to_user(buffer, buf, len)) |
|---|
| 317 | | - return -EFAULT; |
|---|
| 312 | + memcpy(buffer, buf, len); |
|---|
| 318 | 313 | *lenp = len; |
|---|
| 319 | 314 | *ppos += len; |
|---|
| 320 | 315 | } |
|---|
| .. | .. |
|---|
| 390 | 385 | |
|---|
| 391 | 386 | static struct ctl_table_header *cmm_sysctl_header; |
|---|
| 392 | 387 | |
|---|
| 393 | | -static int cmm_suspend(void) |
|---|
| 394 | | -{ |
|---|
| 395 | | - cmm_suspended = 1; |
|---|
| 396 | | - cmm_free_pages(cmm_pages, &cmm_pages, &cmm_page_list); |
|---|
| 397 | | - cmm_free_pages(cmm_timed_pages, &cmm_timed_pages, &cmm_timed_page_list); |
|---|
| 398 | | - return 0; |
|---|
| 399 | | -} |
|---|
| 400 | | - |
|---|
| 401 | | -static int cmm_resume(void) |
|---|
| 402 | | -{ |
|---|
| 403 | | - cmm_suspended = 0; |
|---|
| 404 | | - cmm_kick_thread(); |
|---|
| 405 | | - return 0; |
|---|
| 406 | | -} |
|---|
| 407 | | - |
|---|
| 408 | | -static int cmm_power_event(struct notifier_block *this, |
|---|
| 409 | | - unsigned long event, void *ptr) |
|---|
| 410 | | -{ |
|---|
| 411 | | - switch (event) { |
|---|
| 412 | | - case PM_POST_HIBERNATION: |
|---|
| 413 | | - return cmm_resume(); |
|---|
| 414 | | - case PM_HIBERNATION_PREPARE: |
|---|
| 415 | | - return cmm_suspend(); |
|---|
| 416 | | - default: |
|---|
| 417 | | - return NOTIFY_DONE; |
|---|
| 418 | | - } |
|---|
| 419 | | -} |
|---|
| 420 | | - |
|---|
| 421 | | -static struct notifier_block cmm_power_notifier = { |
|---|
| 422 | | - .notifier_call = cmm_power_event, |
|---|
| 423 | | -}; |
|---|
| 424 | | - |
|---|
| 425 | 388 | static int __init cmm_init(void) |
|---|
| 426 | 389 | { |
|---|
| 427 | 390 | int rc = -ENOMEM; |
|---|
| .. | .. |
|---|
| 446 | 409 | rc = register_oom_notifier(&cmm_oom_nb); |
|---|
| 447 | 410 | if (rc < 0) |
|---|
| 448 | 411 | goto out_oom_notify; |
|---|
| 449 | | - rc = register_pm_notifier(&cmm_power_notifier); |
|---|
| 450 | | - if (rc) |
|---|
| 451 | | - goto out_pm; |
|---|
| 452 | 412 | cmm_thread_ptr = kthread_run(cmm_thread, NULL, "cmmthread"); |
|---|
| 453 | 413 | if (!IS_ERR(cmm_thread_ptr)) |
|---|
| 454 | 414 | return 0; |
|---|
| 455 | 415 | |
|---|
| 456 | 416 | rc = PTR_ERR(cmm_thread_ptr); |
|---|
| 457 | | - unregister_pm_notifier(&cmm_power_notifier); |
|---|
| 458 | | -out_pm: |
|---|
| 459 | 417 | unregister_oom_notifier(&cmm_oom_nb); |
|---|
| 460 | 418 | out_oom_notify: |
|---|
| 461 | 419 | #ifdef CONFIG_CMM_IUCV |
|---|
| .. | .. |
|---|
| 475 | 433 | #ifdef CONFIG_CMM_IUCV |
|---|
| 476 | 434 | smsg_unregister_callback(SMSG_PREFIX, cmm_smsg_target); |
|---|
| 477 | 435 | #endif |
|---|
| 478 | | - unregister_pm_notifier(&cmm_power_notifier); |
|---|
| 479 | 436 | unregister_oom_notifier(&cmm_oom_nb); |
|---|
| 480 | 437 | kthread_stop(cmm_thread_ptr); |
|---|
| 481 | 438 | del_timer_sync(&cmm_timer); |
|---|