mm: cma: fix the name of CMA areas
Patch series "mm: fix the names of general cma and hugetlb cma", v2. The current code of CMA can only work when users pass a const string as name parameter. we need to fix the way to handle names in CMA. On the other hand, to avoid name conflicts after enabling CMA_DEBUGFS, each hugetlb should get a different CMA name. This patch (of 2): If users give a name saved in stack, the current code will generate magic pointer. if users don't give a name(NULL), kasprintf() will always return NULL as we are at the early stage. that means cma_init_reserved_mem() will return -ENOMEM if users set name parameter as NULL. [natechancellor@gmail.com: return cma->name directly in cma_get_name] Link: https://github.com/ClangBuiltLinux/linux/issues/1063 Link: http://lkml.kernel.org/r/20200623015840.621964-1-natechancellor@gmail.com Signed-off-by: Barry Song <song.bao.hua@hisilicon.com> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Acked-by: Roman Gushchin <guro@fb.com> Link: http://lkml.kernel.org/r/20200616223131.33828-2-song.bao.hua@hisilicon.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
835832ba01
Коммит
18e98e56f4
15
mm/cma.c
15
mm/cma.c
|
@ -52,7 +52,7 @@ unsigned long cma_get_size(const struct cma *cma)
|
|||
|
||||
const char *cma_get_name(const struct cma *cma)
|
||||
{
|
||||
return cma->name ? cma->name : "(undefined)";
|
||||
return cma->name;
|
||||
}
|
||||
|
||||
static unsigned long cma_bitmap_aligned_mask(const struct cma *cma,
|
||||
|
@ -202,13 +202,12 @@ int __init cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
|
|||
* subsystems (like slab allocator) are available.
|
||||
*/
|
||||
cma = &cma_areas[cma_area_count];
|
||||
if (name) {
|
||||
cma->name = name;
|
||||
} else {
|
||||
cma->name = kasprintf(GFP_KERNEL, "cma%d\n", cma_area_count);
|
||||
if (!cma->name)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (name)
|
||||
snprintf(cma->name, CMA_MAX_NAME, name);
|
||||
else
|
||||
snprintf(cma->name, CMA_MAX_NAME, "cma%d\n", cma_area_count);
|
||||
|
||||
cma->base_pfn = PFN_DOWN(base);
|
||||
cma->count = size >> PAGE_SHIFT;
|
||||
cma->order_per_bit = order_per_bit;
|
||||
|
|
4
mm/cma.h
4
mm/cma.h
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include <linux/debugfs.h>
|
||||
|
||||
#define CMA_MAX_NAME 64
|
||||
|
||||
struct cma {
|
||||
unsigned long base_pfn;
|
||||
unsigned long count;
|
||||
|
@ -15,7 +17,7 @@ struct cma {
|
|||
spinlock_t mem_head_lock;
|
||||
struct debugfs_u32_array dfs_bitmap;
|
||||
#endif
|
||||
const char *name;
|
||||
char name[CMA_MAX_NAME];
|
||||
};
|
||||
|
||||
extern struct cma cma_areas[MAX_CMA_AREAS];
|
||||
|
|
Загрузка…
Ссылка в новой задаче