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>
52 #include <linux/nospec.h>
54 #include <linux/uaccess.h>
56 #include <rdma/ib_mad.h>
57 #include <rdma/ib_user_mad.h>
58 #include <rdma/rdma_netlink.h>
60 #include "core_priv.h"
62 MODULE_AUTHOR("Roland Dreier");
63 MODULE_DESCRIPTION("InfiniBand userspace MAD packet access");
64 MODULE_LICENSE("Dual BSD/GPL");
67 IB_UMAD_MAX_PORTS
= RDMA_MAX_PORTS
,
68 IB_UMAD_MAX_AGENTS
= 32,
71 IB_UMAD_MINOR_BASE
= 0,
72 IB_UMAD_NUM_FIXED_MINOR
= 64,
73 IB_UMAD_NUM_DYNAMIC_MINOR
= IB_UMAD_MAX_PORTS
- IB_UMAD_NUM_FIXED_MINOR
,
74 IB_ISSM_MINOR_BASE
= IB_UMAD_NUM_FIXED_MINOR
,
78 * Our lifetime rules for these structs are the following:
79 * device special file is opened, we take a reference on the
80 * ib_umad_port's struct ib_umad_device. We drop these
81 * references in the corresponding close().
83 * In addition to references coming from open character devices, there
84 * is one more reference to each ib_umad_device representing the
85 * module's reference taken when allocating the ib_umad_device in
88 * When destroying an ib_umad_device, we drop the module's reference.
96 struct semaphore sm_sem
;
98 struct mutex file_mutex
;
99 struct list_head file_list
;
101 struct ib_device
*ib_dev
;
102 struct ib_umad_device
*umad_dev
;
107 struct ib_umad_device
{
109 struct ib_umad_port ports
[];
112 struct ib_umad_file
{
114 struct ib_umad_port
*port
;
115 struct list_head recv_list
;
116 struct list_head send_list
;
117 struct list_head port_list
;
118 spinlock_t send_lock
;
119 wait_queue_head_t recv_wait
;
120 struct ib_mad_agent
*agent
[IB_UMAD_MAX_AGENTS
];
126 struct ib_umad_packet
{
127 struct ib_mad_send_buf
*msg
;
128 struct ib_mad_recv_wc
*recv_wc
;
129 struct list_head list
;
131 struct ib_user_mad mad
;
134 #define CREATE_TRACE_POINTS
135 #include <trace/events/ib_umad.h>
137 static const dev_t base_umad_dev
= MKDEV(IB_UMAD_MAJOR
, IB_UMAD_MINOR_BASE
);
138 static const dev_t base_issm_dev
= MKDEV(IB_UMAD_MAJOR
, IB_UMAD_MINOR_BASE
) +
139 IB_UMAD_NUM_FIXED_MINOR
;
140 static dev_t dynamic_umad_dev
;
141 static dev_t dynamic_issm_dev
;
143 static DEFINE_IDA(umad_ida
);
145 static int ib_umad_add_one(struct ib_device
*device
);
146 static void ib_umad_remove_one(struct ib_device
*device
, void *client_data
);
148 static void ib_umad_dev_free(struct kref
*kref
)
150 struct ib_umad_device
*dev
=
151 container_of(kref
, struct ib_umad_device
, kref
);
156 static void ib_umad_dev_get(struct ib_umad_device
*dev
)
158 kref_get(&dev
->kref
);
161 static void ib_umad_dev_put(struct ib_umad_device
*dev
)
163 kref_put(&dev
->kref
, ib_umad_dev_free
);
166 static int hdr_size(struct ib_umad_file
*file
)
168 return file
->use_pkey_index
? sizeof (struct ib_user_mad_hdr
) :
169 sizeof (struct ib_user_mad_hdr_old
);
172 /* caller must hold file->mutex */
173 static struct ib_mad_agent
*__get_agent(struct ib_umad_file
*file
, int id
)
175 return file
->agents_dead
? NULL
: file
->agent
[id
];
178 static int queue_packet(struct ib_umad_file
*file
,
179 struct ib_mad_agent
*agent
,
180 struct ib_umad_packet
*packet
)
184 mutex_lock(&file
->mutex
);
186 for (packet
->mad
.hdr
.id
= 0;
187 packet
->mad
.hdr
.id
< IB_UMAD_MAX_AGENTS
;
188 packet
->mad
.hdr
.id
++)
189 if (agent
== __get_agent(file
, packet
->mad
.hdr
.id
)) {
190 list_add_tail(&packet
->list
, &file
->recv_list
);
191 wake_up_interruptible(&file
->recv_wait
);
196 mutex_unlock(&file
->mutex
);
201 static void dequeue_send(struct ib_umad_file
*file
,
202 struct ib_umad_packet
*packet
)
204 spin_lock_irq(&file
->send_lock
);
205 list_del(&packet
->list
);
206 spin_unlock_irq(&file
->send_lock
);
209 static void send_handler(struct ib_mad_agent
*agent
,
210 struct ib_mad_send_wc
*send_wc
)
212 struct ib_umad_file
*file
= agent
->context
;
213 struct ib_umad_packet
*packet
= send_wc
->send_buf
->context
[0];
215 dequeue_send(file
, packet
);
216 rdma_destroy_ah(packet
->msg
->ah
, RDMA_DESTROY_AH_SLEEPABLE
);
217 ib_free_send_mad(packet
->msg
);
219 if (send_wc
->status
== IB_WC_RESP_TIMEOUT_ERR
) {
220 packet
->length
= IB_MGMT_MAD_HDR
;
221 packet
->mad
.hdr
.status
= ETIMEDOUT
;
222 if (!queue_packet(file
, agent
, packet
))
228 static void recv_handler(struct ib_mad_agent
*agent
,
229 struct ib_mad_send_buf
*send_buf
,
230 struct ib_mad_recv_wc
*mad_recv_wc
)
232 struct ib_umad_file
*file
= agent
->context
;
233 struct ib_umad_packet
*packet
;
235 if (mad_recv_wc
->wc
->status
!= IB_WC_SUCCESS
)
238 packet
= kzalloc(sizeof *packet
, GFP_KERNEL
);
242 packet
->length
= mad_recv_wc
->mad_len
;
243 packet
->recv_wc
= mad_recv_wc
;
245 packet
->mad
.hdr
.status
= 0;
246 packet
->mad
.hdr
.length
= hdr_size(file
) + mad_recv_wc
->mad_len
;
247 packet
->mad
.hdr
.qpn
= cpu_to_be32(mad_recv_wc
->wc
->src_qp
);
249 * On OPA devices it is okay to lose the upper 16 bits of LID as this
250 * information is obtained elsewhere. Mask off the upper 16 bits.
252 if (rdma_cap_opa_mad(agent
->device
, agent
->port_num
))
253 packet
->mad
.hdr
.lid
= ib_lid_be16(0xFFFF &
254 mad_recv_wc
->wc
->slid
);
256 packet
->mad
.hdr
.lid
= ib_lid_be16(mad_recv_wc
->wc
->slid
);
257 packet
->mad
.hdr
.sl
= mad_recv_wc
->wc
->sl
;
258 packet
->mad
.hdr
.path_bits
= mad_recv_wc
->wc
->dlid_path_bits
;
259 packet
->mad
.hdr
.pkey_index
= mad_recv_wc
->wc
->pkey_index
;
260 packet
->mad
.hdr
.grh_present
= !!(mad_recv_wc
->wc
->wc_flags
& IB_WC_GRH
);
261 if (packet
->mad
.hdr
.grh_present
) {
262 struct rdma_ah_attr ah_attr
;
263 const struct ib_global_route
*grh
;
266 ret
= ib_init_ah_attr_from_wc(agent
->device
, agent
->port_num
,
268 mad_recv_wc
->recv_buf
.grh
,
273 grh
= rdma_ah_read_grh(&ah_attr
);
274 packet
->mad
.hdr
.gid_index
= grh
->sgid_index
;
275 packet
->mad
.hdr
.hop_limit
= grh
->hop_limit
;
276 packet
->mad
.hdr
.traffic_class
= grh
->traffic_class
;
277 memcpy(packet
->mad
.hdr
.gid
, &grh
->dgid
, 16);
278 packet
->mad
.hdr
.flow_label
= cpu_to_be32(grh
->flow_label
);
279 rdma_destroy_ah_attr(&ah_attr
);
282 if (queue_packet(file
, agent
, packet
))
289 ib_free_recv_mad(mad_recv_wc
);
292 static ssize_t
copy_recv_mad(struct ib_umad_file
*file
, char __user
*buf
,
293 struct ib_umad_packet
*packet
, size_t count
)
295 struct ib_mad_recv_buf
*recv_buf
;
296 int left
, seg_payload
, offset
, max_seg_payload
;
299 recv_buf
= &packet
->recv_wc
->recv_buf
;
300 seg_size
= packet
->recv_wc
->mad_seg_size
;
302 /* We need enough room to copy the first (or only) MAD segment. */
303 if ((packet
->length
<= seg_size
&&
304 count
< hdr_size(file
) + packet
->length
) ||
305 (packet
->length
> seg_size
&&
306 count
< hdr_size(file
) + seg_size
))
309 if (copy_to_user(buf
, &packet
->mad
, hdr_size(file
)))
312 buf
+= hdr_size(file
);
313 seg_payload
= min_t(int, packet
->length
, seg_size
);
314 if (copy_to_user(buf
, recv_buf
->mad
, seg_payload
))
317 if (seg_payload
< packet
->length
) {
319 * Multipacket RMPP MAD message. Copy remainder of message.
320 * Note that last segment may have a shorter payload.
322 if (count
< hdr_size(file
) + packet
->length
) {
324 * The buffer is too small, return the first RMPP segment,
325 * which includes the RMPP message length.
329 offset
= ib_get_mad_data_offset(recv_buf
->mad
->mad_hdr
.mgmt_class
);
330 max_seg_payload
= seg_size
- offset
;
332 for (left
= packet
->length
- seg_payload
, buf
+= seg_payload
;
333 left
; left
-= seg_payload
, buf
+= seg_payload
) {
334 recv_buf
= container_of(recv_buf
->list
.next
,
335 struct ib_mad_recv_buf
, list
);
336 seg_payload
= min(left
, max_seg_payload
);
337 if (copy_to_user(buf
, ((void *) recv_buf
->mad
) + offset
,
343 trace_ib_umad_read_recv(file
, &packet
->mad
.hdr
, &recv_buf
->mad
->mad_hdr
);
345 return hdr_size(file
) + packet
->length
;
348 static ssize_t
copy_send_mad(struct ib_umad_file
*file
, char __user
*buf
,
349 struct ib_umad_packet
*packet
, size_t count
)
351 ssize_t size
= hdr_size(file
) + packet
->length
;
356 if (copy_to_user(buf
, &packet
->mad
, hdr_size(file
)))
359 buf
+= hdr_size(file
);
361 if (copy_to_user(buf
, packet
->mad
.data
, packet
->length
))
364 trace_ib_umad_read_send(file
, &packet
->mad
.hdr
,
365 (struct ib_mad_hdr
*)&packet
->mad
.data
);
370 static ssize_t
ib_umad_read(struct file
*filp
, char __user
*buf
,
371 size_t count
, loff_t
*pos
)
373 struct ib_umad_file
*file
= filp
->private_data
;
374 struct ib_umad_packet
*packet
;
377 if (count
< hdr_size(file
))
380 mutex_lock(&file
->mutex
);
382 while (list_empty(&file
->recv_list
)) {
383 mutex_unlock(&file
->mutex
);
385 if (filp
->f_flags
& O_NONBLOCK
)
388 if (wait_event_interruptible(file
->recv_wait
,
389 !list_empty(&file
->recv_list
)))
392 mutex_lock(&file
->mutex
);
395 packet
= list_entry(file
->recv_list
.next
, struct ib_umad_packet
, list
);
396 list_del(&packet
->list
);
398 mutex_unlock(&file
->mutex
);
401 ret
= copy_recv_mad(file
, buf
, packet
, count
);
403 ret
= copy_send_mad(file
, buf
, packet
, count
);
407 mutex_lock(&file
->mutex
);
408 list_add(&packet
->list
, &file
->recv_list
);
409 mutex_unlock(&file
->mutex
);
412 ib_free_recv_mad(packet
->recv_wc
);
418 static int copy_rmpp_mad(struct ib_mad_send_buf
*msg
, const char __user
*buf
)
422 /* Copy class specific header */
423 if ((msg
->hdr_len
> IB_MGMT_RMPP_HDR
) &&
424 copy_from_user(msg
->mad
+ IB_MGMT_RMPP_HDR
, buf
+ IB_MGMT_RMPP_HDR
,
425 msg
->hdr_len
- IB_MGMT_RMPP_HDR
))
428 /* All headers are in place. Copy data segments. */
429 for (seg
= 1, left
= msg
->data_len
, buf
+= msg
->hdr_len
; left
> 0;
430 seg
++, left
-= msg
->seg_size
, buf
+= msg
->seg_size
) {
431 if (copy_from_user(ib_get_rmpp_segment(msg
, seg
), buf
,
432 min(left
, msg
->seg_size
)))
438 static int same_destination(struct ib_user_mad_hdr
*hdr1
,
439 struct ib_user_mad_hdr
*hdr2
)
441 if (!hdr1
->grh_present
&& !hdr2
->grh_present
)
442 return (hdr1
->lid
== hdr2
->lid
);
444 if (hdr1
->grh_present
&& hdr2
->grh_present
)
445 return !memcmp(hdr1
->gid
, hdr2
->gid
, 16);
450 static int is_duplicate(struct ib_umad_file
*file
,
451 struct ib_umad_packet
*packet
)
453 struct ib_umad_packet
*sent_packet
;
454 struct ib_mad_hdr
*sent_hdr
, *hdr
;
456 hdr
= (struct ib_mad_hdr
*) packet
->mad
.data
;
457 list_for_each_entry(sent_packet
, &file
->send_list
, list
) {
458 sent_hdr
= (struct ib_mad_hdr
*) sent_packet
->mad
.data
;
460 if ((hdr
->tid
!= sent_hdr
->tid
) ||
461 (hdr
->mgmt_class
!= sent_hdr
->mgmt_class
))
465 * No need to be overly clever here. If two new operations have
466 * the same TID, reject the second as a duplicate. This is more
467 * restrictive than required by the spec.
469 if (!ib_response_mad(hdr
)) {
470 if (!ib_response_mad(sent_hdr
))
473 } else if (!ib_response_mad(sent_hdr
))
476 if (same_destination(&packet
->mad
.hdr
, &sent_packet
->mad
.hdr
))
483 static ssize_t
ib_umad_write(struct file
*filp
, const char __user
*buf
,
484 size_t count
, loff_t
*pos
)
486 struct ib_umad_file
*file
= filp
->private_data
;
487 struct ib_umad_packet
*packet
;
488 struct ib_mad_agent
*agent
;
489 struct rdma_ah_attr ah_attr
;
491 struct ib_rmpp_mad
*rmpp_mad
;
493 int ret
, data_len
, hdr_len
, copy_offset
, rmpp_active
;
496 if (count
< hdr_size(file
) + IB_MGMT_RMPP_HDR
)
499 packet
= kzalloc(sizeof *packet
+ IB_MGMT_RMPP_HDR
, GFP_KERNEL
);
503 if (copy_from_user(&packet
->mad
, buf
, hdr_size(file
))) {
508 if (packet
->mad
.hdr
.id
>= IB_UMAD_MAX_AGENTS
) {
513 buf
+= hdr_size(file
);
515 if (copy_from_user(packet
->mad
.data
, buf
, IB_MGMT_RMPP_HDR
)) {
520 mutex_lock(&file
->mutex
);
522 trace_ib_umad_write(file
, &packet
->mad
.hdr
,
523 (struct ib_mad_hdr
*)&packet
->mad
.data
);
525 agent
= __get_agent(file
, packet
->mad
.hdr
.id
);
531 memset(&ah_attr
, 0, sizeof ah_attr
);
532 ah_attr
.type
= rdma_ah_find_type(agent
->device
,
533 file
->port
->port_num
);
534 rdma_ah_set_dlid(&ah_attr
, be16_to_cpu(packet
->mad
.hdr
.lid
));
535 rdma_ah_set_sl(&ah_attr
, packet
->mad
.hdr
.sl
);
536 rdma_ah_set_path_bits(&ah_attr
, packet
->mad
.hdr
.path_bits
);
537 rdma_ah_set_port_num(&ah_attr
, file
->port
->port_num
);
538 if (packet
->mad
.hdr
.grh_present
) {
539 rdma_ah_set_grh(&ah_attr
, NULL
,
540 be32_to_cpu(packet
->mad
.hdr
.flow_label
),
541 packet
->mad
.hdr
.gid_index
,
542 packet
->mad
.hdr
.hop_limit
,
543 packet
->mad
.hdr
.traffic_class
);
544 rdma_ah_set_dgid_raw(&ah_attr
, packet
->mad
.hdr
.gid
);
547 ah
= rdma_create_user_ah(agent
->qp
->pd
, &ah_attr
, NULL
);
553 rmpp_mad
= (struct ib_rmpp_mad
*) packet
->mad
.data
;
554 hdr_len
= ib_get_mad_data_offset(rmpp_mad
->mad_hdr
.mgmt_class
);
556 if (ib_is_mad_class_rmpp(rmpp_mad
->mad_hdr
.mgmt_class
)
557 && ib_mad_kernel_rmpp_agent(agent
)) {
558 copy_offset
= IB_MGMT_RMPP_HDR
;
559 rmpp_active
= ib_get_rmpp_flags(&rmpp_mad
->rmpp_hdr
) &
560 IB_MGMT_RMPP_FLAG_ACTIVE
;
562 copy_offset
= IB_MGMT_MAD_HDR
;
566 base_version
= ((struct ib_mad_hdr
*)&packet
->mad
.data
)->base_version
;
567 data_len
= count
- hdr_size(file
) - hdr_len
;
568 packet
->msg
= ib_create_send_mad(agent
,
569 be32_to_cpu(packet
->mad
.hdr
.qpn
),
570 packet
->mad
.hdr
.pkey_index
, rmpp_active
,
571 hdr_len
, data_len
, GFP_KERNEL
,
573 if (IS_ERR(packet
->msg
)) {
574 ret
= PTR_ERR(packet
->msg
);
578 packet
->msg
->ah
= ah
;
579 packet
->msg
->timeout_ms
= packet
->mad
.hdr
.timeout_ms
;
580 packet
->msg
->retries
= packet
->mad
.hdr
.retries
;
581 packet
->msg
->context
[0] = packet
;
583 /* Copy MAD header. Any RMPP header is already in place. */
584 memcpy(packet
->msg
->mad
, packet
->mad
.data
, IB_MGMT_MAD_HDR
);
587 if (copy_from_user(packet
->msg
->mad
+ copy_offset
,
589 hdr_len
+ data_len
- copy_offset
)) {
594 ret
= copy_rmpp_mad(packet
->msg
, buf
);
600 * Set the high-order part of the transaction ID to make MADs from
601 * different agents unique, and allow routing responses back to the
602 * original requestor.
604 if (!ib_response_mad(packet
->msg
->mad
)) {
605 tid
= &((struct ib_mad_hdr
*) packet
->msg
->mad
)->tid
;
606 *tid
= cpu_to_be64(((u64
) agent
->hi_tid
) << 32 |
607 (be64_to_cpup(tid
) & 0xffffffff));
608 rmpp_mad
->mad_hdr
.tid
= *tid
;
611 if (!ib_mad_kernel_rmpp_agent(agent
)
612 && ib_is_mad_class_rmpp(rmpp_mad
->mad_hdr
.mgmt_class
)
613 && (ib_get_rmpp_flags(&rmpp_mad
->rmpp_hdr
) & IB_MGMT_RMPP_FLAG_ACTIVE
)) {
614 spin_lock_irq(&file
->send_lock
);
615 list_add_tail(&packet
->list
, &file
->send_list
);
616 spin_unlock_irq(&file
->send_lock
);
618 spin_lock_irq(&file
->send_lock
);
619 ret
= is_duplicate(file
, packet
);
621 list_add_tail(&packet
->list
, &file
->send_list
);
622 spin_unlock_irq(&file
->send_lock
);
629 ret
= ib_post_send_mad(packet
->msg
, NULL
);
633 mutex_unlock(&file
->mutex
);
637 dequeue_send(file
, packet
);
639 ib_free_send_mad(packet
->msg
);
641 rdma_destroy_ah(ah
, RDMA_DESTROY_AH_SLEEPABLE
);
643 mutex_unlock(&file
->mutex
);
649 static __poll_t
ib_umad_poll(struct file
*filp
, struct poll_table_struct
*wait
)
651 struct ib_umad_file
*file
= filp
->private_data
;
653 /* we will always be able to post a MAD send */
654 __poll_t mask
= EPOLLOUT
| EPOLLWRNORM
;
656 poll_wait(filp
, &file
->recv_wait
, wait
);
658 if (!list_empty(&file
->recv_list
))
659 mask
|= EPOLLIN
| EPOLLRDNORM
;
664 static int ib_umad_reg_agent(struct ib_umad_file
*file
, void __user
*arg
,
665 int compat_method_mask
)
667 struct ib_user_mad_reg_req ureq
;
668 struct ib_mad_reg_req req
;
669 struct ib_mad_agent
*agent
= NULL
;
673 mutex_lock(&file
->port
->file_mutex
);
674 mutex_lock(&file
->mutex
);
676 if (!file
->port
->ib_dev
) {
677 dev_notice(&file
->port
->dev
,
678 "ib_umad_reg_agent: invalid device\n");
683 if (copy_from_user(&ureq
, arg
, sizeof ureq
)) {
688 if (ureq
.qpn
!= 0 && ureq
.qpn
!= 1) {
689 dev_notice(&file
->port
->dev
,
690 "ib_umad_reg_agent: invalid QPN %d specified\n",
696 for (agent_id
= 0; agent_id
< IB_UMAD_MAX_AGENTS
; ++agent_id
)
697 if (!__get_agent(file
, agent_id
))
700 dev_notice(&file
->port
->dev
,
701 "ib_umad_reg_agent: Max Agents (%u) reached\n",
707 if (ureq
.mgmt_class
) {
708 memset(&req
, 0, sizeof(req
));
709 req
.mgmt_class
= ureq
.mgmt_class
;
710 req
.mgmt_class_version
= ureq
.mgmt_class_version
;
711 memcpy(req
.oui
, ureq
.oui
, sizeof req
.oui
);
713 if (compat_method_mask
) {
714 u32
*umm
= (u32
*) ureq
.method_mask
;
717 for (i
= 0; i
< BITS_TO_LONGS(IB_MGMT_MAX_METHODS
); ++i
)
719 umm
[i
* 2] | ((u64
) umm
[i
* 2 + 1] << 32);
721 memcpy(req
.method_mask
, ureq
.method_mask
,
722 sizeof req
.method_mask
);
725 agent
= ib_register_mad_agent(file
->port
->ib_dev
, file
->port
->port_num
,
726 ureq
.qpn
? IB_QPT_GSI
: IB_QPT_SMI
,
727 ureq
.mgmt_class
? &req
: NULL
,
729 send_handler
, recv_handler
, file
, 0);
731 ret
= PTR_ERR(agent
);
736 if (put_user(agent_id
,
737 (u32 __user
*) (arg
+ offsetof(struct ib_user_mad_reg_req
, id
)))) {
742 if (!file
->already_used
) {
743 file
->already_used
= 1;
744 if (!file
->use_pkey_index
) {
745 dev_warn(&file
->port
->dev
,
746 "process %s did not enable P_Key index support.\n",
748 dev_warn(&file
->port
->dev
,
749 " Documentation/infiniband/user_mad.rst has info on the new ABI.\n");
753 file
->agent
[agent_id
] = agent
;
757 mutex_unlock(&file
->mutex
);
760 ib_unregister_mad_agent(agent
);
762 mutex_unlock(&file
->port
->file_mutex
);
767 static int ib_umad_reg_agent2(struct ib_umad_file
*file
, void __user
*arg
)
769 struct ib_user_mad_reg_req2 ureq
;
770 struct ib_mad_reg_req req
;
771 struct ib_mad_agent
*agent
= NULL
;
775 mutex_lock(&file
->port
->file_mutex
);
776 mutex_lock(&file
->mutex
);
778 if (!file
->port
->ib_dev
) {
779 dev_notice(&file
->port
->dev
,
780 "ib_umad_reg_agent2: invalid device\n");
785 if (copy_from_user(&ureq
, arg
, sizeof(ureq
))) {
790 if (ureq
.qpn
!= 0 && ureq
.qpn
!= 1) {
791 dev_notice(&file
->port
->dev
,
792 "ib_umad_reg_agent2: invalid QPN %d specified\n",
798 if (ureq
.flags
& ~IB_USER_MAD_REG_FLAGS_CAP
) {
799 dev_notice(&file
->port
->dev
,
800 "ib_umad_reg_agent2 failed: invalid registration flags specified 0x%x; supported 0x%x\n",
801 ureq
.flags
, IB_USER_MAD_REG_FLAGS_CAP
);
804 if (put_user((u32
)IB_USER_MAD_REG_FLAGS_CAP
,
805 (u32 __user
*) (arg
+ offsetof(struct
806 ib_user_mad_reg_req2
, flags
))))
812 for (agent_id
= 0; agent_id
< IB_UMAD_MAX_AGENTS
; ++agent_id
)
813 if (!__get_agent(file
, agent_id
))
816 dev_notice(&file
->port
->dev
,
817 "ib_umad_reg_agent2: Max Agents (%u) reached\n",
823 if (ureq
.mgmt_class
) {
824 memset(&req
, 0, sizeof(req
));
825 req
.mgmt_class
= ureq
.mgmt_class
;
826 req
.mgmt_class_version
= ureq
.mgmt_class_version
;
827 if (ureq
.oui
& 0xff000000) {
828 dev_notice(&file
->port
->dev
,
829 "ib_umad_reg_agent2 failed: oui invalid 0x%08x\n",
834 req
.oui
[2] = ureq
.oui
& 0x0000ff;
835 req
.oui
[1] = (ureq
.oui
& 0x00ff00) >> 8;
836 req
.oui
[0] = (ureq
.oui
& 0xff0000) >> 16;
837 memcpy(req
.method_mask
, ureq
.method_mask
,
838 sizeof(req
.method_mask
));
841 agent
= ib_register_mad_agent(file
->port
->ib_dev
, file
->port
->port_num
,
842 ureq
.qpn
? IB_QPT_GSI
: IB_QPT_SMI
,
843 ureq
.mgmt_class
? &req
: NULL
,
845 send_handler
, recv_handler
, file
,
848 ret
= PTR_ERR(agent
);
853 if (put_user(agent_id
,
855 offsetof(struct ib_user_mad_reg_req2
, id
)))) {
860 if (!file
->already_used
) {
861 file
->already_used
= 1;
862 file
->use_pkey_index
= 1;
865 file
->agent
[agent_id
] = agent
;
869 mutex_unlock(&file
->mutex
);
872 ib_unregister_mad_agent(agent
);
874 mutex_unlock(&file
->port
->file_mutex
);
880 static int ib_umad_unreg_agent(struct ib_umad_file
*file
, u32 __user
*arg
)
882 struct ib_mad_agent
*agent
= NULL
;
886 if (get_user(id
, arg
))
888 if (id
>= IB_UMAD_MAX_AGENTS
)
891 mutex_lock(&file
->port
->file_mutex
);
892 mutex_lock(&file
->mutex
);
894 id
= array_index_nospec(id
, IB_UMAD_MAX_AGENTS
);
895 if (!__get_agent(file
, id
)) {
900 agent
= file
->agent
[id
];
901 file
->agent
[id
] = NULL
;
904 mutex_unlock(&file
->mutex
);
907 ib_unregister_mad_agent(agent
);
909 mutex_unlock(&file
->port
->file_mutex
);
914 static long ib_umad_enable_pkey(struct ib_umad_file
*file
)
918 mutex_lock(&file
->mutex
);
919 if (file
->already_used
)
922 file
->use_pkey_index
= 1;
923 mutex_unlock(&file
->mutex
);
928 static long ib_umad_ioctl(struct file
*filp
, unsigned int cmd
,
932 case IB_USER_MAD_REGISTER_AGENT
:
933 return ib_umad_reg_agent(filp
->private_data
, (void __user
*) arg
, 0);
934 case IB_USER_MAD_UNREGISTER_AGENT
:
935 return ib_umad_unreg_agent(filp
->private_data
, (__u32 __user
*) arg
);
936 case IB_USER_MAD_ENABLE_PKEY
:
937 return ib_umad_enable_pkey(filp
->private_data
);
938 case IB_USER_MAD_REGISTER_AGENT2
:
939 return ib_umad_reg_agent2(filp
->private_data
, (void __user
*) arg
);
946 static long ib_umad_compat_ioctl(struct file
*filp
, unsigned int cmd
,
950 case IB_USER_MAD_REGISTER_AGENT
:
951 return ib_umad_reg_agent(filp
->private_data
, compat_ptr(arg
), 1);
952 case IB_USER_MAD_UNREGISTER_AGENT
:
953 return ib_umad_unreg_agent(filp
->private_data
, compat_ptr(arg
));
954 case IB_USER_MAD_ENABLE_PKEY
:
955 return ib_umad_enable_pkey(filp
->private_data
);
956 case IB_USER_MAD_REGISTER_AGENT2
:
957 return ib_umad_reg_agent2(filp
->private_data
, compat_ptr(arg
));
965 * ib_umad_open() does not need the BKL:
967 * - the ib_umad_port structures are properly reference counted, and
968 * everything else is purely local to the file being created, so
969 * races against other open calls are not a problem;
970 * - the ioctl method does not affect any global state outside of the
971 * file structure being operated on;
973 static int ib_umad_open(struct inode
*inode
, struct file
*filp
)
975 struct ib_umad_port
*port
;
976 struct ib_umad_file
*file
;
979 port
= container_of(inode
->i_cdev
, struct ib_umad_port
, cdev
);
981 mutex_lock(&port
->file_mutex
);
988 if (!rdma_dev_access_netns(port
->ib_dev
, current
->nsproxy
->net_ns
)) {
993 file
= kzalloc(sizeof(*file
), GFP_KERNEL
);
999 mutex_init(&file
->mutex
);
1000 spin_lock_init(&file
->send_lock
);
1001 INIT_LIST_HEAD(&file
->recv_list
);
1002 INIT_LIST_HEAD(&file
->send_list
);
1003 init_waitqueue_head(&file
->recv_wait
);
1006 filp
->private_data
= file
;
1008 list_add_tail(&file
->port_list
, &port
->file_list
);
1010 stream_open(inode
, filp
);
1012 mutex_unlock(&port
->file_mutex
);
1016 static int ib_umad_close(struct inode
*inode
, struct file
*filp
)
1018 struct ib_umad_file
*file
= filp
->private_data
;
1019 struct ib_umad_packet
*packet
, *tmp
;
1023 mutex_lock(&file
->port
->file_mutex
);
1024 mutex_lock(&file
->mutex
);
1026 already_dead
= file
->agents_dead
;
1027 file
->agents_dead
= 1;
1029 list_for_each_entry_safe(packet
, tmp
, &file
->recv_list
, list
) {
1030 if (packet
->recv_wc
)
1031 ib_free_recv_mad(packet
->recv_wc
);
1035 list_del(&file
->port_list
);
1037 mutex_unlock(&file
->mutex
);
1040 for (i
= 0; i
< IB_UMAD_MAX_AGENTS
; ++i
)
1042 ib_unregister_mad_agent(file
->agent
[i
]);
1044 mutex_unlock(&file
->port
->file_mutex
);
1045 mutex_destroy(&file
->mutex
);
1050 static const struct file_operations umad_fops
= {
1051 .owner
= THIS_MODULE
,
1052 .read
= ib_umad_read
,
1053 .write
= ib_umad_write
,
1054 .poll
= ib_umad_poll
,
1055 .unlocked_ioctl
= ib_umad_ioctl
,
1056 #ifdef CONFIG_COMPAT
1057 .compat_ioctl
= ib_umad_compat_ioctl
,
1059 .open
= ib_umad_open
,
1060 .release
= ib_umad_close
,
1061 .llseek
= no_llseek
,
1064 static int ib_umad_sm_open(struct inode
*inode
, struct file
*filp
)
1066 struct ib_umad_port
*port
;
1067 struct ib_port_modify props
= {
1068 .set_port_cap_mask
= IB_PORT_SM
1072 port
= container_of(inode
->i_cdev
, struct ib_umad_port
, sm_cdev
);
1074 if (filp
->f_flags
& O_NONBLOCK
) {
1075 if (down_trylock(&port
->sm_sem
)) {
1080 if (down_interruptible(&port
->sm_sem
)) {
1086 if (!rdma_dev_access_netns(port
->ib_dev
, current
->nsproxy
->net_ns
)) {
1091 ret
= ib_modify_port(port
->ib_dev
, port
->port_num
, 0, &props
);
1095 filp
->private_data
= port
;
1097 nonseekable_open(inode
, filp
);
1107 static int ib_umad_sm_close(struct inode
*inode
, struct file
*filp
)
1109 struct ib_umad_port
*port
= filp
->private_data
;
1110 struct ib_port_modify props
= {
1111 .clr_port_cap_mask
= IB_PORT_SM
1115 mutex_lock(&port
->file_mutex
);
1117 ret
= ib_modify_port(port
->ib_dev
, port
->port_num
, 0, &props
);
1118 mutex_unlock(&port
->file_mutex
);
1125 static const struct file_operations umad_sm_fops
= {
1126 .owner
= THIS_MODULE
,
1127 .open
= ib_umad_sm_open
,
1128 .release
= ib_umad_sm_close
,
1129 .llseek
= no_llseek
,
1132 static struct ib_umad_port
*get_port(struct ib_device
*ibdev
,
1133 struct ib_umad_device
*umad_dev
,
1137 return ERR_PTR(-EOPNOTSUPP
);
1138 if (!rdma_is_port_valid(ibdev
, port
))
1139 return ERR_PTR(-EINVAL
);
1140 if (!rdma_cap_ib_mad(ibdev
, port
))
1141 return ERR_PTR(-EOPNOTSUPP
);
1143 return &umad_dev
->ports
[port
- rdma_start_port(ibdev
)];
1146 static int ib_umad_get_nl_info(struct ib_device
*ibdev
, void *client_data
,
1147 struct ib_client_nl_info
*res
)
1149 struct ib_umad_port
*port
= get_port(ibdev
, client_data
, res
->port
);
1152 return PTR_ERR(port
);
1154 res
->abi
= IB_USER_MAD_ABI_VERSION
;
1155 res
->cdev
= &port
->dev
;
1159 static struct ib_client umad_client
= {
1161 .add
= ib_umad_add_one
,
1162 .remove
= ib_umad_remove_one
,
1163 .get_nl_info
= ib_umad_get_nl_info
,
1165 MODULE_ALIAS_RDMA_CLIENT("umad");
1167 static int ib_issm_get_nl_info(struct ib_device
*ibdev
, void *client_data
,
1168 struct ib_client_nl_info
*res
)
1170 struct ib_umad_port
*port
= get_port(ibdev
, client_data
, res
->port
);
1173 return PTR_ERR(port
);
1175 res
->abi
= IB_USER_MAD_ABI_VERSION
;
1176 res
->cdev
= &port
->sm_dev
;
1180 static struct ib_client issm_client
= {
1182 .get_nl_info
= ib_issm_get_nl_info
,
1184 MODULE_ALIAS_RDMA_CLIENT("issm");
1186 static ssize_t
ibdev_show(struct device
*dev
, struct device_attribute
*attr
,
1189 struct ib_umad_port
*port
= dev_get_drvdata(dev
);
1194 return sysfs_emit(buf
, "%s\n", dev_name(&port
->ib_dev
->dev
));
1196 static DEVICE_ATTR_RO(ibdev
);
1198 static ssize_t
port_show(struct device
*dev
, struct device_attribute
*attr
,
1201 struct ib_umad_port
*port
= dev_get_drvdata(dev
);
1206 return sysfs_emit(buf
, "%d\n", port
->port_num
);
1208 static DEVICE_ATTR_RO(port
);
1210 static struct attribute
*umad_class_dev_attrs
[] = {
1211 &dev_attr_ibdev
.attr
,
1212 &dev_attr_port
.attr
,
1215 ATTRIBUTE_GROUPS(umad_class_dev
);
1217 static char *umad_devnode(struct device
*dev
, umode_t
*mode
)
1219 return kasprintf(GFP_KERNEL
, "infiniband/%s", dev_name(dev
));
1222 static ssize_t
abi_version_show(struct class *class,
1223 struct class_attribute
*attr
, char *buf
)
1225 return sysfs_emit(buf
, "%d\n", IB_USER_MAD_ABI_VERSION
);
1227 static CLASS_ATTR_RO(abi_version
);
1229 static struct attribute
*umad_class_attrs
[] = {
1230 &class_attr_abi_version
.attr
,
1233 ATTRIBUTE_GROUPS(umad_class
);
1235 static struct class umad_class
= {
1236 .name
= "infiniband_mad",
1237 .devnode
= umad_devnode
,
1238 .class_groups
= umad_class_groups
,
1239 .dev_groups
= umad_class_dev_groups
,
1242 static void ib_umad_release_port(struct device
*device
)
1244 struct ib_umad_port
*port
= dev_get_drvdata(device
);
1245 struct ib_umad_device
*umad_dev
= port
->umad_dev
;
1247 ib_umad_dev_put(umad_dev
);
1250 static void ib_umad_init_port_dev(struct device
*dev
,
1251 struct ib_umad_port
*port
,
1252 const struct ib_device
*device
)
1254 device_initialize(dev
);
1255 ib_umad_dev_get(port
->umad_dev
);
1256 dev
->class = &umad_class
;
1257 dev
->parent
= device
->dev
.parent
;
1258 dev_set_drvdata(dev
, port
);
1259 dev
->release
= ib_umad_release_port
;
1262 static int ib_umad_init_port(struct ib_device
*device
, int port_num
,
1263 struct ib_umad_device
*umad_dev
,
1264 struct ib_umad_port
*port
)
1271 devnum
= ida_alloc_max(&umad_ida
, IB_UMAD_MAX_PORTS
- 1, GFP_KERNEL
);
1274 port
->dev_num
= devnum
;
1275 if (devnum
>= IB_UMAD_NUM_FIXED_MINOR
) {
1276 base_umad
= dynamic_umad_dev
+ devnum
- IB_UMAD_NUM_FIXED_MINOR
;
1277 base_issm
= dynamic_issm_dev
+ devnum
- IB_UMAD_NUM_FIXED_MINOR
;
1279 base_umad
= devnum
+ base_umad_dev
;
1280 base_issm
= devnum
+ base_issm_dev
;
1283 port
->ib_dev
= device
;
1284 port
->umad_dev
= umad_dev
;
1285 port
->port_num
= port_num
;
1286 sema_init(&port
->sm_sem
, 1);
1287 mutex_init(&port
->file_mutex
);
1288 INIT_LIST_HEAD(&port
->file_list
);
1290 ib_umad_init_port_dev(&port
->dev
, port
, device
);
1291 port
->dev
.devt
= base_umad
;
1292 dev_set_name(&port
->dev
, "umad%d", port
->dev_num
);
1293 cdev_init(&port
->cdev
, &umad_fops
);
1294 port
->cdev
.owner
= THIS_MODULE
;
1296 ret
= cdev_device_add(&port
->cdev
, &port
->dev
);
1300 ib_umad_init_port_dev(&port
->sm_dev
, port
, device
);
1301 port
->sm_dev
.devt
= base_issm
;
1302 dev_set_name(&port
->sm_dev
, "issm%d", port
->dev_num
);
1303 cdev_init(&port
->sm_cdev
, &umad_sm_fops
);
1304 port
->sm_cdev
.owner
= THIS_MODULE
;
1306 ret
= cdev_device_add(&port
->sm_cdev
, &port
->sm_dev
);
1313 put_device(&port
->sm_dev
);
1314 cdev_device_del(&port
->cdev
, &port
->dev
);
1316 put_device(&port
->dev
);
1317 ida_free(&umad_ida
, devnum
);
1321 static void ib_umad_kill_port(struct ib_umad_port
*port
)
1323 struct ib_umad_file
*file
;
1326 cdev_device_del(&port
->sm_cdev
, &port
->sm_dev
);
1327 cdev_device_del(&port
->cdev
, &port
->dev
);
1329 mutex_lock(&port
->file_mutex
);
1331 /* Mark ib_dev NULL and block ioctl or other file ops to progress
1334 port
->ib_dev
= NULL
;
1336 list_for_each_entry(file
, &port
->file_list
, port_list
) {
1337 mutex_lock(&file
->mutex
);
1338 file
->agents_dead
= 1;
1339 mutex_unlock(&file
->mutex
);
1341 for (id
= 0; id
< IB_UMAD_MAX_AGENTS
; ++id
)
1342 if (file
->agent
[id
])
1343 ib_unregister_mad_agent(file
->agent
[id
]);
1346 mutex_unlock(&port
->file_mutex
);
1348 ida_free(&umad_ida
, port
->dev_num
);
1350 /* balances device_initialize() */
1351 put_device(&port
->sm_dev
);
1352 put_device(&port
->dev
);
1355 static int ib_umad_add_one(struct ib_device
*device
)
1357 struct ib_umad_device
*umad_dev
;
1362 s
= rdma_start_port(device
);
1363 e
= rdma_end_port(device
);
1365 umad_dev
= kzalloc(struct_size(umad_dev
, ports
, e
- s
+ 1), GFP_KERNEL
);
1369 kref_init(&umad_dev
->kref
);
1370 for (i
= s
; i
<= e
; ++i
) {
1371 if (!rdma_cap_ib_mad(device
, i
))
1374 ret
= ib_umad_init_port(device
, i
, umad_dev
,
1375 &umad_dev
->ports
[i
- s
]);
1387 ib_set_client_data(device
, &umad_client
, umad_dev
);
1393 if (!rdma_cap_ib_mad(device
, i
))
1396 ib_umad_kill_port(&umad_dev
->ports
[i
- s
]);
1399 /* balances kref_init */
1400 ib_umad_dev_put(umad_dev
);
1404 static void ib_umad_remove_one(struct ib_device
*device
, void *client_data
)
1406 struct ib_umad_device
*umad_dev
= client_data
;
1409 rdma_for_each_port (device
, i
) {
1410 if (rdma_cap_ib_mad(device
, i
))
1412 &umad_dev
->ports
[i
- rdma_start_port(device
)]);
1414 /* balances kref_init() */
1415 ib_umad_dev_put(umad_dev
);
1418 static int __init
ib_umad_init(void)
1422 ret
= register_chrdev_region(base_umad_dev
,
1423 IB_UMAD_NUM_FIXED_MINOR
* 2,
1426 pr_err("couldn't register device number\n");
1430 ret
= alloc_chrdev_region(&dynamic_umad_dev
, 0,
1431 IB_UMAD_NUM_DYNAMIC_MINOR
* 2,
1434 pr_err("couldn't register dynamic device number\n");
1437 dynamic_issm_dev
= dynamic_umad_dev
+ IB_UMAD_NUM_DYNAMIC_MINOR
;
1439 ret
= class_register(&umad_class
);
1441 pr_err("couldn't create class infiniband_mad\n");
1445 ret
= ib_register_client(&umad_client
);
1449 ret
= ib_register_client(&issm_client
);
1456 ib_unregister_client(&umad_client
);
1458 class_unregister(&umad_class
);
1461 unregister_chrdev_region(dynamic_umad_dev
,
1462 IB_UMAD_NUM_DYNAMIC_MINOR
* 2);
1465 unregister_chrdev_region(base_umad_dev
,
1466 IB_UMAD_NUM_FIXED_MINOR
* 2);
1472 static void __exit
ib_umad_cleanup(void)
1474 ib_unregister_client(&issm_client
);
1475 ib_unregister_client(&umad_client
);
1476 class_unregister(&umad_class
);
1477 unregister_chrdev_region(base_umad_dev
,
1478 IB_UMAD_NUM_FIXED_MINOR
* 2);
1479 unregister_chrdev_region(dynamic_umad_dev
,
1480 IB_UMAD_NUM_DYNAMIC_MINOR
* 2);
1483 module_init(ib_umad_init
);
1484 module_exit(ib_umad_cleanup
);