diff options
Diffstat (limited to 'mm/cma.c')
| -rw-r--r-- | mm/cma.c | 26 | 
1 files changed, 21 insertions, 5 deletions
@@ -378,7 +378,7 @@ int __init cma_declare_contiguous_nid(phys_addr_t base,  	return 0;  free_mem: -	memblock_free(base, size); +	memblock_phys_free(base, size);  err:  	pr_err("Failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M);  	return ret; @@ -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);  |