• Michael Trimarchi's avatar
    i2c: Fix stuck transaction on cpm-i2c driver · dc1972d0
    Michael Trimarchi authored
    When a process tries to read/write a disconnected i2c device, it receives a signal (e.g. ctrl-c) and the kernel gets stuck.
    
    BUG: soft lockup - CPU#0 stuck for 61s! [I2CEEpromTest:392]
    NIP: c01628f8 LR: c01628f0 CTR: c00177cc
    REGS: c39abd70 TRAP: 0901   Not tainted  (2.6.25.7-alcore)
    MSR: 00009032 <EE,ME,IR,DR>  CR: 42042048  XER: 20000000
    TASK = c3889bd0[392] 'I2CEEpromTest' THREAD: c39aa000
    GPR00: 00009000 c39abe20 c3889bd0 c39075c8 c39abe28 00000001 00000000 00000001
    GPR08: c3889bd0 c39075c8 00009032 c39abe34 00002437
    NIP [c01628f8] cpm_i2c_xfer+0x5fc/0x6d0
    LR [c01628f0] cpm_i2c_xfer+0x5f4/0x6d0
    Call Trace:
    [c39abe20] [c0162924] cpm_i2c_xfer+0x628/0x6d0 (unreliable)
    [c39abe90] [c015f6a0] i2c_transfer+0x88/0xb4
    [c39abeb0] [c0160164] i2c_master_recv+0x48/0x6c
    [c39abed0] [c01618dc] i2cdev_read+0x50/0xe4
    [c39abef0] [c0068b24] vfs_read+0xc4/0x108
    [c39abf10] [c0068f4c] sys_read+0x4c/0x90
    [c39abf40] [c000d348] ret_from_syscall+0x0/0x38
    Instruction dump:
    3bc00064 92610010 3bf201c8 92810014 3b61
    
    This happen because though the wait_event_interruptible_timeout takes the
    signals into account, the driver does not handle them.
    We propose to change the wait_event_interruptible_timeout with
    wait_event_timeout, leaving the signals to be handled in other points
    on the upper layers.
    Signed-off-by: default avatarBruno Morelli <bruno@evidence.eu.com>
    Signed-off-by: default avatarMichael Trimarchi <michael@evidence.eu.com>
    Acked-by: default avatarJochen Friedrich <jochen@scram.de>
    [ben-linux@fluff.org: fix title for patch]
    Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
    dc1972d0
i2c-cpm.c 17.7 KB