tap: add support for IOCB_NOWAIT
authorJens Axboe <axboe@kernel.dk>
Wed, 8 Mar 2023 04:18:21 +0000 (21:18 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 11 Mar 2023 00:48:32 +0000 (16:48 -0800)
The tap driver already supports passing in nonblocking state based
on O_NONBLOCK, add support for checking IOCB_NOWAIT as well. With that
done, we can flag it with FMODE_NOWAIT as well.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/r/8f859870-e6e2-09ca-9c0f-a2aa7c984fb2@kernel.dk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/tap.c

index 8941aa1..ce993cc 100644 (file)
@@ -555,6 +555,9 @@ static int tap_open(struct inode *inode, struct file *file)
                goto err_put;
        }
 
+       /* tap groks IOCB_NOWAIT just fine, mark it as such */
+       file->f_mode |= FMODE_NOWAIT;
+
        dev_put(tap->dev);
 
        rtnl_unlock();
@@ -771,8 +774,12 @@ static ssize_t tap_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
        struct file *file = iocb->ki_filp;
        struct tap_queue *q = file->private_data;
+       int noblock = 0;
+
+       if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+               noblock = 1;
 
-       return tap_get_user(q, NULL, from, file->f_flags & O_NONBLOCK);
+       return tap_get_user(q, NULL, from, noblock);
 }
 
 /* Put packet to the user space buffer */
@@ -888,8 +895,12 @@ static ssize_t tap_read_iter(struct kiocb *iocb, struct iov_iter *to)
        struct file *file = iocb->ki_filp;
        struct tap_queue *q = file->private_data;
        ssize_t len = iov_iter_count(to), ret;
+       int noblock = 0;
+
+       if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+               noblock = 1;
 
-       ret = tap_do_read(q, to, file->f_flags & O_NONBLOCK, NULL);
+       ret = tap_do_read(q, to, noblock, NULL);
        ret = min_t(ssize_t, ret, len);
        if (ret > 0)
                iocb->ki_pos = ret;