On Thu, 12 Feb 2026 17:19:20 -0800
Chia-I Wu <[email protected]> wrote:

> 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.

Yep, we do. Will fix that in v4.

> 
> 
> > +       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;
> > +}  

Reply via email to