linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] mm/swapfile.c: found_free could be represented by (tmp < max)
@ 2020-04-19  1:39 Wei Yang
  2020-04-19  1:39 ` [PATCH 2/4] mm/swapfile.c: tmp is always smaller than max Wei Yang
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Wei Yang @ 2020-04-19  1:39 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, linux-kernel, tim.c.chen, ying.huang, Wei Yang

This is not necessary to use the variable found_free to record the
status. Just check tmp and max is enough.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 mm/swapfile.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index c457f3be6944..654bad5173bc 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -601,7 +601,6 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
 {
 	struct percpu_cluster *cluster;
 	struct swap_cluster_info *ci;
-	bool found_free;
 	unsigned long tmp, max;
 
 new_cluster:
@@ -623,8 +622,6 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
 			return false;
 	}
 
-	found_free = false;
-
 	/*
 	 * Other CPUs can use our cluster if they can't find a free cluster,
 	 * check if there is still free entry in the cluster
@@ -638,21 +635,19 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
 	}
 	ci = lock_cluster(si, tmp);
 	while (tmp < max) {
-		if (!si->swap_map[tmp]) {
-			found_free = true;
+		if (!si->swap_map[tmp])
 			break;
-		}
 		tmp++;
 	}
 	unlock_cluster(ci);
-	if (!found_free) {
+	if (tmp >= max) {
 		cluster_set_null(&cluster->index);
 		goto new_cluster;
 	}
 	cluster->next = tmp + 1;
 	*offset = tmp;
 	*scan_base = tmp;
-	return found_free;
+	return tmp < max;
 }
 
 static void __del_from_avail_list(struct swap_info_struct *p)
-- 
2.23.0



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] mm/swapfile.c: tmp is always smaller than max
  2020-04-19  1:39 [PATCH 1/4] mm/swapfile.c: found_free could be represented by (tmp < max) Wei Yang
@ 2020-04-19  1:39 ` Wei Yang
  2020-04-19  1:39 ` [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly Wei Yang
       [not found] ` <20200419013921.14390-3-richard.weiyang@gmail.com>
  2 siblings, 0 replies; 8+ messages in thread
From: Wei Yang @ 2020-04-19  1:39 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, linux-kernel, tim.c.chen, ying.huang, Wei Yang

If tmp is bigger or equal to max, we would jump to new_cluster.

Return true directly.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 mm/swapfile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index 654bad5173bc..3aae700f9931 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -647,7 +647,7 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
 	cluster->next = tmp + 1;
 	*offset = tmp;
 	*scan_base = tmp;
-	return tmp < max;
+	return true;
 }
 
 static void __del_from_avail_list(struct swap_info_struct *p)
-- 
2.23.0



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly
  2020-04-19  1:39 [PATCH 1/4] mm/swapfile.c: found_free could be represented by (tmp < max) Wei Yang
  2020-04-19  1:39 ` [PATCH 2/4] mm/swapfile.c: tmp is always smaller than max Wei Yang
@ 2020-04-19  1:39 ` Wei Yang
  2020-04-20  1:41   ` Huang, Ying
       [not found] ` <20200419013921.14390-3-richard.weiyang@gmail.com>
  2 siblings, 1 reply; 8+ messages in thread
From: Wei Yang @ 2020-04-19  1:39 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, linux-kernel, tim.c.chen, ying.huang, Wei Yang

Each time it needs jump to new_cluster, it is sure current
percpu_cluster is null.

Move the new_cluster to check free_clusters directly.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 mm/swapfile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index 07b0bc095411..78e92ff14c79 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -603,9 +603,9 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
 	struct swap_cluster_info *ci;
 	unsigned long tmp, max;
 
-new_cluster:
 	cluster = this_cpu_ptr(si->percpu_cluster);
 	if (cluster_is_null(&cluster->index)) {
+new_cluster:
 		if (!cluster_list_empty(&si->free_clusters)) {
 			cluster->index = si->free_clusters.head;
 			cluster->next = cluster_next(&cluster->index) *
-- 
2.23.0



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] mm/swapfile.c: compare tmp and max after trying to iterate on swap_map
       [not found] ` <20200419013921.14390-3-richard.weiyang@gmail.com>
@ 2020-04-20  1:03   ` Huang, Ying
  2020-04-20 21:37     ` Wei Yang
  0 siblings, 1 reply; 8+ messages in thread
From: Huang, Ying @ 2020-04-20  1:03 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, linux-mm, linux-kernel, tim.c.chen

Wei Yang <richard.weiyang@gmail.com> writes:

> There are two duplicate code to handle the case when there is no
> available swap entry. Just let the code go through and do the check at
> second place.
>
> No functional change is expected.
>
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> ---
>  mm/swapfile.c | 4 ----
>  1 file changed, 4 deletions(-)
>
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index 3aae700f9931..07b0bc095411 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -629,10 +629,6 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
>  	tmp = cluster->next;
>  	max = min_t(unsigned long, si->max,
>  		    (cluster_next(&cluster->index) + 1) * SWAPFILE_CLUSTER);
> -	if (tmp >= max) {
> -		cluster_set_null(&cluster->index);
> -		goto new_cluster;
> -	}

The code is to avoid to acquire the cluster lock unnecessarily.  So I think
we should keep this.

Best Regards,
Huang, Ying

>  	ci = lock_cluster(si, tmp);
>  	while (tmp < max) {
>  		if (!si->swap_map[tmp])


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly
  2020-04-19  1:39 ` [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly Wei Yang
@ 2020-04-20  1:41   ` Huang, Ying
  2020-04-20 21:45     ` Wei Yang
  0 siblings, 1 reply; 8+ messages in thread
From: Huang, Ying @ 2020-04-20  1:41 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, linux-mm, linux-kernel, tim.c.chen

Wei Yang <richard.weiyang@gmail.com> writes:

> Each time it needs jump to new_cluster, it is sure current
> percpu_cluster is null.
>
> Move the new_cluster to check free_clusters directly.
>
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> ---
>  mm/swapfile.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index 07b0bc095411..78e92ff14c79 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -603,9 +603,9 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
>  	struct swap_cluster_info *ci;
>  	unsigned long tmp, max;
>  
> -new_cluster:
>  	cluster = this_cpu_ptr(si->percpu_cluster);
>  	if (cluster_is_null(&cluster->index)) {
> +new_cluster:
>  		if (!cluster_list_empty(&si->free_clusters)) {
>  			cluster->index = si->free_clusters.head;
>  			cluster->next = cluster_next(&cluster->index) *

In swap_do_scheduled_discard(), we will unlock si->lock, so the
percpu_cluster may be changed after we releasing the lock.  Or the
current thread may be moved to a different CPU.

Best Regards,
Huang, Ying


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] mm/swapfile.c: compare tmp and max after trying to iterate on swap_map
  2020-04-20  1:03   ` [PATCH 3/4] mm/swapfile.c: compare tmp and max after trying to iterate on swap_map Huang, Ying
@ 2020-04-20 21:37     ` Wei Yang
  2020-04-20 23:51       ` Huang, Ying
  0 siblings, 1 reply; 8+ messages in thread
From: Wei Yang @ 2020-04-20 21:37 UTC (permalink / raw)
  To: Huang, Ying; +Cc: Wei Yang, akpm, linux-mm, linux-kernel, tim.c.chen

On Mon, Apr 20, 2020 at 09:03:43AM +0800, Huang, Ying wrote:
>Wei Yang <richard.weiyang@gmail.com> writes:
>
>> There are two duplicate code to handle the case when there is no
>> available swap entry. Just let the code go through and do the check at
>> second place.
>>
>> No functional change is expected.
>>
>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>> ---
>>  mm/swapfile.c | 4 ----
>>  1 file changed, 4 deletions(-)
>>
>> diff --git a/mm/swapfile.c b/mm/swapfile.c
>> index 3aae700f9931..07b0bc095411 100644
>> --- a/mm/swapfile.c
>> +++ b/mm/swapfile.c
>> @@ -629,10 +629,6 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
>>  	tmp = cluster->next;
>>  	max = min_t(unsigned long, si->max,
>>  		    (cluster_next(&cluster->index) + 1) * SWAPFILE_CLUSTER);
>> -	if (tmp >= max) {
>> -		cluster_set_null(&cluster->index);
>> -		goto new_cluster;
>> -	}
>
>The code is to avoid to acquire the cluster lock unnecessarily.  So I think
>we should keep this.
>

If you really want to avoid the lock, my suggestion is to add:

  if (tmp < max) {
      ci = lock_cluster(si, tmp);
          while (tmp < max) {
	  ...
	  }
      unlock_cluster(ci);
  }

Instead of do the similar thing twice.

>Best Regards,
>Huang, Ying
>
>>  	ci = lock_cluster(si, tmp);
>>  	while (tmp < max) {
>>  		if (!si->swap_map[tmp])

-- 
Wei Yang
Help you, Help me


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly
  2020-04-20  1:41   ` Huang, Ying
@ 2020-04-20 21:45     ` Wei Yang
  0 siblings, 0 replies; 8+ messages in thread
From: Wei Yang @ 2020-04-20 21:45 UTC (permalink / raw)
  To: Huang, Ying; +Cc: Wei Yang, akpm, linux-mm, linux-kernel, tim.c.chen

On Mon, Apr 20, 2020 at 09:41:43AM +0800, Huang, Ying wrote:
>Wei Yang <richard.weiyang@gmail.com> writes:
>
>> Each time it needs jump to new_cluster, it is sure current
>> percpu_cluster is null.
>>
>> Move the new_cluster to check free_clusters directly.
>>
>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>> ---
>>  mm/swapfile.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/mm/swapfile.c b/mm/swapfile.c
>> index 07b0bc095411..78e92ff14c79 100644
>> --- a/mm/swapfile.c
>> +++ b/mm/swapfile.c
>> @@ -603,9 +603,9 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
>>  	struct swap_cluster_info *ci;
>>  	unsigned long tmp, max;
>>  
>> -new_cluster:
>>  	cluster = this_cpu_ptr(si->percpu_cluster);
>>  	if (cluster_is_null(&cluster->index)) {
>> +new_cluster:
>>  		if (!cluster_list_empty(&si->free_clusters)) {
>>  			cluster->index = si->free_clusters.head;
>>  			cluster->next = cluster_next(&cluster->index) *
>
>In swap_do_scheduled_discard(), we will unlock si->lock, so the
>percpu_cluster may be changed after we releasing the lock.  Or the
>current thread may be moved to a different CPU.

Thanks, you are right.

>
>Best Regards,
>Huang, Ying

-- 
Wei Yang
Help you, Help me


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] mm/swapfile.c: compare tmp and max after trying to iterate on swap_map
  2020-04-20 21:37     ` Wei Yang
@ 2020-04-20 23:51       ` Huang, Ying
  0 siblings, 0 replies; 8+ messages in thread
From: Huang, Ying @ 2020-04-20 23:51 UTC (permalink / raw)
  To: Wei Yang; +Cc: akpm, linux-mm, linux-kernel, tim.c.chen

Wei Yang <richard.weiyang@gmail.com> writes:

> On Mon, Apr 20, 2020 at 09:03:43AM +0800, Huang, Ying wrote:
>>Wei Yang <richard.weiyang@gmail.com> writes:
>>
>>> There are two duplicate code to handle the case when there is no
>>> available swap entry. Just let the code go through and do the check at
>>> second place.
>>>
>>> No functional change is expected.
>>>
>>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>>> ---
>>>  mm/swapfile.c | 4 ----
>>>  1 file changed, 4 deletions(-)
>>>
>>> diff --git a/mm/swapfile.c b/mm/swapfile.c
>>> index 3aae700f9931..07b0bc095411 100644
>>> --- a/mm/swapfile.c
>>> +++ b/mm/swapfile.c
>>> @@ -629,10 +629,6 @@ static bool scan_swap_map_try_ssd_cluster(struct swap_info_struct *si,
>>>  	tmp = cluster->next;
>>>  	max = min_t(unsigned long, si->max,
>>>  		    (cluster_next(&cluster->index) + 1) * SWAPFILE_CLUSTER);
>>> -	if (tmp >= max) {
>>> -		cluster_set_null(&cluster->index);
>>> -		goto new_cluster;
>>> -	}
>>
>>The code is to avoid to acquire the cluster lock unnecessarily.  So I think
>>we should keep this.
>>
>
> If you really want to avoid the lock, my suggestion is to add:
>
>   if (tmp < max) {
>       ci = lock_cluster(si, tmp);
>           while (tmp < max) {
> 	  ...
> 	  }
>       unlock_cluster(ci);
>   }
>
> Instead of do the similar thing twice.

This is a coding style problem.  The original code is common to avoid
too many nested code block.  But in this case, I think both works.

Best Regards,
Huang, Ying

>>Best Regards,
>>Huang, Ying
>>
>>>  	ci = lock_cluster(si, tmp);
>>>  	while (tmp < max) {
>>>  		if (!si->swap_map[tmp])


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-04-20 23:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-19  1:39 [PATCH 1/4] mm/swapfile.c: found_free could be represented by (tmp < max) Wei Yang
2020-04-19  1:39 ` [PATCH 2/4] mm/swapfile.c: tmp is always smaller than max Wei Yang
2020-04-19  1:39 ` [PATCH 4/4] mm/swapfile.c: move new_cluster to check free_clusters directly Wei Yang
2020-04-20  1:41   ` Huang, Ying
2020-04-20 21:45     ` Wei Yang
     [not found] ` <20200419013921.14390-3-richard.weiyang@gmail.com>
2020-04-20  1:03   ` [PATCH 3/4] mm/swapfile.c: compare tmp and max after trying to iterate on swap_map Huang, Ying
2020-04-20 21:37     ` Wei Yang
2020-04-20 23:51       ` Huang, Ying

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).