* [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here
@ 2022-06-02 13:24 kernel test robot
2022-06-02 13:41 ` Liam Howlett
0 siblings, 1 reply; 5+ messages in thread
From: kernel test robot @ 2022-06-02 13:24 UTC (permalink / raw)
To: Liam R. Howlett
Cc: llvm, kbuild-all, Linux Memory Management List, Andrew Morton
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: 2e776ccffa840ce53ee1c21bde54cbe4bc102c3b
commit: 32355b99dd92f9751a482463d7e239fa06302bc9 [14545/14705] mm/nommu: move preallocations and limit other allocations
config: arm-buildonly-randconfig-r004-20220531 (https://download.01.org/0day-ci/archive/20220602/202206022121.RYk2Zgc9-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b364c76683f8ef241025a9556300778c07b590c2)
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 arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=32355b99dd92f9751a482463d7e239fa06302bc9
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 32355b99dd92f9751a482463d7e239fa06302bc9
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
mm/nommu.c:593:18: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
prev = mas_prev(&mas, 0);
^~~~
include/linux/maple_tree.h:468:33: note: passing argument to parameter 'mas' here
void *mas_prev(struct ma_state *mas, unsigned long min);
^
mm/nommu.c:594:12: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
mas_reset(&mas);
^~~~
include/linux/maple_tree.h:505:47: note: passing argument to parameter 'mas' here
static inline void mas_reset(struct ma_state *mas)
^
>> mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here [-Wuninitialized]
if (mas_preallocate(&mas, vma, GFP_KERNEL))
^~~
mm/nommu.c:1055:28: note: initialize the variable 'vma' to silence this warning
struct vm_area_struct *vma;
^
= NULL
1 warning and 2 errors generated.
vim +/vma +1081 mm/nommu.c
1042
1043 /*
1044 * handle mapping creation for uClinux
1045 */
1046 unsigned long do_mmap(struct file *file,
1047 unsigned long addr,
1048 unsigned long len,
1049 unsigned long prot,
1050 unsigned long flags,
1051 unsigned long pgoff,
1052 unsigned long *populate,
1053 struct list_head *uf)
1054 {
1055 struct vm_area_struct *vma;
1056 struct vm_region *region;
1057 struct rb_node *rb;
1058 vm_flags_t vm_flags;
1059 unsigned long capabilities, result;
1060 int ret;
1061 MA_STATE(mas, ¤t->mm->mm_mt, 0, 0);
1062
1063 *populate = 0;
1064
1065 /* decide whether we should attempt the mapping, and if so what sort of
1066 * mapping */
1067 ret = validate_mmap_request(file, addr, len, prot, flags, pgoff,
1068 &capabilities);
1069 if (ret < 0)
1070 return ret;
1071
1072 /* we ignore the address hint */
1073 addr = 0;
1074 len = PAGE_ALIGN(len);
1075
1076 /* we've determined that we can make the mapping, now translate what we
1077 * now know into VMA flags */
1078 vm_flags = determine_vm_flags(file, prot, flags, capabilities);
1079
1080
> 1081 if (mas_preallocate(&mas, vma, GFP_KERNEL))
1082 goto error_maple_preallocate;
1083
1084 /* we're going to need to record the mapping */
1085 region = kmem_cache_zalloc(vm_region_jar, GFP_KERNEL);
1086 if (!region)
1087 goto error_getting_region;
1088
1089 vma = vm_area_alloc(current->mm);
1090 if (!vma)
1091 goto error_getting_vma;
1092
1093 region->vm_usage = 1;
1094 region->vm_flags = vm_flags;
1095 region->vm_pgoff = pgoff;
1096
1097 vma->vm_flags = vm_flags;
1098 vma->vm_pgoff = pgoff;
1099
1100 if (file) {
1101 region->vm_file = get_file(file);
1102 vma->vm_file = get_file(file);
1103 }
1104
1105 down_write(&nommu_region_sem);
1106
1107 /* if we want to share, we need to check for regions created by other
1108 * mmap() calls that overlap with our proposed mapping
1109 * - we can only share with a superset match on most regular files
1110 * - shared mappings on character devices and memory backed files are
1111 * permitted to overlap inexactly as far as we are concerned for in
1112 * these cases, sharing is handled in the driver or filesystem rather
1113 * than here
1114 */
1115 if (vm_flags & VM_MAYSHARE) {
1116 struct vm_region *pregion;
1117 unsigned long pglen, rpglen, pgend, rpgend, start;
1118
1119 pglen = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1120 pgend = pgoff + pglen;
1121
1122 for (rb = rb_first(&nommu_region_tree); rb; rb = rb_next(rb)) {
1123 pregion = rb_entry(rb, struct vm_region, vm_rb);
1124
1125 if (!(pregion->vm_flags & VM_MAYSHARE))
1126 continue;
1127
1128 /* search for overlapping mappings on the same file */
1129 if (file_inode(pregion->vm_file) !=
1130 file_inode(file))
1131 continue;
1132
1133 if (pregion->vm_pgoff >= pgend)
1134 continue;
1135
1136 rpglen = pregion->vm_end - pregion->vm_start;
1137 rpglen = (rpglen + PAGE_SIZE - 1) >> PAGE_SHIFT;
1138 rpgend = pregion->vm_pgoff + rpglen;
1139 if (pgoff >= rpgend)
1140 continue;
1141
1142 /* handle inexactly overlapping matches between
1143 * mappings */
1144 if ((pregion->vm_pgoff != pgoff || rpglen != pglen) &&
1145 !(pgoff >= pregion->vm_pgoff && pgend <= rpgend)) {
1146 /* new mapping is not a subset of the region */
1147 if (!(capabilities & NOMMU_MAP_DIRECT))
1148 goto sharing_violation;
1149 continue;
1150 }
1151
1152 /* we've found a region we can share */
1153 pregion->vm_usage++;
1154 vma->vm_region = pregion;
1155 start = pregion->vm_start;
1156 start += (pgoff - pregion->vm_pgoff) << PAGE_SHIFT;
1157 vma->vm_start = start;
1158 vma->vm_end = start + len;
1159
1160 if (pregion->vm_flags & VM_MAPPED_COPY)
1161 vma->vm_flags |= VM_MAPPED_COPY;
1162 else {
1163 ret = do_mmap_shared_file(vma);
1164 if (ret < 0) {
1165 vma->vm_region = NULL;
1166 vma->vm_start = 0;
1167 vma->vm_end = 0;
1168 pregion->vm_usage--;
1169 pregion = NULL;
1170 goto error_just_free;
1171 }
1172 }
1173 fput(region->vm_file);
1174 kmem_cache_free(vm_region_jar, region);
1175 region = pregion;
1176 result = start;
1177 goto share;
1178 }
1179
1180 /* obtain the address at which to make a shared mapping
1181 * - this is the hook for quasi-memory character devices to
1182 * tell us the location of a shared mapping
1183 */
1184 if (capabilities & NOMMU_MAP_DIRECT) {
1185 addr = file->f_op->get_unmapped_area(file, addr, len,
1186 pgoff, flags);
1187 if (IS_ERR_VALUE(addr)) {
1188 ret = addr;
1189 if (ret != -ENOSYS)
1190 goto error_just_free;
1191
1192 /* the driver refused to tell us where to site
1193 * the mapping so we'll have to attempt to copy
1194 * it */
1195 ret = -ENODEV;
1196 if (!(capabilities & NOMMU_MAP_COPY))
1197 goto error_just_free;
1198
1199 capabilities &= ~NOMMU_MAP_DIRECT;
1200 } else {
1201 vma->vm_start = region->vm_start = addr;
1202 vma->vm_end = region->vm_end = addr + len;
1203 }
1204 }
1205 }
1206
1207 vma->vm_region = region;
1208
1209 /* set up the mapping
1210 * - the region is filled in if NOMMU_MAP_DIRECT is still set
1211 */
1212 if (file && vma->vm_flags & VM_SHARED)
1213 ret = do_mmap_shared_file(vma);
1214 else
1215 ret = do_mmap_private(vma, region, len, capabilities);
1216 if (ret < 0)
1217 goto error_just_free;
1218 add_nommu_region(region);
1219
1220 /* clear anonymous mappings that don't ask for uninitialized data */
1221 if (!vma->vm_file &&
1222 (!IS_ENABLED(CONFIG_MMAP_ALLOW_UNINITIALIZED) ||
1223 !(flags & MAP_UNINITIALIZED)))
1224 memset((void *)region->vm_start, 0,
1225 region->vm_end - region->vm_start);
1226
1227 /* okay... we have a mapping; now we have to register it */
1228 result = vma->vm_start;
1229
1230 current->mm->total_vm += len >> PAGE_SHIFT;
1231
1232 share:
1233 mas_add_vma_to_mm(&mas, current->mm, vma);
1234
1235 /* we flush the region from the icache only when the first executable
1236 * mapping of it is made */
1237 if (vma->vm_flags & VM_EXEC && !region->vm_icache_flushed) {
1238 flush_icache_user_range(region->vm_start, region->vm_end);
1239 region->vm_icache_flushed = true;
1240 }
1241
1242 up_write(&nommu_region_sem);
1243
1244 return result;
1245
1246 error_just_free:
1247 up_write(&nommu_region_sem);
1248 error:
1249 if (region->vm_file)
1250 fput(region->vm_file);
1251 kmem_cache_free(vm_region_jar, region);
1252 if (vma->vm_file)
1253 fput(vma->vm_file);
1254 vm_area_free(vma);
1255 return ret;
1256
1257 sharing_violation:
1258 up_write(&nommu_region_sem);
1259 mas_destroy(&mas);
1260 pr_warn("Attempt to share mismatched mappings\n");
1261 ret = -EINVAL;
1262 goto error;
1263
1264 error_getting_vma:
1265 mas_destroy(&mas);
1266 kmem_cache_free(vm_region_jar, region);
1267 pr_warn("Allocation of vma for %lu byte allocation from process %d failed\n",
1268 len, current->pid);
1269 show_free_areas(0, NULL);
1270 return -ENOMEM;
1271
1272 error_getting_region:
1273 mas_destroy(&mas);
1274 pr_warn("Allocation of vm region for %lu byte allocation from process %d failed\n",
1275 len, current->pid);
1276 show_free_areas(0, NULL);
1277 return -ENOMEM;
1278
1279 error_maple_preallocate:
1280 pr_warn("Allocation of vma tree for process %d failed\n", current->pid);
1281 show_free_areas(0, NULL);
1282 return -ENOMEM;
1283
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here
2022-06-02 13:24 [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here kernel test robot
@ 2022-06-02 13:41 ` Liam Howlett
0 siblings, 0 replies; 5+ messages in thread
From: Liam Howlett @ 2022-06-02 13:41 UTC (permalink / raw)
To: kernel test robot
Cc: llvm, kbuild-all, Linux Memory Management List, Andrew Morton
* kernel test robot <lkp@intel.com> [220602 09:24]:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> head: 2e776ccffa840ce53ee1c21bde54cbe4bc102c3b
> commit: 32355b99dd92f9751a482463d7e239fa06302bc9 [14545/14705] mm/nommu: move preallocations and limit other allocations
> config: arm-buildonly-randconfig-r004-20220531 (https://download.01.org/0day-ci/archive/20220602/202206022121.RYk2Zgc9-lkp@intel.com/config)
> compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b364c76683f8ef241025a9556300778c07b590c2)
> 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 arm cross compiling tool for clang build
> # apt-get install binutils-arm-linux-gnueabi
> # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=32355b99dd92f9751a482463d7e239fa06302bc9
> 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 32355b99dd92f9751a482463d7e239fa06302bc9
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <lkp@intel.com>
>
> All warnings (new ones prefixed by >>):
>
> mm/nommu.c:593:18: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> prev = mas_prev(&mas, 0);
> ^~~~
> include/linux/maple_tree.h:468:33: note: passing argument to parameter 'mas' here
> void *mas_prev(struct ma_state *mas, unsigned long min);
> ^
> mm/nommu.c:594:12: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> mas_reset(&mas);
> ^~~~
> include/linux/maple_tree.h:505:47: note: passing argument to parameter 'mas' here
> static inline void mas_reset(struct ma_state *mas)
> ^
> >> mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here [-Wuninitialized]
> if (mas_preallocate(&mas, vma, GFP_KERNEL))
mas_preallocate does not currently use this variable, but in the future
it may be that you are storing a NULL which could affect the
preallocations as an optimization. I will fix this by relocating it
below the vma allocation.
> ^~~
> mm/nommu.c:1055:28: note: initialize the variable 'vma' to silence this warning
> struct vm_area_struct *vma;
> ^
> = NULL
> 1 warning and 2 errors generated.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here
@ 2022-06-02 13:41 ` Liam Howlett
0 siblings, 0 replies; 5+ messages in thread
From: Liam Howlett @ 2022-06-02 13:41 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 3177 bytes --]
* kernel test robot <lkp@intel.com> [220602 09:24]:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> head: 2e776ccffa840ce53ee1c21bde54cbe4bc102c3b
> commit: 32355b99dd92f9751a482463d7e239fa06302bc9 [14545/14705] mm/nommu: move preallocations and limit other allocations
> config: arm-buildonly-randconfig-r004-20220531 (https://download.01.org/0day-ci/archive/20220602/202206022121.RYk2Zgc9-lkp(a)intel.com/config)
> compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b364c76683f8ef241025a9556300778c07b590c2)
> 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 arm cross compiling tool for clang build
> # apt-get install binutils-arm-linux-gnueabi
> # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=32355b99dd92f9751a482463d7e239fa06302bc9
> 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 32355b99dd92f9751a482463d7e239fa06302bc9
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <lkp@intel.com>
>
> All warnings (new ones prefixed by >>):
>
> mm/nommu.c:593:18: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> prev = mas_prev(&mas, 0);
> ^~~~
> include/linux/maple_tree.h:468:33: note: passing argument to parameter 'mas' here
> void *mas_prev(struct ma_state *mas, unsigned long min);
> ^
> mm/nommu.c:594:12: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> mas_reset(&mas);
> ^~~~
> include/linux/maple_tree.h:505:47: note: passing argument to parameter 'mas' here
> static inline void mas_reset(struct ma_state *mas)
> ^
> >> mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here [-Wuninitialized]
> if (mas_preallocate(&mas, vma, GFP_KERNEL))
mas_preallocate does not currently use this variable, but in the future
it may be that you are storing a NULL which could affect the
preallocations as an optimization. I will fix this by relocating it
below the vma allocation.
> ^~~
> mm/nommu.c:1055:28: note: initialize the variable 'vma' to silence this warning
> struct vm_area_struct *vma;
> ^
> = NULL
> 1 warning and 2 errors generated.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here
2022-06-02 13:41 ` Liam Howlett
@ 2022-06-02 14:11 ` Liam Howlett
-1 siblings, 0 replies; 5+ messages in thread
From: Liam Howlett @ 2022-06-02 14:11 UTC (permalink / raw)
To: kernel test robot, llvm, kbuild-all,
Linux Memory Management List, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 3200 bytes --]
* Liam R. Howlett <Liam.Howlett@Oracle.com> [220602 09:40]:
> * kernel test robot <lkp@intel.com> [220602 09:24]:
> > tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> > head: 2e776ccffa840ce53ee1c21bde54cbe4bc102c3b
> > commit: 32355b99dd92f9751a482463d7e239fa06302bc9 [14545/14705] mm/nommu: move preallocations and limit other allocations
> > config: arm-buildonly-randconfig-r004-20220531 (https://download.01.org/0day-ci/archive/20220602/202206022121.RYk2Zgc9-lkp@intel.com/config)
> > compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b364c76683f8ef241025a9556300778c07b590c2)
> > 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 arm cross compiling tool for clang build
> > # apt-get install binutils-arm-linux-gnueabi
> > # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=32355b99dd92f9751a482463d7e239fa06302bc9
> > 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 32355b99dd92f9751a482463d7e239fa06302bc9
> > # save the config file
> > mkdir build_dir && cp config build_dir/.config
> > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
> >
> > If you fix the issue, kindly add following tag where applicable
> > Reported-by: kernel test robot <lkp@intel.com>
> >
> > All warnings (new ones prefixed by >>):
> >
> > mm/nommu.c:593:18: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> > prev = mas_prev(&mas, 0);
> > ^~~~
> > include/linux/maple_tree.h:468:33: note: passing argument to parameter 'mas' here
> > void *mas_prev(struct ma_state *mas, unsigned long min);
> > ^
> > mm/nommu.c:594:12: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> > mas_reset(&mas);
> > ^~~~
> > include/linux/maple_tree.h:505:47: note: passing argument to parameter 'mas' here
> > static inline void mas_reset(struct ma_state *mas)
> > ^
> > >> mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here [-Wuninitialized]
> > if (mas_preallocate(&mas, vma, GFP_KERNEL))
>
> mas_preallocate does not currently use this variable, but in the future
> it may be that you are storing a NULL which could affect the
> preallocations as an optimization. I will fix this by relocating it
> below the vma allocation.
Andrew,
Please find the attached patch to fix up the commit mentioned above
"32355b99dd92f: mm/nommu: move preallocations and limit other
allocations"
Thanks,
Liam
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-mm-nommu-Fix-compile-warning-in-do_mmap.patch --]
[-- Type: text/x-diff; name="0001-mm-nommu-Fix-compile-warning-in-do_mmap.patch", Size: 2615 bytes --]
From 0ff3d1d6f0c1d0464cca008acb1a750d78af441e Mon Sep 17 00:00:00 2001
From: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Date: Thu, 2 Jun 2022 09:44:38 -0400
Subject: [PATCH] mm/nommu: Fix compile warning in do_mmap()
vma is passed in to preallocate nodes since storing NULL could result in
less nodes needed than an actual value being stored. Fix this by moving
the preallocation call to below the vma allocation & be sure to undo
other allocations in the failure path.
Also fix the type error in the short-lived linked list modification.
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
mm/nommu.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/mm/nommu.c b/mm/nommu.c
index dbd73e3a9adf..f6b187090d95 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -590,8 +590,8 @@ static void mas_add_vma_to_mm(struct ma_state *mas, struct mm_struct *mm,
setup_vma_to_mm(vma, mm);
- prev = mas_prev(&mas, 0);
- mas_reset(&mas);
+ prev = mas_prev(mas, 0);
+ mas_reset(mas);
/* add the VMA to the tree */
vma_mas_store(vma, mas);
__vma_link_list(mm, vma, prev);
@@ -1078,9 +1078,6 @@ unsigned long do_mmap(struct file *file,
vm_flags = determine_vm_flags(file, prot, flags, capabilities);
- if (mas_preallocate(&mas, vma, GFP_KERNEL))
- goto error_maple_preallocate;
-
/* we're going to need to record the mapping */
region = kmem_cache_zalloc(vm_region_jar, GFP_KERNEL);
if (!region)
@@ -1090,6 +1087,9 @@ unsigned long do_mmap(struct file *file,
if (!vma)
goto error_getting_vma;
+ if (mas_preallocate(&mas, vma, GFP_KERNEL))
+ goto error_maple_preallocate;
+
region->vm_usage = 1;
region->vm_flags = vm_flags;
region->vm_pgoff = pgoff;
@@ -1262,7 +1262,6 @@ unsigned long do_mmap(struct file *file,
goto error;
error_getting_vma:
- mas_destroy(&mas);
kmem_cache_free(vm_region_jar, region);
pr_warn("Allocation of vma for %lu byte allocation from process %d failed\n",
len, current->pid);
@@ -1270,13 +1269,14 @@ unsigned long do_mmap(struct file *file,
return -ENOMEM;
error_getting_region:
- mas_destroy(&mas);
pr_warn("Allocation of vm region for %lu byte allocation from process %d failed\n",
len, current->pid);
show_free_areas(0, NULL);
return -ENOMEM;
error_maple_preallocate:
+ kmem_cache_free(vm_region_jar, region);
+ vm_area_free(vma);
pr_warn("Allocation of vma tree for process %d failed\n", current->pid);
show_free_areas(0, NULL);
return -ENOMEM;
--
2.35.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here
@ 2022-06-02 14:11 ` Liam Howlett
0 siblings, 0 replies; 5+ messages in thread
From: Liam Howlett @ 2022-06-02 14:11 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 3202 bytes --]
* Liam R. Howlett <Liam.Howlett@Oracle.com> [220602 09:40]:
> * kernel test robot <lkp@intel.com> [220602 09:24]:
> > tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> > head: 2e776ccffa840ce53ee1c21bde54cbe4bc102c3b
> > commit: 32355b99dd92f9751a482463d7e239fa06302bc9 [14545/14705] mm/nommu: move preallocations and limit other allocations
> > config: arm-buildonly-randconfig-r004-20220531 (https://download.01.org/0day-ci/archive/20220602/202206022121.RYk2Zgc9-lkp(a)intel.com/config)
> > compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b364c76683f8ef241025a9556300778c07b590c2)
> > 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 arm cross compiling tool for clang build
> > # apt-get install binutils-arm-linux-gnueabi
> > # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=32355b99dd92f9751a482463d7e239fa06302bc9
> > 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 32355b99dd92f9751a482463d7e239fa06302bc9
> > # save the config file
> > mkdir build_dir && cp config build_dir/.config
> > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
> >
> > If you fix the issue, kindly add following tag where applicable
> > Reported-by: kernel test robot <lkp@intel.com>
> >
> > All warnings (new ones prefixed by >>):
> >
> > mm/nommu.c:593:18: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> > prev = mas_prev(&mas, 0);
> > ^~~~
> > include/linux/maple_tree.h:468:33: note: passing argument to parameter 'mas' here
> > void *mas_prev(struct ma_state *mas, unsigned long min);
> > ^
> > mm/nommu.c:594:12: error: incompatible pointer types passing 'struct ma_state **' to parameter of type 'struct ma_state *'; remove & [-Werror,-Wincompatible-pointer-types]
> > mas_reset(&mas);
> > ^~~~
> > include/linux/maple_tree.h:505:47: note: passing argument to parameter 'mas' here
> > static inline void mas_reset(struct ma_state *mas)
> > ^
> > >> mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here [-Wuninitialized]
> > if (mas_preallocate(&mas, vma, GFP_KERNEL))
>
> mas_preallocate does not currently use this variable, but in the future
> it may be that you are storing a NULL which could affect the
> preallocations as an optimization. I will fix this by relocating it
> below the vma allocation.
Andrew,
Please find the attached patch to fix up the commit mentioned above
"32355b99dd92f: mm/nommu: move preallocations and limit other
allocations"
Thanks,
Liam
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-mm-nommu-Fix-compile-warning-in-do_mmap.patch --]
[-- Type: text/x-diff, Size: 2615 bytes --]
From 0ff3d1d6f0c1d0464cca008acb1a750d78af441e Mon Sep 17 00:00:00 2001
From: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Date: Thu, 2 Jun 2022 09:44:38 -0400
Subject: [PATCH] mm/nommu: Fix compile warning in do_mmap()
vma is passed in to preallocate nodes since storing NULL could result in
less nodes needed than an actual value being stored. Fix this by moving
the preallocation call to below the vma allocation & be sure to undo
other allocations in the failure path.
Also fix the type error in the short-lived linked list modification.
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
mm/nommu.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/mm/nommu.c b/mm/nommu.c
index dbd73e3a9adf..f6b187090d95 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -590,8 +590,8 @@ static void mas_add_vma_to_mm(struct ma_state *mas, struct mm_struct *mm,
setup_vma_to_mm(vma, mm);
- prev = mas_prev(&mas, 0);
- mas_reset(&mas);
+ prev = mas_prev(mas, 0);
+ mas_reset(mas);
/* add the VMA to the tree */
vma_mas_store(vma, mas);
__vma_link_list(mm, vma, prev);
@@ -1078,9 +1078,6 @@ unsigned long do_mmap(struct file *file,
vm_flags = determine_vm_flags(file, prot, flags, capabilities);
- if (mas_preallocate(&mas, vma, GFP_KERNEL))
- goto error_maple_preallocate;
-
/* we're going to need to record the mapping */
region = kmem_cache_zalloc(vm_region_jar, GFP_KERNEL);
if (!region)
@@ -1090,6 +1087,9 @@ unsigned long do_mmap(struct file *file,
if (!vma)
goto error_getting_vma;
+ if (mas_preallocate(&mas, vma, GFP_KERNEL))
+ goto error_maple_preallocate;
+
region->vm_usage = 1;
region->vm_flags = vm_flags;
region->vm_pgoff = pgoff;
@@ -1262,7 +1262,6 @@ unsigned long do_mmap(struct file *file,
goto error;
error_getting_vma:
- mas_destroy(&mas);
kmem_cache_free(vm_region_jar, region);
pr_warn("Allocation of vma for %lu byte allocation from process %d failed\n",
len, current->pid);
@@ -1270,13 +1269,14 @@ unsigned long do_mmap(struct file *file,
return -ENOMEM;
error_getting_region:
- mas_destroy(&mas);
pr_warn("Allocation of vm region for %lu byte allocation from process %d failed\n",
len, current->pid);
show_free_areas(0, NULL);
return -ENOMEM;
error_maple_preallocate:
+ kmem_cache_free(vm_region_jar, region);
+ vm_area_free(vma);
pr_warn("Allocation of vma tree for process %d failed\n", current->pid);
show_free_areas(0, NULL);
return -ENOMEM;
--
2.35.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-02 14:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-02 13:24 [linux-next:master 14545/14705] mm/nommu.c:1081:28: warning: variable 'vma' is uninitialized when used here kernel test robot
2022-06-02 13:41 ` Liam Howlett
2022-06-02 13:41 ` Liam Howlett
2022-06-02 14:11 ` Liam Howlett
2022-06-02 14:11 ` Liam Howlett
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.