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>
This commit is contained in:

committed by
Linus Torvalds

parent
c361be55b3
commit
e12ba74d8f
@@ -492,7 +492,7 @@ static ssize_t proc_info_read(struct file * file, char __user * buf,
|
||||
count = PROC_BLOCK_SIZE;
|
||||
|
||||
length = -ENOMEM;
|
||||
if (!(page = __get_free_page(GFP_KERNEL)))
|
||||
if (!(page = __get_free_page(GFP_TEMPORARY)))
|
||||
goto out;
|
||||
|
||||
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,
|
||||
goto out;
|
||||
|
||||
ret = -ENOMEM;
|
||||
page = (char *)__get_free_page(GFP_USER);
|
||||
page = (char *)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
goto out;
|
||||
|
||||
@@ -602,7 +602,7 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
|
||||
goto out;
|
||||
|
||||
copied = -ENOMEM;
|
||||
page = (char *)__get_free_page(GFP_USER);
|
||||
page = (char *)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
goto out;
|
||||
|
||||
@@ -788,7 +788,7 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,
|
||||
/* No partial writes. */
|
||||
return -EINVAL;
|
||||
}
|
||||
page = (char*)__get_free_page(GFP_USER);
|
||||
page = (char*)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
length = -EFAULT;
|
||||
@@ -954,7 +954,8 @@ static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
|
||||
char __user *buffer, int buflen)
|
||||
{
|
||||
struct inode * inode;
|
||||
char *tmp = (char*)__get_free_page(GFP_KERNEL), *path;
|
||||
char *tmp = (char*)__get_free_page(GFP_TEMPORARY);
|
||||
char *path;
|
||||
int len;
|
||||
|
||||
if (!tmp)
|
||||
@@ -1726,7 +1727,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
|
||||
goto out;
|
||||
|
||||
length = -ENOMEM;
|
||||
page = (char*)__get_free_page(GFP_USER);
|
||||
page = (char*)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
goto out;
|
||||
|
||||
|
@@ -74,7 +74,7 @@ proc_file_read(struct file *file, char __user *buf, size_t nbytes,
|
||||
nbytes = MAX_NON_LFS - pos;
|
||||
|
||||
dp = PDE(inode);
|
||||
if (!(page = (char*) __get_free_page(GFP_KERNEL)))
|
||||
if (!(page = (char*) __get_free_page(GFP_TEMPORARY)))
|
||||
return -ENOMEM;
|
||||
|
||||
while ((nbytes > 0) && !eof) {
|
||||
|
Reference in New Issue
Block a user