From patchwork Thu Nov 4 09:05:08 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xin, Xiaohui" X-Patchwork-Id: 301462 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oA48m6DG010326 for ; Thu, 4 Nov 2010 08:48:07 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754699Ab0KDIqT (ORCPT ); Thu, 4 Nov 2010 04:46:19 -0400 Received: from mga02.intel.com ([134.134.136.20]:3854 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754519Ab0KDIoQ (ORCPT ); Thu, 4 Nov 2010 04:44:16 -0400 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 04 Nov 2010 01:44:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.58,294,1286175600"; d="scan'208";a="570251228" Received: from gw-vmm.sh.intel.com (HELO localhost.localdomain.org) ([10.239.48.110]) by orsmga002.jf.intel.com with ESMTP; 04 Nov 2010 01:44:14 -0700 From: xiaohui.xin@intel.com To: netdev@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, mst@redhat.com, mingo@elte.hu, davem@davemloft.net, herbert@gondor.hengli.com.au, jdike@linux.intel.com Cc: Xin Xiaohui Subject: [PATCH v14 12/17] Add header file for mp device. Date: Thu, 4 Nov 2010 17:05:08 +0800 Message-Id: X-Mailer: git-send-email 1.7.3 In-Reply-To: <1288861513-5707-1-git-send-email-xiaohui.xin@intel.com> References: <1288861513-5707-1-git-send-email-xiaohui.xin@intel.com> In-Reply-To: References: Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Thu, 04 Nov 2010 08:48:07 +0000 (UTC) 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 +#include +#include + +/* 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 +#include +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 */