| From: Mike Galbraith <umgwanakikbuti@gmail.com> |
| Date: Thu, 31 Mar 2016 04:08:28 +0200 |
| Subject: [PATCH] drivers/block/zram: Replace bit spinlocks with rtmutex |
| for -rt |
| |
| They're nondeterministic, and lead to ___might_sleep() splats in -rt. |
| OTOH, they're a lot less wasteful than an rtmutex per page. |
| |
| Signed-off-by: Mike Galbraith <umgwanakikbuti@gmail.com> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| drivers/block/zram/zram_drv.c | 36 ++++++++++++++++++++++++++++++++++++ |
| drivers/block/zram/zram_drv.h | 1 + |
| 2 files changed, 37 insertions(+) |
| |
| --- a/drivers/block/zram/zram_drv.c |
| +++ b/drivers/block/zram/zram_drv.c |
| @@ -55,6 +55,40 @@ static void zram_free_page(struct zram * |
| static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, |
| u32 index, int offset, struct bio *bio); |
| |
| +#ifdef CONFIG_PREEMPT_RT_BASE |
| +static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) |
| +{ |
| + size_t index; |
| + |
| + for (index = 0; index < num_pages; index++) |
| + spin_lock_init(&zram->table[index].lock); |
| +} |
| + |
| +static int zram_slot_trylock(struct zram *zram, u32 index) |
| +{ |
| + int ret; |
| + |
| + ret = spin_trylock(&zram->table[index].lock); |
| + if (ret) |
| + __set_bit(ZRAM_LOCK, &zram->table[index].flags); |
| + return ret; |
| +} |
| + |
| +static void zram_slot_lock(struct zram *zram, u32 index) |
| +{ |
| + spin_lock(&zram->table[index].lock); |
| + __set_bit(ZRAM_LOCK, &zram->table[index].flags); |
| +} |
| + |
| +static void zram_slot_unlock(struct zram *zram, u32 index) |
| +{ |
| + __clear_bit(ZRAM_LOCK, &zram->table[index].flags); |
| + spin_unlock(&zram->table[index].lock); |
| +} |
| + |
| +#else |
| + |
| +static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } |
| |
| static int zram_slot_trylock(struct zram *zram, u32 index) |
| { |
| @@ -70,6 +104,7 @@ static void zram_slot_unlock(struct zram |
| { |
| bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags); |
| } |
| +#endif |
| |
| static inline bool init_done(struct zram *zram) |
| { |
| @@ -1154,6 +1189,7 @@ static bool zram_meta_alloc(struct zram |
| |
| if (!huge_class_size) |
| huge_class_size = zs_huge_class_size(zram->mem_pool); |
| + zram_meta_init_table_locks(zram, num_pages); |
| return true; |
| } |
| |
| --- a/drivers/block/zram/zram_drv.h |
| +++ b/drivers/block/zram/zram_drv.h |
| @@ -63,6 +63,7 @@ struct zram_table_entry { |
| unsigned long element; |
| }; |
| unsigned long flags; |
| + spinlock_t lock; |
| #ifdef CONFIG_ZRAM_MEMORY_TRACKING |
| ktime_t ac_time; |
| #endif |