On 07/02/2023 03.47, Javier Martinez Canillas wrote: > Hello Lina, > > On 2/5/23 13:51, Asahi Lina wrote: >> Other functions touching shmem->sgt take the pages lock, so do that here >> too. drm_gem_shmem_get_pages() & co take the same lock, so move to the >> _locked() variants to avoid recursive locking. >> >> Discovered while auditing locking to write the Rust abstractions. >> >> Fixes: 2194a63a818d ("drm: Add library for shmem backed GEM objects") >> Fixes: 4fa3d66f132b ("drm/shmem: Do dma_unmap_sg before purging pages") >> Signed-off-by: Asahi Lina <lina@xxxxxxxxxxxxx> >> --- > > Good catch. The patch looks good to me. > > Reviewed-by: Javier Martinez Canillas <javierm@xxxxxxxxxx> > > What about drm_gem_shmem_free() BTW, I believe that the helper should also > grab the lock before unmap / free the sgtable? That's called from driver free callbacks, so it should only be called when there are no other users left and the refcount is zero, right? If there's anyone else racing it I think we have bigger problems than the pages lock at that point, since the last thing it does is `kfree(shmem);` ^^ (In Rust terms this is equivalent to the Drop trait, which takes a mutable/exclusive reference, which means no other reference to the object can exist at that point, so no races are possible. And in fact in my Rust abstraction I trigger a drop of the Rust object embedded in the shmem object before calling drm_gem_shmem_free(), so if this invariant doesn't hold that code would be wrong too!) ~~ Lina