On 9/15/23 11:46, Boris Brezillon wrote: >> -static int drm_gem_shmem_get_pages_locked(struct drm_gem_shmem_object *shmem) >> +static int >> +drm_gem_shmem_acquire_pages(struct drm_gem_shmem_object *shmem, bool init) >> { >> struct drm_gem_object *obj = &shmem->base; >> struct page **pages; >> >> dma_resv_assert_held(shmem->base.resv); >> >> - if (refcount_inc_not_zero(&shmem->pages_use_count)) >> + if (shmem->madv < 0) { >> + drm_WARN_ON(obj->dev, shmem->pages); >> + return -ENOMEM; >> + } >> + >> + if (shmem->pages) { >> + drm_WARN_ON(obj->dev, !shmem->evicted); >> return 0; >> + } >> + >> + if (drm_WARN_ON(obj->dev, !(init ^ refcount_read(&shmem->pages_use_count)))) >> + return -EINVAL; > OOC, why do we care? Is there any difference between initial and re-pin > that make the page allocation impossible? Feels like, if there's a > check to do, it should be done in the caller instead, and you can drop > the init param here. This is a sanity check that addresses additional refcnt tracking complexity imposed by shrinker. This function is used by both init and re-pin that is invoked from several places in the code. It's not trivial to move that check to the callers. -- Best regards, Dmitry