lkml.org 
[lkml]   [2016]   [Feb]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[char-misc-next 15/27] mei: bus: fix notification event delivery
    Date
    Call wake_up cl->ev_wait only in case there is no bus client registered
    to the event notification.
    Second, since we don't have exclusive waiter wake_up_interruptible_all
    is not used correctly here.

    Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
    ---
    drivers/misc/mei/bus.c | 13 +++++++++----
    drivers/misc/mei/client.c | 4 ++--
    drivers/misc/mei/mei_dev.h | 2 +-
    3 files changed, 12 insertions(+), 7 deletions(-)

    diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
    index a40d8e24ecda..990f4f65c35e 100644
    --- a/drivers/misc/mei/bus.c
    +++ b/drivers/misc/mei/bus.c
    @@ -230,25 +230,30 @@ static void mei_cl_bus_event_work(struct work_struct *work)
    * mei_cl_bus_notify_event - schedule notify cb on bus client
    *
    * @cl: host client
    + *
    + * Return: true if event was scheduled
    + * false if the client is not waiting for event
    */
    -void mei_cl_bus_notify_event(struct mei_cl *cl)
    +bool mei_cl_bus_notify_event(struct mei_cl *cl)
    {
    struct mei_cl_device *cldev = cl->cldev;

    if (!cldev || !cldev->event_cb)
    - return;
    + return false;

    if (!(cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF)))
    - return;
    + return false;

    if (!cl->notify_ev)
    - return;
    + return false;

    set_bit(MEI_CL_EVENT_NOTIF, &cldev->events);

    schedule_work(&cldev->event_work);

    cl->notify_ev = false;
    +
    + return true;
    }

    /**
    diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
    index 574f7394fb2b..3fd070a698ce 100644
    --- a/drivers/misc/mei/client.c
    +++ b/drivers/misc/mei/client.c
    @@ -1363,12 +1363,12 @@ void mei_cl_notify(struct mei_cl *cl)

    cl_dbg(dev, cl, "notify event");
    cl->notify_ev = true;
    - wake_up_interruptible_all(&cl->ev_wait);
    + if (!mei_cl_bus_notify_event(cl))
    + wake_up_interruptible(&cl->ev_wait);

    if (cl->ev_async)
    kill_fasync(&cl->ev_async, SIGIO, POLL_PRI);

    - mei_cl_bus_notify_event(cl);
    }

    /**
    diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
    index be97b8f2a883..70c4da015401 100644
    --- a/drivers/misc/mei/mei_dev.h
    +++ b/drivers/misc/mei/mei_dev.h
    @@ -317,7 +317,7 @@ ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
    bool blocking);
    ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length);
    bool mei_cl_bus_rx_event(struct mei_cl *cl);
    -void mei_cl_bus_notify_event(struct mei_cl *cl);
    +bool mei_cl_bus_notify_event(struct mei_cl *cl);
    void mei_cl_bus_remove_devices(struct mei_device *bus);
    int mei_cl_bus_init(void);
    void mei_cl_bus_exit(void);
    --
    2.4.3
    \
     
     \ /
      Last update: 2016-02-07 23:21    [W:3.743 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site