forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
I've noticed that there is no interfaces exposed by CMA which would let me fuzz what's going on in there. This small patchset exposes some information out to userspace, plus adds the ability to trigger allocation and freeing from userspace. This patch (of 3): Implement a simple debugfs interface to expose information about CMA areas in the system. Useful for testing/sanity checks for CMA since it was impossible to previously retrieve this information in userspace. Signed-off-by: Sasha Levin <[email protected]> Acked-by: Joonsoo Kim <[email protected]> Cc: Marek Szyprowski <[email protected]> Cc: Laura Abbott <[email protected]> Cc: Konrad Rzeszutek Wilk <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
1 parent
19c07d5
commit 28b24c1
Showing
5 changed files
with
91 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
#ifndef __MM_CMA_H__ | ||
#define __MM_CMA_H__ | ||
|
||
struct cma { | ||
unsigned long base_pfn; | ||
unsigned long count; | ||
unsigned long *bitmap; | ||
unsigned int order_per_bit; /* Order of pages represented by one bit */ | ||
struct mutex lock; | ||
}; | ||
|
||
extern struct cma cma_areas[MAX_CMA_AREAS]; | ||
extern unsigned cma_area_count; | ||
|
||
static unsigned long cma_bitmap_maxno(struct cma *cma) | ||
{ | ||
return cma->count >> cma->order_per_bit; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* CMA DebugFS Interface | ||
* | ||
* Copyright (c) 2015 Sasha Levin <[email protected]> | ||
*/ | ||
|
||
|
||
#include <linux/debugfs.h> | ||
#include <linux/cma.h> | ||
|
||
#include "cma.h" | ||
|
||
static struct dentry *cma_debugfs_root; | ||
|
||
static int cma_debugfs_get(void *data, u64 *val) | ||
{ | ||
unsigned long *p = data; | ||
|
||
*val = *p; | ||
|
||
return 0; | ||
} | ||
|
||
DEFINE_SIMPLE_ATTRIBUTE(cma_debugfs_fops, cma_debugfs_get, NULL, "%llu\n"); | ||
|
||
static void cma_debugfs_add_one(struct cma *cma, int idx) | ||
{ | ||
struct dentry *tmp; | ||
char name[16]; | ||
int u32s; | ||
|
||
sprintf(name, "cma-%d", idx); | ||
|
||
tmp = debugfs_create_dir(name, cma_debugfs_root); | ||
|
||
debugfs_create_file("base_pfn", S_IRUGO, tmp, | ||
&cma->base_pfn, &cma_debugfs_fops); | ||
debugfs_create_file("count", S_IRUGO, tmp, | ||
&cma->count, &cma_debugfs_fops); | ||
debugfs_create_file("order_per_bit", S_IRUGO, tmp, | ||
&cma->order_per_bit, &cma_debugfs_fops); | ||
|
||
u32s = DIV_ROUND_UP(cma_bitmap_maxno(cma), BITS_PER_BYTE * sizeof(u32)); | ||
debugfs_create_u32_array("bitmap", S_IRUGO, tmp, (u32*)cma->bitmap, u32s); | ||
} | ||
|
||
static int __init cma_debugfs_init(void) | ||
{ | ||
int i; | ||
|
||
cma_debugfs_root = debugfs_create_dir("cma", NULL); | ||
if (!cma_debugfs_root) | ||
return -ENOMEM; | ||
|
||
for (i = 0; i < cma_area_count; i++) | ||
cma_debugfs_add_one(&cma_areas[i], i); | ||
|
||
return 0; | ||
} | ||
late_initcall(cma_debugfs_init); |