// ARM10C 20131130 // ARM10C 20131207 static void __init find_limits(unsigned long *min, unsigned long *max_low, unsigned long *max_high) { struct meminfo *mi = &meminfo; int i; /* This assumes the meminfo array is properly sorted */ // mi->bank[0].start: 0x20000000, bank_pfn_start(&mi->bank[0]): 0x20000 // *min: 0x20000 *min = bank_pfn_start(&mi->bank[0]); // #define for_each_bank(i,mi) \ // for (i = 0; i < (mi)->nr_banks; i++) // // mi->nr_banks: 2, mi->bank[1].highmem: 1 for_each_bank (i, mi) if (mi->bank[i].highmem) break; // i: 1, mi->bank[0].start: 0x20000000, mi->bank[0].size: 0x2f800000 // bank_pfn_end(&mi->bank[i - 1]): 0x4f800 // *max_low: 0x4f800 *max_low = bank_pfn_end(&mi->bank[i - 1]); // mi->bank[1].start: 0x4f800000, mi->bank[1].size: 0x50800000 // bank_pfn_end(&mi->bank[mi->nr_banks - 1]): 0xA0000 // *max_high: 0xA0000 *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); }
static void __init find_limits(unsigned long *min, unsigned long *max_low, unsigned long *max_high) { struct meminfo *mi = &meminfo; int i; /* This assumes the meminfo array is properly sorted */ *min = bank_pfn_start(&mi->bank[0]); for_each_bank (i, mi) if (mi->bank[i].highmem) break; *max_low = bank_pfn_end(&mi->bank[i - 1]); *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); }
static void __init find_limits(unsigned long *min, unsigned long *max_low, unsigned long *max_high) { struct meminfo *mi = &meminfo; int i; *min = -1UL; *max_low = *max_high = 0; for_each_bank (i, mi) { struct membank *bank = &mi->bank[i]; unsigned long start, end; start = bank_pfn_start(bank); end = bank_pfn_end(bank); if (*min > start) *min = start; if (*max_high < end) *max_high = end; if (bank->highmem) continue; if (*max_low < end) *max_low = end; } }
static int _phymem_dist_proc_show(struct seq_file *m, void *v) { struct sysinfo sys_info; int node, i, pfn = 0, linux_total_size = 0; struct meminfo *mi = &meminfo; long cached; long kernelmem; struct vmalloc_info vmi; unsigned long pages[NR_LRU_LISTS]; int lru; for_each_bank (i,mi) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; linux_total_size += bank->size; pfn = bank_pfn_end(bank); } si_meminfo(&sys_info); si_swapinfo(&sys_info); cached = global_page_state(NR_FILE_PAGES) - total_swapcache_pages() - sys_info.bufferram; if (cached < 0) cached = 0; for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++) pages[lru] = global_page_state(NR_LRU_BASE + lru); kernelmem = K(sys_info.totalram - sys_info.freeram - sys_info.bufferram - pages[LRU_ACTIVE_ANON] \ - pages[LRU_INACTIVE_ANON] - cached - total_swapcache_pages()); get_vmalloc_info(&vmi); seq_printf(m, "mem: %lukB\n", pfn*4); seq_printf(m, " |--mem_other: %lukB\n", pfn*4 - linux_total_size/1024); seq_printf(m, " |--mem_linux: %lukB\n", linux_total_size/1024); seq_printf(m, " |--reserved: %lukB\n", linux_total_size/1024 - K(sys_info.totalram)); seq_printf(m, " |--mem_total: %lukB\n", K(sys_info.totalram)); seq_printf(m, " |--free: %lukB\n", K(sys_info.freeram)); seq_printf(m, " |--buffer: %lukB\n", K(sys_info.bufferram)); seq_printf(m, " |--cache: %lukB\n", K(cached)); seq_printf(m, " |--swapcache: %lukB\n", K(total_swapcache_pages())); seq_printf(m, " |--user: %lukB\n", K(pages[LRU_ACTIVE_ANON] + pages[LRU_INACTIVE_ANON])); seq_printf(m, " | |--active anon: %lukB\n", K(pages[LRU_ACTIVE_ANON])); seq_printf(m, " | |--inactive anon: %lukB\n", K(pages[LRU_INACTIVE_ANON])); seq_printf(m, " |--kernel: %lukB\n", kernelmem); seq_printf(m, " |--stack: %lukB\n", global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024); seq_printf(m, " |--slab: %lukB\n", K(global_page_state(NR_SLAB_RECLAIMABLE) +global_page_state(NR_SLAB_UNRECLAIMABLE))); seq_printf(m, " |--pagetable: %lukB\n", K(global_page_state(NR_PAGETABLE))); seq_printf(m, " |--vmalloc: %lukB\n", kernelmem - global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024 \ - K(global_page_state(NR_SLAB_RECLAIMABLE) - global_page_state(NR_SLAB_UNRECLAIMABLE)) \ -K(global_page_state(NR_PAGETABLE))); return 0; }
static void __init find_limits(unsigned long *min, unsigned long *max_low, unsigned long *max_high) { struct meminfo *mi = &meminfo; int i; /* This assumes the meminfo array is properly sorted */ *min = bank_pfn_start(&mi->bank[0]); /*! Do: get first pfn of phy-mem */ for_each_bank (i, mi) if (mi->bank[i].highmem) break; /*! * find highmem * @max_low : end pfn of normal-mem (:low-mem) * @max_high : end pfn of high-mem(maybe, last bank has pfn) */ *max_low = bank_pfn_end(&mi->bank[i - 1]); *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); }
void show_mem(unsigned int filter) { int free = 0, total = 0, reserved = 0; int shared = 0, cached = 0, slab = 0, i; struct meminfo * mi = &meminfo; #ifdef CONFIG_MSM_KGSL unsigned long kgsl_alloc = kgsl_get_alloc_size(true); #endif #ifdef CONFIG_ION uintptr_t ion_alloc = msm_ion_heap_meminfo(true); uintptr_t ion_inuse = msm_ion_heap_meminfo(false); #endif printk("Mem-info:\n"); show_free_areas(filter); if (filter & SHOW_MEM_FILTER_PAGE_COUNT) return; for_each_bank (i, mi) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; struct page *page, *end; pfn1 = bank_pfn_start(bank); pfn2 = bank_pfn_end(bank); page = pfn_to_page(pfn1); end = pfn_to_page(pfn2 - 1) + 1; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (!page_count(page)) free++; else shared += page_count(page) - 1; page++; #ifdef CONFIG_SPARSEMEM pfn1++; if (!(pfn1 % PAGES_PER_SECTION)) page = pfn_to_page(pfn1); } while (pfn1 < pfn2); #else } while (page < end); #endif }
// *min : ??, *max_low : 0, *max_high : 0 static void __init find_limits(unsigned long *min, unsigned long *max_low, unsigned long *max_high) { struct meminfo *mi = &meminfo; // 이전에 meminfo에 bank0, bank1 정보를 저장해 두었음 int i; /* This assumes the meminfo array is properly sorted */ *min = bank_pfn_start(&mi->bank[0]); // 이전에 만들었던 뱅크 0 시작 주소의 물리 프레임 번호를 가져옴 // *min : 0x20000 for_each_bank (i, mi) // for (i = 0; i < (mi)->nr_banks; i++) , mi->nr_banks : 2, mi->bank[1].highmem = 1 if (mi->bank[i].highmem) break; *max_low = bank_pfn_end(&mi->bank[i - 1]); // 뱅크 0의 마지막 주소의 물리 small page 번호를 가져옴 // max_low : 0x4F800 *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); // 뱅크 1의 마지막 주소의 물리 small page 번호를 가져옴 // max_high : 0xA0000 }
void ax8swap_show_mem(void) { int free = 0, total = 0, reserved = 0; int shared = 0, cached = 0, slab = 0, node, i; struct meminfo * mi = ax8swap_meminfo; printk("Mem-info:\n"); ax8swap_show_free_areas(); for_each_online_node(node) { pg_data_t *n = NODE_DATA(node); struct page *map = pgdat_page_nr(n, 0) - n->node_start_pfn; for_each_nodebank (i,mi,node) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; struct page *page, *end; pfn1 = bank_pfn_start(bank); pfn2 = bank_pfn_end(bank); page = map + pfn1; end = map + pfn2; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (!page_count(page)) free++; else shared += page_count(page) - 1; page++; } while (page < end); } } printk("%d pages of RAM\n", total); printk("%d free pages\n", free); printk("%d reserved pages\n", reserved); printk("%d slab pages\n", slab); printk("%d pages shared\n", shared); printk("%d pages swap cached\n", cached); }
void show_mem(unsigned int filter) { int free = 0, total = 0, reserved = 0; int shared = 0, cached = 0, slab = 0, i; struct meminfo * mi = &meminfo; printk("Mem-info:\n"); show_free_areas(filter); if (filter & SHOW_MEM_FILTER_PAGE_COUNT) return; for_each_bank (i, mi) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; struct page *page, *end; pfn1 = bank_pfn_start(bank); pfn2 = bank_pfn_end(bank); page = pfn_to_page(pfn1); end = pfn_to_page(pfn2 - 1) + 1; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (!page_count(page)) free++; else shared += page_count(page) - 1; page++; } while (page < end); } printk("%d pages of RAM\n", total); printk("%d free pages\n", free); printk("%d reserved pages\n", reserved); printk("%d slab pages\n", slab); printk("%d pages shared\n", shared); printk("%d pages swap cached\n", cached); }
void show_mem(unsigned int filter) { int free = 0, total = 0, reserved = 0; int shared = 0, cached = 0, slab = 0, i; struct meminfo * mi = &meminfo; printk("Mem-info:\n"); show_free_areas(filter); for_each_bank (i, mi) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; struct page *page, *end; pfn1 = bank_pfn_start(bank); pfn2 = bank_pfn_end(bank); page = pfn_to_page(pfn1); end = pfn_to_page(pfn2 - 1) + 1; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (!page_count(page)) free++; else shared += page_count(page) - 1; page++; #ifdef CONFIG_SPARSEMEM pfn1++; if (!(pfn1 % PAGES_PER_SECTION)) page = pfn_to_page(pfn1); } while (pfn1 < pfn2); #else } while (page < end); #endif }
static int _phymem_pages_proc_show(struct seq_file *m, void *v) { int free = 0, total = 0, reserved = 0; int other = 0, shared = 0, cached = 0, slab = 0, node, i; struct meminfo * mi = &meminfo; for_each_bank (i,mi) { struct membank *bank = &mi->bank[i]; unsigned int pfn1, pfn2; struct page *page, *end; pfn1 = bank_pfn_start(bank); pfn2 = bank_pfn_end(bank); page = pfn_to_page(pfn1); end = pfn_to_page(pfn2 - 1) + 1; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (page_count(page) > 1) shared++; else if (!page_count(page)) free++; else other++; page++; }while (page < end); } seq_printf(m, "pages of RAM %d\n", total); seq_printf(m, "free pages %d\n", free); seq_printf(m, "reserved pages %d\n", reserved); seq_printf(m, "slab pages %d\n", slab); seq_printf(m, "pages shared %d\n", shared); seq_printf(m, "pages swap cached %d\n", cached); seq_printf(m, "other pages %d\n", other); return 0; }