Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 35711
b: refs/heads/master
c: e8216de
h: refs/heads/master
i:
  35709: ae2beda
  35707: 12aa938
  35703: ccf1057
  35695: 0d91992
  35679: dfacf56
  35647: 2d9c780
  35583: f5b7725
v: v3
  • Loading branch information
Heiko Carstens authored and Linus Torvalds committed Sep 26, 2006
1 parent 5b08b30 commit 1fe702b
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e8df8c3304cfc7d68e9a6a7b6df6c64783cd6991
refs/heads/master: e8216dee838c09776680a6f1a2e54d81f3cdfa14
54 changes: 35 additions & 19 deletions trunk/arch/s390/mm/cmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/sysctl.h>
#include <linux/ctype.h>
#include <linux/swap.h>
#include <linux/kthread.h>

#include <asm/pgalloc.h>
#include <asm/uaccess.h>
Expand Down Expand Up @@ -46,8 +47,7 @@ static struct cmm_page_array *cmm_page_list;
static struct cmm_page_array *cmm_timed_page_list;
static DEFINE_SPINLOCK(cmm_lock);

static unsigned long cmm_thread_active;
static struct work_struct cmm_thread_starter;
static struct task_struct *cmm_thread_ptr;
static wait_queue_head_t cmm_thread_wait;
static struct timer_list cmm_timer;

Expand Down Expand Up @@ -143,14 +143,12 @@ cmm_thread(void *dummy)
{
int rc;

daemonize("cmmthread");
while (1) {
rc = wait_event_interruptible(cmm_thread_wait,
(cmm_pages != cmm_pages_target ||
cmm_timed_pages != cmm_timed_pages_target));
if (rc == -ERESTARTSYS) {
/* Got kill signal. End thread. */
clear_bit(0, &cmm_thread_active);
cmm_timed_pages != cmm_timed_pages_target ||
kthread_should_stop()));
if (kthread_should_stop() || rc == -ERESTARTSYS) {
cmm_pages_target = cmm_pages;
cmm_timed_pages_target = cmm_timed_pages;
break;
Expand All @@ -175,17 +173,9 @@ cmm_thread(void *dummy)
return 0;
}

static void
cmm_start_thread(void)
{
kernel_thread(cmm_thread, NULL, 0);
}

static void
cmm_kick_thread(void)
{
if (!test_and_set_bit(0, &cmm_thread_active))
schedule_work(&cmm_thread_starter);
wake_up(&cmm_thread_wait);
}

Expand Down Expand Up @@ -429,22 +419,48 @@ struct ctl_table_header *cmm_sysctl_header;
static int
cmm_init (void)
{
int rc = -ENOMEM;

#ifdef CONFIG_CMM_PROC
cmm_sysctl_header = register_sysctl_table(cmm_dir_table, 1);
if (!cmm_sysctl_header)
goto out;
#endif
#ifdef CONFIG_CMM_IUCV
smsg_register_callback(SMSG_PREFIX, cmm_smsg_target);
rc = smsg_register_callback(SMSG_PREFIX, cmm_smsg_target);
if (rc < 0)
goto out_smsg;
#endif
register_oom_notifier(&cmm_oom_nb);
INIT_WORK(&cmm_thread_starter, (void *) cmm_start_thread, NULL);
rc = register_oom_notifier(&cmm_oom_nb);
if (rc < 0)
goto out_oom_notify;
init_waitqueue_head(&cmm_thread_wait);
init_timer(&cmm_timer);
return 0;
cmm_thread_ptr = kthread_run(cmm_thread, NULL, "cmmthread");
rc = IS_ERR(cmm_thread_ptr) ? PTR_ERR(cmm_thread_ptr) : 0;
if (!rc)
goto out;
/*
* kthread_create failed. undo all the stuff from above again.
*/
unregister_oom_notifier(&cmm_oom_nb);

out_oom_notify:
#ifdef CONFIG_CMM_IUCV
smsg_unregister_callback(SMSG_PREFIX, cmm_smsg_target);
out_smsg:
#endif
#ifdef CONFIG_CMM_PROC
unregister_sysctl_table(cmm_sysctl_header);
#endif
out:
return rc;
}

static void
cmm_exit(void)
{
kthread_stop(cmm_thread_ptr);
unregister_oom_notifier(&cmm_oom_nb);
cmm_free_pages(cmm_pages, &cmm_pages, &cmm_page_list);
cmm_free_pages(cmm_timed_pages, &cmm_timed_pages, &cmm_timed_page_list);
Expand Down

0 comments on commit 1fe702b

Please sign in to comment.