[PATCH 01/11] mm/cma: drop const for struct page on release API
Eric Chanudet <[email protected]>
| Newsgroups | org.kernel.vger.linux-kselftest,org.kernel.vger.cgroups,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
The const is not honored. Both cma_release and cma_release_frozen do a struct page -> pfn -> struct page round-trip to convert the const struct page pointer to struct page and modify it: cma_release calls put_page_testzero() directly, which modifies the page; cma_release_frozen calls free_contig_frozen_range(pfn), __free_contig_frozen_range, then __free_contig_range_common which modifies the page as well. Signed-off-by: Eric Chanudet <[email protected]> --- include/linux/cma.h | 4 ++-- mm/cma.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/linux/cma.h b/include/linux/cma.h index 8555d38a97b1..16e2136421b7 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -49,12 +49,12 @@ extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size, struct cma **res_cma); extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align, bool no_warn); -extern bool cma_release(struct cma *cma, const struct page *pages, unsigned long count); +extern bool cma_release(struct cma *cma, struct page *pages, unsigned long count); struct page *cma_alloc_frozen(struct cma *cma, unsigned long count, unsigned int align, bool no_warn); struct page *cma_alloc_frozen_compound(struct cma *cma, unsigned int order); -bool cma_release_frozen(struct cma *cma, const struct page *pages, +bool cma_release_frozen(struct cma *cma, struct page *pages, unsigned long count); extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data); diff --git a/mm/cma.c b/mm/cma.c index a13ce4999b39..e1820fb451e4 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -992,7 +992,7 @@ static struct cma_memrange *find_cma_memrange(struct cma *cma, } static void __cma_release_frozen(struct cma *cma, struct cma_memrange *cmr, - const struct page *pages, unsigned long count) + struct page *pages, unsigned long count) { unsigned long pfn = page_to_pfn(pages); @@ -1014,7 +1014,7 @@ static void __cma_release_frozen(struct cma *cma, struct cma_memrange *cmr, * It returns false when provided pages do not belong to contiguous area and * true otherwise. */ -bool cma_release(struct cma *cma, const struct page *pages, +bool cma_release(struct cma *cma, struct page *pages, unsigned long count) { struct cma_memrange *cmr; @@ -1037,7 +1037,7 @@ bool cma_release(struct cma *cma, const struct page *pages, } EXPORT_SYMBOL_GPL(cma_release); -bool cma_release_frozen(struct cma *cma, const struct page *pages, +bool cma_release_frozen(struct cma *cma, struct page *pages, unsigned long count) { struct cma_memrange *cmr; -- 2.53.0