int memory_add_physaddr_to_nid(u64 addr) { int nid = paddr_to_nid(addr); if (nid < 0) return 0; return nid; }
/* * uncached_free_page * * @uc_addr: uncached address of first page to free * @n_pages: number of contiguous pages to free * * Free the specified number of uncached pages. */ void uncached_free_page(unsigned long uc_addr, int n_pages) { int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET); struct gen_pool *pool = uncached_pools[nid].pool; if (unlikely(pool == NULL)) return; if ((uc_addr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET) panic("uncached_free_page invalid address %lx\n", uc_addr); gen_pool_free(pool, uc_addr, n_pages * PAGE_SIZE); }
/* * uncached_build_memmap, * * @uc_start: uncached starting address of a chunk of uncached memory * @uc_end: uncached ending address of a chunk of uncached memory * @arg: ignored, (NULL argument passed in on call to efi_memmap_walk_uc()) * * Called at boot time to build a map of pages that can be used for * memory special operations. */ static int __init uncached_build_memmap(u64 uc_start, u64 uc_end, void *arg) { int nid = paddr_to_nid(uc_start - __IA64_UNCACHED_OFFSET); struct gen_pool *pool = uncached_pools[nid].pool; size_t size = uc_end - uc_start; touch_softlockup_watchdog(); if (pool != NULL) { memset((char *)uc_start, 0, size); (void) gen_pool_add(pool, uc_start, size, nid); } return 0; }