[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] credit2: fix wrong assert in runq_tickle()



commit 1d7ecc0348741543cbfec96d4817531efcf755c3
Author:     Dario Faggioli <dario.faggioli@xxxxxxxxxx>
AuthorDate: Tue Nov 22 17:12:50 2016 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Nov 22 17:12:50 2016 +0100

    credit2: fix wrong assert in runq_tickle()
    
    Since b047f888d489 ("xen: sched: leave CPUs doing tasklet
    work alone") a cpu executing a tasklet, is not marked as
    idle.
    
    Therefore:
     - avoid asserting that we can't find the idle vcpu running
       on one of them, which is not true,
     - avoid triggering a preemption on them (and add an assert
       checking that).
    
    This fixes a bug identified by OSSTest, in flight 102372
    (on ARM, but it's not at all ARM specific), where the
    ASSERT() was triggering like this:
    
    (XEN) Xen call trace:
    (XEN)    [<0022af78>] sched_credit2.c#runq_tickle+0x3e8/0x61c (PC)
    (XEN)    [<0022aedc>] sched_credit2.c#runq_tickle+0x34c/0x61c (LR)
    (XEN)    [<0022b644>] sched_credit2.c#csched2_context_saved+0x128/0x1a4
    (XEN)    [<0023303c>] context_saved+0x7c/0xa4
    (XEN)    [<0024f660>] domain.c#schedule_tail+0x2b4/0x308
    (XEN)    [<0024faac>] context_switch+0x80/0x94
    (XEN)    [<0022ff48>] schedule.c#schedule+0x76c/0x7ec
    (XEN)    [<002338d4>] softirq.c#__do_softirq+0xcc/0xec
    (XEN)    [<00233968>] do_softirq+0x18/0x28
    (XEN)    [<00261084>] leave_hypervisor_tail+0x58/0x88
    (XEN)    [<002649d0>] entry.o#return_to_guest+0xc/0xb8
    (XEN)
    (XEN) ****************************************
    (XEN) Panic on CPU 1:
    (XEN) Assertion '!is_idle_vcpu(cur->vcpu)' failed at sched_credit2.c:1009
    (XEN) ****************************************
    
    Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 xen/common/sched_credit2.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c
index 1f26553..c2c563d 100644
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -1006,7 +1006,12 @@ runq_tickle(const struct scheduler *ops, struct 
csched2_vcpu *new, s_time_t now)
 
         cur = CSCHED2_VCPU(curr_on_cpu(i));
 
-        ASSERT(!is_idle_vcpu(cur->vcpu));
+        /*
+         * Even if the cpu is not in rqd->idle, it may be running the
+         * idle vcpu, if it's doing tasklet work. Just skip it.
+         */
+        if ( is_idle_vcpu(cur->vcpu) )
+            continue;
 
         /* Update credits for current to see if we want to preempt. */
         burn_credits(rqd, cur, now);
@@ -1042,6 +1047,7 @@ runq_tickle(const struct scheduler *ops, struct 
csched2_vcpu *new, s_time_t now)
         return;
     }
 
+    ASSERT(!is_idle_vcpu(curr_on_cpu(ipid)));
     SCHED_STAT_CRANK(tickled_busy_cpu);
  tickle:
     BUG_ON(ipid == -1);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.