aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc
diff options
context:
space:
mode:
authorMel Gorman <mel@csn.ul.ie>2007-10-16 04:25:52 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:43:00 -0400
commite12ba74d8ff3e2f73a583500d7095e406df4d093 (patch)
treea0d3385b65f0b3e1e00b0bbf11b75e7538a93edb /fs/proc
parentc361be55b3128474aa66d31092db330b07539103 (diff)
Group short-lived and reclaimable kernel allocations
This patch marks a number of allocations that are either short-lived such as network buffers or are reclaimable such as inode allocations. When something like updatedb is called, long-lived and unmovable kernel allocations tend to be spread throughout the address space which increases fragmentation. This patch groups these allocations together as much as possible by adding a new MIGRATE_TYPE. The MIGRATE_RECLAIMABLE type is for allocations that can be reclaimed on demand, but not moved. i.e. they can be migrated by deleting them and re-reading the information from elsewhere. Signed-off-by: Mel Gorman <mel@csn.ul.ie> Cc: Andy Whitcroft <apw@shadowen.org> Cc: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
-rw-r--r--fs/proc/base.c13
-rw-r--r--fs/proc/generic.c2
2 files changed, 8 insertions, 7 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index e5d0953d4db1..78fdfea1a7f8 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -492,7 +492,7 @@ static ssize_t proc_info_read(struct file * file, char __user * buf,
492 count = PROC_BLOCK_SIZE; 492 count = PROC_BLOCK_SIZE;
493 493
494 length = -ENOMEM; 494 length = -ENOMEM;
495 if (!(page = __get_free_page(GFP_KERNEL))) 495 if (!(page = __get_free_page(GFP_TEMPORARY)))
496 goto out; 496 goto out;
497 497
498 length = PROC_I(inode)->op.proc_read(task, (char*)page); 498 length = PROC_I(inode)->op.proc_read(task, (char*)page);
@@ -532,7 +532,7 @@ static ssize_t mem_read(struct file * file, char __user * buf,
532 goto out; 532 goto out;
533 533
534 ret = -ENOMEM; 534 ret = -ENOMEM;
535 page = (char *)__get_free_page(GFP_USER); 535 page = (char *)__get_free_page(GFP_TEMPORARY);
536 if (!page) 536 if (!page)
537 goto out; 537 goto out;
538 538
@@ -602,7 +602,7 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
602 goto out; 602 goto out;
603 603
604 copied = -ENOMEM; 604 copied = -ENOMEM;
605 page = (char *)__get_free_page(GFP_USER); 605 page = (char *)__get_free_page(GFP_TEMPORARY);
606 if (!page) 606 if (!page)
607 goto out; 607 goto out;
608 608
@@ -788,7 +788,7 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,
788 /* No partial writes. */ 788 /* No partial writes. */
789 return -EINVAL; 789 return -EINVAL;
790 } 790 }
791 page = (char*)__get_free_page(GFP_USER); 791 page = (char*)__get_free_page(GFP_TEMPORARY);
792 if (!page) 792 if (!page)
793 return -ENOMEM; 793 return -ENOMEM;
794 length = -EFAULT; 794 length = -EFAULT;
@@ -954,7 +954,8 @@ static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
954 char __user *buffer, int buflen) 954 char __user *buffer, int buflen)
955{ 955{
956 struct inode * inode; 956 struct inode * inode;
957 char *tmp = (char*)__get_free_page(GFP_KERNEL), *path; 957 char *tmp = (char*)__get_free_page(GFP_TEMPORARY);
958 char *path;
958 int len; 959 int len;
959 960
960 if (!tmp) 961 if (!tmp)
@@ -1726,7 +1727,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
1726 goto out; 1727 goto out;
1727 1728
1728 length = -ENOMEM; 1729 length = -ENOMEM;
1729 page = (char*)__get_free_page(GFP_USER); 1730 page = (char*)__get_free_page(GFP_TEMPORARY);
1730 if (!page) 1731 if (!page)
1731 goto out; 1732 goto out;
1732 1733
diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index b5e7155d30d8..1bdb62435758 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -74,7 +74,7 @@ proc_file_read(struct file *file, char __user *buf, size_t nbytes,
74 nbytes = MAX_NON_LFS - pos; 74 nbytes = MAX_NON_LFS - pos;
75 75
76 dp = PDE(inode); 76 dp = PDE(inode);
77 if (!(page = (char*) __get_free_page(GFP_KERNEL))) 77 if (!(page = (char*) __get_free_page(GFP_TEMPORARY)))
78 return -ENOMEM; 78 return -ENOMEM;
79 79
80 while ((nbytes > 0) && !eof) { 80 while ((nbytes > 0) && !eof) {