• Davide Caratti's avatar
    net/sched: fq_pie: initialize timer earlier in fq_pie_init() · 4eef8b1f
    Davide Caratti authored
    with the following tdc testcase:
    
     83be: (qdisc, fq_pie) Create FQ-PIE with invalid number of flows
    
    as fq_pie_init() fails, fq_pie_destroy() is called to clean up. Since the
    timer is not yet initialized, it's possible to observe a splat like this:
    
      INFO: trying to register non-static key.
      the code is fine but needs lockdep annotation.
      turning off the locking correctness validator.
      CPU: 0 PID: 975 Comm: tc Not tainted 5.10.0-rc4+ #298
      Hardware name: Red Hat KVM, BIOS 1.11.1-4.module+el8.1.0+4066+0f1aadab 04/01/2014
      Call Trace:
       dump_stack+0x99/0xcb
       register_lock_class+0x12dd/0x1750
       __lock_acquire+0xfe/0x3970
       lock_acquire+0x1c8/0x7f0
       del_timer_sync+0x49/0xd0
       fq_pie_destroy+0x3f/0x80 [sch_fq_pie]
       qdisc_create+0x916/0x1160
       tc_modify_qdisc+0x3c4/0x1630
       rtnetlink_rcv_msg+0x346/0x8e0
       netlink_unicast+0x439/0x630
       netlink_sendmsg+0x719/0xbf0
       sock_sendmsg+0xe2/0x110
       ____sys_sendmsg+0x5ba/0x890
       ___sys_sendmsg+0xe9/0x160
       __sys_sendmsg+0xd3/0x170
       do_syscall_64+0x33/0x40
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [...]
      ODEBUG: assert_init not available (active state 0) object type: timer_list hint: 0x0
      WARNING: CPU: 0 PID: 975 at lib/debugobjects.c:508 debug_print_object+0x162/0x210
      [...]
      Call Trace:
       debug_object_assert_init+0x268/0x380
       try_to_del_timer_sync+0x6a/0x100
       del_timer_sync+0x9e/0xd0
       fq_pie_destroy+0x3f/0x80 [sch_fq_pie]
       qdisc_create+0x916/0x1160
       tc_modify_qdisc+0x3c4/0x1630
       rtnetlink_rcv_msg+0x346/0x8e0
       netlink_rcv_skb+0x120/0x380
       netlink_unicast+0x439/0x630
       netlink_sendmsg+0x719/0xbf0
       sock_sendmsg+0xe2/0x110
       ____sys_sendmsg+0x5ba/0x890
       ___sys_sendmsg+0xe9/0x160
       __sys_sendmsg+0xd3/0x170
       do_syscall_64+0x33/0x40
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    fix it moving timer_setup() before any failure, like it was done on 'red'
    with former commit 608b4ada ("net_sched: initialize timer earlier in
    red_init()").
    
    Fixes: ec97ecf1 ("net: sched: add Flow Queue PIE packet scheduler")
    Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
    Reviewed-by: default avatarCong Wang <cong.wang@bytedance.com>
    Link: https://lore.kernel.org/r/2e78e01c504c633ebdff18d041833cf2e079a3a4.1607020450.git.dcaratti@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    4eef8b1f
sch_fq_pie.c 14.4 KB