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