• Uma Krishnan's avatar
    scsi: cxlflash: Cancel scheduled workers before stopping AFU · 0df5bef7
    Uma Krishnan authored
    When processing an AFU asynchronous interrupt, if the action results in an
    operation that requires off level processing (a link reset for example),
    the worker thread is scheduled. In the meantime a reset event (i.e.: EEH)
    could unmap the AFU to recover. This results in an Oops when the worker
    thread tries to access the AFU mapping.
    
    [c000000f17e03b90] d000000007cd5978 cxlflash_worker_thread+0x268/0x550
    [c000000f17e03c40] c00000000011883c process_one_work+0x1dc/0x680
    [c000000f17e03ce0] c000000000118e80 worker_thread+0x1a0/0x520
    [c000000f17e03d80] c000000000126174 kthread+0xf4/0x100
    [c000000f17e03e30] c00000000000a47c ret_from_kernel_thread+0x5c/0xe0
    
    In an effort to avoid this, a mapcount was introduced in
    commit b45cdbaf ("cxlflash: Resolve oops in wait_port_offline")
    but due to the race condition described above, this solution is incomplete.
    
    In order to fully resolve this problem and to simplify things, this commit
    removes the mapcount solution. Instead, the scheduled worker thread is
    cancelled after interrupts have been disabled and prior to the mapping
    being freed.
    
    Fixes: b45cdbaf ("cxlflash: Resolve oops in wait_port_offline")
    Signed-off-by: default avatarUma Krishnan <ukrishn@linux.vnet.ibm.com>
    Acked-by: default avatarMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    0df5bef7
main.c 69.6 KB