Hi, Tim, Tim Chen <tim.c.chen@xxxxxxxxxxxxxxx> writes: > We will only reach the lock initialization code > in alloc_swap_slot_cache when the cpu's swap_slots_cache's slots > have not been allocated and swap_slots_cache has not been initialized > previously. So the lock_initialized check is redundant and unnecessary. > Remove lock_initialized flag from swap_slots_cache to save memory. Is there a race condition with CPU offline/online when preempt is enabled? CPU A CPU B ----- ----- get_swap_page() get cache[B], cache[B]->slots != NULL preempted and moved to CPU A be offlined be onlined alloc_swap_slot_cache() mutex_lock(cache[B]->alloc_lock) mutex_init(cache[B]->alloc_lock) !!! The cache[B]->alloc_lock will be reinitialized when it is still held. Best Regards, Huang, Ying > Reported-by: Wenwei Tao <wenwei.tww@xxxxxxxxxxxxxxx> > Signed-off-by: Tim Chen <tim.c.chen@xxxxxxxxxxxxxxx> > --- > include/linux/swap_slots.h | 1 - > mm/swap_slots.c | 9 ++++----- > 2 files changed, 4 insertions(+), 6 deletions(-) > > diff --git a/include/linux/swap_slots.h b/include/linux/swap_slots.h > index 6ef92d1..a75c30b 100644 > --- a/include/linux/swap_slots.h > +++ b/include/linux/swap_slots.h > @@ -10,7 +10,6 @@ > #define THRESHOLD_DEACTIVATE_SWAP_SLOTS_CACHE (2*SWAP_SLOTS_CACHE_SIZE) > > struct swap_slots_cache { > - bool lock_initialized; > struct mutex alloc_lock; /* protects slots, nr, cur */ > swp_entry_t *slots; > int nr; > diff --git a/mm/swap_slots.c b/mm/swap_slots.c > index 4c5457c..c039e6c 100644 > --- a/mm/swap_slots.c > +++ b/mm/swap_slots.c > @@ -140,11 +140,10 @@ static int alloc_swap_slot_cache(unsigned int cpu) > if (cache->slots || cache->slots_ret) > /* cache already allocated */ > goto out; > - if (!cache->lock_initialized) { > - mutex_init(&cache->alloc_lock); > - spin_lock_init(&cache->free_lock); > - cache->lock_initialized = true; > - } > + > + mutex_init(&cache->alloc_lock); > + spin_lock_init(&cache->free_lock); > + > cache->nr = 0; > cache->cur = 0; > cache->n_ret = 0; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>