On 3/9/22 04:12, Rob Clark wrote: >> +static unsigned long >> +virtio_gpu_gem_shrinker_count_objects(struct shrinker *shrinker, >> + struct shrink_control *sc) >> +{ >> + struct drm_gem_shmem_object *shmem; >> + struct virtio_gpu_device *vgdev; >> + unsigned long count = 0; >> + bool empty = true; >> + >> + vgdev = container_of(shrinker, struct virtio_gpu_device, >> + vgshrinker.shrinker); >> + >> + if (!mutex_trylock(&vgdev->mm_lock)) >> + return 0; > One bit of advice from previously dealing with shrinker and heavy > memory pressure situations (turns out 4GB chromebooks can be pretty > much under *constant* memory pressure): > > You *really* want to make shrinker->count_objects lockless.. and > minimize the lock contention on shrinker->scan_objects (ie. The > problem is you can end up with shrinking going on on all CPU cores in > parallel, you want to not funnel that thru one lock as much as > possible. > > See in particular: > > 25ed38b3ed26 ("drm/msm: Drop mm_lock in scan loop") > cc8a4d5a1bd8 ("drm/msm: Avoid mutex in shrinker_count()") Thank you, I'll take that into account for v2.