Skip to content
  • Josh Poimboeuf's avatar
    sched/debug: Fix 'schedstats=enable' cmdline option · 4698f88c
    Josh Poimboeuf authored and Ingo Molnar's avatar Ingo Molnar committed
    
    
    The 'schedstats=enable' option doesn't work, and also produces the
    following warning during boot:
    
      WARNING: CPU: 0 PID: 0 at /home/jpoimboe/git/linux/kernel/jump_label.c:61 static_key_slow_inc+0x8c/0xa0
      static_key_slow_inc used before call to jump_label_init
      Modules linked in:
      CPU: 0 PID: 0 Comm: swapper Not tainted 4.7.0-rc1+ #25
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014
       0000000000000086 3ae3475a4bea95d4 ffffffff81e03da8 ffffffff8143fc83
       ffffffff81e03df8 0000000000000000 ffffffff81e03de8 ffffffff810b1ffb
       0000003d00000096 ffffffff823514d0 ffff88007ff197c8 0000000000000000
      Call Trace:
       [<ffffffff8143fc83>] dump_stack+0x85/0xc2
       [<ffffffff810b1ffb>] __warn+0xcb/0xf0
       [<ffffffff810b207f>] warn_slowpath_fmt+0x5f/0x80
       [<ffffffff811e9c0c>] static_key_slow_inc+0x8c/0xa0
       [<ffffffff810e07c6>] static_key_enable+0x16/0x40
       [<ffffffff8216d633>] setup_schedstats+0x29/0x94
       [<ffffffff82148a05>] unknown_bootoption+0x89/0x191
       [<ffffffff810d8617>] parse_args+0x297/0x4b0
       [<ffffffff82148d61>] start_kernel+0x1d8/0x4a9
       [<ffffffff8214897c>] ? set_init_arg+0x55/0x55
       [<ffffffff82148120>] ? early_idt_handler_array+0x120/0x120
       [<ffffffff821482db>] x86_64_start_reservations+0x2f/0x31
       [<ffffffff82148427>] x86_64_start_kernel+0x14a/0x16d
    
    The problem is that it tries to update the 'sched_schedstats' static key
    before jump labels have been initialized.
    
    Changing jump_label_init() to be called earlier before
    parse_early_param() wouldn't fix it: it would still fail trying to
    poke_text() because mm isn't yet initialized.
    
    Instead, just create a temporary '__sched_schedstats' variable which can
    be copied to the static key later during sched_init() after jump labels
    have been initialized.
    
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Matt Fleming <matt@codeblueprint.co.uk>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: cb251765 ("sched/debug: Make schedstats a runtime tunable that is disabled by default")
    Link: http://lkml.kernel.org/r/453775fe3433bed65731a583e228ccea806d18cd.1465322027.git.jpoimboe@redhat.com
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    4698f88c