[PATCH 0/9] Minor cleanups and improvements to swap freeing code

Kemeng Shi posted 9 patches 11 months ago
There is a newer version of this series
mm/swapfile.c | 173 +++++++++++++++++++++++++-------------------------
1 file changed, 86 insertions(+), 87 deletions(-)
[PATCH 0/9] Minor cleanups and improvements to swap freeing code
Posted by Kemeng Shi 11 months ago
Hi All,
This series contains some cleanups and improvements which are made
during learning swapfile. Here is a summary of the changes:
1. Function nameing improvments.
-Use "put" instead of "free" to name functions which only do actual free
when count drops to zero.
-Use "entry" to name function only frees one swap slot. Use "entries" to
name function could may free multi swap slots within one cluster. Use
"_nr" suffix to name function which could free multi swap slots spanning
cross multi clusters.
2. Eliminate the need to set swap slot to intermediate SWAP_HAS_CACHE
value before do actual free by using swap_entry_range_free()
3. Add helpers swap_entries_put_map() and swap_entries_put_cache() as a
general-purpose routine to free swap entries within a single cluster
which will try batch-remove first and fallback to put eatch entry
indvidually with cluster lock acquired/released only once. By using 
these helpers, we could remove repeated code, levarage batch-remove in
more cases and aoivd to acquire/release cluster lock for each single
swap entry.

Kemeng Shi (9):
  mm: swap: rename __swap_[entry/entries]_free[_locked] to
    swap_[entry/entries]_put[_locked]
  mm: swap: factor out the actual swap entry freeing logic to new helper
  mm: swap: use __swap_entry_free() to free swap entry in
    swap_entry_put_locked()
  mm: swap: remove unneeded VM_BUG_ON(*map != SWAP_HAS_CACHE) in
    swap_entry_range_free()
  mm: swap: use swap_entries_free() drop last 1 flag in
    swap_entries_put_nr()
  mm: swap: drop last SWAP_MAP_SHMEM flag in batch in
    swap_entries_put_nr()
  mm: swap: free each cluster individually in swap_entries_put_map_nr()
  mm: swap: factor out helper to drop cache of entries within a single
    cluster
  mm: swap: replace cluster_swap_free_nr() with
    swap_entries_put_[map/cache]()

 mm/swapfile.c | 173 +++++++++++++++++++++++++-------------------------
 1 file changed, 86 insertions(+), 87 deletions(-)

-- 
2.30.0
Re: [PATCH 0/9] Minor cleanups and improvements to swap freeing code
Posted by Tim Chen 11 months ago
On Fri, 2025-03-14 at 05:05 +0800, Kemeng Shi wrote:
> Hi All,
> This series contains some cleanups and improvements which are made
> during learning swapfile. Here is a summary of the changes:

Nice work.

> 1. Function nameing improvments.
> -Use "put" instead of "free" to name functions which only do actual free
> when count drops to zero.
> -Use "entry" to name function only frees one swap slot. Use "entries" to
> name function could may free multi swap slots within one cluster. Use
> "_nr" suffix to name function which could free multi swap slots spanning
> cross multi clusters.

Will be nice to add some comments in the code about functions with _nr 
crossing the cluster boundaries and those without stay within a cluster. 

> 2. Eliminate the need to set swap slot to intermediate SWAP_HAS_CACHE
> value before do actual free by using swap_entry_range_free()
> 3. Add helpers swap_entries_put_map() and swap_entries_put_cache() as a
> general-purpose routine to free swap entries within a single cluster
> which will try batch-remove first and fallback to put eatch entry
> indvidually with cluster lock acquired/released only once. By using 
> these helpers, we could remove repeated code, levarage batch-remove in
> more cases and aoivd to acquire/release cluster lock for each single
> swap entry.

Wonder if the batching shows up in any swap performance improvement?

Tim

> 
> Kemeng Shi (9):
>   mm: swap: rename __swap_[entry/entries]_free[_locked] to
>     swap_[entry/entries]_put[_locked]
>   mm: swap: factor out the actual swap entry freeing logic to new helper
>   mm: swap: use __swap_entry_free() to free swap entry in
>     swap_entry_put_locked()
>   mm: swap: remove unneeded VM_BUG_ON(*map != SWAP_HAS_CACHE) in
>     swap_entry_range_free()
>   mm: swap: use swap_entries_free() drop last 1 flag in
>     swap_entries_put_nr()
>   mm: swap: drop last SWAP_MAP_SHMEM flag in batch in
>     swap_entries_put_nr()
>   mm: swap: free each cluster individually in swap_entries_put_map_nr()
>   mm: swap: factor out helper to drop cache of entries within a single
>     cluster
>   mm: swap: replace cluster_swap_free_nr() with
>     swap_entries_put_[map/cache]()
> 
>  mm/swapfile.c | 173 +++++++++++++++++++++++++-------------------------
>  1 file changed, 86 insertions(+), 87 deletions(-)
> 
Re: [PATCH 0/9] Minor cleanups and improvements to swap freeing code
Posted by Kemeng Shi 10 months, 4 weeks ago

on 3/15/2025 4:27 AM, Tim Chen wrote:
> On Fri, 2025-03-14 at 05:05 +0800, Kemeng Shi wrote:
>> Hi All,
>> This series contains some cleanups and improvements which are made
>> during learning swapfile. Here is a summary of the changes:
> 
Hello,

> Nice work>
>> 1. Function nameing improvments.
>> -Use "put" instead of "free" to name functions which only do actual free
>> when count drops to zero.
>> -Use "entry" to name function only frees one swap slot. Use "entries" to
>> name function could may free multi swap slots within one cluster. Use
>> "_nr" suffix to name function which could free multi swap slots spanning
>> cross multi clusters.
> 
> Will be nice to add some comments in the code about functions with _nr 
> crossing the cluster boundaries and those without stay within a cluster. 
Thanks for reviewing and all advises to this series. Will improve in next
version.
> 
>> 2. Eliminate the need to set swap slot to intermediate SWAP_HAS_CACHE
>> value before do actual free by using swap_entry_range_free()
>> 3. Add helpers swap_entries_put_map() and swap_entries_put_cache() as a
>> general-purpose routine to free swap entries within a single cluster
>> which will try batch-remove first and fallback to put eatch entry
>> indvidually with cluster lock acquired/released only once. By using 
>> these helpers, we could remove repeated code, levarage batch-remove in
>> more cases and aoivd to acquire/release cluster lock for each single
>> swap entry.
> 
> Wonder if the batching shows up in any swap performance improvement
I have a simple test which is roughly as following:
#define SIZE 1024*1024*1024
#define HP_SIZE 2 * 1024 * 1024
p = mmap(...,SIZE,...)
madvise(p, SIZE, MADV_HUGEPAGE)
memset(p, 0x11, SIZE); /* alloc page */
madvise(p, SIZE, MADV_PAGEOUT); /* swap out */
gettimeofday(&tv_b, NULL);
for (j = 0; j < SIZE; j+= HP_SIZE) {
	((char *)p)[j] = 0; /* swap in and free swap entry */
}

The time for swap-in and free swap entry shows no significant change.
Since this is more of a cleanup series, no further testing has been
conducted yet. I would appreciate it if you have any additional test
cases that could benefit from batching.

Thank,
Kemeng
.
> 
> Tim
> 
>>
>> Kemeng Shi (9):
>>   mm: swap: rename __swap_[entry/entries]_free[_locked] to
>>     swap_[entry/entries]_put[_locked]
>>   mm: swap: factor out the actual swap entry freeing logic to new helper
>>   mm: swap: use __swap_entry_free() to free swap entry in
>>     swap_entry_put_locked()
>>   mm: swap: remove unneeded VM_BUG_ON(*map != SWAP_HAS_CACHE) in
>>     swap_entry_range_free()
>>   mm: swap: use swap_entries_free() drop last 1 flag in
>>     swap_entries_put_nr()
>>   mm: swap: drop last SWAP_MAP_SHMEM flag in batch in
>>     swap_entries_put_nr()
>>   mm: swap: free each cluster individually in swap_entries_put_map_nr()
>>   mm: swap: factor out helper to drop cache of entries within a single
>>     cluster
>>   mm: swap: replace cluster_swap_free_nr() with
>>     swap_entries_put_[map/cache]()
>>
>>  mm/swapfile.c | 173 +++++++++++++++++++++++++-------------------------
>>  1 file changed, 86 insertions(+), 87 deletions(-)
>>
> 
>