Hello Maarten Lankhorst,

This is a semi-automatic email about new static checker warnings.

The patch f6c466b84cfa: "drm/i915: Add support for moving fence 
waiting" from Nov 22, 2021, leads to the following Smatch complaint:

    drivers/gpu/drm/i915/i915_vma.c:1015 i915_vma_pin_ww()
    error: we previously assumed 'vma->obj' could be null (see line 924)

drivers/gpu/drm/i915/i915_vma.c
   923  
   924          moving = vma->obj ? i915_gem_object_get_moving_fence(vma->obj) 
: NULL;
                         ^^^^^^^^
The patch adds a check for NULL

   925          if (flags & vma->vm->bind_async_flags || moving) {
   926                  /* lock VM */
   927                  err = i915_vm_lock_objects(vma->vm, ww);
   928                  if (err)
   929                          goto err_rpm;
   930  
   931                  work = i915_vma_work();
   932                  if (!work) {
   933                          err = -ENOMEM;
   934                          goto err_rpm;
   935                  }
   936  
   937                  work->vm = i915_vm_get(vma->vm);
   938  
   939                  dma_fence_work_chain(&work->base, moving);
   940  
   941                  /* Allocate enough page directories to used PTE */
   942                  if (vma->vm->allocate_va_range) {
   943                          err = i915_vm_alloc_pt_stash(vma->vm,
   944                                                       &work->stash,
   945                                                       vma->size);
   946                          if (err)
   947                                  goto err_fence;
   948  
   949                          err = i915_vm_map_pt_stash(vma->vm, 
&work->stash);
   950                          if (err)
   951                                  goto err_fence;
   952                  }
   953          }
   954  
   955          /*
   956           * Differentiate between user/kernel vma inside the 
aliasing-ppgtt.
   957           *
   958           * We conflate the Global GTT with the user's vma when using the
   959           * aliasing-ppgtt, but it is still vitally important to try and
   960           * keep the use cases distinct. For example, userptr objects are
   961           * not allowed inside the Global GTT as that will cause lock
   962           * inversions when we have to evict them the mmu_notifier 
callbacks -
   963           * but they are allowed to be part of the user ppGTT which can 
never
   964           * be mapped. As such we try to give the distinct users of the 
same
   965           * mutex, distinct lockclasses [equivalent to how we keep 
i915_ggtt
   966           * and i915_ppgtt separate].
   967           *
   968           * NB this may cause us to mask real lock inversions -- while 
the
   969           * code is safe today, lockdep may not be able to spot future
   970           * transgressions.
   971           */
   972          err = mutex_lock_interruptible_nested(&vma->vm->mutex,
   973                                                !(flags & PIN_GLOBAL));
   974          if (err)
   975                  goto err_fence;
   976  
   977          /* No more allocations allowed now we hold vm->mutex */
   978  
   979          if (unlikely(i915_vma_is_closed(vma))) {
   980                  err = -ENOENT;
   981                  goto err_unlock;
   982          }
   983  
   984          bound = atomic_read(&vma->flags);
   985          if (unlikely(bound & I915_VMA_ERROR)) {
   986                  err = -ENOMEM;
   987                  goto err_unlock;
   988          }
   989  
   990          if (unlikely(!((bound + 1) & I915_VMA_PIN_MASK))) {
   991                  err = -EAGAIN; /* pins are meant to be fairly temporary 
*/
   992                  goto err_unlock;
   993          }
   994  
   995          if (unlikely(!(flags & ~bound & I915_VMA_BIND_MASK))) {
   996                  __i915_vma_pin(vma);
   997                  goto err_unlock;
   998          }
   999  
  1000          err = i915_active_acquire(&vma->active);
  1001          if (err)
  1002                  goto err_unlock;
  1003  
  1004          if (!(bound & I915_VMA_BIND_MASK)) {
  1005                  err = i915_vma_insert(vma, size, alignment, flags);
  1006                  if (err)
  1007                          goto err_active;
  1008  
  1009                  if (i915_is_ggtt(vma->vm))
  1010                          __i915_vma_set_map_and_fenceable(vma);
  1011          }
  1012  
  1013          GEM_BUG_ON(!vma->pages);
  1014          err = i915_vma_bind(vma,
  1015                              vma->obj->cache_level,
                                    ^^^^^^^^^^
This older code dereferences it without checking.

  1016                              flags, work);
  1017          if (err)

regards,
dan carpenter

Reply via email to