On Thu 25-03-21 10:45:19, Michal Hocko wrote: > On Wed 24-03-21 17:28:28, Mike Kravetz wrote: > [...] > > phys_addr_t cma_get_base(const struct cma *cma) > > { > > return PFN_PHYS(cma->base_pfn); > > @@ -146,6 +155,10 @@ static int __init cma_init_reserved_areas(void) > > for (i = 0; i < cma_area_count; i++) > > cma_activate_area(&cma_areas[i]); > > > > + cma_release_wq = create_workqueue("cma_release"); > > Considering the workqueue is used to free up memory it should likely be > WQ_MEM_RECLAIM to prevent from long stalls when WQs are overloaded. > > I cannot judge the CMA parts from a very quick glance this looks > reasonably. I have overlooked that +static void cma_clear_bitmap_fn(struct work_struct *work) +{ + struct cma_clear_bitmap_work *w; + + w = container_of(work, struct cma_clear_bitmap_work, work); + + cma_clear_bitmap(w->cma, w->pfn, w->count); + + __free_page(pfn_to_page(w->pfn)); +} should be doing free_contig_range with w->count target. -- Michal Hocko SUSE Labs