On Wed, 12 Feb 2025 15:26:59 +0900 Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> wrote: > Concurrent modifications of meta table entries is now handled > by per-entry spin-lock. This has a number of shortcomings. > > First, this imposes atomic requirements on compression backends. > zram can call both zcomp_compress() and zcomp_decompress() under > entry spin-lock, which implies that we can use only compression > algorithms that don't schedule/sleep/wait during compression and > decompression. This, for instance, makes it impossible to use > some of the ASYNC compression algorithms (H/W compression, etc.) > implementations. > > Second, this can potentially trigger watchdogs. For example, > entry re-compression with secondary algorithms is performed > under entry spin-lock. Given that we chain secondary > compression algorithms and that some of them can be configured > for best compression ratio (and worst compression speed) zram > can stay under spin-lock for quite some time. > > Having a per-entry mutex (or, for instance, a rw-semaphore) > significantly increases sizeof() of each entry and hence the > meta table. Therefore entry locking returns back to bit > locking, as before, however, this time also preempt-rt friendly, > because if waits-on-bit instead of spinning-on-bit. Lock owners > are also now permitted to schedule, which is a first step on the > path of making zram non-atomic. > > ... > > -static int zram_slot_trylock(struct zram *zram, u32 index) > +static void zram_slot_lock_init(struct zram *zram, u32 index) > { > - return spin_trylock(&zram->table[index].lock); > +#ifdef CONFIG_DEBUG_LOCK_ALLOC > + lockdep_init_map(&zram->table[index].lockdep_map, "zram-entry->lock", > + &zram->table_lockdep_key, 0); > +#endif > +} > + > > ... > > +#ifdef CONFIG_DEBUG_LOCK_ALLOC > + lockdep_register_key(&zram->table_lockdep_key); > +#endif > + Please check whether all the ifdefs are needed - some of these things have CONFIG_LOCKDEP=n stubs.