File Index
Files and directories
Sign in
FILE

cma.h

File preview with syntax highlighting.

linux-6.19.14/mm/cma.h C
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef __MM_CMA_H__
 3#define __MM_CMA_H__
 4
 5#include <linux/debugfs.h>
 6#include <linux/kobject.h>
 7
 8struct cma_kobject {
 9	struct kobject kobj;
10	struct cma *cma;
11};
12
13/*
14 * Multi-range support. This can be useful if the size of the allocation
15 * is not expected to be larger than the alignment (like with hugetlb_cma),
16 * and the total amount of memory requested, while smaller than the total
17 * amount of memory available, is large enough that it doesn't fit in a
18 * single physical memory range because of memory holes.
19 *
20 * Fields:
21 *   @base_pfn: physical address of range
22 *   @early_pfn: first PFN not reserved through cma_reserve_early
23 *   @count: size of range
24 *   @bitmap: bitmap of allocated (1 << order_per_bit)-sized chunks.
25 */
26struct cma_memrange {
27	unsigned long base_pfn;
28	unsigned long count;
29	union {
30		unsigned long early_pfn;
31		unsigned long *bitmap;
32	};
33#ifdef CONFIG_CMA_DEBUGFS
34	struct debugfs_u32_array dfs_bitmap;
35#endif
36};
37#define CMA_MAX_RANGES 8
38
39struct cma {
40	unsigned long   count;
41	unsigned long	available_count;
42	unsigned int order_per_bit; /* Order of pages represented by one bit */
43	spinlock_t	lock;
44	struct mutex alloc_mutex;
45#ifdef CONFIG_CMA_DEBUGFS
46	struct hlist_head mem_head;
47	spinlock_t mem_head_lock;
48#endif
49	char name[CMA_MAX_NAME];
50	int nranges;
51	struct cma_memrange ranges[CMA_MAX_RANGES];
52#ifdef CONFIG_CMA_SYSFS
53	/* the number of CMA page successful allocations */
54	atomic64_t nr_pages_succeeded;
55	/* the number of CMA page allocation failures */
56	atomic64_t nr_pages_failed;
57	/* the number of CMA page released */
58	atomic64_t nr_pages_released;
59	/* kobject requires dynamic object */
60	struct cma_kobject *cma_kobj;
61#endif
62	unsigned long flags;
63	/* NUMA node (NUMA_NO_NODE if unspecified) */
64	int nid;
65};
66
67enum cma_flags {
68	CMA_RESERVE_PAGES_ON_ERROR,
69	CMA_ZONES_VALID,
70	CMA_ZONES_INVALID,
71	CMA_ACTIVATED,
72};
73
74extern struct cma cma_areas[MAX_CMA_AREAS];
75extern unsigned int cma_area_count;
76
77static inline unsigned long cma_bitmap_maxno(struct cma *cma,
78		struct cma_memrange *cmr)
79{
80	return cmr->count >> cma->order_per_bit;
81}
82
83#ifdef CONFIG_CMA_SYSFS
84void cma_sysfs_account_success_pages(struct cma *cma, unsigned long nr_pages);
85void cma_sysfs_account_fail_pages(struct cma *cma, unsigned long nr_pages);
86void cma_sysfs_account_release_pages(struct cma *cma, unsigned long nr_pages);
87#else
88static inline void cma_sysfs_account_success_pages(struct cma *cma,
89						   unsigned long nr_pages) {};
90static inline void cma_sysfs_account_fail_pages(struct cma *cma,
91						unsigned long nr_pages) {};
92static inline void cma_sysfs_account_release_pages(struct cma *cma,
93						   unsigned long nr_pages) {};
94#endif
95#endif
~/ Read-only file preview.