struct cma **res_cma);
extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align,
bool no_warn);
-extern bool cma_pages_valid(struct cma *cma, const struct page *pages, unsigned long count);
extern bool cma_release(struct cma *cma, const struct page *pages, unsigned long count);
extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data);
return page ? page_folio(page) : NULL;
}
-bool cma_pages_valid(struct cma *cma, const struct page *pages,
- unsigned long count)
-{
- unsigned long pfn, end;
- int r;
- struct cma_memrange *cmr;
- bool ret;
-
- if (!cma || !pages || count > cma->count)
- return false;
-
- pfn = page_to_pfn(pages);
- ret = false;
-
- for (r = 0; r < cma->nranges; r++) {
- cmr = &cma->ranges[r];
- end = cmr->base_pfn + cmr->count;
- if (pfn >= cmr->base_pfn && pfn < end) {
- ret = pfn + count <= end;
- break;
- }
- }
-
- if (!ret)
- pr_debug("%s(page %p, count %lu)\n",
- __func__, (void *)pages, count);
-
- return ret;
-}
-
/**
* cma_release() - release allocated pages
* @cma: Contiguous memory region for which the allocation is performed.
pr_debug("%s(page %p, count %lu)\n", __func__, (void *)pages, count);
- if (!cma_pages_valid(cma, pages, count))
+ if (!cma || !pages || count > cma->count)
return false;
pfn = page_to_pfn(pages);
- end_pfn = pfn + count;
for (r = 0; r < cma->nranges; r++) {
cmr = &cma->ranges[r];
- if (pfn >= cmr->base_pfn &&
- pfn < (cmr->base_pfn + cmr->count)) {
- VM_BUG_ON(end_pfn > cmr->base_pfn + cmr->count);
- break;
+ end_pfn = cmr->base_pfn + cmr->count;
+ if (pfn >= cmr->base_pfn && pfn < end_pfn) {
+ if (pfn + count <= end_pfn)
+ break;
+
+ VM_WARN_ON_ONCE(1);
}
}
- if (r == cma->nranges)
+ if (r == cma->nranges) {
+ pr_debug("%s(page %p, count %lu, no cma range matches the page range)\n",
+ __func__, (void *)pages, count);
return false;
+ }
free_contig_range(pfn, count);
cma_clear_bitmap(cma, cmr, pfn, count);