2012-11-12 11:07:53

by Marek Szyprowski

[permalink] [raw]
Subject: [PATCH] mm: cma: WARN if freed memory is still in use

Memory return to free_contig_range() must have no other references. Let
kernel to complain loudly if page reference count is not equal to 1.

Signed-off-by: Marek Szyprowski <[email protected]>
Reviewed-by: Kyungmin Park <[email protected]>
CC: Michal Nazarewicz <[email protected]>
---
mm/page_alloc.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 022e4ed..290c2eb 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5888,8 +5888,13 @@ done:

void free_contig_range(unsigned long pfn, unsigned nr_pages)
{
- for (; nr_pages--; ++pfn)
- __free_page(pfn_to_page(pfn));
+ struct page *page = pfn_to_page(pfn);
+ int refcount = nr_pages;
+ for (; nr_pages--; page++) {
+ refcount -= page_count(page) == 1;
+ __free_page(page);
+ }
+ WARN(refcount != 0, "some pages are still in use!\n");
}
#endif

--
1.7.9.5


2012-11-13 06:48:40

by Marek Szyprowski

[permalink] [raw]
Subject: [PATCH v2] mm: cma: WARN if freed memory is still in use

Memory returned to free_contig_range() must have no other references. Let
kernel to complain loudly if page reference count is not equal to 1.

Signed-off-by: Marek Szyprowski <[email protected]>
Reviewed-by: Kyungmin Park <[email protected]>
CC: Michal Nazarewicz <[email protected]>
---
mm/page_alloc.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 022e4ed..290c2eb 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5888,8 +5888,13 @@ done:

void free_contig_range(unsigned long pfn, unsigned nr_pages)
{
- for (; nr_pages--; ++pfn)
- __free_page(pfn_to_page(pfn));
+ struct page *page = pfn_to_page(pfn);
+ int count = 0;
+ for (; nr_pages--; page++) {
+ count += page_count(page) != 1;
+ __free_page(page);
+ }
+ WARN(count != 0, "%d pages are still in use!\n", count);
}
#endif

--
1.7.9.5