On Fri, Jul 29, 2022 at 8:27 AM Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx> wrote: > > On 7/26/22 20:50, Rob Clark wrote: > > +/** > > + * drm_gem_lru_move_tail_locked - move the object to the tail of the LRU > > + * > > + * If the object is already in this LRU it will be moved to the > > + * tail. Otherwise it will be removed from whichever other LRU > > + * it is in (if any) and moved into this LRU. > > + * > > + * Call with LRU lock held. > > + * > > + * @lru: The LRU to move the object into. > > + * @obj: The GEM object to move into this LRU > > + */ > > +void > > +drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_object *obj) > > +{ > > + lockdep_assert_held_once(lru->lock); > > + > > + if (obj->lru) > > + lru_remove(obj); > > The obj->lru also needs to be locked if lru != obj->lru, isn't it? And > then we should add lockdep_assert_held_once(obj->lru->lock). > It is expected (mentioned in comment on drm_gem_lru::lock) that all lru's are sharing the same lock. Possibly that could be made more obvious? Having per-lru locks wouldn't really work for accessing the single drm_gem_object::lru_node. BR, -R