patch-2.3.16 linux/mm/vmscan.c
Next file: linux/net/Config.in
Previous file: linux/mm/vmalloc.c
Back to the patch index
Back to the overall index
- Lines: 94
- Date:
Mon Aug 30 13:47:18 1999
- Orig file:
v2.3.15/linux/mm/vmscan.c
- Orig date:
Mon Aug 16 17:54:49 1999
diff -u --recursive --new-file v2.3.15/linux/mm/vmscan.c linux/mm/vmscan.c
@@ -17,6 +17,7 @@
#include <linux/smp_lock.h>
#include <linux/pagemap.h>
#include <linux/init.h>
+#include <linux/bigmem.h>
#include <asm/pgtable.h>
@@ -63,7 +64,8 @@
if (PageReserved(page)
|| PageLocked(page)
- || ((gfp_mask & __GFP_DMA) && !PageDMA(page)))
+ || ((gfp_mask & __GFP_DMA) && !PageDMA(page))
+ || (!(gfp_mask & __GFP_BIGMEM) && PageBIGMEM(page)))
goto out_failed_unlock;
/*
@@ -154,6 +156,9 @@
if (!entry)
goto out_failed_unlock; /* No swap space left */
+ if (!(page = prepare_bigmem_swapout(page)))
+ goto out_swap_free_unlock;
+
vma->vm_mm->rss--;
set_pte(page_table, __pte(entry));
spin_unlock(&vma->vm_mm->page_table_lock);
@@ -174,6 +179,11 @@
spin_unlock(&vma->vm_mm->page_table_lock);
out_failed:
return 0;
+out_swap_free_unlock:
+ swap_free(entry);
+ spin_unlock(&vma->vm_mm->page_table_lock);
+ return 0;
+
}
/*
@@ -316,7 +326,9 @@
{
struct task_struct * p;
int counter;
+ int __ret = 0;
+ lock_kernel();
/*
* We make one or two passes through the task list, indexed by
* assign = {0, 1}:
@@ -379,11 +391,13 @@
if (ret < 0)
kill_proc(pid, SIGBUS, 1);
- return 1;
+ __ret = 1;
+ goto out;
}
}
out:
- return 0;
+ unlock_kernel();
+ return __ret;
}
/*
@@ -400,8 +414,6 @@
int priority;
int count = SWAP_CLUSTER_MAX;
- lock_kernel();
-
/* Always trim SLAB caches when memory gets low. */
kmem_cache_reap(gfp_mask);
@@ -429,7 +441,6 @@
shrink_dcache_memory(priority, gfp_mask);
} while (--priority >= 0);
done:
- unlock_kernel();
return priority >= 0;
}
@@ -484,7 +495,9 @@
* up on a more timely basis.
*/
do {
- if (nr_free_pages >= freepages.high)
+ /* kswapd is critical to provide GFP_ATOMIC
+ allocations (not GFP_BIGMEM ones). */
+ if (nr_free_pages - nr_free_bigpages >= freepages.high)
break;
if (!do_try_to_free_pages(GFP_KSWAPD))
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)