On 2025-02-27 22:04:16 [+0900], Sergey Senozhatsky wrote: > On (25/02/27 21:42), Sergey Senozhatsky wrote: > > > ach. Got it. What about > > > > > > | static void zram_slot_lock_init(struct zram *zram, u32 index) > > > | { > > > | static struct lock_class_key __key; > > > | > > > | lockdep_init_map(slot_dep_map(zram, index), > > > | "zram->table[index].lock", > > > | &__key, 0); > > > | } > > > > > > So every lock coming from zram belongs to the same class. Otherwise each > > > lock coming from zram_slot_lock_init() would belong to a different class > > > and for lockdep it would look like they are different locks. But they > > > are used always in the same way. > > > > I see. I thought that they key was "shared" between zram meta table > > entries because the key is per-zram device, which sort of made sense > > (we can have different zram devices in a system - one swap, a bunch > > mounted with various file-systems on them). Yes. So usually you do spin_lock_init() and this creates a key at _this_ very position. So every lock initialized at this position shares the same class/ the same pattern. > So the lock class is registered dynamically for each zram device > > zram_add() > lockdep_register_key(&zram->lock_class); > > and then we use that zram->lock_class to init zram->table entries. > > We unregister the lock_class during each zram device destruction > > zram_remove() > lockdep_unregister_key(&zram->lock_class); > > Does this still put zram->table entries into different lock classes? You shouldn't need to register and unregister the lock_class. What you do should match for instance j_trans_commit_map in fs/jbd2/journal.c or __key in include/linux/rhashtable.h & lib/rhashtable.c. At least based on my understanding so far. Sebastian