* when/how is the schedule() function actually called?
@ 2023-12-08 16:16 Dawei Li
2023-12-08 17:44 ` Valdis Klētnieks
0 siblings, 1 reply; 7+ messages in thread
From: Dawei Li @ 2023-12-08 16:16 UTC (permalink / raw)
To: kernelnewbies
Greetings!
I am reading several resources regarding the linux kernel scheduling
(in kernel 2.6.34).
There seems to be the periodic scheduler (tick_periodic()), which
invokes the scheduler_tick() function, then the entity_tick()
function, and then the resched_task() function. However, eventually,
the resched_task() function doesn't invoke the schedule() function; it
only invokes the set_tsk_need_resched() function. So, it is only
setting the need_resched flag.
My question is, when/how is the schedule() function actually called?
Also, I notice that at many locations in the code, when there is the
need to do a scheduling, the code is just setting the need_resched
flag. Same question: when/how is the schedule() function actually
called?
(Although I am using the 2.6.34 version, I believe the question is generally
applicable to any kernel version.)
Not sure if this list is still active. Appreciate any response.
Thanks!
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-08 16:16 when/how is the schedule() function actually called? Dawei Li
@ 2023-12-08 17:44 ` Valdis Klētnieks
2023-12-08 18:21 ` Dawei Li
0 siblings, 1 reply; 7+ messages in thread
From: Valdis Klētnieks @ 2023-12-08 17:44 UTC (permalink / raw)
To: Dawei Li; +Cc: kernelnewbies
On Sat, 09 Dec 2023 00:16:32 +0800, Dawei Li said:
> Greetings!
> (Although I am using the 2.6.34 version, I believe the question is generally
> applicable to any kernel version.)
That is, in general, a bad assumption when you are looking at kernel versions
old enough that they count as digital archaeology....
[/usr/src/linux-next] git show v2.6.34
tag v2.6.34
Tagger: Linus Torvalds <torvalds@linux-foundation.org>
Date: Sun May 16 14:17:44 2010 -0700
[/usr/src/linux-next] git diff --shortstat v2.6.34..next-20231205
96965 files changed, 32056985 insertions(+), 7606202 deletions(-)
Given that next-20231205 has just over 33 million lines of code, we're well
into territory where there's a vanishing small percentage of code still
remaining unchanged from 2010.
And yes, that means that even basic functions schedule() and friends have been
reworked in he past decade and a half....
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-08 17:44 ` Valdis Klētnieks
@ 2023-12-08 18:21 ` Dawei Li
2023-12-08 19:10 ` Billie Alsup (balsup)
2023-12-08 19:47 ` iso m
0 siblings, 2 replies; 7+ messages in thread
From: Dawei Li @ 2023-12-08 18:21 UTC (permalink / raw)
To: Valdis Klētnieks; +Cc: kernelnewbies
[-- Attachment #1.1: Type: text/plain, Size: 2187 bytes --]
Hi Valdis,
Thanks for getting back to me!
I should've looked into newer versions. (Was looking at 2.6.34 because the
latest book I have on linux kernel, Linux
Kernel Development, 3rd Edition by Robert Love, is based on that version.)
I do have the same question for the latest version.
Here:
https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L5632
the scheduler_tick() is calling curr->sched_class->task_tick(rq, curr, 0);
https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L5651
This is calling entity_tick(),
https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/fair.c#L5447
and then resched_curr(),
https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L1040
As the comment says, resched_curr() is still just setting the need_resched
flag on a uniprocessor.
It is not calling the schedule() function.
When/how is the schedule() function actually called?
Appreciate any explanation/guidance on this!
Thanks!
On Sat, Dec 9, 2023 at 1:45 AM Valdis Klētnieks <valdis.kletnieks@vt.edu>
wrote:
> On Sat, 09 Dec 2023 00:16:32 +0800, Dawei Li said:
> > Greetings!
>
> > (Although I am using the 2.6.34 version, I believe the question is
> generally
> > applicable to any kernel version.)
>
> That is, in general, a bad assumption when you are looking at kernel
> versions
> old enough that they count as digital archaeology....
>
> [/usr/src/linux-next] git show v2.6.34
> tag v2.6.34
> Tagger: Linus Torvalds <torvalds@linux-foundation.org>
> Date: Sun May 16 14:17:44 2010 -0700
> [/usr/src/linux-next] git diff --shortstat v2.6.34..next-20231205
> 96965 files changed, 32056985 insertions(+), 7606202 deletions(-)
>
> Given that next-20231205 has just over 33 million lines of code, we're well
> into territory where there's a vanishing small percentage of code still
> remaining unchanged from 2010.
>
> And yes, that means that even basic functions schedule() and friends have
> been
> reworked in he past decade and a half....
>
>
[-- Attachment #1.2: Type: text/html, Size: 3407 bytes --]
[-- Attachment #2: Type: text/plain, Size: 170 bytes --]
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-08 18:21 ` Dawei Li
@ 2023-12-08 19:10 ` Billie Alsup (balsup)
2023-12-10 16:59 ` Dawei Li
2023-12-08 19:47 ` iso m
1 sibling, 1 reply; 7+ messages in thread
From: Billie Alsup (balsup) @ 2023-12-08 19:10 UTC (permalink / raw)
To: Dawei Li, Valdis Klētnieks; +Cc: kernelnewbies
>From: Dawei Li <daweilics@gmail.com>
>When/how is the schedule() function actually called?
I vaguely recall the actual switch taking place at the end of an interrupt,
and/or during the return from a syscall, or on explicit request (e.g. yield).
Look at __schedule and context_switch functions.
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-08 18:21 ` Dawei Li
2023-12-08 19:10 ` Billie Alsup (balsup)
@ 2023-12-08 19:47 ` iso m
1 sibling, 0 replies; 7+ messages in thread
From: iso m @ 2023-12-08 19:47 UTC (permalink / raw)
To: kernelnewbies
On 08/12/23 11:51 pm, Dawei Li wrote:
> Hi Valdis,
>
> Thanks for getting back to me!
> I should've looked into newer versions. (Was looking at 2.6.34 because the
> latest book I have on linux kernel, Linux
> Kernel Development, 3rd Edition by Robert Love, is based on that version.)
>
> I do have the same question for the latest version.
> Here:
> https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L5632
> the scheduler_tick() is calling curr->sched_class->task_tick(rq, curr, 0);
> https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L5651
> This is calling entity_tick(),
> https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/fair.c#L5447
> and then resched_curr(),
> https://github.com/torvalds/linux/blob/4df7c5fde316820286dfa6d203a1005d7fbe007d/kernel/sched/core.c#L1040
>
> As the comment says, resched_curr() is still just setting the need_resched
> flag on a uniprocessor.
> It is not calling the schedule() function.
> When/how is the schedule() function actually called?
I believe it's called at the code path (kernel -> user) and (kernel -> kernel)
Here, it'll be at return from the interrupt context.
Checkout point 2. in the following comment snippet found above __schedule()
method in kernel/sched/core.c
/*
* __schedule() is the main scheduler function.
*
* The main means of driving the scheduler and thus entering this function are:
*
* 1. Explicit blocking: mutex, semaphore, waitqueue, etc.
*
* 2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return
* paths. For example, see arch/x86/entry_64.S.
*
* To drive preemption between tasks, the scheduler sets the flag in timer
* interrupt handler scheduler_tick().
*
* 3. Wakeups don't really cause entry into schedule(). They add a
* task to the run-queue and that's it.
*
* Now, if the new task added to the run-queue preempts the current
* task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets
* called on the nearest possible occasion:
*
* - If the kernel is preemptible (CONFIG_PREEMPTION=y):
*
* - in syscall or exception context, at the next outmost
* preempt_enable(). (this might be as soon as the wake_up()'s
* spin_unlock()!)
*
* - in IRQ context, return from interrupt-handler to
* preemptible context
*
* - If the kernel is not preemptible (CONFIG_PREEMPTION is not set)
* then at the next:
*
* - cond_resched() call
* - explicit schedule() call
* - return from syscall or exception to user-space
* - return from interrupt-handler to user-space
*
* WARNING: must be called with preemption disabled!
*/
static void __sched notrace __schedule(unsigned int sched_mode)
>
> Appreciate any explanation/guidance on this!
> Thanks!
>
>
> On Sat, Dec 9, 2023 at 1:45 AM Valdis Klētnieks <valdis.kletnieks@vt.edu>
> wrote:
>
>> On Sat, 09 Dec 2023 00:16:32 +0800, Dawei Li said:
>>> Greetings!
>>
>>> (Although I am using the 2.6.34 version, I believe the question is
>> generally
>>> applicable to any kernel version.)
>>
>> That is, in general, a bad assumption when you are looking at kernel
>> versions
>> old enough that they count as digital archaeology....
>>
>> [/usr/src/linux-next] git show v2.6.34
>> tag v2.6.34
>> Tagger: Linus Torvalds <torvalds@linux-foundation.org>
>> Date: Sun May 16 14:17:44 2010 -0700
>> [/usr/src/linux-next] git diff --shortstat v2.6.34..next-20231205
>> 96965 files changed, 32056985 insertions(+), 7606202 deletions(-)
>>
>> Given that next-20231205 has just over 33 million lines of code, we're well
>> into territory where there's a vanishing small percentage of code still
>> remaining unchanged from 2010.
>>
>> And yes, that means that even basic functions schedule() and friends have
>> been
>> reworked in he past decade and a half....
>>
>>
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies@kernelnewbies.org
> https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-08 19:10 ` Billie Alsup (balsup)
@ 2023-12-10 16:59 ` Dawei Li
2023-12-14 17:13 ` Billie Alsup (balsup)
0 siblings, 1 reply; 7+ messages in thread
From: Dawei Li @ 2023-12-10 16:59 UTC (permalink / raw)
To: Billie Alsup (balsup); +Cc: Valdis Klētnieks, kernelnewbies
[-- Attachment #1.1: Type: text/plain, Size: 934 bytes --]
Hi Billie,
Thanks for getting back to me!
Many sources mentioned the same thing, but where do I find the code that
supports this?
I followed the comment here:
https://github.com/torvalds/linux/blob/c527f5606aa545233a4d2c6d5c636ed82b8633ef/kernel/sched/core.c#L6536C10-L6536C10
to check all the following files:
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64_compat.S
arch/x86/entry/entry_64.S
arch/x86/entry/entry.S
But I don't see any code that is calling the schedule or __schedule
function.
On Sat, Dec 9, 2023 at 3:10 AM Billie Alsup (balsup) <balsup@cisco.com>
wrote:
> >From: Dawei Li <daweilics@gmail.com>
> >When/how is the schedule() function actually called?
>
> I vaguely recall the actual switch taking place at the end of an
> interrupt,
> and/or during the return from a syscall, or on explicit request (e.g.
> yield).
> Look at __schedule and context_switch functions.
>
>
>
>
[-- Attachment #1.2: Type: text/html, Size: 1831 bytes --]
[-- Attachment #2: Type: text/plain, Size: 170 bytes --]
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when/how is the schedule() function actually called?
2023-12-10 16:59 ` Dawei Li
@ 2023-12-14 17:13 ` Billie Alsup (balsup)
0 siblings, 0 replies; 7+ messages in thread
From: Billie Alsup (balsup) @ 2023-12-14 17:13 UTC (permalink / raw)
To: Dawei Li; +Cc: Valdis Klētnieks, kernelnewbies
> But I don't see any code that is calling the schedule or __schedule function.
I think with a little investigation, you will be able to figure it out. For example, arch/x86/entry/common.c
in function do_syscall_64 calls syscall_entr_from_user_mode and syscall_exit_to_user_mode. I could guess
we eventually reach exit_to_user_mode_loop, which will conditionally call schedule() which calls __schedule
(although I didn't investigate this chain, so am just guessing).
I'm a newbie to this stuff as well, but it is not too difficult to follow this. I would guess there are
IDEs available that can help you with diagramming the flow if you don't want to manually find things
one layer at a time. The Documentation folder also has a lot of good information. For example,
Documentation/trace/histogram.rst shows some backtraces with __schedule, and you can see
examples of how it is called from do_syscall_64 and ret_from_fork. Other traces are available in
Documentation/trace/ftrace.rst
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-12-14 17:15 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-08 16:16 when/how is the schedule() function actually called? Dawei Li
2023-12-08 17:44 ` Valdis Klētnieks
2023-12-08 18:21 ` Dawei Li
2023-12-08 19:10 ` Billie Alsup (balsup)
2023-12-10 16:59 ` Dawei Li
2023-12-14 17:13 ` Billie Alsup (balsup)
2023-12-08 19:47 ` iso m
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).