| From b836aec53e2bce71de1d5415313380688c851477 Mon Sep 17 00:00:00 2001 |
| From: Bob Liu <lliubbo@gmail.com> |
| Date: Thu, 14 Apr 2011 15:22:20 -0700 |
| Subject: ramfs: fix memleak on no-mmu arch |
| |
| 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; |