patch-2.2.14 linux/mm/vmscan.c
Next file: linux/net/802/fc.c
Previous file: linux/mm/swapfile.c
Back to the patch index
Back to the overall index
- Lines: 111
- Date:
Tue Jan 4 10:12:26 2000
- Orig file:
v2.2.13/linux/mm/vmscan.c
- Orig date:
Fri Apr 23 11:07:30 1999
diff -u --recursive --new-file v2.2.13/linux/mm/vmscan.c linux/mm/vmscan.c
@@ -53,6 +53,7 @@
* tables to the global page map.
*/
set_pte(page_table, pte_mkold(pte));
+ flush_tlb_page(vma, address);
set_bit(PG_referenced, &page_map->flags);
return 0;
}
@@ -95,6 +96,7 @@
* some real work in the future in "shrink_mmap()".
*/
if (!pte_dirty(pte)) {
+ flush_cache_page(vma, address);
pte_clear(page_table);
goto drop_pte;
}
@@ -308,7 +310,8 @@
static int swap_out(unsigned int priority, int gfp_mask)
{
struct task_struct * p, * pbest;
- int counter, assign, max_cnt;
+ int assign = 0, counter;
+ unsigned long max_cnt;
/*
* We make one or two passes through the task list, indexed by
@@ -327,11 +330,8 @@
counter = nr_tasks / (priority+1);
if (counter < 1)
counter = 1;
- if (counter > nr_tasks)
- counter = nr_tasks;
for (; counter >= 0; counter--) {
- assign = 0;
max_cnt = 0;
pbest = NULL;
select:
@@ -343,7 +343,7 @@
if (p->mm->rss <= 0)
continue;
/* Refresh swap_cnt? */
- if (assign)
+ if (assign == 1)
p->mm->swap_cnt = p->mm->rss;
if (p->mm->swap_cnt > max_cnt) {
max_cnt = p->mm->swap_cnt;
@@ -351,6 +351,8 @@
}
}
read_unlock(&tasklist_lock);
+ if (assign == 1)
+ assign = 2;
if (!pbest) {
if (!assign) {
assign = 1;
@@ -435,7 +437,7 @@
printk ("Starting kswapd v%.*s\n", i, s);
}
-static struct task_struct *kswapd_process;
+static struct wait_queue * kswapd_wait = NULL;
/*
* The background pageout daemon, started as a kernel thread
@@ -455,7 +457,6 @@
{
struct task_struct *tsk = current;
- kswapd_process = tsk;
tsk->session = 1;
tsk->pgrp = 1;
strcpy(tsk->comm, "kswapd");
@@ -484,16 +485,18 @@
* the processes needing more memory will wake us
* up on a more timely basis.
*/
- do {
- if (nr_free_pages >= freepages.high)
- break;
-
- if (!do_try_to_free_pages(GFP_KSWAPD))
- break;
- } while (!tsk->need_resched);
- run_task_queue(&tq_disk);
- tsk->state = TASK_INTERRUPTIBLE;
- schedule_timeout(HZ);
+ interruptible_sleep_on_timeout(&kswapd_wait, HZ);
+ while (nr_free_pages < freepages.high)
+ {
+ if (do_try_to_free_pages(GFP_KSWAPD))
+ {
+ if (tsk->need_resched)
+ schedule();
+ continue;
+ }
+ tsk->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(10*HZ);
+ }
}
}
@@ -516,7 +519,7 @@
{
int retval = 1;
- wake_up_process(kswapd_process);
+ wake_up_interruptible(&kswapd_wait);
if (gfp_mask & __GFP_WAIT)
retval = do_try_to_free_pages(gfp_mask);
return retval;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)