+>> +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?