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#include <rdma/rdma_netlink.h>
35#include <net/addrconf.h>
36#include "rxe.h"
37#include "rxe_loc.h"
38
39MODULE_AUTHOR("Bob Pearson, Frank Zago, John Groves, Kamal Heib");
40MODULE_DESCRIPTION("Soft RDMA transport");
41MODULE_LICENSE("Dual BSD/GPL");
42
43bool rxe_initialized;
44
45
46
47
48void rxe_dealloc(struct ib_device *ib_dev)
49{
50 struct rxe_dev *rxe = container_of(ib_dev, struct rxe_dev, ib_dev);
51
52 rxe_pool_cleanup(&rxe->uc_pool);
53 rxe_pool_cleanup(&rxe->pd_pool);
54 rxe_pool_cleanup(&rxe->ah_pool);
55 rxe_pool_cleanup(&rxe->srq_pool);
56 rxe_pool_cleanup(&rxe->qp_pool);
57 rxe_pool_cleanup(&rxe->cq_pool);
58 rxe_pool_cleanup(&rxe->mr_pool);
59 rxe_pool_cleanup(&rxe->mw_pool);
60 rxe_pool_cleanup(&rxe->mc_grp_pool);
61 rxe_pool_cleanup(&rxe->mc_elem_pool);
62
63 if (rxe->tfm)
64 crypto_free_shash(rxe->tfm);
65}
66
67
68static void rxe_init_device_param(struct rxe_dev *rxe)
69{
70 rxe->max_inline_data = RXE_MAX_INLINE_DATA;
71
72 rxe->attr.vendor_id = RXE_VENDOR_ID;
73 rxe->attr.max_mr_size = RXE_MAX_MR_SIZE;
74 rxe->attr.page_size_cap = RXE_PAGE_SIZE_CAP;
75 rxe->attr.max_qp = RXE_MAX_QP;
76 rxe->attr.max_qp_wr = RXE_MAX_QP_WR;
77 rxe->attr.device_cap_flags = RXE_DEVICE_CAP_FLAGS;
78 rxe->attr.max_send_sge = RXE_MAX_SGE;
79 rxe->attr.max_recv_sge = RXE_MAX_SGE;
80 rxe->attr.max_sge_rd = RXE_MAX_SGE_RD;
81 rxe->attr.max_cq = RXE_MAX_CQ;
82 rxe->attr.max_cqe = (1 << RXE_MAX_LOG_CQE) - 1;
83 rxe->attr.max_mr = RXE_MAX_MR;
84 rxe->attr.max_pd = RXE_MAX_PD;
85 rxe->attr.max_qp_rd_atom = RXE_MAX_QP_RD_ATOM;
86 rxe->attr.max_res_rd_atom = RXE_MAX_RES_RD_ATOM;
87 rxe->attr.max_qp_init_rd_atom = RXE_MAX_QP_INIT_RD_ATOM;
88 rxe->attr.atomic_cap = IB_ATOMIC_HCA;
89 rxe->attr.max_mcast_grp = RXE_MAX_MCAST_GRP;
90 rxe->attr.max_mcast_qp_attach = RXE_MAX_MCAST_QP_ATTACH;
91 rxe->attr.max_total_mcast_qp_attach = RXE_MAX_TOT_MCAST_QP_ATTACH;
92 rxe->attr.max_ah = RXE_MAX_AH;
93 rxe->attr.max_srq = RXE_MAX_SRQ;
94 rxe->attr.max_srq_wr = RXE_MAX_SRQ_WR;
95 rxe->attr.max_srq_sge = RXE_MAX_SRQ_SGE;
96 rxe->attr.max_fast_reg_page_list_len = RXE_MAX_FMR_PAGE_LIST_LEN;
97 rxe->attr.max_pkeys = RXE_MAX_PKEYS;
98 rxe->attr.local_ca_ack_delay = RXE_LOCAL_CA_ACK_DELAY;
99 addrconf_addr_eui48((unsigned char *)&rxe->attr.sys_image_guid,
100 rxe->ndev->dev_addr);
101
102 rxe->max_ucontext = RXE_MAX_UCONTEXT;
103}
104
105
106static void rxe_init_port_param(struct rxe_port *port)
107{
108 port->attr.state = IB_PORT_DOWN;
109 port->attr.max_mtu = IB_MTU_4096;
110 port->attr.active_mtu = IB_MTU_256;
111 port->attr.gid_tbl_len = RXE_PORT_GID_TBL_LEN;
112 port->attr.port_cap_flags = RXE_PORT_PORT_CAP_FLAGS;
113 port->attr.max_msg_sz = RXE_PORT_MAX_MSG_SZ;
114 port->attr.bad_pkey_cntr = RXE_PORT_BAD_PKEY_CNTR;
115 port->attr.qkey_viol_cntr = RXE_PORT_QKEY_VIOL_CNTR;
116 port->attr.pkey_tbl_len = RXE_PORT_PKEY_TBL_LEN;
117 port->attr.lid = RXE_PORT_LID;
118 port->attr.sm_lid = RXE_PORT_SM_LID;
119 port->attr.lmc = RXE_PORT_LMC;
120 port->attr.max_vl_num = RXE_PORT_MAX_VL_NUM;
121 port->attr.sm_sl = RXE_PORT_SM_SL;
122 port->attr.subnet_timeout = RXE_PORT_SUBNET_TIMEOUT;
123 port->attr.init_type_reply = RXE_PORT_INIT_TYPE_REPLY;
124 port->attr.active_width = RXE_PORT_ACTIVE_WIDTH;
125 port->attr.active_speed = RXE_PORT_ACTIVE_SPEED;
126 port->attr.phys_state = RXE_PORT_PHYS_STATE;
127 port->mtu_cap = ib_mtu_enum_to_int(IB_MTU_256);
128 port->subnet_prefix = cpu_to_be64(RXE_PORT_SUBNET_PREFIX);
129}
130
131
132
133
134static void rxe_init_ports(struct rxe_dev *rxe)
135{
136 struct rxe_port *port = &rxe->port;
137
138 rxe_init_port_param(port);
139 addrconf_addr_eui48((unsigned char *)&port->port_guid,
140 rxe->ndev->dev_addr);
141 spin_lock_init(&port->port_lock);
142}
143
144
145static int rxe_init_pools(struct rxe_dev *rxe)
146{
147 int err;
148
149 err = rxe_pool_init(rxe, &rxe->uc_pool, RXE_TYPE_UC,
150 rxe->max_ucontext);
151 if (err)
152 goto err1;
153
154 err = rxe_pool_init(rxe, &rxe->pd_pool, RXE_TYPE_PD,
155 rxe->attr.max_pd);
156 if (err)
157 goto err2;
158
159 err = rxe_pool_init(rxe, &rxe->ah_pool, RXE_TYPE_AH,
160 rxe->attr.max_ah);
161 if (err)
162 goto err3;
163
164 err = rxe_pool_init(rxe, &rxe->srq_pool, RXE_TYPE_SRQ,
165 rxe->attr.max_srq);
166 if (err)
167 goto err4;
168
169 err = rxe_pool_init(rxe, &rxe->qp_pool, RXE_TYPE_QP,
170 rxe->attr.max_qp);
171 if (err)
172 goto err5;
173
174 err = rxe_pool_init(rxe, &rxe->cq_pool, RXE_TYPE_CQ,
175 rxe->attr.max_cq);
176 if (err)
177 goto err6;
178
179 err = rxe_pool_init(rxe, &rxe->mr_pool, RXE_TYPE_MR,
180 rxe->attr.max_mr);
181 if (err)
182 goto err7;
183
184 err = rxe_pool_init(rxe, &rxe->mw_pool, RXE_TYPE_MW,
185 rxe->attr.max_mw);
186 if (err)
187 goto err8;
188
189 err = rxe_pool_init(rxe, &rxe->mc_grp_pool, RXE_TYPE_MC_GRP,
190 rxe->attr.max_mcast_grp);
191 if (err)
192 goto err9;
193
194 err = rxe_pool_init(rxe, &rxe->mc_elem_pool, RXE_TYPE_MC_ELEM,
195 rxe->attr.max_total_mcast_qp_attach);
196 if (err)
197 goto err10;
198
199 return 0;
200
201err10:
202 rxe_pool_cleanup(&rxe->mc_grp_pool);
203err9:
204 rxe_pool_cleanup(&rxe->mw_pool);
205err8:
206 rxe_pool_cleanup(&rxe->mr_pool);
207err7:
208 rxe_pool_cleanup(&rxe->cq_pool);
209err6:
210 rxe_pool_cleanup(&rxe->qp_pool);
211err5:
212 rxe_pool_cleanup(&rxe->srq_pool);
213err4:
214 rxe_pool_cleanup(&rxe->ah_pool);
215err3:
216 rxe_pool_cleanup(&rxe->pd_pool);
217err2:
218 rxe_pool_cleanup(&rxe->uc_pool);
219err1:
220 return err;
221}
222
223
224static int rxe_init(struct rxe_dev *rxe)
225{
226 int err;
227
228
229 rxe_init_device_param(rxe);
230
231 rxe_init_ports(rxe);
232
233 err = rxe_init_pools(rxe);
234 if (err)
235 return err;
236
237
238 spin_lock_init(&rxe->mmap_offset_lock);
239 spin_lock_init(&rxe->pending_lock);
240 INIT_LIST_HEAD(&rxe->pending_mmaps);
241
242 mutex_init(&rxe->usdev_lock);
243
244 return 0;
245}
246
247void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
248{
249 struct rxe_port *port = &rxe->port;
250 enum ib_mtu mtu;
251
252 mtu = eth_mtu_int_to_enum(ndev_mtu);
253
254
255 mtu = mtu ? min_t(enum ib_mtu, mtu, IB_MTU_4096) : IB_MTU_256;
256
257 port->attr.active_mtu = mtu;
258 port->mtu_cap = ib_mtu_enum_to_int(mtu);
259}
260
261
262
263
264int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name)
265{
266 int err;
267
268 err = rxe_init(rxe);
269 if (err)
270 return err;
271
272 rxe_set_mtu(rxe, mtu);
273
274 return rxe_register_device(rxe, ibdev_name);
275}
276
277static int rxe_newlink(const char *ibdev_name, struct net_device *ndev)
278{
279 struct rxe_dev *exists;
280 int err = 0;
281
282 exists = rxe_get_dev_from_net(ndev);
283 if (exists) {
284 ib_device_put(&exists->ib_dev);
285 pr_err("already configured on %s\n", ndev->name);
286 err = -EEXIST;
287 goto err;
288 }
289
290 err = rxe_net_add(ibdev_name, ndev);
291 if (err) {
292 pr_err("failed to add %s\n", ndev->name);
293 goto err;
294 }
295err:
296 return err;
297}
298
299static struct rdma_link_ops rxe_link_ops = {
300 .type = "rxe",
301 .newlink = rxe_newlink,
302};
303
304static int __init rxe_module_init(void)
305{
306 int err;
307
308
309 err = rxe_cache_init();
310 if (err) {
311 pr_err("unable to init object pools\n");
312 return err;
313 }
314
315 err = rxe_net_init();
316 if (err)
317 return err;
318
319 rdma_link_register(&rxe_link_ops);
320 rxe_initialized = true;
321 pr_info("loaded\n");
322 return 0;
323}
324
325static void __exit rxe_module_exit(void)
326{
327 rdma_link_unregister(&rxe_link_ops);
328 ib_unregister_driver(RDMA_DRIVER_RXE);
329 rxe_net_exit();
330 rxe_cache_exit();
331
332 rxe_initialized = false;
333 pr_info("unloaded\n");
334}
335
336late_initcall(rxe_module_init);
337module_exit(rxe_module_exit);
338
339MODULE_ALIAS_RDMA_LINK("rxe");
340