Skip to content

Commit

Permalink
mei: remove support for broken parallel read
Browse files Browse the repository at this point in the history
Parallel reads from multiple threads on a file descriptor
are not well defined and racy. It is safer to return to original
behavior and simply fail the additional read.
The solution is to remove request for next read credit.

Cc: <stable@vger.kernel.org> nathanchance#4.9
Fixes: ff1586a ("mei: enqueue consecutive reads")
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>
  • Loading branch information
ausyskin authored and gregkh committed Feb 10, 2017
1 parent dd37eed commit cb97fbb
Showing 1 changed file with 26 additions and 22 deletions.
48 changes: 26 additions & 22 deletions drivers/misc/mei/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,32 +182,36 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
goto out;
}

if (rets == -EBUSY &&
!mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, file)) {
rets = -ENOMEM;
goto out;
}

do {
mutex_unlock(&dev->device_lock);

if (wait_event_interruptible(cl->rx_wait,
(!list_empty(&cl->rd_completed)) ||
(!mei_cl_is_connected(cl)))) {
again:
mutex_unlock(&dev->device_lock);
if (wait_event_interruptible(cl->rx_wait,
!list_empty(&cl->rd_completed) ||
!mei_cl_is_connected(cl))) {
if (signal_pending(current))
return -EINTR;
return -ERESTARTSYS;
}
mutex_lock(&dev->device_lock);

if (signal_pending(current))
return -EINTR;
return -ERESTARTSYS;
}
if (!mei_cl_is_connected(cl)) {
rets = -ENODEV;
goto out;
}

mutex_lock(&dev->device_lock);
if (!mei_cl_is_connected(cl)) {
rets = -ENODEV;
goto out;
}
cb = mei_cl_read_cb(cl, file);
if (!cb) {
/*
* For amthif all the waiters are woken up,
* but only fp with matching cb->fp get the cb,
* the others have to return to wait on read.
*/
if (cl == &dev->iamthif_cl)
goto again;

cb = mei_cl_read_cb(cl, file);
} while (!cb);
rets = 0;
goto out;
}

copy_buffer:
/* now copy the data to user space */
Expand Down

0 comments on commit cb97fbb

Please sign in to comment.