xref: /openbmc/linux/net/rds/ib_mr.h (revision 490ea5967b0d94b84747d3327903d31f287f30e5)
1f6df683fSsantosh.shilimkar@oracle.com /*
2f6df683fSsantosh.shilimkar@oracle.com  * Copyright (c) 2016 Oracle.  All rights reserved.
3f6df683fSsantosh.shilimkar@oracle.com  *
4f6df683fSsantosh.shilimkar@oracle.com  * This software is available to you under a choice of one of two
5f6df683fSsantosh.shilimkar@oracle.com  * licenses.  You may choose to be licensed under the terms of the GNU
6f6df683fSsantosh.shilimkar@oracle.com  * General Public License (GPL) Version 2, available from the file
7f6df683fSsantosh.shilimkar@oracle.com  * COPYING in the main directory of this source tree, or the
8f6df683fSsantosh.shilimkar@oracle.com  * OpenIB.org BSD license below:
9f6df683fSsantosh.shilimkar@oracle.com  *
10f6df683fSsantosh.shilimkar@oracle.com  *     Redistribution and use in source and binary forms, with or
11f6df683fSsantosh.shilimkar@oracle.com  *     without modification, are permitted provided that the following
12f6df683fSsantosh.shilimkar@oracle.com  *     conditions are met:
13f6df683fSsantosh.shilimkar@oracle.com  *
14f6df683fSsantosh.shilimkar@oracle.com  *      - Redistributions of source code must retain the above
15f6df683fSsantosh.shilimkar@oracle.com  *        copyright notice, this list of conditions and the following
16f6df683fSsantosh.shilimkar@oracle.com  *        disclaimer.
17f6df683fSsantosh.shilimkar@oracle.com  *
18f6df683fSsantosh.shilimkar@oracle.com  *      - Redistributions in binary form must reproduce the above
19f6df683fSsantosh.shilimkar@oracle.com  *        copyright notice, this list of conditions and the following
20f6df683fSsantosh.shilimkar@oracle.com  *        disclaimer in the documentation and/or other materials
21f6df683fSsantosh.shilimkar@oracle.com  *        provided with the distribution.
22f6df683fSsantosh.shilimkar@oracle.com  *
23f6df683fSsantosh.shilimkar@oracle.com  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24f6df683fSsantosh.shilimkar@oracle.com  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25f6df683fSsantosh.shilimkar@oracle.com  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26f6df683fSsantosh.shilimkar@oracle.com  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27f6df683fSsantosh.shilimkar@oracle.com  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28f6df683fSsantosh.shilimkar@oracle.com  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29f6df683fSsantosh.shilimkar@oracle.com  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30f6df683fSsantosh.shilimkar@oracle.com  * SOFTWARE.
31f6df683fSsantosh.shilimkar@oracle.com  */
32f6df683fSsantosh.shilimkar@oracle.com #ifndef _RDS_IB_MR_H
33f6df683fSsantosh.shilimkar@oracle.com #define _RDS_IB_MR_H
34f6df683fSsantosh.shilimkar@oracle.com 
35f6df683fSsantosh.shilimkar@oracle.com #include <linux/kernel.h>
36f6df683fSsantosh.shilimkar@oracle.com 
37f6df683fSsantosh.shilimkar@oracle.com #include "rds.h"
38f6df683fSsantosh.shilimkar@oracle.com #include "ib.h"
39f6df683fSsantosh.shilimkar@oracle.com 
40f6df683fSsantosh.shilimkar@oracle.com #define RDS_MR_1M_POOL_SIZE		(8192 / 2)
41f6df683fSsantosh.shilimkar@oracle.com #define RDS_MR_1M_MSG_SIZE		256
42f6df683fSsantosh.shilimkar@oracle.com #define RDS_MR_8K_MSG_SIZE		2
43f6df683fSsantosh.shilimkar@oracle.com #define RDS_MR_8K_SCALE			(256 / (RDS_MR_8K_MSG_SIZE + 1))
44f6df683fSsantosh.shilimkar@oracle.com #define RDS_MR_8K_POOL_SIZE		(RDS_MR_8K_SCALE * (8192 / 2))
45f6df683fSsantosh.shilimkar@oracle.com 
46a69365a3Ssantosh.shilimkar@oracle.com struct rds_ib_fmr {
47a69365a3Ssantosh.shilimkar@oracle.com 	struct ib_fmr		*fmr;
48a69365a3Ssantosh.shilimkar@oracle.com 	u64			*dma;
49a69365a3Ssantosh.shilimkar@oracle.com };
50a69365a3Ssantosh.shilimkar@oracle.com 
51f6df683fSsantosh.shilimkar@oracle.com /* This is stored as mr->r_trans_private. */
52f6df683fSsantosh.shilimkar@oracle.com struct rds_ib_mr {
53f6df683fSsantosh.shilimkar@oracle.com 	struct rds_ib_device	*device;
54f6df683fSsantosh.shilimkar@oracle.com 	struct rds_ib_mr_pool	*pool;
55f6df683fSsantosh.shilimkar@oracle.com 
56f6df683fSsantosh.shilimkar@oracle.com 	struct llist_node	llnode;
57f6df683fSsantosh.shilimkar@oracle.com 
58f6df683fSsantosh.shilimkar@oracle.com 	/* unmap_list is for freeing */
59f6df683fSsantosh.shilimkar@oracle.com 	struct list_head	unmap_list;
60f6df683fSsantosh.shilimkar@oracle.com 	unsigned int		remap_count;
61f6df683fSsantosh.shilimkar@oracle.com 
62f6df683fSsantosh.shilimkar@oracle.com 	struct scatterlist	*sg;
63f6df683fSsantosh.shilimkar@oracle.com 	unsigned int		sg_len;
64f6df683fSsantosh.shilimkar@oracle.com 	int			sg_dma_len;
65a69365a3Ssantosh.shilimkar@oracle.com 
66a69365a3Ssantosh.shilimkar@oracle.com 	union {
67a69365a3Ssantosh.shilimkar@oracle.com 		struct rds_ib_fmr	fmr;
68a69365a3Ssantosh.shilimkar@oracle.com 	} u;
69f6df683fSsantosh.shilimkar@oracle.com };
70f6df683fSsantosh.shilimkar@oracle.com 
71f6df683fSsantosh.shilimkar@oracle.com /* Our own little MR pool */
72f6df683fSsantosh.shilimkar@oracle.com struct rds_ib_mr_pool {
73f6df683fSsantosh.shilimkar@oracle.com 	unsigned int            pool_type;
74f6df683fSsantosh.shilimkar@oracle.com 	struct mutex		flush_lock;	/* serialize fmr invalidate */
75f6df683fSsantosh.shilimkar@oracle.com 	struct delayed_work	flush_worker;	/* flush worker */
76f6df683fSsantosh.shilimkar@oracle.com 
77f6df683fSsantosh.shilimkar@oracle.com 	atomic_t		item_count;	/* total # of MRs */
78f6df683fSsantosh.shilimkar@oracle.com 	atomic_t		dirty_count;	/* # dirty of MRs */
79f6df683fSsantosh.shilimkar@oracle.com 
80f6df683fSsantosh.shilimkar@oracle.com 	struct llist_head	drop_list;	/* MRs not reached max_maps */
81f6df683fSsantosh.shilimkar@oracle.com 	struct llist_head	free_list;	/* unused MRs */
82f6df683fSsantosh.shilimkar@oracle.com 	struct llist_head	clean_list;	/* unused & unmapped MRs */
83f6df683fSsantosh.shilimkar@oracle.com 	wait_queue_head_t	flush_wait;
84f6df683fSsantosh.shilimkar@oracle.com 
85f6df683fSsantosh.shilimkar@oracle.com 	atomic_t		free_pinned;	/* memory pinned by free MRs */
86f6df683fSsantosh.shilimkar@oracle.com 	unsigned long		max_items;
87f6df683fSsantosh.shilimkar@oracle.com 	unsigned long		max_items_soft;
88f6df683fSsantosh.shilimkar@oracle.com 	unsigned long		max_free_pinned;
89f6df683fSsantosh.shilimkar@oracle.com 	struct ib_fmr_attr	fmr_attr;
90f6df683fSsantosh.shilimkar@oracle.com };
91f6df683fSsantosh.shilimkar@oracle.com 
92f6df683fSsantosh.shilimkar@oracle.com extern struct workqueue_struct *rds_ib_mr_wq;
93f6df683fSsantosh.shilimkar@oracle.com extern unsigned int rds_ib_mr_1m_pool_size;
94f6df683fSsantosh.shilimkar@oracle.com extern unsigned int rds_ib_mr_8k_pool_size;
95f6df683fSsantosh.shilimkar@oracle.com 
96f6df683fSsantosh.shilimkar@oracle.com struct rds_ib_mr_pool *rds_ib_create_mr_pool(struct rds_ib_device *rds_dev,
97f6df683fSsantosh.shilimkar@oracle.com 					     int npages);
98f6df683fSsantosh.shilimkar@oracle.com void rds_ib_get_mr_info(struct rds_ib_device *rds_ibdev,
99f6df683fSsantosh.shilimkar@oracle.com 			struct rds_info_rdma_connection *iinfo);
100f6df683fSsantosh.shilimkar@oracle.com void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *);
101f6df683fSsantosh.shilimkar@oracle.com void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
102f6df683fSsantosh.shilimkar@oracle.com 		    struct rds_sock *rs, u32 *key_ret);
103f6df683fSsantosh.shilimkar@oracle.com void rds_ib_sync_mr(void *trans_private, int dir);
104f6df683fSsantosh.shilimkar@oracle.com void rds_ib_free_mr(void *trans_private, int invalidate);
105f6df683fSsantosh.shilimkar@oracle.com void rds_ib_flush_mrs(void);
106f6df683fSsantosh.shilimkar@oracle.com int rds_ib_mr_init(void);
107f6df683fSsantosh.shilimkar@oracle.com void rds_ib_mr_exit(void);
108f6df683fSsantosh.shilimkar@oracle.com 
109f6df683fSsantosh.shilimkar@oracle.com void __rds_ib_teardown_mr(struct rds_ib_mr *);
110f6df683fSsantosh.shilimkar@oracle.com void rds_ib_teardown_mr(struct rds_ib_mr *);
111f6df683fSsantosh.shilimkar@oracle.com struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *, int);
112f6df683fSsantosh.shilimkar@oracle.com int rds_ib_map_fmr(struct rds_ib_device *, struct rds_ib_mr *,
113f6df683fSsantosh.shilimkar@oracle.com 		   struct scatterlist *, unsigned int);
114f6df683fSsantosh.shilimkar@oracle.com struct rds_ib_mr *rds_ib_reuse_mr(struct rds_ib_mr_pool *);
115f6df683fSsantosh.shilimkar@oracle.com int rds_ib_flush_mr_pool(struct rds_ib_mr_pool *, int, struct rds_ib_mr **);
116*490ea596Ssantosh.shilimkar@oracle.com struct rds_ib_mr *rds_ib_reg_fmr(struct rds_ib_device *, struct scatterlist *,
117*490ea596Ssantosh.shilimkar@oracle.com 				 unsigned long, u32 *);
118*490ea596Ssantosh.shilimkar@oracle.com struct rds_ib_mr *rds_ib_try_reuse_ibmr(struct rds_ib_mr_pool *);
119*490ea596Ssantosh.shilimkar@oracle.com void rds_ib_unreg_fmr(struct list_head *, unsigned int *,
120*490ea596Ssantosh.shilimkar@oracle.com 		      unsigned long *, unsigned int);
121*490ea596Ssantosh.shilimkar@oracle.com void rds_ib_free_fmr_list(struct rds_ib_mr *);
122f6df683fSsantosh.shilimkar@oracle.com #endif
123