staging: zsmalloc: fix memory leak
authorNitin Gupta <ngupta@vflare.org>
Mon, 2 Apr 2012 14:13:56 +0000 (09:13 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Apr 2012 16:18:59 +0000 (09:18 -0700)
This patch fixes a memory leak in zsmalloc where the first
subpage of each zspage is leaked when the zspage is freed.

Signed-off-by: Nitin Gupta <ngupta@vflare.org>
Acked-by: Seth Jennings <sjenning@linux.vnet.ibm.com>
Acked-by: Dan Magenheimer <dan.magenheimer@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/zsmalloc/zsmalloc-main.c

index 09caa4f2687e04f9a3ce353dbe96838a8b8f1928..917461c66014a23252399d2f7ac974c3777a0b8f 100644 (file)
@@ -267,33 +267,39 @@ static unsigned long obj_idx_to_offset(struct page *page,
        return off + obj_idx * class_size;
 }
 
+static void reset_page(struct page *page)
+{
+       clear_bit(PG_private, &page->flags);
+       clear_bit(PG_private_2, &page->flags);
+       set_page_private(page, 0);
+       page->mapping = NULL;
+       page->freelist = NULL;
+       reset_page_mapcount(page);
+}
+
 static void free_zspage(struct page *first_page)
 {
-       struct page *nextp, *tmp;
+       struct page *nextp, *tmp, *head_extra;
 
        BUG_ON(!is_first_page(first_page));
        BUG_ON(first_page->inuse);
 
-       nextp = (struct page *)page_private(first_page);
+       head_extra = (struct page *)page_private(first_page);
 
-       clear_bit(PG_private, &first_page->flags);
-       clear_bit(PG_private_2, &first_page->flags);
-       set_page_private(first_page, 0);
-       first_page->mapping = NULL;
-       first_page->freelist = NULL;
-       reset_page_mapcount(first_page);
+       reset_page(first_page);
        __free_page(first_page);
 
        /* zspage with only 1 system page */
-       if (!nextp)
+       if (!head_extra)
                return;
 
-       list_for_each_entry_safe(nextp, tmp, &nextp->lru, lru) {
+       list_for_each_entry_safe(nextp, tmp, &head_extra->lru, lru) {
                list_del(&nextp->lru);
-               clear_bit(PG_private_2, &nextp->flags);
-               nextp->index = 0;
+               reset_page(nextp);
                __free_page(nextp);
        }
+       reset_page(head_extra);
+       __free_page(head_extra);
 }
 
 /* Initialize a newly allocated zspage */