[PATCH] uio: add support for ioctl

From: Stephen Hemminger
Date: Mon May 18 2015 - 13:31:38 EST


Allow UIO device specific driver to provide ioctl interface.
This mechanism is used in DPDK uio_msi driver to allow creating
VFIO like events.

Signed-off-by: Stephen Hemminger <stephen@xxxxxxxxxxxxxxxxxx>

--- a/drivers/uio/uio.c 2015-05-18 10:29:00.097129278 -0700
+++ b/drivers/uio/uio.c 2015-05-18 10:29:00.097129278 -0700
@@ -576,6 +576,20 @@ static ssize_t uio_write(struct file *fi
return retval ? retval : sizeof(s32);
}

+static long uio_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+{
+ struct uio_listener *listener = filep->private_data;
+ struct uio_device *idev = listener->dev;
+
+ if (!idev->info)
+ return -EIO;
+
+ if (!idev->info->ioctl)
+ return -ENOTTY;
+
+ return idev->info->ioctl(idev->info, cmd, arg);
+}
+
static int uio_find_mem_index(struct vm_area_struct *vma)
{
struct uio_device *idev = vma->vm_private_data;
@@ -712,6 +726,7 @@ static const struct file_operations uio_
.write = uio_write,
.mmap = uio_mmap,
.poll = uio_poll,
+ .unlocked_ioctl = uio_ioctl,
.fasync = uio_fasync,
.llseek = noop_llseek,
};
--- a/include/linux/uio_driver.h 2015-05-18 10:29:00.097129278 -0700
+++ b/include/linux/uio_driver.h 2015-05-18 10:29:00.097129278 -0700
@@ -89,6 +89,7 @@ struct uio_device {
* @mmap: mmap operation for this uio device
* @open: open operation for this uio device
* @release: release operation for this uio device
+ * @ioctl: ioctl handler
* @irqcontrol: disable/enable irqs when 0/1 is written to /dev/uioX
*/
struct uio_info {
@@ -105,6 +106,7 @@ struct uio_info {
int (*open)(struct uio_info *info, struct inode *inode);
int (*release)(struct uio_info *info, struct inode *inode);
int (*irqcontrol)(struct uio_info *info, s32 irq_on);
+ int (*ioctl)(struct uio_info *info, unsigned int cmd, unsigned long arg);
};

extern int __must_check
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/