kernelnewbies.kernelnewbies.org archive mirror
 help / color / mirror / Atom feed
* 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).