On Wed, Feb 11, 2026 at 12:22 AM Boris Brezillon <[email protected]> wrote: [...] > +static unsigned long > +panthor_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control > *sc) > +{ > + struct panthor_device *ptdev = shrinker->private_data; > + unsigned long remaining = 0; > + unsigned long freed = 0; > + > + if (!can_swap()) > + goto out; > + > + freed += drm_gem_lru_scan(&ptdev->reclaim.unused, > + sc->nr_to_scan - freed, &remaining, > + panthor_gem_try_evict, NULL); > + if (freed >= sc->nr_to_scan) > + goto out; > + > + freed += drm_gem_lru_scan(&ptdev->reclaim.mmapped, > + sc->nr_to_scan - freed, &remaining, > + panthor_gem_try_evict, NULL); > + if (freed >= sc->nr_to_scan) > + goto out; > + Do we need to check for can_block here? panthor_gem_try_evict will block for bos on lrus below.
> + freed += panthor_mmu_reclaim_priv_bos(ptdev, sc->nr_to_scan - freed, > + &remaining, > panthor_gem_try_evict); > + if (freed >= sc->nr_to_scan) > + goto out; > + > + freed += drm_gem_lru_scan(&ptdev->reclaim.gpu_mapped_shared, > + sc->nr_to_scan - freed, &remaining, > + panthor_gem_try_evict, NULL); > + > +out: > +#ifdef CONFIG_DEBUG_FS > + /* This is racy, but that's okay, because this is just debugfs > + * reporting and doesn't need to be accurate. > + */ > + ptdev->reclaim.nr_pages_reclaimed_on_last_scan = freed; > +#endif > + > + /* If there are things to reclaim, try a couple times before giving > up. */ > + if (!freed && remaining > 0 && > + atomic_inc_return(&ptdev->reclaim.retry_count) < 2) > + return 0; > + > + atomic_set(&ptdev->reclaim.retry_count, 0); > + > + if (freed) > + return freed; > + > + /* There's nothing left to reclaim, or the resources are contended. > Give up now. */ > + return SHRINK_STOP; > +}
