Re: [PATCH v2] eventfd: convert to f_op->read_iter()
From: Jens Axboe
Date: Fri May 01 2020 - 13:49:15 EST
On 5/1/20 11:43 AM, Al Viro wrote:
> On Fri, May 01, 2020 at 11:18:05AM -0600, Jens Axboe wrote:
>
>> - if (res > 0 && put_user(ucnt, (__u64 __user *)buf))
>> + if (res > 0 && copy_to_iter(&ucnt, res, iov) < res)
>
> *whoa*
>
> It is correct, but only because here res > 0 <=> res == 8.
> And that's not trivial at the first glance.
>
> Please, turn that into something like
Looks good to me, just one minor edit:
> if (iov_iter_count(to) < sizeof(ucnt))
> return -EINVAL;
> spin_lock_irq(&ctx->wqh.lock);
> if (!ctx->count) {
> if (unlikely(file->f_flags & O_NONBLOCK) {
> spin_unlock_irq(&ctx->wqh.lock)
> return -EAGAIN;
> }
> __add_wait_queue(&ctx->wqh, &wait);
> for (;;) {
> set_current_state(TASK_INTERRUPTIBLE);
> if (ctx->count)
> break;
> if (signal_pending(current)) {
> spin_unlock_irq(&ctx->wqh.lock)
> return -ERESTARTSYS;
> }
We need to remove waitq and re-set task state here. I'll run a sanity
check on that and send out a v3.
--
Jens Axboe