for (i = 0; i < MAX_NR_ZONES; i++) h[i] += (z[i] * sizeof(struct page)) / PAGE_SIZE;   if (h[ZONE_DMA]) { h[ZONE_DMA] += dma_reserve; if (h[ZONE_DMA] >= z[ZONE_DMA]) { printk(KERN_WARNING "Kernel too large and filling up ZONE_DMA?\n"); h[ZONE_DMA] = z[ZONE_DMA]; } }
size_zones(unsigned long *z, unsigned long *h,	   unsigned long start_pfn, unsigned long end_pfn){ 	int i; 	unsigned long w; 	for (i = 0; i < MAX_NR_ZONES; i++) 		z[i] = 0; 	if (start_pfn < MAX_DMA_PFN) 		z[ZONE_DMA] = MAX_DMA_PFN - start_pfn; 	if (start_pfn < MAX_DMA32_PFN) { 		unsigned long dma32_pfn = MAX_DMA32_PFN; 		if (dma32_pfn > end_pfn) 			dma32_pfn = end_pfn; 		z[ZONE_DMA32] = dma32_pfn - start_pfn; 	} 	z[ZONE_NORMAL] = end_pfn - start_pfn; 	/* Remove lower zones from higher ones. */ 	w = 0; 	for (i = 0; i < MAX_NR_ZONES; i++) { 		if (z[i]) 			z[i] -= w; 	        w += z[i];	}	/* Compute holes */	w = 0;	for (i = 0; i < MAX_NR_ZONES; i++) {		unsigned long s = w;		w += z[i];		h[i] = e820_hole_size(s, w);	}}