On 02/25/25 at 02:02am, Kairui Song wrote: > From: Kairui Song <kasong@xxxxxxxxxxx> > > The counter update before allocation design was useful to avoid > unnecessary scan when device is full, so it will abort early if the > counter indicates the device is full. But that is an uncommon case, > and now scanning of a full device is very fast, so the up-front update > is not helpful any more. > > Remove it and simplify the slot allocation logic. > > Signed-off-by: Kairui Song <kasong@xxxxxxxxxxx> > --- > mm/swapfile.c | 18 ++---------------- > 1 file changed, 2 insertions(+), 16 deletions(-) Reviewed-by: Baoquan He <bhe@xxxxxxxxxx> > > diff --git a/mm/swapfile.c b/mm/swapfile.c > index 6f2de59c6355..db836670c334 100644 > --- a/mm/swapfile.c > +++ b/mm/swapfile.c > @@ -1201,22 +1201,10 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_order) > int order = swap_entry_order(entry_order); > unsigned long size = 1 << order; > struct swap_info_struct *si, *next; > - long avail_pgs; > int n_ret = 0; > int node; > > spin_lock(&swap_avail_lock); > - > - avail_pgs = atomic_long_read(&nr_swap_pages) / size; > - if (avail_pgs <= 0) { > - spin_unlock(&swap_avail_lock); > - goto noswap; > - } > - > - n_goal = min3((long)n_goal, (long)SWAP_BATCH, avail_pgs); > - > - atomic_long_sub(n_goal * size, &nr_swap_pages); > - > start_over: > node = numa_node_id(); > plist_for_each_entry_safe(si, next, &swap_avail_heads[node], avail_lists[node]) { > @@ -1250,10 +1238,8 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_order) > spin_unlock(&swap_avail_lock); > > check_out: > - if (n_ret < n_goal) > - atomic_long_add((long)(n_goal - n_ret) * size, > - &nr_swap_pages); > -noswap: > + atomic_long_sub(n_ret * size, &nr_swap_pages); > + > return n_ret; > } > > -- > 2.48.1 >