From: Xin Xiaohui <xiaohui....@intel.com>

Signed-off-by: Xin Xiaohui <xiaohui....@intel.com>
Signed-off-by: Zhao Yu <yzhao81...@gmail.com>
Reviewed-by: Jeff Dike <jd...@linux.intel.com>
---
 include/linux/mpassthru.h |  133 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 133 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/mpassthru.h

diff --git a/include/linux/mpassthru.h b/include/linux/mpassthru.h
new file mode 100644
index 0000000..1115f55
--- /dev/null
+++ b/include/linux/mpassthru.h
@@ -0,0 +1,133 @@
+#ifndef __MPASSTHRU_H
+#define __MPASSTHRU_H
+
+#include <linux/types.h>
+#include <linux/if_ether.h>
+#include <linux/ioctl.h>
+
+/* ioctl defines */
+#define MPASSTHRU_BINDDEV      _IOW('M', 213, int)
+#define MPASSTHRU_UNBINDDEV    _IO('M', 214)
+#define MPASSTHRU_SET_MEM_LOCKED       _IOW('M', 215, unsigned long)
+#define MPASSTHRU_GET_MEM_LOCKED_NEED  _IOR('M', 216, unsigned long)
+
+#define COPY_THRESHOLD (L1_CACHE_BYTES * 4)
+#define COPY_HDR_LEN   (L1_CACHE_BYTES < 64 ? 64 : L1_CACHE_BYTES)
+
+#define DEFAULT_NEED   ((8192*2*2)*4096)
+
+struct frag {
+       u16     offset;
+       u16     size;
+};
+
+#define HASH_BUCKETS    (8192*2)
+struct page_info {
+       struct list_head        list;
+       struct page_info        *next;
+       struct page_info        *prev;
+       struct page             *pages[MAX_SKB_FRAGS];
+       struct sk_buff          *skb;
+       struct page_pool        *pool;
+
+       /* The pointer relayed to skb, to indicate
+        * it's a external allocated skb or kernel
+        */
+       struct skb_ext_page    ext_page;
+       /* flag to indicate read or write */
+#define INFO_READ                      0
+#define INFO_WRITE                     1
+       unsigned                flags;
+       /* exact number of locked pages */
+       unsigned                pnum;
+
+       /* The fields after that is for backend
+        * driver, now for vhost-net.
+        */
+       /* the kiocb structure related to */
+       struct kiocb            *iocb;
+       /* the ring descriptor index */
+       unsigned int            desc_pos;
+       /* the iovec coming from backend, we only
+        * need few of them */
+       struct iovec            hdr[2];
+       struct iovec            iov[2];
+};
+
+struct page_pool {
+       /* the queue for rx side */
+       struct list_head        readq;
+       /* the lock to protect readq */
+       spinlock_t              read_lock;
+       /* record the orignal rlimit */
+       struct rlimit           o_rlim;
+       /* userspace wants to locked */
+       int                     locked_pages;
+       /* currently locked pages */
+       int                     cur_pages;
+       /* the memory locked before */
+       unsigned long           orig_locked_vm;
+       /* the device according to */
+       struct net_device       *dev;
+       /* the mp_port according to dev */
+       struct mp_port          port;
+       /* the hash_table list to find each locked page */
+       struct page_info        **hash_table;
+};
+
+static struct kmem_cache *ext_page_info_cache;
+
+#ifdef __KERNEL__
+#if defined(CONFIG_MEDIATE_PASSTHRU) || defined(CONFIG_MEDIATE_PASSTHRU_MODULE)
+struct socket *mp_get_socket(struct file *);
+struct page_pool *page_pool_create(struct net_device *dev,
+                                  struct socket *sock);
+int async_recvmsg(struct kiocb *iocb, struct page_pool *pool,
+                 struct iovec *iov, int count, int flags);
+int async_sendmsg(struct sock *sk, struct kiocb *iocb,
+                 struct page_pool *pool, struct iovec *iov,
+                 int count);
+void async_data_ready(struct sock *sk, struct page_pool *pool);
+void dev_change_state(struct net_device *dev);
+void page_pool_destroy(struct mm_struct *mm, struct page_pool *pool);
+#else
+#include <linux/err.h>
+#include <linux/errno.h>
+struct file;
+struct socket;
+static inline struct socket *mp_get_socket(struct file *f)
+{
+       return ERR_PTR(-EINVAL);
+}
+static inline struct page_pool *page_pool_create(struct net_device *dev,
+               struct socket *sock)
+{
+       return ERR_PTR(-EINVAL);
+}
+static inline int async_recvmsg(struct kiocb *iocb, struct page_pool *pool,
+               struct iovec *iov, int count, int flags)
+{
+       return -EINVAL;
+}
+static inline int async_sendmsg(struct sock *sk, struct kiocb *iocb,
+               struct page_pool *pool, struct iovec *iov,
+               int count)
+{
+       return -EINVAL;
+}
+static inline void async_data_ready(struct sock *sk, struct page_pool *pool)
+{
+       return;
+}
+static inline void dev_change_state(struct net_device *dev)
+{
+       return;
+}
+static inline void page_pool_destroy(struct mm_struct *mm,
+                                    struct page_pool *pool)
+{
+       return;
+}
+#endif /* CONFIG_MEDIATE_PASSTHRU */
+#endif /* __KERNEL__ */
+#endif /* __MPASSTHRU_H */
-- 
1.7.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to