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/module.h> 36#include <linux/init.h> 37#include <linux/err.h> 38#include <linux/random.h> 39#include <linux/spinlock.h> 40#include <linux/slab.h> 41#include <linux/dma-mapping.h> 42#include <linux/kref.h> 43#include <linux/idr.h> 44#include <linux/workqueue.h> 45 46#include <rdma/ib_pack.h> 47#include <rdma/ib_cache.h> 48#include "sa.h" 49 50MODULE_AUTHOR("Roland Dreier"); 51MODULE_DESCRIPTION("InfiniBand subnet administration query support"); 52MODULE_LICENSE("Dual BSD/GPL"); 53 54struct ib_sa_sm_ah { 55 struct ib_ah *ah; 56 struct kref ref; 57 u16 pkey_index; 58 u8 src_path_mask; 59}; 60 61struct ib_sa_port { 62 struct ib_mad_agent *agent; 63 struct ib_mad_agent *notice_agent; 64 struct ib_sa_sm_ah *sm_ah; 65 struct work_struct update_task; 66 spinlock_t ah_lock; 67 u8 port_num; 68 struct ib_device *device; 69}; 70 71struct ib_sa_device { 72 int start_port, end_port; 73 struct ib_event_handler event_handler; 74 struct ib_sa_port port[0]; 75}; 76 77struct ib_sa_query { 78 void (*callback)(struct ib_sa_query *, int, struct ib_sa_mad *); 79 void (*release)(struct ib_sa_query *); 80 struct ib_sa_client *client; 81 struct ib_sa_port *port; 82 struct ib_mad_send_buf *mad_buf; 83 struct ib_sa_sm_ah *sm_ah; 84 int id; 85}; 86 87struct ib_sa_service_query { 88 void (*callback)(int, struct ib_sa_service_rec *, void *); 89 void *context; 90 struct ib_sa_query sa_query; 91}; 92 93struct ib_sa_path_query { 94 void (*callback)(int, struct ib_sa_path_rec *, void *); 95 void *context; 96 struct ib_sa_query sa_query; 97}; 98 99struct ib_sa_mcmember_query { 100 void (*callback)(int, struct ib_sa_mcmember_rec *, void *); 101 void *context; 102 struct ib_sa_query sa_query; 103}; 104 105struct ib_sa_inform_query { 106 void (*callback)(int, struct ib_sa_inform *, void *); 107 void *context; 108 struct ib_sa_query sa_query; 109}; 110 111static void ib_sa_add_one(struct ib_device *device); 112static void ib_sa_remove_one(struct ib_device *device); 113 114static struct ib_client sa_client = { 115 .name = "sa", 116 .add = ib_sa_add_one, 117 .remove = ib_sa_remove_one 118}; 119 120static spinlock_t idr_lock; 121static DEFINE_IDR(query_idr); 122 123static spinlock_t tid_lock; 124static u32 tid; 125 126#define PATH_REC_FIELD(field) \ 127 .struct_offset_bytes = offsetof(struct ib_sa_path_rec, field), \ 128 .struct_size_bytes = sizeof ((struct ib_sa_path_rec *) 0)->field, \ 129 .field_name = "sa_path_rec:" #field 130 131static const struct ib_field path_rec_table[] = { 132 { PATH_REC_FIELD(service_id), 133 .offset_words = 0, 134 .offset_bits = 0, 135 .size_bits = 64 }, 136 { PATH_REC_FIELD(dgid), 137 .offset_words = 2, 138 .offset_bits = 0, 139 .size_bits = 128 }, 140 { PATH_REC_FIELD(sgid), 141 .offset_words = 6, 142 .offset_bits = 0, 143 .size_bits = 128 }, 144 { PATH_REC_FIELD(dlid), 145 .offset_words = 10, 146 .offset_bits = 0, 147 .size_bits = 16 }, 148 { PATH_REC_FIELD(slid), 149 .offset_words = 10, 150 .offset_bits = 16, 151 .size_bits = 16 }, 152 { PATH_REC_FIELD(raw_traffic), 153 .offset_words = 11, 154 .offset_bits = 0, 155 .size_bits = 1 }, 156 { RESERVED, 157 .offset_words = 11, 158 .offset_bits = 1, 159 .size_bits = 3 }, 160 { PATH_REC_FIELD(flow_label), 161 .offset_words = 11, 162 .offset_bits = 4, 163 .size_bits = 20 }, 164 { PATH_REC_FIELD(hop_limit), 165 .offset_words = 11, 166 .offset_bits = 24, 167 .size_bits = 8 }, 168 { PATH_REC_FIELD(traffic_class), 169 .offset_words = 12, 170 .offset_bits = 0, 171 .size_bits = 8 }, 172 { PATH_REC_FIELD(reversible), 173 .offset_words = 12, 174 .offset_bits = 8, 175 .size_bits = 1 }, 176 { PATH_REC_FIELD(numb_path), 177 .offset_words = 12, 178 .offset_bits = 9, 179 .size_bits = 7 }, 180 { PATH_REC_FIELD(pkey), 181 .offset_words = 12, 182 .offset_bits = 16, 183 .size_bits = 16 }, 184 { PATH_REC_FIELD(qos_class), 185 .offset_words = 13, 186 .offset_bits = 0, 187 .size_bits = 12 }, 188 { PATH_REC_FIELD(sl), 189 .offset_words = 13, 190 .offset_bits = 12, 191 .size_bits = 4 }, 192 { PATH_REC_FIELD(mtu_selector), 193 .offset_words = 13, 194 .offset_bits = 16, 195 .size_bits = 2 }, 196 { PATH_REC_FIELD(mtu), 197 .offset_words = 13, 198 .offset_bits = 18, 199 .size_bits = 6 }, 200 { PATH_REC_FIELD(rate_selector), 201 .offset_words = 13, 202 .offset_bits = 24, 203 .size_bits = 2 }, 204 { PATH_REC_FIELD(rate), 205 .offset_words = 13, 206 .offset_bits = 26, 207 .size_bits = 6 }, 208 { PATH_REC_FIELD(packet_life_time_selector), 209 .offset_words = 14, 210 .offset_bits = 0, 211 .size_bits = 2 }, 212 { PATH_REC_FIELD(packet_life_time), 213 .offset_words = 14, 214 .offset_bits = 2, 215 .size_bits = 6 }, 216 { PATH_REC_FIELD(preference), 217 .offset_words = 14, 218 .offset_bits = 8, 219 .size_bits = 8 }, 220 { RESERVED, 221 .offset_words = 14, 222 .offset_bits = 16, 223 .size_bits = 48 }, 224}; 225 226#define MCMEMBER_REC_FIELD(field) \ 227 .struct_offset_bytes = offsetof(struct ib_sa_mcmember_rec, field), \ 228 .struct_size_bytes = sizeof ((struct ib_sa_mcmember_rec *) 0)->field, \ 229 .field_name = "sa_mcmember_rec:" #field 230 231static const struct ib_field mcmember_rec_table[] = { 232 { MCMEMBER_REC_FIELD(mgid), 233 .offset_words = 0, 234 .offset_bits = 0, 235 .size_bits = 128 }, 236 { MCMEMBER_REC_FIELD(port_gid), 237 .offset_words = 4, 238 .offset_bits = 0, 239 .size_bits = 128 }, 240 { MCMEMBER_REC_FIELD(qkey), 241 .offset_words = 8, 242 .offset_bits = 0, 243 .size_bits = 32 }, 244 { MCMEMBER_REC_FIELD(mlid), 245 .offset_words = 9, 246 .offset_bits = 0, 247 .size_bits = 16 }, 248 { MCMEMBER_REC_FIELD(mtu_selector), 249 .offset_words = 9, 250 .offset_bits = 16, 251 .size_bits = 2 }, 252 { MCMEMBER_REC_FIELD(mtu), 253 .offset_words = 9, 254 .offset_bits = 18, 255 .size_bits = 6 }, 256 { MCMEMBER_REC_FIELD(traffic_class), 257 .offset_words = 9, 258 .offset_bits = 24, 259 .size_bits = 8 }, 260 { MCMEMBER_REC_FIELD(pkey), 261 .offset_words = 10, 262 .offset_bits = 0, 263 .size_bits = 16 }, 264 { MCMEMBER_REC_FIELD(rate_selector), 265 .offset_words = 10, 266 .offset_bits = 16, 267 .size_bits = 2 }, 268 { MCMEMBER_REC_FIELD(rate), 269 .offset_words = 10, 270 .offset_bits = 18, 271 .size_bits = 6 }, 272 { MCMEMBER_REC_FIELD(packet_life_time_selector), 273 .offset_words = 10, 274 .offset_bits = 24, 275 .size_bits = 2 }, 276 { MCMEMBER_REC_FIELD(packet_life_time), 277 .offset_words = 10, 278 .offset_bits = 26, 279 .size_bits = 6 }, 280 { MCMEMBER_REC_FIELD(sl), 281 .offset_words = 11, 282 .offset_bits = 0, 283 .size_bits = 4 }, 284 { MCMEMBER_REC_FIELD(flow_label), 285 .offset_words = 11, 286 .offset_bits = 4, 287 .size_bits = 20 }, 288 { MCMEMBER_REC_FIELD(hop_limit), 289 .offset_words = 11, 290 .offset_bits = 24, 291 .size_bits = 8 }, 292 { MCMEMBER_REC_FIELD(scope), 293 .offset_words = 12, 294 .offset_bits = 0, 295 .size_bits = 4 }, 296 { MCMEMBER_REC_FIELD(join_state), 297 .offset_words = 12, 298 .offset_bits = 4, 299 .size_bits = 4 }, 300 { MCMEMBER_REC_FIELD(proxy_join), 301 .offset_words = 12, 302 .offset_bits = 8, 303 .size_bits = 1 }, 304 { RESERVED, 305 .offset_words = 12, 306 .offset_bits = 9, 307 .size_bits = 23 }, 308}; 309 310#define SERVICE_REC_FIELD(field) \ 311 .struct_offset_bytes = offsetof(struct ib_sa_service_rec, field), \ 312 .struct_size_bytes = sizeof ((struct ib_sa_service_rec *) 0)->field, \ 313 .field_name = "sa_service_rec:" #field 314 315static const struct ib_field service_rec_table[] = { 316 { SERVICE_REC_FIELD(id), 317 .offset_words = 0, 318 .offset_bits = 0, 319 .size_bits = 64 }, 320 { SERVICE_REC_FIELD(gid), 321 .offset_words = 2, 322 .offset_bits = 0, 323 .size_bits = 128 }, 324 { SERVICE_REC_FIELD(pkey), 325 .offset_words = 6, 326 .offset_bits = 0, 327 .size_bits = 16 }, 328 { SERVICE_REC_FIELD(lease), 329 .offset_words = 7, 330 .offset_bits = 0, 331 .size_bits = 32 }, 332 { SERVICE_REC_FIELD(key), 333 .offset_words = 8, 334 .offset_bits = 0, 335 .size_bits = 128 }, 336 { SERVICE_REC_FIELD(name), 337 .offset_words = 12, 338 .offset_bits = 0, 339 .size_bits = 64*8 }, 340 { SERVICE_REC_FIELD(data8), 341 .offset_words = 28, 342 .offset_bits = 0, 343 .size_bits = 16*8 }, 344 { SERVICE_REC_FIELD(data16), 345 .offset_words = 32, 346 .offset_bits = 0, 347 .size_bits = 8*16 }, 348 { SERVICE_REC_FIELD(data32), 349 .offset_words = 36, 350 .offset_bits = 0, 351 .size_bits = 4*32 }, 352 { SERVICE_REC_FIELD(data64), 353 .offset_words = 40, 354 .offset_bits = 0, 355 .size_bits = 2*64 }, 356}; 357 358#define INFORM_FIELD(field) \ 359 .struct_offset_bytes = offsetof(struct ib_sa_inform, field), \ 360 .struct_size_bytes = sizeof ((struct ib_sa_inform *) 0)->field, \ 361 .field_name = "sa_inform:" #field 362 363static const struct ib_field inform_table[] = { 364 { INFORM_FIELD(gid), 365 .offset_words = 0, 366 .offset_bits = 0, 367 .size_bits = 128 }, 368 { INFORM_FIELD(lid_range_begin), 369 .offset_words = 4, 370 .offset_bits = 0, 371 .size_bits = 16 }, 372 { INFORM_FIELD(lid_range_end), 373 .offset_words = 4, 374 .offset_bits = 16, 375 .size_bits = 16 }, 376 { RESERVED, 377 .offset_words = 5, 378 .offset_bits = 0, 379 .size_bits = 16 }, 380 { INFORM_FIELD(is_generic), 381 .offset_words = 5, 382 .offset_bits = 16, 383 .size_bits = 8 }, 384 { INFORM_FIELD(subscribe), 385 .offset_words = 5, 386 .offset_bits = 24, 387 .size_bits = 8 }, 388 { INFORM_FIELD(type), 389 .offset_words = 6, 390 .offset_bits = 0, 391 .size_bits = 16 }, 392 { INFORM_FIELD(trap.generic.trap_num), 393 .offset_words = 6, 394 .offset_bits = 16, 395 .size_bits = 16 }, 396 { INFORM_FIELD(trap.generic.qpn), 397 .offset_words = 7, 398 .offset_bits = 0, 399 .size_bits = 24 }, 400 { RESERVED, 401 .offset_words = 7, 402 .offset_bits = 24, 403 .size_bits = 3 }, 404 { INFORM_FIELD(trap.generic.resp_time), 405 .offset_words = 7, 406 .offset_bits = 27, 407 .size_bits = 5 }, 408 { RESERVED, 409 .offset_words = 8, 410 .offset_bits = 0, 411 .size_bits = 8 }, 412 { INFORM_FIELD(trap.generic.producer_type), 413 .offset_words = 8, 414 .offset_bits = 8, 415 .size_bits = 24 }, 416}; 417 418#define NOTICE_FIELD(field) \ 419 .struct_offset_bytes = offsetof(struct ib_sa_notice, field), \ 420 .struct_size_bytes = sizeof ((struct ib_sa_notice *) 0)->field, \ 421 .field_name = "sa_notice:" #field 422 423static const struct ib_field notice_table[] = { 424 { NOTICE_FIELD(is_generic), 425 .offset_words = 0, 426 .offset_bits = 0, 427 .size_bits = 1 }, 428 { NOTICE_FIELD(type), 429 .offset_words = 0, 430 .offset_bits = 1, 431 .size_bits = 7 }, 432 { NOTICE_FIELD(trap.generic.producer_type), 433 .offset_words = 0, 434 .offset_bits = 8, 435 .size_bits = 24 }, 436 { NOTICE_FIELD(trap.generic.trap_num), 437 .offset_words = 1, 438 .offset_bits = 0, 439 .size_bits = 16 }, 440 { NOTICE_FIELD(issuer_lid), 441 .offset_words = 1, 442 .offset_bits = 16, 443 .size_bits = 16 }, 444 { NOTICE_FIELD(notice_toggle), 445 .offset_words = 2, 446 .offset_bits = 0, 447 .size_bits = 1 }, 448 { NOTICE_FIELD(notice_count), 449 .offset_words = 2, 450 .offset_bits = 1, 451 .size_bits = 15 }, 452 { NOTICE_FIELD(data_details), 453 .offset_words = 2, 454 .offset_bits = 16, 455 .size_bits = 432 }, 456 { NOTICE_FIELD(issuer_gid), 457 .offset_words = 16, 458 .offset_bits = 0, 459 .size_bits = 128 }, 460}; 461 462int ib_sa_check_selector(ib_sa_comp_mask comp_mask, 463 ib_sa_comp_mask selector_mask, 464 ib_sa_comp_mask value_mask, 465 u8 selector, u8 src_value, u8 dst_value) 466{ 467 int err; 468 469 if (!(comp_mask & selector_mask) || !(comp_mask & value_mask)) 470 return 0; 471 472 switch (selector) { 473 case IB_SA_GT: 474 err = (src_value <= dst_value); 475 break; 476 case IB_SA_LT: 477 err = (src_value >= dst_value); 478 break; 479 case IB_SA_EQ: 480 err = (src_value != dst_value); 481 break; 482 default: 483 err = 0; 484 break; 485 } 486 487 return err; 488} 489 490int ib_sa_pack_attr(void *dst, void *src, int attr_id) 491{ 492 switch (attr_id) { 493 case IB_SA_ATTR_PATH_REC: 494 ib_pack(path_rec_table, ARRAY_SIZE(path_rec_table), src, dst); 495 break; 496 default: 497 return -EINVAL; 498 } 499 return 0; 500} 501 502int ib_sa_unpack_attr(void *dst, void *src, int attr_id) 503{ 504 switch (attr_id) { 505 case IB_SA_ATTR_PATH_REC: 506 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), src, dst); 507 break; 508 default: 509 return -EINVAL; 510 } 511 return 0; 512} 513 514static void free_sm_ah(struct kref *kref) 515{ 516 struct ib_sa_sm_ah *sm_ah = container_of(kref, struct ib_sa_sm_ah, ref); 517 518 ib_destroy_ah(sm_ah->ah); 519 kfree(sm_ah); 520} 521 522static void update_sm_ah(struct work_struct *work) 523{ 524 struct ib_sa_port *port = 525 container_of(work, struct ib_sa_port, update_task); 526 struct ib_sa_sm_ah *new_ah; 527 struct ib_port_attr port_attr; 528 struct ib_ah_attr ah_attr; 529 530 if (ib_query_port(port->agent->device, port->port_num, &port_attr)) { 531 printk(KERN_WARNING "Couldn't query port\n"); 532 return; 533 } 534 535 new_ah = kmalloc(sizeof *new_ah, GFP_KERNEL); 536 if (!new_ah) { 537 printk(KERN_WARNING "Couldn't allocate new SM AH\n"); 538 return; 539 } 540 541 kref_init(&new_ah->ref); 542 new_ah->src_path_mask = (1 << port_attr.lmc) - 1; 543 544 new_ah->pkey_index = 0; 545 if (ib_find_pkey(port->agent->device, port->port_num, 546 IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index)) 547 printk(KERN_ERR "Couldn't find index for default PKey\n"); 548 549 memset(&ah_attr, 0, sizeof ah_attr); 550 ah_attr.dlid = port_attr.sm_lid; 551 ah_attr.sl = port_attr.sm_sl; 552 ah_attr.port_num = port->port_num; 553 554 new_ah->ah = ib_create_ah(port->agent->qp->pd, &ah_attr); 555 if (IS_ERR(new_ah->ah)) { 556 printk(KERN_WARNING "Couldn't create new SM AH\n"); 557 kfree(new_ah); 558 return; 559 } 560 561 spin_lock_irq(&port->ah_lock); 562 if (port->sm_ah) 563 kref_put(&port->sm_ah->ref, free_sm_ah); 564 port->sm_ah = new_ah; 565 spin_unlock_irq(&port->ah_lock); 566 567} 568 569static void ib_sa_event(struct ib_event_handler *handler, struct ib_event *event) 570{ 571 if (event->event == IB_EVENT_PORT_ERR || 572 event->event == IB_EVENT_PORT_ACTIVE || 573 event->event == IB_EVENT_LID_CHANGE || 574 event->event == IB_EVENT_PKEY_CHANGE || 575 event->event == IB_EVENT_SM_CHANGE || 576 event->event == IB_EVENT_CLIENT_REREGISTER) { 577 unsigned long flags; 578 struct ib_sa_device *sa_dev = 579 container_of(handler, typeof(*sa_dev), event_handler); 580 struct ib_sa_port *port = 581 &sa_dev->port[event->element.port_num - sa_dev->start_port]; 582 583 if (rdma_port_get_link_layer(handler->device, port->port_num) != IB_LINK_LAYER_INFINIBAND) 584 return; 585 586 spin_lock_irqsave(&port->ah_lock, flags); 587 if (port->sm_ah) 588 kref_put(&port->sm_ah->ref, free_sm_ah); 589 port->sm_ah = NULL; 590 spin_unlock_irqrestore(&port->ah_lock, flags); 591 592 schedule_work(&sa_dev->port[event->element.port_num - 593 sa_dev->start_port].update_task); 594 } 595} 596 597void ib_sa_register_client(struct ib_sa_client *client) 598{ 599 atomic_set(&client->users, 1); 600 init_completion(&client->comp); 601} 602EXPORT_SYMBOL(ib_sa_register_client); 603 604void ib_sa_unregister_client(struct ib_sa_client *client) 605{ 606 ib_sa_client_put(client); 607 wait_for_completion(&client->comp); 608} 609EXPORT_SYMBOL(ib_sa_unregister_client); 610 611/** 612 * ib_sa_cancel_query - try to cancel an SA query 613 * @id:ID of query to cancel 614 * @query:query pointer to cancel 615 * 616 * Try to cancel an SA query. If the id and query don't match up or 617 * the query has already completed, nothing is done. Otherwise the 618 * query is canceled and will complete with a status of -EINTR. 619 */ 620void ib_sa_cancel_query(int id, struct ib_sa_query *query) 621{ 622 unsigned long flags; 623 struct ib_mad_agent *agent; 624 struct ib_mad_send_buf *mad_buf; 625 626 spin_lock_irqsave(&idr_lock, flags); 627 if (idr_find(&query_idr, id) != query) { 628 spin_unlock_irqrestore(&idr_lock, flags); 629 return; 630 } 631 agent = query->port->agent; 632 mad_buf = query->mad_buf; 633 spin_unlock_irqrestore(&idr_lock, flags); 634 635 ib_cancel_mad(agent, mad_buf); 636} 637EXPORT_SYMBOL(ib_sa_cancel_query); 638 639static u8 get_src_path_mask(struct ib_device *device, u8 port_num) 640{ 641 struct ib_sa_device *sa_dev; 642 struct ib_sa_port *port; 643 unsigned long flags; 644 u8 src_path_mask; 645 646 sa_dev = ib_get_client_data(device, &sa_client); 647 if (!sa_dev) 648 return 0x7f; 649 650 port = &sa_dev->port[port_num - sa_dev->start_port]; 651 spin_lock_irqsave(&port->ah_lock, flags); 652 src_path_mask = port->sm_ah ? port->sm_ah->src_path_mask : 0x7f; 653 spin_unlock_irqrestore(&port->ah_lock, flags); 654 655 return src_path_mask; 656} 657 658int ib_init_ah_from_path(struct ib_device *device, u8 port_num, 659 struct ib_sa_path_rec *rec, struct ib_ah_attr *ah_attr) 660{ 661 int ret; 662 u16 gid_index; 663 int force_grh; 664 665 memset(ah_attr, 0, sizeof *ah_attr); 666 ah_attr->dlid = be16_to_cpu(rec->dlid); 667 ah_attr->sl = rec->sl; 668 ah_attr->src_path_bits = be16_to_cpu(rec->slid) & 669 get_src_path_mask(device, port_num); 670 ah_attr->port_num = port_num; 671 ah_attr->static_rate = rec->rate; 672 673 force_grh = rdma_port_get_link_layer(device, port_num) == IB_LINK_LAYER_ETHERNET; 674 675 if (rec->hop_limit > 1 || force_grh) { 676 ah_attr->ah_flags = IB_AH_GRH; 677 ah_attr->grh.dgid = rec->dgid; 678 679 ret = ib_find_cached_gid(device, &rec->sgid, &port_num, 680 &gid_index); 681 if (ret) 682 return ret; 683 684 ah_attr->grh.sgid_index = gid_index; 685 ah_attr->grh.flow_label = be32_to_cpu(rec->flow_label); 686 ah_attr->grh.hop_limit = rec->hop_limit; 687 ah_attr->grh.traffic_class = rec->traffic_class; 688 } 689 return 0; 690} 691EXPORT_SYMBOL(ib_init_ah_from_path); 692 693static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) 694{ 695 unsigned long flags; 696 697 spin_lock_irqsave(&query->port->ah_lock, flags); 698 if (!query->port->sm_ah) { 699 spin_unlock_irqrestore(&query->port->ah_lock, flags); 700 return -EAGAIN; 701 } 702 kref_get(&query->port->sm_ah->ref); 703 query->sm_ah = query->port->sm_ah; 704 spin_unlock_irqrestore(&query->port->ah_lock, flags); 705 706 query->mad_buf = ib_create_send_mad(query->port->agent, 1, 707 query->sm_ah->pkey_index, 708 0, IB_MGMT_SA_HDR, IB_MGMT_SA_DATA, 709 gfp_mask); 710 if (IS_ERR(query->mad_buf)) { 711 kref_put(&query->sm_ah->ref, free_sm_ah); 712 return -ENOMEM; 713 } 714 715 query->mad_buf->ah = query->sm_ah->ah; 716 717 return 0; 718} 719 720static void free_mad(struct ib_sa_query *query) 721{ 722 ib_free_send_mad(query->mad_buf); 723 kref_put(&query->sm_ah->ref, free_sm_ah); 724} 725 726static void init_mad(struct ib_sa_mad *mad, struct ib_mad_agent *agent) 727{ 728 unsigned long flags; 729 730 memset(mad, 0, sizeof *mad); 731 732 mad->mad_hdr.base_version = IB_MGMT_BASE_VERSION; 733 mad->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM; 734 mad->mad_hdr.class_version = IB_SA_CLASS_VERSION; 735 736 spin_lock_irqsave(&tid_lock, flags); 737 mad->mad_hdr.tid = 738 cpu_to_be64(((u64) agent->hi_tid) << 32 | tid++); 739 spin_unlock_irqrestore(&tid_lock, flags); 740} 741 742static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask) 743{ 744 unsigned long flags; 745 int ret, id; 746 747retry: 748 if (!idr_pre_get(&query_idr, gfp_mask)) 749 return -ENOMEM; 750 spin_lock_irqsave(&idr_lock, flags); 751 ret = idr_get_new(&query_idr, query, &id); 752 spin_unlock_irqrestore(&idr_lock, flags); 753 if (ret == -EAGAIN) 754 goto retry; 755 if (ret) 756 return ret; 757 758 query->mad_buf->timeout_ms = timeout_ms; 759 query->mad_buf->context[0] = query; 760 query->id = id; 761 762 ret = ib_post_send_mad(query->mad_buf, NULL); 763 if (ret) { 764 spin_lock_irqsave(&idr_lock, flags); 765 idr_remove(&query_idr, id); 766 spin_unlock_irqrestore(&idr_lock, flags); 767 } 768 769 /* 770 * It's not safe to dereference query any more, because the 771 * send may already have completed and freed the query in 772 * another context. 773 */ 774 return ret ? ret : id; 775} 776 777void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec) 778{ 779 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), attribute, rec); 780} 781EXPORT_SYMBOL(ib_sa_unpack_path); 782 783static void ib_sa_path_rec_callback(struct ib_sa_query *sa_query, 784 int status, 785 struct ib_sa_mad *mad) 786{ 787 struct ib_sa_path_query *query = 788 container_of(sa_query, struct ib_sa_path_query, sa_query); 789 790 if (mad) { 791 struct ib_sa_path_rec rec; 792 793 ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), 794 mad->data, &rec); 795 query->callback(status, &rec, query->context); 796 } else 797 query->callback(status, NULL, query->context); 798} 799 800static void ib_sa_path_rec_release(struct ib_sa_query *sa_query) 801{ 802 kfree(container_of(sa_query, struct ib_sa_path_query, sa_query)); 803} 804 805int ib_sa_path_rec_query(struct ib_sa_client *client, 806 struct ib_device *device, u8 port_num, 807 struct ib_sa_path_rec *rec, 808 ib_sa_comp_mask comp_mask, 809 int timeout_ms, gfp_t gfp_mask, 810 void (*callback)(int status, 811 struct ib_sa_path_rec *resp, 812 void *context), 813 void *context, 814 struct ib_sa_query **sa_query) 815{ 816 struct ib_sa_path_query *query; 817 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client); 818 struct ib_sa_port *port; 819 struct ib_mad_agent *agent; 820 struct ib_sa_mad *mad; 821 int ret; 822 823 if (!sa_dev) 824 return -ENODEV; 825 826 port = &sa_dev->port[port_num - sa_dev->start_port]; 827 agent = port->agent; 828 829 query = kmalloc(sizeof *query, gfp_mask); 830 if (!query) 831 return -ENOMEM; 832 833 query->sa_query.port = port; 834 ret = alloc_mad(&query->sa_query, gfp_mask); 835 if (ret) 836 goto err1; 837 838 ib_sa_client_get(client); 839 query->sa_query.client = client; 840 query->callback = callback; 841 query->context = context; 842 843 mad = query->sa_query.mad_buf->mad; 844 init_mad(mad, agent); 845 846 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL; 847 query->sa_query.release = ib_sa_path_rec_release; 848 mad->mad_hdr.method = IB_MGMT_METHOD_GET; 849 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_PATH_REC); 850 mad->sa_hdr.comp_mask = comp_mask; 851 852 ib_pack(path_rec_table, ARRAY_SIZE(path_rec_table), rec, mad->data); 853 854 *sa_query = &query->sa_query; 855 856 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); 857 if (ret < 0) 858 goto err2; 859 860 return ret; 861 862err2: 863 *sa_query = NULL; 864 ib_sa_client_put(query->sa_query.client); 865 free_mad(&query->sa_query); 866 867err1: 868 kfree(query); 869 return ret; 870} 871 872static void ib_sa_service_rec_callback(struct ib_sa_query *sa_query, 873 int status, 874 struct ib_sa_mad *mad) 875{ 876 struct ib_sa_service_query *query = 877 container_of(sa_query, struct ib_sa_service_query, sa_query); 878 879 if (mad) { 880 struct ib_sa_service_rec rec; 881 882 ib_unpack(service_rec_table, ARRAY_SIZE(service_rec_table), 883 mad->data, &rec); 884 query->callback(status, &rec, query->context); 885 } else 886 query->callback(status, NULL, query->context); 887} 888 889static void ib_sa_service_rec_release(struct ib_sa_query *sa_query) 890{ 891 kfree(container_of(sa_query, struct ib_sa_service_query, sa_query)); 892} 893 894/** 895 * ib_sa_service_rec_query - Start Service Record operation 896 * @client:SA client 897 * @device:device to send request on 898 * @port_num: port number to send request on 899 * @method:SA method - should be get, set, or delete 900 * @rec:Service Record to send in request 901 * @comp_mask:component mask to send in request 902 * @timeout_ms:time to wait for response 903 * @gfp_mask:GFP mask to use for internal allocations 904 * @callback:function called when request completes, times out or is 905 * canceled 906 * @context:opaque user context passed to callback 907 * @sa_query:request context, used to cancel request 908 * 909 * Send a Service Record set/get/delete to the SA to register, 910 * unregister or query a service record. 911 * The callback function will be called when the request completes (or 912 * fails); status is 0 for a successful response, -EINTR if the query 913 * is canceled, -ETIMEDOUT is the query timed out, or -EIO if an error 914 * occurred sending the query. The resp parameter of the callback is 915 * only valid if status is 0. 916 * 917 * If the return value of ib_sa_service_rec_query() is negative, it is an 918 * error code. Otherwise it is a request ID that can be used to cancel 919 * the query. 920 */ 921int ib_sa_service_rec_query(struct ib_sa_client *client, 922 struct ib_device *device, u8 port_num, u8 method, 923 struct ib_sa_service_rec *rec, 924 ib_sa_comp_mask comp_mask, 925 int timeout_ms, gfp_t gfp_mask, 926 void (*callback)(int status, 927 struct ib_sa_service_rec *resp, 928 void *context), 929 void *context, 930 struct ib_sa_query **sa_query) 931{ 932 struct ib_sa_service_query *query; 933 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client); 934 struct ib_sa_port *port; 935 struct ib_mad_agent *agent; 936 struct ib_sa_mad *mad; 937 int ret; 938 939 if (!sa_dev) 940 return -ENODEV; 941 942 port = &sa_dev->port[port_num - sa_dev->start_port]; 943 agent = port->agent; 944 945 if (method != IB_MGMT_METHOD_GET && 946 method != IB_MGMT_METHOD_SET && 947 method != IB_SA_METHOD_DELETE) 948 return -EINVAL; 949 950 query = kmalloc(sizeof *query, gfp_mask); 951 if (!query) 952 return -ENOMEM; 953 954 query->sa_query.port = port; 955 ret = alloc_mad(&query->sa_query, gfp_mask); 956 if (ret) 957 goto err1; 958 959 ib_sa_client_get(client); 960 query->sa_query.client = client; 961 query->callback = callback; 962 query->context = context; 963 964 mad = query->sa_query.mad_buf->mad; 965 init_mad(mad, agent); 966 967 query->sa_query.callback = callback ? ib_sa_service_rec_callback : NULL; 968 query->sa_query.release = ib_sa_service_rec_release; 969 mad->mad_hdr.method = method; 970 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_SERVICE_REC); 971 mad->sa_hdr.comp_mask = comp_mask; 972 973 ib_pack(service_rec_table, ARRAY_SIZE(service_rec_table), 974 rec, mad->data); 975 976 *sa_query = &query->sa_query; 977 978 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); 979 if (ret < 0) 980 goto err2; 981 982 return ret; 983 984err2: 985 *sa_query = NULL; 986 ib_sa_client_put(query->sa_query.client); 987 free_mad(&query->sa_query); 988 989err1: 990 kfree(query); 991 return ret; 992} 993EXPORT_SYMBOL(ib_sa_service_rec_query); 994 995static void ib_sa_mcmember_rec_callback(struct ib_sa_query *sa_query, 996 int status, 997 struct ib_sa_mad *mad) 998{ 999 struct ib_sa_mcmember_query *query = 1000 container_of(sa_query, struct ib_sa_mcmember_query, sa_query); 1001 1002 if (mad) { 1003 struct ib_sa_mcmember_rec rec; 1004 1005 ib_unpack(mcmember_rec_table, ARRAY_SIZE(mcmember_rec_table), 1006 mad->data, &rec); 1007 query->callback(status, &rec, query->context); 1008 } else 1009 query->callback(status, NULL, query->context); 1010} 1011 1012static void ib_sa_mcmember_rec_release(struct ib_sa_query *sa_query) 1013{ 1014 kfree(container_of(sa_query, struct ib_sa_mcmember_query, sa_query)); 1015} 1016 1017int ib_sa_mcmember_rec_query(struct ib_sa_client *client, 1018 struct ib_device *device, u8 port_num, 1019 u8 method, 1020 struct ib_sa_mcmember_rec *rec, 1021 ib_sa_comp_mask comp_mask, 1022 int timeout_ms, gfp_t gfp_mask, 1023 void (*callback)(int status, 1024 struct ib_sa_mcmember_rec *resp, 1025 void *context), 1026 void *context, 1027 struct ib_sa_query **sa_query) 1028{ 1029 struct ib_sa_mcmember_query *query; 1030 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client); 1031 struct ib_sa_port *port; 1032 struct ib_mad_agent *agent; 1033 struct ib_sa_mad *mad; 1034 int ret; 1035 1036 if (!sa_dev) 1037 return -ENODEV; 1038 1039 port = &sa_dev->port[port_num - sa_dev->start_port]; 1040 agent = port->agent; 1041 1042 query = kmalloc(sizeof *query, gfp_mask); 1043 if (!query) 1044 return -ENOMEM; 1045 1046 query->sa_query.port = port; 1047 ret = alloc_mad(&query->sa_query, gfp_mask); 1048 if (ret) 1049 goto err1; 1050 1051 ib_sa_client_get(client); 1052 query->sa_query.client = client; 1053 query->callback = callback; 1054 query->context = context; 1055 1056 mad = query->sa_query.mad_buf->mad; 1057 init_mad(mad, agent); 1058 1059 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL; 1060 query->sa_query.release = ib_sa_mcmember_rec_release; 1061 mad->mad_hdr.method = method; 1062 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_MC_MEMBER_REC); 1063 mad->sa_hdr.comp_mask = comp_mask; 1064 1065 ib_pack(mcmember_rec_table, ARRAY_SIZE(mcmember_rec_table), 1066 rec, mad->data); 1067 1068 *sa_query = &query->sa_query; 1069 1070 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); 1071 if (ret < 0) 1072 goto err2; 1073 1074 return ret; 1075 1076err2: 1077 *sa_query = NULL; 1078 ib_sa_client_put(query->sa_query.client); 1079 free_mad(&query->sa_query); 1080 1081err1: 1082 kfree(query); 1083 return ret; 1084} 1085 1086static void ib_sa_inform_callback(struct ib_sa_query *sa_query, 1087 int status, 1088 struct ib_sa_mad *mad) 1089{ 1090 struct ib_sa_inform_query *query = 1091 container_of(sa_query, struct ib_sa_inform_query, sa_query); 1092 1093 if (mad) { 1094 struct ib_sa_inform rec; 1095 1096 ib_unpack(inform_table, ARRAY_SIZE(inform_table), 1097 mad->data, &rec); 1098 query->callback(status, &rec, query->context); 1099 } else 1100 query->callback(status, NULL, query->context); 1101} 1102 1103static void ib_sa_inform_release(struct ib_sa_query *sa_query) 1104{ 1105 kfree(container_of(sa_query, struct ib_sa_inform_query, sa_query)); 1106} 1107 1108/** 1109 * ib_sa_informinfo_query - Start an InformInfo registration. 1110 * @client:SA client 1111 * @device:device to send query on 1112 * @port_num: port number to send query on 1113 * @rec:Inform record to send in query 1114 * @timeout_ms:time to wait for response 1115 * @gfp_mask:GFP mask to use for internal allocations 1116 * @callback:function called when notice handler registration completes, 1117 * times out or is canceled 1118 * @context:opaque user context passed to callback 1119 * @sa_query:query context, used to cancel query 1120 * 1121 * This function sends inform info to register with SA to receive 1122 * in-service notice. 1123 * The callback function will be called when the query completes (or 1124 * fails); status is 0 for a successful response, -EINTR if the query 1125 * is canceled, -ETIMEDOUT is the query timed out, or -EIO if an error 1126 * occurred sending the query. The resp parameter of the callback is 1127 * only valid if status is 0. 1128 * 1129 * If the return value of ib_sa_inform_query() is negative, it is an 1130 * error code. Otherwise it is a query ID that can be used to cancel 1131 * the query. 1132 */ 1133int ib_sa_informinfo_query(struct ib_sa_client *client, 1134 struct ib_device *device, u8 port_num, 1135 struct ib_sa_inform *rec, 1136 int timeout_ms, gfp_t gfp_mask, 1137 void (*callback)(int status, 1138 struct ib_sa_inform *resp, 1139 void *context), 1140 void *context, 1141 struct ib_sa_query **sa_query) 1142{ 1143 struct ib_sa_inform_query *query; 1144 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client); 1145 struct ib_sa_port *port; 1146 struct ib_mad_agent *agent; 1147 struct ib_sa_mad *mad; 1148 int ret; 1149 1150 if (!sa_dev) 1151 return -ENODEV; 1152 1153 port = &sa_dev->port[port_num - sa_dev->start_port]; 1154 agent = port->agent; 1155 1156 query = kmalloc(sizeof *query, gfp_mask); 1157 if (!query) 1158 return -ENOMEM; 1159 1160 query->sa_query.port = port; 1161 ret = alloc_mad(&query->sa_query, gfp_mask); 1162 if (ret) 1163 goto err1; 1164 1165 ib_sa_client_get(client); 1166 query->sa_query.client = client; 1167 query->callback = callback; 1168 query->context = context; 1169 1170 mad = query->sa_query.mad_buf->mad; 1171 init_mad(mad, agent); 1172 1173 query->sa_query.callback = callback ? ib_sa_inform_callback : NULL; 1174 query->sa_query.release = ib_sa_inform_release; 1175 query->sa_query.port = port; 1176 mad->mad_hdr.method = IB_MGMT_METHOD_SET; 1177 mad->mad_hdr.attr_id = cpu_to_be16(IB_SA_ATTR_INFORM_INFO); 1178 1179 ib_pack(inform_table, ARRAY_SIZE(inform_table), rec, mad->data); 1180 1181 *sa_query = &query->sa_query; 1182 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); 1183 if (ret < 0) 1184 goto err2; 1185 1186 return ret; 1187 1188err2: 1189 *sa_query = NULL; 1190 ib_sa_client_put(query->sa_query.client); 1191 free_mad(&query->sa_query); 1192err1: 1193 kfree(query); 1194 return ret; 1195} 1196 1197static void ib_sa_notice_resp(struct ib_sa_port *port, 1198 struct ib_mad_recv_wc *mad_recv_wc) 1199{ 1200 struct ib_mad_send_buf *mad_buf; 1201 struct ib_sa_mad *mad; 1202 int ret; 1203 unsigned long flags; 1204 1205 mad_buf = ib_create_send_mad(port->notice_agent, 1, 0, 0, 1206 IB_MGMT_SA_HDR, IB_MGMT_SA_DATA, 1207 GFP_KERNEL); 1208 if (IS_ERR(mad_buf)) 1209 return; 1210 1211 mad = mad_buf->mad; 1212 memcpy(mad, mad_recv_wc->recv_buf.mad, sizeof *mad); 1213 mad->mad_hdr.method = IB_MGMT_METHOD_REPORT_RESP; 1214 1215 spin_lock_irqsave(&port->ah_lock, flags); 1216 if (!port->sm_ah) { 1217 spin_unlock_irqrestore(&port->ah_lock, flags); 1218 ib_free_send_mad(mad_buf); 1219 return; 1220 } 1221 kref_get(&port->sm_ah->ref); 1222 mad_buf->context[0] = &port->sm_ah->ref; 1223 mad_buf->ah = port->sm_ah->ah; 1224 spin_unlock_irqrestore(&port->ah_lock, flags); 1225 1226 ret = ib_post_send_mad(mad_buf, NULL); 1227 if (ret) 1228 goto err; 1229 1230 return; 1231err: 1232 kref_put(mad_buf->context[0], free_sm_ah); 1233 ib_free_send_mad(mad_buf); 1234} 1235 1236static void send_handler(struct ib_mad_agent *agent, 1237 struct ib_mad_send_wc *mad_send_wc) 1238{ 1239 struct ib_sa_query *query = mad_send_wc->send_buf->context[0]; 1240 unsigned long flags; 1241 1242 if (query->callback) 1243 switch (mad_send_wc->status) { 1244 case IB_WC_SUCCESS: 1245 /* No callback -- already got recv */ 1246 break; 1247 case IB_WC_RESP_TIMEOUT_ERR: 1248 query->callback(query, -ETIMEDOUT, NULL); 1249 break; 1250 case IB_WC_WR_FLUSH_ERR: 1251 query->callback(query, -EINTR, NULL); 1252 break; 1253 default: 1254 query->callback(query, -EIO, NULL); 1255 break; 1256 } 1257 1258 spin_lock_irqsave(&idr_lock, flags); 1259 idr_remove(&query_idr, query->id); 1260 spin_unlock_irqrestore(&idr_lock, flags); 1261 1262 free_mad(query); 1263 ib_sa_client_put(query->client); 1264 query->release(query); 1265} 1266 1267static void recv_handler(struct ib_mad_agent *mad_agent, 1268 struct ib_mad_recv_wc *mad_recv_wc) 1269{ 1270 struct ib_sa_query *query; 1271 struct ib_mad_send_buf *mad_buf; 1272 1273 mad_buf = (void *) (unsigned long) mad_recv_wc->wc->wr_id; 1274 query = mad_buf->context[0]; 1275 1276 if (query->callback) { 1277 if (mad_recv_wc->wc->status == IB_WC_SUCCESS) 1278 query->callback(query, 1279 mad_recv_wc->recv_buf.mad->mad_hdr.status ? 1280 -EINVAL : 0, 1281 (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad); 1282 else 1283 query->callback(query, -EIO, NULL); 1284 } 1285 1286 ib_free_recv_mad(mad_recv_wc); 1287} 1288 1289static void notice_resp_handler(struct ib_mad_agent *agent, 1290 struct ib_mad_send_wc *mad_send_wc) 1291{ 1292 kref_put(mad_send_wc->send_buf->context[0], free_sm_ah); 1293 ib_free_send_mad(mad_send_wc->send_buf); 1294} 1295 1296static void notice_handler(struct ib_mad_agent *mad_agent, 1297 struct ib_mad_recv_wc *mad_recv_wc) 1298{ 1299 struct ib_sa_port *port; 1300 struct ib_sa_mad *mad; 1301 struct ib_sa_notice notice; 1302 1303 port = mad_agent->context; 1304 mad = (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad; 1305 ib_unpack(notice_table, ARRAY_SIZE(notice_table), mad->data, ¬ice); 1306 1307 if (!notice_dispatch(port->device, port->port_num, ¬ice)) 1308 ib_sa_notice_resp(port, mad_recv_wc); 1309 ib_free_recv_mad(mad_recv_wc); 1310} 1311 1312static void ib_sa_add_one(struct ib_device *device) 1313{ 1314 struct ib_sa_device *sa_dev; 1315 struct ib_mad_reg_req reg_req = { 1316 .mgmt_class = IB_MGMT_CLASS_SUBN_ADM, 1317 .mgmt_class_version = 2 1318 }; 1319 int s, e, i; 1320 1321 if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB) 1322 return; 1323 1324 if (device->node_type == RDMA_NODE_IB_SWITCH) 1325 s = e = 0; 1326 else { 1327 s = 1; 1328 e = device->phys_port_cnt; 1329 } 1330 1331 sa_dev = kzalloc(sizeof *sa_dev + 1332 (e - s + 1) * sizeof (struct ib_sa_port), 1333 GFP_KERNEL); 1334 if (!sa_dev) 1335 return; 1336 1337 sa_dev->start_port = s; 1338 sa_dev->end_port = e; 1339 1340 for (i = 0; i <= e - s; ++i) { 1341 spin_lock_init(&sa_dev->port[i].ah_lock); 1342 if (rdma_port_get_link_layer(device, i + 1) != IB_LINK_LAYER_INFINIBAND) 1343 continue; 1344 1345 sa_dev->port[i].sm_ah = NULL; 1346 sa_dev->port[i].port_num = i + s; 1347 1348 sa_dev->port[i].agent = 1349 ib_register_mad_agent(device, i + s, IB_QPT_GSI, 1350 NULL, 0, send_handler, 1351 recv_handler, sa_dev); 1352 if (IS_ERR(sa_dev->port[i].agent)) 1353 goto err; 1354 1355 sa_dev->port[i].device = device; 1356 set_bit(IB_MGMT_METHOD_REPORT, reg_req.method_mask); 1357 sa_dev->port[i].notice_agent = 1358 ib_register_mad_agent(device, i + s, IB_QPT_GSI, 1359 ®_req, 0, notice_resp_handler, 1360 notice_handler, &sa_dev->port[i]); 1361 1362 if (IS_ERR(sa_dev->port[i].notice_agent)) 1363 goto err; 1364 1365 INIT_WORK(&sa_dev->port[i].update_task, update_sm_ah); 1366 } 1367 1368 ib_set_client_data(device, &sa_client, sa_dev); 1369 1370 /* 1371 * We register our event handler after everything is set up, 1372 * and then update our cached info after the event handler is 1373 * registered to avoid any problems if a port changes state 1374 * during our initialization. 1375 */ 1376 1377 INIT_IB_EVENT_HANDLER(&sa_dev->event_handler, device, ib_sa_event); 1378 if (ib_register_event_handler(&sa_dev->event_handler)) 1379 goto err; 1380 1381 for (i = 0; i <= e - s; ++i) 1382 if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND) 1383 update_sm_ah(&sa_dev->port[i].update_task); 1384 1385 return; 1386 1387err: 1388 while (--i >= 0) 1389 if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND) { 1390 if (!IS_ERR(sa_dev->port[i].notice_agent)) 1391 ib_unregister_mad_agent(sa_dev->port[i].notice_agent); 1392 if (!IS_ERR(sa_dev->port[i].agent)) 1393 ib_unregister_mad_agent(sa_dev->port[i].agent); 1394 } 1395 1396 kfree(sa_dev); 1397 1398 return; 1399} 1400 1401static void ib_sa_remove_one(struct ib_device *device) 1402{ 1403 struct ib_sa_device *sa_dev = ib_get_client_data(device, &sa_client); 1404 int i; 1405 1406 if (!sa_dev) 1407 return; 1408 1409 ib_unregister_event_handler(&sa_dev->event_handler); 1410 1411 flush_scheduled_work(); 1412 1413 for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) { 1414 if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND) { 1415 ib_unregister_mad_agent(sa_dev->port[i].notice_agent); 1416 ib_unregister_mad_agent(sa_dev->port[i].agent); 1417 if (sa_dev->port[i].sm_ah) 1418 kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah); 1419 } 1420 1421 } 1422 1423 kfree(sa_dev); 1424} 1425 1426static int __init ib_sa_init(void) 1427{ 1428 int ret; 1429 1430 spin_lock_init(&idr_lock); 1431 spin_lock_init(&tid_lock); 1432 1433 get_random_bytes(&tid, sizeof tid); 1434 1435 ret = ib_register_client(&sa_client); 1436 if (ret) { 1437 printk(KERN_ERR "Couldn't register ib_sa client\n"); 1438 goto err1; 1439 } 1440 1441 ret = mcast_init(); 1442 if (ret) { 1443 printk(KERN_ERR "Couldn't initialize multicast handling\n"); 1444 goto err2; 1445 } 1446 1447 ret = notice_init(); 1448 if (ret) { 1449 printk(KERN_ERR "Couldn't initialize notice handling\n"); 1450 goto err3; 1451 } 1452 1453 ret = sa_db_init(); 1454 if (ret) { 1455 printk(KERN_ERR "Couldn't initialize local SA\n"); 1456 goto err4; 1457 } 1458 1459 return 0; 1460err4: 1461 notice_cleanup(); 1462err3: 1463 mcast_cleanup(); 1464err2: 1465 ib_unregister_client(&sa_client); 1466err1: 1467 return ret; 1468} 1469 1470static void __exit ib_sa_cleanup(void) 1471{ 1472 sa_db_cleanup(); 1473 mcast_cleanup(); 1474 notice_cleanup(); 1475 ib_unregister_client(&sa_client); 1476 idr_destroy(&query_idr); 1477} 1478 1479module_init_order(ib_sa_init, SI_ORDER_SECOND); 1480module_exit(ib_sa_cleanup); 1481