Blame view

net/rds/ib_mr.h 4.75 KB
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  /*
   * Copyright (c) 2016 Oracle.  All rights reserved.
   *
   * This software is available to you under a choice of one of two
   * licenses.  You may choose to be licensed under the terms of the GNU
   * General Public License (GPL) Version 2, available from the file
   * COPYING in the main directory of this source tree, or the
   * OpenIB.org BSD license below:
   *
   *     Redistribution and use in source and binary forms, with or
   *     without modification, are permitted provided that the following
   *     conditions are met:
   *
   *      - Redistributions of source code must retain the above
   *        copyright notice, this list of conditions and the following
   *        disclaimer.
   *
   *      - Redistributions in binary form must reproduce the above
   *        copyright notice, this list of conditions and the following
   *        disclaimer in the documentation and/or other materials
   *        provided with the distribution.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   */
  #ifndef _RDS_IB_MR_H
  #define _RDS_IB_MR_H
  
  #include <linux/kernel.h>
  
  #include "rds.h"
  #include "ib.h"
  
  #define RDS_MR_1M_POOL_SIZE		(8192 / 2)
  #define RDS_MR_1M_MSG_SIZE		256
  #define RDS_MR_8K_MSG_SIZE		2
  #define RDS_MR_8K_SCALE			(256 / (RDS_MR_8K_MSG_SIZE + 1))
  #define RDS_MR_8K_POOL_SIZE		(RDS_MR_8K_SCALE * (8192 / 2))
a69365a39   santosh.shilimkar@oracle.com   RDS: IB: create s...
45
46
  struct rds_ib_fmr {
  	struct ib_fmr		*fmr;
a69365a39   santosh.shilimkar@oracle.com   RDS: IB: create s...
47
  };
1659185fb   Avinash Repaka   RDS: IB: Support ...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  enum rds_ib_fr_state {
  	FRMR_IS_FREE,	/* mr invalidated & ready for use */
  	FRMR_IS_INUSE,	/* mr is in use or used & can be invalidated */
  	FRMR_IS_STALE,	/* Stale MR and needs to be dropped  */
  };
  
  struct rds_ib_frmr {
  	struct ib_mr		*mr;
  	enum rds_ib_fr_state	fr_state;
  	bool			fr_inv;
  	struct ib_send_wr	fr_wr;
  	unsigned int		dma_npages;
  	unsigned int		sg_byte_len;
  };
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
62
63
  /* This is stored as mr->r_trans_private. */
  struct rds_ib_mr {
d4de76da5   santosh.shilimkar@oracle.com   RDS: IB: add conn...
64
65
66
  	struct rds_ib_device		*device;
  	struct rds_ib_mr_pool		*pool;
  	struct rds_ib_connection	*ic;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
67

d4de76da5   santosh.shilimkar@oracle.com   RDS: IB: add conn...
68
  	struct llist_node		llnode;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
69
70
  
  	/* unmap_list is for freeing */
d4de76da5   santosh.shilimkar@oracle.com   RDS: IB: add conn...
71
72
  	struct list_head		unmap_list;
  	unsigned int			remap_count;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
73

d4de76da5   santosh.shilimkar@oracle.com   RDS: IB: add conn...
74
75
76
  	struct scatterlist		*sg;
  	unsigned int			sg_len;
  	int				sg_dma_len;
a69365a39   santosh.shilimkar@oracle.com   RDS: IB: create s...
77
78
79
  
  	union {
  		struct rds_ib_fmr	fmr;
1659185fb   Avinash Repaka   RDS: IB: Support ...
80
  		struct rds_ib_frmr	frmr;
a69365a39   santosh.shilimkar@oracle.com   RDS: IB: create s...
81
  	} u;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  };
  
  /* Our own little MR pool */
  struct rds_ib_mr_pool {
  	unsigned int            pool_type;
  	struct mutex		flush_lock;	/* serialize fmr invalidate */
  	struct delayed_work	flush_worker;	/* flush worker */
  
  	atomic_t		item_count;	/* total # of MRs */
  	atomic_t		dirty_count;	/* # dirty of MRs */
  
  	struct llist_head	drop_list;	/* MRs not reached max_maps */
  	struct llist_head	free_list;	/* unused MRs */
  	struct llist_head	clean_list;	/* unused & unmapped MRs */
  	wait_queue_head_t	flush_wait;
  
  	atomic_t		free_pinned;	/* memory pinned by free MRs */
  	unsigned long		max_items;
  	unsigned long		max_items_soft;
  	unsigned long		max_free_pinned;
  	struct ib_fmr_attr	fmr_attr;
1659185fb   Avinash Repaka   RDS: IB: Support ...
103
  	bool			use_fastreg;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
104
105
106
  };
  
  extern struct workqueue_struct *rds_ib_mr_wq;
2cb2912d6   santosh.shilimkar@oracle.com   RDS: IB: add Fast...
107
  extern bool prefer_frmr;
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  
  struct rds_ib_mr_pool *rds_ib_create_mr_pool(struct rds_ib_device *rds_dev,
  					     int npages);
  void rds_ib_get_mr_info(struct rds_ib_device *rds_ibdev,
  			struct rds_info_rdma_connection *iinfo);
  void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *);
  void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
  		    struct rds_sock *rs, u32 *key_ret);
  void rds_ib_sync_mr(void *trans_private, int dir);
  void rds_ib_free_mr(void *trans_private, int invalidate);
  void rds_ib_flush_mrs(void);
  int rds_ib_mr_init(void);
  void rds_ib_mr_exit(void);
  
  void __rds_ib_teardown_mr(struct rds_ib_mr *);
  void rds_ib_teardown_mr(struct rds_ib_mr *);
  struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *, int);
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
125
126
  struct rds_ib_mr *rds_ib_reuse_mr(struct rds_ib_mr_pool *);
  int rds_ib_flush_mr_pool(struct rds_ib_mr_pool *, int, struct rds_ib_mr **);
490ea5967   santosh.shilimkar@oracle.com   RDS: IB: move FMR...
127
128
129
130
131
132
  struct rds_ib_mr *rds_ib_reg_fmr(struct rds_ib_device *, struct scatterlist *,
  				 unsigned long, u32 *);
  struct rds_ib_mr *rds_ib_try_reuse_ibmr(struct rds_ib_mr_pool *);
  void rds_ib_unreg_fmr(struct list_head *, unsigned int *,
  		      unsigned long *, unsigned int);
  void rds_ib_free_fmr_list(struct rds_ib_mr *);
1659185fb   Avinash Repaka   RDS: IB: Support ...
133
134
135
136
137
138
139
  struct rds_ib_mr *rds_ib_reg_frmr(struct rds_ib_device *rds_ibdev,
  				  struct rds_ib_connection *ic,
  				  struct scatterlist *sg,
  				  unsigned long nents, u32 *key);
  void rds_ib_unreg_frmr(struct list_head *list, unsigned int *nfreed,
  		       unsigned long *unpinned, unsigned int goal);
  void rds_ib_free_frmr_list(struct rds_ib_mr *);
f6df683f3   santosh.shilimkar@oracle.com   RDS: IB: Re-organ...
140
  #endif