/* NUMA설정이 정상적인지 확인. Sanityze가 정상적이었다면 메모리 설정 * 역시 문제 없어야 함 */ static bool __init numa_meminfo_cover_memory(const struct numa_meminfo *mi) { u64 numaram, e820ram; int i; /* NUMA가 사용할 수 있는 램의 전체 크기에서 쓸 수 없는(부재) 페이지 * 크기 만큼을 제거 */ numaram = 0; for (i = 0; i < mi->nr_blks; i++) { u64 s = mi->blk[i].start >> PAGE_SHIFT; u64 e = mi->blk[i].end >> PAGE_SHIFT; numaram += e - s; /* 메모리 설정을 가지고, nid의 쓸 수 없는 페이지 크기만큼을 뺌 */ numaram -= __absent_pages_in_range(mi->blk[i].nid, s, e); if ((s64)numaram < 0) numaram = 0; } e820ram = max_pfn - absent_pages_in_range(0, max_pfn); /* We seem to lose 3 pages somewhere. Allow 1M of slack. */ /* NUMA에서는 모든 NODE가 e820 메모리를 커버한다고 간주하기 때문에 * e820 메모리에서 NUMA의 설정된 메모리의 차이(쓸수없는 페이지 * 영역)가 1M을 넘어서면 에러라고 판단하는듯? */ if ((s64)(e820ram - numaram) >= (1 << (20 - PAGE_SHIFT))) { printk(KERN_ERR "NUMA: nodes only cover %LuMB of your %LuMB e820 RAM. Not used.\n", (numaram << PAGE_SHIFT) >> 20, (e820ram << PAGE_SHIFT) >> 20); return false; }
/* Sanity check to catch more bad SRATs (they are amazingly common). Make sure the PXMs cover all memory. */ static int __init nodes_cover_memory(const struct bootnode *nodes) { int i; unsigned long pxmram, e820ram; pxmram = 0; for_each_node_mask(i, nodes_parsed) { unsigned long s = nodes[i].start >> PAGE_SHIFT; unsigned long e = nodes[i].end >> PAGE_SHIFT; pxmram += e - s; pxmram -= __absent_pages_in_range(i, s, e); if ((long)pxmram < 0) pxmram = 0; }
/* * Sanity check to catch more bad NUMA configurations (they are amazingly * common). Make sure the nodes cover all memory. */ static bool __init numa_meminfo_cover_memory(const struct numa_meminfo *mi) { u64 numaram, e820ram; int i; numaram = 0; for (i = 0; i < mi->nr_blks; i++) { u64 s = mi->blk[i].start >> PAGE_SHIFT; u64 e = mi->blk[i].end >> PAGE_SHIFT; numaram += e - s; numaram -= __absent_pages_in_range(mi->blk[i].nid, s, e); if ((s64)numaram < 0) numaram = 0; } e820ram = max_pfn - absent_pages_in_range(0, max_pfn); /* We seem to lose 3 pages somewhere. Allow 1M of slack. */ if ((s64)(e820ram - numaram) >= (1 << (20 - PAGE_SHIFT))) { printk(KERN_ERR "NUMA: nodes only cover %LuMB of your %LuMB e820 RAM. Not used.\n", (numaram << PAGE_SHIFT) >> 20, (e820ram << PAGE_SHIFT) >> 20); return false; }