CC: [email protected]
CC: [email protected]
CC: [email protected]
TO: Jakub Jelinek <[email protected]>
CC: "Peter Zijlstra (Intel)" <[email protected]>
CC: Andrew Morton <[email protected]>
CC: Linux Memory Management List <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   66f4beaa6c1d28161f534471484b2daa2de1dce0
commit: 2f78788b55baa3410b1ec91a576286abe1ad4d6a ilog2: improve ilog2 for 
constant arguments
date:   11 months ago
:::::: branch date: 17 hours ago
:::::: commit date: 11 months ago
config: riscv-randconfig-c006-20211003 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
962e503cc8bc411f7523cc393acae8aae425b1c4)
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
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2f78788b55baa3410b1ec91a576286abe1ad4d6a
        git remote add linus 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout 2f78788b55baa3410b1ec91a576286abe1ad4d6a
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv 
clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


clang-analyzer warnings: (new ones prefixed by >>)
   #define ASSERTCMP(X, OP, Y)                                             \
                                                                           ^
   fs/fscache/operation.c:597:7: note: Assuming field 'n_ops' is not equal to 0
                   if (object->n_ops == 0)
                       ^~~~~~~~~~~~~~~~~~
   fs/fscache/operation.c:597:3: note: Taking false branch
                   if (object->n_ops == 0)
                   ^
   fs/fscache/operation.c:601:3: note: Memory is released
                   kfree(op);
                   ^~~~~~~~~
   fs/fscache/operation.c:571:2: note: Loop condition is true. Execution 
continues on line 572
           do {
           ^
   fs/fscache/operation.c:573:7: note: Assuming the condition is false
                   if (list_empty(&cache->op_gc_list)) {
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/fscache/operation.c:573:3: note: Taking false branch
                   if (list_empty(&cache->op_gc_list)) {
                   ^
   fs/fscache/operation.c:578:8: note: Left side of '&&' is false
                   op = list_entry(cache->op_gc_list.next,
                        ^
   include/linux/list.h:511:2: note: expanded from macro 'list_entry'
           container_of(ptr, type, member)
           ^
   include/linux/kernel.h:694:61: note: expanded from macro 'container_of'
           BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
                                                                      ^
   fs/fscache/operation.c:578:8: note: Taking false branch
                   op = list_entry(cache->op_gc_list.next,
                        ^
   include/linux/list.h:511:2: note: expanded from macro 'list_entry'
           container_of(ptr, type, member)
           ^
   include/linux/kernel.h:694:2: note: expanded from macro 'container_of'
           BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
           ^
   include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
   #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                       ^
   include/linux/compiler_types.h:315:2: note: expanded from macro 
'compiletime_assert'
           _compiletime_assert(condition, msg, __compiletime_assert_, 
__COUNTER__)
           ^
   include/linux/compiler_types.h:303:2: note: expanded from macro 
'_compiletime_assert'
           __compiletime_assert(condition, msg, prefix, suffix)
           ^
   include/linux/compiler_types.h:295:3: note: expanded from macro 
'__compiletime_assert'
                   if (!(condition))                                       \
                   ^
   fs/fscache/operation.c:578:8: note: Loop condition is false.  Exiting loop
                   op = list_entry(cache->op_gc_list.next,
                        ^
   include/linux/list.h:511:2: note: expanded from macro 'list_entry'
           container_of(ptr, type, member)
           ^
   include/linux/kernel.h:694:2: note: expanded from macro 'container_of'
           BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
           ^
   include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
   #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                       ^
   include/linux/compiler_types.h:315:2: note: expanded from macro 
'compiletime_assert'
           _compiletime_assert(condition, msg, __compiletime_assert_, 
__COUNTER__)
           ^
   include/linux/compiler_types.h:303:2: note: expanded from macro 
'_compiletime_assert'
           __compiletime_assert(condition, msg, prefix, suffix)
           ^
   include/linux/compiler_types.h:293:2: note: expanded from macro 
'__compiletime_assert'
           do {                                                            \
           ^
   fs/fscache/operation.c:580:3: note: Calling 'list_del'
                   list_del(&op->pend_link);
                   ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/list.h:146:2: note: Calling '__list_del_entry'
           __list_del_entry(entry);
           ^~~~~~~~~~~~~~~~~~~~~~~
   include/linux/list.h:132:2: note: Taking false branch
           if (!__list_del_entry_valid(entry))
           ^
   include/linux/list.h:135:13: note: Use of memory after it is freed
           __list_del(entry->prev, entry->next);
                      ^~~~~~~~~~~
   Suppressed 10 warnings (2 in non-user code, 8 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   47 warnings generated.
   mm/nommu.c:423:2: warning: Value stored to 'ret' is never read 
[clang-analyzer-deadcode.DeadStores]
           ret = percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL);
           ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/nommu.c:423:2: note: Value stored to 'ret' is never read
           ret = percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL);
           ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/nommu.c:881:6: warning: Value stored to 'prot' is never read 
[clang-analyzer-deadcode.DeadStores]
                                           prot |= PROT_EXEC;
                                           ^
   mm/nommu.c:881:6: note: Value stored to 'prot' is never read
   mm/nommu.c:899:4: warning: Value stored to 'prot' is never read 
[clang-analyzer-deadcode.DeadStores]
                           prot |= PROT_EXEC;
                           ^
   mm/nommu.c:899:4: note: Value stored to 'prot' is never read
>> mm/nommu.c:1010:12: warning: The result of the left shift is undefined due 
>> to shifting by '32', which is greater or equal to the width of type 'int' 
>> [clang-analyzer-core.UndefinedBinaryOperatorResult]
           total = 1 << order;
                     ^
   mm/nommu.c:1091:6: note: 'ret' is >= 0
           if (ret < 0)
               ^~~
   mm/nommu.c:1091:2: note: Taking false branch
           if (ret < 0)
           ^
   mm/nommu.c:1104:6: note: Assuming 'region' is non-null
           if (!region)
               ^~~~~~~
   mm/nommu.c:1104:2: note: Taking false branch
           if (!region)
           ^
   mm/nommu.c:1108:6: note: Assuming 'vma' is non-null
           if (!vma)
               ^~~~
   mm/nommu.c:1108:2: note: Taking false branch
           if (!vma)
           ^
   mm/nommu.c:1118:6: note: 'file' is null
           if (file) {
               ^~~~
   mm/nommu.c:1118:2: note: Taking false branch
           if (file) {
           ^
   mm/nommu.c:1133:6: note: Assuming the condition is false
           if (vm_flags & VM_MAYSHARE) {
               ^~~~~~~~~~~~~~~~~~~~~~
   mm/nommu.c:1133:2: note: Taking false branch
           if (vm_flags & VM_MAYSHARE) {
           ^
   mm/nommu.c:1230:6: note: 'file' is null
           if (file && vma->vm_flags & VM_SHARED)
               ^~~~
   mm/nommu.c:1230:11: note: Left side of '&&' is false
           if (file && vma->vm_flags & VM_SHARED)
                    ^
   mm/nommu.c:1233:9: note: Calling 'do_mmap_private'
                   ret = do_mmap_private(vma, region, len, capabilities);
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/nommu.c:988:2: note: Taking false branch
           if (capabilities & NOMMU_MAP_DIRECT) {
           ^
   mm/nommu.c:1009:10: note: Calling 'get_order'
           order = get_order(len);
                   ^~~~~~~~~~~~~~
   include/asm-generic/getorder.h:31:2: note: Taking false branch
           if (__builtin_constant_p(size)) {
           ^
   include/asm-generic/getorder.h:46:9: note: Calling 'fls64'
           return fls64(size);
                  ^~~~~~~~~~~
   include/asm-generic/bitops/fls64.h:29:6: note: Assuming 'x' is not equal to 0
           if (x == 0)
               ^~~~~~
   include/asm-generic/bitops/fls64.h:29:2: note: Taking false branch
           if (x == 0)
           ^
   include/asm-generic/bitops/fls64.h:31:2: note: Returning the value 32
           return __fls(x) + 1;
           ^~~~~~~~~~~~~~~~~~~
   include/asm-generic/getorder.h:46:9: note: Returning from 'fls64'
           return fls64(size);
                  ^~~~~~~~~~~
   include/asm-generic/getorder.h:46:2: note: Returning the value 32
           return fls64(size);
           ^~~~~~~~~~~~~~~~~~
   mm/nommu.c:1009:10: note: Returning from 'get_order'
           order = get_order(len);
                   ^~~~~~~~~~~~~~
   mm/nommu.c:1009:2: note: The value 32 is assigned to 'order'
           order = get_order(len);
           ^~~~~~~~~~~~~~~~~~~~~~
   mm/nommu.c:1010:12: note: The result of the left shift is undefined due to 
shifting by '32', which is greater or equal to the width of type 'int'
           total = 1 << order;
                     ^  ~~~~~
   mm/nommu.c:1010:12: warning: The result of the left shift is undefined due 
to shifting by '33', which is greater or equal to the width of type 'int' 
[clang-analyzer-core.UndefinedBinaryOperatorResult]
           total = 1 << order;
                     ^
   mm/nommu.c:1091:6: note: 'ret' is >= 0
           if (ret < 0)
               ^~~
   mm/nommu.c:1091:2: note: Taking false branch
           if (ret < 0)
           ^
   mm/nommu.c:1104:6: note: Assuming 'region' is non-null
           if (!region)
               ^~~~~~~
   mm/nommu.c:1104:2: note: Taking false branch
           if (!region)
           ^
   mm/nommu.c:1108:6: note: Assuming 'vma' is non-null
           if (!vma)
               ^~~~
   mm/nommu.c:1108:2: note: Taking false branch
           if (!vma)
           ^
   mm/nommu.c:1118:6: note: 'file' is null
           if (file) {

vim +1010 mm/nommu.c

^1da177e4c3f41 Linus Torvalds     2005-04-16   750  
^1da177e4c3f41 Linus Torvalds     2005-04-16   751  /*
^1da177e4c3f41 Linus Torvalds     2005-04-16   752   * determine whether a 
mapping should be permitted and, if so, what sort of
^1da177e4c3f41 Linus Torvalds     2005-04-16   753   * mapping we're capable of 
supporting
^1da177e4c3f41 Linus Torvalds     2005-04-16   754   */
^1da177e4c3f41 Linus Torvalds     2005-04-16   755  static int 
validate_mmap_request(struct file *file,
^1da177e4c3f41 Linus Torvalds     2005-04-16   756                              
 unsigned long addr,
^1da177e4c3f41 Linus Torvalds     2005-04-16   757                              
 unsigned long len,
^1da177e4c3f41 Linus Torvalds     2005-04-16   758                              
 unsigned long prot,
^1da177e4c3f41 Linus Torvalds     2005-04-16   759                              
 unsigned long flags,
^1da177e4c3f41 Linus Torvalds     2005-04-16   760                              
 unsigned long pgoff,
^1da177e4c3f41 Linus Torvalds     2005-04-16   761                              
 unsigned long *_capabilities)
^1da177e4c3f41 Linus Torvalds     2005-04-16   762  {
8feae13110d60c David Howells      2009-01-08   763      unsigned long 
capabilities, rlen;
^1da177e4c3f41 Linus Torvalds     2005-04-16   764      int ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16   765  
^1da177e4c3f41 Linus Torvalds     2005-04-16   766      /* do the simple checks 
first */
22cc877b32202b Leon Romanovsky    2015-06-24   767      if (flags & MAP_FIXED)
^1da177e4c3f41 Linus Torvalds     2005-04-16   768              return -EINVAL;
^1da177e4c3f41 Linus Torvalds     2005-04-16   769  
^1da177e4c3f41 Linus Torvalds     2005-04-16   770      if ((flags & MAP_TYPE) 
!= MAP_PRIVATE &&
^1da177e4c3f41 Linus Torvalds     2005-04-16   771          (flags & MAP_TYPE) 
!= MAP_SHARED)
^1da177e4c3f41 Linus Torvalds     2005-04-16   772              return -EINVAL;
^1da177e4c3f41 Linus Torvalds     2005-04-16   773  
f81cff0d4067e4 Mike Frysinger     2006-12-06   774      if (!len)
^1da177e4c3f41 Linus Torvalds     2005-04-16   775              return -EINVAL;
^1da177e4c3f41 Linus Torvalds     2005-04-16   776  
f81cff0d4067e4 Mike Frysinger     2006-12-06   777      /* Careful about 
overflows.. */
8feae13110d60c David Howells      2009-01-08   778      rlen = PAGE_ALIGN(len);
8feae13110d60c David Howells      2009-01-08   779      if (!rlen || rlen > 
TASK_SIZE)
f81cff0d4067e4 Mike Frysinger     2006-12-06   780              return -ENOMEM;
f81cff0d4067e4 Mike Frysinger     2006-12-06   781  
^1da177e4c3f41 Linus Torvalds     2005-04-16   782      /* offset overflow? */
8feae13110d60c David Howells      2009-01-08   783      if ((pgoff + (rlen >> 
PAGE_SHIFT)) < pgoff)
f81cff0d4067e4 Mike Frysinger     2006-12-06   784              return 
-EOVERFLOW;
^1da177e4c3f41 Linus Torvalds     2005-04-16   785  
^1da177e4c3f41 Linus Torvalds     2005-04-16   786      if (file) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   787              /* files must 
support mmap */
72c2d531920048 Al Viro            2013-09-22   788              if 
(!file->f_op->mmap)
^1da177e4c3f41 Linus Torvalds     2005-04-16   789                      return 
-ENODEV;
^1da177e4c3f41 Linus Torvalds     2005-04-16   790  
^1da177e4c3f41 Linus Torvalds     2005-04-16   791              /* work out if 
what we've got could possibly be shared
^1da177e4c3f41 Linus Torvalds     2005-04-16   792               * - we support 
chardevs that provide their own "memory"
^1da177e4c3f41 Linus Torvalds     2005-04-16   793               * - we support 
files/blockdevs that are memory backed
^1da177e4c3f41 Linus Torvalds     2005-04-16   794               */
b4caecd48005fb Christoph Hellwig  2015-01-14   795              if 
(file->f_op->mmap_capabilities) {
b4caecd48005fb Christoph Hellwig  2015-01-14   796                      
capabilities = file->f_op->mmap_capabilities(file);
b4caecd48005fb Christoph Hellwig  2015-01-14   797              } else {
^1da177e4c3f41 Linus Torvalds     2005-04-16   798                      /* no 
explicit capabilities set, so assume some
^1da177e4c3f41 Linus Torvalds     2005-04-16   799                       * 
defaults */
496ad9aa8ef448 Al Viro            2013-01-23   800                      switch 
(file_inode(file)->i_mode & S_IFMT) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   801                      case 
S_IFREG:
^1da177e4c3f41 Linus Torvalds     2005-04-16   802                      case 
S_IFBLK:
b4caecd48005fb Christoph Hellwig  2015-01-14   803                              
capabilities = NOMMU_MAP_COPY;
^1da177e4c3f41 Linus Torvalds     2005-04-16   804                              
break;
^1da177e4c3f41 Linus Torvalds     2005-04-16   805  
^1da177e4c3f41 Linus Torvalds     2005-04-16   806                      case 
S_IFCHR:
^1da177e4c3f41 Linus Torvalds     2005-04-16   807                              
capabilities =
b4caecd48005fb Christoph Hellwig  2015-01-14   808                              
        NOMMU_MAP_DIRECT |
b4caecd48005fb Christoph Hellwig  2015-01-14   809                              
        NOMMU_MAP_READ |
b4caecd48005fb Christoph Hellwig  2015-01-14   810                              
        NOMMU_MAP_WRITE;
^1da177e4c3f41 Linus Torvalds     2005-04-16   811                              
break;
^1da177e4c3f41 Linus Torvalds     2005-04-16   812  
^1da177e4c3f41 Linus Torvalds     2005-04-16   813                      default:
^1da177e4c3f41 Linus Torvalds     2005-04-16   814                              
return -EINVAL;
^1da177e4c3f41 Linus Torvalds     2005-04-16   815                      }
^1da177e4c3f41 Linus Torvalds     2005-04-16   816              }
^1da177e4c3f41 Linus Torvalds     2005-04-16   817  
^1da177e4c3f41 Linus Torvalds     2005-04-16   818              /* eliminate 
any capabilities that we can't support on this
^1da177e4c3f41 Linus Torvalds     2005-04-16   819               * device */
^1da177e4c3f41 Linus Torvalds     2005-04-16   820              if 
(!file->f_op->get_unmapped_area)
b4caecd48005fb Christoph Hellwig  2015-01-14   821                      
capabilities &= ~NOMMU_MAP_DIRECT;
6e242a1ceeb1bc Al Viro            2015-03-31   822              if 
(!(file->f_mode & FMODE_CAN_READ))
b4caecd48005fb Christoph Hellwig  2015-01-14   823                      
capabilities &= ~NOMMU_MAP_COPY;
^1da177e4c3f41 Linus Torvalds     2005-04-16   824  
28d7a6ae92c099 Graff Yang         2009-08-18   825              /* The file 
shall have been opened with read permission. */
28d7a6ae92c099 Graff Yang         2009-08-18   826              if 
(!(file->f_mode & FMODE_READ))
28d7a6ae92c099 Graff Yang         2009-08-18   827                      return 
-EACCES;
28d7a6ae92c099 Graff Yang         2009-08-18   828  
^1da177e4c3f41 Linus Torvalds     2005-04-16   829              if (flags & 
MAP_SHARED) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   830                      /* do 
checks for writing, appending and locking */
^1da177e4c3f41 Linus Torvalds     2005-04-16   831                      if 
((prot & PROT_WRITE) &&
^1da177e4c3f41 Linus Torvalds     2005-04-16   832                          
!(file->f_mode & FMODE_WRITE))
^1da177e4c3f41 Linus Torvalds     2005-04-16   833                              
return -EACCES;
^1da177e4c3f41 Linus Torvalds     2005-04-16   834  
496ad9aa8ef448 Al Viro            2013-01-23   835                      if 
(IS_APPEND(file_inode(file)) &&
^1da177e4c3f41 Linus Torvalds     2005-04-16   836                          
(file->f_mode & FMODE_WRITE))
^1da177e4c3f41 Linus Torvalds     2005-04-16   837                              
return -EACCES;
^1da177e4c3f41 Linus Torvalds     2005-04-16   838  
d7a06983a01a33 Jeff Layton        2014-03-10   839                      if 
(locks_verify_locked(file))
^1da177e4c3f41 Linus Torvalds     2005-04-16   840                              
return -EAGAIN;
^1da177e4c3f41 Linus Torvalds     2005-04-16   841  
b4caecd48005fb Christoph Hellwig  2015-01-14   842                      if 
(!(capabilities & NOMMU_MAP_DIRECT))
^1da177e4c3f41 Linus Torvalds     2005-04-16   843                              
return -ENODEV;
^1da177e4c3f41 Linus Torvalds     2005-04-16   844  
^1da177e4c3f41 Linus Torvalds     2005-04-16   845                      /* we 
mustn't privatise shared mappings */
b4caecd48005fb Christoph Hellwig  2015-01-14   846                      
capabilities &= ~NOMMU_MAP_COPY;
ac7149045d9fcc Choi Gi-yong       2014-04-07   847              } else {
^1da177e4c3f41 Linus Torvalds     2005-04-16   848                      /* 
we're going to read the file into private memory we
^1da177e4c3f41 Linus Torvalds     2005-04-16   849                       * 
allocate */
b4caecd48005fb Christoph Hellwig  2015-01-14   850                      if 
(!(capabilities & NOMMU_MAP_COPY))
^1da177e4c3f41 Linus Torvalds     2005-04-16   851                              
return -ENODEV;
^1da177e4c3f41 Linus Torvalds     2005-04-16   852  
^1da177e4c3f41 Linus Torvalds     2005-04-16   853                      /* we 
don't permit a private writable mapping to be
^1da177e4c3f41 Linus Torvalds     2005-04-16   854                       * 
shared with the backing device */
^1da177e4c3f41 Linus Torvalds     2005-04-16   855                      if 
(prot & PROT_WRITE)
b4caecd48005fb Christoph Hellwig  2015-01-14   856                              
capabilities &= ~NOMMU_MAP_DIRECT;
^1da177e4c3f41 Linus Torvalds     2005-04-16   857              }
^1da177e4c3f41 Linus Torvalds     2005-04-16   858  
b4caecd48005fb Christoph Hellwig  2015-01-14   859              if 
(capabilities & NOMMU_MAP_DIRECT) {
b4caecd48005fb Christoph Hellwig  2015-01-14   860                      if 
(((prot & PROT_READ)  && !(capabilities & NOMMU_MAP_READ))  ||
b4caecd48005fb Christoph Hellwig  2015-01-14   861                          
((prot & PROT_WRITE) && !(capabilities & NOMMU_MAP_WRITE)) ||
b4caecd48005fb Christoph Hellwig  2015-01-14   862                          
((prot & PROT_EXEC)  && !(capabilities & NOMMU_MAP_EXEC))
3c7b204547bc3d Bernd Schmidt      2010-05-25   863                          ) {
b4caecd48005fb Christoph Hellwig  2015-01-14   864                              
capabilities &= ~NOMMU_MAP_DIRECT;
3c7b204547bc3d Bernd Schmidt      2010-05-25   865                              
if (flags & MAP_SHARED) {
22cc877b32202b Leon Romanovsky    2015-06-24   866                              
        pr_warn("MAP_SHARED not completely supported on !MMU\n");
3c7b204547bc3d Bernd Schmidt      2010-05-25   867                              
        return -EINVAL;
3c7b204547bc3d Bernd Schmidt      2010-05-25   868                              
}
3c7b204547bc3d Bernd Schmidt      2010-05-25   869                      }
3c7b204547bc3d Bernd Schmidt      2010-05-25   870              }
3c7b204547bc3d Bernd Schmidt      2010-05-25   871  
^1da177e4c3f41 Linus Torvalds     2005-04-16   872              /* handle 
executable mappings and implied executable
^1da177e4c3f41 Linus Torvalds     2005-04-16   873               * mappings */
90f8572b0f021f Eric W. Biederman  2015-06-29   874              if 
(path_noexec(&file->f_path)) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   875                      if 
(prot & PROT_EXEC)
^1da177e4c3f41 Linus Torvalds     2005-04-16   876                              
return -EPERM;
ac7149045d9fcc Choi Gi-yong       2014-04-07   877              } else if 
((prot & PROT_READ) && !(prot & PROT_EXEC)) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   878                      /* 
handle implication of PROT_EXEC by PROT_READ */
^1da177e4c3f41 Linus Torvalds     2005-04-16   879                      if 
(current->personality & READ_IMPLIES_EXEC) {
b4caecd48005fb Christoph Hellwig  2015-01-14   880                              
if (capabilities & NOMMU_MAP_EXEC)
^1da177e4c3f41 Linus Torvalds     2005-04-16  @881                              
        prot |= PROT_EXEC;
^1da177e4c3f41 Linus Torvalds     2005-04-16   882                      }
ac7149045d9fcc Choi Gi-yong       2014-04-07   883              } else if 
((prot & PROT_READ) &&
^1da177e4c3f41 Linus Torvalds     2005-04-16   884                       (prot 
& PROT_EXEC) &&
b4caecd48005fb Christoph Hellwig  2015-01-14   885                       
!(capabilities & NOMMU_MAP_EXEC)
^1da177e4c3f41 Linus Torvalds     2005-04-16   886                       ) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   887                      /* 
backing file is not executable, try to copy */
b4caecd48005fb Christoph Hellwig  2015-01-14   888                      
capabilities &= ~NOMMU_MAP_DIRECT;
^1da177e4c3f41 Linus Torvalds     2005-04-16   889              }
ac7149045d9fcc Choi Gi-yong       2014-04-07   890      } else {
^1da177e4c3f41 Linus Torvalds     2005-04-16   891              /* anonymous 
mappings are always memory backed and can be
^1da177e4c3f41 Linus Torvalds     2005-04-16   892               * privately 
mapped
^1da177e4c3f41 Linus Torvalds     2005-04-16   893               */
b4caecd48005fb Christoph Hellwig  2015-01-14   894              capabilities = 
NOMMU_MAP_COPY;
^1da177e4c3f41 Linus Torvalds     2005-04-16   895  
^1da177e4c3f41 Linus Torvalds     2005-04-16   896              /* handle 
PROT_EXEC implication by PROT_READ */
^1da177e4c3f41 Linus Torvalds     2005-04-16   897              if ((prot & 
PROT_READ) &&
^1da177e4c3f41 Linus Torvalds     2005-04-16   898                  
(current->personality & READ_IMPLIES_EXEC))
^1da177e4c3f41 Linus Torvalds     2005-04-16   899                      prot |= 
PROT_EXEC;
^1da177e4c3f41 Linus Torvalds     2005-04-16   900      }
^1da177e4c3f41 Linus Torvalds     2005-04-16   901  
^1da177e4c3f41 Linus Torvalds     2005-04-16   902      /* allow the security 
API to have its say */
e5467859f7f79b Al Viro            2012-05-30   903      ret = 
security_mmap_addr(addr);
^1da177e4c3f41 Linus Torvalds     2005-04-16   904      if (ret < 0)
^1da177e4c3f41 Linus Torvalds     2005-04-16   905              return ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16   906  
^1da177e4c3f41 Linus Torvalds     2005-04-16   907      /* looks okay */
^1da177e4c3f41 Linus Torvalds     2005-04-16   908      *_capabilities = 
capabilities;
^1da177e4c3f41 Linus Torvalds     2005-04-16   909      return 0;
^1da177e4c3f41 Linus Torvalds     2005-04-16   910  }
^1da177e4c3f41 Linus Torvalds     2005-04-16   911  
^1da177e4c3f41 Linus Torvalds     2005-04-16   912  /*
^1da177e4c3f41 Linus Torvalds     2005-04-16   913   * we've determined that we 
can make the mapping, now translate what we
^1da177e4c3f41 Linus Torvalds     2005-04-16   914   * now know into VMA flags
^1da177e4c3f41 Linus Torvalds     2005-04-16   915   */
^1da177e4c3f41 Linus Torvalds     2005-04-16   916  static unsigned long 
determine_vm_flags(struct file *file,
^1da177e4c3f41 Linus Torvalds     2005-04-16   917                              
        unsigned long prot,
^1da177e4c3f41 Linus Torvalds     2005-04-16   918                              
        unsigned long flags,
^1da177e4c3f41 Linus Torvalds     2005-04-16   919                              
        unsigned long capabilities)
^1da177e4c3f41 Linus Torvalds     2005-04-16   920  {
^1da177e4c3f41 Linus Torvalds     2005-04-16   921      unsigned long vm_flags;
^1da177e4c3f41 Linus Torvalds     2005-04-16   922  
e6bfb70959a0ca Dave Hansen        2016-02-12   923      vm_flags = 
calc_vm_prot_bits(prot, 0) | calc_vm_flag_bits(flags);
^1da177e4c3f41 Linus Torvalds     2005-04-16   924      /* vm_flags |= 
mm->def_flags; */
^1da177e4c3f41 Linus Torvalds     2005-04-16   925  
b4caecd48005fb Christoph Hellwig  2015-01-14   926      if (!(capabilities & 
NOMMU_MAP_DIRECT)) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   927              /* attempt to 
share read-only copies of mapped file chunks */
3c7b204547bc3d Bernd Schmidt      2010-05-25   928              vm_flags |= 
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
^1da177e4c3f41 Linus Torvalds     2005-04-16   929              if (file && 
!(prot & PROT_WRITE))
^1da177e4c3f41 Linus Torvalds     2005-04-16   930                      
vm_flags |= VM_MAYSHARE;
3c7b204547bc3d Bernd Schmidt      2010-05-25   931      } else {
^1da177e4c3f41 Linus Torvalds     2005-04-16   932              /* overlay a 
shareable mapping on the backing device or inode
^1da177e4c3f41 Linus Torvalds     2005-04-16   933               * if possible 
- used for chardevs, ramfs/tmpfs/shmfs and
^1da177e4c3f41 Linus Torvalds     2005-04-16   934               * romfs/cramfs 
*/
b4caecd48005fb Christoph Hellwig  2015-01-14   935              vm_flags |= 
VM_MAYSHARE | (capabilities & NOMMU_VMFLAGS);
^1da177e4c3f41 Linus Torvalds     2005-04-16   936              if (flags & 
MAP_SHARED)
3c7b204547bc3d Bernd Schmidt      2010-05-25   937                      
vm_flags |= VM_SHARED;
^1da177e4c3f41 Linus Torvalds     2005-04-16   938      }
^1da177e4c3f41 Linus Torvalds     2005-04-16   939  
^1da177e4c3f41 Linus Torvalds     2005-04-16   940      /* refuse to let anyone 
share private mappings with this process if
^1da177e4c3f41 Linus Torvalds     2005-04-16   941       * it's being traced - 
otherwise breakpoints set in it may interfere
^1da177e4c3f41 Linus Torvalds     2005-04-16   942       * with another 
untraced process
^1da177e4c3f41 Linus Torvalds     2005-04-16   943       */
a288eecce5253c Tejun Heo          2011-06-17   944      if ((flags & 
MAP_PRIVATE) && current->ptrace)
^1da177e4c3f41 Linus Torvalds     2005-04-16   945              vm_flags &= 
~VM_MAYSHARE;
^1da177e4c3f41 Linus Torvalds     2005-04-16   946  
^1da177e4c3f41 Linus Torvalds     2005-04-16   947      return vm_flags;
^1da177e4c3f41 Linus Torvalds     2005-04-16   948  }
^1da177e4c3f41 Linus Torvalds     2005-04-16   949  
^1da177e4c3f41 Linus Torvalds     2005-04-16   950  /*
8feae13110d60c David Howells      2009-01-08   951   * set up a shared mapping 
on a file (the driver or filesystem provides and
8feae13110d60c David Howells      2009-01-08   952   * pins the storage)
^1da177e4c3f41 Linus Torvalds     2005-04-16   953   */
8feae13110d60c David Howells      2009-01-08   954  static int 
do_mmap_shared_file(struct vm_area_struct *vma)
^1da177e4c3f41 Linus Torvalds     2005-04-16   955  {
^1da177e4c3f41 Linus Torvalds     2005-04-16   956      int ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16   957  
f74ac01520c9f6 Miklos Szeredi     2017-02-20   958      ret = 
call_mmap(vma->vm_file, vma);
dd8632a12e500a Paul Mundt         2009-01-08   959      if (ret == 0) {
dd8632a12e500a Paul Mundt         2009-01-08   960              
vma->vm_region->vm_top = vma->vm_region->vm_end;
645d83c5db970a David Howells      2009-09-24   961              return 0;
dd8632a12e500a Paul Mundt         2009-01-08   962      }
^1da177e4c3f41 Linus Torvalds     2005-04-16   963      if (ret != -ENOSYS)
^1da177e4c3f41 Linus Torvalds     2005-04-16   964              return ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16   965  
3fa30460ea5021 David Howells      2010-03-23   966      /* getting -ENOSYS 
indicates that direct mmap isn't possible (as
3fa30460ea5021 David Howells      2010-03-23   967       * opposed to tried but 
failed) so we can only give a suitable error as
3fa30460ea5021 David Howells      2010-03-23   968       * it's not possible to 
make a private copy if MAP_SHARED was given */
^1da177e4c3f41 Linus Torvalds     2005-04-16   969      return -ENODEV;
^1da177e4c3f41 Linus Torvalds     2005-04-16   970  }
^1da177e4c3f41 Linus Torvalds     2005-04-16   971  
^1da177e4c3f41 Linus Torvalds     2005-04-16   972  /*
^1da177e4c3f41 Linus Torvalds     2005-04-16   973   * set up a private mapping 
or an anonymous shared mapping
^1da177e4c3f41 Linus Torvalds     2005-04-16   974   */
8feae13110d60c David Howells      2009-01-08   975  static int 
do_mmap_private(struct vm_area_struct *vma,
8feae13110d60c David Howells      2009-01-08   976                         
struct vm_region *region,
645d83c5db970a David Howells      2009-09-24   977                         
unsigned long len,
645d83c5db970a David Howells      2009-09-24   978                         
unsigned long capabilities)
^1da177e4c3f41 Linus Torvalds     2005-04-16   979  {
dbc8358c72373d Joonsoo Kim        2014-12-12   980      unsigned long total, 
point;
^1da177e4c3f41 Linus Torvalds     2005-04-16   981      void *base;
8feae13110d60c David Howells      2009-01-08   982      int ret, order;
^1da177e4c3f41 Linus Torvalds     2005-04-16   983  
^1da177e4c3f41 Linus Torvalds     2005-04-16   984      /* invoke the file's 
mapping function so that it can keep track of
^1da177e4c3f41 Linus Torvalds     2005-04-16   985       * shared mappings on 
devices or memory
^1da177e4c3f41 Linus Torvalds     2005-04-16   986       * - VM_MAYSHARE will 
be set if it may attempt to share
^1da177e4c3f41 Linus Torvalds     2005-04-16   987       */
b4caecd48005fb Christoph Hellwig  2015-01-14   988      if (capabilities & 
NOMMU_MAP_DIRECT) {
f74ac01520c9f6 Miklos Szeredi     2017-02-20   989              ret = 
call_mmap(vma->vm_file, vma);
dd8632a12e500a Paul Mundt         2009-01-08   990              if (ret == 0) {
^1da177e4c3f41 Linus Torvalds     2005-04-16   991                      /* 
shouldn't return success if we're not sharing */
dd8632a12e500a Paul Mundt         2009-01-08   992                      
BUG_ON(!(vma->vm_flags & VM_MAYSHARE));
dd8632a12e500a Paul Mundt         2009-01-08   993                      
vma->vm_region->vm_top = vma->vm_region->vm_end;
645d83c5db970a David Howells      2009-09-24   994                      return 
0;
^1da177e4c3f41 Linus Torvalds     2005-04-16   995              }
dd8632a12e500a Paul Mundt         2009-01-08   996              if (ret != 
-ENOSYS)
dd8632a12e500a Paul Mundt         2009-01-08   997                      return 
ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16   998  
^1da177e4c3f41 Linus Torvalds     2005-04-16   999              /* getting an 
ENOSYS error indicates that direct mmap isn't
^1da177e4c3f41 Linus Torvalds     2005-04-16  1000               * possible (as 
opposed to tried but failed) so we'll try to
^1da177e4c3f41 Linus Torvalds     2005-04-16  1001               * make a 
private copy of the data and map that instead */
^1da177e4c3f41 Linus Torvalds     2005-04-16  1002      }
^1da177e4c3f41 Linus Torvalds     2005-04-16  1003  
8feae13110d60c David Howells      2009-01-08  1004  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1005      /* allocate some memory 
to hold the mapping
^1da177e4c3f41 Linus Torvalds     2005-04-16  1006       * - note that this may 
not return a page-aligned address if the object
^1da177e4c3f41 Linus Torvalds     2005-04-16  1007       *   we're allocating 
is smaller than a page
^1da177e4c3f41 Linus Torvalds     2005-04-16  1008       */
f67d9b1576c1c6 Bob Liu            2011-05-24  1009      order = get_order(len);
8feae13110d60c David Howells      2009-01-08 @1010      total = 1 << order;
f67d9b1576c1c6 Bob Liu            2011-05-24  1011      point = len >> 
PAGE_SHIFT;
dd8632a12e500a Paul Mundt         2009-01-08  1012  
dbc8358c72373d Joonsoo Kim        2014-12-12  1013      /* we don't want to 
allocate a power-of-2 sized page set */
22cc877b32202b Leon Romanovsky    2015-06-24  1014      if 
(sysctl_nr_trim_pages && total - point >= sysctl_nr_trim_pages)
dbc8358c72373d Joonsoo Kim        2014-12-12  1015              total = point;
8feae13110d60c David Howells      2009-01-08  1016  
da616534ed7f6e Joonsoo Kim        2015-02-27  1017      base = 
alloc_pages_exact(total << PAGE_SHIFT, GFP_KERNEL);
dbc8358c72373d Joonsoo Kim        2014-12-12  1018      if (!base)
dbc8358c72373d Joonsoo Kim        2014-12-12  1019              goto enomem;
dbc8358c72373d Joonsoo Kim        2014-12-12  1020  
dbc8358c72373d Joonsoo Kim        2014-12-12  1021      atomic_long_add(total, 
&mmap_pages_allocated);
8feae13110d60c David Howells      2009-01-08  1022  
8feae13110d60c David Howells      2009-01-08  1023      region->vm_flags = 
vma->vm_flags |= VM_MAPPED_COPY;
8feae13110d60c David Howells      2009-01-08  1024      region->vm_start = 
(unsigned long) base;
f67d9b1576c1c6 Bob Liu            2011-05-24  1025      region->vm_end   = 
region->vm_start + len;
dd8632a12e500a Paul Mundt         2009-01-08  1026      region->vm_top   = 
region->vm_start + (total << PAGE_SHIFT);
8feae13110d60c David Howells      2009-01-08  1027  
8feae13110d60c David Howells      2009-01-08  1028      vma->vm_start = 
region->vm_start;
8feae13110d60c David Howells      2009-01-08  1029      vma->vm_end   = 
region->vm_start + len;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1030  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1031      if (vma->vm_file) {
^1da177e4c3f41 Linus Torvalds     2005-04-16  1032              /* read the 
contents of a file into the copy */
^1da177e4c3f41 Linus Torvalds     2005-04-16  1033              loff_t fpos;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1034  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1035              fpos = 
vma->vm_pgoff;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1036              fpos <<= 
PAGE_SHIFT;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1037  
b4bf802a5a6563 Christoph Hellwig  2017-09-01  1038              ret = 
kernel_read(vma->vm_file, base, len, &fpos);
^1da177e4c3f41 Linus Torvalds     2005-04-16  1039              if (ret < 0)
^1da177e4c3f41 Linus Torvalds     2005-04-16  1040                      goto 
error_free;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1041  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1042              /* clear the 
last little bit */
f67d9b1576c1c6 Bob Liu            2011-05-24  1043              if (ret < len)
f67d9b1576c1c6 Bob Liu            2011-05-24  1044                      
memset(base + ret, 0, len - ret);
^1da177e4c3f41 Linus Torvalds     2005-04-16  1045  
bfd40eaff5abb9 Kirill A. Shutemov 2018-07-26  1046      } else {
bfd40eaff5abb9 Kirill A. Shutemov 2018-07-26  1047              
vma_set_anonymous(vma);
^1da177e4c3f41 Linus Torvalds     2005-04-16  1048      }
^1da177e4c3f41 Linus Torvalds     2005-04-16  1049  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1050      return 0;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1051  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1052  error_free:
7223bb4a829628 Namhyung Kim       2011-05-24  1053      
free_page_series(region->vm_start, region->vm_top);
8feae13110d60c David Howells      2009-01-08  1054      region->vm_start = 
vma->vm_start = 0;
8feae13110d60c David Howells      2009-01-08  1055      region->vm_end   = 
vma->vm_end = 0;
dd8632a12e500a Paul Mundt         2009-01-08  1056      region->vm_top   = 0;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1057      return ret;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1058  
^1da177e4c3f41 Linus Torvalds     2005-04-16  1059  enomem:
b1de0d139c97a6 Mitchel Humpherys  2014-06-06  1060      pr_err("Allocation of 
length %lu from process %d (%s) failed\n",
05ae6fa31874ed Greg Ungerer       2009-01-13  1061             len, 
current->pid, current->comm);
9af744d743170b Michal Hocko       2017-02-22  1062      show_free_areas(0, 
NULL);
^1da177e4c3f41 Linus Torvalds     2005-04-16  1063      return -ENOMEM;
^1da177e4c3f41 Linus Torvalds     2005-04-16  1064  }
^1da177e4c3f41 Linus Torvalds     2005-04-16  1065  

:::::: The code at line 1010 was first introduced by commit
:::::: 8feae13110d60cc6287afabc2887366b0eb226c2 NOMMU: Make VMAs per MM as for 
MMU-mode linux

:::::: TO: David Howells <[email protected]>
:::::: CC: David Howells <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to