On Fri, 5 Jan 2024 21:46:16 +0300 Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx> wrote: > +/** > + * drm_gem_shmem_swapin_locked() - Moves shmem GEM back to memory and enables > + * hardware access to the memory. > + * @shmem: shmem GEM object > + * > + * This function moves shmem GEM back to memory if it was previously evicted > + * by the memory shrinker. The GEM is ready to use on success. > + * > + * Returns: > + * 0 on success or a negative error code on failure. > + */ > +int drm_gem_shmem_swapin_locked(struct drm_gem_shmem_object *shmem) > +{ > + int err; > + > + dma_resv_assert_held(shmem->base.resv); > + > + if (!shmem->evicted) > + return 0; Shouldn't we have a drm_gem_shmem_shrinker_update_lru_locked() even if the object wasn't evicted, such that idle->busy transition moves the BO to the list tail? > + > + err = drm_gem_shmem_acquire_pages(shmem); > + if (err) > + return err; > + > + shmem->evicted = false; > + > + drm_gem_shmem_shrinker_update_lru_locked(shmem); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(drm_gem_shmem_swapin_locked); > +