[PATCH v1] sched: there is no need to call switch_mm_irqs_off when sched between two user thread.

Ming Wang posted 1 patch 3 years, 11 months ago
kernel/sched/core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH v1] sched: there is no need to call switch_mm_irqs_off when sched between two user thread.
Posted by Ming Wang 3 years, 11 months ago
When condition (prev->active_mm == next->mm && !prev->mm) is met,
the situation is as follows:

user thread -> user thread

There is not need switch_mm when sched between two user thread.
Because they share the mm_struct. This can provide better
performance when testing UnixBench.

Signed-off-by: Ming Wang <wangming01@loongson.cn>
---
 kernel/sched/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 696c649..9d7f6fb 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5099,7 +5099,8 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)
 		 * case 'prev->active_mm == next->mm' through
 		 * finish_task_switch()'s mmdrop().
 		 */
-		switch_mm_irqs_off(prev->active_mm, next->mm, next);
+		if ((prev->active_mm != next->mm) || (!prev->mm))
+			switch_mm_irqs_off(prev->active_mm, next->mm, next);
 
 		if (!prev->mm) {                        // from kernel
 			/* will mmdrop() in finish_task_switch(). */
-- 
1.8.3.1
Re: [PATCH v1] sched: there is no need to call switch_mm_irqs_off when sched between two user thread.
Posted by Peter Zijlstra 3 years, 11 months ago
On Tue, May 31, 2022 at 07:56:41PM +0800, Ming Wang wrote:
> When condition (prev->active_mm == next->mm && !prev->mm) is met,
> the situation is as follows:
> 
> user thread -> user thread
> 
> There is not need switch_mm when sched between two user thread.
> Because they share the mm_struct. This can provide better
> performance when testing UnixBench.
> 
> Signed-off-by: Ming Wang <wangming01@loongson.cn>
> ---
>  kernel/sched/core.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 696c649..9d7f6fb 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -5099,7 +5099,8 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)
>  		 * case 'prev->active_mm == next->mm' through
>  		 * finish_task_switch()'s mmdrop().
>  		 */
> -		switch_mm_irqs_off(prev->active_mm, next->mm, next);
> +		if ((prev->active_mm != next->mm) || (!prev->mm))
> +			switch_mm_irqs_off(prev->active_mm, next->mm, next);

I think this needs to be inside switch_mm(). Architectures are free to
play silly games with what the current active mm is (and iirc x86
actually does this).
Re: [PATCH v1] sched: there is no need to call switch_mm_irqs_off when sched between two user thread.
Posted by Ming Wang 3 years, 11 months ago
On 2022/5/31 下午10:46, Peter Zijlstra wrote:
> On Tue, May 31, 2022 at 07:56:41PM +0800, Ming Wang wrote:
>> When condition (prev->active_mm == next->mm && !prev->mm) is met,
>> the situation is as follows:
>>
>> user thread -> user thread
>>
>> There is not need switch_mm when sched between two user thread.
>> Because they share the mm_struct. This can provide better
>> performance when testing UnixBench.
>>
>> Signed-off-by: Ming Wang <wangming01@loongson.cn>
>> ---
>>   kernel/sched/core.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
>> index 696c649..9d7f6fb 100644
>> --- a/kernel/sched/core.c
>> +++ b/kernel/sched/core.c
>> @@ -5099,7 +5099,8 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)
>>   		 * case 'prev->active_mm == next->mm' through
>>   		 * finish_task_switch()'s mmdrop().
>>   		 */
>> -		switch_mm_irqs_off(prev->active_mm, next->mm, next);
>> +		if ((prev->active_mm != next->mm) || (!prev->mm))
>> +			switch_mm_irqs_off(prev->active_mm, next->mm, next);
> I think this needs to be inside switch_mm(). Architectures are free to
> play silly games with what the current active mm is (and iirc x86
> actually does this).
ok, thanks! And I will do it in architecture code.