From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [linux-next:master 5756/5946] mm/userfaultfd.c:212:6: warning: variable 'vm_alloc_shared' set but not used
Date: Tue, 01 Jun 2021 20:10:02 +0800 [thread overview]
Message-ID: <202106012056.ufRLDFck-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 14646 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: 392d24c0d06bc89a762ba66977db41e53c21bfb5
commit: 1786d001262006df52cdcda4cbc0c8087a0200ec [5756/5946] mm, hugetlb: fix racy resv_huge_pages underflow on UFFDIO_COPY
config: powerpc64-randconfig-r022-20210601 (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=1786d001262006df52cdcda4cbc0c8087a0200ec
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
git fetch --no-tags linux-next master
git checkout 1786d001262006df52cdcda4cbc0c8087a0200ec
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=powerpc64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
mm/userfaultfd.c: In function '__mcopy_atomic_hugetlb':
>> mm/userfaultfd.c:212:6: warning: variable 'vm_alloc_shared' set but not used [-Wunused-but-set-variable]
212 | int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED;
| ^~~~~~~~~~~~~~~
vim +/vm_alloc_shared +212 mm/userfaultfd.c
c1a4de99fada21 Andrea Arcangeli 2015-09-04 199
60d4d2d2b40e44 Mike Kravetz 2017-02-22 200 #ifdef CONFIG_HUGETLB_PAGE
60d4d2d2b40e44 Mike Kravetz 2017-02-22 201 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 202 * __mcopy_atomic processing for HUGETLB vmas. Note that this routine is
c1e8d7c6a7a682 Michel Lespinasse 2020-06-08 203 * called with mmap_lock held, it will release mmap_lock before returning.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 204 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 205 static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 206 struct vm_area_struct *dst_vma,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 207 unsigned long dst_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 208 unsigned long src_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 209 unsigned long len,
f619147104c8ea Axel Rasmussen 2021-05-04 210 enum mcopy_atomic_mode mode)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 211 {
1c9e8def43a345 Mike Kravetz 2017-02-22 @212 int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED;
1c9e8def43a345 Mike Kravetz 2017-02-22 213 int vm_shared = dst_vma->vm_flags & VM_SHARED;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 214 ssize_t err;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 215 pte_t *dst_pte;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 216 unsigned long src_addr, dst_addr;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 217 long copied;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 218 struct page *page;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 219 unsigned long vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 220 pgoff_t idx;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 221 u32 hash;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 222 struct address_space *mapping;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 223
60d4d2d2b40e44 Mike Kravetz 2017-02-22 224 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 225 * There is no default zero huge page for all huge page sizes as
60d4d2d2b40e44 Mike Kravetz 2017-02-22 226 * supported by hugetlb. A PMD_SIZE huge pages may exist as used
60d4d2d2b40e44 Mike Kravetz 2017-02-22 227 * by THP. Since we can not reliably insert a zero page, this
60d4d2d2b40e44 Mike Kravetz 2017-02-22 228 * feature is not supported.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 229 */
f619147104c8ea Axel Rasmussen 2021-05-04 230 if (mode == MCOPY_ATOMIC_ZEROPAGE) {
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 231 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 232 return -EINVAL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 233 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 234
60d4d2d2b40e44 Mike Kravetz 2017-02-22 235 src_addr = src_start;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 236 dst_addr = dst_start;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 237 copied = 0;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 238 page = NULL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 239 vma_hpagesize = vma_kernel_pagesize(dst_vma);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 240
60d4d2d2b40e44 Mike Kravetz 2017-02-22 241 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 242 * Validate alignment based on huge page size
60d4d2d2b40e44 Mike Kravetz 2017-02-22 243 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 244 err = -EINVAL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 245 if (dst_start & (vma_hpagesize - 1) || len & (vma_hpagesize - 1))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 246 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 247
60d4d2d2b40e44 Mike Kravetz 2017-02-22 248 retry:
60d4d2d2b40e44 Mike Kravetz 2017-02-22 249 /*
c1e8d7c6a7a682 Michel Lespinasse 2020-06-08 250 * On routine entry dst_vma is set. If we had to drop mmap_lock and
60d4d2d2b40e44 Mike Kravetz 2017-02-22 251 * retry, dst_vma will be set to NULL and we must lookup again.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 252 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 253 if (!dst_vma) {
27d02568f529e9 Mike Rapoport 2017-02-24 254 err = -ENOENT;
643aa36eadebdc Wei Yang 2019-11-30 255 dst_vma = find_dst_vma(dst_mm, dst_start, len);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 256 if (!dst_vma || !is_vm_hugetlb_page(dst_vma))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 257 goto out_unlock;
1c9e8def43a345 Mike Kravetz 2017-02-22 258
27d02568f529e9 Mike Rapoport 2017-02-24 259 err = -EINVAL;
27d02568f529e9 Mike Rapoport 2017-02-24 260 if (vma_hpagesize != vma_kernel_pagesize(dst_vma))
27d02568f529e9 Mike Rapoport 2017-02-24 261 goto out_unlock;
27d02568f529e9 Mike Rapoport 2017-02-24 262
1c9e8def43a345 Mike Kravetz 2017-02-22 263 vm_shared = dst_vma->vm_flags & VM_SHARED;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 264 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 265
60d4d2d2b40e44 Mike Kravetz 2017-02-22 266 /*
1c9e8def43a345 Mike Kravetz 2017-02-22 267 * If not shared, ensure the dst_vma has a anon_vma.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 268 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 269 err = -ENOMEM;
1c9e8def43a345 Mike Kravetz 2017-02-22 270 if (!vm_shared) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 271 if (unlikely(anon_vma_prepare(dst_vma)))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 272 goto out_unlock;
1c9e8def43a345 Mike Kravetz 2017-02-22 273 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 274
60d4d2d2b40e44 Mike Kravetz 2017-02-22 275 while (src_addr < src_start + len) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 276 BUG_ON(dst_addr >= dst_start + len);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 277
60d4d2d2b40e44 Mike Kravetz 2017-02-22 278 /*
c0d0381ade7988 Mike Kravetz 2020-04-01 279 * Serialize via i_mmap_rwsem and hugetlb_fault_mutex.
c0d0381ade7988 Mike Kravetz 2020-04-01 280 * i_mmap_rwsem ensures the dst_pte remains valid even
c0d0381ade7988 Mike Kravetz 2020-04-01 281 * in the case of shared pmds. fault mutex prevents
c0d0381ade7988 Mike Kravetz 2020-04-01 282 * races with other faulting threads.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 283 */
ddeaab32a89f04 Mike Kravetz 2019-01-08 284 mapping = dst_vma->vm_file->f_mapping;
c0d0381ade7988 Mike Kravetz 2020-04-01 285 i_mmap_lock_read(mapping);
c0d0381ade7988 Mike Kravetz 2020-04-01 286 idx = linear_page_index(dst_vma, dst_addr);
188b04a7d93860 Wei Yang 2019-11-30 287 hash = hugetlb_fault_mutex_hash(mapping, idx);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 288 mutex_lock(&hugetlb_fault_mutex_table[hash]);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 289
60d4d2d2b40e44 Mike Kravetz 2017-02-22 290 err = -ENOMEM;
aec44e0f0213e3 Peter Xu 2021-05-04 291 dst_pte = huge_pte_alloc(dst_mm, dst_vma, dst_addr, vma_hpagesize);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 292 if (!dst_pte) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 293 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 294 i_mmap_unlock_read(mapping);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 295 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 296 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 297
f619147104c8ea Axel Rasmussen 2021-05-04 298 if (mode != MCOPY_ATOMIC_CONTINUE &&
f619147104c8ea Axel Rasmussen 2021-05-04 299 !huge_pte_none(huge_ptep_get(dst_pte))) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 300 err = -EEXIST;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 301 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 302 i_mmap_unlock_read(mapping);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 303 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 304 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 305
60d4d2d2b40e44 Mike Kravetz 2017-02-22 306 err = hugetlb_mcopy_atomic_pte(dst_mm, dst_pte, dst_vma,
f619147104c8ea Axel Rasmussen 2021-05-04 307 dst_addr, src_addr, mode, &page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 308
60d4d2d2b40e44 Mike Kravetz 2017-02-22 309 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 310 i_mmap_unlock_read(mapping);
1c9e8def43a345 Mike Kravetz 2017-02-22 311 vm_alloc_shared = vm_shared;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 312
60d4d2d2b40e44 Mike Kravetz 2017-02-22 313 cond_resched();
60d4d2d2b40e44 Mike Kravetz 2017-02-22 314
9e368259ad9883 Andrea Arcangeli 2018-11-30 315 if (unlikely(err == -ENOENT)) {
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 316 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 317 BUG_ON(!page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 318
60d4d2d2b40e44 Mike Kravetz 2017-02-22 319 err = copy_huge_page_from_user(page,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 320 (const void __user *)src_addr,
4fb07ee6510280 Wei Yang 2019-11-30 321 vma_hpagesize / PAGE_SIZE,
4fb07ee6510280 Wei Yang 2019-11-30 322 true);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 323 if (unlikely(err)) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 324 err = -EFAULT;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 325 goto out;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 326 }
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 327 mmap_read_lock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 328
60d4d2d2b40e44 Mike Kravetz 2017-02-22 329 dst_vma = NULL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 330 goto retry;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 331 } else
60d4d2d2b40e44 Mike Kravetz 2017-02-22 332 BUG_ON(page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 333
60d4d2d2b40e44 Mike Kravetz 2017-02-22 334 if (!err) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 335 dst_addr += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 336 src_addr += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 337 copied += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 338
60d4d2d2b40e44 Mike Kravetz 2017-02-22 339 if (fatal_signal_pending(current))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 340 err = -EINTR;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 341 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 342 if (err)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 343 break;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 344 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 345
60d4d2d2b40e44 Mike Kravetz 2017-02-22 346 out_unlock:
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 347 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 348 out:
1786d001262006 Mina Almasry 2021-06-01 349 if (page)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 350 put_page(page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 351 BUG_ON(copied < 0);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 352 BUG_ON(err > 0);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 353 BUG_ON(!copied && !err);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 354 return copied ? copied : err;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 355 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 356 #else /* !CONFIG_HUGETLB_PAGE */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 357 /* fail at build time if gcc attempts to use this */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 358 extern ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 359 struct vm_area_struct *dst_vma,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 360 unsigned long dst_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 361 unsigned long src_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 362 unsigned long len,
f619147104c8ea Axel Rasmussen 2021-05-04 363 enum mcopy_atomic_mode mode);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 364 #endif /* CONFIG_HUGETLB_PAGE */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 365
:::::: The code at line 212 was first introduced by commit
:::::: 1c9e8def43a3452e7af658b340f5f4f4ecde5c38 userfaultfd: hugetlbfs: add UFFDIO_COPY support for shared mappings
:::::: TO: Mike Kravetz <mike.kravetz@oracle.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 39093 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Mina Almasry <almasrymina@google.com>
Cc: kbuild-all@lists.01.org,
Linux Memory Management List <linux-mm@kvack.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: [linux-next:master 5756/5946] mm/userfaultfd.c:212:6: warning: variable 'vm_alloc_shared' set but not used
Date: Tue, 1 Jun 2021 20:10:02 +0800 [thread overview]
Message-ID: <202106012056.ufRLDFck-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 14439 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: 392d24c0d06bc89a762ba66977db41e53c21bfb5
commit: 1786d001262006df52cdcda4cbc0c8087a0200ec [5756/5946] mm, hugetlb: fix racy resv_huge_pages underflow on UFFDIO_COPY
config: powerpc64-randconfig-r022-20210601 (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=1786d001262006df52cdcda4cbc0c8087a0200ec
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
git fetch --no-tags linux-next master
git checkout 1786d001262006df52cdcda4cbc0c8087a0200ec
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=powerpc64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
mm/userfaultfd.c: In function '__mcopy_atomic_hugetlb':
>> mm/userfaultfd.c:212:6: warning: variable 'vm_alloc_shared' set but not used [-Wunused-but-set-variable]
212 | int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED;
| ^~~~~~~~~~~~~~~
vim +/vm_alloc_shared +212 mm/userfaultfd.c
c1a4de99fada21 Andrea Arcangeli 2015-09-04 199
60d4d2d2b40e44 Mike Kravetz 2017-02-22 200 #ifdef CONFIG_HUGETLB_PAGE
60d4d2d2b40e44 Mike Kravetz 2017-02-22 201 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 202 * __mcopy_atomic processing for HUGETLB vmas. Note that this routine is
c1e8d7c6a7a682 Michel Lespinasse 2020-06-08 203 * called with mmap_lock held, it will release mmap_lock before returning.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 204 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 205 static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 206 struct vm_area_struct *dst_vma,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 207 unsigned long dst_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 208 unsigned long src_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 209 unsigned long len,
f619147104c8ea Axel Rasmussen 2021-05-04 210 enum mcopy_atomic_mode mode)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 211 {
1c9e8def43a345 Mike Kravetz 2017-02-22 @212 int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED;
1c9e8def43a345 Mike Kravetz 2017-02-22 213 int vm_shared = dst_vma->vm_flags & VM_SHARED;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 214 ssize_t err;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 215 pte_t *dst_pte;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 216 unsigned long src_addr, dst_addr;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 217 long copied;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 218 struct page *page;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 219 unsigned long vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 220 pgoff_t idx;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 221 u32 hash;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 222 struct address_space *mapping;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 223
60d4d2d2b40e44 Mike Kravetz 2017-02-22 224 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 225 * There is no default zero huge page for all huge page sizes as
60d4d2d2b40e44 Mike Kravetz 2017-02-22 226 * supported by hugetlb. A PMD_SIZE huge pages may exist as used
60d4d2d2b40e44 Mike Kravetz 2017-02-22 227 * by THP. Since we can not reliably insert a zero page, this
60d4d2d2b40e44 Mike Kravetz 2017-02-22 228 * feature is not supported.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 229 */
f619147104c8ea Axel Rasmussen 2021-05-04 230 if (mode == MCOPY_ATOMIC_ZEROPAGE) {
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 231 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 232 return -EINVAL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 233 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 234
60d4d2d2b40e44 Mike Kravetz 2017-02-22 235 src_addr = src_start;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 236 dst_addr = dst_start;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 237 copied = 0;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 238 page = NULL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 239 vma_hpagesize = vma_kernel_pagesize(dst_vma);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 240
60d4d2d2b40e44 Mike Kravetz 2017-02-22 241 /*
60d4d2d2b40e44 Mike Kravetz 2017-02-22 242 * Validate alignment based on huge page size
60d4d2d2b40e44 Mike Kravetz 2017-02-22 243 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 244 err = -EINVAL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 245 if (dst_start & (vma_hpagesize - 1) || len & (vma_hpagesize - 1))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 246 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 247
60d4d2d2b40e44 Mike Kravetz 2017-02-22 248 retry:
60d4d2d2b40e44 Mike Kravetz 2017-02-22 249 /*
c1e8d7c6a7a682 Michel Lespinasse 2020-06-08 250 * On routine entry dst_vma is set. If we had to drop mmap_lock and
60d4d2d2b40e44 Mike Kravetz 2017-02-22 251 * retry, dst_vma will be set to NULL and we must lookup again.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 252 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 253 if (!dst_vma) {
27d02568f529e9 Mike Rapoport 2017-02-24 254 err = -ENOENT;
643aa36eadebdc Wei Yang 2019-11-30 255 dst_vma = find_dst_vma(dst_mm, dst_start, len);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 256 if (!dst_vma || !is_vm_hugetlb_page(dst_vma))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 257 goto out_unlock;
1c9e8def43a345 Mike Kravetz 2017-02-22 258
27d02568f529e9 Mike Rapoport 2017-02-24 259 err = -EINVAL;
27d02568f529e9 Mike Rapoport 2017-02-24 260 if (vma_hpagesize != vma_kernel_pagesize(dst_vma))
27d02568f529e9 Mike Rapoport 2017-02-24 261 goto out_unlock;
27d02568f529e9 Mike Rapoport 2017-02-24 262
1c9e8def43a345 Mike Kravetz 2017-02-22 263 vm_shared = dst_vma->vm_flags & VM_SHARED;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 264 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 265
60d4d2d2b40e44 Mike Kravetz 2017-02-22 266 /*
1c9e8def43a345 Mike Kravetz 2017-02-22 267 * If not shared, ensure the dst_vma has a anon_vma.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 268 */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 269 err = -ENOMEM;
1c9e8def43a345 Mike Kravetz 2017-02-22 270 if (!vm_shared) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 271 if (unlikely(anon_vma_prepare(dst_vma)))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 272 goto out_unlock;
1c9e8def43a345 Mike Kravetz 2017-02-22 273 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 274
60d4d2d2b40e44 Mike Kravetz 2017-02-22 275 while (src_addr < src_start + len) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 276 BUG_ON(dst_addr >= dst_start + len);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 277
60d4d2d2b40e44 Mike Kravetz 2017-02-22 278 /*
c0d0381ade7988 Mike Kravetz 2020-04-01 279 * Serialize via i_mmap_rwsem and hugetlb_fault_mutex.
c0d0381ade7988 Mike Kravetz 2020-04-01 280 * i_mmap_rwsem ensures the dst_pte remains valid even
c0d0381ade7988 Mike Kravetz 2020-04-01 281 * in the case of shared pmds. fault mutex prevents
c0d0381ade7988 Mike Kravetz 2020-04-01 282 * races with other faulting threads.
60d4d2d2b40e44 Mike Kravetz 2017-02-22 283 */
ddeaab32a89f04 Mike Kravetz 2019-01-08 284 mapping = dst_vma->vm_file->f_mapping;
c0d0381ade7988 Mike Kravetz 2020-04-01 285 i_mmap_lock_read(mapping);
c0d0381ade7988 Mike Kravetz 2020-04-01 286 idx = linear_page_index(dst_vma, dst_addr);
188b04a7d93860 Wei Yang 2019-11-30 287 hash = hugetlb_fault_mutex_hash(mapping, idx);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 288 mutex_lock(&hugetlb_fault_mutex_table[hash]);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 289
60d4d2d2b40e44 Mike Kravetz 2017-02-22 290 err = -ENOMEM;
aec44e0f0213e3 Peter Xu 2021-05-04 291 dst_pte = huge_pte_alloc(dst_mm, dst_vma, dst_addr, vma_hpagesize);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 292 if (!dst_pte) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 293 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 294 i_mmap_unlock_read(mapping);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 295 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 296 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 297
f619147104c8ea Axel Rasmussen 2021-05-04 298 if (mode != MCOPY_ATOMIC_CONTINUE &&
f619147104c8ea Axel Rasmussen 2021-05-04 299 !huge_pte_none(huge_ptep_get(dst_pte))) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 300 err = -EEXIST;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 301 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 302 i_mmap_unlock_read(mapping);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 303 goto out_unlock;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 304 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 305
60d4d2d2b40e44 Mike Kravetz 2017-02-22 306 err = hugetlb_mcopy_atomic_pte(dst_mm, dst_pte, dst_vma,
f619147104c8ea Axel Rasmussen 2021-05-04 307 dst_addr, src_addr, mode, &page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 308
60d4d2d2b40e44 Mike Kravetz 2017-02-22 309 mutex_unlock(&hugetlb_fault_mutex_table[hash]);
c0d0381ade7988 Mike Kravetz 2020-04-01 310 i_mmap_unlock_read(mapping);
1c9e8def43a345 Mike Kravetz 2017-02-22 311 vm_alloc_shared = vm_shared;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 312
60d4d2d2b40e44 Mike Kravetz 2017-02-22 313 cond_resched();
60d4d2d2b40e44 Mike Kravetz 2017-02-22 314
9e368259ad9883 Andrea Arcangeli 2018-11-30 315 if (unlikely(err == -ENOENT)) {
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 316 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 317 BUG_ON(!page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 318
60d4d2d2b40e44 Mike Kravetz 2017-02-22 319 err = copy_huge_page_from_user(page,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 320 (const void __user *)src_addr,
4fb07ee6510280 Wei Yang 2019-11-30 321 vma_hpagesize / PAGE_SIZE,
4fb07ee6510280 Wei Yang 2019-11-30 322 true);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 323 if (unlikely(err)) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 324 err = -EFAULT;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 325 goto out;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 326 }
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 327 mmap_read_lock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 328
60d4d2d2b40e44 Mike Kravetz 2017-02-22 329 dst_vma = NULL;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 330 goto retry;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 331 } else
60d4d2d2b40e44 Mike Kravetz 2017-02-22 332 BUG_ON(page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 333
60d4d2d2b40e44 Mike Kravetz 2017-02-22 334 if (!err) {
60d4d2d2b40e44 Mike Kravetz 2017-02-22 335 dst_addr += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 336 src_addr += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 337 copied += vma_hpagesize;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 338
60d4d2d2b40e44 Mike Kravetz 2017-02-22 339 if (fatal_signal_pending(current))
60d4d2d2b40e44 Mike Kravetz 2017-02-22 340 err = -EINTR;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 341 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 342 if (err)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 343 break;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 344 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 345
60d4d2d2b40e44 Mike Kravetz 2017-02-22 346 out_unlock:
d8ed45c5dcd455 Michel Lespinasse 2020-06-08 347 mmap_read_unlock(dst_mm);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 348 out:
1786d001262006 Mina Almasry 2021-06-01 349 if (page)
60d4d2d2b40e44 Mike Kravetz 2017-02-22 350 put_page(page);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 351 BUG_ON(copied < 0);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 352 BUG_ON(err > 0);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 353 BUG_ON(!copied && !err);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 354 return copied ? copied : err;
60d4d2d2b40e44 Mike Kravetz 2017-02-22 355 }
60d4d2d2b40e44 Mike Kravetz 2017-02-22 356 #else /* !CONFIG_HUGETLB_PAGE */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 357 /* fail at build time if gcc attempts to use this */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 358 extern ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 359 struct vm_area_struct *dst_vma,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 360 unsigned long dst_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 361 unsigned long src_start,
60d4d2d2b40e44 Mike Kravetz 2017-02-22 362 unsigned long len,
f619147104c8ea Axel Rasmussen 2021-05-04 363 enum mcopy_atomic_mode mode);
60d4d2d2b40e44 Mike Kravetz 2017-02-22 364 #endif /* CONFIG_HUGETLB_PAGE */
60d4d2d2b40e44 Mike Kravetz 2017-02-22 365
:::::: The code at line 212 was first introduced by commit
:::::: 1c9e8def43a3452e7af658b340f5f4f4ecde5c38 userfaultfd: hugetlbfs: add UFFDIO_COPY support for shared mappings
:::::: TO: Mike Kravetz <mike.kravetz@oracle.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 39093 bytes --]
next reply other threads:[~2021-06-01 12:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-01 12:10 kernel test robot [this message]
2021-06-01 12:10 ` [linux-next:master 5756/5946] mm/userfaultfd.c:212:6: warning: variable 'vm_alloc_shared' set but not used kernel test robot
2021-06-02 8:18 ` Souptick Joarder
2021-06-02 8:18 ` Souptick Joarder
2021-06-03 8:44 ` Rong Chen
2021-06-03 8:44 ` [kbuild-all] " Rong Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202106012056.ufRLDFck-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.