1 /*
2 * Copyright (c) 2004 Topspin Communications. All rights reserved.
3 * Copyright (c) 2005 Voltaire, Inc. All rights reserved.
4 * Copyright (c) 2006 Intel Corporation. All rights reserved.
5 *
6 * This software is available to you under a choice of one of two
7 * licenses. You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer.
19 *
20 * - Redistributions in binary form must reproduce the above
21 * copyright notice, this list of conditions and the following
22 * disclaimer in the documentation and/or other materials
23 * provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 */
34
35 #include <linux/init.h>
36 #include <linux/err.h>
37 #include <linux/random.h>
38 #include <linux/spinlock.h>
39 #include <linux/slab.h>
40 #include <linux/dma-mapping.h>
41 #include <linux/kref.h>
42 #include <linux/xarray.h>
43 #include <linux/workqueue.h>
44 #include <uapi/linux/if_ether.h>
45 #include <rdma/ib_pack.h>
46 #include <rdma/ib_cache.h>
47 #include <rdma/rdma_netlink.h>
48 #include <net/netlink.h>
49 #include <uapi/rdma/ib_user_sa.h>
50 #include <rdma/ib_marshall.h>
51 #include <rdma/ib_addr.h>
52 #include <rdma/opa_addr.h>
53 #include <rdma/rdma_cm.h>
54 #include "sa.h"
55 #include "core_priv.h"
56
57 #define IB_SA_LOCAL_SVC_TIMEOUT_MIN 100
58 #define IB_SA_LOCAL_SVC_TIMEOUT_DEFAULT 2000
59 #define IB_SA_LOCAL_SVC_TIMEOUT_MAX 200000
60 #define IB_SA_CPI_MAX_RETRY_CNT 3
61 #define IB_SA_CPI_RETRY_WAIT 1000 /*msecs */
62 static int sa_local_svc_timeout_ms = IB_SA_LOCAL_SVC_TIMEOUT_DEFAULT;
63
64 struct ib_sa_sm_ah {
65 struct ib_ah *ah;
66 struct kref ref;
67 u16 pkey_index;
68 u8 src_path_mask;
69 };
70
71 enum rdma_class_port_info_type {
72 RDMA_CLASS_PORT_INFO_IB,
73 RDMA_CLASS_PORT_INFO_OPA
74 };
75
76 struct rdma_class_port_info {
77 enum rdma_class_port_info_type type;
78 union {
79 struct ib_class_port_info ib;
80 struct opa_class_port_info opa;
81 };
82 };
83
84 struct ib_sa_classport_cache {
85 bool valid;
86 int retry_cnt;
87 struct rdma_class_port_info data;
88 };
89
90 struct ib_sa_port {
91 struct ib_mad_agent *agent;
92 struct ib_sa_sm_ah *sm_ah;
93 struct work_struct update_task;
94 struct ib_sa_classport_cache classport_info;
95 struct delayed_work ib_cpi_work;
96 spinlock_t classport_lock; /* protects class port info set */
97 spinlock_t ah_lock;
98 u32 port_num;
99 };
100
101 struct ib_sa_device {
102 int start_port, end_port;
103 struct ib_event_handler event_handler;
104 struct ib_sa_port port[];
105 };
106
107 struct ib_sa_query {
108 void (*callback)(struct ib_sa_query *sa_query, int status,
109 int num_prs, struct ib_sa_mad *mad);
110 void (*release)(struct ib_sa_query *);
111 struct ib_sa_client *client;
112 struct ib_sa_port *port;
113 struct ib_mad_send_buf *mad_buf;
114 struct ib_sa_sm_ah *sm_ah;
115 int id;
116 u32 flags;
117 struct list_head list; /* Local svc request list */
118 u32 seq; /* Local svc request sequence number */
119 unsigned long timeout; /* Local svc timeout */
120 u8 path_use; /* How will the pathrecord be used */
121
122 /* A separate buffer to save pathrecords of a response, as in cases
123 * like IB/netlink, mulptiple pathrecords are supported, so that
124 * mad->data is not large enough to hold them
125 */
126 void *resp_pr_data;
127 };
128
129 #define IB_SA_ENABLE_LOCAL_SERVICE 0x00000001
130 #define IB_SA_CANCEL 0x00000002
131 #define IB_SA_QUERY_OPA 0x00000004
132
133 struct ib_sa_path_query {
134 void (*callback)(int status, struct sa_path_rec *rec,
135 int num_paths, void *context);
136 void *context;
137 struct ib_sa_query sa_query;
138 struct sa_path_rec *conv_pr;
139 };
140
141 struct ib_sa_guidinfo_query {
142 void (*callback)(int, struct ib_sa_guidinfo_rec *, void *);
143 void *context;
144 struct ib_sa_query sa_query;
145 };
146
147 struct ib_sa_classport_info_query {
148 void (*callback)(void *);
149 void *context;
150 struct ib_sa_query sa_query;
151 };
152
153 struct ib_sa_mcmember_query {
154 void (*callback)(int, struct ib_sa_mcmember_rec *, void *);
155 void *context;
156 struct ib_sa_query sa_query;
157 };
158
159 static LIST_HEAD(ib_nl_request_list);
160 static DEFINE_SPINLOCK(ib_nl_request_lock);
161 static atomic_t ib_nl_sa_request_seq;
162 static struct workqueue_struct *ib_nl_wq;
163 static struct delayed_work ib_nl_timed_work;
164 static const struct nla_policy ib_nl_policy[LS_NLA_TYPE_MAX] = {
165 [LS_NLA_TYPE_PATH_RECORD] = {.type = NLA_BINARY,
166 .len = sizeof(struct ib_path_rec_data)},
167 [LS_NLA_TYPE_TIMEOUT] = {.type = NLA_U32},
168 [LS_NLA_TYPE_SERVICE_ID] = {.type = NLA_U64},
169 [LS_NLA_TYPE_DGID] = {.type = NLA_BINARY,
170 .len = sizeof(struct rdma_nla_ls_gid)},
171 [LS_NLA_TYPE_SGID] = {.type = NLA_BINARY,
172 .len = sizeof(struct rdma_nla_ls_gid)},
173 [LS_NLA_TYPE_TCLASS] = {.type = NLA_U8},
174 [LS_NLA_TYPE_PKEY] = {.type = NLA_U16},
175 [LS_NLA_TYPE_QOS_CLASS] = {.type = NLA_U16},
176 };
177
178
179 static int ib_sa_add_one(struct ib_device *device);
180 static void ib_sa_remove_one(struct ib_device *device, void *client_data);
181
182 static struct ib_client sa_client = {
183 .name = "sa",
184 .add = ib_sa_add_one,
185 .remove = ib_sa_remove_one
186 };
187
188 static DEFINE_XARRAY_FLAGS(queries, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
189
190 static DEFINE_SPINLOCK(tid_lock);
191 static u32 tid;
192
193 #define PATH_REC_FIELD(field) \
194 .struct_offset_bytes = offsetof(struct sa_path_rec, field), \
195 .struct_size_bytes = sizeof_field(struct sa_path_rec, field), \
196 .field_name = "sa_path_rec:" #field
197
198 static const struct ib_field path_rec_table[] = {
199 { PATH_REC_FIELD(service_id),
200 .offset_words = 0,
201 .offset_bits = 0,
202 .size_bits = 64 },
203 { PATH_REC_FIELD(dgid),
204 .offset_words = 2,
205 .offset_bits = 0,
206 .size_bits = 128 },
207 { PATH_REC_FIELD(sgid),
208 .offset_words = 6,
209 .offset_bits = 0,
210 .size_bits = 128 },
211 { PATH_REC_FIELD(ib.dlid),
212 .offset_words = 10,
213 .offset_bits = 0,
214 .size_bits = 16 },
215 { PATH_REC_FIELD(ib.slid),
216 .offset_words = 10,
217 .offset_bits = 16,
218 .size_bits = 16 },
219 { PATH_REC_FIELD(ib.raw_traffic),
220 .offset_words = 11,
221 .offset_bits = 0,
222 .size_bits = 1 },
223 { RESERVED,
224 .offset_words = 11,
225 .offset_bits = 1,
226 .size_bits = 3 },
227 { PATH_REC_FIELD(flow_label),
228 .offset_words = 11,
229 .offset_bits = 4,
230 .size_bits = 20 },
231 { PATH_REC_FIELD(hop_limit),
232 .offset_words = 11,
233 .offset_bits = 24,
234 .size_bits = 8 },
235 { PATH_REC_FIELD(traffic_class),
236 .offset_words = 12,
237 .offset_bits = 0,
238 .size_bits = 8 },
239 { PATH_REC_FIELD(reversible),
240 .offset_words = 12,
241 .offset_bits = 8,
242 .size_bits = 1 },
243 { PATH_REC_FIELD(numb_path),
244 .offset_words = 12,
245 .offset_bits = 9,
246 .size_bits = 7 },
247 { PATH_REC_FIELD(pkey),
248 .offset_words = 12,
249 .offset_bits = 16,
250 .size_bits = 16 },
251 { PATH_REC_FIELD(qos_class),
252 .offset_words = 13,
253 .offset_bits = 0,
254 .size_bits = 12 },
255 { PATH_REC_FIELD(sl),
256 .offset_words = 13,
257 .offset_bits = 12,
258 .size_bits = 4 },
259 { PATH_REC_FIELD(mtu_selector),
260 .offset_words = 13,
261 .offset_bits = 16,
262 .size_bits = 2 },
263 { PATH_REC_FIELD(mtu),
264 .offset_words = 13,
265 .offset_bits = 18,
266 .size_bits = 6 },
267 { PATH_REC_FIELD(rate_selector),
268 .offset_words = 13,
269 .offset_bits = 24,
270 .size_bits = 2 },
271 { PATH_REC_FIELD(rate),
272 .offset_words = 13,
273 .offset_bits = 26,
274 .size_bits = 6 },
275 { PATH_REC_FIELD(packet_life_time_selector),
276 .offset_words = 14,
277 .offset_bits = 0,
278 .size_bits = 2 },
279 { PATH_REC_FIELD(packet_life_time),
280 .offset_words = 14,
281 .offset_bits = 2,
282 .size_bits = 6 },
283 { PATH_REC_FIELD(preference),
284 .offset_words = 14,
285 .offset_bits = 8,
286 .size_bits = 8 },
287 { RESERVED,
288 .offset_words = 14,
289 .offset_bits = 16,
290 .size_bits = 48 },
291 };
292
293 #define OPA_PATH_REC_FIELD(field) \
294 .struct_offset_bytes = \
295 offsetof(struct sa_path_rec, field), \
296 .struct_size_bytes = \
297 sizeof_field(struct sa_path_rec, field), \
298 .field_name = "sa_path_rec:" #field
299
300 static const struct ib_field opa_path_rec_table[] = {
301 { OPA_PATH_REC_FIELD(service_id),
302 .offset_words = 0,
303 .offset_bits = 0,
304 .size_bits = 64 },
305 { OPA_PATH_REC_FIELD(dgid),
306 .offset_words = 2,
307 .offset_bits = 0,
308 .size_bits = 128 },
309 { OPA_PATH_REC_FIELD(sgid),
310 .offset_words = 6,
311 .offset_bits = 0,
312 .size_bits = 128 },
313 { OPA_PATH_REC_FIELD(opa.dlid),
314 .offset_words = 10,
315 .offset_bits = 0,
316 .size_bits = 32 },
317 { OPA_PATH_REC_FIELD(opa.slid),
318 .offset_words = 11,
319 .offset_bits = 0,
320 .size_bits = 32 },
321 { OPA_PATH_REC_FIELD(opa.raw_traffic),
322 .offset_words = 12,
323 .offset_bits = 0,
324 .size_bits = 1 },
325 { RESERVED,
326 .offset_words = 12,
327 .offset_bits = 1,
328 .size_bits = 3 },
329 { OPA_PATH_REC_FIELD(flow_label),
330 .offset_words = 12,
331 .offset_bits = 4,
332 .size_bits = 20 },
333 { OPA_PATH_REC_FIELD(hop_limit),
334 .offset_words = 12,
335 .offset_bits = 24,
336 .size_bits = 8 },
337 { OPA_PATH_REC_FIELD(traffic_class),
338 .offset_words = 13,
339 .offset_bits = 0,
340 .size_bits = 8 },
341 { OPA_PATH_REC_FIELD(reversible),
342 .offset_words = 13,
343 .offset_bits = 8,
344 .size_bits = 1 },
345 { OPA_PATH_REC_FIELD(numb_path),
346 .offset_words = 13,
347 .offset_bits = 9,
348 .size_bits = 7 },
349 { OPA_PATH_REC_FIELD(pkey),
350 .offset_words = 13,
351 .offset_bits = 16,
352 .size_bits = 16 },
353 { OPA_PATH_REC_FIELD(opa.l2_8B),
354 .offset_words = 14,
355 .offset_bits = 0,
356 .size_bits = 1 },
357 { OPA_PATH_REC_FIELD(opa.l2_10B),
358 .offset_words = 14,
359 .offset_bits = 1,
360 .size_bits = 1 },
361 { OPA_PATH_REC_FIELD(opa.l2_9B),
362 .offset_words = 14,
363 .offset_bits = 2,
364 .size_bits = 1 },
365 { OPA_PATH_REC_FIELD(opa.l2_16B),
366 .offset_words = 14,
367 .offset_bits = 3,
368 .size_bits = 1 },
369 { RESERVED,
370 .offset_words = 14,
371 .offset_bits = 4,
372 .size_bits = 2 },
373 { OPA_PATH_REC_FIELD(opa.qos_type),
374 .offset_words = 14,
375 .offset_bits = 6,
376 .size_bits = 2 },
377 { OPA_PATH_REC_FIELD(opa.qos_priority),
378 .offset_words = 14,
379 .offset_bits = 8,
380 .size_bits = 8 },
381 { RESERVED,
382 .offset_words = 14,
383 .offset_bits = 16,
384 .size_bits = 3 },
385 { OPA_PATH_REC_FIELD(sl),
386 .offset_words = 14,
387 .offset_bits = 19,
388 .size_bits = 5 },
389 { RESERVED,
390 .offset_words = 14,
391 .offset_bits = 24,
392 .size_bits = 8 },
393 { OPA_PATH_REC_FIELD(mtu_selector),
394 .offset_words = 15,
395 .offset_bits = 0,
396 .size_bits = 2 },
397 { OPA_PATH_REC_FIELD(mtu),
398 .offset_words = 15,
399 .offset_bits = 2,
400 .size_bits = 6 },
401 { OPA_PATH_REC_FIELD(rate_selector),
402 .offset_words = 15,
403 .offset_bits = 8,
404 .size_bits = 2 },
405 { OPA_PATH_REC_FIELD(rate),
406 .offset_words = 15,
407 .offset_bits = 10,
408 .size_bits = 6 },
409 { OPA_PATH_REC_FIELD(packet_life_time_selector),
410 .offset_words = 15,
411 .offset_bits = 16,
412 .size_bits = 2 },
413 { OPA_PATH_REC_FIELD(packet_life_time),
414 .offset_words = 15,
415 .offset_bits = 18,
416 .size_bits = 6 },
417 { OPA_PATH_REC_FIELD(preference),
418 .offset_words = 15,
419 .offset_bits = 24,
420 .size_bits = 8 },
421 };
422
423 #define MCMEMBER_REC_FIELD(field) \
424 .struct_offset_bytes = offsetof(struct ib_sa_mcmember_rec, field), \
425 .struct_size_bytes = sizeof_field(struct ib_sa_mcmember_rec, field), \
426 .field_name = "sa_mcmember_rec:" #field
427
428 static const struct ib_field mcmember_rec_table[] = {
429 { MCMEMBER_REC_FIELD(mgid),
430 .offset_words = 0,
431 .offset_bits = 0,
432 .size_bits = 128 },
433 { MCMEMBER_REC_FIELD(port_gid),
434 .offset_words = 4,
435 .offset_bits = 0,
436 .size_bits = 128 },
437 { MCMEMBER_REC_FIELD(qkey),
438 .offset_words = 8,
439 .offset_bits = 0,
440 .size_bits = 32 },
441 { MCMEMBER_REC_FIELD(mlid),
442 .offset_words = 9,
443 .offset_bits = 0,
444 .size_bits = 16 },
445 { MCMEMBER_REC_FIELD(mtu_selector),
446 .offset_words = 9,
447 .offset_bits = 16,
448 .size_bits = 2 },
449 { MCMEMBER_REC_FIELD(mtu),
450 .offset_words = 9,
451 .offset_bits = 18,
452 .size_bits = 6 },
453 { MCMEMBER_REC_FIELD(traffic_class),
454 .offset_words = 9,
455 .offset_bits = 24,
456 .size_bits = 8 },
457 { MCMEMBER_REC_FIELD(pkey),
458 .offset_words = 10,
459 .offset_bits = 0,
460 .size_bits = 16 },
461 { MCMEMBER_REC_FIELD(rate_selector),
462 .offset_words = 10,
463 .offset_bits = 16,
464 .size_bits = 2 },
465 { MCMEMBER_REC_FIELD(rate),
466 .offset_words = 10,
467 .offset_bits = 18,
468 .size_bits = 6 },
469 { MCMEMBER_REC_FIELD(packet_life_time_selector),
470 .offset_words = 10,
471 .offset_bits = 24,
472 .size_bits = 2 },
473 { MCMEMBER_REC_FIELD(packet_life_time),
474 .offset_words = 10,
475 .offset_bits = 26,
476 .size_bits = 6 },
477 { MCMEMBER_REC_FIELD(sl),
478 .offset_words = 11,
479 .offset_bits = 0,
480 .size_bits = 4 },
481 { MCMEMBER_REC_FIELD(flow_label),
482 .offset_words = 11,
483 .offset_bits = 4,
484 .size_bits = 20 },
485 { MCMEMBER_REC_FIELD(hop_limit),
486 .offset_words = 11,
487 .offset_bits = 24,
488 .size_bits = 8 },
489 { MCMEMBER_REC_FIELD(scope),
490 .offset_words = 12,
491 .offset_bits = 0,
492 .size_bits = 4 },
493 { MCMEMBER_REC_FIELD(join_state),
494 .offset_words = 12,
495 .offset_bits = 4,
496 .size_bits = 4 },
497 { MCMEMBER_REC_FIELD(proxy_join),
498 .offset_words = 12,
499 .offset_bits = 8,
500 .size_bits = 1 },
501 { RESERVED,
502 .offset_words = 12,
503 .offset_bits = 9,
504 .size_bits = 23 },
505 };
506
507 #define CLASSPORTINFO_REC_FIELD(field) \
508 .struct_offset_bytes = offsetof(struct ib_class_port_info, field), \
509 .struct_size_bytes = sizeof_field(struct ib_class_port_info, field), \
510 .field_name = "ib_class_port_info:" #field
511
512 static const struct ib_field ib_classport_info_rec_table[] = {
513 { CLASSPORTINFO_REC_FIELD(base_version),
514 .offset_words = 0,
515 .offset_bits = 0,
516 .size_bits = 8 },
517 { CLASSPORTINFO_REC_FIELD(class_version),
518 .offset_words = 0,
519 .offset_bits = 8,
520 .size_bits = 8 },
521 { CLASSPORTINFO_REC_FIELD(capability_mask),
522 .offset_words = 0,
523 .offset_bits = 16,
524 .size_bits = 16 },
525 { CLASSPORTINFO_REC_FIELD(cap_mask2_resp_time),
526 .offset_words = 1,
527 .offset_bits = 0,
528 .size_bits = 32 },
529 { CLASSPORTINFO_REC_FIELD(redirect_gid),
530 .offset_words = 2,
531 .offset_bits = 0,
532 .size_bits = 128 },
533 { CLASSPORTINFO_REC_FIELD(redirect_tcslfl),
534 .offset_words = 6,
535 .offset_bits = 0,
536 .size_bits = 32 },
537 { CLASSPORTINFO_REC_FIELD(redirect_lid),
538 .offset_words = 7,
539 .offset_bits = 0,
540 .size_bits = 16 },
541 { CLASSPORTINFO_REC_FIELD(redirect_pkey),
542 .offset_words = 7,
543 .offset_bits = 16,
544 .size_bits = 16 },
545
546 { CLASSPORTINFO_REC_FIELD(redirect_qp),
547 .offset_words = 8,
548 .offset_bits = 0,
549 .size_bits = 32 },
550 { CLASSPORTINFO_REC_FIELD(redirect_qkey),
551 .offset_words = 9,
552 .offset_bits = 0,
553 .size_bits = 32 },
554
555 { CLASSPORTINFO_REC_FIELD(trap_gid),
556 .offset_words = 10,
557 .offset_bits = 0,
558 .size_bits = 128 },
559 { CLASSPORTINFO_REC_FIELD(trap_tcslfl),
560 .offset_words = 14,
561 .offset_bits = 0,
562 .size_bits = 32 },
563
564 { CLASSPORTINFO_REC_FIELD(trap_lid),
565 .offset_words = 15,
566 .offset_bits = 0,
567 .size_bits = 16 },
568 { CLASSPORTINFO_REC_FIELD(trap_pkey),
569 .offset_words = 15,
570 .offset_bits = 16,
571 .size_bits = 16 },
572
573 { CLASSPORTINFO_REC_FIELD(trap_hlqp),
574 .offset_words = 16,
575 .offset_bits = 0,
576 .size_bits = 32 },
577 { CLASSPORTINFO_REC_FIELD(trap_qkey),
578 .offset_words = 17,
579 .offset_bits = 0,
580 .size_bits = 32 },
581 };
582
583 #define OPA_CLASSPORTINFO_REC_FIELD(field) \
584 .struct_offset_bytes =\
585 offsetof(struct opa_class_port_info, field), \
586 .struct_size_bytes = \
587 sizeof_field(struct opa_class_port_info, field), \
588 .field_name = "opa_class_port_info:" #field
589
590 static const struct ib_field opa_classport_info_rec_table[] = {
591 { OPA_CLASSPORTINFO_REC_FIELD(base_version),
592 .offset_words = 0,
593 .offset_bits = 0,
594 .size_bits = 8 },
595 { OPA_CLASSPORTINFO_REC_FIELD(class_version),
596 .offset_words = 0,
597 .offset_bits = 8,
598 .size_bits = 8 },
599 { OPA_CLASSPORTINFO_REC_FIELD(cap_mask),
600 .offset_words = 0,
601 .offset_bits = 16,
602 .size_bits = 16 },
603 { OPA_CLASSPORTINFO_REC_FIELD(cap_mask2_resp_time),
604 .offset_words = 1,
605 .offset_bits = 0,
606 .size_bits = 32 },
607 { OPA_CLASSPORTINFO_REC_FIELD(redirect_gid),
608 .offset_words = 2,
609 .offset_bits = 0,
610 .size_bits = 128 },
611 { OPA_CLASSPORTINFO_REC_FIELD(redirect_tc_fl),
612 .offset_words = 6,
613 .offset_bits = 0,
614 .size_bits = 32 },
615 { OPA_CLASSPORTINFO_REC_FIELD(redirect_lid),
616 .offset_words = 7,
617 .offset_bits = 0,
618 .size_bits = 32 },
619 { OPA_CLASSPORTINFO_REC_FIELD(redirect_sl_qp),
620 .offset_words = 8,
621 .offset_bits = 0,
622 .size_bits = 32 },
623 { OPA_CLASSPORTINFO_REC_FIELD(redirect_qkey),
624 .offset_words = 9,
625 .offset_bits = 0,
626 .size_bits = 32 },
627 { OPA_CLASSPORTINFO_REC_FIELD(trap_gid),
628 .offset_words = 10,
629 .offset_bits = 0,
630 .size_bits = 128 },
631 { OPA_CLASSPORTINFO_REC_FIELD(trap_tc_fl),
632 .offset_words = 14,
633 .offset_bits = 0,
634 .size_bits = 32 },
635 { OPA_CLASSPORTINFO_REC_FIELD(trap_lid),
636 .offset_words = 15,
637 .offset_bits = 0,
638 .size_bits = 32 },
639 { OPA_CLASSPORTINFO_REC_FIELD(trap_hl_qp),
640 .offset_words = 16,
641 .offset_bits = 0,
642 .size_bits = 32 },
643 { OPA_CLASSPORTINFO_REC_FIELD(trap_qkey),
644 .offset_words = 17,
645 .offset_bits = 0,
646 .size_bits = 32 },
647 { OPA_CLASSPORTINFO_REC_FIELD(trap_pkey),
648 .offset_words = 18,
649 .offset_bits = 0,
650 .size_bits = 16 },
651 { OPA_CLASSPORTINFO_REC_FIELD(redirect_pkey),
652 .offset_words = 18,
653 .offset_bits = 16,
654 .size_bits = 16 },
655 { OPA_CLASSPORTINFO_REC_FIELD(trap_sl_rsvd),
656 .offset_words = 19,
657 .offset_bits = 0,
658 .size_bits = 8 },
659 { RESERVED,
660 .offset_words = 19,
661 .offset_bits = 8,
662 .size_bits = 24 },
663 };
664
665 #define GUIDINFO_REC_FIELD(field) \
666 .struct_offset_bytes = offsetof(struct ib_sa_guidinfo_rec, field), \
667 .struct_size_bytes = sizeof_field(struct ib_sa_guidinfo_rec, field), \
668 .field_name = "sa_guidinfo_rec:" #field
669
670 static const struct ib_field guidinfo_rec_table[] = {
671 { GUIDINFO_REC_FIELD(lid),
672 .offset_words = 0,
673 .offset_bits = 0,
674 .size_bits = 16 },
675 { GUIDINFO_REC_FIELD(block_num),
676 .offset_words = 0,
677 .offset_bits = 16,
678 .size_bits = 8 },
679 { GUIDINFO_REC_FIELD(res1),
680 .offset_words = 0,
681 .offset_bits = 24,
682 .size_bits = 8 },
683 { GUIDINFO_REC_FIELD(res2),
684 .offset_words = 1,
685 .offset_bits = 0,
686 .size_bits = 32 },
687 { GUIDINFO_REC_FIELD(guid_info_list),
688 .offset_words = 2,
689 .offset_bits = 0,
690 .size_bits = 512 },
691 };
692
ib_sa_disable_local_svc(struct ib_sa_query * query)693 static inline void ib_sa_disable_local_svc(struct ib_sa_query *query)
694 {
695 query->flags &= ~IB_SA_ENABLE_LOCAL_SERVICE;
696 }
697
ib_sa_query_cancelled(struct ib_sa_query * query)698 static inline int ib_sa_query_cancelled(struct ib_sa_query *query)
699 {
700 return (query->flags & IB_SA_CANCEL);
701 }
702
ib_nl_set_path_rec_attrs(struct sk_buff * skb,struct ib_sa_query * query)703 static void ib_nl_set_path_rec_attrs(struct sk_buff *skb,
704 struct ib_sa_query *query)
705 {
706 struct sa_path_rec *sa_rec = query->mad_buf->context[1];
707 struct ib_sa_mad *mad = query->mad_buf->mad;
708 ib_sa_comp_mask comp_mask = mad->sa_hdr.comp_mask;
709 u16 val16;
710 u64 val64;
711 struct rdma_ls_resolve_header *header;
712
713 query->mad_buf->context[1] = NULL;
714
715 /* Construct the family header first */
716 header = skb_put(skb, NLMSG_ALIGN(sizeof(*header)));
717 strscpy_pad(header->device_name,
718 dev_name(&query->port->agent->device->dev),
719 LS_DEVICE_NAME_MAX);
720 header->port_num = query->port->port_num;
721
722 if ((comp_mask & IB_SA_PATH_REC_REVERSIBLE) &&
723 sa_rec->reversible != 0)
724 query->path_use = LS_RESOLVE_PATH_USE_ALL;
725 else
726 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL;
727 header->path_use = query->path_use;
728
729 /* Now build the attributes */
730 if (comp_mask & IB_SA_PATH_REC_SERVICE_ID) {
731 val64 = be64_to_cpu(sa_rec->service_id);
732 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_SERVICE_ID,
733 sizeof(val64), &val64);
734 }
735 if (comp_mask & IB_SA_PATH_REC_DGID)
736 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_DGID,
737 sizeof(sa_rec->dgid), &sa_rec->dgid);
738 if (comp_mask & IB_SA_PATH_REC_SGID)
739 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_SGID,
740 sizeof(sa_rec->sgid), &sa_rec->sgid);
741 if (comp_mask & IB_SA_PATH_REC_TRAFFIC_CLASS)
742 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_TCLASS,
743 sizeof(sa_rec->traffic_class), &sa_rec->traffic_class);
744
745 if (comp_mask & IB_SA_PATH_REC_PKEY) {
746 val16 = be16_to_cpu(sa_rec->pkey);
747 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_PKEY,
748 sizeof(val16), &val16);
749 }
750 if (comp_mask & IB_SA_PATH_REC_QOS_CLASS) {
751 val16 = be16_to_cpu(sa_rec->qos_class);
752 nla_put(skb, RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_QOS_CLASS,
753 sizeof(val16), &val16);
754 }
755 }
756
ib_nl_get_path_rec_attrs_len(ib_sa_comp_mask comp_mask)757 static int ib_nl_get_path_rec_attrs_len(ib_sa_comp_mask comp_mask)
758 {
759 int len = 0;
760
761 if (comp_mask & IB_SA_PATH_REC_SERVICE_ID)
762 len += nla_total_size(sizeof(u64));
763 if (comp_mask & IB_SA_PATH_REC_DGID)
764 len += nla_total_size(sizeof(struct rdma_nla_ls_gid));
765 if (comp_mask & IB_SA_PATH_REC_SGID)
766 len += nla_total_size(sizeof(struct rdma_nla_ls_gid));
767 if (comp_mask & IB_SA_PATH_REC_TRAFFIC_CLASS)
768 len += nla_total_size(sizeof(u8));
769 if (comp_mask & IB_SA_PATH_REC_PKEY)
770 len += nla_total_size(sizeof(u16));
771 if (comp_mask & IB_SA_PATH_REC_QOS_CLASS)
772 len += nla_total_size(sizeof(u16));
773
774 /*
775 * Make sure that at least some of the required comp_mask bits are
776 * set.
777 */
778 if (WARN_ON(len == 0))
779 return len;
780
781 /* Add the family header */
782 len += NLMSG_ALIGN(sizeof(struct rdma_ls_resolve_header));
783
784 return len;
785 }
786
ib_nl_make_request(struct ib_sa_query * query,gfp_t gfp_mask)787 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask)
788 {
789 struct sk_buff *skb = NULL;
790 struct nlmsghdr *nlh;
791 void *data;
792 struct ib_sa_mad *mad;
793 int len;
794 unsigned long flags;
795 unsigned long delay;
796 gfp_t gfp_flag;
797 int ret;
798
799 INIT_LIST_HEAD(&query->list);
800 query->seq = (u32)atomic_inc_return(&ib_nl_sa_request_seq);
801
802 mad = query->mad_buf->mad;
803 len = ib_nl_get_path_rec_attrs_len(mad->sa_hdr.comp_mask);
804 if (len <= 0)
805 return -EMSGSIZE;
806
807 skb = nlmsg_new(len, gfp_mask);
808 if (!skb)
809 return -ENOMEM;
810
811 /* Put nlmsg header only for now */
812 data = ibnl_put_msg(skb, &nlh, query->seq, 0, RDMA_NL_LS,
813 RDMA_NL_LS_OP_RESOLVE, NLM_F_REQUEST);
814 if (!data) {
815 nlmsg_free(skb);
816 return -EMSGSIZE;
817 }
818
819 /* Add attributes */
820 ib_nl_set_path_rec_attrs(skb, query);
821
822 /* Repair the nlmsg header length */
823 nlmsg_end(skb, nlh);
824
825 gfp_flag = ((gfp_mask & GFP_ATOMIC) == GFP_ATOMIC) ? GFP_ATOMIC :
826 GFP_NOWAIT;
827
828 spin_lock_irqsave(&ib_nl_request_lock, flags);
829 ret = rdma_nl_multicast(&init_net, skb, RDMA_NL_GROUP_LS, gfp_flag);
830
831 if (ret)
832 goto out;
833
834 /* Put the request on the list.*/
835 delay = msecs_to_jiffies(sa_local_svc_timeout_ms);
836 query->timeout = delay + jiffies;
837 list_add_tail(&query->list, &ib_nl_request_list);
838 /* Start the timeout if this is the only request */
839 if (ib_nl_request_list.next == &query->list)
840 queue_delayed_work(ib_nl_wq, &ib_nl_timed_work, delay);
841
842 out:
843 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
844
845 return ret;
846 }
847
ib_nl_cancel_request(struct ib_sa_query * query)848 static int ib_nl_cancel_request(struct ib_sa_query *query)
849 {
850 unsigned long flags;
851 struct ib_sa_query *wait_query;
852 int found = 0;
853
854 spin_lock_irqsave(&ib_nl_request_lock, flags);
855 list_for_each_entry(wait_query, &ib_nl_request_list, list) {
856 /* Let the timeout to take care of the callback */
857 if (query == wait_query) {
858 query->flags |= IB_SA_CANCEL;
859 query->timeout = jiffies;
860 list_move(&query->list, &ib_nl_request_list);
861 found = 1;
862 mod_delayed_work(ib_nl_wq, &ib_nl_timed_work, 1);
863 break;
864 }
865 }
866 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
867
868 return found;
869 }
870
871 static void send_handler(struct ib_mad_agent *agent,
872 struct ib_mad_send_wc *mad_send_wc);
873
ib_nl_process_good_resolve_rsp(struct ib_sa_query * query,const struct nlmsghdr * nlh)874 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query,
875 const struct nlmsghdr *nlh)
876 {
877 struct ib_path_rec_data *srec, *drec;
878 struct ib_sa_path_query *path_query;
879 struct ib_mad_send_wc mad_send_wc;
880 const struct nlattr *head, *curr;
881 struct ib_sa_mad *mad = NULL;
882 int len, rem, num_prs = 0;
883 u32 mask = 0;
884 int status = -EIO;
885
886 if (!query->callback)
887 goto out;
888
889 path_query = container_of(query, struct ib_sa_path_query, sa_query);
890 mad = query->mad_buf->mad;
891 if (!path_query->conv_pr &&
892 (be16_to_cpu(mad->mad_hdr.attr_id) == IB_SA_ATTR_PATH_REC)) {
893 /* Need a larger buffer for possible multiple PRs */
894 query->resp_pr_data = kvcalloc(RDMA_PRIMARY_PATH_MAX_REC_NUM,
895 sizeof(*drec), GFP_KERNEL);
896 if (!query->resp_pr_data) {
897 query->callback(query, -ENOMEM, 0, NULL);
898 return;
899 }
900 }
901
902 head = (const struct nlattr *) nlmsg_data(nlh);
903 len = nlmsg_len(nlh);
904 switch (query->path_use) {
905 case LS_RESOLVE_PATH_USE_UNIDIRECTIONAL:
906 mask = IB_PATH_PRIMARY | IB_PATH_OUTBOUND;
907 break;
908
909 case LS_RESOLVE_PATH_USE_ALL:
910 mask = IB_PATH_PRIMARY;
911 break;
912
913 case LS_RESOLVE_PATH_USE_GMP:
914 default:
915 mask = IB_PATH_PRIMARY | IB_PATH_GMP |
916 IB_PATH_BIDIRECTIONAL;
917 break;
918 }
919
920 drec = (struct ib_path_rec_data *)query->resp_pr_data;
921 nla_for_each_attr(curr, head, len, rem) {
922 if (curr->nla_type != LS_NLA_TYPE_PATH_RECORD)
923 continue;
924
925 srec = nla_data(curr);
926 if ((srec->flags & mask) != mask)
927 continue;
928
929 status = 0;
930 if (!drec) {
931 memcpy(mad->data, srec->path_rec,
932 sizeof(srec->path_rec));
933 num_prs = 1;
934 break;
935 }
936
937 memcpy(drec, srec, sizeof(*drec));
938 drec++;
939 num_prs++;
940 if (num_prs >= RDMA_PRIMARY_PATH_MAX_REC_NUM)
941 break;
942 }
943
944 if (!status)
945 mad->mad_hdr.method |= IB_MGMT_METHOD_RESP;
946
947 query->callback(query, status, num_prs, mad);
948 kvfree(query->resp_pr_data);
949 query->resp_pr_data = NULL;
950
951 out:
952 mad_send_wc.send_buf = query->mad_buf;
953 mad_send_wc.status = IB_WC_SUCCESS;
954 send_handler(query->mad_buf->mad_agent, &mad_send_wc);
955 }
956
ib_nl_request_timeout(struct work_struct * work)957 static void ib_nl_request_timeout(struct work_struct *work)
958 {
959 unsigned long flags;
960 struct ib_sa_query *query;
961 unsigned long delay;
962 struct ib_mad_send_wc mad_send_wc;
963 int ret;
964
965 spin_lock_irqsave(&ib_nl_request_lock, flags);
966 while (!list_empty(&ib_nl_request_list)) {
967 query = list_entry(ib_nl_request_list.next,
968 struct ib_sa_query, list);
969
970 if (time_after(query->timeout, jiffies)) {
971 delay = query->timeout - jiffies;
972 if ((long)delay <= 0)
973 delay = 1;
974 queue_delayed_work(ib_nl_wq, &ib_nl_timed_work, delay);
975 break;
976 }
977
978 list_del(&query->list);
979 ib_sa_disable_local_svc(query);
980 /* Hold the lock to protect against query cancellation */
981 if (ib_sa_query_cancelled(query))
982 ret = -1;
983 else
984 ret = ib_post_send_mad(query->mad_buf, NULL);
985 if (ret) {
986 mad_send_wc.send_buf = query->mad_buf;
987 mad_send_wc.status = IB_WC_WR_FLUSH_ERR;
988 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
989 send_handler(query->port->agent, &mad_send_wc);
990 spin_lock_irqsave(&ib_nl_request_lock, flags);
991 }
992 }
993 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
994 }
995
ib_nl_handle_set_timeout(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)996 int ib_nl_handle_set_timeout(struct sk_buff *skb,
997 struct nlmsghdr *nlh,
998 struct netlink_ext_ack *extack)
999 {
1000 int timeout, delta, abs_delta;
1001 const struct nlattr *attr;
1002 unsigned long flags;
1003 struct ib_sa_query *query;
1004 long delay = 0;
1005 struct nlattr *tb[LS_NLA_TYPE_MAX];
1006 int ret;
1007
1008 if (!(nlh->nlmsg_flags & NLM_F_REQUEST) ||
1009 !(NETLINK_CB(skb).sk))
1010 return -EPERM;
1011
1012 ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
1013 nlmsg_len(nlh), ib_nl_policy, NULL);
1014 attr = (const struct nlattr *)tb[LS_NLA_TYPE_TIMEOUT];
1015 if (ret || !attr)
1016 goto settimeout_out;
1017
1018 timeout = *(int *) nla_data(attr);
1019 if (timeout < IB_SA_LOCAL_SVC_TIMEOUT_MIN)
1020 timeout = IB_SA_LOCAL_SVC_TIMEOUT_MIN;
1021 if (timeout > IB_SA_LOCAL_SVC_TIMEOUT_MAX)
1022 timeout = IB_SA_LOCAL_SVC_TIMEOUT_MAX;
1023
1024 delta = timeout - sa_local_svc_timeout_ms;
1025 if (delta < 0)
1026 abs_delta = -delta;
1027 else
1028 abs_delta = delta;
1029
1030 if (delta != 0) {
1031 spin_lock_irqsave(&ib_nl_request_lock, flags);
1032 sa_local_svc_timeout_ms = timeout;
1033 list_for_each_entry(query, &ib_nl_request_list, list) {
1034 if (delta < 0 && abs_delta > query->timeout)
1035 query->timeout = 0;
1036 else
1037 query->timeout += delta;
1038
1039 /* Get the new delay from the first entry */
1040 if (!delay) {
1041 delay = query->timeout - jiffies;
1042 if (delay <= 0)
1043 delay = 1;
1044 }
1045 }
1046 if (delay)
1047 mod_delayed_work(ib_nl_wq, &ib_nl_timed_work,
1048 (unsigned long)delay);
1049 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
1050 }
1051
1052 settimeout_out:
1053 return 0;
1054 }
1055
ib_nl_is_good_resolve_resp(const struct nlmsghdr * nlh)1056 static inline int ib_nl_is_good_resolve_resp(const struct nlmsghdr *nlh)
1057 {
1058 struct nlattr *tb[LS_NLA_TYPE_MAX];
1059 int ret;
1060
1061 if (nlh->nlmsg_flags & RDMA_NL_LS_F_ERR)
1062 return 0;
1063
1064 ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
1065 nlmsg_len(nlh), ib_nl_policy, NULL);
1066 if (ret)
1067 return 0;
1068
1069 return 1;
1070 }
1071
ib_nl_handle_resolve_resp(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)1072 int ib_nl_handle_resolve_resp(struct sk_buff *skb,
1073 struct nlmsghdr *nlh,
1074 struct netlink_ext_ack *extack)
1075 {
1076 unsigned long flags;
1077 struct ib_sa_query *query = NULL, *iter;
1078 struct ib_mad_send_buf *send_buf;
1079 struct ib_mad_send_wc mad_send_wc;
1080 int ret;
1081
1082 if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
1083 !(NETLINK_CB(skb).sk))
1084 return -EPERM;
1085
1086 spin_lock_irqsave(&ib_nl_request_lock, flags);
1087 list_for_each_entry(iter, &ib_nl_request_list, list) {
1088 /*
1089 * If the query is cancelled, let the timeout routine
1090 * take care of it.
1091 */
1092 if (nlh->nlmsg_seq == iter->seq) {
1093 if (!ib_sa_query_cancelled(iter)) {
1094 list_del(&iter->list);
1095 query = iter;
1096 }
1097 break;
1098 }
1099 }
1100
1101 if (!query) {
1102 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
1103 goto resp_out;
1104 }
1105
1106 send_buf = query->mad_buf;
1107
1108 if (!ib_nl_is_good_resolve_resp(nlh)) {
1109 /* if the result is a failure, send out the packet via IB */
1110 ib_sa_disable_local_svc(query);
1111 ret = ib_post_send_mad(query->mad_buf, NULL);
1112 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
1113 if (ret) {
1114 mad_send_wc.send_buf = send_buf;
1115 mad_send_wc.status = IB_WC_GENERAL_ERR;
1116 send_handler(query->port->agent, &mad_send_wc);
1117 }
1118 } else {
1119 spin_unlock_irqrestore(&ib_nl_request_lock, flags);
1120 ib_nl_process_good_resolve_rsp(query, nlh);
1121 }
1122
1123 resp_out:
1124 return 0;
1125 }
1126
free_sm_ah(struct kref * kref)1127 static void free_sm_ah(struct kref *kref)
1128 {
1129 struct ib_sa_sm_ah *sm_ah = container_of(kref, struct ib_sa_sm_ah, ref);
1130
1131 rdma_destroy_ah(sm_ah->ah, 0);
1132 kfree(sm_ah);
1133 }
1134
ib_sa_register_client(struct ib_sa_client * client)1135 void ib_sa_register_client(struct ib_sa_client *client)
1136 {
1137 atomic_set(&client->users, 1);
1138 init_completion(&client->comp);
1139 }
1140 EXPORT_SYMBOL(ib_sa_register_client);
1141
ib_sa_unregister_client(struct ib_sa_client * client)1142 void ib_sa_unregister_client(struct ib_sa_client *client)
1143 {
1144 ib_sa_client_put(client);
1145 wait_for_completion(&client->comp);
1146 }
1147 EXPORT_SYMBOL(ib_sa_unregister_client);
1148
1149 /**
1150 * ib_sa_cancel_query - try to cancel an SA query
1151 * @id:ID of query to cancel
1152 * @query:query pointer to cancel
1153 *
1154 * Try to cancel an SA query. If the id and query don't match up or
1155 * the query has already completed, nothing is done. Otherwise the
1156 * query is canceled and will complete with a status of -EINTR.
1157 */
ib_sa_cancel_query(int id,struct ib_sa_query * query)1158 void ib_sa_cancel_query(int id, struct ib_sa_query *query)
1159 {
1160 unsigned long flags;
1161 struct ib_mad_send_buf *mad_buf;
1162
1163 xa_lock_irqsave(&queries, flags);
1164 if (xa_load(&queries, id) != query) {
1165 xa_unlock_irqrestore(&queries, flags);
1166 return;
1167 }
1168 mad_buf = query->mad_buf;
1169 xa_unlock_irqrestore(&queries, flags);
1170
1171 /*
1172 * If the query is still on the netlink request list, schedule
1173 * it to be cancelled by the timeout routine. Otherwise, it has been
1174 * sent to the MAD layer and has to be cancelled from there.
1175 */
1176 if (!ib_nl_cancel_request(query))
1177 ib_cancel_mad(mad_buf);
1178 }
1179 EXPORT_SYMBOL(ib_sa_cancel_query);
1180
get_src_path_mask(struct ib_device * device,u32 port_num)1181 static u8 get_src_path_mask(struct ib_device *device, u32 port_num)
1182 {
1183 struct ib_sa_device *sa_dev;
1184 struct ib_sa_port *port;
1185 unsigned long flags;
1186 u8 src_path_mask;
1187
1188 sa_dev = ib_get_client_data(device, &sa_client);
1189 if (!sa_dev)
1190 return 0x7f;
1191
1192 port = &sa_dev->port[port_num - sa_dev->start_port];
1193 spin_lock_irqsave(&port->ah_lock, flags);
1194 src_path_mask = port->sm_ah ? port->sm_ah->src_path_mask : 0x7f;
1195 spin_unlock_irqrestore(&port->ah_lock, flags);
1196
1197 return src_path_mask;
1198 }
1199
init_ah_attr_grh_fields(struct ib_device * device,u32 port_num,struct sa_path_rec * rec,struct rdma_ah_attr * ah_attr,const struct ib_gid_attr * gid_attr)1200 static int init_ah_attr_grh_fields(struct ib_device *device, u32 port_num,
1201 struct sa_path_rec *rec,
1202 struct rdma_ah_attr *ah_attr,
1203 const struct ib_gid_attr *gid_attr)
1204 {
1205 enum ib_gid_type type = sa_conv_pathrec_to_gid_type(rec);
1206
1207 if (!gid_attr) {
1208 gid_attr = rdma_find_gid_by_port(device, &rec->sgid, type,
1209 port_num, NULL);
1210 if (IS_ERR(gid_attr))
1211 return PTR_ERR(gid_attr);
1212 } else
1213 rdma_hold_gid_attr(gid_attr);
1214
1215 rdma_move_grh_sgid_attr(ah_attr, &rec->dgid,
1216 be32_to_cpu(rec->flow_label),
1217 rec->hop_limit, rec->traffic_class,
1218 gid_attr);
1219 return 0;
1220 }
1221
1222 /**
1223 * ib_init_ah_attr_from_path - Initialize address handle attributes based on
1224 * an SA path record.
1225 * @device: Device associated ah attributes initialization.
1226 * @port_num: Port on the specified device.
1227 * @rec: path record entry to use for ah attributes initialization.
1228 * @ah_attr: address handle attributes to initialization from path record.
1229 * @gid_attr: SGID attribute to consider during initialization.
1230 *
1231 * When ib_init_ah_attr_from_path() returns success,
1232 * (a) for IB link layer it optionally contains a reference to SGID attribute
1233 * when GRH is present for IB link layer.
1234 * (b) for RoCE link layer it contains a reference to SGID attribute.
1235 * User must invoke rdma_destroy_ah_attr() to release reference to SGID
1236 * attributes which are initialized using ib_init_ah_attr_from_path().
1237 */
ib_init_ah_attr_from_path(struct ib_device * device,u32 port_num,struct sa_path_rec * rec,struct rdma_ah_attr * ah_attr,const struct ib_gid_attr * gid_attr)1238 int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num,
1239 struct sa_path_rec *rec,
1240 struct rdma_ah_attr *ah_attr,
1241 const struct ib_gid_attr *gid_attr)
1242 {
1243 int ret = 0;
1244
1245 memset(ah_attr, 0, sizeof(*ah_attr));
1246 ah_attr->type = rdma_ah_find_type(device, port_num);
1247 rdma_ah_set_sl(ah_attr, rec->sl);
1248 rdma_ah_set_port_num(ah_attr, port_num);
1249 rdma_ah_set_static_rate(ah_attr, rec->rate);
1250
1251 if (sa_path_is_roce(rec)) {
1252 ret = roce_resolve_route_from_path(rec, gid_attr);
1253 if (ret)
1254 return ret;
1255
1256 memcpy(ah_attr->roce.dmac, sa_path_get_dmac(rec), ETH_ALEN);
1257 } else {
1258 rdma_ah_set_dlid(ah_attr, be32_to_cpu(sa_path_get_dlid(rec)));
1259 if (sa_path_is_opa(rec) &&
1260 rdma_ah_get_dlid(ah_attr) == be16_to_cpu(IB_LID_PERMISSIVE))
1261 rdma_ah_set_make_grd(ah_attr, true);
1262
1263 rdma_ah_set_path_bits(ah_attr,
1264 be32_to_cpu(sa_path_get_slid(rec)) &
1265 get_src_path_mask(device, port_num));
1266 }
1267
1268 if (rec->hop_limit > 0 || sa_path_is_roce(rec))
1269 ret = init_ah_attr_grh_fields(device, port_num,
1270 rec, ah_attr, gid_attr);
1271 return ret;
1272 }
1273 EXPORT_SYMBOL(ib_init_ah_attr_from_path);
1274
alloc_mad(struct ib_sa_query * query,gfp_t gfp_mask)1275 static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask)
1276 {
1277 struct rdma_ah_attr ah_attr;
1278 unsigned long flags;
1279
1280 spin_lock_irqsave(&query->port->ah_lock, flags);
1281 if (!query->port->sm_ah) {
1282 spin_unlock_irqrestore(&query->port->ah_lock, flags);
1283 return -EAGAIN;
1284 }
1285 kref_get(&query->port->sm_ah->ref);
1286 query->sm_ah = query->port->sm_ah;
1287 spin_unlock_irqrestore(&query->port->ah_lock, flags);
1288
1289 /*
1290 * Always check if sm_ah has valid dlid assigned,
1291 * before querying for class port info
1292 */
1293 if ((rdma_query_ah(query->sm_ah->ah, &ah_attr) < 0) ||
1294 !rdma_is_valid_unicast_lid(&ah_attr)) {
1295 kref_put(&query->sm_ah->ref, free_sm_ah);
1296 return -EAGAIN;
1297 }
1298 query->mad_buf = ib_create_send_mad(query->port->agent, 1,
1299 query->sm_ah->pkey_index,
1300 0, IB_MGMT_SA_HDR, IB_MGMT_SA_DATA,
1301 gfp_mask,
1302 ((query->flags & IB_SA_QUERY_OPA) ?
1303 OPA_MGMT_BASE_VERSION :
1304 IB_MGMT_BASE_VERSION));
1305 if (IS_ERR(query->mad_buf)) {
1306 kref_put(&query->sm_ah->ref, free_sm_ah);
1307 return -ENOMEM;
1308 }
1309
1310 query->mad_buf->ah = query->sm_ah->ah;
1311
1312 return 0;
1313 }
1314
free_mad(struct ib_sa_query * query)1315 static void free_mad(struct ib_sa_query *query)
1316 {
1317 ib_free_send_mad(query->mad_buf);
1318 kref_put(&query->sm_ah->ref, free_sm_ah);
1319 }
1320
init_mad(struct ib_sa_query * query,struct ib_mad_agent * agent)1321 static void init_mad(struct ib_sa_query *query, struct ib_mad_agent *agent)
1322 {
1323 struct ib_sa_mad *mad = query->mad_buf->mad;
1324 unsigned long flags;
1325
1326 memset(mad, 0, sizeof *mad);
1327
1328 if (query->flags & IB_SA_QUERY_OPA) {
1329 mad->mad_hdr.base_version = OPA_MGMT_BASE_VERSION;
1330 mad->mad_hdr.class_version = OPA_SA_CLASS_VERSION;
1331 } else {
1332 mad->mad_hdr.base_version = IB_MGMT_BASE_VERSION;
1333 mad->mad_hdr.class_version = IB_SA_CLASS_VERSION;
1334 }
1335 mad->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM;
1336 spin_lock_irqsave(&tid_lock, flags);
1337 mad->mad_hdr.tid =
1338 cpu_to_be64(((u64) agent->hi_tid) << 32 | tid++);
1339 spin_unlock_irqrestore(&tid_lock, flags);
1340 }
1341
send_mad(struct ib_sa_query * query,unsigned long timeout_ms,gfp_t gfp_mask)1342 static int send_mad(struct ib_sa_query *query, unsigned long timeout_ms,
1343 gfp_t gfp_mask)
1344 {
1345 unsigned long flags;
1346 int ret, id;
1347 const int nmbr_sa_query_retries = 10;
1348
1349 xa_lock_irqsave(&queries, flags);
1350 ret = __xa_alloc(&queries, &id, query, xa_limit_32b, gfp_mask);
1351 xa_unlock_irqrestore(&queries, flags);
1352 if (ret < 0)
1353 return ret;
1354
1355 query->mad_buf->timeout_ms = timeout_ms / nmbr_sa_query_retries;
1356 query->mad_buf->retries = nmbr_sa_query_retries;
1357 if (!query->mad_buf->timeout_ms) {
1358 /* Special case, very small timeout_ms */
1359 query->mad_buf->timeout_ms = 1;
1360 query->mad_buf->retries = timeout_ms;
1361 }
1362 query->mad_buf->context[0] = query;
1363 query->id = id;
1364
1365 if ((query->flags & IB_SA_ENABLE_LOCAL_SERVICE) &&
1366 (!(query->flags & IB_SA_QUERY_OPA))) {
1367 if (rdma_nl_chk_listeners(RDMA_NL_GROUP_LS)) {
1368 if (!ib_nl_make_request(query, gfp_mask))
1369 return id;
1370 }
1371 ib_sa_disable_local_svc(query);
1372 }
1373
1374 ret = ib_post_send_mad(query->mad_buf, NULL);
1375 if (ret) {
1376 xa_lock_irqsave(&queries, flags);
1377 __xa_erase(&queries, id);
1378 xa_unlock_irqrestore(&queries, flags);
1379 }
1380
1381 /*
1382 * It's not safe to dereference query any more, because the
1383 * send may already have completed and freed the query in
1384 * another context.
1385 */
1386 return ret ? ret : id;
1387 }
1388
ib_sa_unpack_path(void * attribute,struct sa_path_rec * rec)1389 void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec)
1390 {
1391 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), attribute, rec);
1392 }
1393 EXPORT_SYMBOL(ib_sa_unpack_path);
1394
ib_sa_pack_path(struct sa_path_rec * rec,void * attribute)1395 void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute)
1396 {
1397 ib_pack(path_rec_table, ARRAY_SIZE(path_rec_table), rec, attribute);
1398 }
1399 EXPORT_SYMBOL(ib_sa_pack_path);
1400
ib_sa_opa_pathrecord_support(struct ib_sa_client * client,struct ib_sa_device * sa_dev,u32 port_num)1401 static bool ib_sa_opa_pathrecord_support(struct ib_sa_client *client,
1402 struct ib_sa_device *sa_dev,
1403 u32 port_num)
1404 {
1405 struct ib_sa_port *port;
1406 unsigned long flags;
1407 bool ret = false;
1408
1409 port = &sa_dev->port[port_num - sa_dev->start_port];
1410 spin_lock_irqsave(&port->classport_lock, flags);
1411 if (!port->classport_info.valid)
1412 goto ret;
1413
1414 if (port->classport_info.data.type == RDMA_CLASS_PORT_INFO_OPA)
1415 ret = opa_get_cpi_capmask2(&port->classport_info.data.opa) &
1416 OPA_CLASS_PORT_INFO_PR_SUPPORT;
1417 ret:
1418 spin_unlock_irqrestore(&port->classport_lock, flags);
1419 return ret;
1420 }
1421
1422 enum opa_pr_supported {
1423 PR_NOT_SUPPORTED,
1424 PR_OPA_SUPPORTED,
1425 PR_IB_SUPPORTED
1426 };
1427
1428 /*
1429 * opa_pr_query_possible - Check if current PR query can be an OPA query.
1430 *
1431 * Retuns PR_NOT_SUPPORTED if a path record query is not
1432 * possible, PR_OPA_SUPPORTED if an OPA path record query
1433 * is possible and PR_IB_SUPPORTED if an IB path record
1434 * query is possible.
1435 */
opa_pr_query_possible(struct ib_sa_client * client,struct ib_sa_device * sa_dev,struct ib_device * device,u32 port_num)1436 static int opa_pr_query_possible(struct ib_sa_client *client,
1437 struct ib_sa_device *sa_dev,
1438 struct ib_device *device, u32 port_num)
1439 {
1440 struct ib_port_attr port_attr;
1441
1442 if (ib_query_port(device, port_num, &port_attr))
1443 return PR_NOT_SUPPORTED;
1444
1445 if (ib_sa_opa_pathrecord_support(client, sa_dev, port_num))
1446 return PR_OPA_SUPPORTED;
1447
1448 if (port_attr.lid >= be16_to_cpu(IB_MULTICAST_LID_BASE))
1449 return PR_NOT_SUPPORTED;
1450 else
1451 return PR_IB_SUPPORTED;
1452 }
1453
ib_sa_pr_callback_single(struct ib_sa_path_query * query,int status,struct ib_sa_mad * mad)1454 static void ib_sa_pr_callback_single(struct ib_sa_path_query *query,
1455 int status, struct ib_sa_mad *mad)
1456 {
1457 struct sa_path_rec rec = {};
1458
1459 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table),
1460 mad->data, &rec);
1461 rec.rec_type = SA_PATH_REC_TYPE_IB;
1462 sa_path_set_dmac_zero(&rec);
1463
1464 if (query->conv_pr) {
1465 struct sa_path_rec opa;
1466
1467 memset(&opa, 0, sizeof(struct sa_path_rec));
1468 sa_convert_path_ib_to_opa(&opa, &rec);
1469 query->callback(status, &opa, 1, query->context);
1470 } else {
1471 query->callback(status, &rec, 1, query->context);
1472 }
1473 }
1474
1475 /**
1476 * ib_sa_pr_callback_multiple() - Parse path records then do callback.
1477 *
1478 * In a multiple-PR case the PRs are saved in "query->resp_pr_data"
1479 * (instead of"mad->data") and with "ib_path_rec_data" structure format,
1480 * so that rec->flags can be set to indicate the type of PR.
1481 * This is valid only in IB fabric.
1482 */
ib_sa_pr_callback_multiple(struct ib_sa_path_query * query,int status,int num_prs,struct ib_path_rec_data * rec_data)1483 static void ib_sa_pr_callback_multiple(struct ib_sa_path_query *query,
1484 int status, int num_prs,
1485 struct ib_path_rec_data *rec_data)
1486 {
1487 struct sa_path_rec *rec;
1488 int i;
1489
1490 rec = kvcalloc(num_prs, sizeof(*rec), GFP_KERNEL);
1491 if (!rec) {
1492 query->callback(-ENOMEM, NULL, 0, query->context);
1493 return;
1494 }
1495
1496 for (i = 0; i < num_prs; i++) {
1497 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table),
1498 rec_data[i].path_rec, rec + i);
1499 rec[i].rec_type = SA_PATH_REC_TYPE_IB;
1500 sa_path_set_dmac_zero(rec + i);
1501 rec[i].flags = rec_data[i].flags;
1502 }
1503
1504 query->callback(status, rec, num_prs, query->context);
1505 kvfree(rec);
1506 }
1507
ib_sa_path_rec_callback(struct ib_sa_query * sa_query,int status,int num_prs,struct ib_sa_mad * mad)1508 static void ib_sa_path_rec_callback(struct ib_sa_query *sa_query,
1509 int status, int num_prs,
1510 struct ib_sa_mad *mad)
1511 {
1512 struct ib_sa_path_query *query =
1513 container_of(sa_query, struct ib_sa_path_query, sa_query);
1514 struct sa_path_rec rec;
1515
1516 if (!mad || !num_prs) {
1517 query->callback(status, NULL, 0, query->context);
1518 return;
1519 }
1520
1521 if (sa_query->flags & IB_SA_QUERY_OPA) {
1522 if (num_prs != 1) {
1523 query->callback(-EINVAL, NULL, 0, query->context);
1524 return;
1525 }
1526
1527 ib_unpack(opa_path_rec_table, ARRAY_SIZE(opa_path_rec_table),
1528 mad->data, &rec);
1529 rec.rec_type = SA_PATH_REC_TYPE_OPA;
1530 query->callback(status, &rec, num_prs, query->context);
1531 } else {
1532 if (!sa_query->resp_pr_data)
1533 ib_sa_pr_callback_single(query, status, mad);
1534 else
1535 ib_sa_pr_callback_multiple(query, status, num_prs,
1536 sa_query->resp_pr_data);
1537 }
1538 }
1539
ib_sa_path_rec_release(struct ib_sa_query * sa_query)1540 static void ib_sa_path_rec_release(struct ib_sa_query *sa_query)
1541 {
1542 struct ib_sa_path_query *query =
1543 container_of(sa_query, struct ib_sa_path_query, sa_query);
1544
1545 kfree(query->conv_pr);
1546 kfree(query);
1547 }
1548
1549 /**
1550 * ib_sa_path_rec_get - Start a Path get query
1551 * @client:SA client
1552 * @device:device to send query on
1553 * @port_num: port number to send query on
1554 * @rec:Path Record to send in query
1555 * @comp_mask:component mask to send in query
1556 * @timeout_ms:time to wait for response
1557 * @gfp_mask:GFP mask to use for internal allocations
1558 * @callback:function called when query completes, times out or is
1559 * canceled
1560 * @context:opaque user context passed to callback
1561 * @sa_query:query context, used to cancel query
1562 *
1563 * Send a Path Record Get query to the SA to look up a path. The
1564 * callback function will be called when the query completes (or
1565 * fails); status is 0 for a successful response, -EINTR if the query
1566 * is canceled, -ETIMEDOUT is the query timed out, or -EIO if an error
1567 * occurred sending the query. The resp parameter of the callback is
1568 * only valid if status is 0.
1569 *
1570 * If the return value of ib_sa_path_rec_get() is negative, it is an
1571 * error code. Otherwise it is a query ID that can be used to cancel
1572 * the query.
1573 */
ib_sa_path_rec_get(struct ib_sa_client * client,struct ib_device * device,u32 port_num,struct sa_path_rec * rec,ib_sa_comp_mask comp_mask,unsigned long timeout_ms,gfp_t gfp_mask,void (* callback)(int status,struct sa_path_rec * resp,int num_paths,void * context),void * context,struct ib_sa_query ** sa_query)1574 int ib_sa_path_rec_get(struct ib_sa_client *client,
1575 struct ib_device *device, u32 port_num,
1576 struct sa_path_rec *rec,
1577 ib_sa_comp_mask comp_mask,
1578 unsigned long timeout_ms, gfp_t gfp_mask,
1579 void (*callback)(int status,
1580 struct sa_path_rec *resp,
1581 int num_paths, void *context),
1582 void *context,
1583 struct ib_sa_query **sa_query)
1584 {
1585 struct ib_sa_path_query *query;
1586 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client);
1587 struct ib_sa_port *port;
1588 struct ib_mad_agent *agent;
1589 struct ib_sa_mad *mad;
1590 enum opa_pr_supported status;
1591 int ret;
1592
1593 if (!sa_dev)
1594 return -ENODEV;
1595
1596 if ((rec->rec_type != SA_PATH_REC_TYPE_IB) &&
1597 (rec->rec_type != SA_PATH_REC_TYPE_OPA))
1598 return -EINVAL;
1599
1600 port = &sa_dev->port[port_num - sa_dev->start_port];
1601 agent = port->agent;
1602
1603 query = kzalloc(sizeof(*query), gfp_mask);
1604 if (!query)
1605 return -ENOMEM;
1606
1607 query->sa_query.port = port;
1608 if (rec->rec_type == SA_PATH_REC_TYPE_OPA) {
1609 status = opa_pr_query_possible(client, sa_dev, device, port_num);
1610 if (status == PR_NOT_SUPPORTED) {
1611 ret = -EINVAL;
1612 goto err1;
1613 } else if (status == PR_OPA_SUPPORTED) {
1614 query->sa_query.flags |= IB_SA_QUERY_OPA;
1615 } else {
1616 query->conv_pr =
1617 kmalloc(sizeof(*query->conv_pr), gfp_mask);
1618 if (!query->conv_pr) {
1619 ret = -ENOMEM;
1620 goto err1;
1621 }
1622 }
1623 }
1624
1625 ret = alloc_mad(&query->sa_query, gfp_mask);
1626 if (ret)
1627 goto err2;
1628
1629 ib_sa_client_get(client);
1630 query->sa_query.client = client;
1631 query->callback = callback;
1632 query->context = context;
1633
1634 mad = query->sa_query.mad_buf->mad;
1635 init_mad(&query->sa_query, agent);
1636
1637 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL;
1638 query->sa_query.release = ib_sa_path_rec_release;
1639 mad->mad_hdr.method = IB_MGMT_METHOD_GET;
1640 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_PATH_REC);
1641 mad->sa_hdr.comp_mask = comp_mask;
1642
1643 if (query->sa_query.flags & IB_SA_QUERY_OPA) {
1644 ib_pack(opa_path_rec_table, ARRAY_SIZE(opa_path_rec_table),
1645 rec, mad->data);
1646 } else if (query->conv_pr) {
1647 sa_convert_path_opa_to_ib(query->conv_pr, rec);
1648 ib_pack(path_rec_table, ARRAY_SIZE(path_rec_table),
1649 query->conv_pr, mad->data);
1650 } else {
1651 ib_pack(path_rec_table, ARRAY_SIZE(path_rec_table),
1652 rec, mad->data);
1653 }
1654
1655 *sa_query = &query->sa_query;
1656
1657 query->sa_query.flags |= IB_SA_ENABLE_LOCAL_SERVICE;
1658 query->sa_query.mad_buf->context[1] = (query->conv_pr) ?
1659 query->conv_pr : rec;
1660
1661 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask);
1662 if (ret < 0)
1663 goto err3;
1664
1665 return ret;
1666
1667 err3:
1668 *sa_query = NULL;
1669 ib_sa_client_put(query->sa_query.client);
1670 free_mad(&query->sa_query);
1671 err2:
1672 kfree(query->conv_pr);
1673 err1:
1674 kfree(query);
1675 return ret;
1676 }
1677 EXPORT_SYMBOL(ib_sa_path_rec_get);
1678
ib_sa_mcmember_rec_callback(struct ib_sa_query * sa_query,int status,int num_prs,struct ib_sa_mad * mad)1679 static void ib_sa_mcmember_rec_callback(struct ib_sa_query *sa_query,
1680 int status, int num_prs,
1681 struct ib_sa_mad *mad)
1682 {
1683 struct ib_sa_mcmember_query *query =
1684 container_of(sa_query, struct ib_sa_mcmember_query, sa_query);
1685
1686 if (mad) {
1687 struct ib_sa_mcmember_rec rec;
1688
1689 ib_unpack(mcmember_rec_table, ARRAY_SIZE(mcmember_rec_table),
1690 mad->data, &rec);
1691 query->callback(status, &rec, query->context);
1692 } else
1693 query->callback(status, NULL, query->context);
1694 }
1695
ib_sa_mcmember_rec_release(struct ib_sa_query * sa_query)1696 static void ib_sa_mcmember_rec_release(struct ib_sa_query *sa_query)
1697 {
1698 kfree(container_of(sa_query, struct ib_sa_mcmember_query, sa_query));
1699 }
1700
ib_sa_mcmember_rec_query(struct ib_sa_client * client,struct ib_device * device,u32 port_num,u8 method,struct ib_sa_mcmember_rec * rec,ib_sa_comp_mask comp_mask,unsigned long timeout_ms,gfp_t gfp_mask,void (* callback)(int status,struct ib_sa_mcmember_rec * resp,void * context),void * context,struct ib_sa_query ** sa_query)1701 int ib_sa_mcmember_rec_query(struct ib_sa_client *client,
1702 struct ib_device *device, u32 port_num,
1703 u8 method,
1704 struct ib_sa_mcmember_rec *rec,
1705 ib_sa_comp_mask comp_mask,
1706 unsigned long timeout_ms, gfp_t gfp_mask,
1707 void (*callback)(int status,
1708 struct ib_sa_mcmember_rec *resp,
1709 void *context),
1710 void *context,
1711 struct ib_sa_query **sa_query)
1712 {
1713 struct ib_sa_mcmember_query *query;
1714 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client);
1715 struct ib_sa_port *port;
1716 struct ib_mad_agent *agent;
1717 struct ib_sa_mad *mad;
1718 int ret;
1719
1720 if (!sa_dev)
1721 return -ENODEV;
1722
1723 port = &sa_dev->port[port_num - sa_dev->start_port];
1724 agent = port->agent;
1725
1726 query = kzalloc(sizeof(*query), gfp_mask);
1727 if (!query)
1728 return -ENOMEM;
1729
1730 query->sa_query.port = port;
1731 ret = alloc_mad(&query->sa_query, gfp_mask);
1732 if (ret)
1733 goto err1;
1734
1735 ib_sa_client_get(client);
1736 query->sa_query.client = client;
1737 query->callback = callback;
1738 query->context = context;
1739
1740 mad = query->sa_query.mad_buf->mad;
1741 init_mad(&query->sa_query, agent);
1742
1743 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL;
1744 query->sa_query.release = ib_sa_mcmember_rec_release;
1745 mad->mad_hdr.method = method;
1746 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_MC_MEMBER_REC);
1747 mad->sa_hdr.comp_mask = comp_mask;
1748
1749 ib_pack(mcmember_rec_table, ARRAY_SIZE(mcmember_rec_table),
1750 rec, mad->data);
1751
1752 *sa_query = &query->sa_query;
1753
1754 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask);
1755 if (ret < 0)
1756 goto err2;
1757
1758 return ret;
1759
1760 err2:
1761 *sa_query = NULL;
1762 ib_sa_client_put(query->sa_query.client);
1763 free_mad(&query->sa_query);
1764
1765 err1:
1766 kfree(query);
1767 return ret;
1768 }
1769
1770 /* Support GuidInfoRecord */
ib_sa_guidinfo_rec_callback(struct ib_sa_query * sa_query,int status,int num_paths,struct ib_sa_mad * mad)1771 static void ib_sa_guidinfo_rec_callback(struct ib_sa_query *sa_query,
1772 int status, int num_paths,
1773 struct ib_sa_mad *mad)
1774 {
1775 struct ib_sa_guidinfo_query *query =
1776 container_of(sa_query, struct ib_sa_guidinfo_query, sa_query);
1777
1778 if (mad) {
1779 struct ib_sa_guidinfo_rec rec;
1780
1781 ib_unpack(guidinfo_rec_table, ARRAY_SIZE(guidinfo_rec_table),
1782 mad->data, &rec);
1783 query->callback(status, &rec, query->context);
1784 } else
1785 query->callback(status, NULL, query->context);
1786 }
1787
ib_sa_guidinfo_rec_release(struct ib_sa_query * sa_query)1788 static void ib_sa_guidinfo_rec_release(struct ib_sa_query *sa_query)
1789 {
1790 kfree(container_of(sa_query, struct ib_sa_guidinfo_query, sa_query));
1791 }
1792
ib_sa_guid_info_rec_query(struct ib_sa_client * client,struct ib_device * device,u32 port_num,struct ib_sa_guidinfo_rec * rec,ib_sa_comp_mask comp_mask,u8 method,unsigned long timeout_ms,gfp_t gfp_mask,void (* callback)(int status,struct ib_sa_guidinfo_rec * resp,void * context),void * context,struct ib_sa_query ** sa_query)1793 int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
1794 struct ib_device *device, u32 port_num,
1795 struct ib_sa_guidinfo_rec *rec,
1796 ib_sa_comp_mask comp_mask, u8 method,
1797 unsigned long timeout_ms, gfp_t gfp_mask,
1798 void (*callback)(int status,
1799 struct ib_sa_guidinfo_rec *resp,
1800 void *context),
1801 void *context,
1802 struct ib_sa_query **sa_query)
1803 {
1804 struct ib_sa_guidinfo_query *query;
1805 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client);
1806 struct ib_sa_port *port;
1807 struct ib_mad_agent *agent;
1808 struct ib_sa_mad *mad;
1809 int ret;
1810
1811 if (!sa_dev)
1812 return -ENODEV;
1813
1814 if (method != IB_MGMT_METHOD_GET &&
1815 method != IB_MGMT_METHOD_SET &&
1816 method != IB_SA_METHOD_DELETE) {
1817 return -EINVAL;
1818 }
1819
1820 port = &sa_dev->port[port_num - sa_dev->start_port];
1821 agent = port->agent;
1822
1823 query = kzalloc(sizeof(*query), gfp_mask);
1824 if (!query)
1825 return -ENOMEM;
1826
1827 query->sa_query.port = port;
1828 ret = alloc_mad(&query->sa_query, gfp_mask);
1829 if (ret)
1830 goto err1;
1831
1832 ib_sa_client_get(client);
1833 query->sa_query.client = client;
1834 query->callback = callback;
1835 query->context = context;
1836
1837 mad = query->sa_query.mad_buf->mad;
1838 init_mad(&query->sa_query, agent);
1839
1840 query->sa_query.callback = callback ? ib_sa_guidinfo_rec_callback : NULL;
1841 query->sa_query.release = ib_sa_guidinfo_rec_release;
1842
1843 mad->mad_hdr.method = method;
1844 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_GUID_INFO_REC);
1845 mad->sa_hdr.comp_mask = comp_mask;
1846
1847 ib_pack(guidinfo_rec_table, ARRAY_SIZE(guidinfo_rec_table), rec,
1848 mad->data);
1849
1850 *sa_query = &query->sa_query;
1851
1852 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask);
1853 if (ret < 0)
1854 goto err2;
1855
1856 return ret;
1857
1858 err2:
1859 *sa_query = NULL;
1860 ib_sa_client_put(query->sa_query.client);
1861 free_mad(&query->sa_query);
1862
1863 err1:
1864 kfree(query);
1865 return ret;
1866 }
1867 EXPORT_SYMBOL(ib_sa_guid_info_rec_query);
1868
1869 struct ib_classport_info_context {
1870 struct completion done;
1871 struct ib_sa_query *sa_query;
1872 };
1873
ib_classportinfo_cb(void * context)1874 static void ib_classportinfo_cb(void *context)
1875 {
1876 struct ib_classport_info_context *cb_ctx = context;
1877
1878 complete(&cb_ctx->done);
1879 }
1880
ib_sa_classport_info_rec_callback(struct ib_sa_query * sa_query,int status,int num_prs,struct ib_sa_mad * mad)1881 static void ib_sa_classport_info_rec_callback(struct ib_sa_query *sa_query,
1882 int status, int num_prs,
1883 struct ib_sa_mad *mad)
1884 {
1885 unsigned long flags;
1886 struct ib_sa_classport_info_query *query =
1887 container_of(sa_query, struct ib_sa_classport_info_query, sa_query);
1888 struct ib_sa_classport_cache *info = &sa_query->port->classport_info;
1889
1890 if (mad) {
1891 if (sa_query->flags & IB_SA_QUERY_OPA) {
1892 struct opa_class_port_info rec;
1893
1894 ib_unpack(opa_classport_info_rec_table,
1895 ARRAY_SIZE(opa_classport_info_rec_table),
1896 mad->data, &rec);
1897
1898 spin_lock_irqsave(&sa_query->port->classport_lock,
1899 flags);
1900 if (!status && !info->valid) {
1901 memcpy(&info->data.opa, &rec,
1902 sizeof(info->data.opa));
1903
1904 info->valid = true;
1905 info->data.type = RDMA_CLASS_PORT_INFO_OPA;
1906 }
1907 spin_unlock_irqrestore(&sa_query->port->classport_lock,
1908 flags);
1909
1910 } else {
1911 struct ib_class_port_info rec;
1912
1913 ib_unpack(ib_classport_info_rec_table,
1914 ARRAY_SIZE(ib_classport_info_rec_table),
1915 mad->data, &rec);
1916
1917 spin_lock_irqsave(&sa_query->port->classport_lock,
1918 flags);
1919 if (!status && !info->valid) {
1920 memcpy(&info->data.ib, &rec,
1921 sizeof(info->data.ib));
1922
1923 info->valid = true;
1924 info->data.type = RDMA_CLASS_PORT_INFO_IB;
1925 }
1926 spin_unlock_irqrestore(&sa_query->port->classport_lock,
1927 flags);
1928 }
1929 }
1930 query->callback(query->context);
1931 }
1932
ib_sa_classport_info_rec_release(struct ib_sa_query * sa_query)1933 static void ib_sa_classport_info_rec_release(struct ib_sa_query *sa_query)
1934 {
1935 kfree(container_of(sa_query, struct ib_sa_classport_info_query,
1936 sa_query));
1937 }
1938
ib_sa_classport_info_rec_query(struct ib_sa_port * port,unsigned long timeout_ms,void (* callback)(void * context),void * context,struct ib_sa_query ** sa_query)1939 static int ib_sa_classport_info_rec_query(struct ib_sa_port *port,
1940 unsigned long timeout_ms,
1941 void (*callback)(void *context),
1942 void *context,
1943 struct ib_sa_query **sa_query)
1944 {
1945 struct ib_mad_agent *agent;
1946 struct ib_sa_classport_info_query *query;
1947 struct ib_sa_mad *mad;
1948 gfp_t gfp_mask = GFP_KERNEL;
1949 int ret;
1950
1951 agent = port->agent;
1952
1953 query = kzalloc(sizeof(*query), gfp_mask);
1954 if (!query)
1955 return -ENOMEM;
1956
1957 query->sa_query.port = port;
1958 query->sa_query.flags |= rdma_cap_opa_ah(port->agent->device,
1959 port->port_num) ?
1960 IB_SA_QUERY_OPA : 0;
1961 ret = alloc_mad(&query->sa_query, gfp_mask);
1962 if (ret)
1963 goto err_free;
1964
1965 query->callback = callback;
1966 query->context = context;
1967
1968 mad = query->sa_query.mad_buf->mad;
1969 init_mad(&query->sa_query, agent);
1970
1971 query->sa_query.callback = ib_sa_classport_info_rec_callback;
1972 query->sa_query.release = ib_sa_classport_info_rec_release;
1973 mad->mad_hdr.method = IB_MGMT_METHOD_GET;
1974 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_CLASS_PORTINFO);
1975 mad->sa_hdr.comp_mask = 0;
1976 *sa_query = &query->sa_query;
1977
1978 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask);
1979 if (ret < 0)
1980 goto err_free_mad;
1981
1982 return ret;
1983
1984 err_free_mad:
1985 *sa_query = NULL;
1986 free_mad(&query->sa_query);
1987
1988 err_free:
1989 kfree(query);
1990 return ret;
1991 }
1992
update_ib_cpi(struct work_struct * work)1993 static void update_ib_cpi(struct work_struct *work)
1994 {
1995 struct ib_sa_port *port =
1996 container_of(work, struct ib_sa_port, ib_cpi_work.work);
1997 struct ib_classport_info_context *cb_context;
1998 unsigned long flags;
1999 int ret;
2000
2001 /* If the classport info is valid, nothing
2002 * to do here.
2003 */
2004 spin_lock_irqsave(&port->classport_lock, flags);
2005 if (port->classport_info.valid) {
2006 spin_unlock_irqrestore(&port->classport_lock, flags);
2007 return;
2008 }
2009 spin_unlock_irqrestore(&port->classport_lock, flags);
2010
2011 cb_context = kmalloc(sizeof(*cb_context), GFP_KERNEL);
2012 if (!cb_context)
2013 goto err_nomem;
2014
2015 init_completion(&cb_context->done);
2016
2017 ret = ib_sa_classport_info_rec_query(port, 3000,
2018 ib_classportinfo_cb, cb_context,
2019 &cb_context->sa_query);
2020 if (ret < 0)
2021 goto free_cb_err;
2022 wait_for_completion(&cb_context->done);
2023 free_cb_err:
2024 kfree(cb_context);
2025 spin_lock_irqsave(&port->classport_lock, flags);
2026
2027 /* If the classport info is still not valid, the query should have
2028 * failed for some reason. Retry issuing the query
2029 */
2030 if (!port->classport_info.valid) {
2031 port->classport_info.retry_cnt++;
2032 if (port->classport_info.retry_cnt <=
2033 IB_SA_CPI_MAX_RETRY_CNT) {
2034 unsigned long delay =
2035 msecs_to_jiffies(IB_SA_CPI_RETRY_WAIT);
2036
2037 queue_delayed_work(ib_wq, &port->ib_cpi_work, delay);
2038 }
2039 }
2040 spin_unlock_irqrestore(&port->classport_lock, flags);
2041
2042 err_nomem:
2043 return;
2044 }
2045
send_handler(struct ib_mad_agent * agent,struct ib_mad_send_wc * mad_send_wc)2046 static void send_handler(struct ib_mad_agent *agent,
2047 struct ib_mad_send_wc *mad_send_wc)
2048 {
2049 struct ib_sa_query *query = mad_send_wc->send_buf->context[0];
2050 unsigned long flags;
2051
2052 if (query->callback)
2053 switch (mad_send_wc->status) {
2054 case IB_WC_SUCCESS:
2055 /* No callback -- already got recv */
2056 break;
2057 case IB_WC_RESP_TIMEOUT_ERR:
2058 query->callback(query, -ETIMEDOUT, 0, NULL);
2059 break;
2060 case IB_WC_WR_FLUSH_ERR:
2061 query->callback(query, -EINTR, 0, NULL);
2062 break;
2063 default:
2064 query->callback(query, -EIO, 0, NULL);
2065 break;
2066 }
2067
2068 xa_lock_irqsave(&queries, flags);
2069 __xa_erase(&queries, query->id);
2070 xa_unlock_irqrestore(&queries, flags);
2071
2072 free_mad(query);
2073 if (query->client)
2074 ib_sa_client_put(query->client);
2075 query->release(query);
2076 }
2077
recv_handler(struct ib_mad_agent * mad_agent,struct ib_mad_send_buf * send_buf,struct ib_mad_recv_wc * mad_recv_wc)2078 static void recv_handler(struct ib_mad_agent *mad_agent,
2079 struct ib_mad_send_buf *send_buf,
2080 struct ib_mad_recv_wc *mad_recv_wc)
2081 {
2082 struct ib_sa_query *query;
2083
2084 if (!send_buf)
2085 return;
2086
2087 query = send_buf->context[0];
2088 if (query->callback) {
2089 if (mad_recv_wc->wc->status == IB_WC_SUCCESS)
2090 query->callback(query,
2091 mad_recv_wc->recv_buf.mad->mad_hdr.status ?
2092 -EINVAL : 0, 1,
2093 (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad);
2094 else
2095 query->callback(query, -EIO, 0, NULL);
2096 }
2097
2098 ib_free_recv_mad(mad_recv_wc);
2099 }
2100
update_sm_ah(struct work_struct * work)2101 static void update_sm_ah(struct work_struct *work)
2102 {
2103 struct ib_sa_port *port =
2104 container_of(work, struct ib_sa_port, update_task);
2105 struct ib_sa_sm_ah *new_ah;
2106 struct ib_port_attr port_attr;
2107 struct rdma_ah_attr ah_attr;
2108 bool grh_required;
2109
2110 if (ib_query_port(port->agent->device, port->port_num, &port_attr)) {
2111 pr_warn("Couldn't query port\n");
2112 return;
2113 }
2114
2115 new_ah = kmalloc(sizeof(*new_ah), GFP_KERNEL);
2116 if (!new_ah)
2117 return;
2118
2119 kref_init(&new_ah->ref);
2120 new_ah->src_path_mask = (1 << port_attr.lmc) - 1;
2121
2122 new_ah->pkey_index = 0;
2123 if (ib_find_pkey(port->agent->device, port->port_num,
2124 IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index))
2125 pr_err("Couldn't find index for default PKey\n");
2126
2127 memset(&ah_attr, 0, sizeof(ah_attr));
2128 ah_attr.type = rdma_ah_find_type(port->agent->device,
2129 port->port_num);
2130 rdma_ah_set_dlid(&ah_attr, port_attr.sm_lid);
2131 rdma_ah_set_sl(&ah_attr, port_attr.sm_sl);
2132 rdma_ah_set_port_num(&ah_attr, port->port_num);
2133
2134 grh_required = rdma_is_grh_required(port->agent->device,
2135 port->port_num);
2136
2137 /*
2138 * The OPA sm_lid of 0xFFFF needs special handling so that it can be
2139 * differentiated from a permissive LID of 0xFFFF. We set the
2140 * grh_required flag here so the SA can program the DGID in the
2141 * address handle appropriately
2142 */
2143 if (ah_attr.type == RDMA_AH_ATTR_TYPE_OPA &&
2144 (grh_required ||
2145 port_attr.sm_lid == be16_to_cpu(IB_LID_PERMISSIVE)))
2146 rdma_ah_set_make_grd(&ah_attr, true);
2147
2148 if (ah_attr.type == RDMA_AH_ATTR_TYPE_IB && grh_required) {
2149 rdma_ah_set_ah_flags(&ah_attr, IB_AH_GRH);
2150 rdma_ah_set_subnet_prefix(&ah_attr,
2151 cpu_to_be64(port_attr.subnet_prefix));
2152 rdma_ah_set_interface_id(&ah_attr,
2153 cpu_to_be64(IB_SA_WELL_KNOWN_GUID));
2154 }
2155
2156 new_ah->ah = rdma_create_ah(port->agent->qp->pd, &ah_attr,
2157 RDMA_CREATE_AH_SLEEPABLE);
2158 if (IS_ERR(new_ah->ah)) {
2159 pr_warn("Couldn't create new SM AH\n");
2160 kfree(new_ah);
2161 return;
2162 }
2163
2164 spin_lock_irq(&port->ah_lock);
2165 if (port->sm_ah)
2166 kref_put(&port->sm_ah->ref, free_sm_ah);
2167 port->sm_ah = new_ah;
2168 spin_unlock_irq(&port->ah_lock);
2169 }
2170
ib_sa_event(struct ib_event_handler * handler,struct ib_event * event)2171 static void ib_sa_event(struct ib_event_handler *handler,
2172 struct ib_event *event)
2173 {
2174 if (event->event == IB_EVENT_PORT_ERR ||
2175 event->event == IB_EVENT_PORT_ACTIVE ||
2176 event->event == IB_EVENT_LID_CHANGE ||
2177 event->event == IB_EVENT_PKEY_CHANGE ||
2178 event->event == IB_EVENT_SM_CHANGE ||
2179 event->event == IB_EVENT_CLIENT_REREGISTER) {
2180 unsigned long flags;
2181 struct ib_sa_device *sa_dev =
2182 container_of(handler, typeof(*sa_dev), event_handler);
2183 u32 port_num = event->element.port_num - sa_dev->start_port;
2184 struct ib_sa_port *port = &sa_dev->port[port_num];
2185
2186 if (!rdma_cap_ib_sa(handler->device, port->port_num))
2187 return;
2188
2189 spin_lock_irqsave(&port->ah_lock, flags);
2190 if (port->sm_ah)
2191 kref_put(&port->sm_ah->ref, free_sm_ah);
2192 port->sm_ah = NULL;
2193 spin_unlock_irqrestore(&port->ah_lock, flags);
2194
2195 if (event->event == IB_EVENT_SM_CHANGE ||
2196 event->event == IB_EVENT_CLIENT_REREGISTER ||
2197 event->event == IB_EVENT_LID_CHANGE ||
2198 event->event == IB_EVENT_PORT_ACTIVE) {
2199 unsigned long delay =
2200 msecs_to_jiffies(IB_SA_CPI_RETRY_WAIT);
2201
2202 spin_lock_irqsave(&port->classport_lock, flags);
2203 port->classport_info.valid = false;
2204 port->classport_info.retry_cnt = 0;
2205 spin_unlock_irqrestore(&port->classport_lock, flags);
2206 queue_delayed_work(ib_wq,
2207 &port->ib_cpi_work, delay);
2208 }
2209 queue_work(ib_wq, &sa_dev->port[port_num].update_task);
2210 }
2211 }
2212
ib_sa_add_one(struct ib_device * device)2213 static int ib_sa_add_one(struct ib_device *device)
2214 {
2215 struct ib_sa_device *sa_dev;
2216 int s, e, i;
2217 int count = 0;
2218 int ret;
2219
2220 s = rdma_start_port(device);
2221 e = rdma_end_port(device);
2222
2223 sa_dev = kzalloc(struct_size(sa_dev, port, e - s + 1), GFP_KERNEL);
2224 if (!sa_dev)
2225 return -ENOMEM;
2226
2227 sa_dev->start_port = s;
2228 sa_dev->end_port = e;
2229
2230 for (i = 0; i <= e - s; ++i) {
2231 spin_lock_init(&sa_dev->port[i].ah_lock);
2232 if (!rdma_cap_ib_sa(device, i + 1))
2233 continue;
2234
2235 sa_dev->port[i].sm_ah = NULL;
2236 sa_dev->port[i].port_num = i + s;
2237
2238 spin_lock_init(&sa_dev->port[i].classport_lock);
2239 sa_dev->port[i].classport_info.valid = false;
2240
2241 sa_dev->port[i].agent =
2242 ib_register_mad_agent(device, i + s, IB_QPT_GSI,
2243 NULL, 0, send_handler,
2244 recv_handler, sa_dev, 0);
2245 if (IS_ERR(sa_dev->port[i].agent)) {
2246 ret = PTR_ERR(sa_dev->port[i].agent);
2247 goto err;
2248 }
2249
2250 INIT_WORK(&sa_dev->port[i].update_task, update_sm_ah);
2251 INIT_DELAYED_WORK(&sa_dev->port[i].ib_cpi_work,
2252 update_ib_cpi);
2253
2254 count++;
2255 }
2256
2257 if (!count) {
2258 ret = -EOPNOTSUPP;
2259 goto free;
2260 }
2261
2262 ib_set_client_data(device, &sa_client, sa_dev);
2263
2264 /*
2265 * We register our event handler after everything is set up,
2266 * and then update our cached info after the event handler is
2267 * registered to avoid any problems if a port changes state
2268 * during our initialization.
2269 */
2270
2271 INIT_IB_EVENT_HANDLER(&sa_dev->event_handler, device, ib_sa_event);
2272 ib_register_event_handler(&sa_dev->event_handler);
2273
2274 for (i = 0; i <= e - s; ++i) {
2275 if (rdma_cap_ib_sa(device, i + 1))
2276 update_sm_ah(&sa_dev->port[i].update_task);
2277 }
2278
2279 return 0;
2280
2281 err:
2282 while (--i >= 0) {
2283 if (rdma_cap_ib_sa(device, i + 1))
2284 ib_unregister_mad_agent(sa_dev->port[i].agent);
2285 }
2286 free:
2287 kfree(sa_dev);
2288 return ret;
2289 }
2290
ib_sa_remove_one(struct ib_device * device,void * client_data)2291 static void ib_sa_remove_one(struct ib_device *device, void *client_data)
2292 {
2293 struct ib_sa_device *sa_dev = client_data;
2294 int i;
2295
2296 ib_unregister_event_handler(&sa_dev->event_handler);
2297 flush_workqueue(ib_wq);
2298
2299 for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) {
2300 if (rdma_cap_ib_sa(device, i + 1)) {
2301 cancel_delayed_work_sync(&sa_dev->port[i].ib_cpi_work);
2302 ib_unregister_mad_agent(sa_dev->port[i].agent);
2303 if (sa_dev->port[i].sm_ah)
2304 kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
2305 }
2306
2307 }
2308
2309 kfree(sa_dev);
2310 }
2311
ib_sa_init(void)2312 int ib_sa_init(void)
2313 {
2314 int ret;
2315
2316 get_random_bytes(&tid, sizeof tid);
2317
2318 atomic_set(&ib_nl_sa_request_seq, 0);
2319
2320 ret = ib_register_client(&sa_client);
2321 if (ret) {
2322 pr_err("Couldn't register ib_sa client\n");
2323 goto err1;
2324 }
2325
2326 ret = mcast_init();
2327 if (ret) {
2328 pr_err("Couldn't initialize multicast handling\n");
2329 goto err2;
2330 }
2331
2332 ib_nl_wq = alloc_ordered_workqueue("ib_nl_sa_wq", WQ_MEM_RECLAIM);
2333 if (!ib_nl_wq) {
2334 ret = -ENOMEM;
2335 goto err3;
2336 }
2337
2338 INIT_DELAYED_WORK(&ib_nl_timed_work, ib_nl_request_timeout);
2339
2340 return 0;
2341
2342 err3:
2343 mcast_cleanup();
2344 err2:
2345 ib_unregister_client(&sa_client);
2346 err1:
2347 return ret;
2348 }
2349
ib_sa_cleanup(void)2350 void ib_sa_cleanup(void)
2351 {
2352 cancel_delayed_work(&ib_nl_timed_work);
2353 destroy_workqueue(ib_nl_wq);
2354 mcast_cleanup();
2355 ib_unregister_client(&sa_client);
2356 WARN_ON(!xa_empty(&queries));
2357 }
2358