mm/cma: add cma_pages_valid to determine if pages are in CMA
[linux-2.6-block.git] / mm / cma.c
index 995e15480937fee8ceb6e88d0b78b21be8d6a5eb..11152c3fb23ccf4b9376f9e9b1ca30b59b818720 100644 (file)
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -524,6 +524,25 @@ out:
        return page;
 }
 
+bool cma_pages_valid(struct cma *cma, const struct page *pages,
+                    unsigned long count)
+{
+       unsigned long pfn;
+
+       if (!cma || !pages)
+               return false;
+
+       pfn = page_to_pfn(pages);
+
+       if (pfn < cma->base_pfn || pfn >= cma->base_pfn + cma->count) {
+               pr_debug("%s(page %p, count %lu)\n", __func__,
+                                               (void *)pages, count);
+               return false;
+       }
+
+       return true;
+}
+
 /**
  * cma_release() - release allocated pages
  * @cma:   Contiguous memory region for which the allocation is performed.
@@ -539,16 +558,13 @@ bool cma_release(struct cma *cma, const struct page *pages,
 {
        unsigned long pfn;
 
-       if (!cma || !pages)
+       if (!cma_pages_valid(cma, pages, count))
                return false;
 
        pr_debug("%s(page %p, count %lu)\n", __func__, (void *)pages, count);
 
        pfn = page_to_pfn(pages);
 
-       if (pfn < cma->base_pfn || pfn >= cma->base_pfn + cma->count)
-               return false;
-
        VM_BUG_ON(pfn + count > cma->base_pfn + cma->count);
 
        free_contig_range(pfn, count);