lkml.org 
[lkml]   [2014]   [Jan]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH, RFC 24/30] oss: midibuf: fix sleep_on races
    Date
    sleep_on is known to be racy and going away because of this. All instances
    of interruptible_sleep_on and interruptible_sleep_on_timeout in the midibuf
    driver can trivially be replaced with wait_event_interruptible and
    wait_event_interruptible_timeout.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Cc: Jaroslav Kysela <perex@perex.cz>
    Cc: Takashi Iwai <tiwai@suse.de>
    Cc: alsa-devel@alsa-project.org
    ---
    sound/oss/midibuf.c | 18 +++++++++---------
    1 file changed, 9 insertions(+), 9 deletions(-)

    diff --git a/sound/oss/midibuf.c b/sound/oss/midibuf.c
    index 8cdb2cf..79615cf 100644
    --- a/sound/oss/midibuf.c
    +++ b/sound/oss/midibuf.c
    @@ -86,9 +86,8 @@ static void drain_midi_queue(int dev)
    */

    if (midi_devs[dev]->buffer_status != NULL)
    - while (!signal_pending(current) && midi_devs[dev]->buffer_status(dev))
    - interruptible_sleep_on_timeout(&midi_sleeper[dev],
    - HZ/10);
    + wait_event_interruptible_timeout(midi_sleeper[dev],
    + !midi_devs[dev]->buffer_status(dev), HZ/10);
    }

    static void midi_input_intr(int dev, unsigned char data)
    @@ -233,8 +232,8 @@ void MIDIbuf_release(int dev, struct file *file)
    * devices
    */

    - while (!signal_pending(current) && DATA_AVAIL(midi_out_buf[dev]))
    - interruptible_sleep_on(&midi_sleeper[dev]);
    + wait_event_interruptible(midi_sleeper[dev],
    + !DATA_AVAIL(midi_out_buf[dev]));
    /*
    * Sync
    */
    @@ -282,8 +281,8 @@ int MIDIbuf_write(int dev, struct file *file, const char __user *buf, int count)
    goto out;
    }

    - interruptible_sleep_on(&midi_sleeper[dev]);
    - if (signal_pending(current))
    + if (wait_event_interruptible(midi_sleeper[dev],
    + SPACE_AVAIL(midi_out_buf[dev])))
    {
    c = -EINTR;
    goto out;
    @@ -325,8 +324,9 @@ int MIDIbuf_read(int dev, struct file *file, char __user *buf, int count)
    c = -EAGAIN;
    goto out;
    }
    - interruptible_sleep_on_timeout(&input_sleeper[dev],
    - parms[dev].prech_timeout);
    + wait_event_interruptible_timeout(input_sleeper[dev],
    + DATA_AVAIL(midi_in_buf[dev]),
    + parms[dev].prech_timeout);

    if (signal_pending(current))
    c = -EINTR; /* The user is getting restless */
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2014-01-02 13:41    [W:5.095 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site