From patchwork Tue Nov 9 09:03:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xin, Xiaohui" X-Patchwork-Id: 310452 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 oA98hco4015260 for ; Tue, 9 Nov 2010 08:43:38 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754312Ab0KIIls (ORCPT ); Tue, 9 Nov 2010 03:41:48 -0500 Received: from mga11.intel.com ([192.55.52.93]:40024 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754255Ab0KIIlq (ORCPT ); Tue, 9 Nov 2010 03:41:46 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 09 Nov 2010 00:41:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,174,1288594800"; d="scan'208";a="624917768" Received: from unknown (HELO localhost.localdomain.sh.intel.com) ([10.239.36.134]) by fmsmga002.fm.intel.com with ESMTP; 09 Nov 2010 00:41:44 -0800 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 v15 12/17] Add header file for mp device. Date: Tue, 9 Nov 2010 17:03:17 +0800 Message-Id: X-Mailer: git-send-email 1.7.3 In-Reply-To: <1289293402-4791-1-git-send-email-xiaohui.xin@intel.com> References: <1289293402-4791-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]); Tue, 09 Nov 2010 08:43:38 +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 */