IB/qib: Fix double add_timer()
authorMike Marciniszyn <mike.marciniszyn@qlogic.com>
Thu, 10 Feb 2011 14:11:28 +0000 (14:11 +0000)
committerRoland Dreier <roland@purestorage.com>
Thu, 10 Feb 2011 19:24:08 +0000 (11:24 -0800)
commit414ed90cee32486c50f91b28990443e0dc21c868
treebcb6fc2551b3bb230c6aa9ebf18502728f573228
parent831d52bc153971b70e64eccfbed2b232394f22f8
IB/qib: Fix double add_timer()

The following panic BUG_ON occurs during qib testing:

    Kernel BUG at include/linux/timer.h:82

    RIP  [<ffffffff881f7109>] :ib_qib:start_timer+0x73/0x89
     RSP <ffffffff80425bd0>
     <0>Kernel panic - not syncing: Fatal exception
     <0>Dumping qib trace buffer from panic
    qib_set_lid INFO: IB0:1 got a lid: 0xf8
    Done dumping qib trace buffer
    BUG: warning at kernel/panic.c:137/panic() (Tainted: G

The flaw is due to a missing state test when processing responses that
results in an add_timer() call when the same timer is already queued.
This code was executing in parallel with a QP destroy on another CPU
that had changed the state to reset, but the missing test caused to
response handling code to run on into the panic.

Signed-off-by: Mike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/qib/qib_rc.c