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.
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:
13 * Redistribution and use in source and binary forms, with or
14 * without modification, are permitted provided that the following
17 * - Redistributions of source code must retain the above
18 * copyright notice, this list of conditions and the following
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.
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
36 #define pr_fmt(fmt) "user_mad: " fmt
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/device.h>
41 #include <linux/err.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>
53 #include <linux/uaccess.h>
55 #include <rdma/ib_mad.h>
56 #include <rdma/ib_user_mad.h>
57 #include <rdma/rdma_netlink.h>
59 #include "core_priv.h"
61 MODULE_AUTHOR("Roland Dreier");
62 MODULE_DESCRIPTION("InfiniBand userspace MAD packet access");
63 MODULE_LICENSE("Dual BSD/GPL");
66 IB_UMAD_MAX_PORTS = RDMA_MAX_PORTS,
67 IB_UMAD_MAX_AGENTS = 32,
70 IB_UMAD_MINOR_BASE = 0,
71 IB_UMAD_NUM_FIXED_MINOR = 64,
72 IB_UMAD_NUM_DYNAMIC_MINOR = IB_UMAD_MAX_PORTS - IB_UMAD_NUM_FIXED_MINOR,
73 IB_ISSM_MINOR_BASE = IB_UMAD_NUM_FIXED_MINOR,
77 * Our lifetime rules for these structs are the following:
78 * device special file is opened, we take a reference on the
79 * ib_umad_port's struct ib_umad_device. We drop these
80 * references in the corresponding close().
82 * In addition to references coming from open character devices, there
83 * is one more reference to each ib_umad_device representing the
84 * module's reference taken when allocating the ib_umad_device in
87 * When destroying an ib_umad_device, we drop the module's reference.
95 struct semaphore sm_sem;
97 struct mutex file_mutex;
98 struct list_head file_list;
100 struct ib_device *ib_dev;
101 struct ib_umad_device *umad_dev;
106 struct ib_umad_device {
108 struct ib_umad_port ports[];
111 struct ib_umad_file {
113 struct ib_umad_port *port;
114 struct list_head recv_list;
115 struct list_head send_list;
116 struct list_head port_list;
117 spinlock_t send_lock;
118 wait_queue_head_t recv_wait;
119 struct ib_mad_agent *agent[IB_UMAD_MAX_AGENTS];
125 struct ib_umad_packet {
126 struct ib_mad_send_buf *msg;
127 struct ib_mad_recv_wc *recv_wc;
128 struct list_head list;
130 struct ib_user_mad mad;
133 #define CREATE_TRACE_POINTS
134 #include <trace/events/ib_umad.h>
136 static const dev_t base_umad_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE);
137 static const dev_t base_issm_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE) +
138 IB_UMAD_NUM_FIXED_MINOR;
139 static dev_t dynamic_umad_dev;
140 static dev_t dynamic_issm_dev;
142 static DEFINE_IDA(umad_ida);
144 static void ib_umad_add_one(struct ib_device *device);
145 static void ib_umad_remove_one(struct ib_device *device, void *client_data);
147 static void ib_umad_dev_free(struct kref *kref)
149 struct ib_umad_device *dev =
150 container_of(kref, struct ib_umad_device, kref);
155 static void ib_umad_dev_get(struct ib_umad_device *dev)
157 kref_get(&dev->kref);
160 static void ib_umad_dev_put(struct ib_umad_device *dev)
162 kref_put(&dev->kref, ib_umad_dev_free);
165 static int hdr_size(struct ib_umad_file *file)
167 return file->use_pkey_index ? sizeof (struct ib_user_mad_hdr) :
168 sizeof (struct ib_user_mad_hdr_old);
171 /* caller must hold file->mutex */
172 static struct ib_mad_agent *__get_agent(struct ib_umad_file *file, int id)
174 return file->agents_dead ? NULL : file->agent[id];
177 static int queue_packet(struct ib_umad_file *file,
178 struct ib_mad_agent *agent,
179 struct ib_umad_packet *packet)
183 mutex_lock(&file->mutex);
185 for (packet->mad.hdr.id = 0;
186 packet->mad.hdr.id < IB_UMAD_MAX_AGENTS;
187 packet->mad.hdr.id++)
188 if (agent == __get_agent(file, packet->mad.hdr.id)) {
189 list_add_tail(&packet->list, &file->recv_list);
190 wake_up_interruptible(&file->recv_wait);
195 mutex_unlock(&file->mutex);
200 static void dequeue_send(struct ib_umad_file *file,
201 struct ib_umad_packet *packet)
203 spin_lock_irq(&file->send_lock);
204 list_del(&packet->list);
205 spin_unlock_irq(&file->send_lock);
208 static void send_handler(struct ib_mad_agent *agent,
209 struct ib_mad_send_wc *send_wc)
211 struct ib_umad_file *file = agent->context;
212 struct ib_umad_packet *packet = send_wc->send_buf->context[0];
214 dequeue_send(file, packet);
215 rdma_destroy_ah(packet->msg->ah, RDMA_DESTROY_AH_SLEEPABLE);
216 ib_free_send_mad(packet->msg);
218 if (send_wc->status == IB_WC_RESP_TIMEOUT_ERR) {
219 packet->length = IB_MGMT_MAD_HDR;
220 packet->mad.hdr.status = ETIMEDOUT;
221 if (!queue_packet(file, agent, packet))
227 static void recv_handler(struct ib_mad_agent *agent,
228 struct ib_mad_send_buf *send_buf,
229 struct ib_mad_recv_wc *mad_recv_wc)
231 struct ib_umad_file *file = agent->context;
232 struct ib_umad_packet *packet;
234 if (mad_recv_wc->wc->status != IB_WC_SUCCESS)
237 packet = kzalloc(sizeof *packet, GFP_KERNEL);
241 packet->length = mad_recv_wc->mad_len;
242 packet->recv_wc = mad_recv_wc;
244 packet->mad.hdr.status = 0;
245 packet->mad.hdr.length = hdr_size(file) + mad_recv_wc->mad_len;
246 packet->mad.hdr.qpn = cpu_to_be32(mad_recv_wc->wc->src_qp);
248 * On OPA devices it is okay to lose the upper 16 bits of LID as this
249 * information is obtained elsewhere. Mask off the upper 16 bits.
251 if (rdma_cap_opa_mad(agent->device, agent->port_num))
252 packet->mad.hdr.lid = ib_lid_be16(0xFFFF &
253 mad_recv_wc->wc->slid);
255 packet->mad.hdr.lid = ib_lid_be16(mad_recv_wc->wc->slid);
256 packet->mad.hdr.sl = mad_recv_wc->wc->sl;
257 packet->mad.hdr.path_bits = mad_recv_wc->wc->dlid_path_bits;
258 packet->mad.hdr.pkey_index = mad_recv_wc->wc->pkey_index;
259 packet->mad.hdr.grh_present = !!(mad_recv_wc->wc->wc_flags & IB_WC_GRH);
260 if (packet->mad.hdr.grh_present) {
261 struct rdma_ah_attr ah_attr;
262 const struct ib_global_route *grh;
265 ret = ib_init_ah_attr_from_wc(agent->device, agent->port_num,
267 mad_recv_wc->recv_buf.grh,
272 grh = rdma_ah_read_grh(&ah_attr);
273 packet->mad.hdr.gid_index = grh->sgid_index;
274 packet->mad.hdr.hop_limit = grh->hop_limit;
275 packet->mad.hdr.traffic_class = grh->traffic_class;
276 memcpy(packet->mad.hdr.gid, &grh->dgid, 16);
277 packet->mad.hdr.flow_label = cpu_to_be32(grh->flow_label);
278 rdma_destroy_ah_attr(&ah_attr);
281 if (queue_packet(file, agent, packet))
288 ib_free_recv_mad(mad_recv_wc);
291 static ssize_t copy_recv_mad(struct ib_umad_file *file, char __user *buf,
292 struct ib_umad_packet *packet, size_t count)
294 struct ib_mad_recv_buf *recv_buf;
295 int left, seg_payload, offset, max_seg_payload;
298 recv_buf = &packet->recv_wc->recv_buf;
299 seg_size = packet->recv_wc->mad_seg_size;
301 /* We need enough room to copy the first (or only) MAD segment. */
302 if ((packet->length <= seg_size &&
303 count < hdr_size(file) + packet->length) ||
304 (packet->length > seg_size &&
305 count < hdr_size(file) + seg_size))
308 if (copy_to_user(buf, &packet->mad, hdr_size(file)))
311 buf += hdr_size(file);
312 seg_payload = min_t(int, packet->length, seg_size);
313 if (copy_to_user(buf, recv_buf->mad, seg_payload))
316 if (seg_payload < packet->length) {
318 * Multipacket RMPP MAD message. Copy remainder of message.
319 * Note that last segment may have a shorter payload.
321 if (count < hdr_size(file) + packet->length) {
323 * The buffer is too small, return the first RMPP segment,
324 * which includes the RMPP message length.
328 offset = ib_get_mad_data_offset(recv_buf->mad->mad_hdr.mgmt_class);
329 max_seg_payload = seg_size - offset;
331 for (left = packet->length - seg_payload, buf += seg_payload;
332 left; left -= seg_payload, buf += seg_payload) {
333 recv_buf = container_of(recv_buf->list.next,
334 struct ib_mad_recv_buf, list);
335 seg_payload = min(left, max_seg_payload);
336 if (copy_to_user(buf, ((void *) recv_buf->mad) + offset,
342 trace_ib_umad_read_recv(file, &packet->mad.hdr, &recv_buf->mad->mad_hdr);
344 return hdr_size(file) + packet->length;
347 static ssize_t copy_send_mad(struct ib_umad_file *file, char __user *buf,
348 struct ib_umad_packet *packet, size_t count)
350 ssize_t size = hdr_size(file) + packet->length;
355 if (copy_to_user(buf, &packet->mad, hdr_size(file)))
358 buf += hdr_size(file);
360 if (copy_to_user(buf, packet->mad.data, packet->length))
363 trace_ib_umad_read_send(file, &packet->mad.hdr,
364 (struct ib_mad_hdr *)&packet->mad.data);
369 static ssize_t ib_umad_read(struct file *filp, char __user *buf,
370 size_t count, loff_t *pos)
372 struct ib_umad_file *file = filp->private_data;
373 struct ib_umad_packet *packet;
376 if (count < hdr_size(file))
379 mutex_lock(&file->mutex);
381 while (list_empty(&file->recv_list)) {
382 mutex_unlock(&file->mutex);
384 if (filp->f_flags & O_NONBLOCK)
387 if (wait_event_interruptible(file->recv_wait,
388 !list_empty(&file->recv_list)))
391 mutex_lock(&file->mutex);
394 packet = list_entry(file->recv_list.next, struct ib_umad_packet, list);
395 list_del(&packet->list);
397 mutex_unlock(&file->mutex);
400 ret = copy_recv_mad(file, buf, packet, count);
402 ret = copy_send_mad(file, buf, packet, count);
406 mutex_lock(&file->mutex);
407 list_add(&packet->list, &file->recv_list);
408 mutex_unlock(&file->mutex);
411 ib_free_recv_mad(packet->recv_wc);
417 static int copy_rmpp_mad(struct ib_mad_send_buf *msg, const char __user *buf)
421 /* Copy class specific header */
422 if ((msg->hdr_len > IB_MGMT_RMPP_HDR) &&
423 copy_from_user(msg->mad + IB_MGMT_RMPP_HDR, buf + IB_MGMT_RMPP_HDR,
424 msg->hdr_len - IB_MGMT_RMPP_HDR))
427 /* All headers are in place. Copy data segments. */
428 for (seg = 1, left = msg->data_len, buf += msg->hdr_len; left > 0;
429 seg++, left -= msg->seg_size, buf += msg->seg_size) {
430 if (copy_from_user(ib_get_rmpp_segment(msg, seg), buf,
431 min(left, msg->seg_size)))
437 static int same_destination(struct ib_user_mad_hdr *hdr1,
438 struct ib_user_mad_hdr *hdr2)
440 if (!hdr1->grh_present && !hdr2->grh_present)
441 return (hdr1->lid == hdr2->lid);
443 if (hdr1->grh_present && hdr2->grh_present)
444 return !memcmp(hdr1->gid, hdr2->gid, 16);
449 static int is_duplicate(struct ib_umad_file *file,
450 struct ib_umad_packet *packet)
452 struct ib_umad_packet *sent_packet;
453 struct ib_mad_hdr *sent_hdr, *hdr;
455 hdr = (struct ib_mad_hdr *) packet->mad.data;
456 list_for_each_entry(sent_packet, &file->send_list, list) {
457 sent_hdr = (struct ib_mad_hdr *) sent_packet->mad.data;
459 if ((hdr->tid != sent_hdr->tid) ||
460 (hdr->mgmt_class != sent_hdr->mgmt_class))
464 * No need to be overly clever here. If two new operations have
465 * the same TID, reject the second as a duplicate. This is more
466 * restrictive than required by the spec.
468 if (!ib_response_mad(hdr)) {
469 if (!ib_response_mad(sent_hdr))
472 } else if (!ib_response_mad(sent_hdr))
475 if (same_destination(&packet->mad.hdr, &sent_packet->mad.hdr))
482 static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
483 size_t count, loff_t *pos)
485 struct ib_umad_file *file = filp->private_data;
486 struct ib_umad_packet *packet;
487 struct ib_mad_agent *agent;
488 struct rdma_ah_attr ah_attr;
490 struct ib_rmpp_mad *rmpp_mad;
492 int ret, data_len, hdr_len, copy_offset, rmpp_active;
495 if (count < hdr_size(file) + IB_MGMT_RMPP_HDR)
498 packet = kzalloc(sizeof *packet + IB_MGMT_RMPP_HDR, GFP_KERNEL);
502 if (copy_from_user(&packet->mad, buf, hdr_size(file))) {
507 if (packet->mad.hdr.id >= IB_UMAD_MAX_AGENTS) {
512 buf += hdr_size(file);
514 if (copy_from_user(packet->mad.data, buf, IB_MGMT_RMPP_HDR)) {
519 mutex_lock(&file->mutex);
521 trace_ib_umad_write(file, &packet->mad.hdr,
522 (struct ib_mad_hdr *)&packet->mad.data);
524 agent = __get_agent(file, packet->mad.hdr.id);
530 memset(&ah_attr, 0, sizeof ah_attr);
531 ah_attr.type = rdma_ah_find_type(agent->device,
532 file->port->port_num);
533 rdma_ah_set_dlid(&ah_attr, be16_to_cpu(packet->mad.hdr.lid));
534 rdma_ah_set_sl(&ah_attr, packet->mad.hdr.sl);
535 rdma_ah_set_path_bits(&ah_attr, packet->mad.hdr.path_bits);
536 rdma_ah_set_port_num(&ah_attr, file->port->port_num);
537 if (packet->mad.hdr.grh_present) {
538 rdma_ah_set_grh(&ah_attr, NULL,
539 be32_to_cpu(packet->mad.hdr.flow_label),
540 packet->mad.hdr.gid_index,
541 packet->mad.hdr.hop_limit,
542 packet->mad.hdr.traffic_class);
543 rdma_ah_set_dgid_raw(&ah_attr, packet->mad.hdr.gid);
546 ah = rdma_create_user_ah(agent->qp->pd, &ah_attr, NULL);
552 rmpp_mad = (struct ib_rmpp_mad *) packet->mad.data;
553 hdr_len = ib_get_mad_data_offset(rmpp_mad->mad_hdr.mgmt_class);
555 if (ib_is_mad_class_rmpp(rmpp_mad->mad_hdr.mgmt_class)
556 && ib_mad_kernel_rmpp_agent(agent)) {
557 copy_offset = IB_MGMT_RMPP_HDR;
558 rmpp_active = ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) &
559 IB_MGMT_RMPP_FLAG_ACTIVE;
561 copy_offset = IB_MGMT_MAD_HDR;
565 base_version = ((struct ib_mad_hdr *)&packet->mad.data)->base_version;
566 data_len = count - hdr_size(file) - hdr_len;
567 packet->msg = ib_create_send_mad(agent,
568 be32_to_cpu(packet->mad.hdr.qpn),
569 packet->mad.hdr.pkey_index, rmpp_active,
570 hdr_len, data_len, GFP_KERNEL,
572 if (IS_ERR(packet->msg)) {
573 ret = PTR_ERR(packet->msg);
577 packet->msg->ah = ah;
578 packet->msg->timeout_ms = packet->mad.hdr.timeout_ms;
579 packet->msg->retries = packet->mad.hdr.retries;
580 packet->msg->context[0] = packet;
582 /* Copy MAD header. Any RMPP header is already in place. */
583 memcpy(packet->msg->mad, packet->mad.data, IB_MGMT_MAD_HDR);
586 if (copy_from_user(packet->msg->mad + copy_offset,
588 hdr_len + data_len - copy_offset)) {
593 ret = copy_rmpp_mad(packet->msg, buf);
599 * Set the high-order part of the transaction ID to make MADs from
600 * different agents unique, and allow routing responses back to the
601 * original requestor.
603 if (!ib_response_mad(packet->msg->mad)) {
604 tid = &((struct ib_mad_hdr *) packet->msg->mad)->tid;
605 *tid = cpu_to_be64(((u64) agent->hi_tid) << 32 |
606 (be64_to_cpup(tid) & 0xffffffff));
607 rmpp_mad->mad_hdr.tid = *tid;
610 if (!ib_mad_kernel_rmpp_agent(agent)
611 && ib_is_mad_class_rmpp(rmpp_mad->mad_hdr.mgmt_class)
612 && (ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) & IB_MGMT_RMPP_FLAG_ACTIVE)) {
613 spin_lock_irq(&file->send_lock);
614 list_add_tail(&packet->list, &file->send_list);
615 spin_unlock_irq(&file->send_lock);
617 spin_lock_irq(&file->send_lock);
618 ret = is_duplicate(file, packet);
620 list_add_tail(&packet->list, &file->send_list);
621 spin_unlock_irq(&file->send_lock);
628 ret = ib_post_send_mad(packet->msg, NULL);
632 mutex_unlock(&file->mutex);
636 dequeue_send(file, packet);
638 ib_free_send_mad(packet->msg);
640 rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE);
642 mutex_unlock(&file->mutex);
648 static __poll_t ib_umad_poll(struct file *filp, struct poll_table_struct *wait)
650 struct ib_umad_file *file = filp->private_data;
652 /* we will always be able to post a MAD send */
653 __poll_t mask = EPOLLOUT | EPOLLWRNORM;
655 poll_wait(filp, &file->recv_wait, wait);
657 if (!list_empty(&file->recv_list))
658 mask |= EPOLLIN | EPOLLRDNORM;
663 static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg,
664 int compat_method_mask)
666 struct ib_user_mad_reg_req ureq;
667 struct ib_mad_reg_req req;
668 struct ib_mad_agent *agent = NULL;
672 mutex_lock(&file->port->file_mutex);
673 mutex_lock(&file->mutex);
675 if (!file->port->ib_dev) {
676 dev_notice(&file->port->dev,
677 "ib_umad_reg_agent: invalid device\n");
682 if (copy_from_user(&ureq, arg, sizeof ureq)) {
687 if (ureq.qpn != 0 && ureq.qpn != 1) {
688 dev_notice(&file->port->dev,
689 "ib_umad_reg_agent: invalid QPN %d specified\n",
695 for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id)
696 if (!__get_agent(file, agent_id))
699 dev_notice(&file->port->dev,
700 "ib_umad_reg_agent: Max Agents (%u) reached\n",
706 if (ureq.mgmt_class) {
707 memset(&req, 0, sizeof(req));
708 req.mgmt_class = ureq.mgmt_class;
709 req.mgmt_class_version = ureq.mgmt_class_version;
710 memcpy(req.oui, ureq.oui, sizeof req.oui);
712 if (compat_method_mask) {
713 u32 *umm = (u32 *) ureq.method_mask;
716 for (i = 0; i < BITS_TO_LONGS(IB_MGMT_MAX_METHODS); ++i)
718 umm[i * 2] | ((u64) umm[i * 2 + 1] << 32);
720 memcpy(req.method_mask, ureq.method_mask,
721 sizeof req.method_mask);
724 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num,
725 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI,
726 ureq.mgmt_class ? &req : NULL,
728 send_handler, recv_handler, file, 0);
730 ret = PTR_ERR(agent);
735 if (put_user(agent_id,
736 (u32 __user *) (arg + offsetof(struct ib_user_mad_reg_req, id)))) {
741 if (!file->already_used) {
742 file->already_used = 1;
743 if (!file->use_pkey_index) {
744 dev_warn(&file->port->dev,
745 "process %s did not enable P_Key index support.\n",
747 dev_warn(&file->port->dev,
748 " Documentation/infiniband/user_mad.rst has info on the new ABI.\n");
752 file->agent[agent_id] = agent;
756 mutex_unlock(&file->mutex);
759 ib_unregister_mad_agent(agent);
761 mutex_unlock(&file->port->file_mutex);
766 static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg)
768 struct ib_user_mad_reg_req2 ureq;
769 struct ib_mad_reg_req req;
770 struct ib_mad_agent *agent = NULL;
774 mutex_lock(&file->port->file_mutex);
775 mutex_lock(&file->mutex);
777 if (!file->port->ib_dev) {
778 dev_notice(&file->port->dev,
779 "ib_umad_reg_agent2: invalid device\n");
784 if (copy_from_user(&ureq, arg, sizeof(ureq))) {
789 if (ureq.qpn != 0 && ureq.qpn != 1) {
790 dev_notice(&file->port->dev,
791 "ib_umad_reg_agent2: invalid QPN %d specified\n",
797 if (ureq.flags & ~IB_USER_MAD_REG_FLAGS_CAP) {
798 dev_notice(&file->port->dev,
799 "ib_umad_reg_agent2 failed: invalid registration flags specified 0x%x; supported 0x%x\n",
800 ureq.flags, IB_USER_MAD_REG_FLAGS_CAP);
803 if (put_user((u32)IB_USER_MAD_REG_FLAGS_CAP,
804 (u32 __user *) (arg + offsetof(struct
805 ib_user_mad_reg_req2, flags))))
811 for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id)
812 if (!__get_agent(file, agent_id))
815 dev_notice(&file->port->dev,
816 "ib_umad_reg_agent2: Max Agents (%u) reached\n",
822 if (ureq.mgmt_class) {
823 memset(&req, 0, sizeof(req));
824 req.mgmt_class = ureq.mgmt_class;
825 req.mgmt_class_version = ureq.mgmt_class_version;
826 if (ureq.oui & 0xff000000) {
827 dev_notice(&file->port->dev,
828 "ib_umad_reg_agent2 failed: oui invalid 0x%08x\n",
833 req.oui[2] = ureq.oui & 0x0000ff;
834 req.oui[1] = (ureq.oui & 0x00ff00) >> 8;
835 req.oui[0] = (ureq.oui & 0xff0000) >> 16;
836 memcpy(req.method_mask, ureq.method_mask,
837 sizeof(req.method_mask));
840 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num,
841 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI,
842 ureq.mgmt_class ? &req : NULL,
844 send_handler, recv_handler, file,
847 ret = PTR_ERR(agent);
852 if (put_user(agent_id,
854 offsetof(struct ib_user_mad_reg_req2, id)))) {
859 if (!file->already_used) {
860 file->already_used = 1;
861 file->use_pkey_index = 1;
864 file->agent[agent_id] = agent;
868 mutex_unlock(&file->mutex);
871 ib_unregister_mad_agent(agent);
873 mutex_unlock(&file->port->file_mutex);
879 static int ib_umad_unreg_agent(struct ib_umad_file *file, u32 __user *arg)
881 struct ib_mad_agent *agent = NULL;
885 if (get_user(id, arg))
888 mutex_lock(&file->port->file_mutex);
889 mutex_lock(&file->mutex);
891 if (id >= IB_UMAD_MAX_AGENTS || !__get_agent(file, id)) {
896 agent = file->agent[id];
897 file->agent[id] = NULL;
900 mutex_unlock(&file->mutex);
903 ib_unregister_mad_agent(agent);
905 mutex_unlock(&file->port->file_mutex);
910 static long ib_umad_enable_pkey(struct ib_umad_file *file)
914 mutex_lock(&file->mutex);
915 if (file->already_used)
918 file->use_pkey_index = 1;
919 mutex_unlock(&file->mutex);
924 static long ib_umad_ioctl(struct file *filp, unsigned int cmd,
928 case IB_USER_MAD_REGISTER_AGENT:
929 return ib_umad_reg_agent(filp->private_data, (void __user *) arg, 0);
930 case IB_USER_MAD_UNREGISTER_AGENT:
931 return ib_umad_unreg_agent(filp->private_data, (__u32 __user *) arg);
932 case IB_USER_MAD_ENABLE_PKEY:
933 return ib_umad_enable_pkey(filp->private_data);
934 case IB_USER_MAD_REGISTER_AGENT2:
935 return ib_umad_reg_agent2(filp->private_data, (void __user *) arg);
942 static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd,
946 case IB_USER_MAD_REGISTER_AGENT:
947 return ib_umad_reg_agent(filp->private_data, compat_ptr(arg), 1);
948 case IB_USER_MAD_UNREGISTER_AGENT:
949 return ib_umad_unreg_agent(filp->private_data, compat_ptr(arg));
950 case IB_USER_MAD_ENABLE_PKEY:
951 return ib_umad_enable_pkey(filp->private_data);
952 case IB_USER_MAD_REGISTER_AGENT2:
953 return ib_umad_reg_agent2(filp->private_data, compat_ptr(arg));
961 * ib_umad_open() does not need the BKL:
963 * - the ib_umad_port structures are properly reference counted, and
964 * everything else is purely local to the file being created, so
965 * races against other open calls are not a problem;
966 * - the ioctl method does not affect any global state outside of the
967 * file structure being operated on;
969 static int ib_umad_open(struct inode *inode, struct file *filp)
971 struct ib_umad_port *port;
972 struct ib_umad_file *file;
975 port = container_of(inode->i_cdev, struct ib_umad_port, cdev);
977 mutex_lock(&port->file_mutex);
984 if (!rdma_dev_access_netns(port->ib_dev, current->nsproxy->net_ns)) {
989 file = kzalloc(sizeof(*file), GFP_KERNEL);
995 mutex_init(&file->mutex);
996 spin_lock_init(&file->send_lock);
997 INIT_LIST_HEAD(&file->recv_list);
998 INIT_LIST_HEAD(&file->send_list);
999 init_waitqueue_head(&file->recv_wait);
1002 filp->private_data = file;
1004 list_add_tail(&file->port_list, &port->file_list);
1006 stream_open(inode, filp);
1008 mutex_unlock(&port->file_mutex);
1012 static int ib_umad_close(struct inode *inode, struct file *filp)
1014 struct ib_umad_file *file = filp->private_data;
1015 struct ib_umad_packet *packet, *tmp;
1019 mutex_lock(&file->port->file_mutex);
1020 mutex_lock(&file->mutex);
1022 already_dead = file->agents_dead;
1023 file->agents_dead = 1;
1025 list_for_each_entry_safe(packet, tmp, &file->recv_list, list) {
1026 if (packet->recv_wc)
1027 ib_free_recv_mad(packet->recv_wc);
1031 list_del(&file->port_list);
1033 mutex_unlock(&file->mutex);
1036 for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i)
1038 ib_unregister_mad_agent(file->agent[i]);
1040 mutex_unlock(&file->port->file_mutex);
1046 static const struct file_operations umad_fops = {
1047 .owner = THIS_MODULE,
1048 .read = ib_umad_read,
1049 .write = ib_umad_write,
1050 .poll = ib_umad_poll,
1051 .unlocked_ioctl = ib_umad_ioctl,
1052 #ifdef CONFIG_COMPAT
1053 .compat_ioctl = ib_umad_compat_ioctl,
1055 .open = ib_umad_open,
1056 .release = ib_umad_close,
1057 .llseek = no_llseek,
1060 static int ib_umad_sm_open(struct inode *inode, struct file *filp)
1062 struct ib_umad_port *port;
1063 struct ib_port_modify props = {
1064 .set_port_cap_mask = IB_PORT_SM
1068 port = container_of(inode->i_cdev, struct ib_umad_port, sm_cdev);
1070 if (filp->f_flags & O_NONBLOCK) {
1071 if (down_trylock(&port->sm_sem)) {
1076 if (down_interruptible(&port->sm_sem)) {
1082 if (!rdma_dev_access_netns(port->ib_dev, current->nsproxy->net_ns)) {
1087 ret = ib_modify_port(port->ib_dev, port->port_num, 0, &props);
1091 filp->private_data = port;
1093 nonseekable_open(inode, filp);
1103 static int ib_umad_sm_close(struct inode *inode, struct file *filp)
1105 struct ib_umad_port *port = filp->private_data;
1106 struct ib_port_modify props = {
1107 .clr_port_cap_mask = IB_PORT_SM
1111 mutex_lock(&port->file_mutex);
1113 ret = ib_modify_port(port->ib_dev, port->port_num, 0, &props);
1114 mutex_unlock(&port->file_mutex);
1121 static const struct file_operations umad_sm_fops = {
1122 .owner = THIS_MODULE,
1123 .open = ib_umad_sm_open,
1124 .release = ib_umad_sm_close,
1125 .llseek = no_llseek,
1128 static int ib_umad_get_nl_info(struct ib_device *ibdev, void *client_data,
1129 struct ib_client_nl_info *res)
1131 struct ib_umad_device *umad_dev = client_data;
1133 if (!rdma_is_port_valid(ibdev, res->port))
1136 res->abi = IB_USER_MAD_ABI_VERSION;
1137 res->cdev = &umad_dev->ports[res->port - rdma_start_port(ibdev)].dev;
1142 static struct ib_client umad_client = {
1144 .add = ib_umad_add_one,
1145 .remove = ib_umad_remove_one,
1146 .get_nl_info = ib_umad_get_nl_info,
1148 MODULE_ALIAS_RDMA_CLIENT("umad");
1150 static int ib_issm_get_nl_info(struct ib_device *ibdev, void *client_data,
1151 struct ib_client_nl_info *res)
1153 struct ib_umad_device *umad_dev =
1154 ib_get_client_data(ibdev, &umad_client);
1156 if (!rdma_is_port_valid(ibdev, res->port))
1159 res->abi = IB_USER_MAD_ABI_VERSION;
1160 res->cdev = &umad_dev->ports[res->port - rdma_start_port(ibdev)].sm_dev;
1165 static struct ib_client issm_client = {
1167 .get_nl_info = ib_issm_get_nl_info,
1169 MODULE_ALIAS_RDMA_CLIENT("issm");
1171 static ssize_t ibdev_show(struct device *dev, struct device_attribute *attr,
1174 struct ib_umad_port *port = dev_get_drvdata(dev);
1179 return sprintf(buf, "%s\n", dev_name(&port->ib_dev->dev));
1181 static DEVICE_ATTR_RO(ibdev);
1183 static ssize_t port_show(struct device *dev, struct device_attribute *attr,
1186 struct ib_umad_port *port = dev_get_drvdata(dev);
1191 return sprintf(buf, "%d\n", port->port_num);
1193 static DEVICE_ATTR_RO(port);
1195 static struct attribute *umad_class_dev_attrs[] = {
1196 &dev_attr_ibdev.attr,
1197 &dev_attr_port.attr,
1200 ATTRIBUTE_GROUPS(umad_class_dev);
1202 static char *umad_devnode(struct device *dev, umode_t *mode)
1204 return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev));
1207 static ssize_t abi_version_show(struct class *class,
1208 struct class_attribute *attr, char *buf)
1210 return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
1212 static CLASS_ATTR_RO(abi_version);
1214 static struct attribute *umad_class_attrs[] = {
1215 &class_attr_abi_version.attr,
1218 ATTRIBUTE_GROUPS(umad_class);
1220 static struct class umad_class = {
1221 .name = "infiniband_mad",
1222 .devnode = umad_devnode,
1223 .class_groups = umad_class_groups,
1224 .dev_groups = umad_class_dev_groups,
1227 static void ib_umad_release_port(struct device *device)
1229 struct ib_umad_port *port = dev_get_drvdata(device);
1230 struct ib_umad_device *umad_dev = port->umad_dev;
1232 ib_umad_dev_put(umad_dev);
1235 static void ib_umad_init_port_dev(struct device *dev,
1236 struct ib_umad_port *port,
1237 const struct ib_device *device)
1239 device_initialize(dev);
1240 ib_umad_dev_get(port->umad_dev);
1241 dev->class = &umad_class;
1242 dev->parent = device->dev.parent;
1243 dev_set_drvdata(dev, port);
1244 dev->release = ib_umad_release_port;
1247 static int ib_umad_init_port(struct ib_device *device, int port_num,
1248 struct ib_umad_device *umad_dev,
1249 struct ib_umad_port *port)
1256 devnum = ida_alloc_max(&umad_ida, IB_UMAD_MAX_PORTS - 1, GFP_KERNEL);
1259 port->dev_num = devnum;
1260 if (devnum >= IB_UMAD_NUM_FIXED_MINOR) {
1261 base_umad = dynamic_umad_dev + devnum - IB_UMAD_NUM_FIXED_MINOR;
1262 base_issm = dynamic_issm_dev + devnum - IB_UMAD_NUM_FIXED_MINOR;
1264 base_umad = devnum + base_umad_dev;
1265 base_issm = devnum + base_issm_dev;
1268 port->ib_dev = device;
1269 port->umad_dev = umad_dev;
1270 port->port_num = port_num;
1271 sema_init(&port->sm_sem, 1);
1272 mutex_init(&port->file_mutex);
1273 INIT_LIST_HEAD(&port->file_list);
1275 ib_umad_init_port_dev(&port->dev, port, device);
1276 port->dev.devt = base_umad;
1277 dev_set_name(&port->dev, "umad%d", port->dev_num);
1278 cdev_init(&port->cdev, &umad_fops);
1279 port->cdev.owner = THIS_MODULE;
1281 ret = cdev_device_add(&port->cdev, &port->dev);
1285 ib_umad_init_port_dev(&port->sm_dev, port, device);
1286 port->sm_dev.devt = base_issm;
1287 dev_set_name(&port->sm_dev, "issm%d", port->dev_num);
1288 cdev_init(&port->sm_cdev, &umad_sm_fops);
1289 port->sm_cdev.owner = THIS_MODULE;
1291 ret = cdev_device_add(&port->sm_cdev, &port->sm_dev);
1298 put_device(&port->sm_dev);
1299 cdev_device_del(&port->cdev, &port->dev);
1301 put_device(&port->dev);
1302 ida_free(&umad_ida, devnum);
1306 static void ib_umad_kill_port(struct ib_umad_port *port)
1308 struct ib_umad_file *file;
1311 mutex_lock(&port->file_mutex);
1313 /* Mark ib_dev NULL and block ioctl or other file ops to progress
1316 port->ib_dev = NULL;
1318 list_for_each_entry(file, &port->file_list, port_list) {
1319 mutex_lock(&file->mutex);
1320 file->agents_dead = 1;
1321 mutex_unlock(&file->mutex);
1323 for (id = 0; id < IB_UMAD_MAX_AGENTS; ++id)
1324 if (file->agent[id])
1325 ib_unregister_mad_agent(file->agent[id]);
1328 mutex_unlock(&port->file_mutex);
1330 cdev_device_del(&port->sm_cdev, &port->sm_dev);
1331 cdev_device_del(&port->cdev, &port->dev);
1332 ida_free(&umad_ida, port->dev_num);
1334 /* balances device_initialize() */
1335 put_device(&port->sm_dev);
1336 put_device(&port->dev);
1339 static void ib_umad_add_one(struct ib_device *device)
1341 struct ib_umad_device *umad_dev;
1345 s = rdma_start_port(device);
1346 e = rdma_end_port(device);
1348 umad_dev = kzalloc(struct_size(umad_dev, ports, e - s + 1), GFP_KERNEL);
1352 kref_init(&umad_dev->kref);
1353 for (i = s; i <= e; ++i) {
1354 if (!rdma_cap_ib_mad(device, i))
1357 if (ib_umad_init_port(device, i, umad_dev,
1358 &umad_dev->ports[i - s]))
1367 ib_set_client_data(device, &umad_client, umad_dev);
1373 if (!rdma_cap_ib_mad(device, i))
1376 ib_umad_kill_port(&umad_dev->ports[i - s]);
1379 /* balances kref_init */
1380 ib_umad_dev_put(umad_dev);
1383 static void ib_umad_remove_one(struct ib_device *device, void *client_data)
1385 struct ib_umad_device *umad_dev = client_data;
1391 rdma_for_each_port (device, i) {
1392 if (rdma_cap_ib_mad(device, i))
1394 &umad_dev->ports[i - rdma_start_port(device)]);
1396 /* balances kref_init() */
1397 ib_umad_dev_put(umad_dev);
1400 static int __init ib_umad_init(void)
1404 ret = register_chrdev_region(base_umad_dev,
1405 IB_UMAD_NUM_FIXED_MINOR * 2,
1408 pr_err("couldn't register device number\n");
1412 ret = alloc_chrdev_region(&dynamic_umad_dev, 0,
1413 IB_UMAD_NUM_DYNAMIC_MINOR * 2,
1416 pr_err("couldn't register dynamic device number\n");
1419 dynamic_issm_dev = dynamic_umad_dev + IB_UMAD_NUM_DYNAMIC_MINOR;
1421 ret = class_register(&umad_class);
1423 pr_err("couldn't create class infiniband_mad\n");
1427 ret = ib_register_client(&umad_client);
1431 ret = ib_register_client(&issm_client);
1438 ib_unregister_client(&umad_client);
1440 class_unregister(&umad_class);
1443 unregister_chrdev_region(dynamic_umad_dev,
1444 IB_UMAD_NUM_DYNAMIC_MINOR * 2);
1447 unregister_chrdev_region(base_umad_dev,
1448 IB_UMAD_NUM_FIXED_MINOR * 2);
1454 static void __exit ib_umad_cleanup(void)
1456 ib_unregister_client(&issm_client);
1457 ib_unregister_client(&umad_client);
1458 class_unregister(&umad_class);
1459 unregister_chrdev_region(base_umad_dev,
1460 IB_UMAD_NUM_FIXED_MINOR * 2);
1461 unregister_chrdev_region(dynamic_umad_dev,
1462 IB_UMAD_NUM_DYNAMIC_MINOR * 2);
1465 module_init(ib_umad_init);
1466 module_exit(ib_umad_cleanup);