Merge tag 'nfs-for-5.3-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[linux-2.6-microblaze.git] / drivers / vhost / vhost.h
index 27a78a9..8192963 100644 (file)
@@ -12,6 +12,9 @@
 #include <linux/virtio_config.h>
 #include <linux/virtio_ring.h>
 #include <linux/atomic.h>
+#include <linux/pagemap.h>
+#include <linux/mmu_notifier.h>
+#include <asm/cacheflush.h>
 
 struct vhost_work;
 typedef void (*vhost_work_fn_t)(struct vhost_work *work);
@@ -80,6 +83,24 @@ enum vhost_uaddr_type {
        VHOST_NUM_ADDRS = 3,
 };
 
+struct vhost_map {
+       int npages;
+       void *addr;
+       struct page **pages;
+};
+
+struct vhost_uaddr {
+       unsigned long uaddr;
+       size_t size;
+       bool write;
+};
+
+#if defined(CONFIG_MMU_NOTIFIER) && ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE == 0
+#define VHOST_ARCH_CAN_ACCEL_UACCESS 1
+#else
+#define VHOST_ARCH_CAN_ACCEL_UACCESS 0
+#endif
+
 /* The virtqueue structure describes a queue attached to a device. */
 struct vhost_virtqueue {
        struct vhost_dev *dev;
@@ -90,7 +111,22 @@ struct vhost_virtqueue {
        struct vring_desc __user *desc;
        struct vring_avail __user *avail;
        struct vring_used __user *used;
+
+#if VHOST_ARCH_CAN_ACCEL_UACCESS
+       /* Read by memory accessors, modified by meta data
+        * prefetching, MMU notifier and vring ioctl().
+        * Synchonrized through mmu_lock (writers) and RCU (writers
+        * and readers).
+        */
+       struct vhost_map __rcu *maps[VHOST_NUM_ADDRS];
+       /* Read by MMU notifier, modified by vring ioctl(),
+        * synchronized through MMU notifier
+        * registering/unregistering.
+        */
+       struct vhost_uaddr uaddrs[VHOST_NUM_ADDRS];
+#endif
        const struct vhost_umem_node *meta_iotlb[VHOST_NUM_ADDRS];
+
        struct file *kick;
        struct eventfd_ctx *call_ctx;
        struct eventfd_ctx *error_ctx;
@@ -145,6 +181,8 @@ struct vhost_virtqueue {
        bool user_be;
 #endif
        u32 busyloop_timeout;
+       spinlock_t mmu_lock;
+       int invalidate_count;
 };
 
 struct vhost_msg_node {
@@ -158,6 +196,9 @@ struct vhost_msg_node {
 
 struct vhost_dev {
        struct mm_struct *mm;
+#ifdef CONFIG_MMU_NOTIFIER
+       struct mmu_notifier mmu_notifier;
+#endif
        struct mutex mutex;
        struct vhost_virtqueue **vqs;
        int nvqs;
@@ -212,7 +253,7 @@ bool vhost_enable_notify(struct vhost_dev *, struct vhost_virtqueue *);
 int vhost_log_write(struct vhost_virtqueue *vq, struct vhost_log *log,
                    unsigned int log_num, u64 len,
                    struct iovec *iov, int count);
-int vq_iotlb_prefetch(struct vhost_virtqueue *vq);
+int vq_meta_prefetch(struct vhost_virtqueue *vq);
 
 struct vhost_msg_node *vhost_new_msg(struct vhost_virtqueue *vq, int type);
 void vhost_enqueue_msg(struct vhost_dev *dev,