drivers/gpu/drm/i915/gem/i915_gem_ttm.c:1066:21: sparse: sparse: incorrect type in assignment (different base types)

From: kernel test robot
Date: Sun Feb 26 2023 - 19:53:30 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: f3a2439f20d918930cc4ae8f76fe1c1afd26958f
commit: 516198d317d81f33839ca850e83f6717b0d80e80 drm/i915: audit bo->resource usage v3
date: 5 weeks ago
config: i386-randconfig-s002 (https://download.01.org/0day-ci/archive/20230227/202302270807.R5fXE0cx-lkp@xxxxxxxxx/config)
compiler: gcc-11 (Debian 11.3.0-8) 11.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.4-39-gce1a6720-dirty
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=516198d317d81f33839ca850e83f6717b0d80e80
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout 516198d317d81f33839ca850e83f6717b0d80e80
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 olddefconfig
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/gpu/drm/i915/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Link: https://lore.kernel.org/oe-kbuild-all/202302270807.R5fXE0cx-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> drivers/gpu/drm/i915/gem/i915_gem_ttm.c:1066:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted vm_fault_t [assigned] [usertype] ret @@ got int @@
drivers/gpu/drm/i915/gem/i915_gem_ttm.c:1066:21: sparse: expected restricted vm_fault_t [assigned] [usertype] ret
drivers/gpu/drm/i915/gem/i915_gem_ttm.c:1066:21: sparse: got int

vim +1066 drivers/gpu/drm/i915/gem/i915_gem_ttm.c

1027
1028 static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
1029 {
1030 struct vm_area_struct *area = vmf->vma;
1031 struct ttm_buffer_object *bo = area->vm_private_data;
1032 struct drm_device *dev = bo->base.dev;
1033 struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
1034 intel_wakeref_t wakeref = 0;
1035 vm_fault_t ret;
1036 int idx;
1037
1038 /* Sanity check that we allow writing into this object */
1039 if (unlikely(i915_gem_object_is_readonly(obj) &&
1040 area->vm_flags & VM_WRITE))
1041 return VM_FAULT_SIGBUS;
1042
1043 ret = ttm_bo_vm_reserve(bo, vmf);
1044 if (ret)
1045 return ret;
1046
1047 if (obj->mm.madv != I915_MADV_WILLNEED) {
1048 dma_resv_unlock(bo->base.resv);
1049 return VM_FAULT_SIGBUS;
1050 }
1051
1052 /*
1053 * This must be swapped out with shmem ttm_tt (pipeline-gutting).
1054 * Calling ttm_bo_validate() here with TTM_PL_SYSTEM should only go as
1055 * far as far doing a ttm_bo_move_null(), which should skip all the
1056 * other junk.
1057 */
1058 if (!bo->resource) {
1059 struct ttm_operation_ctx ctx = {
1060 .interruptible = true,
1061 .no_wait_gpu = true, /* should be idle already */
1062 };
1063
1064 GEM_BUG_ON(!bo->ttm || !(bo->ttm->page_flags & TTM_TT_FLAG_SWAPPED));
1065
> 1066 ret = ttm_bo_validate(bo, i915_ttm_sys_placement(), &ctx);
1067 if (ret) {
1068 dma_resv_unlock(bo->base.resv);
1069 return VM_FAULT_SIGBUS;
1070 }
1071 } else if (!i915_ttm_resource_mappable(bo->resource)) {
1072 int err = -ENODEV;
1073 int i;
1074
1075 for (i = 0; i < obj->mm.n_placements; i++) {
1076 struct intel_memory_region *mr = obj->mm.placements[i];
1077 unsigned int flags;
1078
1079 if (!mr->io_size && mr->type != INTEL_MEMORY_SYSTEM)
1080 continue;
1081
1082 flags = obj->flags;
1083 flags &= ~I915_BO_ALLOC_GPU_ONLY;
1084 err = __i915_ttm_migrate(obj, mr, flags);
1085 if (!err)
1086 break;
1087 }
1088
1089 if (err) {
1090 drm_dbg(dev, "Unable to make resource CPU accessible(err = %pe)\n",
1091 ERR_PTR(err));
1092 dma_resv_unlock(bo->base.resv);
1093 ret = VM_FAULT_SIGBUS;
1094 goto out_rpm;
1095 }
1096 }
1097
1098 if (i915_ttm_cpu_maps_iomem(bo->resource))
1099 wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
1100
1101 if (drm_dev_enter(dev, &idx)) {
1102 ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
1103 TTM_BO_VM_NUM_PREFAULT);
1104 drm_dev_exit(idx);
1105 } else {
1106 ret = ttm_bo_vm_dummy_page(vmf, vmf->vma->vm_page_prot);
1107 }
1108
1109 if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
1110 goto out_rpm;
1111
1112 /*
1113 * ttm_bo_vm_reserve() already has dma_resv_lock.
1114 * userfault_count is protected by dma_resv lock and rpm wakeref.
1115 */
1116 if (ret == VM_FAULT_NOPAGE && wakeref && !obj->userfault_count) {
1117 obj->userfault_count = 1;
1118 spin_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
1119 list_add(&obj->userfault_link, &to_i915(obj->base.dev)->runtime_pm.lmem_userfault_list);
1120 spin_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
1121
1122 GEM_WARN_ON(!i915_ttm_cpu_maps_iomem(bo->resource));
1123 }
1124
1125 if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
1126 intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref,
1127 msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
1128
1129 i915_ttm_adjust_lru(obj);
1130
1131 dma_resv_unlock(bo->base.resv);
1132
1133 out_rpm:
1134 if (wakeref)
1135 intel_runtime_pm_put(&to_i915(obj->base.dev)->runtime_pm, wakeref);
1136
1137 return ret;
1138 }
1139

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