[bug report] drm/ttm: TTM fault handler helpers
Dan Carpenter
dan.carpenter at oracle.com
Thu Jun 27 07:51:38 UTC 2019
Hello Thomas Hellstrom,
This is a semi-automatic email about new static checker warnings.
The patch 7a39f35ce43f: "drm/ttm: TTM fault handler helpers" from Feb
6, 2019, leads to the following Smatch complaint:
drivers/gpu/drm/ttm/ttm_bo_vm.c:266 ttm_bo_vm_fault_reserved()
error: we previously assumed 'bo->ttm' could be null (see line 204)
drivers/gpu/drm/ttm/ttm_bo_vm.c
203 */
204 if (bo->ttm && (bo->ttm->page_flags & TTM_PAGE_FLAG_SG))
^^^^^^^
Check for NULL.
205 return VM_FAULT_SIGBUS;
206
207 if (bdev->driver->fault_reserve_notify) {
208 struct dma_fence *moving = dma_fence_get(bo->moving);
209
210 err = bdev->driver->fault_reserve_notify(bo);
211 switch (err) {
212 case 0:
213 break;
214 case -EBUSY:
215 case -ERESTARTSYS:
216 return VM_FAULT_NOPAGE;
217 default:
218 return VM_FAULT_SIGBUS;
219 }
220
221 if (bo->moving != moving) {
222 spin_lock(&bdev->glob->lru_lock);
223 ttm_bo_move_to_lru_tail(bo, NULL);
224 spin_unlock(&bdev->glob->lru_lock);
225 }
226 dma_fence_put(moving);
227 }
228
229 /*
230 * Wait for buffer data in transit, due to a pipelined
231 * move.
232 */
233 ret = ttm_bo_vm_fault_idle(bo, vmf);
234 if (unlikely(ret != 0))
235 return ret;
236
237 err = ttm_mem_io_lock(man, true);
238 if (unlikely(err != 0))
239 return VM_FAULT_NOPAGE;
240 err = ttm_mem_io_reserve_vm(bo);
241 if (unlikely(err != 0)) {
242 ret = VM_FAULT_SIGBUS;
243 goto out_io_unlock;
244 }
245
246 page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) +
247 vma->vm_pgoff - drm_vma_node_start(&bo->vma_node);
248 page_last = vma_pages(vma) + vma->vm_pgoff -
249 drm_vma_node_start(&bo->vma_node);
250
251 if (unlikely(page_offset >= bo->num_pages)) {
252 ret = VM_FAULT_SIGBUS;
253 goto out_io_unlock;
254 }
255
256 cvma.vm_page_prot = ttm_io_prot(bo->mem.placement, prot);
257 if (!bo->mem.bus.is_iomem) {
258 struct ttm_operation_ctx ctx = {
259 .interruptible = false,
260 .no_wait_gpu = false,
261 .flags = TTM_OPT_FLAG_FORCE_ALLOC
262
263 };
264
265 ttm = bo->ttm;
266 if (ttm_tt_populate(bo->ttm, &ctx)) {
^^^^^^^
Unchecked dereference inside ttm_tt_populate() function.
267 ret = VM_FAULT_OOM;
268 goto out_io_unlock;
regards,
dan carpenter
More information about the dri-devel
mailing list