Messages in this thread Patch in this message |  | | | Date | Tue, 19 Apr 2011 14:02:24 -0700 | | From | Greg KH <> | | Subject | [08/26] ramfs: fix memleak on no-mmu arch |
| |
2.6.33-longterm review patch. If anyone has any objections, please let us know.
------------------ From: Bob Liu <lliubbo@gmail.com>
commit b836aec53e2bce71de1d5415313380688c851477 upstream.
On no-mmu arch, there is a memleak during shmem test. The cause of this memleak is ramfs_nommu_expand_for_mapping() added page refcount to 2 which makes iput() can't free that pages.
The simple test file is like this:
int main(void) { int i; key_t k = ftok("/etc", 42); for ( i=0; i<100; ++i) { int id = shmget(k, 10000, 0644|IPC_CREAT); if (id == -1) { printf("shmget error\n"); } if(shmctl(id, IPC_RMID, NULL ) == -1) { printf("shm rm error\n"); return -1; } } printf("run ok...\n"); return 0; } And the result:
root:/> free total used free shared buffers Mem: 60320 17912 42408 0 0 -/+ buffers: 17912 42408 root:/> shmem run ok... root:/> free total used free shared buffers Mem: 60320 19096 41224 0 0 -/+ buffers: 19096 41224 root:/> shmem run ok... root:/> free total used free shared buffers Mem: 60320 20296 40024 0 0 -/+ buffers: 20296 40024 ...
After this patch the test result is:(no memleak anymore)
root:/> free total used free shared buffers Mem: 60320 16668 43652 0 0 -/+ buffers: 16668 43652 root:/> shmem run ok... root:/> free total used free shared buffers Mem: 60320 16668 43652 0 0 -/+ buffers: 16668 43652
Signed-off-by: Bob Liu <lliubbo@gmail.com> Acked-by: Hugh Dickins <hughd@google.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- fs/ramfs/file-nommu.c | 1 + 1 file changed, 1 insertion(+) --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -111,6 +111,7 @@ int ramfs_nommu_expand_for_mapping(struc SetPageDirty(page); unlock_page(page); + put_page(page); } return 0;
|  |