@@ -818,8 +818,10 @@ static __poll_t lineevent_poll(struct file *filep,
poll_wait(filep, &le->wait, wait);
+ mutex_lock(&le->read_lock);
if (!kfifo_is_empty(&le->events))
events = EPOLLIN | EPOLLRDNORM;
+ mutex_unlock(&le->read_lock);
return events;
}
@@ -838,7 +840,9 @@ static ssize_t lineevent_read(struct file *filep,
return -EINVAL;
do {
+ mutex_lock(&le->read_lock);
if (kfifo_is_empty(&le->events)) {
+ mutex_unlock(&le->read_lock);
if (filep->f_flags & O_NONBLOCK)
return -EAGAIN;
@@ -846,6 +850,8 @@ static ssize_t lineevent_read(struct file *filep,
!kfifo_is_empty(&le->events));
if (ret)
return ret;
+ } else {
+ mutex_unlock(&le->read_lock);
}
if (mutex_lock_interruptible(&le->read_lock))
@@ -969,7 +975,9 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)
return IRQ_NONE;
}
+ mutex_lock(&le->read_lock);
ret = kfifo_put(&le->events, ge);
+ mutex_unlock(&le->read_lock);
if (ret)
wake_up_poll(&le->wait, EPOLLIN);