Re: [PATCH -mm -v4 04/21] mm, THP, swap: Support PMD swap mapping in swapcache_free_cluster()

From: Dave Hansen
Date: Tue Jul 10 2018 - 09:54:54 EST


On 07/09/2018 11:53 PM, Huang, Ying wrote:
> Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> writes:
>>> +#ifdef CONFIG_THP_SWAP
>>> +static inline int cluster_swapcount(struct swap_cluster_info *ci)
>>> +{
>>> + if (!ci || !cluster_is_huge(ci))
>>> + return 0;
>>> +
>>> + return cluster_count(ci) - SWAPFILE_CLUSTER;
>>> +}
>>> +#else
>>> +#define cluster_swapcount(ci) 0
>>> +#endif
>>
>> Dumb questions, round 2: On a CONFIG_THP_SWAP=n build, presumably,
>> cluster_is_huge()=0 always, so cluster_swapout() always returns 0. Right?
>>
>> So, why the #ifdef?
>
> #ifdef here is to reduce the code size for !CONFIG_THP_SWAP.

I'd just remove the !CONFIG_THP_SWAP version entirely.

>>> @@ -1288,24 +1301,30 @@ static void swapcache_free_cluster(swp_entry_t entry)
>>>
>>> ci = lock_cluster(si, offset);
>>> VM_BUG_ON(!cluster_is_huge(ci));
>>> + VM_BUG_ON(!is_cluster_offset(offset));
>>> + VM_BUG_ON(cluster_count(ci) < SWAPFILE_CLUSTER);
>>> map = si->swap_map + offset;
>>> - for (i = 0; i < SWAPFILE_CLUSTER; i++) {
>>> - val = map[i];
>>> - VM_BUG_ON(!(val & SWAP_HAS_CACHE));
>>> - if (val == SWAP_HAS_CACHE)
>>> - free_entries++;
>>> + if (!cluster_swapcount(ci)) {
>>> + for (i = 0; i < SWAPFILE_CLUSTER; i++) {
>>> + val = map[i];
>>> + VM_BUG_ON(!(val & SWAP_HAS_CACHE));
>>> + if (val == SWAP_HAS_CACHE)
>>> + free_entries++;
>>> + }
>>> + if (free_entries != SWAPFILE_CLUSTER)
>>> + cluster_clear_huge(ci);
>>> }
>>
>> Also, I'll point out that cluster_swapcount() continues the horrific
>> naming of cluster_couunt(), not saying what the count is *of*. The
>> return value doesn't help much:
>>
>> return cluster_count(ci) - SWAPFILE_CLUSTER;
>
> We have page_swapcount() for page, swp_swapcount() for swap entry.
> cluster_swapcount() tries to mimic them for swap cluster. But I am not
> good at naming in general. What's your suggestion?

I don't have a suggestion because I haven't the foggiest idea what it is
doing. :)

Is it the number of instantiated swap cache pages that are referring to
this cluster? Is it just huge pages? Huge and small? One refcount per
huge page, or 512?