.. | .. |
---|
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); |
---|