drivers/iommu/iommufd/vfio_compat.c:315:17: sparse: sparse: cast removes address space '__user' of expression

From: kernel test robot
Date: Sun Sep 10 2023 - 09:17:13 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 535a265d7f0dd50d8c3a4f8b4f3a452d56bd160f
commit: d624d6652a65ad4f47a58b8651a1ec1163bb81d3 iommufd: vfio container FD ioctl compatibility
date: 9 months ago
config: i386-randconfig-063-20230910 (https://download.01.org/0day-ci/archive/20230910/202309102158.44x6nW0r-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230910/202309102158.44x6nW0r-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309102158.44x6nW0r-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> drivers/iommu/iommufd/vfio_compat.c:315:17: sparse: sparse: cast removes address space '__user' of expression

vim +/__user +315 drivers/iommu/iommufd/vfio_compat.c

309
310 static int iommufd_fill_cap_iova(struct iommufd_ioas *ioas,
311 struct vfio_info_cap_header __user *cur,
312 size_t avail)
313 {
314 struct vfio_iommu_type1_info_cap_iova_range __user *ucap_iovas =
> 315 container_of(cur,
316 struct vfio_iommu_type1_info_cap_iova_range __user,
317 header);
318 struct vfio_iommu_type1_info_cap_iova_range cap_iovas = {
319 .header = {
320 .id = VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE,
321 .version = 1,
322 },
323 };
324 struct interval_tree_span_iter span;
325
326 interval_tree_for_each_span(&span, &ioas->iopt.reserved_itree, 0,
327 ULONG_MAX) {
328 struct vfio_iova_range range;
329
330 if (!span.is_hole)
331 continue;
332 range.start = span.start_hole;
333 range.end = span.last_hole;
334 if (avail >= struct_size(&cap_iovas, iova_ranges,
335 cap_iovas.nr_iovas + 1) &&
336 copy_to_user(&ucap_iovas->iova_ranges[cap_iovas.nr_iovas],
337 &range, sizeof(range)))
338 return -EFAULT;
339 cap_iovas.nr_iovas++;
340 }
341 if (avail >= struct_size(&cap_iovas, iova_ranges, cap_iovas.nr_iovas) &&
342 copy_to_user(ucap_iovas, &cap_iovas, sizeof(cap_iovas)))
343 return -EFAULT;
344 return struct_size(&cap_iovas, iova_ranges, cap_iovas.nr_iovas);
345 }
346

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki