* [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() [not found] <20190927151033.aad57472652a0b3a6948df6e@linux-foundation.org> @ 2019-10-05 0:33 ` Wei Yang 2019-10-05 5:42 ` kbuild test robot ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: Wei Yang @ 2019-10-05 0:33 UTC (permalink / raw) To: mike.kravetz, akpm, hughd, aarcange; +Cc: linux-mm, linux-kernel, Wei Yang The first parameter hstate in function hugetlb_fault_mutex_hash() is not used anymore. This patch removes it. Signed-off-by: Wei Yang <richardw.yang@linux.intel.com> Suggested-by: Andrew Morton <akpm@linux-foundation.org> --- fs/hugetlbfs/inode.c | 4 ++-- include/linux/hugetlb.h | 4 ++-- mm/hugetlb.c | 12 ++++++------ mm/userfaultfd.c | 5 +---- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a478df035651..715db1e34174 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -440,7 +440,7 @@ static void remove_inode_hugepages(struct inode *inode, loff_t lstart, u32 hash; index = page->index; - hash = hugetlb_fault_mutex_hash(h, mapping, index, 0); + hash = hugetlb_fault_mutex_hash(mapping, index, 0); mutex_lock(&hugetlb_fault_mutex_table[hash]); /* @@ -644,7 +644,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset, addr = index * hpage_size; /* mutex taken here, fault path and hole punch */ - hash = hugetlb_fault_mutex_hash(h, mapping, index, addr); + hash = hugetlb_fault_mutex_hash(mapping, index, addr); mutex_lock(&hugetlb_fault_mutex_table[hash]); /* See if already present in mapping to avoid alloc/free */ diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 53fc34f930d0..40e9e3fad1cf 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -105,8 +105,8 @@ void move_hugetlb_state(struct page *oldpage, struct page *newpage, int reason); void free_huge_page(struct page *page); void hugetlb_fix_reserve_counts(struct inode *inode); extern struct mutex *hugetlb_fault_mutex_table; -u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping, - pgoff_t idx, unsigned long address); +u32 hugetlb_fault_mutex_hash(struct address_space *mapping, pgoff_t idx, + unsigned long address); pte_t *huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud); diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ef37c85423a5..e0f033baac9d 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3916,7 +3916,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, * handling userfault. Reacquire after handling * fault to make calling code simpler. */ - hash = hugetlb_fault_mutex_hash(h, mapping, idx, haddr); + hash = hugetlb_fault_mutex_hash(mapping, idx, haddr); mutex_unlock(&hugetlb_fault_mutex_table[hash]); ret = handle_userfault(&vmf, VM_UFFD_MISSING); mutex_lock(&hugetlb_fault_mutex_table[hash]); @@ -4043,8 +4043,8 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, } #ifdef CONFIG_SMP -u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping, - pgoff_t idx, unsigned long address) +u32 hugetlb_fault_mutex_hash(struct address_space *mapping, pgoff_t idx, + unsigned long address) { unsigned long key[2]; u32 hash; @@ -4061,8 +4061,8 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping, * For uniprocesor systems we always use a single mutex, so just * return 0 and avoid the hashing overhead. */ -u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping, - pgoff_t idx, unsigned long address) +u32 hugetlb_fault_mutex_hash(struct address_space *mapping, pgoff_t idx, + unsigned long address) { return 0; } @@ -4106,7 +4106,7 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, * get spurious allocation failures if two CPUs race to instantiate * the same page in the page cache. */ - hash = hugetlb_fault_mutex_hash(h, mapping, idx, haddr); + hash = hugetlb_fault_mutex_hash(mapping, idx, haddr); mutex_lock(&hugetlb_fault_mutex_table[hash]); entry = huge_ptep_get(ptep); diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 0a40746a5b1e..5c0a80626cf0 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -214,7 +214,6 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, unsigned long src_addr, dst_addr; long copied; struct page *page; - struct hstate *h; unsigned long vma_hpagesize; pgoff_t idx; u32 hash; @@ -271,8 +270,6 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, goto out_unlock; } - h = hstate_vma(dst_vma); - while (src_addr < src_start + len) { pte_t dst_pteval; @@ -283,7 +280,7 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, */ idx = linear_page_index(dst_vma, dst_addr); mapping = dst_vma->vm_file->f_mapping; - hash = hugetlb_fault_mutex_hash(h, mapping, idx, dst_addr); + hash = hugetlb_fault_mutex_hash(mapping, idx, dst_addr); mutex_lock(&hugetlb_fault_mutex_table[hash]); err = -ENOMEM; -- 2.17.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() 2019-10-05 0:33 ` [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() Wei Yang @ 2019-10-05 5:42 ` kbuild test robot 2019-10-05 5:43 ` kbuild test robot 2019-10-06 2:25 ` kbuild test robot 2 siblings, 0 replies; 4+ messages in thread From: kbuild test robot @ 2019-10-05 5:42 UTC (permalink / raw) To: Wei Yang Cc: kbuild-all, mike.kravetz, akpm, hughd, aarcange, linux-mm, linux-kernel, Wei Yang [-- Attachment #1: Type: text/plain, Size: 6189 bytes --] Hi Wei, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [cannot apply to v5.4-rc1 next-20191004] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Wei-Yang/hugetlb-remove-unused-hstate-in-hugetlb_fault_mutex_hash/20191005-090034 config: x86_64-fedora-25 (attached as .config) compiler: gcc-7 (Debian 7.4.0-13) 7.4.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> All warnings (new ones prefixed by >>): In file included from include/asm-generic/bug.h:5:0, from arch/x86/include/asm/bug.h:83, from include/linux/bug.h:5, from include/linux/mmdebug.h:5, from include/linux/mm.h:9, from mm/userfaultfd.c:8: mm/userfaultfd.c: In function '__mcopy_atomic_hugetlb': mm/userfaultfd.c:262:40: error: 'h' undeclared (first use in this function) VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^ include/linux/compiler.h:78:42: note: in definition of macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^ >> include/linux/mmdebug.h:18:25: note: in expansion of macro 'BUG_ON' #define VM_BUG_ON(cond) BUG_ON(cond) ^~~~~~ mm/userfaultfd.c:262:3: note: in expansion of macro 'VM_BUG_ON' VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^~~~~~~~~ mm/userfaultfd.c:262:40: note: each undeclared identifier is reported only once for each function it appears in VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^ include/linux/compiler.h:78:42: note: in definition of macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^ >> include/linux/mmdebug.h:18:25: note: in expansion of macro 'BUG_ON' #define VM_BUG_ON(cond) BUG_ON(cond) ^~~~~~ mm/userfaultfd.c:262:3: note: in expansion of macro 'VM_BUG_ON' VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^~~~~~~~~ vim +/BUG_ON +18 include/linux/mmdebug.h 309381feaee564 Sasha Levin 2014-01-23 16 59ea746337c69f Jiri Slaby 2008-06-12 17 #ifdef CONFIG_DEBUG_VM 59ea746337c69f Jiri Slaby 2008-06-12 @18 #define VM_BUG_ON(cond) BUG_ON(cond) 309381feaee564 Sasha Levin 2014-01-23 19 #define VM_BUG_ON_PAGE(cond, page) \ e4f674229ce63d Dave Hansen 2014-06-04 20 do { \ e4f674229ce63d Dave Hansen 2014-06-04 21 if (unlikely(cond)) { \ e4f674229ce63d Dave Hansen 2014-06-04 22 dump_page(page, "VM_BUG_ON_PAGE(" __stringify(cond)")");\ e4f674229ce63d Dave Hansen 2014-06-04 23 BUG(); \ e4f674229ce63d Dave Hansen 2014-06-04 24 } \ e4f674229ce63d Dave Hansen 2014-06-04 25 } while (0) fa3759ccd5651c Sasha Levin 2014-10-09 26 #define VM_BUG_ON_VMA(cond, vma) \ fa3759ccd5651c Sasha Levin 2014-10-09 27 do { \ fa3759ccd5651c Sasha Levin 2014-10-09 28 if (unlikely(cond)) { \ fa3759ccd5651c Sasha Levin 2014-10-09 29 dump_vma(vma); \ fa3759ccd5651c Sasha Levin 2014-10-09 30 BUG(); \ fa3759ccd5651c Sasha Levin 2014-10-09 31 } \ fa3759ccd5651c Sasha Levin 2014-10-09 32 } while (0) 31c9afa6db122a Sasha Levin 2014-10-09 33 #define VM_BUG_ON_MM(cond, mm) \ 31c9afa6db122a Sasha Levin 2014-10-09 34 do { \ 31c9afa6db122a Sasha Levin 2014-10-09 35 if (unlikely(cond)) { \ 31c9afa6db122a Sasha Levin 2014-10-09 36 dump_mm(mm); \ 31c9afa6db122a Sasha Levin 2014-10-09 37 BUG(); \ 31c9afa6db122a Sasha Levin 2014-10-09 38 } \ 31c9afa6db122a Sasha Levin 2014-10-09 39 } while (0) 91241681c62a5a Michal Hocko 2018-04-05 40 #define VM_WARN_ON(cond) (void)WARN_ON(cond) 91241681c62a5a Michal Hocko 2018-04-05 41 #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 91241681c62a5a Michal Hocko 2018-04-05 42 #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format) 91241681c62a5a Michal Hocko 2018-04-05 43 #define VM_WARN(cond, format...) (void)WARN(cond, format) 59ea746337c69f Jiri Slaby 2008-06-12 44 #else 02602a18c32d76 Konstantin Khlebnikov 2012-05-29 45 #define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond) 309381feaee564 Sasha Levin 2014-01-23 46 #define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond) fa3759ccd5651c Sasha Levin 2014-10-09 47 #define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond) 31c9afa6db122a Sasha Levin 2014-10-09 48 #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond) 02a8efeda894d3 Andrew Morton 2014-06-04 49 #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond) 02a8efeda894d3 Andrew Morton 2014-06-04 50 #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) ef6b571fb8920d Andrew Morton 2014-08-06 51 #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond) a54f9aebaa9f0e Aneesh Kumar K.V 2016-07-26 52 #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond) 59ea746337c69f Jiri Slaby 2008-06-12 53 #endif 59ea746337c69f Jiri Slaby 2008-06-12 54 :::::: The code at line 18 was first introduced by commit :::::: 59ea746337c69f6a5f1bc4d5e8544b3cbf12f801 MM: virtual address debug :::::: TO: Jiri Slaby <jirislaby@gmail.com> :::::: CC: Ingo Molnar <mingo@elte.hu> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 51184 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() 2019-10-05 0:33 ` [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() Wei Yang 2019-10-05 5:42 ` kbuild test robot @ 2019-10-05 5:43 ` kbuild test robot 2019-10-06 2:25 ` kbuild test robot 2 siblings, 0 replies; 4+ messages in thread From: kbuild test robot @ 2019-10-05 5:43 UTC (permalink / raw) To: Wei Yang Cc: kbuild-all, mike.kravetz, akpm, hughd, aarcange, linux-mm, linux-kernel, Wei Yang [-- Attachment #1: Type: text/plain, Size: 20198 bytes --] Hi Wei, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [cannot apply to v5.4-rc1 next-20191004] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Wei-Yang/hugetlb-remove-unused-hstate-in-hugetlb_fault_mutex_hash/20191005-090034 config: x86_64-lkp (attached as .config) compiler: gcc-7 (Debian 7.4.0-13) 7.4.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): In file included from include/linux/kernel.h:16:0, from include/asm-generic/bug.h:19, from arch/x86/include/asm/bug.h:83, from include/linux/bug.h:5, from include/linux/mmdebug.h:5, from include/linux/mm.h:9, from mm/userfaultfd.c:8: mm/userfaultfd.c: In function '__mcopy_atomic_hugetlb': >> mm/userfaultfd.c:262:40: error: 'h' undeclared (first use in this function) VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^ include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID' #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) ^ >> mm/userfaultfd.c:262:3: note: in expansion of macro 'VM_BUG_ON' VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^~~~~~~~~ mm/userfaultfd.c:262:40: note: each undeclared identifier is reported only once for each function it appears in VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^ include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID' #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) ^ >> mm/userfaultfd.c:262:3: note: in expansion of macro 'VM_BUG_ON' VM_BUG_ON(dst_addr & ~huge_page_mask(h)); ^~~~~~~~~ vim +/h +262 mm/userfaultfd.c c1a4de99fada21 Andrea Arcangeli 2015-09-04 167 60d4d2d2b40e44 Mike Kravetz 2017-02-22 168 #ifdef CONFIG_HUGETLB_PAGE 60d4d2d2b40e44 Mike Kravetz 2017-02-22 169 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 170 * __mcopy_atomic processing for HUGETLB vmas. Note that this routine is 60d4d2d2b40e44 Mike Kravetz 2017-02-22 171 * called with mmap_sem held, it will release mmap_sem before returning. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 172 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 173 static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 174 struct vm_area_struct *dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 175 unsigned long dst_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 176 unsigned long src_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 177 unsigned long len, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 178 bool zeropage) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 179 { 1c9e8def43a345 Mike Kravetz 2017-02-22 180 int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED; 1c9e8def43a345 Mike Kravetz 2017-02-22 181 int vm_shared = dst_vma->vm_flags & VM_SHARED; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 182 ssize_t err; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 183 pte_t *dst_pte; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 184 unsigned long src_addr, dst_addr; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 185 long copied; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 186 struct page *page; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 187 unsigned long vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 188 pgoff_t idx; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 189 u32 hash; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 190 struct address_space *mapping; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 191 60d4d2d2b40e44 Mike Kravetz 2017-02-22 192 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 193 * There is no default zero huge page for all huge page sizes as 60d4d2d2b40e44 Mike Kravetz 2017-02-22 194 * supported by hugetlb. A PMD_SIZE huge pages may exist as used 60d4d2d2b40e44 Mike Kravetz 2017-02-22 195 * by THP. Since we can not reliably insert a zero page, this 60d4d2d2b40e44 Mike Kravetz 2017-02-22 196 * feature is not supported. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 197 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 198 if (zeropage) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 199 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 200 return -EINVAL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 201 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 202 60d4d2d2b40e44 Mike Kravetz 2017-02-22 203 src_addr = src_start; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 204 dst_addr = dst_start; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 205 copied = 0; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 206 page = NULL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 207 vma_hpagesize = vma_kernel_pagesize(dst_vma); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 208 60d4d2d2b40e44 Mike Kravetz 2017-02-22 209 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 210 * Validate alignment based on huge page size 60d4d2d2b40e44 Mike Kravetz 2017-02-22 211 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 212 err = -EINVAL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 213 if (dst_start & (vma_hpagesize - 1) || len & (vma_hpagesize - 1)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 214 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 215 60d4d2d2b40e44 Mike Kravetz 2017-02-22 216 retry: 60d4d2d2b40e44 Mike Kravetz 2017-02-22 217 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 218 * On routine entry dst_vma is set. If we had to drop mmap_sem and 60d4d2d2b40e44 Mike Kravetz 2017-02-22 219 * retry, dst_vma will be set to NULL and we must lookup again. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 220 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 221 if (!dst_vma) { 27d02568f529e9 Mike Rapoport 2017-02-24 222 err = -ENOENT; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 223 dst_vma = find_vma(dst_mm, dst_start); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 224 if (!dst_vma || !is_vm_hugetlb_page(dst_vma)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 225 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 226 /* 29ec90660d68bb Andrea Arcangeli 2018-11-30 227 * Check the vma is registered in uffd, this is 29ec90660d68bb Andrea Arcangeli 2018-11-30 228 * required to enforce the VM_MAYWRITE check done at 29ec90660d68bb Andrea Arcangeli 2018-11-30 229 * uffd registration time. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 230 */ 27d02568f529e9 Mike Rapoport 2017-02-24 231 if (!dst_vma->vm_userfaultfd_ctx.ctx) 27d02568f529e9 Mike Rapoport 2017-02-24 232 goto out_unlock; 27d02568f529e9 Mike Rapoport 2017-02-24 233 60d4d2d2b40e44 Mike Kravetz 2017-02-22 234 if (dst_start < dst_vma->vm_start || 60d4d2d2b40e44 Mike Kravetz 2017-02-22 235 dst_start + len > dst_vma->vm_end) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 236 goto out_unlock; 1c9e8def43a345 Mike Kravetz 2017-02-22 237 27d02568f529e9 Mike Rapoport 2017-02-24 238 err = -EINVAL; 27d02568f529e9 Mike Rapoport 2017-02-24 239 if (vma_hpagesize != vma_kernel_pagesize(dst_vma)) 27d02568f529e9 Mike Rapoport 2017-02-24 240 goto out_unlock; 27d02568f529e9 Mike Rapoport 2017-02-24 241 1c9e8def43a345 Mike Kravetz 2017-02-22 242 vm_shared = dst_vma->vm_flags & VM_SHARED; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 243 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 244 60d4d2d2b40e44 Mike Kravetz 2017-02-22 245 if (WARN_ON(dst_addr & (vma_hpagesize - 1) || 60d4d2d2b40e44 Mike Kravetz 2017-02-22 246 (len - copied) & (vma_hpagesize - 1))) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 247 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 248 60d4d2d2b40e44 Mike Kravetz 2017-02-22 249 /* 1c9e8def43a345 Mike Kravetz 2017-02-22 250 * If not shared, ensure the dst_vma has a anon_vma. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 251 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 252 err = -ENOMEM; 1c9e8def43a345 Mike Kravetz 2017-02-22 253 if (!vm_shared) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 254 if (unlikely(anon_vma_prepare(dst_vma))) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 255 goto out_unlock; 1c9e8def43a345 Mike Kravetz 2017-02-22 256 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 257 60d4d2d2b40e44 Mike Kravetz 2017-02-22 258 while (src_addr < src_start + len) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 259 pte_t dst_pteval; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 260 60d4d2d2b40e44 Mike Kravetz 2017-02-22 261 BUG_ON(dst_addr >= dst_start + len); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 @262 VM_BUG_ON(dst_addr & ~huge_page_mask(h)); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 263 60d4d2d2b40e44 Mike Kravetz 2017-02-22 264 /* ddeaab32a89f04 Mike Kravetz 2019-01-08 265 * Serialize via hugetlb_fault_mutex 60d4d2d2b40e44 Mike Kravetz 2017-02-22 266 */ b43a9990055958 Mike Kravetz 2018-12-28 267 idx = linear_page_index(dst_vma, dst_addr); ddeaab32a89f04 Mike Kravetz 2019-01-08 268 mapping = dst_vma->vm_file->f_mapping; 2b52c262f0e75d Wei Yang 2019-10-05 269 hash = hugetlb_fault_mutex_hash(mapping, idx, dst_addr); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 270 mutex_lock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 271 60d4d2d2b40e44 Mike Kravetz 2017-02-22 272 err = -ENOMEM; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 273 dst_pte = huge_pte_alloc(dst_mm, dst_addr, huge_page_size(h)); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 274 if (!dst_pte) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 275 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 276 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 277 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 278 60d4d2d2b40e44 Mike Kravetz 2017-02-22 279 err = -EEXIST; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 280 dst_pteval = huge_ptep_get(dst_pte); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 281 if (!huge_pte_none(dst_pteval)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 282 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 283 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 284 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 285 60d4d2d2b40e44 Mike Kravetz 2017-02-22 286 err = hugetlb_mcopy_atomic_pte(dst_mm, dst_pte, dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 287 dst_addr, src_addr, &page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 288 60d4d2d2b40e44 Mike Kravetz 2017-02-22 289 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 1c9e8def43a345 Mike Kravetz 2017-02-22 290 vm_alloc_shared = vm_shared; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 291 60d4d2d2b40e44 Mike Kravetz 2017-02-22 292 cond_resched(); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 293 9e368259ad9883 Andrea Arcangeli 2018-11-30 294 if (unlikely(err == -ENOENT)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 295 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 296 BUG_ON(!page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 297 60d4d2d2b40e44 Mike Kravetz 2017-02-22 298 err = copy_huge_page_from_user(page, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 299 (const void __user *)src_addr, 810a56b943e265 Mike Kravetz 2017-02-22 300 pages_per_huge_page(h), true); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 301 if (unlikely(err)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 302 err = -EFAULT; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 303 goto out; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 304 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 305 down_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 306 60d4d2d2b40e44 Mike Kravetz 2017-02-22 307 dst_vma = NULL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 308 goto retry; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 309 } else 60d4d2d2b40e44 Mike Kravetz 2017-02-22 310 BUG_ON(page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 311 60d4d2d2b40e44 Mike Kravetz 2017-02-22 312 if (!err) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 313 dst_addr += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 314 src_addr += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 315 copied += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 316 60d4d2d2b40e44 Mike Kravetz 2017-02-22 317 if (fatal_signal_pending(current)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 318 err = -EINTR; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 319 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 320 if (err) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 321 break; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 322 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 323 60d4d2d2b40e44 Mike Kravetz 2017-02-22 324 out_unlock: 60d4d2d2b40e44 Mike Kravetz 2017-02-22 325 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 326 out: 21205bf8f77b23 Mike Kravetz 2017-02-22 327 if (page) { 21205bf8f77b23 Mike Kravetz 2017-02-22 328 /* 21205bf8f77b23 Mike Kravetz 2017-02-22 329 * We encountered an error and are about to free a newly 1c9e8def43a345 Mike Kravetz 2017-02-22 330 * allocated huge page. 1c9e8def43a345 Mike Kravetz 2017-02-22 331 * 1c9e8def43a345 Mike Kravetz 2017-02-22 332 * Reservation handling is very subtle, and is different for 1c9e8def43a345 Mike Kravetz 2017-02-22 333 * private and shared mappings. See the routine 1c9e8def43a345 Mike Kravetz 2017-02-22 334 * restore_reserve_on_error for details. Unfortunately, we 1c9e8def43a345 Mike Kravetz 2017-02-22 335 * can not call restore_reserve_on_error now as it would 1c9e8def43a345 Mike Kravetz 2017-02-22 336 * require holding mmap_sem. 1c9e8def43a345 Mike Kravetz 2017-02-22 337 * 1c9e8def43a345 Mike Kravetz 2017-02-22 338 * If a reservation for the page existed in the reservation 1c9e8def43a345 Mike Kravetz 2017-02-22 339 * map of a private mapping, the map was modified to indicate 1c9e8def43a345 Mike Kravetz 2017-02-22 340 * the reservation was consumed when the page was allocated. 1c9e8def43a345 Mike Kravetz 2017-02-22 341 * We clear the PagePrivate flag now so that the global 21205bf8f77b23 Mike Kravetz 2017-02-22 342 * reserve count will not be incremented in free_huge_page. 21205bf8f77b23 Mike Kravetz 2017-02-22 343 * The reservation map will still indicate the reservation 21205bf8f77b23 Mike Kravetz 2017-02-22 344 * was consumed and possibly prevent later page allocation. 1c9e8def43a345 Mike Kravetz 2017-02-22 345 * This is better than leaking a global reservation. If no 1c9e8def43a345 Mike Kravetz 2017-02-22 346 * reservation existed, it is still safe to clear PagePrivate 1c9e8def43a345 Mike Kravetz 2017-02-22 347 * as no adjustments to reservation counts were made during 1c9e8def43a345 Mike Kravetz 2017-02-22 348 * allocation. 1c9e8def43a345 Mike Kravetz 2017-02-22 349 * 1c9e8def43a345 Mike Kravetz 2017-02-22 350 * The reservation map for shared mappings indicates which 1c9e8def43a345 Mike Kravetz 2017-02-22 351 * pages have reservations. When a huge page is allocated 1c9e8def43a345 Mike Kravetz 2017-02-22 352 * for an address with a reservation, no change is made to 1c9e8def43a345 Mike Kravetz 2017-02-22 353 * the reserve map. In this case PagePrivate will be set 1c9e8def43a345 Mike Kravetz 2017-02-22 354 * to indicate that the global reservation count should be 1c9e8def43a345 Mike Kravetz 2017-02-22 355 * incremented when the page is freed. This is the desired 1c9e8def43a345 Mike Kravetz 2017-02-22 356 * behavior. However, when a huge page is allocated for an 1c9e8def43a345 Mike Kravetz 2017-02-22 357 * address without a reservation a reservation entry is added 1c9e8def43a345 Mike Kravetz 2017-02-22 358 * to the reservation map, and PagePrivate will not be set. 1c9e8def43a345 Mike Kravetz 2017-02-22 359 * When the page is freed, the global reserve count will NOT 1c9e8def43a345 Mike Kravetz 2017-02-22 360 * be incremented and it will appear as though we have leaked 1c9e8def43a345 Mike Kravetz 2017-02-22 361 * reserved page. In this case, set PagePrivate so that the 1c9e8def43a345 Mike Kravetz 2017-02-22 362 * global reserve count will be incremented to match the 1c9e8def43a345 Mike Kravetz 2017-02-22 363 * reservation map entry which was created. 1c9e8def43a345 Mike Kravetz 2017-02-22 364 * 1c9e8def43a345 Mike Kravetz 2017-02-22 365 * Note that vm_alloc_shared is based on the flags of the vma 1c9e8def43a345 Mike Kravetz 2017-02-22 366 * for which the page was originally allocated. dst_vma could 1c9e8def43a345 Mike Kravetz 2017-02-22 367 * be different or NULL on error. 21205bf8f77b23 Mike Kravetz 2017-02-22 368 */ 1c9e8def43a345 Mike Kravetz 2017-02-22 369 if (vm_alloc_shared) 1c9e8def43a345 Mike Kravetz 2017-02-22 370 SetPagePrivate(page); 1c9e8def43a345 Mike Kravetz 2017-02-22 371 else 21205bf8f77b23 Mike Kravetz 2017-02-22 372 ClearPagePrivate(page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 373 put_page(page); 21205bf8f77b23 Mike Kravetz 2017-02-22 374 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 375 BUG_ON(copied < 0); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 376 BUG_ON(err > 0); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 377 BUG_ON(!copied && !err); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 378 return copied ? copied : err; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 379 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 380 #else /* !CONFIG_HUGETLB_PAGE */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 381 /* fail at build time if gcc attempts to use this */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 382 extern ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 383 struct vm_area_struct *dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 384 unsigned long dst_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 385 unsigned long src_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 386 unsigned long len, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 387 bool zeropage); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 388 #endif /* CONFIG_HUGETLB_PAGE */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 389 :::::: The code at line 262 was first introduced by commit :::::: 60d4d2d2b40e44cd36bfb6049e8d9e2055a24f8a userfaultfd: hugetlbfs: add __mcopy_atomic_hugetlb for huge page UFFDIO_COPY :::::: TO: Mike Kravetz <mike.kravetz@oracle.com> :::::: CC: Linus Torvalds <torvalds@linux-foundation.org> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 28633 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() 2019-10-05 0:33 ` [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() Wei Yang 2019-10-05 5:42 ` kbuild test robot 2019-10-05 5:43 ` kbuild test robot @ 2019-10-06 2:25 ` kbuild test robot 2 siblings, 0 replies; 4+ messages in thread From: kbuild test robot @ 2019-10-06 2:25 UTC (permalink / raw) To: Wei Yang Cc: kbuild-all, mike.kravetz, akpm, hughd, aarcange, linux-mm, linux-kernel, Wei Yang Hi Wei, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [cannot apply to v5.4-rc1 next-20191004] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Wei-Yang/hugetlb-remove-unused-hstate-in-hugetlb_fault_mutex_hash/20191005-090034 reproduce: # apt-get install sparse # sparse version: v0.6.1-rc1-42-g38eda53-dirty make ARCH=x86_64 allmodconfig make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) mm/userfaultfd.c:262:17: sparse: sparse: undefined identifier 'h' mm/userfaultfd.c:273:75: sparse: sparse: undefined identifier 'h' mm/userfaultfd.c:300:69: sparse: sparse: undefined identifier 'h' >> mm/userfaultfd.c:262:17: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected struct hstate *h @@ got hstate *h @@ >> mm/userfaultfd.c:262:17: sparse: expected struct hstate *h >> mm/userfaultfd.c:262:17: sparse: got bad type mm/userfaultfd.c:273:75: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected struct hstate *h @@ got hstate *h @@ mm/userfaultfd.c:273:75: sparse: expected struct hstate *h mm/userfaultfd.c:273:75: sparse: got bad type mm/userfaultfd.c:300:69: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected struct hstate *h @@ got hstate *h @@ mm/userfaultfd.c:300:69: sparse: expected struct hstate *h mm/userfaultfd.c:300:69: sparse: got bad type vim +262 mm/userfaultfd.c c1a4de99fada21 Andrea Arcangeli 2015-09-04 167 60d4d2d2b40e44 Mike Kravetz 2017-02-22 168 #ifdef CONFIG_HUGETLB_PAGE 60d4d2d2b40e44 Mike Kravetz 2017-02-22 169 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 170 * __mcopy_atomic processing for HUGETLB vmas. Note that this routine is 60d4d2d2b40e44 Mike Kravetz 2017-02-22 171 * called with mmap_sem held, it will release mmap_sem before returning. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 172 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 173 static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 174 struct vm_area_struct *dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 175 unsigned long dst_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 176 unsigned long src_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 177 unsigned long len, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 178 bool zeropage) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 179 { 1c9e8def43a345 Mike Kravetz 2017-02-22 180 int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED; 1c9e8def43a345 Mike Kravetz 2017-02-22 181 int vm_shared = dst_vma->vm_flags & VM_SHARED; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 182 ssize_t err; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 183 pte_t *dst_pte; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 184 unsigned long src_addr, dst_addr; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 185 long copied; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 186 struct page *page; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 187 unsigned long vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 188 pgoff_t idx; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 189 u32 hash; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 190 struct address_space *mapping; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 191 60d4d2d2b40e44 Mike Kravetz 2017-02-22 192 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 193 * There is no default zero huge page for all huge page sizes as 60d4d2d2b40e44 Mike Kravetz 2017-02-22 194 * supported by hugetlb. A PMD_SIZE huge pages may exist as used 60d4d2d2b40e44 Mike Kravetz 2017-02-22 195 * by THP. Since we can not reliably insert a zero page, this 60d4d2d2b40e44 Mike Kravetz 2017-02-22 196 * feature is not supported. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 197 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 198 if (zeropage) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 199 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 200 return -EINVAL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 201 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 202 60d4d2d2b40e44 Mike Kravetz 2017-02-22 203 src_addr = src_start; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 204 dst_addr = dst_start; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 205 copied = 0; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 206 page = NULL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 207 vma_hpagesize = vma_kernel_pagesize(dst_vma); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 208 60d4d2d2b40e44 Mike Kravetz 2017-02-22 209 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 210 * Validate alignment based on huge page size 60d4d2d2b40e44 Mike Kravetz 2017-02-22 211 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 212 err = -EINVAL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 213 if (dst_start & (vma_hpagesize - 1) || len & (vma_hpagesize - 1)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 214 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 215 60d4d2d2b40e44 Mike Kravetz 2017-02-22 216 retry: 60d4d2d2b40e44 Mike Kravetz 2017-02-22 217 /* 60d4d2d2b40e44 Mike Kravetz 2017-02-22 218 * On routine entry dst_vma is set. If we had to drop mmap_sem and 60d4d2d2b40e44 Mike Kravetz 2017-02-22 219 * retry, dst_vma will be set to NULL and we must lookup again. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 220 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 221 if (!dst_vma) { 27d02568f529e9 Mike Rapoport 2017-02-24 222 err = -ENOENT; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 223 dst_vma = find_vma(dst_mm, dst_start); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 224 if (!dst_vma || !is_vm_hugetlb_page(dst_vma)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 225 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 226 /* 29ec90660d68bb Andrea Arcangeli 2018-11-30 227 * Check the vma is registered in uffd, this is 29ec90660d68bb Andrea Arcangeli 2018-11-30 228 * required to enforce the VM_MAYWRITE check done at 29ec90660d68bb Andrea Arcangeli 2018-11-30 229 * uffd registration time. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 230 */ 27d02568f529e9 Mike Rapoport 2017-02-24 231 if (!dst_vma->vm_userfaultfd_ctx.ctx) 27d02568f529e9 Mike Rapoport 2017-02-24 232 goto out_unlock; 27d02568f529e9 Mike Rapoport 2017-02-24 233 60d4d2d2b40e44 Mike Kravetz 2017-02-22 234 if (dst_start < dst_vma->vm_start || 60d4d2d2b40e44 Mike Kravetz 2017-02-22 235 dst_start + len > dst_vma->vm_end) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 236 goto out_unlock; 1c9e8def43a345 Mike Kravetz 2017-02-22 237 27d02568f529e9 Mike Rapoport 2017-02-24 238 err = -EINVAL; 27d02568f529e9 Mike Rapoport 2017-02-24 239 if (vma_hpagesize != vma_kernel_pagesize(dst_vma)) 27d02568f529e9 Mike Rapoport 2017-02-24 240 goto out_unlock; 27d02568f529e9 Mike Rapoport 2017-02-24 241 1c9e8def43a345 Mike Kravetz 2017-02-22 242 vm_shared = dst_vma->vm_flags & VM_SHARED; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 243 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 244 60d4d2d2b40e44 Mike Kravetz 2017-02-22 245 if (WARN_ON(dst_addr & (vma_hpagesize - 1) || 60d4d2d2b40e44 Mike Kravetz 2017-02-22 246 (len - copied) & (vma_hpagesize - 1))) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 247 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 248 60d4d2d2b40e44 Mike Kravetz 2017-02-22 249 /* 1c9e8def43a345 Mike Kravetz 2017-02-22 250 * If not shared, ensure the dst_vma has a anon_vma. 60d4d2d2b40e44 Mike Kravetz 2017-02-22 251 */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 252 err = -ENOMEM; 1c9e8def43a345 Mike Kravetz 2017-02-22 253 if (!vm_shared) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 254 if (unlikely(anon_vma_prepare(dst_vma))) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 255 goto out_unlock; 1c9e8def43a345 Mike Kravetz 2017-02-22 256 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 257 60d4d2d2b40e44 Mike Kravetz 2017-02-22 258 while (src_addr < src_start + len) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 259 pte_t dst_pteval; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 260 60d4d2d2b40e44 Mike Kravetz 2017-02-22 261 BUG_ON(dst_addr >= dst_start + len); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 @262 VM_BUG_ON(dst_addr & ~huge_page_mask(h)); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 263 60d4d2d2b40e44 Mike Kravetz 2017-02-22 264 /* ddeaab32a89f04 Mike Kravetz 2019-01-08 265 * Serialize via hugetlb_fault_mutex 60d4d2d2b40e44 Mike Kravetz 2017-02-22 266 */ b43a9990055958 Mike Kravetz 2018-12-28 267 idx = linear_page_index(dst_vma, dst_addr); ddeaab32a89f04 Mike Kravetz 2019-01-08 268 mapping = dst_vma->vm_file->f_mapping; 2b52c262f0e75d Wei Yang 2019-10-05 269 hash = hugetlb_fault_mutex_hash(mapping, idx, dst_addr); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 270 mutex_lock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 271 60d4d2d2b40e44 Mike Kravetz 2017-02-22 272 err = -ENOMEM; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 273 dst_pte = huge_pte_alloc(dst_mm, dst_addr, huge_page_size(h)); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 274 if (!dst_pte) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 275 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 276 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 277 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 278 60d4d2d2b40e44 Mike Kravetz 2017-02-22 279 err = -EEXIST; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 280 dst_pteval = huge_ptep_get(dst_pte); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 281 if (!huge_pte_none(dst_pteval)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 282 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 283 goto out_unlock; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 284 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 285 60d4d2d2b40e44 Mike Kravetz 2017-02-22 286 err = hugetlb_mcopy_atomic_pte(dst_mm, dst_pte, dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 287 dst_addr, src_addr, &page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 288 60d4d2d2b40e44 Mike Kravetz 2017-02-22 289 mutex_unlock(&hugetlb_fault_mutex_table[hash]); 1c9e8def43a345 Mike Kravetz 2017-02-22 290 vm_alloc_shared = vm_shared; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 291 60d4d2d2b40e44 Mike Kravetz 2017-02-22 292 cond_resched(); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 293 9e368259ad9883 Andrea Arcangeli 2018-11-30 294 if (unlikely(err == -ENOENT)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 295 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 296 BUG_ON(!page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 297 60d4d2d2b40e44 Mike Kravetz 2017-02-22 298 err = copy_huge_page_from_user(page, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 299 (const void __user *)src_addr, 810a56b943e265 Mike Kravetz 2017-02-22 300 pages_per_huge_page(h), true); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 301 if (unlikely(err)) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 302 err = -EFAULT; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 303 goto out; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 304 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 305 down_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 306 60d4d2d2b40e44 Mike Kravetz 2017-02-22 307 dst_vma = NULL; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 308 goto retry; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 309 } else 60d4d2d2b40e44 Mike Kravetz 2017-02-22 310 BUG_ON(page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 311 60d4d2d2b40e44 Mike Kravetz 2017-02-22 312 if (!err) { 60d4d2d2b40e44 Mike Kravetz 2017-02-22 313 dst_addr += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 314 src_addr += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 315 copied += vma_hpagesize; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 316 60d4d2d2b40e44 Mike Kravetz 2017-02-22 317 if (fatal_signal_pending(current)) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 318 err = -EINTR; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 319 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 320 if (err) 60d4d2d2b40e44 Mike Kravetz 2017-02-22 321 break; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 322 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 323 60d4d2d2b40e44 Mike Kravetz 2017-02-22 324 out_unlock: 60d4d2d2b40e44 Mike Kravetz 2017-02-22 325 up_read(&dst_mm->mmap_sem); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 326 out: 21205bf8f77b23 Mike Kravetz 2017-02-22 327 if (page) { 21205bf8f77b23 Mike Kravetz 2017-02-22 328 /* 21205bf8f77b23 Mike Kravetz 2017-02-22 329 * We encountered an error and are about to free a newly 1c9e8def43a345 Mike Kravetz 2017-02-22 330 * allocated huge page. 1c9e8def43a345 Mike Kravetz 2017-02-22 331 * 1c9e8def43a345 Mike Kravetz 2017-02-22 332 * Reservation handling is very subtle, and is different for 1c9e8def43a345 Mike Kravetz 2017-02-22 333 * private and shared mappings. See the routine 1c9e8def43a345 Mike Kravetz 2017-02-22 334 * restore_reserve_on_error for details. Unfortunately, we 1c9e8def43a345 Mike Kravetz 2017-02-22 335 * can not call restore_reserve_on_error now as it would 1c9e8def43a345 Mike Kravetz 2017-02-22 336 * require holding mmap_sem. 1c9e8def43a345 Mike Kravetz 2017-02-22 337 * 1c9e8def43a345 Mike Kravetz 2017-02-22 338 * If a reservation for the page existed in the reservation 1c9e8def43a345 Mike Kravetz 2017-02-22 339 * map of a private mapping, the map was modified to indicate 1c9e8def43a345 Mike Kravetz 2017-02-22 340 * the reservation was consumed when the page was allocated. 1c9e8def43a345 Mike Kravetz 2017-02-22 341 * We clear the PagePrivate flag now so that the global 21205bf8f77b23 Mike Kravetz 2017-02-22 342 * reserve count will not be incremented in free_huge_page. 21205bf8f77b23 Mike Kravetz 2017-02-22 343 * The reservation map will still indicate the reservation 21205bf8f77b23 Mike Kravetz 2017-02-22 344 * was consumed and possibly prevent later page allocation. 1c9e8def43a345 Mike Kravetz 2017-02-22 345 * This is better than leaking a global reservation. If no 1c9e8def43a345 Mike Kravetz 2017-02-22 346 * reservation existed, it is still safe to clear PagePrivate 1c9e8def43a345 Mike Kravetz 2017-02-22 347 * as no adjustments to reservation counts were made during 1c9e8def43a345 Mike Kravetz 2017-02-22 348 * allocation. 1c9e8def43a345 Mike Kravetz 2017-02-22 349 * 1c9e8def43a345 Mike Kravetz 2017-02-22 350 * The reservation map for shared mappings indicates which 1c9e8def43a345 Mike Kravetz 2017-02-22 351 * pages have reservations. When a huge page is allocated 1c9e8def43a345 Mike Kravetz 2017-02-22 352 * for an address with a reservation, no change is made to 1c9e8def43a345 Mike Kravetz 2017-02-22 353 * the reserve map. In this case PagePrivate will be set 1c9e8def43a345 Mike Kravetz 2017-02-22 354 * to indicate that the global reservation count should be 1c9e8def43a345 Mike Kravetz 2017-02-22 355 * incremented when the page is freed. This is the desired 1c9e8def43a345 Mike Kravetz 2017-02-22 356 * behavior. However, when a huge page is allocated for an 1c9e8def43a345 Mike Kravetz 2017-02-22 357 * address without a reservation a reservation entry is added 1c9e8def43a345 Mike Kravetz 2017-02-22 358 * to the reservation map, and PagePrivate will not be set. 1c9e8def43a345 Mike Kravetz 2017-02-22 359 * When the page is freed, the global reserve count will NOT 1c9e8def43a345 Mike Kravetz 2017-02-22 360 * be incremented and it will appear as though we have leaked 1c9e8def43a345 Mike Kravetz 2017-02-22 361 * reserved page. In this case, set PagePrivate so that the 1c9e8def43a345 Mike Kravetz 2017-02-22 362 * global reserve count will be incremented to match the 1c9e8def43a345 Mike Kravetz 2017-02-22 363 * reservation map entry which was created. 1c9e8def43a345 Mike Kravetz 2017-02-22 364 * 1c9e8def43a345 Mike Kravetz 2017-02-22 365 * Note that vm_alloc_shared is based on the flags of the vma 1c9e8def43a345 Mike Kravetz 2017-02-22 366 * for which the page was originally allocated. dst_vma could 1c9e8def43a345 Mike Kravetz 2017-02-22 367 * be different or NULL on error. 21205bf8f77b23 Mike Kravetz 2017-02-22 368 */ 1c9e8def43a345 Mike Kravetz 2017-02-22 369 if (vm_alloc_shared) 1c9e8def43a345 Mike Kravetz 2017-02-22 370 SetPagePrivate(page); 1c9e8def43a345 Mike Kravetz 2017-02-22 371 else 21205bf8f77b23 Mike Kravetz 2017-02-22 372 ClearPagePrivate(page); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 373 put_page(page); 21205bf8f77b23 Mike Kravetz 2017-02-22 374 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 375 BUG_ON(copied < 0); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 376 BUG_ON(err > 0); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 377 BUG_ON(!copied && !err); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 378 return copied ? copied : err; 60d4d2d2b40e44 Mike Kravetz 2017-02-22 379 } 60d4d2d2b40e44 Mike Kravetz 2017-02-22 380 #else /* !CONFIG_HUGETLB_PAGE */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 381 /* fail at build time if gcc attempts to use this */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 382 extern ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 383 struct vm_area_struct *dst_vma, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 384 unsigned long dst_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 385 unsigned long src_start, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 386 unsigned long len, 60d4d2d2b40e44 Mike Kravetz 2017-02-22 387 bool zeropage); 60d4d2d2b40e44 Mike Kravetz 2017-02-22 388 #endif /* CONFIG_HUGETLB_PAGE */ 60d4d2d2b40e44 Mike Kravetz 2017-02-22 389 :::::: The code at line 262 was first introduced by commit :::::: 60d4d2d2b40e44cd36bfb6049e8d9e2055a24f8a userfaultfd: hugetlbfs: add __mcopy_atomic_hugetlb for huge page UFFDIO_COPY :::::: TO: Mike Kravetz <mike.kravetz@oracle.com> :::::: CC: Linus Torvalds <torvalds@linux-foundation.org> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-10-06 2:29 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20190927151033.aad57472652a0b3a6948df6e@linux-foundation.org>
2019-10-05 0:33 ` [PATCH] hugetlb: remove unused hstate in hugetlb_fault_mutex_hash() Wei Yang
2019-10-05 5:42 ` kbuild test robot
2019-10-05 5:43 ` kbuild test robot
2019-10-06 2:25 ` kbuild test robot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox