+>> +struct cma *__init cma_create(phys_addr_t base, phys_addr_t size,
+                             unsigned int order_per_bit, const char *name)
+{
+       struct cma *cma;
+       int ret;
+
+       ret = cma_check_memory(base, size);
+       if (ret < 0)
+               return ERR_PTR(ret);
+
+       cma = kzalloc(sizeof(*cma), GFP_KERNEL);
+       if (!cma)
+               return ERR_PTR(-ENOMEM);
+
+       cma_init_area(cma, name, size, order_per_bit);
+       cma->ranges[0].base_pfn = PFN_DOWN(base);
+       cma->ranges[0].early_pfn = PFN_DOWN(base);
+       cma->ranges[0].count = cma->count;
+       cma->nranges = 1;
+
+       cma_activate_area(cma);
+
+       return cma;
+}
+
+void cma_free(struct cma *cma)
+{
+       kfree(cma);
+}
--
2.50.0


I agree that supporting dynamic CMA areas would be good. However, by
doing it like this, these CMA areas are invisible to the rest of the
system. E.g. cma_for_each_area() does not know about them. It seems a
bit inconsistent that there will now be some areas that are globally
known, and some that are not.

Yeah, I'm not a fan of that.

What is the big problem we are trying to solve here? Why do they have to be dynamic, why do they even have to support freeing?

--
Cheers

David / dhildenb

Reply via email to