cma: Store a name in the cma structure
authorLaura Abbott <labbott@redhat.com>
Tue, 18 Apr 2017 18:27:03 +0000 (11:27 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Apr 2017 18:41:12 +0000 (20:41 +0200)
Frameworks that may want to enumerate CMA heaps (e.g. Ion) will find it
useful to have an explicit name attached to each region. Store the name
in each CMA structure.

Signed-off-by: Laura Abbott <labbott@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/kvm/book3s_hv_builtin.c
drivers/base/dma-contiguous.c
include/linux/cma.h
mm/cma.c
mm/cma.h
mm/cma_debug.c

index 4d6c64b3041c3aa4f58d1a504ad868c27b6924df..b739ff80e979b8564ecc11524e46edb981f200a9 100644 (file)
@@ -100,7 +100,8 @@ void __init kvm_cma_reserve(void)
                         (unsigned long)selected_size / SZ_1M);
                align_size = HPT_ALIGN_PAGES << PAGE_SHIFT;
                cma_declare_contiguous(0, selected_size, 0, align_size,
-                       KVM_CMA_CHUNK_ORDER - PAGE_SHIFT, false, &kvm_cma);
+                       KVM_CMA_CHUNK_ORDER - PAGE_SHIFT, false, "kvm_cma",
+                       &kvm_cma);
        }
 }
 
index b55804cac4c46ef1fd990a2d89a2eb1c917fc81f..ea9726e714682dc56f0203db09d21322780ecd2a 100644 (file)
@@ -165,7 +165,8 @@ int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
 {
        int ret;
 
-       ret = cma_declare_contiguous(base, size, limit, 0, 0, fixed, res_cma);
+       ret = cma_declare_contiguous(base, size, limit, 0, 0, fixed,
+                                       "reserved", res_cma);
        if (ret)
                return ret;
 
@@ -258,7 +259,7 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem)
                return -EINVAL;
        }
 
-       err = cma_init_reserved_mem(rmem->base, rmem->size, 0, &cma);
+       err = cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma);
        if (err) {
                pr_err("Reserved memory: unable to setup CMA region\n");
                return err;
index 03f32d0bd1d8a7be5a0fddbc058e0a7f6b059efe..d41d1f8d1e281e7d336fd18d14ecb3e80e38541c 100644 (file)
@@ -21,13 +21,15 @@ 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(phys_addr_t base,
                        phys_addr_t size, phys_addr_t limit,
                        phys_addr_t alignment, unsigned int order_per_bit,
-                       bool fixed, struct cma **res_cma);
+                       bool fixed, const char *name, struct cma **res_cma);
 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, size_t count, unsigned int align,
                              gfp_t gfp_mask);
index a6033e3444304c95adb7c392984cc6600684c7ec..43c1b2c1ac67de714711142c541d2444b2850fd1 100644 (file)
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -53,6 +53,11 @@ unsigned long cma_get_size(const struct cma *cma)
        return cma->count << PAGE_SHIFT;
 }
 
+const char *cma_get_name(const struct cma *cma)
+{
+       return cma->name ? cma->name : "(undefined)";
+}
+
 static unsigned long cma_bitmap_aligned_mask(const struct cma *cma,
                                             int align_order)
 {
@@ -168,6 +173,7 @@ core_initcall(cma_init_reserved_areas);
  */
 int __init cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
                                 unsigned int order_per_bit,
+                                const char *name,
                                 struct cma **res_cma)
 {
        struct cma *cma;
@@ -198,6 +204,13 @@ 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;
+       }
        cma->base_pfn = PFN_DOWN(base);
        cma->count = size >> PAGE_SHIFT;
        cma->order_per_bit = order_per_bit;
@@ -229,7 +242,7 @@ int __init cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
 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, struct cma **res_cma)
+                       bool fixed, const char *name, struct cma **res_cma)
 {
        phys_addr_t memblock_end = memblock_end_of_DRAM();
        phys_addr_t highmem_start;
@@ -335,7 +348,7 @@ int __init cma_declare_contiguous(phys_addr_t base,
                base = addr;
        }
 
-       ret = cma_init_reserved_mem(base, size, order_per_bit, res_cma);
+       ret = cma_init_reserved_mem(base, size, order_per_bit, name, res_cma);
        if (ret)
                goto err;
 
index 17c75a4246c8bbab8b56fe4d562cd85ea670a21f..49861286279d7dfb52b5643b59557aa0f9341d36 100644 (file)
--- a/mm/cma.h
+++ b/mm/cma.h
@@ -11,6 +11,7 @@ struct cma {
        struct hlist_head mem_head;
        spinlock_t mem_head_lock;
 #endif
+       const char *name;
 };
 
 extern struct cma cma_areas[MAX_CMA_AREAS];
index ffc0c3d0ae64a610409d85a5ac5704c2a660ab0c..595b757bef72722fb2715afd9ab0cd1536181c9e 100644 (file)
@@ -167,7 +167,7 @@ static void cma_debugfs_add_one(struct cma *cma, int idx)
        char name[16];
        int u32s;
 
-       sprintf(name, "cma-%d", idx);
+       sprintf(name, "cma-%s", cma->name);
 
        tmp = debugfs_create_dir(name, cma_debugfs_root);