if (page_is_guard(buddy)) {
                        clear_page_guard_flag(buddy);
                        set_page_private(page, 0);
-                       __mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order);
+                       __mod_zone_freepage_state(zone, 1 << order,
+                                                 migratetype);
                } else {
                        list_del(&buddy->lru);
                        zone->free_area[order].nr_free--;
                        /* MIGRATE_MOVABLE list may include MIGRATE_RESERVEs */
                        __free_one_page(page, zone, 0, mt);
                        trace_mm_page_pcpu_drain(page, 0, mt);
+                       if (is_migrate_cma(mt))
+                               __mod_zone_page_state(zone, NR_FREE_CMA_PAGES, 1);
                } while (--to_free && --batch_free && !list_empty(list));
        }
        __mod_zone_page_state(zone, NR_FREE_PAGES, count);
 
        __free_one_page(page, zone, order, migratetype);
        if (unlikely(migratetype != MIGRATE_ISOLATE))
-               __mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order);
+               __mod_zone_freepage_state(zone, 1 << order, migratetype);
        spin_unlock(&zone->lock);
 }
 
                        set_page_guard_flag(&page[size]);
                        set_page_private(&page[size], high);
                        /* Guard pages are not available for any usage */
-                       __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << high));
+                       __mod_zone_freepage_state(zone, -(1 << high),
+                                                 migratetype);
                        continue;
                }
 #endif
                }
                set_page_private(page, mt);
                list = &page->lru;
+               if (is_migrate_cma(mt))
+                       __mod_zone_page_state(zone, NR_FREE_CMA_PAGES,
+                                             -(1 << order));
        }
        __mod_zone_page_state(zone, NR_FREE_PAGES, -(i << order));
        spin_unlock(&zone->lock);
 
        mt = get_pageblock_migratetype(page);
        if (unlikely(mt != MIGRATE_ISOLATE))
-               __mod_zone_page_state(zone, NR_FREE_PAGES, -(1UL << order));
+               __mod_zone_freepage_state(zone, -(1UL << order), mt);
 
        if (alloc_order != order)
                expand(zone, page, alloc_order, order,
                spin_unlock(&zone->lock);
                if (!page)
                        goto failed;
-               __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
+               __mod_zone_freepage_state(zone, -(1 << order),
+                                         get_pageblock_migratetype(page));
        }
 
        __count_zone_vm_events(PGALLOC, zone, 1 << order);
                " unevictable:%lu"
                " dirty:%lu writeback:%lu unstable:%lu\n"
                " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n"
-               " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n",
+               " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n"
+               " free_cma:%lu\n",
                global_page_state(NR_ACTIVE_ANON),
                global_page_state(NR_INACTIVE_ANON),
                global_page_state(NR_ISOLATED_ANON),
                global_page_state(NR_FILE_MAPPED),
                global_page_state(NR_SHMEM),
                global_page_state(NR_PAGETABLE),
-               global_page_state(NR_BOUNCE));
+               global_page_state(NR_BOUNCE),
+               global_page_state(NR_FREE_CMA_PAGES));
 
        for_each_populated_zone(zone) {
                int i;
                        " pagetables:%lukB"
                        " unstable:%lukB"
                        " bounce:%lukB"
+                       " free_cma:%lukB"
                        " writeback_tmp:%lukB"
                        " pages_scanned:%lu"
                        " all_unreclaimable? %s"
                        K(zone_page_state(zone, NR_PAGETABLE)),
                        K(zone_page_state(zone, NR_UNSTABLE_NFS)),
                        K(zone_page_state(zone, NR_BOUNCE)),
+                       K(zone_page_state(zone, NR_FREE_CMA_PAGES)),
                        K(zone_page_state(zone, NR_WRITEBACK_TEMP)),
                        zone->pages_scanned,
                        (zone->all_unreclaimable ? "yes" : "no")
 
 out:
        if (!ret) {
                unsigned long nr_pages;
+               int migratetype = get_pageblock_migratetype(page);
 
                set_pageblock_isolate(page);
                nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
 
-               __mod_zone_page_state(zone, NR_FREE_PAGES, -nr_pages);
+               __mod_zone_freepage_state(zone, -nr_pages, migratetype);
        }
 
        spin_unlock_irqrestore(&zone->lock, flags);
        if (get_pageblock_migratetype(page) != MIGRATE_ISOLATE)
                goto out;
        nr_pages = move_freepages_block(zone, page, migratetype);
-       __mod_zone_page_state(zone, NR_FREE_PAGES, nr_pages);
+       __mod_zone_freepage_state(zone, nr_pages, migratetype);
        restore_pageblock_isolate(page, migratetype);
 out:
        spin_unlock_irqrestore(&zone->lock, flags);