static int change_memory_common(unsigned long addr, int numpages, pgprot_t set_mask, pgprot_t clear_mask) { unsigned long start = addr; unsigned long size = PAGE_SIZE*numpages; unsigned long end = start + size; int ret; struct page_change_data data; if (!IS_ALIGNED(addr, PAGE_SIZE)) { start &= PAGE_MASK; end = start + size; WARN_ON_ONCE(1); } #ifndef CONFIG_SENTINEL if (!is_module_address(start) || !is_module_address(end - 1)) return -EINVAL; #endif data.set_mask = set_mask; data.clear_mask = clear_mask; ret = apply_to_page_range(&init_mm, start, size, change_page_range, &data); flush_tlb_kernel_range(start, end); return ret; }
static inline bool kernel_or_module_addr(const void *addr) { if (addr >= (void *)_stext && addr < (void *)_end) return true; if (is_module_address((unsigned long)addr)) return true; return false; }