1. 31 10月, 2020 2 次提交
  2. 21 9月, 2020 1 次提交
  3. 25 8月, 2020 1 次提交
    • X
      sctp: not disable bh in the whole sctp_get_port_local() · 3106ecb4
      Xin Long 提交于
      With disabling bh in the whole sctp_get_port_local(), when
      snum == 0 and too many ports have been used, the do-while
      loop will take the cpu for a long time and cause cpu stuck:
      
        [ ] watchdog: BUG: soft lockup - CPU#11 stuck for 22s!
        [ ] RIP: 0010:native_queued_spin_lock_slowpath+0x4de/0x940
        [ ] Call Trace:
        [ ]  _raw_spin_lock+0xc1/0xd0
        [ ]  sctp_get_port_local+0x527/0x650 [sctp]
        [ ]  sctp_do_bind+0x208/0x5e0 [sctp]
        [ ]  sctp_autobind+0x165/0x1e0 [sctp]
        [ ]  sctp_connect_new_asoc+0x355/0x480 [sctp]
        [ ]  __sctp_connect+0x360/0xb10 [sctp]
      
      There's no need to disable bh in the whole function of
      sctp_get_port_local. So fix this cpu stuck by removing
      local_bh_disable() called at the beginning, and using
      spin_lock_bh() instead.
      
      The same thing was actually done for inet_csk_get_port() in
      Commit ea8add2b ("tcp/dccp: better use of ephemeral
      ports in bind()").
      
      Thanks to Marcelo for pointing the buggy code out.
      
      v1->v2:
        - use cond_resched() to yield cpu to other tasks if needed,
          as Eric noticed.
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Reported-by: NYing Xu <yinxu@redhat.com>
      Signed-off-by: NXin Long <lucien.xin@gmail.com>
      Acked-by: NMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3106ecb4
  4. 25 7月, 2020 2 次提交
  5. 20 7月, 2020 34 次提交