diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 63b550403317..c142a152d6a4 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -938,6 +938,15 @@ static inline int is_highmem_idx(enum zone_type idx) #endif } +#ifdef CONFIG_ZONE_DMA +bool has_managed_dma(void); +#else +static inline bool has_managed_dma(void) +{ + return false; +} +#endif + /** * is_highmem - helper function to quickly check if a struct zone is a * highmem zone or not. This is an attempt to keep references diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e8e0f1cec8b0..2d97073f7aa8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8903,3 +8903,18 @@ bool take_page_off_buddy(struct page *page) return ret; } #endif + +#ifdef CONFIG_ZONE_DMA +bool has_managed_dma(void) +{ + struct pglist_data *pgdat; + + for_each_online_pgdat(pgdat) { + struct zone *zone = &pgdat->node_zones[ZONE_DMA]; + + if (managed_zone(zone)) + return true; + } + return false; +} +#endif /* CONFIG_ZONE_DMA */