mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:50:37 +00:00

Define a function to check if a CMA area is valid, which means: do its ranges not cross any zone boundaries. Store the result in the newly created flags for each CMA area, so that multiple calls are dealt with. This allows for checking the validity of a CMA area early, which is needed later in order to be able to allocate hugetlb bootmem pages from it with pre-HVO. Link: https://lkml.kernel.org/r/20250228182928.2645936-24-fvdl@google.com Signed-off-by: Frank van der Linden <fvdl@google.com> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Dan Carpenter <dan.carpenter@linaro.org> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Joao Martins <joao.m.martins@oracle.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Muchun Song <muchun.song@linux.dev> Cc: Oscar Salvador <osalvador@suse.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Roman Gushchin (Cruise) <roman.gushchin@linux.dev> Cc: Usama Arif <usamaarif642@gmail.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Yu Zhao <yuzhao@google.com> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
81 lines
2.6 KiB
C
81 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __CMA_H__
|
|
#define __CMA_H__
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/types.h>
|
|
#include <linux/numa.h>
|
|
|
|
#ifdef CONFIG_CMA_AREAS
|
|
#define MAX_CMA_AREAS CONFIG_CMA_AREAS
|
|
#endif
|
|
|
|
#define CMA_MAX_NAME 64
|
|
|
|
/*
|
|
* the buddy -- especially pageblock merging and alloc_contig_range()
|
|
* -- can deal with only some pageblocks of a higher-order page being
|
|
* MIGRATE_CMA, we can use pageblock_nr_pages.
|
|
*/
|
|
#define CMA_MIN_ALIGNMENT_PAGES pageblock_nr_pages
|
|
#define CMA_MIN_ALIGNMENT_BYTES (PAGE_SIZE * CMA_MIN_ALIGNMENT_PAGES)
|
|
|
|
struct cma;
|
|
|
|
extern unsigned long totalcma_pages;
|
|
extern phys_addr_t cma_get_base(const struct cma *cma);
|
|
extern unsigned long cma_get_size(const struct cma *cma);
|
|
extern const char *cma_get_name(const struct cma *cma);
|
|
|
|
extern int __init cma_declare_contiguous_nid(phys_addr_t base,
|
|
phys_addr_t size, phys_addr_t limit,
|
|
phys_addr_t alignment, unsigned int order_per_bit,
|
|
bool fixed, const char *name, struct cma **res_cma,
|
|
int nid);
|
|
static inline int __init cma_declare_contiguous(phys_addr_t base,
|
|
phys_addr_t size, phys_addr_t limit,
|
|
phys_addr_t alignment, unsigned int order_per_bit,
|
|
bool fixed, const char *name, struct cma **res_cma)
|
|
{
|
|
return cma_declare_contiguous_nid(base, size, limit, alignment,
|
|
order_per_bit, fixed, name, res_cma, NUMA_NO_NODE);
|
|
}
|
|
extern int __init cma_declare_contiguous_multi(phys_addr_t size,
|
|
phys_addr_t align, unsigned int order_per_bit,
|
|
const char *name, struct cma **res_cma, int nid);
|
|
extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
|
|
unsigned int order_per_bit,
|
|
const char *name,
|
|
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);
|
|
extern bool cma_intersects(struct cma *cma, unsigned long start, unsigned long end);
|
|
|
|
extern void cma_reserve_pages_on_error(struct cma *cma);
|
|
|
|
#ifdef CONFIG_CMA
|
|
struct folio *cma_alloc_folio(struct cma *cma, int order, gfp_t gfp);
|
|
bool cma_free_folio(struct cma *cma, const struct folio *folio);
|
|
bool cma_validate_zones(struct cma *cma);
|
|
#else
|
|
static inline struct folio *cma_alloc_folio(struct cma *cma, int order, gfp_t gfp)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline bool cma_free_folio(struct cma *cma, const struct folio *folio)
|
|
{
|
|
return false;
|
|
}
|
|
static inline bool cma_validate_zones(struct cma *cma)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#endif
|