[bug report] drm/xe/bo: Simplify xe_bo_lock()
Dan Carpenter
dan.carpenter at linaro.org
Sat Jun 8 14:24:01 UTC 2024
Hello Thomas Hellström,
Commit 08a4f00e62bc ("drm/xe/bo: Simplify xe_bo_lock()") from Sep 8,
2023 (linux-next), leads to the following Smatch static checker
warning:
drivers/gpu/drm/xe/xe_vm.c:2095 vm_bind_ioctl_ops_create()
error: we previously assumed 'bo' could be null (see line 2067)
drivers/gpu/drm/xe/xe_vm.c
2061 static struct drm_gpuva_ops *
2062 vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
2063 u64 bo_offset_or_userptr, u64 addr, u64 range,
2064 u32 operation, u32 flags,
2065 u32 prefetch_region, u16 pat_index)
2066 {
2067 struct drm_gem_object *obj = bo ? &bo->ttm.base : NULL;
^^
So far as I can see bo is always valid. No need to check here.
2068 struct drm_gpuva_ops *ops;
2069 struct drm_gpuva_op *__op;
2070 struct drm_gpuvm_bo *vm_bo;
2071 int err;
2072
2073 lockdep_assert_held_write(&vm->lock);
2074
2075 vm_dbg(&vm->xe->drm,
2076 "op=%d, addr=0x%016llx, range=0x%016llx, bo_offset_or_userptr=0x%016llx",
2077 operation, (ULL)addr, (ULL)range,
2078 (ULL)bo_offset_or_userptr);
2079
2080 switch (operation) {
2081 case DRM_XE_VM_BIND_OP_MAP:
2082 case DRM_XE_VM_BIND_OP_MAP_USERPTR:
2083 ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, addr, range,
2084 obj, bo_offset_or_userptr);
2085 break;
2086 case DRM_XE_VM_BIND_OP_UNMAP:
2087 ops = drm_gpuvm_sm_unmap_ops_create(&vm->gpuvm, addr, range);
2088 break;
2089 case DRM_XE_VM_BIND_OP_PREFETCH:
2090 ops = drm_gpuvm_prefetch_ops_create(&vm->gpuvm, addr, range);
2091 break;
2092 case DRM_XE_VM_BIND_OP_UNMAP_ALL:
2093 xe_assert(vm->xe, bo);
2094
--> 2095 err = xe_bo_lock(bo, true);
^^
Unchecked dereference here.
2096 if (err)
2097 return ERR_PTR(err);
2098
2099 vm_bo = drm_gpuvm_bo_obtain(&vm->gpuvm, obj);
2100 if (IS_ERR(vm_bo)) {
2101 xe_bo_unlock(bo);
2102 return ERR_CAST(vm_bo);
2103 }
2104
2105 ops = drm_gpuvm_bo_unmap_ops_create(vm_bo);
2106 drm_gpuvm_bo_put(vm_bo);
2107 xe_bo_unlock(bo);
2108 break;
2109 default:
2110 drm_warn(&vm->xe->drm, "NOT POSSIBLE");
2111 ops = ERR_PTR(-EINVAL);
2112 }
2113 if (IS_ERR(ops))
2114 return ops;
2115
2116 drm_gpuva_for_each_op(__op, ops) {
2117 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
2118
2119 if (__op->op == DRM_GPUVA_OP_MAP) {
2120 op->map.immediate =
2121 flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE;
2122 op->map.read_only =
2123 flags & DRM_XE_VM_BIND_FLAG_READONLY;
2124 op->map.is_null = flags & DRM_XE_VM_BIND_FLAG_NULL;
2125 op->map.dumpable = flags & DRM_XE_VM_BIND_FLAG_DUMPABLE;
2126 op->map.pat_index = pat_index;
2127 } else if (__op->op == DRM_GPUVA_OP_PREFETCH) {
2128 op->prefetch.region = prefetch_region;
2129 }
2130
2131 print_op(vm->xe, __op);
2132 }
2133
2134 return ops;
2135 }
regards,
dan carpenter
More information about the dri-devel
mailing list