int ehea_create_busmap( void ) { u64 vaddr = EHEA_BUSMAP_START; unsigned long high_section_index = 0; int i; /* * Sections are not in ascending order -> Loop over all sections and * find the highest PFN to compute the required map size. */ ehea_bmap.valid_sections = 0; for (i = 0; i < NR_MEM_SECTIONS; i++) if (valid_section_nr(i)) high_section_index = i; ehea_bmap.entries = high_section_index + 1; ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr)); if (!ehea_bmap.vaddr) return -ENOMEM; for (i = 0 ; i < ehea_bmap.entries; i++) { unsigned long pfn = section_nr_to_pfn(i); if (pfn_valid(pfn)) { ehea_bmap.vaddr[i] = vaddr; vaddr += EHEA_SECTSIZE; ehea_bmap.valid_sections++; } else ehea_bmap.vaddr[i] = 0; } return 0; }
/* * Allocate the accumulated non-linear sections, allocate a mem_map * for each and record the physical to section mapping. */ void sparse_init(void) { unsigned long pnum; struct page *map; for (pnum = 0; pnum < NR_MEM_SECTIONS; pnum++) { if (!valid_section_nr(pnum)) continue; map = sparse_early_mem_map_alloc(pnum); if (map) sparse_init_one_section(&mem_section[pnum], pnum, map); } }
static ssize_t store_mem_state(struct sys_device *dev, const char *buf, size_t count) { struct memory_block *mem; unsigned int phys_section_nr; int ret = -EINVAL; mem = container_of(dev, struct memory_block, sysdev); phys_section_nr = mem->phys_index; if (!valid_section_nr(phys_section_nr)) goto out; if (!strncmp(buf, "online", min((int)count, 6))) ret = memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE); else if(!strncmp(buf, "offline", min((int)count, 7))) ret = memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE); out: if (ret) return ret; return count; }