2 * CMA DebugFS Interface
4 * Copyright (c) 2015 Sasha Levin <sasha.levin@oracle.com>
8 #include <linux/debugfs.h>
10 #include <linux/list.h>
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/mm_types.h>
18 struct hlist_node node
;
23 static struct dentry
*cma_debugfs_root
;
25 static int cma_debugfs_get(void *data
, u64
*val
)
27 unsigned long *p
= data
;
34 DEFINE_SIMPLE_ATTRIBUTE(cma_debugfs_fops
, cma_debugfs_get
, NULL
, "%llu\n");
36 static void cma_add_to_cma_mem_list(struct cma
*cma
, struct cma_mem
*mem
)
38 spin_lock(&cma
->mem_head_lock
);
39 hlist_add_head(&mem
->node
, &cma
->mem_head
);
40 spin_unlock(&cma
->mem_head_lock
);
43 static struct cma_mem
*cma_get_entry_from_list(struct cma
*cma
)
45 struct cma_mem
*mem
= NULL
;
47 spin_lock(&cma
->mem_head_lock
);
48 if (!hlist_empty(&cma
->mem_head
)) {
49 mem
= hlist_entry(cma
->mem_head
.first
, struct cma_mem
, node
);
50 hlist_del_init(&mem
->node
);
52 spin_unlock(&cma
->mem_head_lock
);
57 static int cma_free_mem(struct cma
*cma
, int count
)
59 struct cma_mem
*mem
= NULL
;
62 mem
= cma_get_entry_from_list(cma
);
66 if (mem
->n
<= count
) {
67 cma_release(cma
, mem
->p
, mem
->n
);
70 } else if (cma
->order_per_bit
== 0) {
71 cma_release(cma
, mem
->p
, count
);
75 cma_add_to_cma_mem_list(cma
, mem
);
77 pr_debug("cma: cannot release partial block when order_per_bit != 0\n");
78 cma_add_to_cma_mem_list(cma
, mem
);
87 static int cma_free_write(void *data
, u64 val
)
90 struct cma
*cma
= data
;
92 return cma_free_mem(cma
, pages
);
95 DEFINE_SIMPLE_ATTRIBUTE(cma_free_fops
, NULL
, cma_free_write
, "%llu\n");
97 static int cma_alloc_mem(struct cma
*cma
, int count
)
102 mem
= kzalloc(sizeof(*mem
), GFP_KERNEL
);
106 p
= cma_alloc(cma
, count
, 0);
115 cma_add_to_cma_mem_list(cma
, mem
);
120 static int cma_alloc_write(void *data
, u64 val
)
123 struct cma
*cma
= data
;
125 return cma_alloc_mem(cma
, pages
);
128 DEFINE_SIMPLE_ATTRIBUTE(cma_alloc_fops
, NULL
, cma_alloc_write
, "%llu\n");
130 static void cma_debugfs_add_one(struct cma
*cma
, int idx
)
136 sprintf(name
, "cma-%d", idx
);
138 tmp
= debugfs_create_dir(name
, cma_debugfs_root
);
140 debugfs_create_file("alloc", S_IWUSR
, cma_debugfs_root
, cma
,
143 debugfs_create_file("free", S_IWUSR
, cma_debugfs_root
, cma
,
146 debugfs_create_file("base_pfn", S_IRUGO
, tmp
,
147 &cma
->base_pfn
, &cma_debugfs_fops
);
148 debugfs_create_file("count", S_IRUGO
, tmp
,
149 &cma
->count
, &cma_debugfs_fops
);
150 debugfs_create_file("order_per_bit", S_IRUGO
, tmp
,
151 &cma
->order_per_bit
, &cma_debugfs_fops
);
153 u32s
= DIV_ROUND_UP(cma_bitmap_maxno(cma
), BITS_PER_BYTE
* sizeof(u32
));
154 debugfs_create_u32_array("bitmap", S_IRUGO
, tmp
, (u32
*)cma
->bitmap
, u32s
);
157 static int __init
cma_debugfs_init(void)
161 cma_debugfs_root
= debugfs_create_dir("cma", NULL
);
162 if (!cma_debugfs_root
)
165 for (i
= 0; i
< cma_area_count
; i
++)
166 cma_debugfs_add_one(&cma_areas
[i
], i
);
170 late_initcall(cma_debugfs_init
);
This page took 0.037681 seconds and 6 git commands to generate.