lkml.org 
[lkml]   [2016]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.5 42/87] mei: bus: call mei_cl_read_start under device lock
    Date
    4.5-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Alexander Usyskin <alexander.usyskin@intel.com>

    commit bc46b45a421a64a0895dd41a34d3d2086e1ac7f6 upstream.

    Ensure that mei_cl_read_start is called under the device lock
    also in the bus layer. The function updates global ctrl_wr_list
    which should be locked.

    Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
    Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/misc/mei/bus.c | 15 ++++++++++++---
    1 file changed, 12 insertions(+), 3 deletions(-)

    --- a/drivers/misc/mei/bus.c
    +++ b/drivers/misc/mei/bus.c
    @@ -222,17 +222,23 @@ EXPORT_SYMBOL_GPL(mei_cldev_recv);
    static void mei_cl_bus_event_work(struct work_struct *work)
    {
    struct mei_cl_device *cldev;
    + struct mei_device *bus;

    cldev = container_of(work, struct mei_cl_device, event_work);

    + bus = cldev->bus;
    +
    if (cldev->event_cb)
    cldev->event_cb(cldev, cldev->events, cldev->event_context);

    cldev->events = 0;

    /* Prepare for the next read */
    - if (cldev->events_mask & BIT(MEI_CL_EVENT_RX))
    + if (cldev->events_mask & BIT(MEI_CL_EVENT_RX)) {
    + mutex_lock(&bus->device_lock);
    mei_cl_read_start(cldev->cl, 0, NULL);
    + mutex_unlock(&bus->device_lock);
    + }
    }

    /**
    @@ -296,6 +302,7 @@ int mei_cldev_register_event_cb(struct m
    unsigned long events_mask,
    mei_cldev_event_cb_t event_cb, void *context)
    {
    + struct mei_device *bus = cldev->bus;
    int ret;

    if (cldev->event_cb)
    @@ -308,15 +315,17 @@ int mei_cldev_register_event_cb(struct m
    INIT_WORK(&cldev->event_work, mei_cl_bus_event_work);

    if (cldev->events_mask & BIT(MEI_CL_EVENT_RX)) {
    + mutex_lock(&bus->device_lock);
    ret = mei_cl_read_start(cldev->cl, 0, NULL);
    + mutex_unlock(&bus->device_lock);
    if (ret && ret != -EBUSY)
    return ret;
    }

    if (cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF)) {
    - mutex_lock(&cldev->cl->dev->device_lock);
    + mutex_lock(&bus->device_lock);
    ret = mei_cl_notify_request(cldev->cl, NULL, event_cb ? 1 : 0);
    - mutex_unlock(&cldev->cl->dev->device_lock);
    + mutex_unlock(&bus->device_lock);
    if (ret)
    return ret;
    }

    \
     
     \ /
      Last update: 2016-05-31 00:01    [W:4.137 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site