• Xunlei Pang's avatar
    sched/deadline: Fix a bug in dl_overflow() · fec148c0
    Xunlei Pang authored
    I got a minus(very big) dl_b->total_bw during my deadline tests.
    
        # grep dl /proc/sched_debug
        dl_rq[0]:
        .dl_nr_running                 : 0
        .dl_bw->bw                     : 996147
        .dl_bw->total_bw               : -222297900
    
    Something unusual must have happened.
    
    After some digging, I finally noticed that when changing a deadline
    task to normal(cfs), and changing it back to deadline immediately,
    after it died, we will got the wrong dl_bw->total_bw.
    
    The root cause is in dl_overflow(), it has:
        if (new_bw == p->dl.dl_bw)
    	return 0;
    
    1) When a deadline task is changed to !deadline task, it will start
       dl timer in switched_from_dl(), and retain previous deadline parameter
       till the timer expires.
    
    2) If we change it back to deadline with the same bandwidth parameter
       before the timer expires, as it keeps the old bandwidth although it
       is not a deadline task. dl_overflow() simply returns success without
       updating the right data, and got the wrong dl_bw->total_bw.
    
    The solution is simple, if @p is not deadline, don't return.
    Signed-off-by: default avatarXunlei Pang <xlpang@redhat.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJuri Lelli <juri.lelli@arm.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1460636368-1993-1-git-send-email-xlpang@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    fec148c0
core.c 208 KB