1 /* 2 * Copyright (c) 2004 Topspin Communications. All rights reserved. 3 * Copyright (c) 2005 Voltaire, Inc. All rights reserved. 4 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. 5 * Copyright (c) 2008 Cisco. All rights reserved. 6 * 7 * This software is available to you under a choice of one of two 8 * licenses. You may choose to be licensed under the terms of the GNU 9 * General Public License (GPL) Version 2, available from the file 10 * COPYING in the main directory of this source tree, or the 11 * OpenIB.org BSD license below: 12 * 13 * Redistribution and use in source and binary forms, with or 14 * without modification, are permitted provided that the following 15 * conditions are met: 16 * 17 * - Redistributions of source code must retain the above 18 * copyright notice, this list of conditions and the following 19 * disclaimer. 20 * 21 * - Redistributions in binary form must reproduce the above 22 * copyright notice, this list of conditions and the following 23 * disclaimer in the documentation and/or other materials 24 * provided with the distribution. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 33 * SOFTWARE. 34 */ 35 36 #define pr_fmt(fmt) "user_mad: " fmt 37 38 #include <linux/module.h> 39 #include <linux/init.h> 40 #include <linux/device.h> 41 #include <linux/err.h> 42 #include <linux/fs.h> 43 #include <linux/cdev.h> 44 #include <linux/dma-mapping.h> 45 #include <linux/poll.h> 46 #include <linux/mutex.h> 47 #include <linux/kref.h> 48 #include <linux/compat.h> 49 #include <linux/sched.h> 50 #include <linux/semaphore.h> 51 #include <linux/slab.h> 52 #include <linux/nospec.h> 53 54 #include <linux/uaccess.h> 55 56 #include <rdma/ib_mad.h> 57 #include <rdma/ib_user_mad.h> 58 #include <rdma/rdma_netlink.h> 59 60 #include "core_priv.h" 61 62 MODULE_AUTHOR("Roland Dreier"); 63 MODULE_DESCRIPTION("InfiniBand userspace MAD packet access"); 64 MODULE_LICENSE("Dual BSD/GPL"); 65 66 #define MAX_UMAD_RECV_LIST_SIZE 200000 67 68 enum { 69 IB_UMAD_MAX_PORTS = RDMA_MAX_PORTS, 70 IB_UMAD_MAX_AGENTS = 32, 71 72 IB_UMAD_MAJOR = 231, 73 IB_UMAD_MINOR_BASE = 0, 74 IB_UMAD_NUM_FIXED_MINOR = 64, 75 IB_UMAD_NUM_DYNAMIC_MINOR = IB_UMAD_MAX_PORTS - IB_UMAD_NUM_FIXED_MINOR, 76 IB_ISSM_MINOR_BASE = IB_UMAD_NUM_FIXED_MINOR, 77 }; 78 79 /* 80 * Our lifetime rules for these structs are the following: 81 * device special file is opened, we take a reference on the 82 * ib_umad_port's struct ib_umad_device. We drop these 83 * references in the corresponding close(). 84 * 85 * In addition to references coming from open character devices, there 86 * is one more reference to each ib_umad_device representing the 87 * module's reference taken when allocating the ib_umad_device in 88 * ib_umad_add_one(). 89 * 90 * When destroying an ib_umad_device, we drop the module's reference. 91 */ 92 93 struct ib_umad_port { 94 struct cdev cdev; 95 struct device dev; 96 struct cdev sm_cdev; 97 struct device sm_dev; 98 struct semaphore sm_sem; 99 100 struct mutex file_mutex; 101 struct list_head file_list; 102 103 struct ib_device *ib_dev; 104 struct ib_umad_device *umad_dev; 105 int dev_num; 106 u32 port_num; 107 }; 108 109 struct ib_umad_device { 110 struct kref kref; 111 struct ib_umad_port ports[]; 112 }; 113 114 struct ib_umad_file { 115 struct mutex mutex; 116 struct ib_umad_port *port; 117 struct list_head recv_list; 118 atomic_t recv_list_size; 119 struct list_head send_list; 120 struct list_head port_list; 121 spinlock_t send_lock; 122 wait_queue_head_t recv_wait; 123 struct ib_mad_agent *agent[IB_UMAD_MAX_AGENTS]; 124 int agents_dead; 125 u8 use_pkey_index; 126 u8 already_used; 127 }; 128 129 struct ib_umad_packet { 130 struct ib_mad_send_buf *msg; 131 struct ib_mad_recv_wc *recv_wc; 132 struct list_head list; 133 int length; 134 struct ib_user_mad mad; 135 }; 136 137 struct ib_rmpp_mad_hdr { 138 struct ib_mad_hdr mad_hdr; 139 struct ib_rmpp_hdr rmpp_hdr; 140 } __packed; 141 142 #define CREATE_TRACE_POINTS 143 #include <trace/events/ib_umad.h> 144 145 static const dev_t base_umad_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE); 146 static const dev_t base_issm_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE) + 147 IB_UMAD_NUM_FIXED_MINOR; 148 static dev_t dynamic_umad_dev; 149 static dev_t dynamic_issm_dev; 150 151 static DEFINE_IDA(umad_ida); 152 153 static int ib_umad_add_one(struct ib_device *device); 154 static void ib_umad_remove_one(struct ib_device *device, void *client_data); 155 156 static void ib_umad_dev_free(struct kref *kref) 157 { 158 struct ib_umad_device *dev = 159 container_of(kref, struct ib_umad_device, kref); 160 161 kfree(dev); 162 } 163 164 static void ib_umad_dev_get(struct ib_umad_device *dev) 165 { 166 kref_get(&dev->kref); 167 } 168 169 static void ib_umad_dev_put(struct ib_umad_device *dev) 170 { 171 kref_put(&dev->kref, ib_umad_dev_free); 172 } 173 174 static int hdr_size(struct ib_umad_file *file) 175 { 176 return file->use_pkey_index ? sizeof(struct ib_user_mad_hdr) : 177 sizeof(struct ib_user_mad_hdr_old); 178 } 179 180 /* caller must hold file->mutex */ 181 static struct ib_mad_agent *__get_agent(struct ib_umad_file *file, int id) 182 { 183 return file->agents_dead ? NULL : file->agent[id]; 184 } 185 186 static int queue_packet(struct ib_umad_file *file, struct ib_mad_agent *agent, 187 struct ib_umad_packet *packet, bool is_recv_mad) 188 { 189 int ret = 1; 190 191 mutex_lock(&file->mutex); 192 193 if (is_recv_mad && 194 atomic_read(&file->recv_list_size) > MAX_UMAD_RECV_LIST_SIZE) 195 goto unlock; 196 197 for (packet->mad.hdr.id = 0; 198 packet->mad.hdr.id < IB_UMAD_MAX_AGENTS; 199 packet->mad.hdr.id++) 200 if (agent == __get_agent(file, packet->mad.hdr.id)) { 201 list_add_tail(&packet->list, &file->recv_list); 202 atomic_inc(&file->recv_list_size); 203 wake_up_interruptible(&file->recv_wait); 204 ret = 0; 205 break; 206 } 207 unlock: 208 mutex_unlock(&file->mutex); 209 210 return ret; 211 } 212 213 static void dequeue_send(struct ib_umad_file *file, 214 struct ib_umad_packet *packet) 215 { 216 spin_lock_irq(&file->send_lock); 217 list_del(&packet->list); 218 spin_unlock_irq(&file->send_lock); 219 } 220 221 static void send_handler(struct ib_mad_agent *agent, 222 struct ib_mad_send_wc *send_wc) 223 { 224 struct ib_umad_file *file = agent->context; 225 struct ib_umad_packet *packet = send_wc->send_buf->context[0]; 226 227 dequeue_send(file, packet); 228 rdma_destroy_ah(packet->msg->ah, RDMA_DESTROY_AH_SLEEPABLE); 229 ib_free_send_mad(packet->msg); 230 231 if (send_wc->status == IB_WC_RESP_TIMEOUT_ERR) { 232 packet->length = IB_MGMT_MAD_HDR; 233 packet->mad.hdr.status = ETIMEDOUT; 234 if (!queue_packet(file, agent, packet, false)) 235 return; 236 } 237 kfree(packet); 238 } 239 240 static void recv_handler(struct ib_mad_agent *agent, 241 struct ib_mad_send_buf *send_buf, 242 struct ib_mad_recv_wc *mad_recv_wc) 243 { 244 struct ib_umad_file *file = agent->context; 245 struct ib_umad_packet *packet; 246 247 if (mad_recv_wc->wc->status != IB_WC_SUCCESS) 248 goto err1; 249 250 packet = kzalloc_obj(*packet); 251 if (!packet) 252 goto err1; 253 254 packet->length = mad_recv_wc->mad_len; 255 packet->recv_wc = mad_recv_wc; 256 257 packet->mad.hdr.status = 0; 258 packet->mad.hdr.length = hdr_size(file) + mad_recv_wc->mad_len; 259 packet->mad.hdr.qpn = cpu_to_be32(mad_recv_wc->wc->src_qp); 260 /* 261 * On OPA devices it is okay to lose the upper 16 bits of LID as this 262 * information is obtained elsewhere. Mask off the upper 16 bits. 263 */ 264 if (rdma_cap_opa_mad(agent->device, agent->port_num)) 265 packet->mad.hdr.lid = ib_lid_be16(0xFFFF & 266 mad_recv_wc->wc->slid); 267 else 268 packet->mad.hdr.lid = ib_lid_be16(mad_recv_wc->wc->slid); 269 packet->mad.hdr.sl = mad_recv_wc->wc->sl; 270 packet->mad.hdr.path_bits = mad_recv_wc->wc->dlid_path_bits; 271 packet->mad.hdr.pkey_index = mad_recv_wc->wc->pkey_index; 272 packet->mad.hdr.grh_present = !!(mad_recv_wc->wc->wc_flags & IB_WC_GRH); 273 if (packet->mad.hdr.grh_present) { 274 struct rdma_ah_attr ah_attr; 275 const struct ib_global_route *grh; 276 int ret; 277 278 ret = ib_init_ah_attr_from_wc(agent->device, agent->port_num, 279 mad_recv_wc->wc, 280 mad_recv_wc->recv_buf.grh, 281 &ah_attr); 282 if (ret) 283 goto err2; 284 285 grh = rdma_ah_read_grh(&ah_attr); 286 packet->mad.hdr.gid_index = grh->sgid_index; 287 packet->mad.hdr.hop_limit = grh->hop_limit; 288 packet->mad.hdr.traffic_class = grh->traffic_class; 289 memcpy(packet->mad.hdr.gid, &grh->dgid, 16); 290 packet->mad.hdr.flow_label = cpu_to_be32(grh->flow_label); 291 rdma_destroy_ah_attr(&ah_attr); 292 } 293 294 if (queue_packet(file, agent, packet, true)) 295 goto err2; 296 return; 297 298 err2: 299 kfree(packet); 300 err1: 301 ib_free_recv_mad(mad_recv_wc); 302 } 303 304 static ssize_t copy_recv_mad(struct ib_umad_file *file, char __user *buf, 305 struct ib_umad_packet *packet, size_t count) 306 { 307 struct ib_mad_recv_buf *recv_buf; 308 int left, seg_payload, offset, max_seg_payload; 309 size_t seg_size; 310 311 recv_buf = &packet->recv_wc->recv_buf; 312 seg_size = packet->recv_wc->mad_seg_size; 313 314 /* We need enough room to copy the first (or only) MAD segment. */ 315 if ((packet->length <= seg_size && 316 count < hdr_size(file) + packet->length) || 317 (packet->length > seg_size && 318 count < hdr_size(file) + seg_size)) 319 return -EINVAL; 320 321 if (copy_to_user(buf, &packet->mad, hdr_size(file))) 322 return -EFAULT; 323 324 buf += hdr_size(file); 325 seg_payload = min_t(int, packet->length, seg_size); 326 if (copy_to_user(buf, recv_buf->mad, seg_payload)) 327 return -EFAULT; 328 329 if (seg_payload < packet->length) { 330 /* 331 * Multipacket RMPP MAD message. Copy remainder of message. 332 * Note that last segment may have a shorter payload. 333 */ 334 if (count < hdr_size(file) + packet->length) { 335 /* 336 * The buffer is too small, return the first RMPP segment, 337 * which includes the RMPP message length. 338 */ 339 return -ENOSPC; 340 } 341 offset = ib_get_mad_data_offset(recv_buf->mad->mad_hdr.mgmt_class); 342 max_seg_payload = seg_size - offset; 343 344 for (left = packet->length - seg_payload, buf += seg_payload; 345 left; left -= seg_payload, buf += seg_payload) { 346 recv_buf = container_of(recv_buf->list.next, 347 struct ib_mad_recv_buf, list); 348 seg_payload = min(left, max_seg_payload); 349 if (copy_to_user(buf, ((void *) recv_buf->mad) + offset, 350 seg_payload)) 351 return -EFAULT; 352 } 353 } 354 355 trace_ib_umad_read_recv(file, &packet->mad.hdr, &recv_buf->mad->mad_hdr); 356 357 return hdr_size(file) + packet->length; 358 } 359 360 static ssize_t copy_send_mad(struct ib_umad_file *file, char __user *buf, 361 struct ib_umad_packet *packet, size_t count) 362 { 363 ssize_t size = hdr_size(file) + packet->length; 364 365 if (count < size) 366 return -EINVAL; 367 368 if (copy_to_user(buf, &packet->mad, hdr_size(file))) 369 return -EFAULT; 370 371 buf += hdr_size(file); 372 373 if (copy_to_user(buf, packet->mad.data, packet->length)) 374 return -EFAULT; 375 376 trace_ib_umad_read_send(file, &packet->mad.hdr, 377 (struct ib_mad_hdr *)&packet->mad.data); 378 379 return size; 380 } 381 382 static ssize_t ib_umad_read(struct file *filp, char __user *buf, 383 size_t count, loff_t *pos) 384 { 385 struct ib_umad_file *file = filp->private_data; 386 struct ib_umad_packet *packet; 387 ssize_t ret; 388 389 if (count < hdr_size(file)) 390 return -EINVAL; 391 392 mutex_lock(&file->mutex); 393 394 if (file->agents_dead) { 395 mutex_unlock(&file->mutex); 396 return -EIO; 397 } 398 399 while (list_empty(&file->recv_list)) { 400 mutex_unlock(&file->mutex); 401 402 if (filp->f_flags & O_NONBLOCK) 403 return -EAGAIN; 404 405 if (wait_event_interruptible(file->recv_wait, 406 !list_empty(&file->recv_list))) 407 return -ERESTARTSYS; 408 409 mutex_lock(&file->mutex); 410 } 411 412 if (file->agents_dead) { 413 mutex_unlock(&file->mutex); 414 return -EIO; 415 } 416 417 packet = list_entry(file->recv_list.next, struct ib_umad_packet, list); 418 list_del(&packet->list); 419 atomic_dec(&file->recv_list_size); 420 421 mutex_unlock(&file->mutex); 422 423 if (packet->recv_wc) 424 ret = copy_recv_mad(file, buf, packet, count); 425 else 426 ret = copy_send_mad(file, buf, packet, count); 427 428 if (ret < 0) { 429 /* Requeue packet */ 430 mutex_lock(&file->mutex); 431 list_add(&packet->list, &file->recv_list); 432 atomic_inc(&file->recv_list_size); 433 mutex_unlock(&file->mutex); 434 } else { 435 if (packet->recv_wc) 436 ib_free_recv_mad(packet->recv_wc); 437 kfree(packet); 438 } 439 return ret; 440 } 441 442 static int copy_rmpp_mad(struct ib_mad_send_buf *msg, const char __user *buf) 443 { 444 int left, seg; 445 446 /* Copy class specific header */ 447 if ((msg->hdr_len > IB_MGMT_RMPP_HDR) && 448 copy_from_user(msg->mad + IB_MGMT_RMPP_HDR, buf + IB_MGMT_RMPP_HDR, 449 msg->hdr_len - IB_MGMT_RMPP_HDR)) 450 return -EFAULT; 451 452 /* All headers are in place. Copy data segments. */ 453 for (seg = 1, left = msg->data_len, buf += msg->hdr_len; left > 0; 454 seg++, left -= msg->seg_size, buf += msg->seg_size) { 455 if (copy_from_user(ib_get_rmpp_segment(msg, seg), buf, 456 min(left, msg->seg_size))) 457 return -EFAULT; 458 } 459 return 0; 460 } 461 462 static int same_destination(struct ib_user_mad_hdr *hdr1, 463 struct ib_user_mad_hdr *hdr2) 464 { 465 if (!hdr1->grh_present && !hdr2->grh_present) 466 return (hdr1->lid == hdr2->lid); 467 468 if (hdr1->grh_present && hdr2->grh_present) 469 return !memcmp(hdr1->gid, hdr2->gid, 16); 470 471 return 0; 472 } 473 474 static int is_duplicate(struct ib_umad_file *file, 475 struct ib_umad_packet *packet) 476 { 477 struct ib_umad_packet *sent_packet; 478 struct ib_mad_hdr *sent_hdr, *hdr; 479 480 hdr = (struct ib_mad_hdr *) packet->mad.data; 481 list_for_each_entry(sent_packet, &file->send_list, list) { 482 sent_hdr = (struct ib_mad_hdr *) sent_packet->mad.data; 483 484 if ((hdr->tid != sent_hdr->tid) || 485 (hdr->mgmt_class != sent_hdr->mgmt_class)) 486 continue; 487 488 /* 489 * No need to be overly clever here. If two new operations have 490 * the same TID, reject the second as a duplicate. This is more 491 * restrictive than required by the spec. 492 */ 493 if (!ib_response_mad(hdr)) { 494 if (!ib_response_mad(sent_hdr)) 495 return 1; 496 continue; 497 } else if (!ib_response_mad(sent_hdr)) 498 continue; 499 500 if (same_destination(&packet->mad.hdr, &sent_packet->mad.hdr)) 501 return 1; 502 } 503 504 return 0; 505 } 506 507 static ssize_t ib_umad_write(struct file *filp, const char __user *buf, 508 size_t count, loff_t *pos) 509 { 510 struct ib_umad_file *file = filp->private_data; 511 struct ib_rmpp_mad_hdr *rmpp_mad_hdr; 512 struct ib_umad_packet *packet; 513 struct ib_mad_agent *agent; 514 struct rdma_ah_attr ah_attr; 515 struct ib_ah *ah; 516 __be64 *tid; 517 int ret, hdr_len, copy_offset, rmpp_active; 518 size_t data_len; 519 u8 base_version; 520 521 if (count < hdr_size(file) + IB_MGMT_RMPP_HDR) 522 return -EINVAL; 523 524 packet = kzalloc(sizeof(*packet) + IB_MGMT_RMPP_HDR, GFP_KERNEL); 525 if (!packet) 526 return -ENOMEM; 527 528 if (copy_from_user(&packet->mad, buf, hdr_size(file))) { 529 ret = -EFAULT; 530 goto err; 531 } 532 533 if (packet->mad.hdr.id >= IB_UMAD_MAX_AGENTS) { 534 ret = -EINVAL; 535 goto err; 536 } 537 538 buf += hdr_size(file); 539 540 if (copy_from_user(packet->mad.data, buf, IB_MGMT_RMPP_HDR)) { 541 ret = -EFAULT; 542 goto err; 543 } 544 545 mutex_lock(&file->mutex); 546 547 trace_ib_umad_write(file, &packet->mad.hdr, 548 (struct ib_mad_hdr *)&packet->mad.data); 549 550 agent = __get_agent(file, packet->mad.hdr.id); 551 if (!agent) { 552 ret = -EIO; 553 goto err_up; 554 } 555 556 memset(&ah_attr, 0, sizeof ah_attr); 557 ah_attr.type = rdma_ah_find_type(agent->device, 558 file->port->port_num); 559 rdma_ah_set_dlid(&ah_attr, be16_to_cpu(packet->mad.hdr.lid)); 560 rdma_ah_set_sl(&ah_attr, packet->mad.hdr.sl); 561 rdma_ah_set_path_bits(&ah_attr, packet->mad.hdr.path_bits); 562 rdma_ah_set_port_num(&ah_attr, file->port->port_num); 563 if (packet->mad.hdr.grh_present) { 564 rdma_ah_set_grh(&ah_attr, NULL, 565 be32_to_cpu(packet->mad.hdr.flow_label), 566 packet->mad.hdr.gid_index, 567 packet->mad.hdr.hop_limit, 568 packet->mad.hdr.traffic_class); 569 rdma_ah_set_dgid_raw(&ah_attr, packet->mad.hdr.gid); 570 } 571 572 ah = rdma_create_user_ah(agent->qp->pd, &ah_attr, NULL); 573 if (IS_ERR(ah)) { 574 ret = PTR_ERR(ah); 575 goto err_up; 576 } 577 578 rmpp_mad_hdr = (struct ib_rmpp_mad_hdr *)packet->mad.data; 579 hdr_len = ib_get_mad_data_offset(rmpp_mad_hdr->mad_hdr.mgmt_class); 580 581 if (ib_is_mad_class_rmpp(rmpp_mad_hdr->mad_hdr.mgmt_class) 582 && ib_mad_kernel_rmpp_agent(agent)) { 583 copy_offset = IB_MGMT_RMPP_HDR; 584 rmpp_active = ib_get_rmpp_flags(&rmpp_mad_hdr->rmpp_hdr) & 585 IB_MGMT_RMPP_FLAG_ACTIVE; 586 } else { 587 copy_offset = IB_MGMT_MAD_HDR; 588 rmpp_active = 0; 589 } 590 591 base_version = ((struct ib_mad_hdr *)&packet->mad.data)->base_version; 592 if (check_sub_overflow(count, hdr_size(file) + hdr_len, &data_len)) { 593 ret = -EINVAL; 594 goto err_ah; 595 } 596 packet->msg = ib_create_send_mad(agent, 597 be32_to_cpu(packet->mad.hdr.qpn), 598 packet->mad.hdr.pkey_index, rmpp_active, 599 hdr_len, data_len, GFP_KERNEL, 600 base_version); 601 if (IS_ERR(packet->msg)) { 602 ret = PTR_ERR(packet->msg); 603 goto err_ah; 604 } 605 606 packet->msg->ah = ah; 607 packet->msg->timeout_ms = packet->mad.hdr.timeout_ms; 608 packet->msg->retries = packet->mad.hdr.retries; 609 packet->msg->context[0] = packet; 610 611 /* Copy MAD header. Any RMPP header is already in place. */ 612 memcpy(packet->msg->mad, packet->mad.data, IB_MGMT_MAD_HDR); 613 614 if (!rmpp_active) { 615 if (copy_from_user(packet->msg->mad + copy_offset, 616 buf + copy_offset, 617 hdr_len + data_len - copy_offset)) { 618 ret = -EFAULT; 619 goto err_msg; 620 } 621 } else { 622 ret = copy_rmpp_mad(packet->msg, buf); 623 if (ret) 624 goto err_msg; 625 } 626 627 /* 628 * Set the high-order part of the transaction ID to make MADs from 629 * different agents unique, and allow routing responses back to the 630 * original requestor. 631 */ 632 if (!ib_response_mad(packet->msg->mad)) { 633 tid = &((struct ib_mad_hdr *) packet->msg->mad)->tid; 634 *tid = cpu_to_be64(((u64) agent->hi_tid) << 32 | 635 (be64_to_cpup(tid) & 0xffffffff)); 636 rmpp_mad_hdr->mad_hdr.tid = *tid; 637 } 638 639 if (!ib_mad_kernel_rmpp_agent(agent) 640 && ib_is_mad_class_rmpp(rmpp_mad_hdr->mad_hdr.mgmt_class) 641 && (ib_get_rmpp_flags(&rmpp_mad_hdr->rmpp_hdr) & IB_MGMT_RMPP_FLAG_ACTIVE)) { 642 spin_lock_irq(&file->send_lock); 643 list_add_tail(&packet->list, &file->send_list); 644 spin_unlock_irq(&file->send_lock); 645 } else { 646 spin_lock_irq(&file->send_lock); 647 ret = is_duplicate(file, packet); 648 if (!ret) 649 list_add_tail(&packet->list, &file->send_list); 650 spin_unlock_irq(&file->send_lock); 651 if (ret) { 652 ret = -EINVAL; 653 goto err_msg; 654 } 655 } 656 657 ret = ib_post_send_mad(packet->msg, NULL); 658 if (ret) 659 goto err_send; 660 661 mutex_unlock(&file->mutex); 662 return count; 663 664 err_send: 665 dequeue_send(file, packet); 666 err_msg: 667 ib_free_send_mad(packet->msg); 668 err_ah: 669 rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE); 670 err_up: 671 mutex_unlock(&file->mutex); 672 err: 673 kfree(packet); 674 return ret; 675 } 676 677 static __poll_t ib_umad_poll(struct file *filp, struct poll_table_struct *wait) 678 { 679 struct ib_umad_file *file = filp->private_data; 680 681 /* we will always be able to post a MAD send */ 682 __poll_t mask = EPOLLOUT | EPOLLWRNORM; 683 684 mutex_lock(&file->mutex); 685 poll_wait(filp, &file->recv_wait, wait); 686 687 if (!list_empty(&file->recv_list)) 688 mask |= EPOLLIN | EPOLLRDNORM; 689 if (file->agents_dead) 690 mask = EPOLLERR; 691 mutex_unlock(&file->mutex); 692 693 return mask; 694 } 695 696 static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg, 697 int compat_method_mask) 698 { 699 struct ib_user_mad_reg_req ureq; 700 struct ib_mad_reg_req req; 701 struct ib_mad_agent *agent = NULL; 702 int agent_id; 703 int ret; 704 705 mutex_lock(&file->port->file_mutex); 706 mutex_lock(&file->mutex); 707 708 if (!file->port->ib_dev) { 709 dev_notice(&file->port->dev, "%s: invalid device\n", __func__); 710 ret = -EPIPE; 711 goto out; 712 } 713 714 if (copy_from_user(&ureq, arg, sizeof ureq)) { 715 ret = -EFAULT; 716 goto out; 717 } 718 719 if (ureq.qpn != 0 && ureq.qpn != 1) { 720 dev_notice(&file->port->dev, 721 "%s: invalid QPN %u specified\n", __func__, 722 ureq.qpn); 723 ret = -EINVAL; 724 goto out; 725 } 726 727 for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id) 728 if (!__get_agent(file, agent_id)) 729 goto found; 730 731 dev_notice(&file->port->dev, "%s: Max Agents (%u) reached\n", __func__, 732 IB_UMAD_MAX_AGENTS); 733 734 ret = -ENOMEM; 735 goto out; 736 737 found: 738 if (ureq.mgmt_class) { 739 memset(&req, 0, sizeof(req)); 740 req.mgmt_class = ureq.mgmt_class; 741 req.mgmt_class_version = ureq.mgmt_class_version; 742 memcpy(req.oui, ureq.oui, sizeof req.oui); 743 744 if (compat_method_mask) { 745 u32 *umm = (u32 *) ureq.method_mask; 746 int i; 747 748 for (i = 0; i < BITS_TO_LONGS(IB_MGMT_MAX_METHODS); ++i) 749 req.method_mask[i] = 750 umm[i * 2] | ((u64) umm[i * 2 + 1] << 32); 751 } else 752 memcpy(req.method_mask, ureq.method_mask, 753 sizeof req.method_mask); 754 } 755 756 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num, 757 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI, 758 ureq.mgmt_class ? &req : NULL, 759 ureq.rmpp_version, 760 send_handler, recv_handler, file, 0); 761 if (IS_ERR(agent)) { 762 ret = PTR_ERR(agent); 763 agent = NULL; 764 goto out; 765 } 766 767 if (put_user(agent_id, 768 (u32 __user *) (arg + offsetof(struct ib_user_mad_reg_req, id)))) { 769 ret = -EFAULT; 770 goto out; 771 } 772 773 if (!file->already_used) { 774 file->already_used = 1; 775 if (!file->use_pkey_index) { 776 dev_warn(&file->port->dev, 777 "process %s did not enable P_Key index support.\n", 778 current->comm); 779 dev_warn(&file->port->dev, 780 " Documentation/infiniband/user_mad.rst has info on the new ABI.\n"); 781 } 782 } 783 784 file->agent[agent_id] = agent; 785 ret = 0; 786 787 out: 788 mutex_unlock(&file->mutex); 789 790 if (ret && agent) 791 ib_unregister_mad_agent(agent); 792 793 mutex_unlock(&file->port->file_mutex); 794 795 return ret; 796 } 797 798 static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg) 799 { 800 struct ib_user_mad_reg_req2 ureq; 801 struct ib_mad_reg_req req; 802 struct ib_mad_agent *agent = NULL; 803 int agent_id; 804 int ret; 805 806 mutex_lock(&file->port->file_mutex); 807 mutex_lock(&file->mutex); 808 809 if (!file->port->ib_dev) { 810 dev_notice(&file->port->dev, "%s: invalid device\n", __func__); 811 ret = -EPIPE; 812 goto out; 813 } 814 815 if (copy_from_user(&ureq, arg, sizeof(ureq))) { 816 ret = -EFAULT; 817 goto out; 818 } 819 820 if (ureq.qpn != 0 && ureq.qpn != 1) { 821 dev_notice(&file->port->dev, "%s: invalid QPN %u specified\n", 822 __func__, ureq.qpn); 823 ret = -EINVAL; 824 goto out; 825 } 826 827 if (ureq.flags & ~IB_USER_MAD_REG_FLAGS_CAP) { 828 dev_notice(&file->port->dev, 829 "%s failed: invalid registration flags specified 0x%x; supported 0x%x\n", 830 __func__, ureq.flags, IB_USER_MAD_REG_FLAGS_CAP); 831 ret = -EINVAL; 832 833 if (put_user((u32)IB_USER_MAD_REG_FLAGS_CAP, 834 (u32 __user *) (arg + offsetof(struct 835 ib_user_mad_reg_req2, flags)))) 836 ret = -EFAULT; 837 838 goto out; 839 } 840 841 for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id) 842 if (!__get_agent(file, agent_id)) 843 goto found; 844 845 dev_notice(&file->port->dev, "%s: Max Agents (%u) reached\n", __func__, 846 IB_UMAD_MAX_AGENTS); 847 ret = -ENOMEM; 848 goto out; 849 850 found: 851 if (ureq.mgmt_class) { 852 memset(&req, 0, sizeof(req)); 853 req.mgmt_class = ureq.mgmt_class; 854 req.mgmt_class_version = ureq.mgmt_class_version; 855 if (ureq.oui & 0xff000000) { 856 dev_notice(&file->port->dev, 857 "%s failed: oui invalid 0x%08x\n", __func__, 858 ureq.oui); 859 ret = -EINVAL; 860 goto out; 861 } 862 req.oui[2] = ureq.oui & 0x0000ff; 863 req.oui[1] = (ureq.oui & 0x00ff00) >> 8; 864 req.oui[0] = (ureq.oui & 0xff0000) >> 16; 865 memcpy(req.method_mask, ureq.method_mask, 866 sizeof(req.method_mask)); 867 } 868 869 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num, 870 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI, 871 ureq.mgmt_class ? &req : NULL, 872 ureq.rmpp_version, 873 send_handler, recv_handler, file, 874 ureq.flags); 875 if (IS_ERR(agent)) { 876 ret = PTR_ERR(agent); 877 agent = NULL; 878 goto out; 879 } 880 881 if (put_user(agent_id, 882 (u32 __user *)(arg + 883 offsetof(struct ib_user_mad_reg_req2, id)))) { 884 ret = -EFAULT; 885 goto out; 886 } 887 888 if (!file->already_used) { 889 file->already_used = 1; 890 file->use_pkey_index = 1; 891 } 892 893 file->agent[agent_id] = agent; 894 ret = 0; 895 896 out: 897 mutex_unlock(&file->mutex); 898 899 if (ret && agent) 900 ib_unregister_mad_agent(agent); 901 902 mutex_unlock(&file->port->file_mutex); 903 904 return ret; 905 } 906 907 908 static int ib_umad_unreg_agent(struct ib_umad_file *file, u32 __user *arg) 909 { 910 struct ib_mad_agent *agent = NULL; 911 u32 id; 912 int ret = 0; 913 914 if (get_user(id, arg)) 915 return -EFAULT; 916 if (id >= IB_UMAD_MAX_AGENTS) 917 return -EINVAL; 918 919 mutex_lock(&file->port->file_mutex); 920 mutex_lock(&file->mutex); 921 922 id = array_index_nospec(id, IB_UMAD_MAX_AGENTS); 923 if (!__get_agent(file, id)) { 924 ret = -EINVAL; 925 goto out; 926 } 927 928 agent = file->agent[id]; 929 file->agent[id] = NULL; 930 931 out: 932 mutex_unlock(&file->mutex); 933 934 if (agent) 935 ib_unregister_mad_agent(agent); 936 937 mutex_unlock(&file->port->file_mutex); 938 939 return ret; 940 } 941 942 static long ib_umad_enable_pkey(struct ib_umad_file *file) 943 { 944 int ret = 0; 945 946 mutex_lock(&file->mutex); 947 if (file->already_used) 948 ret = -EINVAL; 949 else 950 file->use_pkey_index = 1; 951 mutex_unlock(&file->mutex); 952 953 return ret; 954 } 955 956 static long ib_umad_ioctl(struct file *filp, unsigned int cmd, 957 unsigned long arg) 958 { 959 switch (cmd) { 960 case IB_USER_MAD_REGISTER_AGENT: 961 return ib_umad_reg_agent(filp->private_data, (void __user *) arg, 0); 962 case IB_USER_MAD_UNREGISTER_AGENT: 963 return ib_umad_unreg_agent(filp->private_data, (__u32 __user *) arg); 964 case IB_USER_MAD_ENABLE_PKEY: 965 return ib_umad_enable_pkey(filp->private_data); 966 case IB_USER_MAD_REGISTER_AGENT2: 967 return ib_umad_reg_agent2(filp->private_data, (void __user *) arg); 968 default: 969 return -ENOIOCTLCMD; 970 } 971 } 972 973 #ifdef CONFIG_COMPAT 974 static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd, 975 unsigned long arg) 976 { 977 switch (cmd) { 978 case IB_USER_MAD_REGISTER_AGENT: 979 return ib_umad_reg_agent(filp->private_data, compat_ptr(arg), 1); 980 case IB_USER_MAD_UNREGISTER_AGENT: 981 return ib_umad_unreg_agent(filp->private_data, compat_ptr(arg)); 982 case IB_USER_MAD_ENABLE_PKEY: 983 return ib_umad_enable_pkey(filp->private_data); 984 case IB_USER_MAD_REGISTER_AGENT2: 985 return ib_umad_reg_agent2(filp->private_data, compat_ptr(arg)); 986 default: 987 return -ENOIOCTLCMD; 988 } 989 } 990 #endif 991 992 /* 993 * ib_umad_open() does not need the BKL: 994 * 995 * - the ib_umad_port structures are properly reference counted, and 996 * everything else is purely local to the file being created, so 997 * races against other open calls are not a problem; 998 * - the ioctl method does not affect any global state outside of the 999 * file structure being operated on; 1000 */ 1001 static int ib_umad_open(struct inode *inode, struct file *filp) 1002 { 1003 struct ib_umad_port *port; 1004 struct ib_umad_file *file; 1005 int ret = 0; 1006 1007 port = container_of(inode->i_cdev, struct ib_umad_port, cdev); 1008 1009 mutex_lock(&port->file_mutex); 1010 1011 if (!port->ib_dev) { 1012 ret = -ENXIO; 1013 goto out; 1014 } 1015 1016 if (!rdma_dev_access_netns(port->ib_dev, current->nsproxy->net_ns)) { 1017 ret = -EPERM; 1018 goto out; 1019 } 1020 1021 file = kzalloc_obj(*file); 1022 if (!file) { 1023 ret = -ENOMEM; 1024 goto out; 1025 } 1026 1027 mutex_init(&file->mutex); 1028 spin_lock_init(&file->send_lock); 1029 INIT_LIST_HEAD(&file->recv_list); 1030 INIT_LIST_HEAD(&file->send_list); 1031 init_waitqueue_head(&file->recv_wait); 1032 1033 file->port = port; 1034 filp->private_data = file; 1035 1036 list_add_tail(&file->port_list, &port->file_list); 1037 1038 stream_open(inode, filp); 1039 out: 1040 mutex_unlock(&port->file_mutex); 1041 return ret; 1042 } 1043 1044 static int ib_umad_close(struct inode *inode, struct file *filp) 1045 { 1046 struct ib_umad_file *file = filp->private_data; 1047 struct ib_umad_packet *packet, *tmp; 1048 int already_dead; 1049 int i; 1050 1051 mutex_lock(&file->port->file_mutex); 1052 mutex_lock(&file->mutex); 1053 1054 already_dead = file->agents_dead; 1055 file->agents_dead = 1; 1056 1057 list_for_each_entry_safe(packet, tmp, &file->recv_list, list) { 1058 if (packet->recv_wc) 1059 ib_free_recv_mad(packet->recv_wc); 1060 kfree(packet); 1061 } 1062 1063 list_del(&file->port_list); 1064 1065 mutex_unlock(&file->mutex); 1066 1067 if (!already_dead) 1068 for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i) 1069 if (file->agent[i]) 1070 ib_unregister_mad_agent(file->agent[i]); 1071 1072 mutex_unlock(&file->port->file_mutex); 1073 mutex_destroy(&file->mutex); 1074 kfree(file); 1075 return 0; 1076 } 1077 1078 static const struct file_operations umad_fops = { 1079 .owner = THIS_MODULE, 1080 .read = ib_umad_read, 1081 .write = ib_umad_write, 1082 .poll = ib_umad_poll, 1083 .unlocked_ioctl = ib_umad_ioctl, 1084 #ifdef CONFIG_COMPAT 1085 .compat_ioctl = ib_umad_compat_ioctl, 1086 #endif 1087 .open = ib_umad_open, 1088 .release = ib_umad_close, 1089 }; 1090 1091 static int ib_umad_sm_open(struct inode *inode, struct file *filp) 1092 { 1093 struct ib_umad_port *port; 1094 struct ib_port_modify props = { 1095 .set_port_cap_mask = IB_PORT_SM 1096 }; 1097 int ret; 1098 1099 port = container_of(inode->i_cdev, struct ib_umad_port, sm_cdev); 1100 1101 if (filp->f_flags & O_NONBLOCK) { 1102 if (down_trylock(&port->sm_sem)) { 1103 ret = -EAGAIN; 1104 goto fail; 1105 } 1106 } else { 1107 if (down_interruptible(&port->sm_sem)) { 1108 ret = -ERESTARTSYS; 1109 goto fail; 1110 } 1111 } 1112 1113 if (!rdma_dev_access_netns(port->ib_dev, current->nsproxy->net_ns)) { 1114 ret = -EPERM; 1115 goto err_up_sem; 1116 } 1117 1118 ret = ib_modify_port(port->ib_dev, port->port_num, 0, &props); 1119 if (ret) 1120 goto err_up_sem; 1121 1122 filp->private_data = port; 1123 1124 nonseekable_open(inode, filp); 1125 return 0; 1126 1127 err_up_sem: 1128 up(&port->sm_sem); 1129 1130 fail: 1131 return ret; 1132 } 1133 1134 static int ib_umad_sm_close(struct inode *inode, struct file *filp) 1135 { 1136 struct ib_umad_port *port = filp->private_data; 1137 struct ib_port_modify props = { 1138 .clr_port_cap_mask = IB_PORT_SM 1139 }; 1140 int ret = 0; 1141 1142 mutex_lock(&port->file_mutex); 1143 if (port->ib_dev) 1144 ret = ib_modify_port(port->ib_dev, port->port_num, 0, &props); 1145 mutex_unlock(&port->file_mutex); 1146 1147 up(&port->sm_sem); 1148 1149 return ret; 1150 } 1151 1152 static const struct file_operations umad_sm_fops = { 1153 .owner = THIS_MODULE, 1154 .open = ib_umad_sm_open, 1155 .release = ib_umad_sm_close, 1156 }; 1157 1158 static struct ib_umad_port *get_port(struct ib_device *ibdev, 1159 struct ib_umad_device *umad_dev, 1160 u32 port) 1161 { 1162 if (!umad_dev) 1163 return ERR_PTR(-EOPNOTSUPP); 1164 if (!rdma_is_port_valid(ibdev, port)) 1165 return ERR_PTR(-EINVAL); 1166 if (!rdma_cap_ib_mad(ibdev, port)) 1167 return ERR_PTR(-EOPNOTSUPP); 1168 1169 return &umad_dev->ports[port - rdma_start_port(ibdev)]; 1170 } 1171 1172 static int ib_umad_get_nl_info(struct ib_device *ibdev, void *client_data, 1173 struct ib_client_nl_info *res) 1174 { 1175 struct ib_umad_port *port = get_port(ibdev, client_data, res->port); 1176 1177 if (IS_ERR(port)) 1178 return PTR_ERR(port); 1179 1180 res->abi = IB_USER_MAD_ABI_VERSION; 1181 res->cdev = &port->dev; 1182 return 0; 1183 } 1184 1185 static struct ib_client umad_client = { 1186 .name = "umad", 1187 .add = ib_umad_add_one, 1188 .remove = ib_umad_remove_one, 1189 .get_nl_info = ib_umad_get_nl_info, 1190 }; 1191 MODULE_ALIAS_RDMA_CLIENT("umad"); 1192 1193 static int ib_issm_get_nl_info(struct ib_device *ibdev, void *client_data, 1194 struct ib_client_nl_info *res) 1195 { 1196 struct ib_umad_port *port = get_port(ibdev, client_data, res->port); 1197 1198 if (IS_ERR(port)) 1199 return PTR_ERR(port); 1200 1201 res->abi = IB_USER_MAD_ABI_VERSION; 1202 res->cdev = &port->sm_dev; 1203 return 0; 1204 } 1205 1206 static struct ib_client issm_client = { 1207 .name = "issm", 1208 .get_nl_info = ib_issm_get_nl_info, 1209 }; 1210 MODULE_ALIAS_RDMA_CLIENT("issm"); 1211 1212 static ssize_t ibdev_show(struct device *dev, struct device_attribute *attr, 1213 char *buf) 1214 { 1215 struct ib_umad_port *port = dev_get_drvdata(dev); 1216 1217 if (!port) 1218 return -ENODEV; 1219 1220 return sysfs_emit(buf, "%s\n", dev_name(&port->ib_dev->dev)); 1221 } 1222 static DEVICE_ATTR_RO(ibdev); 1223 1224 static ssize_t port_show(struct device *dev, struct device_attribute *attr, 1225 char *buf) 1226 { 1227 struct ib_umad_port *port = dev_get_drvdata(dev); 1228 1229 if (!port) 1230 return -ENODEV; 1231 1232 return sysfs_emit(buf, "%d\n", port->port_num); 1233 } 1234 static DEVICE_ATTR_RO(port); 1235 1236 static struct attribute *umad_class_dev_attrs[] = { 1237 &dev_attr_ibdev.attr, 1238 &dev_attr_port.attr, 1239 NULL, 1240 }; 1241 ATTRIBUTE_GROUPS(umad_class_dev); 1242 1243 static char *umad_devnode(const struct device *dev, umode_t *mode) 1244 { 1245 return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev)); 1246 } 1247 1248 static ssize_t abi_version_show(const struct class *class, 1249 const struct class_attribute *attr, char *buf) 1250 { 1251 return sysfs_emit(buf, "%d\n", IB_USER_MAD_ABI_VERSION); 1252 } 1253 static CLASS_ATTR_RO(abi_version); 1254 1255 static struct attribute *umad_class_attrs[] = { 1256 &class_attr_abi_version.attr, 1257 NULL, 1258 }; 1259 ATTRIBUTE_GROUPS(umad_class); 1260 1261 static struct class umad_class = { 1262 .name = "infiniband_mad", 1263 .devnode = umad_devnode, 1264 .class_groups = umad_class_groups, 1265 .dev_groups = umad_class_dev_groups, 1266 }; 1267 1268 static void ib_umad_release_port(struct device *device) 1269 { 1270 struct ib_umad_port *port = dev_get_drvdata(device); 1271 struct ib_umad_device *umad_dev = port->umad_dev; 1272 1273 ib_umad_dev_put(umad_dev); 1274 } 1275 1276 static void ib_umad_init_port_dev(struct device *dev, 1277 struct ib_umad_port *port, 1278 const struct ib_device *device) 1279 { 1280 device_initialize(dev); 1281 ib_umad_dev_get(port->umad_dev); 1282 dev->class = &umad_class; 1283 dev->parent = device->dev.parent; 1284 dev_set_drvdata(dev, port); 1285 dev->release = ib_umad_release_port; 1286 } 1287 1288 static int ib_umad_init_port(struct ib_device *device, int port_num, 1289 struct ib_umad_device *umad_dev, 1290 struct ib_umad_port *port) 1291 { 1292 int devnum; 1293 dev_t base_umad; 1294 dev_t base_issm; 1295 int ret; 1296 1297 devnum = ida_alloc_max(&umad_ida, IB_UMAD_MAX_PORTS - 1, GFP_KERNEL); 1298 if (devnum < 0) 1299 return -1; 1300 port->dev_num = devnum; 1301 if (devnum >= IB_UMAD_NUM_FIXED_MINOR) { 1302 base_umad = dynamic_umad_dev + devnum - IB_UMAD_NUM_FIXED_MINOR; 1303 base_issm = dynamic_issm_dev + devnum - IB_UMAD_NUM_FIXED_MINOR; 1304 } else { 1305 base_umad = devnum + base_umad_dev; 1306 base_issm = devnum + base_issm_dev; 1307 } 1308 1309 port->ib_dev = device; 1310 port->umad_dev = umad_dev; 1311 port->port_num = port_num; 1312 sema_init(&port->sm_sem, 1); 1313 mutex_init(&port->file_mutex); 1314 INIT_LIST_HEAD(&port->file_list); 1315 1316 ib_umad_init_port_dev(&port->dev, port, device); 1317 port->dev.devt = base_umad; 1318 dev_set_name(&port->dev, "umad%d", port->dev_num); 1319 cdev_init(&port->cdev, &umad_fops); 1320 port->cdev.owner = THIS_MODULE; 1321 1322 ret = cdev_device_add(&port->cdev, &port->dev); 1323 if (ret) 1324 goto err_cdev; 1325 1326 if (rdma_cap_ib_smi(device, port_num)) { 1327 ib_umad_init_port_dev(&port->sm_dev, port, device); 1328 port->sm_dev.devt = base_issm; 1329 dev_set_name(&port->sm_dev, "issm%d", port->dev_num); 1330 cdev_init(&port->sm_cdev, &umad_sm_fops); 1331 port->sm_cdev.owner = THIS_MODULE; 1332 1333 ret = cdev_device_add(&port->sm_cdev, &port->sm_dev); 1334 if (ret) 1335 goto err_dev; 1336 } 1337 1338 return 0; 1339 1340 err_dev: 1341 put_device(&port->sm_dev); 1342 cdev_device_del(&port->cdev, &port->dev); 1343 err_cdev: 1344 put_device(&port->dev); 1345 ida_free(&umad_ida, devnum); 1346 return ret; 1347 } 1348 1349 static void ib_umad_kill_port(struct ib_umad_port *port) 1350 { 1351 struct ib_umad_file *file; 1352 bool has_smi = false; 1353 int id; 1354 1355 if (rdma_cap_ib_smi(port->ib_dev, port->port_num)) { 1356 cdev_device_del(&port->sm_cdev, &port->sm_dev); 1357 has_smi = true; 1358 } 1359 cdev_device_del(&port->cdev, &port->dev); 1360 1361 mutex_lock(&port->file_mutex); 1362 1363 /* Mark ib_dev NULL and block ioctl or other file ops to progress 1364 * further. 1365 */ 1366 port->ib_dev = NULL; 1367 1368 list_for_each_entry(file, &port->file_list, port_list) { 1369 mutex_lock(&file->mutex); 1370 file->agents_dead = 1; 1371 wake_up_interruptible(&file->recv_wait); 1372 mutex_unlock(&file->mutex); 1373 1374 for (id = 0; id < IB_UMAD_MAX_AGENTS; ++id) 1375 if (file->agent[id]) 1376 ib_unregister_mad_agent(file->agent[id]); 1377 } 1378 1379 mutex_unlock(&port->file_mutex); 1380 1381 ida_free(&umad_ida, port->dev_num); 1382 1383 /* balances device_initialize() */ 1384 if (has_smi) 1385 put_device(&port->sm_dev); 1386 put_device(&port->dev); 1387 } 1388 1389 static int ib_umad_add_one(struct ib_device *device) 1390 { 1391 struct ib_umad_device *umad_dev; 1392 int s, e, i; 1393 int count = 0; 1394 int ret; 1395 1396 s = rdma_start_port(device); 1397 e = rdma_end_port(device); 1398 1399 umad_dev = kzalloc_flex(*umad_dev, ports, size_add(size_sub(e, s), 1), 1400 GFP_KERNEL); 1401 if (!umad_dev) 1402 return -ENOMEM; 1403 1404 kref_init(&umad_dev->kref); 1405 for (i = s; i <= e; ++i) { 1406 if (!rdma_cap_ib_mad(device, i)) 1407 continue; 1408 1409 ret = ib_umad_init_port(device, i, umad_dev, 1410 &umad_dev->ports[i - s]); 1411 if (ret) 1412 goto err; 1413 1414 count++; 1415 } 1416 1417 if (!count) { 1418 ret = -EOPNOTSUPP; 1419 goto free; 1420 } 1421 1422 ib_set_client_data(device, &umad_client, umad_dev); 1423 1424 return 0; 1425 1426 err: 1427 while (--i >= s) { 1428 if (!rdma_cap_ib_mad(device, i)) 1429 continue; 1430 1431 ib_umad_kill_port(&umad_dev->ports[i - s]); 1432 } 1433 free: 1434 /* balances kref_init */ 1435 ib_umad_dev_put(umad_dev); 1436 return ret; 1437 } 1438 1439 static void ib_umad_remove_one(struct ib_device *device, void *client_data) 1440 { 1441 struct ib_umad_device *umad_dev = client_data; 1442 unsigned int i; 1443 1444 rdma_for_each_port (device, i) { 1445 if (rdma_cap_ib_mad(device, i)) 1446 ib_umad_kill_port( 1447 &umad_dev->ports[i - rdma_start_port(device)]); 1448 } 1449 /* balances kref_init() */ 1450 ib_umad_dev_put(umad_dev); 1451 } 1452 1453 static int __init ib_umad_init(void) 1454 { 1455 int ret; 1456 1457 ret = register_chrdev_region(base_umad_dev, 1458 IB_UMAD_NUM_FIXED_MINOR * 2, 1459 umad_class.name); 1460 if (ret) { 1461 pr_err("couldn't register device number\n"); 1462 goto out; 1463 } 1464 1465 ret = alloc_chrdev_region(&dynamic_umad_dev, 0, 1466 IB_UMAD_NUM_DYNAMIC_MINOR * 2, 1467 umad_class.name); 1468 if (ret) { 1469 pr_err("couldn't register dynamic device number\n"); 1470 goto out_alloc; 1471 } 1472 dynamic_issm_dev = dynamic_umad_dev + IB_UMAD_NUM_DYNAMIC_MINOR; 1473 1474 ret = class_register(&umad_class); 1475 if (ret) { 1476 pr_err("couldn't create class infiniband_mad\n"); 1477 goto out_chrdev; 1478 } 1479 1480 ret = ib_register_client(&umad_client); 1481 if (ret) 1482 goto out_class; 1483 1484 ret = ib_register_client(&issm_client); 1485 if (ret) 1486 goto out_client; 1487 1488 return 0; 1489 1490 out_client: 1491 ib_unregister_client(&umad_client); 1492 out_class: 1493 class_unregister(&umad_class); 1494 1495 out_chrdev: 1496 unregister_chrdev_region(dynamic_umad_dev, 1497 IB_UMAD_NUM_DYNAMIC_MINOR * 2); 1498 1499 out_alloc: 1500 unregister_chrdev_region(base_umad_dev, 1501 IB_UMAD_NUM_FIXED_MINOR * 2); 1502 1503 out: 1504 return ret; 1505 } 1506 1507 static void __exit ib_umad_cleanup(void) 1508 { 1509 ib_unregister_client(&issm_client); 1510 ib_unregister_client(&umad_client); 1511 class_unregister(&umad_class); 1512 unregister_chrdev_region(base_umad_dev, 1513 IB_UMAD_NUM_FIXED_MINOR * 2); 1514 unregister_chrdev_region(dynamic_umad_dev, 1515 IB_UMAD_NUM_DYNAMIC_MINOR * 2); 1516 } 1517 1518 module_init(ib_umad_init); 1519 module_exit(ib_umad_cleanup); 1520