lkml.org 
[lkml]   [2017]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 144/156] vt6655: Fix a possible sleep-in-atomic bug in vt6655_suspend
    Date
    From: Jia-Ju Bai <baijiaju1990@163.com>

    [ Upstream commit 42c8eb3f6e15367981b274cb79ee4657e2c6949d ]

    The driver may sleep under a spinlock, and the function call path is:
    vt6655_suspend (acquire the spinlock)
    pci_set_power_state
    __pci_start_power_transition (drivers/pci/pci.c)
    msleep --> may sleep

    To fix it, pci_set_power_state is called without having a spinlock.

    This bug is found by my static analysis tool and my code review.

    Signed-off-by: Jia-Ju Bai <baijiaju1990@163.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/staging/vt6655/device_main.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
    index f109eeac358d..ab96629b7889 100644
    --- a/drivers/staging/vt6655/device_main.c
    +++ b/drivers/staging/vt6655/device_main.c
    @@ -1698,10 +1698,11 @@ static int vt6655_suspend(struct pci_dev *pcid, pm_message_t state)
    MACbShutdown(priv);

    pci_disable_device(pcid);
    - pci_set_power_state(pcid, pci_choose_state(pcid, state));

    spin_unlock_irqrestore(&priv->lock, flags);

    + pci_set_power_state(pcid, pci_choose_state(pcid, state));
    +
    return 0;
    }

    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-07 18:02    [W:4.175 / U:0.300 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site