[bug report] drm/ttm, drm_xe, Implement ttm_lru_walk_for_evict() using the guarded LRU iteration

Dan Carpenter dan.carpenter at linaro.org
Sun Jun 29 03:51:31 UTC 2025


Hello Thomas Hellström,

Commit bb8aa27eff6f ("drm/ttm, drm_xe, Implement
ttm_lru_walk_for_evict() using the guarded LRU iteration") from Jun
23, 2025 (linux-next), leads to the following (unpublished) Smatch
static checker warning:

	drivers/gpu/drm/ttm/ttm_bo_util.c:991 __ttm_bo_lru_cursor_next()
	warn: duplicate check 'res' (previous on line 952)

drivers/gpu/drm/ttm/ttm_bo_util.c
   931  __ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
   932  {
   933          spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
   934          struct ttm_resource *res = NULL;
   935          struct ttm_buffer_object *bo;
   936          struct ttm_lru_walk_arg *arg = curs->arg;
   937          bool first = !curs->bo;
   938  
   939          ttm_bo_lru_cursor_cleanup_bo(curs);
   940  
   941          spin_lock(lru_lock);
   942          for (;;) {
   943                  int mem_type, ret = 0;
   944                  bool bo_locked = false;
   945  
   946                  if (first) {
   947                          res = ttm_resource_manager_first(&curs->res_curs);
   948                          first = false;
   949                  } else {
   950                          res = ttm_resource_manager_next(&curs->res_curs);
   951                  }
   952                  if (!res)
   953                          break;

This is the only break statement

   954  
   955                  bo = res->bo;
   956                  if (ttm_lru_walk_trylock(curs, bo))
   957                          bo_locked = true;
   958                  else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only)
   959                          continue;
   960  
   961                  if (!ttm_bo_get_unless_zero(bo)) {
   962                          if (curs->needs_unlock)
   963                                  dma_resv_unlock(bo->base.resv);
   964                          continue;
   965                  }
   966  
   967                  mem_type = res->mem_type;
   968                  spin_unlock(lru_lock);
   969                  if (!bo_locked)
   970                          ret = ttm_lru_walk_ticketlock(curs, bo);
   971  
   972                  /*
   973                   * Note that in between the release of the lru lock and the
   974                   * ticketlock, the bo may have switched resource,
   975                   * and also memory type, since the resource may have been
   976                   * freed and allocated again with a different memory type.
   977                   * In that case, just skip it.
   978                   */
   979                  curs->bo = bo;
   980                  if (!ret && bo->resource && bo->resource->mem_type == mem_type)
   981                          return bo;
   982  
   983                  ttm_bo_lru_cursor_cleanup_bo(curs);
   984                  if (ret && ret != -EALREADY)
   985                          return ERR_PTR(ret);
   986  
   987                  spin_lock(lru_lock);
   988          }
   989  
   990          spin_unlock(lru_lock);
   991          return res ? bo : NULL;

So we know res is NULL and we could just change this to "return NULL;"

   992  }

regards,
dan carpenter


More information about the dri-devel mailing list