1 /* 2 * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved. 3 * Copyright (c) 2005 Intel Corporation. All rights reserved. 4 * Copyright (c) 2005 Mellanox Technologies Ltd. All rights reserved. 5 * Copyright (c) 2009 HNR Consulting. All rights reserved. 6 * Copyright (c) 2014 Intel Corporation. All rights reserved. 7 * 8 * This software is available to you under a choice of one of two 9 * licenses. You may choose to be licensed under the terms of the GNU 10 * General Public License (GPL) Version 2, available from the file 11 * COPYING in the main directory of this source tree, or the 12 * OpenIB.org BSD license below: 13 * 14 * Redistribution and use in source and binary forms, with or 15 * without modification, are permitted provided that the following 16 * conditions are met: 17 * 18 * - Redistributions of source code must retain the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer. 21 * 22 * - Redistributions in binary form must reproduce the above 23 * copyright notice, this list of conditions and the following 24 * disclaimer in the documentation and/or other materials 25 * provided with the distribution. 26 * 27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 28 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 29 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 30 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 31 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 32 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 33 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 34 * SOFTWARE. 35 * 36 */ 37 38 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 39 40 #include <linux/dma-mapping.h> 41 #include <linux/idr.h> 42 #include <linux/slab.h> 43 #include <linux/module.h> 44 #include <linux/security.h> 45 #include <rdma/ib_cache.h> 46 47 #include "mad_priv.h" 48 #include "core_priv.h" 49 #include "mad_rmpp.h" 50 #include "smi.h" 51 #include "opa_smi.h" 52 #include "agent.h" 53 54 static int mad_sendq_size = IB_MAD_QP_SEND_SIZE; 55 static int mad_recvq_size = IB_MAD_QP_RECV_SIZE; 56 57 module_param_named(send_queue_size, mad_sendq_size, int, 0444); 58 MODULE_PARM_DESC(send_queue_size, "Size of send queue in number of work requests"); 59 module_param_named(recv_queue_size, mad_recvq_size, int, 0444); 60 MODULE_PARM_DESC(recv_queue_size, "Size of receive queue in number of work requests"); 61 62 /* 63 * The mlx4 driver uses the top byte to distinguish which virtual function 64 * generated the MAD, so we must avoid using it. 65 */ 66 #define AGENT_ID_LIMIT (1 << 24) 67 static DEFINE_IDR(ib_mad_clients); 68 static struct list_head ib_mad_port_list; 69 70 /* Port list lock */ 71 static DEFINE_SPINLOCK(ib_mad_port_list_lock); 72 73 /* Forward declarations */ 74 static int method_in_use(struct ib_mad_mgmt_method_table **method, 75 struct ib_mad_reg_req *mad_reg_req); 76 static void remove_mad_reg_req(struct ib_mad_agent_private *priv); 77 static struct ib_mad_agent_private *find_mad_agent( 78 struct ib_mad_port_private *port_priv, 79 const struct ib_mad_hdr *mad); 80 static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info, 81 struct ib_mad_private *mad); 82 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv); 83 static void timeout_sends(struct work_struct *work); 84 static void local_completions(struct work_struct *work); 85 static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req, 86 struct ib_mad_agent_private *agent_priv, 87 u8 mgmt_class); 88 static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req, 89 struct ib_mad_agent_private *agent_priv); 90 static bool ib_mad_send_error(struct ib_mad_port_private *port_priv, 91 struct ib_wc *wc); 92 static void ib_mad_send_done(struct ib_cq *cq, struct ib_wc *wc); 93 94 /* 95 * Returns a ib_mad_port_private structure or NULL for a device/port 96 * Assumes ib_mad_port_list_lock is being held 97 */ 98 static inline struct ib_mad_port_private * 99 __ib_get_mad_port(struct ib_device *device, int port_num) 100 { 101 struct ib_mad_port_private *entry; 102 103 list_for_each_entry(entry, &ib_mad_port_list, port_list) { 104 if (entry->device == device && entry->port_num == port_num) 105 return entry; 106 } 107 return NULL; 108 } 109 110 /* 111 * Wrapper function to return a ib_mad_port_private structure or NULL 112 * for a device/port 113 */ 114 static inline struct ib_mad_port_private * 115 ib_get_mad_port(struct ib_device *device, int port_num) 116 { 117 struct ib_mad_port_private *entry; 118 unsigned long flags; 119 120 spin_lock_irqsave(&ib_mad_port_list_lock, flags); 121 entry = __ib_get_mad_port(device, port_num); 122 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags); 123 124 return entry; 125 } 126 127 static inline u8 convert_mgmt_class(u8 mgmt_class) 128 { 129 /* Alias IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE to 0 */ 130 return mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE ? 131 0 : mgmt_class; 132 } 133 134 static int get_spl_qp_index(enum ib_qp_type qp_type) 135 { 136 switch (qp_type) 137 { 138 case IB_QPT_SMI: 139 return 0; 140 case IB_QPT_GSI: 141 return 1; 142 default: 143 return -1; 144 } 145 } 146 147 static int vendor_class_index(u8 mgmt_class) 148 { 149 return mgmt_class - IB_MGMT_CLASS_VENDOR_RANGE2_START; 150 } 151 152 static int is_vendor_class(u8 mgmt_class) 153 { 154 if ((mgmt_class < IB_MGMT_CLASS_VENDOR_RANGE2_START) || 155 (mgmt_class > IB_MGMT_CLASS_VENDOR_RANGE2_END)) 156 return 0; 157 return 1; 158 } 159 160 static int is_vendor_oui(char *oui) 161 { 162 if (oui[0] || oui[1] || oui[2]) 163 return 1; 164 return 0; 165 } 166 167 static int is_vendor_method_in_use( 168 struct ib_mad_mgmt_vendor_class *vendor_class, 169 struct ib_mad_reg_req *mad_reg_req) 170 { 171 struct ib_mad_mgmt_method_table *method; 172 int i; 173 174 for (i = 0; i < MAX_MGMT_OUI; i++) { 175 if (!memcmp(vendor_class->oui[i], mad_reg_req->oui, 3)) { 176 method = vendor_class->method_table[i]; 177 if (method) { 178 if (method_in_use(&method, mad_reg_req)) 179 return 1; 180 else 181 break; 182 } 183 } 184 } 185 return 0; 186 } 187 188 int ib_response_mad(const struct ib_mad_hdr *hdr) 189 { 190 return ((hdr->method & IB_MGMT_METHOD_RESP) || 191 (hdr->method == IB_MGMT_METHOD_TRAP_REPRESS) || 192 ((hdr->mgmt_class == IB_MGMT_CLASS_BM) && 193 (hdr->attr_mod & IB_BM_ATTR_MOD_RESP))); 194 } 195 EXPORT_SYMBOL(ib_response_mad); 196 197 /* 198 * ib_register_mad_agent - Register to send/receive MADs 199 * 200 * Context: Process context. 201 */ 202 struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, 203 u8 port_num, 204 enum ib_qp_type qp_type, 205 struct ib_mad_reg_req *mad_reg_req, 206 u8 rmpp_version, 207 ib_mad_send_handler send_handler, 208 ib_mad_recv_handler recv_handler, 209 void *context, 210 u32 registration_flags) 211 { 212 struct ib_mad_port_private *port_priv; 213 struct ib_mad_agent *ret = ERR_PTR(-EINVAL); 214 struct ib_mad_agent_private *mad_agent_priv; 215 struct ib_mad_reg_req *reg_req = NULL; 216 struct ib_mad_mgmt_class_table *class; 217 struct ib_mad_mgmt_vendor_class_table *vendor; 218 struct ib_mad_mgmt_vendor_class *vendor_class; 219 struct ib_mad_mgmt_method_table *method; 220 int ret2, qpn; 221 u8 mgmt_class, vclass; 222 223 if ((qp_type == IB_QPT_SMI && !rdma_cap_ib_smi(device, port_num)) || 224 (qp_type == IB_QPT_GSI && !rdma_cap_ib_cm(device, port_num))) 225 return ERR_PTR(-EPROTONOSUPPORT); 226 227 /* Validate parameters */ 228 qpn = get_spl_qp_index(qp_type); 229 if (qpn == -1) { 230 dev_dbg_ratelimited(&device->dev, "%s: invalid QP Type %d\n", 231 __func__, qp_type); 232 goto error1; 233 } 234 235 if (rmpp_version && rmpp_version != IB_MGMT_RMPP_VERSION) { 236 dev_dbg_ratelimited(&device->dev, 237 "%s: invalid RMPP Version %u\n", 238 __func__, rmpp_version); 239 goto error1; 240 } 241 242 /* Validate MAD registration request if supplied */ 243 if (mad_reg_req) { 244 if (mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION) { 245 dev_dbg_ratelimited(&device->dev, 246 "%s: invalid Class Version %u\n", 247 __func__, 248 mad_reg_req->mgmt_class_version); 249 goto error1; 250 } 251 if (!recv_handler) { 252 dev_dbg_ratelimited(&device->dev, 253 "%s: no recv_handler\n", __func__); 254 goto error1; 255 } 256 if (mad_reg_req->mgmt_class >= MAX_MGMT_CLASS) { 257 /* 258 * IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE is the only 259 * one in this range currently allowed 260 */ 261 if (mad_reg_req->mgmt_class != 262 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { 263 dev_dbg_ratelimited(&device->dev, 264 "%s: Invalid Mgmt Class 0x%x\n", 265 __func__, mad_reg_req->mgmt_class); 266 goto error1; 267 } 268 } else if (mad_reg_req->mgmt_class == 0) { 269 /* 270 * Class 0 is reserved in IBA and is used for 271 * aliasing of IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 272 */ 273 dev_dbg_ratelimited(&device->dev, 274 "%s: Invalid Mgmt Class 0\n", 275 __func__); 276 goto error1; 277 } else if (is_vendor_class(mad_reg_req->mgmt_class)) { 278 /* 279 * If class is in "new" vendor range, 280 * ensure supplied OUI is not zero 281 */ 282 if (!is_vendor_oui(mad_reg_req->oui)) { 283 dev_dbg_ratelimited(&device->dev, 284 "%s: No OUI specified for class 0x%x\n", 285 __func__, 286 mad_reg_req->mgmt_class); 287 goto error1; 288 } 289 } 290 /* Make sure class supplied is consistent with RMPP */ 291 if (!ib_is_mad_class_rmpp(mad_reg_req->mgmt_class)) { 292 if (rmpp_version) { 293 dev_dbg_ratelimited(&device->dev, 294 "%s: RMPP version for non-RMPP class 0x%x\n", 295 __func__, mad_reg_req->mgmt_class); 296 goto error1; 297 } 298 } 299 300 /* Make sure class supplied is consistent with QP type */ 301 if (qp_type == IB_QPT_SMI) { 302 if ((mad_reg_req->mgmt_class != 303 IB_MGMT_CLASS_SUBN_LID_ROUTED) && 304 (mad_reg_req->mgmt_class != 305 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) { 306 dev_dbg_ratelimited(&device->dev, 307 "%s: Invalid SM QP type: class 0x%x\n", 308 __func__, mad_reg_req->mgmt_class); 309 goto error1; 310 } 311 } else { 312 if ((mad_reg_req->mgmt_class == 313 IB_MGMT_CLASS_SUBN_LID_ROUTED) || 314 (mad_reg_req->mgmt_class == 315 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) { 316 dev_dbg_ratelimited(&device->dev, 317 "%s: Invalid GS QP type: class 0x%x\n", 318 __func__, mad_reg_req->mgmt_class); 319 goto error1; 320 } 321 } 322 } else { 323 /* No registration request supplied */ 324 if (!send_handler) 325 goto error1; 326 if (registration_flags & IB_MAD_USER_RMPP) 327 goto error1; 328 } 329 330 /* Validate device and port */ 331 port_priv = ib_get_mad_port(device, port_num); 332 if (!port_priv) { 333 dev_dbg_ratelimited(&device->dev, "%s: Invalid port %d\n", 334 __func__, port_num); 335 ret = ERR_PTR(-ENODEV); 336 goto error1; 337 } 338 339 /* Verify the QP requested is supported. For example, Ethernet devices 340 * will not have QP0. 341 */ 342 if (!port_priv->qp_info[qpn].qp) { 343 dev_dbg_ratelimited(&device->dev, "%s: QP %d not supported\n", 344 __func__, qpn); 345 ret = ERR_PTR(-EPROTONOSUPPORT); 346 goto error1; 347 } 348 349 /* Allocate structures */ 350 mad_agent_priv = kzalloc(sizeof *mad_agent_priv, GFP_KERNEL); 351 if (!mad_agent_priv) { 352 ret = ERR_PTR(-ENOMEM); 353 goto error1; 354 } 355 356 if (mad_reg_req) { 357 reg_req = kmemdup(mad_reg_req, sizeof *reg_req, GFP_KERNEL); 358 if (!reg_req) { 359 ret = ERR_PTR(-ENOMEM); 360 goto error3; 361 } 362 } 363 364 /* Now, fill in the various structures */ 365 mad_agent_priv->qp_info = &port_priv->qp_info[qpn]; 366 mad_agent_priv->reg_req = reg_req; 367 mad_agent_priv->agent.rmpp_version = rmpp_version; 368 mad_agent_priv->agent.device = device; 369 mad_agent_priv->agent.recv_handler = recv_handler; 370 mad_agent_priv->agent.send_handler = send_handler; 371 mad_agent_priv->agent.context = context; 372 mad_agent_priv->agent.qp = port_priv->qp_info[qpn].qp; 373 mad_agent_priv->agent.port_num = port_num; 374 mad_agent_priv->agent.flags = registration_flags; 375 spin_lock_init(&mad_agent_priv->lock); 376 INIT_LIST_HEAD(&mad_agent_priv->send_list); 377 INIT_LIST_HEAD(&mad_agent_priv->wait_list); 378 INIT_LIST_HEAD(&mad_agent_priv->done_list); 379 INIT_LIST_HEAD(&mad_agent_priv->rmpp_list); 380 INIT_DELAYED_WORK(&mad_agent_priv->timed_work, timeout_sends); 381 INIT_LIST_HEAD(&mad_agent_priv->local_list); 382 INIT_WORK(&mad_agent_priv->local_work, local_completions); 383 atomic_set(&mad_agent_priv->refcount, 1); 384 init_completion(&mad_agent_priv->comp); 385 386 ret2 = ib_mad_agent_security_setup(&mad_agent_priv->agent, qp_type); 387 if (ret2) { 388 ret = ERR_PTR(ret2); 389 goto error4; 390 } 391 392 idr_preload(GFP_KERNEL); 393 idr_lock(&ib_mad_clients); 394 ret2 = idr_alloc_cyclic(&ib_mad_clients, mad_agent_priv, 0, 395 AGENT_ID_LIMIT, GFP_ATOMIC); 396 idr_unlock(&ib_mad_clients); 397 idr_preload_end(); 398 399 if (ret2 < 0) { 400 ret = ERR_PTR(ret2); 401 goto error5; 402 } 403 mad_agent_priv->agent.hi_tid = ret2; 404 405 /* 406 * Make sure MAD registration (if supplied) 407 * is non overlapping with any existing ones 408 */ 409 spin_lock_irq(&port_priv->reg_lock); 410 if (mad_reg_req) { 411 mgmt_class = convert_mgmt_class(mad_reg_req->mgmt_class); 412 if (!is_vendor_class(mgmt_class)) { 413 class = port_priv->version[mad_reg_req-> 414 mgmt_class_version].class; 415 if (class) { 416 method = class->method_table[mgmt_class]; 417 if (method) { 418 if (method_in_use(&method, 419 mad_reg_req)) 420 goto error6; 421 } 422 } 423 ret2 = add_nonoui_reg_req(mad_reg_req, mad_agent_priv, 424 mgmt_class); 425 } else { 426 /* "New" vendor class range */ 427 vendor = port_priv->version[mad_reg_req-> 428 mgmt_class_version].vendor; 429 if (vendor) { 430 vclass = vendor_class_index(mgmt_class); 431 vendor_class = vendor->vendor_class[vclass]; 432 if (vendor_class) { 433 if (is_vendor_method_in_use( 434 vendor_class, 435 mad_reg_req)) 436 goto error6; 437 } 438 } 439 ret2 = add_oui_reg_req(mad_reg_req, mad_agent_priv); 440 } 441 if (ret2) { 442 ret = ERR_PTR(ret2); 443 goto error6; 444 } 445 } 446 spin_unlock_irq(&port_priv->reg_lock); 447 448 return &mad_agent_priv->agent; 449 error6: 450 spin_unlock_irq(&port_priv->reg_lock); 451 idr_lock(&ib_mad_clients); 452 idr_remove(&ib_mad_clients, mad_agent_priv->agent.hi_tid); 453 idr_unlock(&ib_mad_clients); 454 error5: 455 ib_mad_agent_security_cleanup(&mad_agent_priv->agent); 456 error4: 457 kfree(reg_req); 458 error3: 459 kfree(mad_agent_priv); 460 error1: 461 return ret; 462 } 463 EXPORT_SYMBOL(ib_register_mad_agent); 464 465 static inline int is_snooping_sends(int mad_snoop_flags) 466 { 467 return (mad_snoop_flags & 468 (/*IB_MAD_SNOOP_POSTED_SENDS | 469 IB_MAD_SNOOP_RMPP_SENDS |*/ 470 IB_MAD_SNOOP_SEND_COMPLETIONS /*| 471 IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS*/)); 472 } 473 474 static inline int is_snooping_recvs(int mad_snoop_flags) 475 { 476 return (mad_snoop_flags & 477 (IB_MAD_SNOOP_RECVS /*| 478 IB_MAD_SNOOP_RMPP_RECVS*/)); 479 } 480 481 static int register_snoop_agent(struct ib_mad_qp_info *qp_info, 482 struct ib_mad_snoop_private *mad_snoop_priv) 483 { 484 struct ib_mad_snoop_private **new_snoop_table; 485 unsigned long flags; 486 int i; 487 488 spin_lock_irqsave(&qp_info->snoop_lock, flags); 489 /* Check for empty slot in array. */ 490 for (i = 0; i < qp_info->snoop_table_size; i++) 491 if (!qp_info->snoop_table[i]) 492 break; 493 494 if (i == qp_info->snoop_table_size) { 495 /* Grow table. */ 496 new_snoop_table = krealloc(qp_info->snoop_table, 497 sizeof mad_snoop_priv * 498 (qp_info->snoop_table_size + 1), 499 GFP_ATOMIC); 500 if (!new_snoop_table) { 501 i = -ENOMEM; 502 goto out; 503 } 504 505 qp_info->snoop_table = new_snoop_table; 506 qp_info->snoop_table_size++; 507 } 508 qp_info->snoop_table[i] = mad_snoop_priv; 509 atomic_inc(&qp_info->snoop_count); 510 out: 511 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 512 return i; 513 } 514 515 struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device, 516 u8 port_num, 517 enum ib_qp_type qp_type, 518 int mad_snoop_flags, 519 ib_mad_snoop_handler snoop_handler, 520 ib_mad_recv_handler recv_handler, 521 void *context) 522 { 523 struct ib_mad_port_private *port_priv; 524 struct ib_mad_agent *ret; 525 struct ib_mad_snoop_private *mad_snoop_priv; 526 int qpn; 527 int err; 528 529 /* Validate parameters */ 530 if ((is_snooping_sends(mad_snoop_flags) && !snoop_handler) || 531 (is_snooping_recvs(mad_snoop_flags) && !recv_handler)) { 532 ret = ERR_PTR(-EINVAL); 533 goto error1; 534 } 535 qpn = get_spl_qp_index(qp_type); 536 if (qpn == -1) { 537 ret = ERR_PTR(-EINVAL); 538 goto error1; 539 } 540 port_priv = ib_get_mad_port(device, port_num); 541 if (!port_priv) { 542 ret = ERR_PTR(-ENODEV); 543 goto error1; 544 } 545 /* Allocate structures */ 546 mad_snoop_priv = kzalloc(sizeof *mad_snoop_priv, GFP_KERNEL); 547 if (!mad_snoop_priv) { 548 ret = ERR_PTR(-ENOMEM); 549 goto error1; 550 } 551 552 /* Now, fill in the various structures */ 553 mad_snoop_priv->qp_info = &port_priv->qp_info[qpn]; 554 mad_snoop_priv->agent.device = device; 555 mad_snoop_priv->agent.recv_handler = recv_handler; 556 mad_snoop_priv->agent.snoop_handler = snoop_handler; 557 mad_snoop_priv->agent.context = context; 558 mad_snoop_priv->agent.qp = port_priv->qp_info[qpn].qp; 559 mad_snoop_priv->agent.port_num = port_num; 560 mad_snoop_priv->mad_snoop_flags = mad_snoop_flags; 561 init_completion(&mad_snoop_priv->comp); 562 563 err = ib_mad_agent_security_setup(&mad_snoop_priv->agent, qp_type); 564 if (err) { 565 ret = ERR_PTR(err); 566 goto error2; 567 } 568 569 mad_snoop_priv->snoop_index = register_snoop_agent( 570 &port_priv->qp_info[qpn], 571 mad_snoop_priv); 572 if (mad_snoop_priv->snoop_index < 0) { 573 ret = ERR_PTR(mad_snoop_priv->snoop_index); 574 goto error3; 575 } 576 577 atomic_set(&mad_snoop_priv->refcount, 1); 578 return &mad_snoop_priv->agent; 579 error3: 580 ib_mad_agent_security_cleanup(&mad_snoop_priv->agent); 581 error2: 582 kfree(mad_snoop_priv); 583 error1: 584 return ret; 585 } 586 EXPORT_SYMBOL(ib_register_mad_snoop); 587 588 static inline void deref_mad_agent(struct ib_mad_agent_private *mad_agent_priv) 589 { 590 if (atomic_dec_and_test(&mad_agent_priv->refcount)) 591 complete(&mad_agent_priv->comp); 592 } 593 594 static inline void deref_snoop_agent(struct ib_mad_snoop_private *mad_snoop_priv) 595 { 596 if (atomic_dec_and_test(&mad_snoop_priv->refcount)) 597 complete(&mad_snoop_priv->comp); 598 } 599 600 static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv) 601 { 602 struct ib_mad_port_private *port_priv; 603 604 /* Note that we could still be handling received MADs */ 605 606 /* 607 * Canceling all sends results in dropping received response 608 * MADs, preventing us from queuing additional work 609 */ 610 cancel_mads(mad_agent_priv); 611 port_priv = mad_agent_priv->qp_info->port_priv; 612 cancel_delayed_work(&mad_agent_priv->timed_work); 613 614 spin_lock_irq(&port_priv->reg_lock); 615 remove_mad_reg_req(mad_agent_priv); 616 spin_unlock_irq(&port_priv->reg_lock); 617 idr_lock(&ib_mad_clients); 618 idr_remove(&ib_mad_clients, mad_agent_priv->agent.hi_tid); 619 idr_unlock(&ib_mad_clients); 620 621 flush_workqueue(port_priv->wq); 622 ib_cancel_rmpp_recvs(mad_agent_priv); 623 624 deref_mad_agent(mad_agent_priv); 625 wait_for_completion(&mad_agent_priv->comp); 626 627 ib_mad_agent_security_cleanup(&mad_agent_priv->agent); 628 629 kfree(mad_agent_priv->reg_req); 630 kfree_rcu(mad_agent_priv, rcu); 631 } 632 633 static void unregister_mad_snoop(struct ib_mad_snoop_private *mad_snoop_priv) 634 { 635 struct ib_mad_qp_info *qp_info; 636 unsigned long flags; 637 638 qp_info = mad_snoop_priv->qp_info; 639 spin_lock_irqsave(&qp_info->snoop_lock, flags); 640 qp_info->snoop_table[mad_snoop_priv->snoop_index] = NULL; 641 atomic_dec(&qp_info->snoop_count); 642 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 643 644 deref_snoop_agent(mad_snoop_priv); 645 wait_for_completion(&mad_snoop_priv->comp); 646 647 ib_mad_agent_security_cleanup(&mad_snoop_priv->agent); 648 649 kfree(mad_snoop_priv); 650 } 651 652 /* 653 * ib_unregister_mad_agent - Unregisters a client from using MAD services 654 * 655 * Context: Process context. 656 */ 657 void ib_unregister_mad_agent(struct ib_mad_agent *mad_agent) 658 { 659 struct ib_mad_agent_private *mad_agent_priv; 660 struct ib_mad_snoop_private *mad_snoop_priv; 661 662 /* If the TID is zero, the agent can only snoop. */ 663 if (mad_agent->hi_tid) { 664 mad_agent_priv = container_of(mad_agent, 665 struct ib_mad_agent_private, 666 agent); 667 unregister_mad_agent(mad_agent_priv); 668 } else { 669 mad_snoop_priv = container_of(mad_agent, 670 struct ib_mad_snoop_private, 671 agent); 672 unregister_mad_snoop(mad_snoop_priv); 673 } 674 } 675 EXPORT_SYMBOL(ib_unregister_mad_agent); 676 677 static void dequeue_mad(struct ib_mad_list_head *mad_list) 678 { 679 struct ib_mad_queue *mad_queue; 680 unsigned long flags; 681 682 mad_queue = mad_list->mad_queue; 683 spin_lock_irqsave(&mad_queue->lock, flags); 684 list_del(&mad_list->list); 685 mad_queue->count--; 686 spin_unlock_irqrestore(&mad_queue->lock, flags); 687 } 688 689 static void snoop_send(struct ib_mad_qp_info *qp_info, 690 struct ib_mad_send_buf *send_buf, 691 struct ib_mad_send_wc *mad_send_wc, 692 int mad_snoop_flags) 693 { 694 struct ib_mad_snoop_private *mad_snoop_priv; 695 unsigned long flags; 696 int i; 697 698 spin_lock_irqsave(&qp_info->snoop_lock, flags); 699 for (i = 0; i < qp_info->snoop_table_size; i++) { 700 mad_snoop_priv = qp_info->snoop_table[i]; 701 if (!mad_snoop_priv || 702 !(mad_snoop_priv->mad_snoop_flags & mad_snoop_flags)) 703 continue; 704 705 atomic_inc(&mad_snoop_priv->refcount); 706 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 707 mad_snoop_priv->agent.snoop_handler(&mad_snoop_priv->agent, 708 send_buf, mad_send_wc); 709 deref_snoop_agent(mad_snoop_priv); 710 spin_lock_irqsave(&qp_info->snoop_lock, flags); 711 } 712 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 713 } 714 715 static void snoop_recv(struct ib_mad_qp_info *qp_info, 716 struct ib_mad_recv_wc *mad_recv_wc, 717 int mad_snoop_flags) 718 { 719 struct ib_mad_snoop_private *mad_snoop_priv; 720 unsigned long flags; 721 int i; 722 723 spin_lock_irqsave(&qp_info->snoop_lock, flags); 724 for (i = 0; i < qp_info->snoop_table_size; i++) { 725 mad_snoop_priv = qp_info->snoop_table[i]; 726 if (!mad_snoop_priv || 727 !(mad_snoop_priv->mad_snoop_flags & mad_snoop_flags)) 728 continue; 729 730 atomic_inc(&mad_snoop_priv->refcount); 731 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 732 mad_snoop_priv->agent.recv_handler(&mad_snoop_priv->agent, NULL, 733 mad_recv_wc); 734 deref_snoop_agent(mad_snoop_priv); 735 spin_lock_irqsave(&qp_info->snoop_lock, flags); 736 } 737 spin_unlock_irqrestore(&qp_info->snoop_lock, flags); 738 } 739 740 static void build_smp_wc(struct ib_qp *qp, struct ib_cqe *cqe, u16 slid, 741 u16 pkey_index, u8 port_num, struct ib_wc *wc) 742 { 743 memset(wc, 0, sizeof *wc); 744 wc->wr_cqe = cqe; 745 wc->status = IB_WC_SUCCESS; 746 wc->opcode = IB_WC_RECV; 747 wc->pkey_index = pkey_index; 748 wc->byte_len = sizeof(struct ib_mad) + sizeof(struct ib_grh); 749 wc->src_qp = IB_QP0; 750 wc->qp = qp; 751 wc->slid = slid; 752 wc->sl = 0; 753 wc->dlid_path_bits = 0; 754 wc->port_num = port_num; 755 } 756 757 static size_t mad_priv_size(const struct ib_mad_private *mp) 758 { 759 return sizeof(struct ib_mad_private) + mp->mad_size; 760 } 761 762 static struct ib_mad_private *alloc_mad_private(size_t mad_size, gfp_t flags) 763 { 764 size_t size = sizeof(struct ib_mad_private) + mad_size; 765 struct ib_mad_private *ret = kzalloc(size, flags); 766 767 if (ret) 768 ret->mad_size = mad_size; 769 770 return ret; 771 } 772 773 static size_t port_mad_size(const struct ib_mad_port_private *port_priv) 774 { 775 return rdma_max_mad_size(port_priv->device, port_priv->port_num); 776 } 777 778 static size_t mad_priv_dma_size(const struct ib_mad_private *mp) 779 { 780 return sizeof(struct ib_grh) + mp->mad_size; 781 } 782 783 /* 784 * Return 0 if SMP is to be sent 785 * Return 1 if SMP was consumed locally (whether or not solicited) 786 * Return < 0 if error 787 */ 788 static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, 789 struct ib_mad_send_wr_private *mad_send_wr) 790 { 791 int ret = 0; 792 struct ib_smp *smp = mad_send_wr->send_buf.mad; 793 struct opa_smp *opa_smp = (struct opa_smp *)smp; 794 unsigned long flags; 795 struct ib_mad_local_private *local; 796 struct ib_mad_private *mad_priv; 797 struct ib_mad_port_private *port_priv; 798 struct ib_mad_agent_private *recv_mad_agent = NULL; 799 struct ib_device *device = mad_agent_priv->agent.device; 800 u8 port_num; 801 struct ib_wc mad_wc; 802 struct ib_ud_wr *send_wr = &mad_send_wr->send_wr; 803 size_t mad_size = port_mad_size(mad_agent_priv->qp_info->port_priv); 804 u16 out_mad_pkey_index = 0; 805 u16 drslid; 806 bool opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device, 807 mad_agent_priv->qp_info->port_priv->port_num); 808 809 if (rdma_cap_ib_switch(device) && 810 smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 811 port_num = send_wr->port_num; 812 else 813 port_num = mad_agent_priv->agent.port_num; 814 815 /* 816 * Directed route handling starts if the initial LID routed part of 817 * a request or the ending LID routed part of a response is empty. 818 * If we are at the start of the LID routed part, don't update the 819 * hop_ptr or hop_cnt. See section 14.2.2, Vol 1 IB spec. 820 */ 821 if (opa && smp->class_version == OPA_SM_CLASS_VERSION) { 822 u32 opa_drslid; 823 824 if ((opa_get_smp_direction(opa_smp) 825 ? opa_smp->route.dr.dr_dlid : opa_smp->route.dr.dr_slid) == 826 OPA_LID_PERMISSIVE && 827 opa_smi_handle_dr_smp_send(opa_smp, 828 rdma_cap_ib_switch(device), 829 port_num) == IB_SMI_DISCARD) { 830 ret = -EINVAL; 831 dev_err(&device->dev, "OPA Invalid directed route\n"); 832 goto out; 833 } 834 opa_drslid = be32_to_cpu(opa_smp->route.dr.dr_slid); 835 if (opa_drslid != be32_to_cpu(OPA_LID_PERMISSIVE) && 836 opa_drslid & 0xffff0000) { 837 ret = -EINVAL; 838 dev_err(&device->dev, "OPA Invalid dr_slid 0x%x\n", 839 opa_drslid); 840 goto out; 841 } 842 drslid = (u16)(opa_drslid & 0x0000ffff); 843 844 /* Check to post send on QP or process locally */ 845 if (opa_smi_check_local_smp(opa_smp, device) == IB_SMI_DISCARD && 846 opa_smi_check_local_returning_smp(opa_smp, device) == IB_SMI_DISCARD) 847 goto out; 848 } else { 849 if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) == 850 IB_LID_PERMISSIVE && 851 smi_handle_dr_smp_send(smp, rdma_cap_ib_switch(device), port_num) == 852 IB_SMI_DISCARD) { 853 ret = -EINVAL; 854 dev_err(&device->dev, "Invalid directed route\n"); 855 goto out; 856 } 857 drslid = be16_to_cpu(smp->dr_slid); 858 859 /* Check to post send on QP or process locally */ 860 if (smi_check_local_smp(smp, device) == IB_SMI_DISCARD && 861 smi_check_local_returning_smp(smp, device) == IB_SMI_DISCARD) 862 goto out; 863 } 864 865 local = kmalloc(sizeof *local, GFP_ATOMIC); 866 if (!local) { 867 ret = -ENOMEM; 868 goto out; 869 } 870 local->mad_priv = NULL; 871 local->recv_mad_agent = NULL; 872 mad_priv = alloc_mad_private(mad_size, GFP_ATOMIC); 873 if (!mad_priv) { 874 ret = -ENOMEM; 875 kfree(local); 876 goto out; 877 } 878 879 build_smp_wc(mad_agent_priv->agent.qp, 880 send_wr->wr.wr_cqe, drslid, 881 send_wr->pkey_index, 882 send_wr->port_num, &mad_wc); 883 884 if (opa && smp->base_version == OPA_MGMT_BASE_VERSION) { 885 mad_wc.byte_len = mad_send_wr->send_buf.hdr_len 886 + mad_send_wr->send_buf.data_len 887 + sizeof(struct ib_grh); 888 } 889 890 /* No GRH for DR SMP */ 891 ret = device->ops.process_mad(device, 0, port_num, &mad_wc, NULL, 892 (const struct ib_mad_hdr *)smp, mad_size, 893 (struct ib_mad_hdr *)mad_priv->mad, 894 &mad_size, &out_mad_pkey_index); 895 switch (ret) 896 { 897 case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY: 898 if (ib_response_mad((const struct ib_mad_hdr *)mad_priv->mad) && 899 mad_agent_priv->agent.recv_handler) { 900 local->mad_priv = mad_priv; 901 local->recv_mad_agent = mad_agent_priv; 902 /* 903 * Reference MAD agent until receive 904 * side of local completion handled 905 */ 906 atomic_inc(&mad_agent_priv->refcount); 907 } else 908 kfree(mad_priv); 909 break; 910 case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED: 911 kfree(mad_priv); 912 break; 913 case IB_MAD_RESULT_SUCCESS: 914 /* Treat like an incoming receive MAD */ 915 port_priv = ib_get_mad_port(mad_agent_priv->agent.device, 916 mad_agent_priv->agent.port_num); 917 if (port_priv) { 918 memcpy(mad_priv->mad, smp, mad_priv->mad_size); 919 recv_mad_agent = find_mad_agent(port_priv, 920 (const struct ib_mad_hdr *)mad_priv->mad); 921 } 922 if (!port_priv || !recv_mad_agent) { 923 /* 924 * No receiving agent so drop packet and 925 * generate send completion. 926 */ 927 kfree(mad_priv); 928 break; 929 } 930 local->mad_priv = mad_priv; 931 local->recv_mad_agent = recv_mad_agent; 932 break; 933 default: 934 kfree(mad_priv); 935 kfree(local); 936 ret = -EINVAL; 937 goto out; 938 } 939 940 local->mad_send_wr = mad_send_wr; 941 if (opa) { 942 local->mad_send_wr->send_wr.pkey_index = out_mad_pkey_index; 943 local->return_wc_byte_len = mad_size; 944 } 945 /* Reference MAD agent until send side of local completion handled */ 946 atomic_inc(&mad_agent_priv->refcount); 947 /* Queue local completion to local list */ 948 spin_lock_irqsave(&mad_agent_priv->lock, flags); 949 list_add_tail(&local->completion_list, &mad_agent_priv->local_list); 950 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 951 queue_work(mad_agent_priv->qp_info->port_priv->wq, 952 &mad_agent_priv->local_work); 953 ret = 1; 954 out: 955 return ret; 956 } 957 958 static int get_pad_size(int hdr_len, int data_len, size_t mad_size) 959 { 960 int seg_size, pad; 961 962 seg_size = mad_size - hdr_len; 963 if (data_len && seg_size) { 964 pad = seg_size - data_len % seg_size; 965 return pad == seg_size ? 0 : pad; 966 } else 967 return seg_size; 968 } 969 970 static void free_send_rmpp_list(struct ib_mad_send_wr_private *mad_send_wr) 971 { 972 struct ib_rmpp_segment *s, *t; 973 974 list_for_each_entry_safe(s, t, &mad_send_wr->rmpp_list, list) { 975 list_del(&s->list); 976 kfree(s); 977 } 978 } 979 980 static int alloc_send_rmpp_list(struct ib_mad_send_wr_private *send_wr, 981 size_t mad_size, gfp_t gfp_mask) 982 { 983 struct ib_mad_send_buf *send_buf = &send_wr->send_buf; 984 struct ib_rmpp_mad *rmpp_mad = send_buf->mad; 985 struct ib_rmpp_segment *seg = NULL; 986 int left, seg_size, pad; 987 988 send_buf->seg_size = mad_size - send_buf->hdr_len; 989 send_buf->seg_rmpp_size = mad_size - IB_MGMT_RMPP_HDR; 990 seg_size = send_buf->seg_size; 991 pad = send_wr->pad; 992 993 /* Allocate data segments. */ 994 for (left = send_buf->data_len + pad; left > 0; left -= seg_size) { 995 seg = kmalloc(sizeof (*seg) + seg_size, gfp_mask); 996 if (!seg) { 997 free_send_rmpp_list(send_wr); 998 return -ENOMEM; 999 } 1000 seg->num = ++send_buf->seg_count; 1001 list_add_tail(&seg->list, &send_wr->rmpp_list); 1002 } 1003 1004 /* Zero any padding */ 1005 if (pad) 1006 memset(seg->data + seg_size - pad, 0, pad); 1007 1008 rmpp_mad->rmpp_hdr.rmpp_version = send_wr->mad_agent_priv-> 1009 agent.rmpp_version; 1010 rmpp_mad->rmpp_hdr.rmpp_type = IB_MGMT_RMPP_TYPE_DATA; 1011 ib_set_rmpp_flags(&rmpp_mad->rmpp_hdr, IB_MGMT_RMPP_FLAG_ACTIVE); 1012 1013 send_wr->cur_seg = container_of(send_wr->rmpp_list.next, 1014 struct ib_rmpp_segment, list); 1015 send_wr->last_ack_seg = send_wr->cur_seg; 1016 return 0; 1017 } 1018 1019 int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent) 1020 { 1021 return agent->rmpp_version && !(agent->flags & IB_MAD_USER_RMPP); 1022 } 1023 EXPORT_SYMBOL(ib_mad_kernel_rmpp_agent); 1024 1025 struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent, 1026 u32 remote_qpn, u16 pkey_index, 1027 int rmpp_active, 1028 int hdr_len, int data_len, 1029 gfp_t gfp_mask, 1030 u8 base_version) 1031 { 1032 struct ib_mad_agent_private *mad_agent_priv; 1033 struct ib_mad_send_wr_private *mad_send_wr; 1034 int pad, message_size, ret, size; 1035 void *buf; 1036 size_t mad_size; 1037 bool opa; 1038 1039 mad_agent_priv = container_of(mad_agent, struct ib_mad_agent_private, 1040 agent); 1041 1042 opa = rdma_cap_opa_mad(mad_agent->device, mad_agent->port_num); 1043 1044 if (opa && base_version == OPA_MGMT_BASE_VERSION) 1045 mad_size = sizeof(struct opa_mad); 1046 else 1047 mad_size = sizeof(struct ib_mad); 1048 1049 pad = get_pad_size(hdr_len, data_len, mad_size); 1050 message_size = hdr_len + data_len + pad; 1051 1052 if (ib_mad_kernel_rmpp_agent(mad_agent)) { 1053 if (!rmpp_active && message_size > mad_size) 1054 return ERR_PTR(-EINVAL); 1055 } else 1056 if (rmpp_active || message_size > mad_size) 1057 return ERR_PTR(-EINVAL); 1058 1059 size = rmpp_active ? hdr_len : mad_size; 1060 buf = kzalloc(sizeof *mad_send_wr + size, gfp_mask); 1061 if (!buf) 1062 return ERR_PTR(-ENOMEM); 1063 1064 mad_send_wr = buf + size; 1065 INIT_LIST_HEAD(&mad_send_wr->rmpp_list); 1066 mad_send_wr->send_buf.mad = buf; 1067 mad_send_wr->send_buf.hdr_len = hdr_len; 1068 mad_send_wr->send_buf.data_len = data_len; 1069 mad_send_wr->pad = pad; 1070 1071 mad_send_wr->mad_agent_priv = mad_agent_priv; 1072 mad_send_wr->sg_list[0].length = hdr_len; 1073 mad_send_wr->sg_list[0].lkey = mad_agent->qp->pd->local_dma_lkey; 1074 1075 /* OPA MADs don't have to be the full 2048 bytes */ 1076 if (opa && base_version == OPA_MGMT_BASE_VERSION && 1077 data_len < mad_size - hdr_len) 1078 mad_send_wr->sg_list[1].length = data_len; 1079 else 1080 mad_send_wr->sg_list[1].length = mad_size - hdr_len; 1081 1082 mad_send_wr->sg_list[1].lkey = mad_agent->qp->pd->local_dma_lkey; 1083 1084 mad_send_wr->mad_list.cqe.done = ib_mad_send_done; 1085 1086 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe; 1087 mad_send_wr->send_wr.wr.sg_list = mad_send_wr->sg_list; 1088 mad_send_wr->send_wr.wr.num_sge = 2; 1089 mad_send_wr->send_wr.wr.opcode = IB_WR_SEND; 1090 mad_send_wr->send_wr.wr.send_flags = IB_SEND_SIGNALED; 1091 mad_send_wr->send_wr.remote_qpn = remote_qpn; 1092 mad_send_wr->send_wr.remote_qkey = IB_QP_SET_QKEY; 1093 mad_send_wr->send_wr.pkey_index = pkey_index; 1094 1095 if (rmpp_active) { 1096 ret = alloc_send_rmpp_list(mad_send_wr, mad_size, gfp_mask); 1097 if (ret) { 1098 kfree(buf); 1099 return ERR_PTR(ret); 1100 } 1101 } 1102 1103 mad_send_wr->send_buf.mad_agent = mad_agent; 1104 atomic_inc(&mad_agent_priv->refcount); 1105 return &mad_send_wr->send_buf; 1106 } 1107 EXPORT_SYMBOL(ib_create_send_mad); 1108 1109 int ib_get_mad_data_offset(u8 mgmt_class) 1110 { 1111 if (mgmt_class == IB_MGMT_CLASS_SUBN_ADM) 1112 return IB_MGMT_SA_HDR; 1113 else if ((mgmt_class == IB_MGMT_CLASS_DEVICE_MGMT) || 1114 (mgmt_class == IB_MGMT_CLASS_DEVICE_ADM) || 1115 (mgmt_class == IB_MGMT_CLASS_BIS)) 1116 return IB_MGMT_DEVICE_HDR; 1117 else if ((mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START) && 1118 (mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END)) 1119 return IB_MGMT_VENDOR_HDR; 1120 else 1121 return IB_MGMT_MAD_HDR; 1122 } 1123 EXPORT_SYMBOL(ib_get_mad_data_offset); 1124 1125 int ib_is_mad_class_rmpp(u8 mgmt_class) 1126 { 1127 if ((mgmt_class == IB_MGMT_CLASS_SUBN_ADM) || 1128 (mgmt_class == IB_MGMT_CLASS_DEVICE_MGMT) || 1129 (mgmt_class == IB_MGMT_CLASS_DEVICE_ADM) || 1130 (mgmt_class == IB_MGMT_CLASS_BIS) || 1131 ((mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START) && 1132 (mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END))) 1133 return 1; 1134 return 0; 1135 } 1136 EXPORT_SYMBOL(ib_is_mad_class_rmpp); 1137 1138 void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num) 1139 { 1140 struct ib_mad_send_wr_private *mad_send_wr; 1141 struct list_head *list; 1142 1143 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private, 1144 send_buf); 1145 list = &mad_send_wr->cur_seg->list; 1146 1147 if (mad_send_wr->cur_seg->num < seg_num) { 1148 list_for_each_entry(mad_send_wr->cur_seg, list, list) 1149 if (mad_send_wr->cur_seg->num == seg_num) 1150 break; 1151 } else if (mad_send_wr->cur_seg->num > seg_num) { 1152 list_for_each_entry_reverse(mad_send_wr->cur_seg, list, list) 1153 if (mad_send_wr->cur_seg->num == seg_num) 1154 break; 1155 } 1156 return mad_send_wr->cur_seg->data; 1157 } 1158 EXPORT_SYMBOL(ib_get_rmpp_segment); 1159 1160 static inline void *ib_get_payload(struct ib_mad_send_wr_private *mad_send_wr) 1161 { 1162 if (mad_send_wr->send_buf.seg_count) 1163 return ib_get_rmpp_segment(&mad_send_wr->send_buf, 1164 mad_send_wr->seg_num); 1165 else 1166 return mad_send_wr->send_buf.mad + 1167 mad_send_wr->send_buf.hdr_len; 1168 } 1169 1170 void ib_free_send_mad(struct ib_mad_send_buf *send_buf) 1171 { 1172 struct ib_mad_agent_private *mad_agent_priv; 1173 struct ib_mad_send_wr_private *mad_send_wr; 1174 1175 mad_agent_priv = container_of(send_buf->mad_agent, 1176 struct ib_mad_agent_private, agent); 1177 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private, 1178 send_buf); 1179 1180 free_send_rmpp_list(mad_send_wr); 1181 kfree(send_buf->mad); 1182 deref_mad_agent(mad_agent_priv); 1183 } 1184 EXPORT_SYMBOL(ib_free_send_mad); 1185 1186 int ib_send_mad(struct ib_mad_send_wr_private *mad_send_wr) 1187 { 1188 struct ib_mad_qp_info *qp_info; 1189 struct list_head *list; 1190 struct ib_mad_agent *mad_agent; 1191 struct ib_sge *sge; 1192 unsigned long flags; 1193 int ret; 1194 1195 /* Set WR ID to find mad_send_wr upon completion */ 1196 qp_info = mad_send_wr->mad_agent_priv->qp_info; 1197 mad_send_wr->mad_list.mad_queue = &qp_info->send_queue; 1198 mad_send_wr->mad_list.cqe.done = ib_mad_send_done; 1199 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe; 1200 1201 mad_agent = mad_send_wr->send_buf.mad_agent; 1202 sge = mad_send_wr->sg_list; 1203 sge[0].addr = ib_dma_map_single(mad_agent->device, 1204 mad_send_wr->send_buf.mad, 1205 sge[0].length, 1206 DMA_TO_DEVICE); 1207 if (unlikely(ib_dma_mapping_error(mad_agent->device, sge[0].addr))) 1208 return -ENOMEM; 1209 1210 mad_send_wr->header_mapping = sge[0].addr; 1211 1212 sge[1].addr = ib_dma_map_single(mad_agent->device, 1213 ib_get_payload(mad_send_wr), 1214 sge[1].length, 1215 DMA_TO_DEVICE); 1216 if (unlikely(ib_dma_mapping_error(mad_agent->device, sge[1].addr))) { 1217 ib_dma_unmap_single(mad_agent->device, 1218 mad_send_wr->header_mapping, 1219 sge[0].length, DMA_TO_DEVICE); 1220 return -ENOMEM; 1221 } 1222 mad_send_wr->payload_mapping = sge[1].addr; 1223 1224 spin_lock_irqsave(&qp_info->send_queue.lock, flags); 1225 if (qp_info->send_queue.count < qp_info->send_queue.max_active) { 1226 ret = ib_post_send(mad_agent->qp, &mad_send_wr->send_wr.wr, 1227 NULL); 1228 list = &qp_info->send_queue.list; 1229 } else { 1230 ret = 0; 1231 list = &qp_info->overflow_list; 1232 } 1233 1234 if (!ret) { 1235 qp_info->send_queue.count++; 1236 list_add_tail(&mad_send_wr->mad_list.list, list); 1237 } 1238 spin_unlock_irqrestore(&qp_info->send_queue.lock, flags); 1239 if (ret) { 1240 ib_dma_unmap_single(mad_agent->device, 1241 mad_send_wr->header_mapping, 1242 sge[0].length, DMA_TO_DEVICE); 1243 ib_dma_unmap_single(mad_agent->device, 1244 mad_send_wr->payload_mapping, 1245 sge[1].length, DMA_TO_DEVICE); 1246 } 1247 return ret; 1248 } 1249 1250 /* 1251 * ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated 1252 * with the registered client 1253 */ 1254 int ib_post_send_mad(struct ib_mad_send_buf *send_buf, 1255 struct ib_mad_send_buf **bad_send_buf) 1256 { 1257 struct ib_mad_agent_private *mad_agent_priv; 1258 struct ib_mad_send_buf *next_send_buf; 1259 struct ib_mad_send_wr_private *mad_send_wr; 1260 unsigned long flags; 1261 int ret = -EINVAL; 1262 1263 /* Walk list of send WRs and post each on send list */ 1264 for (; send_buf; send_buf = next_send_buf) { 1265 mad_send_wr = container_of(send_buf, 1266 struct ib_mad_send_wr_private, 1267 send_buf); 1268 mad_agent_priv = mad_send_wr->mad_agent_priv; 1269 1270 ret = ib_mad_enforce_security(mad_agent_priv, 1271 mad_send_wr->send_wr.pkey_index); 1272 if (ret) 1273 goto error; 1274 1275 if (!send_buf->mad_agent->send_handler || 1276 (send_buf->timeout_ms && 1277 !send_buf->mad_agent->recv_handler)) { 1278 ret = -EINVAL; 1279 goto error; 1280 } 1281 1282 if (!ib_is_mad_class_rmpp(((struct ib_mad_hdr *) send_buf->mad)->mgmt_class)) { 1283 if (mad_agent_priv->agent.rmpp_version) { 1284 ret = -EINVAL; 1285 goto error; 1286 } 1287 } 1288 1289 /* 1290 * Save pointer to next work request to post in case the 1291 * current one completes, and the user modifies the work 1292 * request associated with the completion 1293 */ 1294 next_send_buf = send_buf->next; 1295 mad_send_wr->send_wr.ah = send_buf->ah; 1296 1297 if (((struct ib_mad_hdr *) send_buf->mad)->mgmt_class == 1298 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { 1299 ret = handle_outgoing_dr_smp(mad_agent_priv, 1300 mad_send_wr); 1301 if (ret < 0) /* error */ 1302 goto error; 1303 else if (ret == 1) /* locally consumed */ 1304 continue; 1305 } 1306 1307 mad_send_wr->tid = ((struct ib_mad_hdr *) send_buf->mad)->tid; 1308 /* Timeout will be updated after send completes */ 1309 mad_send_wr->timeout = msecs_to_jiffies(send_buf->timeout_ms); 1310 mad_send_wr->max_retries = send_buf->retries; 1311 mad_send_wr->retries_left = send_buf->retries; 1312 send_buf->retries = 0; 1313 /* Reference for work request to QP + response */ 1314 mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0); 1315 mad_send_wr->status = IB_WC_SUCCESS; 1316 1317 /* Reference MAD agent until send completes */ 1318 atomic_inc(&mad_agent_priv->refcount); 1319 spin_lock_irqsave(&mad_agent_priv->lock, flags); 1320 list_add_tail(&mad_send_wr->agent_list, 1321 &mad_agent_priv->send_list); 1322 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 1323 1324 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) { 1325 ret = ib_send_rmpp_mad(mad_send_wr); 1326 if (ret >= 0 && ret != IB_RMPP_RESULT_CONSUMED) 1327 ret = ib_send_mad(mad_send_wr); 1328 } else 1329 ret = ib_send_mad(mad_send_wr); 1330 if (ret < 0) { 1331 /* Fail send request */ 1332 spin_lock_irqsave(&mad_agent_priv->lock, flags); 1333 list_del(&mad_send_wr->agent_list); 1334 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 1335 atomic_dec(&mad_agent_priv->refcount); 1336 goto error; 1337 } 1338 } 1339 return 0; 1340 error: 1341 if (bad_send_buf) 1342 *bad_send_buf = send_buf; 1343 return ret; 1344 } 1345 EXPORT_SYMBOL(ib_post_send_mad); 1346 1347 /* 1348 * ib_free_recv_mad - Returns data buffers used to receive 1349 * a MAD to the access layer 1350 */ 1351 void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc) 1352 { 1353 struct ib_mad_recv_buf *mad_recv_buf, *temp_recv_buf; 1354 struct ib_mad_private_header *mad_priv_hdr; 1355 struct ib_mad_private *priv; 1356 struct list_head free_list; 1357 1358 INIT_LIST_HEAD(&free_list); 1359 list_splice_init(&mad_recv_wc->rmpp_list, &free_list); 1360 1361 list_for_each_entry_safe(mad_recv_buf, temp_recv_buf, 1362 &free_list, list) { 1363 mad_recv_wc = container_of(mad_recv_buf, struct ib_mad_recv_wc, 1364 recv_buf); 1365 mad_priv_hdr = container_of(mad_recv_wc, 1366 struct ib_mad_private_header, 1367 recv_wc); 1368 priv = container_of(mad_priv_hdr, struct ib_mad_private, 1369 header); 1370 kfree(priv); 1371 } 1372 } 1373 EXPORT_SYMBOL(ib_free_recv_mad); 1374 1375 struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp, 1376 u8 rmpp_version, 1377 ib_mad_send_handler send_handler, 1378 ib_mad_recv_handler recv_handler, 1379 void *context) 1380 { 1381 return ERR_PTR(-EINVAL); /* XXX: for now */ 1382 } 1383 EXPORT_SYMBOL(ib_redirect_mad_qp); 1384 1385 int ib_process_mad_wc(struct ib_mad_agent *mad_agent, 1386 struct ib_wc *wc) 1387 { 1388 dev_err(&mad_agent->device->dev, 1389 "ib_process_mad_wc() not implemented yet\n"); 1390 return 0; 1391 } 1392 EXPORT_SYMBOL(ib_process_mad_wc); 1393 1394 static int method_in_use(struct ib_mad_mgmt_method_table **method, 1395 struct ib_mad_reg_req *mad_reg_req) 1396 { 1397 int i; 1398 1399 for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS) { 1400 if ((*method)->agent[i]) { 1401 pr_err("Method %d already in use\n", i); 1402 return -EINVAL; 1403 } 1404 } 1405 return 0; 1406 } 1407 1408 static int allocate_method_table(struct ib_mad_mgmt_method_table **method) 1409 { 1410 /* Allocate management method table */ 1411 *method = kzalloc(sizeof **method, GFP_ATOMIC); 1412 return (*method) ? 0 : (-ENOMEM); 1413 } 1414 1415 /* 1416 * Check to see if there are any methods still in use 1417 */ 1418 static int check_method_table(struct ib_mad_mgmt_method_table *method) 1419 { 1420 int i; 1421 1422 for (i = 0; i < IB_MGMT_MAX_METHODS; i++) 1423 if (method->agent[i]) 1424 return 1; 1425 return 0; 1426 } 1427 1428 /* 1429 * Check to see if there are any method tables for this class still in use 1430 */ 1431 static int check_class_table(struct ib_mad_mgmt_class_table *class) 1432 { 1433 int i; 1434 1435 for (i = 0; i < MAX_MGMT_CLASS; i++) 1436 if (class->method_table[i]) 1437 return 1; 1438 return 0; 1439 } 1440 1441 static int check_vendor_class(struct ib_mad_mgmt_vendor_class *vendor_class) 1442 { 1443 int i; 1444 1445 for (i = 0; i < MAX_MGMT_OUI; i++) 1446 if (vendor_class->method_table[i]) 1447 return 1; 1448 return 0; 1449 } 1450 1451 static int find_vendor_oui(struct ib_mad_mgmt_vendor_class *vendor_class, 1452 const char *oui) 1453 { 1454 int i; 1455 1456 for (i = 0; i < MAX_MGMT_OUI; i++) 1457 /* Is there matching OUI for this vendor class ? */ 1458 if (!memcmp(vendor_class->oui[i], oui, 3)) 1459 return i; 1460 1461 return -1; 1462 } 1463 1464 static int check_vendor_table(struct ib_mad_mgmt_vendor_class_table *vendor) 1465 { 1466 int i; 1467 1468 for (i = 0; i < MAX_MGMT_VENDOR_RANGE2; i++) 1469 if (vendor->vendor_class[i]) 1470 return 1; 1471 1472 return 0; 1473 } 1474 1475 static void remove_methods_mad_agent(struct ib_mad_mgmt_method_table *method, 1476 struct ib_mad_agent_private *agent) 1477 { 1478 int i; 1479 1480 /* Remove any methods for this mad agent */ 1481 for (i = 0; i < IB_MGMT_MAX_METHODS; i++) { 1482 if (method->agent[i] == agent) { 1483 method->agent[i] = NULL; 1484 } 1485 } 1486 } 1487 1488 static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req, 1489 struct ib_mad_agent_private *agent_priv, 1490 u8 mgmt_class) 1491 { 1492 struct ib_mad_port_private *port_priv; 1493 struct ib_mad_mgmt_class_table **class; 1494 struct ib_mad_mgmt_method_table **method; 1495 int i, ret; 1496 1497 port_priv = agent_priv->qp_info->port_priv; 1498 class = &port_priv->version[mad_reg_req->mgmt_class_version].class; 1499 if (!*class) { 1500 /* Allocate management class table for "new" class version */ 1501 *class = kzalloc(sizeof **class, GFP_ATOMIC); 1502 if (!*class) { 1503 ret = -ENOMEM; 1504 goto error1; 1505 } 1506 1507 /* Allocate method table for this management class */ 1508 method = &(*class)->method_table[mgmt_class]; 1509 if ((ret = allocate_method_table(method))) 1510 goto error2; 1511 } else { 1512 method = &(*class)->method_table[mgmt_class]; 1513 if (!*method) { 1514 /* Allocate method table for this management class */ 1515 if ((ret = allocate_method_table(method))) 1516 goto error1; 1517 } 1518 } 1519 1520 /* Now, make sure methods are not already in use */ 1521 if (method_in_use(method, mad_reg_req)) 1522 goto error3; 1523 1524 /* Finally, add in methods being registered */ 1525 for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS) 1526 (*method)->agent[i] = agent_priv; 1527 1528 return 0; 1529 1530 error3: 1531 /* Remove any methods for this mad agent */ 1532 remove_methods_mad_agent(*method, agent_priv); 1533 /* Now, check to see if there are any methods in use */ 1534 if (!check_method_table(*method)) { 1535 /* If not, release management method table */ 1536 kfree(*method); 1537 *method = NULL; 1538 } 1539 ret = -EINVAL; 1540 goto error1; 1541 error2: 1542 kfree(*class); 1543 *class = NULL; 1544 error1: 1545 return ret; 1546 } 1547 1548 static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req, 1549 struct ib_mad_agent_private *agent_priv) 1550 { 1551 struct ib_mad_port_private *port_priv; 1552 struct ib_mad_mgmt_vendor_class_table **vendor_table; 1553 struct ib_mad_mgmt_vendor_class_table *vendor = NULL; 1554 struct ib_mad_mgmt_vendor_class *vendor_class = NULL; 1555 struct ib_mad_mgmt_method_table **method; 1556 int i, ret = -ENOMEM; 1557 u8 vclass; 1558 1559 /* "New" vendor (with OUI) class */ 1560 vclass = vendor_class_index(mad_reg_req->mgmt_class); 1561 port_priv = agent_priv->qp_info->port_priv; 1562 vendor_table = &port_priv->version[ 1563 mad_reg_req->mgmt_class_version].vendor; 1564 if (!*vendor_table) { 1565 /* Allocate mgmt vendor class table for "new" class version */ 1566 vendor = kzalloc(sizeof *vendor, GFP_ATOMIC); 1567 if (!vendor) 1568 goto error1; 1569 1570 *vendor_table = vendor; 1571 } 1572 if (!(*vendor_table)->vendor_class[vclass]) { 1573 /* Allocate table for this management vendor class */ 1574 vendor_class = kzalloc(sizeof *vendor_class, GFP_ATOMIC); 1575 if (!vendor_class) 1576 goto error2; 1577 1578 (*vendor_table)->vendor_class[vclass] = vendor_class; 1579 } 1580 for (i = 0; i < MAX_MGMT_OUI; i++) { 1581 /* Is there matching OUI for this vendor class ? */ 1582 if (!memcmp((*vendor_table)->vendor_class[vclass]->oui[i], 1583 mad_reg_req->oui, 3)) { 1584 method = &(*vendor_table)->vendor_class[ 1585 vclass]->method_table[i]; 1586 if (!*method) 1587 goto error3; 1588 goto check_in_use; 1589 } 1590 } 1591 for (i = 0; i < MAX_MGMT_OUI; i++) { 1592 /* OUI slot available ? */ 1593 if (!is_vendor_oui((*vendor_table)->vendor_class[ 1594 vclass]->oui[i])) { 1595 method = &(*vendor_table)->vendor_class[ 1596 vclass]->method_table[i]; 1597 /* Allocate method table for this OUI */ 1598 if (!*method) { 1599 ret = allocate_method_table(method); 1600 if (ret) 1601 goto error3; 1602 } 1603 memcpy((*vendor_table)->vendor_class[vclass]->oui[i], 1604 mad_reg_req->oui, 3); 1605 goto check_in_use; 1606 } 1607 } 1608 dev_err(&agent_priv->agent.device->dev, "All OUI slots in use\n"); 1609 goto error3; 1610 1611 check_in_use: 1612 /* Now, make sure methods are not already in use */ 1613 if (method_in_use(method, mad_reg_req)) 1614 goto error4; 1615 1616 /* Finally, add in methods being registered */ 1617 for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS) 1618 (*method)->agent[i] = agent_priv; 1619 1620 return 0; 1621 1622 error4: 1623 /* Remove any methods for this mad agent */ 1624 remove_methods_mad_agent(*method, agent_priv); 1625 /* Now, check to see if there are any methods in use */ 1626 if (!check_method_table(*method)) { 1627 /* If not, release management method table */ 1628 kfree(*method); 1629 *method = NULL; 1630 } 1631 ret = -EINVAL; 1632 error3: 1633 if (vendor_class) { 1634 (*vendor_table)->vendor_class[vclass] = NULL; 1635 kfree(vendor_class); 1636 } 1637 error2: 1638 if (vendor) { 1639 *vendor_table = NULL; 1640 kfree(vendor); 1641 } 1642 error1: 1643 return ret; 1644 } 1645 1646 static void remove_mad_reg_req(struct ib_mad_agent_private *agent_priv) 1647 { 1648 struct ib_mad_port_private *port_priv; 1649 struct ib_mad_mgmt_class_table *class; 1650 struct ib_mad_mgmt_method_table *method; 1651 struct ib_mad_mgmt_vendor_class_table *vendor; 1652 struct ib_mad_mgmt_vendor_class *vendor_class; 1653 int index; 1654 u8 mgmt_class; 1655 1656 /* 1657 * Was MAD registration request supplied 1658 * with original registration ? 1659 */ 1660 if (!agent_priv->reg_req) { 1661 goto out; 1662 } 1663 1664 port_priv = agent_priv->qp_info->port_priv; 1665 mgmt_class = convert_mgmt_class(agent_priv->reg_req->mgmt_class); 1666 class = port_priv->version[ 1667 agent_priv->reg_req->mgmt_class_version].class; 1668 if (!class) 1669 goto vendor_check; 1670 1671 method = class->method_table[mgmt_class]; 1672 if (method) { 1673 /* Remove any methods for this mad agent */ 1674 remove_methods_mad_agent(method, agent_priv); 1675 /* Now, check to see if there are any methods still in use */ 1676 if (!check_method_table(method)) { 1677 /* If not, release management method table */ 1678 kfree(method); 1679 class->method_table[mgmt_class] = NULL; 1680 /* Any management classes left ? */ 1681 if (!check_class_table(class)) { 1682 /* If not, release management class table */ 1683 kfree(class); 1684 port_priv->version[ 1685 agent_priv->reg_req-> 1686 mgmt_class_version].class = NULL; 1687 } 1688 } 1689 } 1690 1691 vendor_check: 1692 if (!is_vendor_class(mgmt_class)) 1693 goto out; 1694 1695 /* normalize mgmt_class to vendor range 2 */ 1696 mgmt_class = vendor_class_index(agent_priv->reg_req->mgmt_class); 1697 vendor = port_priv->version[ 1698 agent_priv->reg_req->mgmt_class_version].vendor; 1699 1700 if (!vendor) 1701 goto out; 1702 1703 vendor_class = vendor->vendor_class[mgmt_class]; 1704 if (vendor_class) { 1705 index = find_vendor_oui(vendor_class, agent_priv->reg_req->oui); 1706 if (index < 0) 1707 goto out; 1708 method = vendor_class->method_table[index]; 1709 if (method) { 1710 /* Remove any methods for this mad agent */ 1711 remove_methods_mad_agent(method, agent_priv); 1712 /* 1713 * Now, check to see if there are 1714 * any methods still in use 1715 */ 1716 if (!check_method_table(method)) { 1717 /* If not, release management method table */ 1718 kfree(method); 1719 vendor_class->method_table[index] = NULL; 1720 memset(vendor_class->oui[index], 0, 3); 1721 /* Any OUIs left ? */ 1722 if (!check_vendor_class(vendor_class)) { 1723 /* If not, release vendor class table */ 1724 kfree(vendor_class); 1725 vendor->vendor_class[mgmt_class] = NULL; 1726 /* Any other vendor classes left ? */ 1727 if (!check_vendor_table(vendor)) { 1728 kfree(vendor); 1729 port_priv->version[ 1730 agent_priv->reg_req-> 1731 mgmt_class_version]. 1732 vendor = NULL; 1733 } 1734 } 1735 } 1736 } 1737 } 1738 1739 out: 1740 return; 1741 } 1742 1743 static struct ib_mad_agent_private * 1744 find_mad_agent(struct ib_mad_port_private *port_priv, 1745 const struct ib_mad_hdr *mad_hdr) 1746 { 1747 struct ib_mad_agent_private *mad_agent = NULL; 1748 unsigned long flags; 1749 1750 if (ib_response_mad(mad_hdr)) { 1751 u32 hi_tid; 1752 1753 /* 1754 * Routing is based on high 32 bits of transaction ID 1755 * of MAD. 1756 */ 1757 hi_tid = be64_to_cpu(mad_hdr->tid) >> 32; 1758 rcu_read_lock(); 1759 mad_agent = idr_find(&ib_mad_clients, hi_tid); 1760 if (mad_agent && !atomic_inc_not_zero(&mad_agent->refcount)) 1761 mad_agent = NULL; 1762 rcu_read_unlock(); 1763 } else { 1764 struct ib_mad_mgmt_class_table *class; 1765 struct ib_mad_mgmt_method_table *method; 1766 struct ib_mad_mgmt_vendor_class_table *vendor; 1767 struct ib_mad_mgmt_vendor_class *vendor_class; 1768 const struct ib_vendor_mad *vendor_mad; 1769 int index; 1770 1771 spin_lock_irqsave(&port_priv->reg_lock, flags); 1772 /* 1773 * Routing is based on version, class, and method 1774 * For "newer" vendor MADs, also based on OUI 1775 */ 1776 if (mad_hdr->class_version >= MAX_MGMT_VERSION) 1777 goto out; 1778 if (!is_vendor_class(mad_hdr->mgmt_class)) { 1779 class = port_priv->version[ 1780 mad_hdr->class_version].class; 1781 if (!class) 1782 goto out; 1783 if (convert_mgmt_class(mad_hdr->mgmt_class) >= 1784 ARRAY_SIZE(class->method_table)) 1785 goto out; 1786 method = class->method_table[convert_mgmt_class( 1787 mad_hdr->mgmt_class)]; 1788 if (method) 1789 mad_agent = method->agent[mad_hdr->method & 1790 ~IB_MGMT_METHOD_RESP]; 1791 } else { 1792 vendor = port_priv->version[ 1793 mad_hdr->class_version].vendor; 1794 if (!vendor) 1795 goto out; 1796 vendor_class = vendor->vendor_class[vendor_class_index( 1797 mad_hdr->mgmt_class)]; 1798 if (!vendor_class) 1799 goto out; 1800 /* Find matching OUI */ 1801 vendor_mad = (const struct ib_vendor_mad *)mad_hdr; 1802 index = find_vendor_oui(vendor_class, vendor_mad->oui); 1803 if (index == -1) 1804 goto out; 1805 method = vendor_class->method_table[index]; 1806 if (method) { 1807 mad_agent = method->agent[mad_hdr->method & 1808 ~IB_MGMT_METHOD_RESP]; 1809 } 1810 } 1811 if (mad_agent) 1812 atomic_inc(&mad_agent->refcount); 1813 out: 1814 spin_unlock_irqrestore(&port_priv->reg_lock, flags); 1815 } 1816 1817 if (mad_agent && !mad_agent->agent.recv_handler) { 1818 dev_notice(&port_priv->device->dev, 1819 "No receive handler for client %p on port %d\n", 1820 &mad_agent->agent, port_priv->port_num); 1821 deref_mad_agent(mad_agent); 1822 mad_agent = NULL; 1823 } 1824 1825 return mad_agent; 1826 } 1827 1828 static int validate_mad(const struct ib_mad_hdr *mad_hdr, 1829 const struct ib_mad_qp_info *qp_info, 1830 bool opa) 1831 { 1832 int valid = 0; 1833 u32 qp_num = qp_info->qp->qp_num; 1834 1835 /* Make sure MAD base version is understood */ 1836 if (mad_hdr->base_version != IB_MGMT_BASE_VERSION && 1837 (!opa || mad_hdr->base_version != OPA_MGMT_BASE_VERSION)) { 1838 pr_err("MAD received with unsupported base version %d %s\n", 1839 mad_hdr->base_version, opa ? "(opa)" : ""); 1840 goto out; 1841 } 1842 1843 /* Filter SMI packets sent to other than QP0 */ 1844 if ((mad_hdr->mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED) || 1845 (mad_hdr->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) { 1846 if (qp_num == 0) 1847 valid = 1; 1848 } else { 1849 /* CM attributes other than ClassPortInfo only use Send method */ 1850 if ((mad_hdr->mgmt_class == IB_MGMT_CLASS_CM) && 1851 (mad_hdr->attr_id != IB_MGMT_CLASSPORTINFO_ATTR_ID) && 1852 (mad_hdr->method != IB_MGMT_METHOD_SEND)) 1853 goto out; 1854 /* Filter GSI packets sent to QP0 */ 1855 if (qp_num != 0) 1856 valid = 1; 1857 } 1858 1859 out: 1860 return valid; 1861 } 1862 1863 static int is_rmpp_data_mad(const struct ib_mad_agent_private *mad_agent_priv, 1864 const struct ib_mad_hdr *mad_hdr) 1865 { 1866 struct ib_rmpp_mad *rmpp_mad; 1867 1868 rmpp_mad = (struct ib_rmpp_mad *)mad_hdr; 1869 return !mad_agent_priv->agent.rmpp_version || 1870 !ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent) || 1871 !(ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) & 1872 IB_MGMT_RMPP_FLAG_ACTIVE) || 1873 (rmpp_mad->rmpp_hdr.rmpp_type == IB_MGMT_RMPP_TYPE_DATA); 1874 } 1875 1876 static inline int rcv_has_same_class(const struct ib_mad_send_wr_private *wr, 1877 const struct ib_mad_recv_wc *rwc) 1878 { 1879 return ((struct ib_mad_hdr *)(wr->send_buf.mad))->mgmt_class == 1880 rwc->recv_buf.mad->mad_hdr.mgmt_class; 1881 } 1882 1883 static inline int rcv_has_same_gid(const struct ib_mad_agent_private *mad_agent_priv, 1884 const struct ib_mad_send_wr_private *wr, 1885 const struct ib_mad_recv_wc *rwc ) 1886 { 1887 struct rdma_ah_attr attr; 1888 u8 send_resp, rcv_resp; 1889 union ib_gid sgid; 1890 struct ib_device *device = mad_agent_priv->agent.device; 1891 u8 port_num = mad_agent_priv->agent.port_num; 1892 u8 lmc; 1893 bool has_grh; 1894 1895 send_resp = ib_response_mad((struct ib_mad_hdr *)wr->send_buf.mad); 1896 rcv_resp = ib_response_mad(&rwc->recv_buf.mad->mad_hdr); 1897 1898 if (send_resp == rcv_resp) 1899 /* both requests, or both responses. GIDs different */ 1900 return 0; 1901 1902 if (rdma_query_ah(wr->send_buf.ah, &attr)) 1903 /* Assume not equal, to avoid false positives. */ 1904 return 0; 1905 1906 has_grh = !!(rdma_ah_get_ah_flags(&attr) & IB_AH_GRH); 1907 if (has_grh != !!(rwc->wc->wc_flags & IB_WC_GRH)) 1908 /* one has GID, other does not. Assume different */ 1909 return 0; 1910 1911 if (!send_resp && rcv_resp) { 1912 /* is request/response. */ 1913 if (!has_grh) { 1914 if (ib_get_cached_lmc(device, port_num, &lmc)) 1915 return 0; 1916 return (!lmc || !((rdma_ah_get_path_bits(&attr) ^ 1917 rwc->wc->dlid_path_bits) & 1918 ((1 << lmc) - 1))); 1919 } else { 1920 const struct ib_global_route *grh = 1921 rdma_ah_read_grh(&attr); 1922 1923 if (rdma_query_gid(device, port_num, 1924 grh->sgid_index, &sgid)) 1925 return 0; 1926 return !memcmp(sgid.raw, rwc->recv_buf.grh->dgid.raw, 1927 16); 1928 } 1929 } 1930 1931 if (!has_grh) 1932 return rdma_ah_get_dlid(&attr) == rwc->wc->slid; 1933 else 1934 return !memcmp(rdma_ah_read_grh(&attr)->dgid.raw, 1935 rwc->recv_buf.grh->sgid.raw, 1936 16); 1937 } 1938 1939 static inline int is_direct(u8 class) 1940 { 1941 return (class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE); 1942 } 1943 1944 struct ib_mad_send_wr_private* 1945 ib_find_send_mad(const struct ib_mad_agent_private *mad_agent_priv, 1946 const struct ib_mad_recv_wc *wc) 1947 { 1948 struct ib_mad_send_wr_private *wr; 1949 const struct ib_mad_hdr *mad_hdr; 1950 1951 mad_hdr = &wc->recv_buf.mad->mad_hdr; 1952 1953 list_for_each_entry(wr, &mad_agent_priv->wait_list, agent_list) { 1954 if ((wr->tid == mad_hdr->tid) && 1955 rcv_has_same_class(wr, wc) && 1956 /* 1957 * Don't check GID for direct routed MADs. 1958 * These might have permissive LIDs. 1959 */ 1960 (is_direct(mad_hdr->mgmt_class) || 1961 rcv_has_same_gid(mad_agent_priv, wr, wc))) 1962 return (wr->status == IB_WC_SUCCESS) ? wr : NULL; 1963 } 1964 1965 /* 1966 * It's possible to receive the response before we've 1967 * been notified that the send has completed 1968 */ 1969 list_for_each_entry(wr, &mad_agent_priv->send_list, agent_list) { 1970 if (is_rmpp_data_mad(mad_agent_priv, wr->send_buf.mad) && 1971 wr->tid == mad_hdr->tid && 1972 wr->timeout && 1973 rcv_has_same_class(wr, wc) && 1974 /* 1975 * Don't check GID for direct routed MADs. 1976 * These might have permissive LIDs. 1977 */ 1978 (is_direct(mad_hdr->mgmt_class) || 1979 rcv_has_same_gid(mad_agent_priv, wr, wc))) 1980 /* Verify request has not been canceled */ 1981 return (wr->status == IB_WC_SUCCESS) ? wr : NULL; 1982 } 1983 return NULL; 1984 } 1985 1986 void ib_mark_mad_done(struct ib_mad_send_wr_private *mad_send_wr) 1987 { 1988 mad_send_wr->timeout = 0; 1989 if (mad_send_wr->refcount == 1) 1990 list_move_tail(&mad_send_wr->agent_list, 1991 &mad_send_wr->mad_agent_priv->done_list); 1992 } 1993 1994 static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv, 1995 struct ib_mad_recv_wc *mad_recv_wc) 1996 { 1997 struct ib_mad_send_wr_private *mad_send_wr; 1998 struct ib_mad_send_wc mad_send_wc; 1999 unsigned long flags; 2000 int ret; 2001 2002 INIT_LIST_HEAD(&mad_recv_wc->rmpp_list); 2003 ret = ib_mad_enforce_security(mad_agent_priv, 2004 mad_recv_wc->wc->pkey_index); 2005 if (ret) { 2006 ib_free_recv_mad(mad_recv_wc); 2007 deref_mad_agent(mad_agent_priv); 2008 return; 2009 } 2010 2011 list_add(&mad_recv_wc->recv_buf.list, &mad_recv_wc->rmpp_list); 2012 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) { 2013 mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv, 2014 mad_recv_wc); 2015 if (!mad_recv_wc) { 2016 deref_mad_agent(mad_agent_priv); 2017 return; 2018 } 2019 } 2020 2021 /* Complete corresponding request */ 2022 if (ib_response_mad(&mad_recv_wc->recv_buf.mad->mad_hdr)) { 2023 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2024 mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc); 2025 if (!mad_send_wr) { 2026 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2027 if (!ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent) 2028 && ib_is_mad_class_rmpp(mad_recv_wc->recv_buf.mad->mad_hdr.mgmt_class) 2029 && (ib_get_rmpp_flags(&((struct ib_rmpp_mad *)mad_recv_wc->recv_buf.mad)->rmpp_hdr) 2030 & IB_MGMT_RMPP_FLAG_ACTIVE)) { 2031 /* user rmpp is in effect 2032 * and this is an active RMPP MAD 2033 */ 2034 mad_agent_priv->agent.recv_handler( 2035 &mad_agent_priv->agent, NULL, 2036 mad_recv_wc); 2037 atomic_dec(&mad_agent_priv->refcount); 2038 } else { 2039 /* not user rmpp, revert to normal behavior and 2040 * drop the mad */ 2041 ib_free_recv_mad(mad_recv_wc); 2042 deref_mad_agent(mad_agent_priv); 2043 return; 2044 } 2045 } else { 2046 ib_mark_mad_done(mad_send_wr); 2047 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2048 2049 /* Defined behavior is to complete response before request */ 2050 mad_agent_priv->agent.recv_handler( 2051 &mad_agent_priv->agent, 2052 &mad_send_wr->send_buf, 2053 mad_recv_wc); 2054 atomic_dec(&mad_agent_priv->refcount); 2055 2056 mad_send_wc.status = IB_WC_SUCCESS; 2057 mad_send_wc.vendor_err = 0; 2058 mad_send_wc.send_buf = &mad_send_wr->send_buf; 2059 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc); 2060 } 2061 } else { 2062 mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent, NULL, 2063 mad_recv_wc); 2064 deref_mad_agent(mad_agent_priv); 2065 } 2066 2067 return; 2068 } 2069 2070 static enum smi_action handle_ib_smi(const struct ib_mad_port_private *port_priv, 2071 const struct ib_mad_qp_info *qp_info, 2072 const struct ib_wc *wc, 2073 int port_num, 2074 struct ib_mad_private *recv, 2075 struct ib_mad_private *response) 2076 { 2077 enum smi_forward_action retsmi; 2078 struct ib_smp *smp = (struct ib_smp *)recv->mad; 2079 2080 if (smi_handle_dr_smp_recv(smp, 2081 rdma_cap_ib_switch(port_priv->device), 2082 port_num, 2083 port_priv->device->phys_port_cnt) == 2084 IB_SMI_DISCARD) 2085 return IB_SMI_DISCARD; 2086 2087 retsmi = smi_check_forward_dr_smp(smp); 2088 if (retsmi == IB_SMI_LOCAL) 2089 return IB_SMI_HANDLE; 2090 2091 if (retsmi == IB_SMI_SEND) { /* don't forward */ 2092 if (smi_handle_dr_smp_send(smp, 2093 rdma_cap_ib_switch(port_priv->device), 2094 port_num) == IB_SMI_DISCARD) 2095 return IB_SMI_DISCARD; 2096 2097 if (smi_check_local_smp(smp, port_priv->device) == IB_SMI_DISCARD) 2098 return IB_SMI_DISCARD; 2099 } else if (rdma_cap_ib_switch(port_priv->device)) { 2100 /* forward case for switches */ 2101 memcpy(response, recv, mad_priv_size(response)); 2102 response->header.recv_wc.wc = &response->header.wc; 2103 response->header.recv_wc.recv_buf.mad = (struct ib_mad *)response->mad; 2104 response->header.recv_wc.recv_buf.grh = &response->grh; 2105 2106 agent_send_response((const struct ib_mad_hdr *)response->mad, 2107 &response->grh, wc, 2108 port_priv->device, 2109 smi_get_fwd_port(smp), 2110 qp_info->qp->qp_num, 2111 response->mad_size, 2112 false); 2113 2114 return IB_SMI_DISCARD; 2115 } 2116 return IB_SMI_HANDLE; 2117 } 2118 2119 static bool generate_unmatched_resp(const struct ib_mad_private *recv, 2120 struct ib_mad_private *response, 2121 size_t *resp_len, bool opa) 2122 { 2123 const struct ib_mad_hdr *recv_hdr = (const struct ib_mad_hdr *)recv->mad; 2124 struct ib_mad_hdr *resp_hdr = (struct ib_mad_hdr *)response->mad; 2125 2126 if (recv_hdr->method == IB_MGMT_METHOD_GET || 2127 recv_hdr->method == IB_MGMT_METHOD_SET) { 2128 memcpy(response, recv, mad_priv_size(response)); 2129 response->header.recv_wc.wc = &response->header.wc; 2130 response->header.recv_wc.recv_buf.mad = (struct ib_mad *)response->mad; 2131 response->header.recv_wc.recv_buf.grh = &response->grh; 2132 resp_hdr->method = IB_MGMT_METHOD_GET_RESP; 2133 resp_hdr->status = cpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB); 2134 if (recv_hdr->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 2135 resp_hdr->status |= IB_SMP_DIRECTION; 2136 2137 if (opa && recv_hdr->base_version == OPA_MGMT_BASE_VERSION) { 2138 if (recv_hdr->mgmt_class == 2139 IB_MGMT_CLASS_SUBN_LID_ROUTED || 2140 recv_hdr->mgmt_class == 2141 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 2142 *resp_len = opa_get_smp_header_size( 2143 (struct opa_smp *)recv->mad); 2144 else 2145 *resp_len = sizeof(struct ib_mad_hdr); 2146 } 2147 2148 return true; 2149 } else { 2150 return false; 2151 } 2152 } 2153 2154 static enum smi_action 2155 handle_opa_smi(struct ib_mad_port_private *port_priv, 2156 struct ib_mad_qp_info *qp_info, 2157 struct ib_wc *wc, 2158 int port_num, 2159 struct ib_mad_private *recv, 2160 struct ib_mad_private *response) 2161 { 2162 enum smi_forward_action retsmi; 2163 struct opa_smp *smp = (struct opa_smp *)recv->mad; 2164 2165 if (opa_smi_handle_dr_smp_recv(smp, 2166 rdma_cap_ib_switch(port_priv->device), 2167 port_num, 2168 port_priv->device->phys_port_cnt) == 2169 IB_SMI_DISCARD) 2170 return IB_SMI_DISCARD; 2171 2172 retsmi = opa_smi_check_forward_dr_smp(smp); 2173 if (retsmi == IB_SMI_LOCAL) 2174 return IB_SMI_HANDLE; 2175 2176 if (retsmi == IB_SMI_SEND) { /* don't forward */ 2177 if (opa_smi_handle_dr_smp_send(smp, 2178 rdma_cap_ib_switch(port_priv->device), 2179 port_num) == IB_SMI_DISCARD) 2180 return IB_SMI_DISCARD; 2181 2182 if (opa_smi_check_local_smp(smp, port_priv->device) == 2183 IB_SMI_DISCARD) 2184 return IB_SMI_DISCARD; 2185 2186 } else if (rdma_cap_ib_switch(port_priv->device)) { 2187 /* forward case for switches */ 2188 memcpy(response, recv, mad_priv_size(response)); 2189 response->header.recv_wc.wc = &response->header.wc; 2190 response->header.recv_wc.recv_buf.opa_mad = 2191 (struct opa_mad *)response->mad; 2192 response->header.recv_wc.recv_buf.grh = &response->grh; 2193 2194 agent_send_response((const struct ib_mad_hdr *)response->mad, 2195 &response->grh, wc, 2196 port_priv->device, 2197 opa_smi_get_fwd_port(smp), 2198 qp_info->qp->qp_num, 2199 recv->header.wc.byte_len, 2200 true); 2201 2202 return IB_SMI_DISCARD; 2203 } 2204 2205 return IB_SMI_HANDLE; 2206 } 2207 2208 static enum smi_action 2209 handle_smi(struct ib_mad_port_private *port_priv, 2210 struct ib_mad_qp_info *qp_info, 2211 struct ib_wc *wc, 2212 int port_num, 2213 struct ib_mad_private *recv, 2214 struct ib_mad_private *response, 2215 bool opa) 2216 { 2217 struct ib_mad_hdr *mad_hdr = (struct ib_mad_hdr *)recv->mad; 2218 2219 if (opa && mad_hdr->base_version == OPA_MGMT_BASE_VERSION && 2220 mad_hdr->class_version == OPA_SM_CLASS_VERSION) 2221 return handle_opa_smi(port_priv, qp_info, wc, port_num, recv, 2222 response); 2223 2224 return handle_ib_smi(port_priv, qp_info, wc, port_num, recv, response); 2225 } 2226 2227 static void ib_mad_recv_done(struct ib_cq *cq, struct ib_wc *wc) 2228 { 2229 struct ib_mad_port_private *port_priv = cq->cq_context; 2230 struct ib_mad_list_head *mad_list = 2231 container_of(wc->wr_cqe, struct ib_mad_list_head, cqe); 2232 struct ib_mad_qp_info *qp_info; 2233 struct ib_mad_private_header *mad_priv_hdr; 2234 struct ib_mad_private *recv, *response = NULL; 2235 struct ib_mad_agent_private *mad_agent; 2236 int port_num; 2237 int ret = IB_MAD_RESULT_SUCCESS; 2238 size_t mad_size; 2239 u16 resp_mad_pkey_index = 0; 2240 bool opa; 2241 2242 if (list_empty_careful(&port_priv->port_list)) 2243 return; 2244 2245 if (wc->status != IB_WC_SUCCESS) { 2246 /* 2247 * Receive errors indicate that the QP has entered the error 2248 * state - error handling/shutdown code will cleanup 2249 */ 2250 return; 2251 } 2252 2253 qp_info = mad_list->mad_queue->qp_info; 2254 dequeue_mad(mad_list); 2255 2256 opa = rdma_cap_opa_mad(qp_info->port_priv->device, 2257 qp_info->port_priv->port_num); 2258 2259 mad_priv_hdr = container_of(mad_list, struct ib_mad_private_header, 2260 mad_list); 2261 recv = container_of(mad_priv_hdr, struct ib_mad_private, header); 2262 ib_dma_unmap_single(port_priv->device, 2263 recv->header.mapping, 2264 mad_priv_dma_size(recv), 2265 DMA_FROM_DEVICE); 2266 2267 /* Setup MAD receive work completion from "normal" work completion */ 2268 recv->header.wc = *wc; 2269 recv->header.recv_wc.wc = &recv->header.wc; 2270 2271 if (opa && ((struct ib_mad_hdr *)(recv->mad))->base_version == OPA_MGMT_BASE_VERSION) { 2272 recv->header.recv_wc.mad_len = wc->byte_len - sizeof(struct ib_grh); 2273 recv->header.recv_wc.mad_seg_size = sizeof(struct opa_mad); 2274 } else { 2275 recv->header.recv_wc.mad_len = sizeof(struct ib_mad); 2276 recv->header.recv_wc.mad_seg_size = sizeof(struct ib_mad); 2277 } 2278 2279 recv->header.recv_wc.recv_buf.mad = (struct ib_mad *)recv->mad; 2280 recv->header.recv_wc.recv_buf.grh = &recv->grh; 2281 2282 if (atomic_read(&qp_info->snoop_count)) 2283 snoop_recv(qp_info, &recv->header.recv_wc, IB_MAD_SNOOP_RECVS); 2284 2285 /* Validate MAD */ 2286 if (!validate_mad((const struct ib_mad_hdr *)recv->mad, qp_info, opa)) 2287 goto out; 2288 2289 mad_size = recv->mad_size; 2290 response = alloc_mad_private(mad_size, GFP_KERNEL); 2291 if (!response) 2292 goto out; 2293 2294 if (rdma_cap_ib_switch(port_priv->device)) 2295 port_num = wc->port_num; 2296 else 2297 port_num = port_priv->port_num; 2298 2299 if (((struct ib_mad_hdr *)recv->mad)->mgmt_class == 2300 IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { 2301 if (handle_smi(port_priv, qp_info, wc, port_num, recv, 2302 response, opa) 2303 == IB_SMI_DISCARD) 2304 goto out; 2305 } 2306 2307 /* Give driver "right of first refusal" on incoming MAD */ 2308 if (port_priv->device->ops.process_mad) { 2309 ret = port_priv->device->ops.process_mad( 2310 port_priv->device, 0, port_priv->port_num, wc, 2311 &recv->grh, (const struct ib_mad_hdr *)recv->mad, 2312 recv->mad_size, (struct ib_mad_hdr *)response->mad, 2313 &mad_size, &resp_mad_pkey_index); 2314 2315 if (opa) 2316 wc->pkey_index = resp_mad_pkey_index; 2317 2318 if (ret & IB_MAD_RESULT_SUCCESS) { 2319 if (ret & IB_MAD_RESULT_CONSUMED) 2320 goto out; 2321 if (ret & IB_MAD_RESULT_REPLY) { 2322 agent_send_response((const struct ib_mad_hdr *)response->mad, 2323 &recv->grh, wc, 2324 port_priv->device, 2325 port_num, 2326 qp_info->qp->qp_num, 2327 mad_size, opa); 2328 goto out; 2329 } 2330 } 2331 } 2332 2333 mad_agent = find_mad_agent(port_priv, (const struct ib_mad_hdr *)recv->mad); 2334 if (mad_agent) { 2335 ib_mad_complete_recv(mad_agent, &recv->header.recv_wc); 2336 /* 2337 * recv is freed up in error cases in ib_mad_complete_recv 2338 * or via recv_handler in ib_mad_complete_recv() 2339 */ 2340 recv = NULL; 2341 } else if ((ret & IB_MAD_RESULT_SUCCESS) && 2342 generate_unmatched_resp(recv, response, &mad_size, opa)) { 2343 agent_send_response((const struct ib_mad_hdr *)response->mad, &recv->grh, wc, 2344 port_priv->device, port_num, 2345 qp_info->qp->qp_num, mad_size, opa); 2346 } 2347 2348 out: 2349 /* Post another receive request for this QP */ 2350 if (response) { 2351 ib_mad_post_receive_mads(qp_info, response); 2352 kfree(recv); 2353 } else 2354 ib_mad_post_receive_mads(qp_info, recv); 2355 } 2356 2357 static void adjust_timeout(struct ib_mad_agent_private *mad_agent_priv) 2358 { 2359 struct ib_mad_send_wr_private *mad_send_wr; 2360 unsigned long delay; 2361 2362 if (list_empty(&mad_agent_priv->wait_list)) { 2363 cancel_delayed_work(&mad_agent_priv->timed_work); 2364 } else { 2365 mad_send_wr = list_entry(mad_agent_priv->wait_list.next, 2366 struct ib_mad_send_wr_private, 2367 agent_list); 2368 2369 if (time_after(mad_agent_priv->timeout, 2370 mad_send_wr->timeout)) { 2371 mad_agent_priv->timeout = mad_send_wr->timeout; 2372 delay = mad_send_wr->timeout - jiffies; 2373 if ((long)delay <= 0) 2374 delay = 1; 2375 mod_delayed_work(mad_agent_priv->qp_info->port_priv->wq, 2376 &mad_agent_priv->timed_work, delay); 2377 } 2378 } 2379 } 2380 2381 static void wait_for_response(struct ib_mad_send_wr_private *mad_send_wr) 2382 { 2383 struct ib_mad_agent_private *mad_agent_priv; 2384 struct ib_mad_send_wr_private *temp_mad_send_wr; 2385 struct list_head *list_item; 2386 unsigned long delay; 2387 2388 mad_agent_priv = mad_send_wr->mad_agent_priv; 2389 list_del(&mad_send_wr->agent_list); 2390 2391 delay = mad_send_wr->timeout; 2392 mad_send_wr->timeout += jiffies; 2393 2394 if (delay) { 2395 list_for_each_prev(list_item, &mad_agent_priv->wait_list) { 2396 temp_mad_send_wr = list_entry(list_item, 2397 struct ib_mad_send_wr_private, 2398 agent_list); 2399 if (time_after(mad_send_wr->timeout, 2400 temp_mad_send_wr->timeout)) 2401 break; 2402 } 2403 } 2404 else 2405 list_item = &mad_agent_priv->wait_list; 2406 list_add(&mad_send_wr->agent_list, list_item); 2407 2408 /* Reschedule a work item if we have a shorter timeout */ 2409 if (mad_agent_priv->wait_list.next == &mad_send_wr->agent_list) 2410 mod_delayed_work(mad_agent_priv->qp_info->port_priv->wq, 2411 &mad_agent_priv->timed_work, delay); 2412 } 2413 2414 void ib_reset_mad_timeout(struct ib_mad_send_wr_private *mad_send_wr, 2415 unsigned long timeout_ms) 2416 { 2417 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms); 2418 wait_for_response(mad_send_wr); 2419 } 2420 2421 /* 2422 * Process a send work completion 2423 */ 2424 void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr, 2425 struct ib_mad_send_wc *mad_send_wc) 2426 { 2427 struct ib_mad_agent_private *mad_agent_priv; 2428 unsigned long flags; 2429 int ret; 2430 2431 mad_agent_priv = mad_send_wr->mad_agent_priv; 2432 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2433 if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) { 2434 ret = ib_process_rmpp_send_wc(mad_send_wr, mad_send_wc); 2435 if (ret == IB_RMPP_RESULT_CONSUMED) 2436 goto done; 2437 } else 2438 ret = IB_RMPP_RESULT_UNHANDLED; 2439 2440 if (mad_send_wc->status != IB_WC_SUCCESS && 2441 mad_send_wr->status == IB_WC_SUCCESS) { 2442 mad_send_wr->status = mad_send_wc->status; 2443 mad_send_wr->refcount -= (mad_send_wr->timeout > 0); 2444 } 2445 2446 if (--mad_send_wr->refcount > 0) { 2447 if (mad_send_wr->refcount == 1 && mad_send_wr->timeout && 2448 mad_send_wr->status == IB_WC_SUCCESS) { 2449 wait_for_response(mad_send_wr); 2450 } 2451 goto done; 2452 } 2453 2454 /* Remove send from MAD agent and notify client of completion */ 2455 list_del(&mad_send_wr->agent_list); 2456 adjust_timeout(mad_agent_priv); 2457 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2458 2459 if (mad_send_wr->status != IB_WC_SUCCESS ) 2460 mad_send_wc->status = mad_send_wr->status; 2461 if (ret == IB_RMPP_RESULT_INTERNAL) 2462 ib_rmpp_send_handler(mad_send_wc); 2463 else 2464 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2465 mad_send_wc); 2466 2467 /* Release reference on agent taken when sending */ 2468 deref_mad_agent(mad_agent_priv); 2469 return; 2470 done: 2471 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2472 } 2473 2474 static void ib_mad_send_done(struct ib_cq *cq, struct ib_wc *wc) 2475 { 2476 struct ib_mad_port_private *port_priv = cq->cq_context; 2477 struct ib_mad_list_head *mad_list = 2478 container_of(wc->wr_cqe, struct ib_mad_list_head, cqe); 2479 struct ib_mad_send_wr_private *mad_send_wr, *queued_send_wr; 2480 struct ib_mad_qp_info *qp_info; 2481 struct ib_mad_queue *send_queue; 2482 struct ib_mad_send_wc mad_send_wc; 2483 unsigned long flags; 2484 int ret; 2485 2486 if (list_empty_careful(&port_priv->port_list)) 2487 return; 2488 2489 if (wc->status != IB_WC_SUCCESS) { 2490 if (!ib_mad_send_error(port_priv, wc)) 2491 return; 2492 } 2493 2494 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private, 2495 mad_list); 2496 send_queue = mad_list->mad_queue; 2497 qp_info = send_queue->qp_info; 2498 2499 retry: 2500 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device, 2501 mad_send_wr->header_mapping, 2502 mad_send_wr->sg_list[0].length, DMA_TO_DEVICE); 2503 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device, 2504 mad_send_wr->payload_mapping, 2505 mad_send_wr->sg_list[1].length, DMA_TO_DEVICE); 2506 queued_send_wr = NULL; 2507 spin_lock_irqsave(&send_queue->lock, flags); 2508 list_del(&mad_list->list); 2509 2510 /* Move queued send to the send queue */ 2511 if (send_queue->count-- > send_queue->max_active) { 2512 mad_list = container_of(qp_info->overflow_list.next, 2513 struct ib_mad_list_head, list); 2514 queued_send_wr = container_of(mad_list, 2515 struct ib_mad_send_wr_private, 2516 mad_list); 2517 list_move_tail(&mad_list->list, &send_queue->list); 2518 } 2519 spin_unlock_irqrestore(&send_queue->lock, flags); 2520 2521 mad_send_wc.send_buf = &mad_send_wr->send_buf; 2522 mad_send_wc.status = wc->status; 2523 mad_send_wc.vendor_err = wc->vendor_err; 2524 if (atomic_read(&qp_info->snoop_count)) 2525 snoop_send(qp_info, &mad_send_wr->send_buf, &mad_send_wc, 2526 IB_MAD_SNOOP_SEND_COMPLETIONS); 2527 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc); 2528 2529 if (queued_send_wr) { 2530 ret = ib_post_send(qp_info->qp, &queued_send_wr->send_wr.wr, 2531 NULL); 2532 if (ret) { 2533 dev_err(&port_priv->device->dev, 2534 "ib_post_send failed: %d\n", ret); 2535 mad_send_wr = queued_send_wr; 2536 wc->status = IB_WC_LOC_QP_OP_ERR; 2537 goto retry; 2538 } 2539 } 2540 } 2541 2542 static void mark_sends_for_retry(struct ib_mad_qp_info *qp_info) 2543 { 2544 struct ib_mad_send_wr_private *mad_send_wr; 2545 struct ib_mad_list_head *mad_list; 2546 unsigned long flags; 2547 2548 spin_lock_irqsave(&qp_info->send_queue.lock, flags); 2549 list_for_each_entry(mad_list, &qp_info->send_queue.list, list) { 2550 mad_send_wr = container_of(mad_list, 2551 struct ib_mad_send_wr_private, 2552 mad_list); 2553 mad_send_wr->retry = 1; 2554 } 2555 spin_unlock_irqrestore(&qp_info->send_queue.lock, flags); 2556 } 2557 2558 static bool ib_mad_send_error(struct ib_mad_port_private *port_priv, 2559 struct ib_wc *wc) 2560 { 2561 struct ib_mad_list_head *mad_list = 2562 container_of(wc->wr_cqe, struct ib_mad_list_head, cqe); 2563 struct ib_mad_qp_info *qp_info = mad_list->mad_queue->qp_info; 2564 struct ib_mad_send_wr_private *mad_send_wr; 2565 int ret; 2566 2567 /* 2568 * Send errors will transition the QP to SQE - move 2569 * QP to RTS and repost flushed work requests 2570 */ 2571 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private, 2572 mad_list); 2573 if (wc->status == IB_WC_WR_FLUSH_ERR) { 2574 if (mad_send_wr->retry) { 2575 /* Repost send */ 2576 mad_send_wr->retry = 0; 2577 ret = ib_post_send(qp_info->qp, &mad_send_wr->send_wr.wr, 2578 NULL); 2579 if (!ret) 2580 return false; 2581 } 2582 } else { 2583 struct ib_qp_attr *attr; 2584 2585 /* Transition QP to RTS and fail offending send */ 2586 attr = kmalloc(sizeof *attr, GFP_KERNEL); 2587 if (attr) { 2588 attr->qp_state = IB_QPS_RTS; 2589 attr->cur_qp_state = IB_QPS_SQE; 2590 ret = ib_modify_qp(qp_info->qp, attr, 2591 IB_QP_STATE | IB_QP_CUR_STATE); 2592 kfree(attr); 2593 if (ret) 2594 dev_err(&port_priv->device->dev, 2595 "%s - ib_modify_qp to RTS: %d\n", 2596 __func__, ret); 2597 else 2598 mark_sends_for_retry(qp_info); 2599 } 2600 } 2601 2602 return true; 2603 } 2604 2605 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv) 2606 { 2607 unsigned long flags; 2608 struct ib_mad_send_wr_private *mad_send_wr, *temp_mad_send_wr; 2609 struct ib_mad_send_wc mad_send_wc; 2610 struct list_head cancel_list; 2611 2612 INIT_LIST_HEAD(&cancel_list); 2613 2614 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2615 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr, 2616 &mad_agent_priv->send_list, agent_list) { 2617 if (mad_send_wr->status == IB_WC_SUCCESS) { 2618 mad_send_wr->status = IB_WC_WR_FLUSH_ERR; 2619 mad_send_wr->refcount -= (mad_send_wr->timeout > 0); 2620 } 2621 } 2622 2623 /* Empty wait list to prevent receives from finding a request */ 2624 list_splice_init(&mad_agent_priv->wait_list, &cancel_list); 2625 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2626 2627 /* Report all cancelled requests */ 2628 mad_send_wc.status = IB_WC_WR_FLUSH_ERR; 2629 mad_send_wc.vendor_err = 0; 2630 2631 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr, 2632 &cancel_list, agent_list) { 2633 mad_send_wc.send_buf = &mad_send_wr->send_buf; 2634 list_del(&mad_send_wr->agent_list); 2635 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2636 &mad_send_wc); 2637 atomic_dec(&mad_agent_priv->refcount); 2638 } 2639 } 2640 2641 static struct ib_mad_send_wr_private* 2642 find_send_wr(struct ib_mad_agent_private *mad_agent_priv, 2643 struct ib_mad_send_buf *send_buf) 2644 { 2645 struct ib_mad_send_wr_private *mad_send_wr; 2646 2647 list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list, 2648 agent_list) { 2649 if (&mad_send_wr->send_buf == send_buf) 2650 return mad_send_wr; 2651 } 2652 2653 list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list, 2654 agent_list) { 2655 if (is_rmpp_data_mad(mad_agent_priv, 2656 mad_send_wr->send_buf.mad) && 2657 &mad_send_wr->send_buf == send_buf) 2658 return mad_send_wr; 2659 } 2660 return NULL; 2661 } 2662 2663 int ib_modify_mad(struct ib_mad_agent *mad_agent, 2664 struct ib_mad_send_buf *send_buf, u32 timeout_ms) 2665 { 2666 struct ib_mad_agent_private *mad_agent_priv; 2667 struct ib_mad_send_wr_private *mad_send_wr; 2668 unsigned long flags; 2669 int active; 2670 2671 mad_agent_priv = container_of(mad_agent, struct ib_mad_agent_private, 2672 agent); 2673 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2674 mad_send_wr = find_send_wr(mad_agent_priv, send_buf); 2675 if (!mad_send_wr || mad_send_wr->status != IB_WC_SUCCESS) { 2676 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2677 return -EINVAL; 2678 } 2679 2680 active = (!mad_send_wr->timeout || mad_send_wr->refcount > 1); 2681 if (!timeout_ms) { 2682 mad_send_wr->status = IB_WC_WR_FLUSH_ERR; 2683 mad_send_wr->refcount -= (mad_send_wr->timeout > 0); 2684 } 2685 2686 mad_send_wr->send_buf.timeout_ms = timeout_ms; 2687 if (active) 2688 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms); 2689 else 2690 ib_reset_mad_timeout(mad_send_wr, timeout_ms); 2691 2692 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2693 return 0; 2694 } 2695 EXPORT_SYMBOL(ib_modify_mad); 2696 2697 void ib_cancel_mad(struct ib_mad_agent *mad_agent, 2698 struct ib_mad_send_buf *send_buf) 2699 { 2700 ib_modify_mad(mad_agent, send_buf, 0); 2701 } 2702 EXPORT_SYMBOL(ib_cancel_mad); 2703 2704 static void local_completions(struct work_struct *work) 2705 { 2706 struct ib_mad_agent_private *mad_agent_priv; 2707 struct ib_mad_local_private *local; 2708 struct ib_mad_agent_private *recv_mad_agent; 2709 unsigned long flags; 2710 int free_mad; 2711 struct ib_wc wc; 2712 struct ib_mad_send_wc mad_send_wc; 2713 bool opa; 2714 2715 mad_agent_priv = 2716 container_of(work, struct ib_mad_agent_private, local_work); 2717 2718 opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device, 2719 mad_agent_priv->qp_info->port_priv->port_num); 2720 2721 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2722 while (!list_empty(&mad_agent_priv->local_list)) { 2723 local = list_entry(mad_agent_priv->local_list.next, 2724 struct ib_mad_local_private, 2725 completion_list); 2726 list_del(&local->completion_list); 2727 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2728 free_mad = 0; 2729 if (local->mad_priv) { 2730 u8 base_version; 2731 recv_mad_agent = local->recv_mad_agent; 2732 if (!recv_mad_agent) { 2733 dev_err(&mad_agent_priv->agent.device->dev, 2734 "No receive MAD agent for local completion\n"); 2735 free_mad = 1; 2736 goto local_send_completion; 2737 } 2738 2739 /* 2740 * Defined behavior is to complete response 2741 * before request 2742 */ 2743 build_smp_wc(recv_mad_agent->agent.qp, 2744 local->mad_send_wr->send_wr.wr.wr_cqe, 2745 be16_to_cpu(IB_LID_PERMISSIVE), 2746 local->mad_send_wr->send_wr.pkey_index, 2747 recv_mad_agent->agent.port_num, &wc); 2748 2749 local->mad_priv->header.recv_wc.wc = &wc; 2750 2751 base_version = ((struct ib_mad_hdr *)(local->mad_priv->mad))->base_version; 2752 if (opa && base_version == OPA_MGMT_BASE_VERSION) { 2753 local->mad_priv->header.recv_wc.mad_len = local->return_wc_byte_len; 2754 local->mad_priv->header.recv_wc.mad_seg_size = sizeof(struct opa_mad); 2755 } else { 2756 local->mad_priv->header.recv_wc.mad_len = sizeof(struct ib_mad); 2757 local->mad_priv->header.recv_wc.mad_seg_size = sizeof(struct ib_mad); 2758 } 2759 2760 INIT_LIST_HEAD(&local->mad_priv->header.recv_wc.rmpp_list); 2761 list_add(&local->mad_priv->header.recv_wc.recv_buf.list, 2762 &local->mad_priv->header.recv_wc.rmpp_list); 2763 local->mad_priv->header.recv_wc.recv_buf.grh = NULL; 2764 local->mad_priv->header.recv_wc.recv_buf.mad = 2765 (struct ib_mad *)local->mad_priv->mad; 2766 if (atomic_read(&recv_mad_agent->qp_info->snoop_count)) 2767 snoop_recv(recv_mad_agent->qp_info, 2768 &local->mad_priv->header.recv_wc, 2769 IB_MAD_SNOOP_RECVS); 2770 recv_mad_agent->agent.recv_handler( 2771 &recv_mad_agent->agent, 2772 &local->mad_send_wr->send_buf, 2773 &local->mad_priv->header.recv_wc); 2774 spin_lock_irqsave(&recv_mad_agent->lock, flags); 2775 atomic_dec(&recv_mad_agent->refcount); 2776 spin_unlock_irqrestore(&recv_mad_agent->lock, flags); 2777 } 2778 2779 local_send_completion: 2780 /* Complete send */ 2781 mad_send_wc.status = IB_WC_SUCCESS; 2782 mad_send_wc.vendor_err = 0; 2783 mad_send_wc.send_buf = &local->mad_send_wr->send_buf; 2784 if (atomic_read(&mad_agent_priv->qp_info->snoop_count)) 2785 snoop_send(mad_agent_priv->qp_info, 2786 &local->mad_send_wr->send_buf, 2787 &mad_send_wc, IB_MAD_SNOOP_SEND_COMPLETIONS); 2788 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2789 &mad_send_wc); 2790 2791 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2792 atomic_dec(&mad_agent_priv->refcount); 2793 if (free_mad) 2794 kfree(local->mad_priv); 2795 kfree(local); 2796 } 2797 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2798 } 2799 2800 static int retry_send(struct ib_mad_send_wr_private *mad_send_wr) 2801 { 2802 int ret; 2803 2804 if (!mad_send_wr->retries_left) 2805 return -ETIMEDOUT; 2806 2807 mad_send_wr->retries_left--; 2808 mad_send_wr->send_buf.retries++; 2809 2810 mad_send_wr->timeout = msecs_to_jiffies(mad_send_wr->send_buf.timeout_ms); 2811 2812 if (ib_mad_kernel_rmpp_agent(&mad_send_wr->mad_agent_priv->agent)) { 2813 ret = ib_retry_rmpp(mad_send_wr); 2814 switch (ret) { 2815 case IB_RMPP_RESULT_UNHANDLED: 2816 ret = ib_send_mad(mad_send_wr); 2817 break; 2818 case IB_RMPP_RESULT_CONSUMED: 2819 ret = 0; 2820 break; 2821 default: 2822 ret = -ECOMM; 2823 break; 2824 } 2825 } else 2826 ret = ib_send_mad(mad_send_wr); 2827 2828 if (!ret) { 2829 mad_send_wr->refcount++; 2830 list_add_tail(&mad_send_wr->agent_list, 2831 &mad_send_wr->mad_agent_priv->send_list); 2832 } 2833 return ret; 2834 } 2835 2836 static void timeout_sends(struct work_struct *work) 2837 { 2838 struct ib_mad_agent_private *mad_agent_priv; 2839 struct ib_mad_send_wr_private *mad_send_wr; 2840 struct ib_mad_send_wc mad_send_wc; 2841 unsigned long flags, delay; 2842 2843 mad_agent_priv = container_of(work, struct ib_mad_agent_private, 2844 timed_work.work); 2845 mad_send_wc.vendor_err = 0; 2846 2847 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2848 while (!list_empty(&mad_agent_priv->wait_list)) { 2849 mad_send_wr = list_entry(mad_agent_priv->wait_list.next, 2850 struct ib_mad_send_wr_private, 2851 agent_list); 2852 2853 if (time_after(mad_send_wr->timeout, jiffies)) { 2854 delay = mad_send_wr->timeout - jiffies; 2855 if ((long)delay <= 0) 2856 delay = 1; 2857 queue_delayed_work(mad_agent_priv->qp_info-> 2858 port_priv->wq, 2859 &mad_agent_priv->timed_work, delay); 2860 break; 2861 } 2862 2863 list_del(&mad_send_wr->agent_list); 2864 if (mad_send_wr->status == IB_WC_SUCCESS && 2865 !retry_send(mad_send_wr)) 2866 continue; 2867 2868 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2869 2870 if (mad_send_wr->status == IB_WC_SUCCESS) 2871 mad_send_wc.status = IB_WC_RESP_TIMEOUT_ERR; 2872 else 2873 mad_send_wc.status = mad_send_wr->status; 2874 mad_send_wc.send_buf = &mad_send_wr->send_buf; 2875 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2876 &mad_send_wc); 2877 2878 atomic_dec(&mad_agent_priv->refcount); 2879 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2880 } 2881 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 2882 } 2883 2884 /* 2885 * Allocate receive MADs and post receive WRs for them 2886 */ 2887 static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info, 2888 struct ib_mad_private *mad) 2889 { 2890 unsigned long flags; 2891 int post, ret; 2892 struct ib_mad_private *mad_priv; 2893 struct ib_sge sg_list; 2894 struct ib_recv_wr recv_wr; 2895 struct ib_mad_queue *recv_queue = &qp_info->recv_queue; 2896 2897 /* Initialize common scatter list fields */ 2898 sg_list.lkey = qp_info->port_priv->pd->local_dma_lkey; 2899 2900 /* Initialize common receive WR fields */ 2901 recv_wr.next = NULL; 2902 recv_wr.sg_list = &sg_list; 2903 recv_wr.num_sge = 1; 2904 2905 do { 2906 /* Allocate and map receive buffer */ 2907 if (mad) { 2908 mad_priv = mad; 2909 mad = NULL; 2910 } else { 2911 mad_priv = alloc_mad_private(port_mad_size(qp_info->port_priv), 2912 GFP_ATOMIC); 2913 if (!mad_priv) { 2914 ret = -ENOMEM; 2915 break; 2916 } 2917 } 2918 sg_list.length = mad_priv_dma_size(mad_priv); 2919 sg_list.addr = ib_dma_map_single(qp_info->port_priv->device, 2920 &mad_priv->grh, 2921 mad_priv_dma_size(mad_priv), 2922 DMA_FROM_DEVICE); 2923 if (unlikely(ib_dma_mapping_error(qp_info->port_priv->device, 2924 sg_list.addr))) { 2925 ret = -ENOMEM; 2926 break; 2927 } 2928 mad_priv->header.mapping = sg_list.addr; 2929 mad_priv->header.mad_list.mad_queue = recv_queue; 2930 mad_priv->header.mad_list.cqe.done = ib_mad_recv_done; 2931 recv_wr.wr_cqe = &mad_priv->header.mad_list.cqe; 2932 2933 /* Post receive WR */ 2934 spin_lock_irqsave(&recv_queue->lock, flags); 2935 post = (++recv_queue->count < recv_queue->max_active); 2936 list_add_tail(&mad_priv->header.mad_list.list, &recv_queue->list); 2937 spin_unlock_irqrestore(&recv_queue->lock, flags); 2938 ret = ib_post_recv(qp_info->qp, &recv_wr, NULL); 2939 if (ret) { 2940 spin_lock_irqsave(&recv_queue->lock, flags); 2941 list_del(&mad_priv->header.mad_list.list); 2942 recv_queue->count--; 2943 spin_unlock_irqrestore(&recv_queue->lock, flags); 2944 ib_dma_unmap_single(qp_info->port_priv->device, 2945 mad_priv->header.mapping, 2946 mad_priv_dma_size(mad_priv), 2947 DMA_FROM_DEVICE); 2948 kfree(mad_priv); 2949 dev_err(&qp_info->port_priv->device->dev, 2950 "ib_post_recv failed: %d\n", ret); 2951 break; 2952 } 2953 } while (post); 2954 2955 return ret; 2956 } 2957 2958 /* 2959 * Return all the posted receive MADs 2960 */ 2961 static void cleanup_recv_queue(struct ib_mad_qp_info *qp_info) 2962 { 2963 struct ib_mad_private_header *mad_priv_hdr; 2964 struct ib_mad_private *recv; 2965 struct ib_mad_list_head *mad_list; 2966 2967 if (!qp_info->qp) 2968 return; 2969 2970 while (!list_empty(&qp_info->recv_queue.list)) { 2971 2972 mad_list = list_entry(qp_info->recv_queue.list.next, 2973 struct ib_mad_list_head, list); 2974 mad_priv_hdr = container_of(mad_list, 2975 struct ib_mad_private_header, 2976 mad_list); 2977 recv = container_of(mad_priv_hdr, struct ib_mad_private, 2978 header); 2979 2980 /* Remove from posted receive MAD list */ 2981 list_del(&mad_list->list); 2982 2983 ib_dma_unmap_single(qp_info->port_priv->device, 2984 recv->header.mapping, 2985 mad_priv_dma_size(recv), 2986 DMA_FROM_DEVICE); 2987 kfree(recv); 2988 } 2989 2990 qp_info->recv_queue.count = 0; 2991 } 2992 2993 /* 2994 * Start the port 2995 */ 2996 static int ib_mad_port_start(struct ib_mad_port_private *port_priv) 2997 { 2998 int ret, i; 2999 struct ib_qp_attr *attr; 3000 struct ib_qp *qp; 3001 u16 pkey_index; 3002 3003 attr = kmalloc(sizeof *attr, GFP_KERNEL); 3004 if (!attr) 3005 return -ENOMEM; 3006 3007 ret = ib_find_pkey(port_priv->device, port_priv->port_num, 3008 IB_DEFAULT_PKEY_FULL, &pkey_index); 3009 if (ret) 3010 pkey_index = 0; 3011 3012 for (i = 0; i < IB_MAD_QPS_CORE; i++) { 3013 qp = port_priv->qp_info[i].qp; 3014 if (!qp) 3015 continue; 3016 3017 /* 3018 * PKey index for QP1 is irrelevant but 3019 * one is needed for the Reset to Init transition 3020 */ 3021 attr->qp_state = IB_QPS_INIT; 3022 attr->pkey_index = pkey_index; 3023 attr->qkey = (qp->qp_num == 0) ? 0 : IB_QP1_QKEY; 3024 ret = ib_modify_qp(qp, attr, IB_QP_STATE | 3025 IB_QP_PKEY_INDEX | IB_QP_QKEY); 3026 if (ret) { 3027 dev_err(&port_priv->device->dev, 3028 "Couldn't change QP%d state to INIT: %d\n", 3029 i, ret); 3030 goto out; 3031 } 3032 3033 attr->qp_state = IB_QPS_RTR; 3034 ret = ib_modify_qp(qp, attr, IB_QP_STATE); 3035 if (ret) { 3036 dev_err(&port_priv->device->dev, 3037 "Couldn't change QP%d state to RTR: %d\n", 3038 i, ret); 3039 goto out; 3040 } 3041 3042 attr->qp_state = IB_QPS_RTS; 3043 attr->sq_psn = IB_MAD_SEND_Q_PSN; 3044 ret = ib_modify_qp(qp, attr, IB_QP_STATE | IB_QP_SQ_PSN); 3045 if (ret) { 3046 dev_err(&port_priv->device->dev, 3047 "Couldn't change QP%d state to RTS: %d\n", 3048 i, ret); 3049 goto out; 3050 } 3051 } 3052 3053 ret = ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP); 3054 if (ret) { 3055 dev_err(&port_priv->device->dev, 3056 "Failed to request completion notification: %d\n", 3057 ret); 3058 goto out; 3059 } 3060 3061 for (i = 0; i < IB_MAD_QPS_CORE; i++) { 3062 if (!port_priv->qp_info[i].qp) 3063 continue; 3064 3065 ret = ib_mad_post_receive_mads(&port_priv->qp_info[i], NULL); 3066 if (ret) { 3067 dev_err(&port_priv->device->dev, 3068 "Couldn't post receive WRs\n"); 3069 goto out; 3070 } 3071 } 3072 out: 3073 kfree(attr); 3074 return ret; 3075 } 3076 3077 static void qp_event_handler(struct ib_event *event, void *qp_context) 3078 { 3079 struct ib_mad_qp_info *qp_info = qp_context; 3080 3081 /* It's worse than that! He's dead, Jim! */ 3082 dev_err(&qp_info->port_priv->device->dev, 3083 "Fatal error (%d) on MAD QP (%d)\n", 3084 event->event, qp_info->qp->qp_num); 3085 } 3086 3087 static void init_mad_queue(struct ib_mad_qp_info *qp_info, 3088 struct ib_mad_queue *mad_queue) 3089 { 3090 mad_queue->qp_info = qp_info; 3091 mad_queue->count = 0; 3092 spin_lock_init(&mad_queue->lock); 3093 INIT_LIST_HEAD(&mad_queue->list); 3094 } 3095 3096 static void init_mad_qp(struct ib_mad_port_private *port_priv, 3097 struct ib_mad_qp_info *qp_info) 3098 { 3099 qp_info->port_priv = port_priv; 3100 init_mad_queue(qp_info, &qp_info->send_queue); 3101 init_mad_queue(qp_info, &qp_info->recv_queue); 3102 INIT_LIST_HEAD(&qp_info->overflow_list); 3103 spin_lock_init(&qp_info->snoop_lock); 3104 qp_info->snoop_table = NULL; 3105 qp_info->snoop_table_size = 0; 3106 atomic_set(&qp_info->snoop_count, 0); 3107 } 3108 3109 static int create_mad_qp(struct ib_mad_qp_info *qp_info, 3110 enum ib_qp_type qp_type) 3111 { 3112 struct ib_qp_init_attr qp_init_attr; 3113 int ret; 3114 3115 memset(&qp_init_attr, 0, sizeof qp_init_attr); 3116 qp_init_attr.send_cq = qp_info->port_priv->cq; 3117 qp_init_attr.recv_cq = qp_info->port_priv->cq; 3118 qp_init_attr.sq_sig_type = IB_SIGNAL_ALL_WR; 3119 qp_init_attr.cap.max_send_wr = mad_sendq_size; 3120 qp_init_attr.cap.max_recv_wr = mad_recvq_size; 3121 qp_init_attr.cap.max_send_sge = IB_MAD_SEND_REQ_MAX_SG; 3122 qp_init_attr.cap.max_recv_sge = IB_MAD_RECV_REQ_MAX_SG; 3123 qp_init_attr.qp_type = qp_type; 3124 qp_init_attr.port_num = qp_info->port_priv->port_num; 3125 qp_init_attr.qp_context = qp_info; 3126 qp_init_attr.event_handler = qp_event_handler; 3127 qp_info->qp = ib_create_qp(qp_info->port_priv->pd, &qp_init_attr); 3128 if (IS_ERR(qp_info->qp)) { 3129 dev_err(&qp_info->port_priv->device->dev, 3130 "Couldn't create ib_mad QP%d\n", 3131 get_spl_qp_index(qp_type)); 3132 ret = PTR_ERR(qp_info->qp); 3133 goto error; 3134 } 3135 /* Use minimum queue sizes unless the CQ is resized */ 3136 qp_info->send_queue.max_active = mad_sendq_size; 3137 qp_info->recv_queue.max_active = mad_recvq_size; 3138 return 0; 3139 3140 error: 3141 return ret; 3142 } 3143 3144 static void destroy_mad_qp(struct ib_mad_qp_info *qp_info) 3145 { 3146 if (!qp_info->qp) 3147 return; 3148 3149 ib_destroy_qp(qp_info->qp); 3150 kfree(qp_info->snoop_table); 3151 } 3152 3153 /* 3154 * Open the port 3155 * Create the QP, PD, MR, and CQ if needed 3156 */ 3157 static int ib_mad_port_open(struct ib_device *device, 3158 int port_num) 3159 { 3160 int ret, cq_size; 3161 struct ib_mad_port_private *port_priv; 3162 unsigned long flags; 3163 char name[sizeof "ib_mad123"]; 3164 int has_smi; 3165 3166 if (WARN_ON(rdma_max_mad_size(device, port_num) < IB_MGMT_MAD_SIZE)) 3167 return -EFAULT; 3168 3169 if (WARN_ON(rdma_cap_opa_mad(device, port_num) && 3170 rdma_max_mad_size(device, port_num) < OPA_MGMT_MAD_SIZE)) 3171 return -EFAULT; 3172 3173 /* Create new device info */ 3174 port_priv = kzalloc(sizeof *port_priv, GFP_KERNEL); 3175 if (!port_priv) 3176 return -ENOMEM; 3177 3178 port_priv->device = device; 3179 port_priv->port_num = port_num; 3180 spin_lock_init(&port_priv->reg_lock); 3181 init_mad_qp(port_priv, &port_priv->qp_info[0]); 3182 init_mad_qp(port_priv, &port_priv->qp_info[1]); 3183 3184 cq_size = mad_sendq_size + mad_recvq_size; 3185 has_smi = rdma_cap_ib_smi(device, port_num); 3186 if (has_smi) 3187 cq_size *= 2; 3188 3189 port_priv->cq = ib_alloc_cq(port_priv->device, port_priv, cq_size, 0, 3190 IB_POLL_UNBOUND_WORKQUEUE); 3191 if (IS_ERR(port_priv->cq)) { 3192 dev_err(&device->dev, "Couldn't create ib_mad CQ\n"); 3193 ret = PTR_ERR(port_priv->cq); 3194 goto error3; 3195 } 3196 3197 port_priv->pd = ib_alloc_pd(device, 0); 3198 if (IS_ERR(port_priv->pd)) { 3199 dev_err(&device->dev, "Couldn't create ib_mad PD\n"); 3200 ret = PTR_ERR(port_priv->pd); 3201 goto error4; 3202 } 3203 3204 if (has_smi) { 3205 ret = create_mad_qp(&port_priv->qp_info[0], IB_QPT_SMI); 3206 if (ret) 3207 goto error6; 3208 } 3209 ret = create_mad_qp(&port_priv->qp_info[1], IB_QPT_GSI); 3210 if (ret) 3211 goto error7; 3212 3213 snprintf(name, sizeof name, "ib_mad%d", port_num); 3214 port_priv->wq = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM); 3215 if (!port_priv->wq) { 3216 ret = -ENOMEM; 3217 goto error8; 3218 } 3219 3220 spin_lock_irqsave(&ib_mad_port_list_lock, flags); 3221 list_add_tail(&port_priv->port_list, &ib_mad_port_list); 3222 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags); 3223 3224 ret = ib_mad_port_start(port_priv); 3225 if (ret) { 3226 dev_err(&device->dev, "Couldn't start port\n"); 3227 goto error9; 3228 } 3229 3230 return 0; 3231 3232 error9: 3233 spin_lock_irqsave(&ib_mad_port_list_lock, flags); 3234 list_del_init(&port_priv->port_list); 3235 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags); 3236 3237 destroy_workqueue(port_priv->wq); 3238 error8: 3239 destroy_mad_qp(&port_priv->qp_info[1]); 3240 error7: 3241 destroy_mad_qp(&port_priv->qp_info[0]); 3242 error6: 3243 ib_dealloc_pd(port_priv->pd); 3244 error4: 3245 ib_free_cq(port_priv->cq); 3246 cleanup_recv_queue(&port_priv->qp_info[1]); 3247 cleanup_recv_queue(&port_priv->qp_info[0]); 3248 error3: 3249 kfree(port_priv); 3250 3251 return ret; 3252 } 3253 3254 /* 3255 * Close the port 3256 * If there are no classes using the port, free the port 3257 * resources (CQ, MR, PD, QP) and remove the port's info structure 3258 */ 3259 static int ib_mad_port_close(struct ib_device *device, int port_num) 3260 { 3261 struct ib_mad_port_private *port_priv; 3262 unsigned long flags; 3263 3264 spin_lock_irqsave(&ib_mad_port_list_lock, flags); 3265 port_priv = __ib_get_mad_port(device, port_num); 3266 if (port_priv == NULL) { 3267 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags); 3268 dev_err(&device->dev, "Port %d not found\n", port_num); 3269 return -ENODEV; 3270 } 3271 list_del_init(&port_priv->port_list); 3272 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags); 3273 3274 destroy_workqueue(port_priv->wq); 3275 destroy_mad_qp(&port_priv->qp_info[1]); 3276 destroy_mad_qp(&port_priv->qp_info[0]); 3277 ib_dealloc_pd(port_priv->pd); 3278 ib_free_cq(port_priv->cq); 3279 cleanup_recv_queue(&port_priv->qp_info[1]); 3280 cleanup_recv_queue(&port_priv->qp_info[0]); 3281 /* XXX: Handle deallocation of MAD registration tables */ 3282 3283 kfree(port_priv); 3284 3285 return 0; 3286 } 3287 3288 static void ib_mad_init_device(struct ib_device *device) 3289 { 3290 int start, i; 3291 3292 start = rdma_start_port(device); 3293 3294 for (i = start; i <= rdma_end_port(device); i++) { 3295 if (!rdma_cap_ib_mad(device, i)) 3296 continue; 3297 3298 if (ib_mad_port_open(device, i)) { 3299 dev_err(&device->dev, "Couldn't open port %d\n", i); 3300 goto error; 3301 } 3302 if (ib_agent_port_open(device, i)) { 3303 dev_err(&device->dev, 3304 "Couldn't open port %d for agents\n", i); 3305 goto error_agent; 3306 } 3307 } 3308 return; 3309 3310 error_agent: 3311 if (ib_mad_port_close(device, i)) 3312 dev_err(&device->dev, "Couldn't close port %d\n", i); 3313 3314 error: 3315 while (--i >= start) { 3316 if (!rdma_cap_ib_mad(device, i)) 3317 continue; 3318 3319 if (ib_agent_port_close(device, i)) 3320 dev_err(&device->dev, 3321 "Couldn't close port %d for agents\n", i); 3322 if (ib_mad_port_close(device, i)) 3323 dev_err(&device->dev, "Couldn't close port %d\n", i); 3324 } 3325 } 3326 3327 static void ib_mad_remove_device(struct ib_device *device, void *client_data) 3328 { 3329 unsigned int i; 3330 3331 rdma_for_each_port (device, i) { 3332 if (!rdma_cap_ib_mad(device, i)) 3333 continue; 3334 3335 if (ib_agent_port_close(device, i)) 3336 dev_err(&device->dev, 3337 "Couldn't close port %d for agents\n", i); 3338 if (ib_mad_port_close(device, i)) 3339 dev_err(&device->dev, "Couldn't close port %d\n", i); 3340 } 3341 } 3342 3343 static struct ib_client mad_client = { 3344 .name = "mad", 3345 .add = ib_mad_init_device, 3346 .remove = ib_mad_remove_device 3347 }; 3348 3349 int ib_mad_init(void) 3350 { 3351 mad_recvq_size = min(mad_recvq_size, IB_MAD_QP_MAX_SIZE); 3352 mad_recvq_size = max(mad_recvq_size, IB_MAD_QP_MIN_SIZE); 3353 3354 mad_sendq_size = min(mad_sendq_size, IB_MAD_QP_MAX_SIZE); 3355 mad_sendq_size = max(mad_sendq_size, IB_MAD_QP_MIN_SIZE); 3356 3357 INIT_LIST_HEAD(&ib_mad_port_list); 3358 3359 /* Client ID 0 is used for snoop-only clients */ 3360 idr_alloc(&ib_mad_clients, NULL, 0, 0, GFP_KERNEL); 3361 3362 if (ib_register_client(&mad_client)) { 3363 pr_err("Couldn't register ib_mad client\n"); 3364 return -EINVAL; 3365 } 3366 3367 return 0; 3368 } 3369 3370 void ib_mad_cleanup(void) 3371 { 3372 ib_unregister_client(&mad_client); 3373 } 3374