Messages in this thread | | | Subject | Re: [PATCH v8 -tip 02/26] sched: Introduce sched_class::pick_task() | From | "Li, Aubrey" <> | Date | Sat, 24 Oct 2020 10:48:27 +0800 |
| |
On 2020/10/24 5:47, Joel Fernandes wrote: > On Fri, Oct 23, 2020 at 01:25:38PM +0800, Li, Aubrey wrote: >>>>> @@ -2517,6 +2528,7 @@ const struct sched_class dl_sched_class >>>>> >>>>> #ifdef CONFIG_SMP >>>>> .balance = balance_dl, >>>>> + .pick_task = pick_task_dl, >>>>> .select_task_rq = select_task_rq_dl, >>>>> .migrate_task_rq = migrate_task_rq_dl, >>>>> .set_cpus_allowed = set_cpus_allowed_dl, >>>>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c >>>>> index dbd9368a959d..bd6aed63f5e3 100644 >>>>> --- a/kernel/sched/fair.c >>>>> +++ b/kernel/sched/fair.c >>>>> @@ -4450,7 +4450,7 @@ pick_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *curr) >>>>> * Avoid running the skip buddy, if running something else can >>>>> * be done without getting too unfair. >>>>> */ >>>>> - if (cfs_rq->skip == se) { >>>>> + if (cfs_rq->skip && cfs_rq->skip == se) { >>>>> struct sched_entity *second; >>>>> >>>>> if (se == curr) { >>>>> @@ -6976,6 +6976,35 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ >>>>> set_last_buddy(se); >>>>> } >>>>> >>>>> +#ifdef CONFIG_SMP >>>>> +static struct task_struct *pick_task_fair(struct rq *rq) >>>>> +{ >>>>> + struct cfs_rq *cfs_rq = &rq->cfs; >>>>> + struct sched_entity *se; >>>>> + >>>>> + if (!cfs_rq->nr_running) >>>>> + return NULL; >>>>> + >>>>> + do { >>>>> + struct sched_entity *curr = cfs_rq->curr; >>>>> + >>>>> + se = pick_next_entity(cfs_rq, NULL); >>>>> + >>>>> + if (curr) { >>>>> + if (se && curr->on_rq) >>>>> + update_curr(cfs_rq); >>>>> + >>>>> + if (!se || entity_before(curr, se)) >>>>> + se = curr; >>>>> + } >>>>> + >>>>> + cfs_rq = group_cfs_rq(se); >>>>> + } while (cfs_rq); >>>>> ++ >>>>> + return task_of(se); >>>>> +} >>>>> +#endif >>>> >>>> One of my machines hangs when I run uperf with only one message: >>>> [ 719.034962] BUG: kernel NULL pointer dereference, address: 0000000000000050 >>>> >>>> Then I replicated the problem on my another machine(no serial console), >>>> here is the stack by manual copy. >>>> >>>> Call Trace: >>>> pick_next_entity+0xb0/0x160 >>>> pick_task_fair+0x4b/0x90 >>>> __schedule+0x59b/0x12f0 >>>> schedule_idle+0x1e/0x40 >>>> do_idle+0x193/0x2d0 >>>> cpu_startup_entry+0x19/0x20 >>>> start_secondary+0x110/0x150 >>>> secondary_startup_64_no_verify+0xa6/0xab >>> >>> Interesting. Wondering if we screwed something up in the rebase. >>> >>> Questions: >>> 1. Does the issue happen if you just apply only up until this patch, >>> or the entire series? >> >> I applied the entire series and just find a related patch to report the >> issue. > > Ok. > >>> 2. Do you see the issue in v7? Not much if at all has changed in this >>> part of the code from v7 -> v8 but could be something in the newer >>> kernel. >>> >> >> IIRC, I can run uperf successfully on v7. >> I'm on tip/master 2d3e8c9424c9 (origin/master) "Merge branch 'linus'." >> Please let me know if this is a problem, or you have a repo I can pull >> for testing. > > Here is a repo with v8 series on top of v5.9 release: > https://git.kernel.org/pub/scm/linux/kernel/git/jfern/linux.git/log/?h=coresched-v5.9
I didn't see NULL pointer dereference BUG of this repo, will post performance data later.
Thanks, -Aubrey
| |