--- linux/mm/vmscan.c Mon Jun 19 23:57:44 2000 +++ linux-hacked/mm/vmscan.c Tue Jun 20 12:23:45 2000 @@ -356,8 +356,9 @@ struct task_struct * p; int counter; int __ret = 0; + struct mm_struct *best = NULL; + int pid = 0; - lock_kernel(); /* * We make one or two passes through the task list, indexed by * assign = {0, 1}: @@ -372,49 +373,39 @@ * Think of swap_cnt as a "shadow rss" - it tells us which process * we want to page out (always try largest first). */ - counter = (nr_threads << 2) >> (priority >> 2); + counter = priority; if (counter < 1) counter = 1; - for (; counter >= 0; counter--) { - unsigned long max_cnt = 0; - struct mm_struct *best = NULL; - int pid = 0; - int assign = 0; - select: - read_lock(&tasklist_lock); - p = init_task.next_task; - for (; p != &init_task; p = p->next_task) { - struct mm_struct *mm = p->mm; - if (!p->swappable || !mm) - continue; - if (mm->rss <= 0) - continue; - /* Refresh swap_cnt? */ - if (assign == 1) - mm->swap_cnt = mm->rss; - if (mm->swap_cnt > max_cnt) { - max_cnt = mm->swap_cnt; - best = mm; - pid = p->pid; - } - } + printk(KERN_DEBUG "vmscan: count %d\n", counter ); + + lock_kernel(); + + + read_lock(&tasklist_lock); + p = init_task.next_task; + for (; p != &init_task; p = p->next_task) { + struct mm_struct *mm = p->mm; + if (!p->swappable || !mm) + continue; + if (mm->rss <= 0) + continue; + + best = mm; + pid = p->pid; read_unlock(&tasklist_lock); - if (!best) { - if (!assign) { - assign = 1; - goto select; - } - goto out; - } else { + { int ret; atomic_inc(&best->mm_count); ret = swap_out_mm(best, gfp_mask); mmdrop(best); - if (!ret) + if (!ret) { + if(!--counter)goto out; continue; + } + if (ret < 0) kill_proc(pid, SIGBUS, 1); @@ -422,6 +413,21 @@ goto out; } } + read_unlock(&tasklist_lock); + read_lock(&tasklist_lock); + p = init_task.next_task; + for (; p != &init_task; p = p->next_task) { + struct mm_struct *mm = p->mm; + if (!p->swappable || !mm) + continue; + if (mm->rss <= 0) + continue; + mm->swap_cnt = mm->rss; + } + read_unlock(&tasklist_lock); + + goto out; + out: unlock_kernel(); return __ret;