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");
66 #define MAX_UMAD_RECV_LIST_SIZE 200000
69 IB_UMAD_MAX_PORTS
= RDMA_MAX_PORTS
,
70 IB_UMAD_MAX_AGENTS
= 32,
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
,
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().
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
90 * When destroying an ib_umad_device, we drop the module's reference.
98 struct semaphore sm_sem
;
100 struct mutex file_mutex
;
101 struct list_head file_list
;
103 struct ib_device
*ib_dev
;
104 struct ib_umad_device
*umad_dev
;
109 struct ib_umad_device
{
111 struct ib_umad_port ports
[];
114 struct ib_umad_file
{
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
];
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
;
134 struct ib_user_mad mad
;
137 struct ib_rmpp_mad_hdr
{
138 struct ib_mad_hdr mad_hdr
;
139 struct ib_rmpp_hdr rmpp_hdr
;
142 #define CREATE_TRACE_POINTS
143 #include <trace/events/ib_umad.h>
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
;
151 static DEFINE_IDA(umad_ida
);
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
);
156 static void ib_umad_dev_free(struct kref
*kref
)
158 struct ib_umad_device
*dev
=
159 container_of(kref
, struct ib_umad_device
, kref
);
164 static void ib_umad_dev_get(struct ib_umad_device
*dev
)
166 kref_get(&dev
->kref
);
169 static void ib_umad_dev_put(struct ib_umad_device
*dev
)
171 kref_put(&dev
->kref
, ib_umad_dev_free
);
174 static int hdr_size(struct ib_umad_file
*file
)
176 return file
->use_pkey_index
? sizeof(struct ib_user_mad_hdr
) :
177 sizeof(struct ib_user_mad_hdr_old
);
180 /* caller must hold file->mutex */
181 static struct ib_mad_agent
*__get_agent(struct ib_umad_file
*file
, int id
)
183 return file
->agents_dead
? NULL
: file
->agent
[id
];
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
)
191 mutex_lock(&file
->mutex
);
194 atomic_read(&file
->recv_list_size
) > MAX_UMAD_RECV_LIST_SIZE
)
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
);
208 mutex_unlock(&file
->mutex
);
213 static void dequeue_send(struct ib_umad_file
*file
,
214 struct ib_umad_packet
*packet
)
216 spin_lock_irq(&file
->send_lock
);
217 list_del(&packet
->list
);
218 spin_unlock_irq(&file
->send_lock
);
221 static void send_handler(struct ib_mad_agent
*agent
,
222 struct ib_mad_send_wc
*send_wc
)
224 struct ib_umad_file
*file
= agent
->context
;
225 struct ib_umad_packet
*packet
= send_wc
->send_buf
->context
[0];
227 dequeue_send(file
, packet
);
228 rdma_destroy_ah(packet
->msg
->ah
, RDMA_DESTROY_AH_SLEEPABLE
);
229 ib_free_send_mad(packet
->msg
);
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))
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
)
244 struct ib_umad_file
*file
= agent
->context
;
245 struct ib_umad_packet
*packet
;
247 if (mad_recv_wc
->wc
->status
!= IB_WC_SUCCESS
)
250 packet
= kzalloc(sizeof *packet
, GFP_KERNEL
);
254 packet
->length
= mad_recv_wc
->mad_len
;
255 packet
->recv_wc
= mad_recv_wc
;
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
);
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.
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
);
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
;
278 ret
= ib_init_ah_attr_from_wc(agent
->device
, agent
->port_num
,
280 mad_recv_wc
->recv_buf
.grh
,
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
);
294 if (queue_packet(file
, agent
, packet
, true))
301 ib_free_recv_mad(mad_recv_wc
);
304 static ssize_t
copy_recv_mad(struct ib_umad_file
*file
, char __user
*buf
,
305 struct ib_umad_packet
*packet
, size_t count
)
307 struct ib_mad_recv_buf
*recv_buf
;
308 int left
, seg_payload
, offset
, max_seg_payload
;
311 recv_buf
= &packet
->recv_wc
->recv_buf
;
312 seg_size
= packet
->recv_wc
->mad_seg_size
;
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
))
321 if (copy_to_user(buf
, &packet
->mad
, hdr_size(file
)))
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
))
329 if (seg_payload
< packet
->length
) {
331 * Multipacket RMPP MAD message. Copy remainder of message.
332 * Note that last segment may have a shorter payload.
334 if (count
< hdr_size(file
) + packet
->length
) {
336 * The buffer is too small, return the first RMPP segment,
337 * which includes the RMPP message length.
341 offset
= ib_get_mad_data_offset(recv_buf
->mad
->mad_hdr
.mgmt_class
);
342 max_seg_payload
= seg_size
- offset
;
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
,
355 trace_ib_umad_read_recv(file
, &packet
->mad
.hdr
, &recv_buf
->mad
->mad_hdr
);
357 return hdr_size(file
) + packet
->length
;
360 static ssize_t
copy_send_mad(struct ib_umad_file
*file
, char __user
*buf
,
361 struct ib_umad_packet
*packet
, size_t count
)
363 ssize_t size
= hdr_size(file
) + packet
->length
;
368 if (copy_to_user(buf
, &packet
->mad
, hdr_size(file
)))
371 buf
+= hdr_size(file
);
373 if (copy_to_user(buf
, packet
->mad
.data
, packet
->length
))
376 trace_ib_umad_read_send(file
, &packet
->mad
.hdr
,
377 (struct ib_mad_hdr
*)&packet
->mad
.data
);
382 static ssize_t
ib_umad_read(struct file
*filp
, char __user
*buf
,
383 size_t count
, loff_t
*pos
)
385 struct ib_umad_file
*file
= filp
->private_data
;
386 struct ib_umad_packet
*packet
;
389 if (count
< hdr_size(file
))
392 mutex_lock(&file
->mutex
);
394 if (file
->agents_dead
) {
395 mutex_unlock(&file
->mutex
);
399 while (list_empty(&file
->recv_list
)) {
400 mutex_unlock(&file
->mutex
);
402 if (filp
->f_flags
& O_NONBLOCK
)
405 if (wait_event_interruptible(file
->recv_wait
,
406 !list_empty(&file
->recv_list
)))
409 mutex_lock(&file
->mutex
);
412 if (file
->agents_dead
) {
413 mutex_unlock(&file
->mutex
);
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
);
421 mutex_unlock(&file
->mutex
);
424 ret
= copy_recv_mad(file
, buf
, packet
, count
);
426 ret
= copy_send_mad(file
, buf
, packet
, count
);
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
);
436 ib_free_recv_mad(packet
->recv_wc
);
442 static int copy_rmpp_mad(struct ib_mad_send_buf
*msg
, const char __user
*buf
)
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
))
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
)))
462 static int same_destination(struct ib_user_mad_hdr
*hdr1
,
463 struct ib_user_mad_hdr
*hdr2
)
465 if (!hdr1
->grh_present
&& !hdr2
->grh_present
)
466 return (hdr1
->lid
== hdr2
->lid
);
468 if (hdr1
->grh_present
&& hdr2
->grh_present
)
469 return !memcmp(hdr1
->gid
, hdr2
->gid
, 16);
474 static int is_duplicate(struct ib_umad_file
*file
,
475 struct ib_umad_packet
*packet
)
477 struct ib_umad_packet
*sent_packet
;
478 struct ib_mad_hdr
*sent_hdr
, *hdr
;
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
;
484 if ((hdr
->tid
!= sent_hdr
->tid
) ||
485 (hdr
->mgmt_class
!= sent_hdr
->mgmt_class
))
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.
493 if (!ib_response_mad(hdr
)) {
494 if (!ib_response_mad(sent_hdr
))
497 } else if (!ib_response_mad(sent_hdr
))
500 if (same_destination(&packet
->mad
.hdr
, &sent_packet
->mad
.hdr
))
507 static ssize_t
ib_umad_write(struct file
*filp
, const char __user
*buf
,
508 size_t count
, loff_t
*pos
)
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
;
517 int ret
, data_len
, hdr_len
, copy_offset
, rmpp_active
;
520 if (count
< hdr_size(file
) + IB_MGMT_RMPP_HDR
)
523 packet
= kzalloc(sizeof(*packet
) + IB_MGMT_RMPP_HDR
, GFP_KERNEL
);
527 if (copy_from_user(&packet
->mad
, buf
, hdr_size(file
))) {
532 if (packet
->mad
.hdr
.id
>= IB_UMAD_MAX_AGENTS
) {
537 buf
+= hdr_size(file
);
539 if (copy_from_user(packet
->mad
.data
, buf
, IB_MGMT_RMPP_HDR
)) {
544 mutex_lock(&file
->mutex
);
546 trace_ib_umad_write(file
, &packet
->mad
.hdr
,
547 (struct ib_mad_hdr
*)&packet
->mad
.data
);
549 agent
= __get_agent(file
, packet
->mad
.hdr
.id
);
555 memset(&ah_attr
, 0, sizeof ah_attr
);
556 ah_attr
.type
= rdma_ah_find_type(agent
->device
,
557 file
->port
->port_num
);
558 rdma_ah_set_dlid(&ah_attr
, be16_to_cpu(packet
->mad
.hdr
.lid
));
559 rdma_ah_set_sl(&ah_attr
, packet
->mad
.hdr
.sl
);
560 rdma_ah_set_path_bits(&ah_attr
, packet
->mad
.hdr
.path_bits
);
561 rdma_ah_set_port_num(&ah_attr
, file
->port
->port_num
);
562 if (packet
->mad
.hdr
.grh_present
) {
563 rdma_ah_set_grh(&ah_attr
, NULL
,
564 be32_to_cpu(packet
->mad
.hdr
.flow_label
),
565 packet
->mad
.hdr
.gid_index
,
566 packet
->mad
.hdr
.hop_limit
,
567 packet
->mad
.hdr
.traffic_class
);
568 rdma_ah_set_dgid_raw(&ah_attr
, packet
->mad
.hdr
.gid
);
571 ah
= rdma_create_user_ah(agent
->qp
->pd
, &ah_attr
, NULL
);
577 rmpp_mad_hdr
= (struct ib_rmpp_mad_hdr
*)packet
->mad
.data
;
578 hdr_len
= ib_get_mad_data_offset(rmpp_mad_hdr
->mad_hdr
.mgmt_class
);
580 if (ib_is_mad_class_rmpp(rmpp_mad_hdr
->mad_hdr
.mgmt_class
)
581 && ib_mad_kernel_rmpp_agent(agent
)) {
582 copy_offset
= IB_MGMT_RMPP_HDR
;
583 rmpp_active
= ib_get_rmpp_flags(&rmpp_mad_hdr
->rmpp_hdr
) &
584 IB_MGMT_RMPP_FLAG_ACTIVE
;
586 copy_offset
= IB_MGMT_MAD_HDR
;
590 base_version
= ((struct ib_mad_hdr
*)&packet
->mad
.data
)->base_version
;
591 data_len
= count
- hdr_size(file
) - hdr_len
;
592 packet
->msg
= ib_create_send_mad(agent
,
593 be32_to_cpu(packet
->mad
.hdr
.qpn
),
594 packet
->mad
.hdr
.pkey_index
, rmpp_active
,
595 hdr_len
, data_len
, GFP_KERNEL
,
597 if (IS_ERR(packet
->msg
)) {
598 ret
= PTR_ERR(packet
->msg
);
602 packet
->msg
->ah
= ah
;
603 packet
->msg
->timeout_ms
= packet
->mad
.hdr
.timeout_ms
;
604 packet
->msg
->retries
= packet
->mad
.hdr
.retries
;
605 packet
->msg
->context
[0] = packet
;
607 /* Copy MAD header. Any RMPP header is already in place. */
608 memcpy(packet
->msg
->mad
, packet
->mad
.data
, IB_MGMT_MAD_HDR
);
611 if (copy_from_user(packet
->msg
->mad
+ copy_offset
,
613 hdr_len
+ data_len
- copy_offset
)) {
618 ret
= copy_rmpp_mad(packet
->msg
, buf
);
624 * Set the high-order part of the transaction ID to make MADs from
625 * different agents unique, and allow routing responses back to the
626 * original requestor.
628 if (!ib_response_mad(packet
->msg
->mad
)) {
629 tid
= &((struct ib_mad_hdr
*) packet
->msg
->mad
)->tid
;
630 *tid
= cpu_to_be64(((u64
) agent
->hi_tid
) << 32 |
631 (be64_to_cpup(tid
) & 0xffffffff));
632 rmpp_mad_hdr
->mad_hdr
.tid
= *tid
;
635 if (!ib_mad_kernel_rmpp_agent(agent
)
636 && ib_is_mad_class_rmpp(rmpp_mad_hdr
->mad_hdr
.mgmt_class
)
637 && (ib_get_rmpp_flags(&rmpp_mad_hdr
->rmpp_hdr
) & IB_MGMT_RMPP_FLAG_ACTIVE
)) {
638 spin_lock_irq(&file
->send_lock
);
639 list_add_tail(&packet
->list
, &file
->send_list
);
640 spin_unlock_irq(&file
->send_lock
);
642 spin_lock_irq(&file
->send_lock
);
643 ret
= is_duplicate(file
, packet
);
645 list_add_tail(&packet
->list
, &file
->send_list
);
646 spin_unlock_irq(&file
->send_lock
);
653 ret
= ib_post_send_mad(packet
->msg
, NULL
);
657 mutex_unlock(&file
->mutex
);
661 dequeue_send(file
, packet
);
663 ib_free_send_mad(packet
->msg
);
665 rdma_destroy_ah(ah
, RDMA_DESTROY_AH_SLEEPABLE
);
667 mutex_unlock(&file
->mutex
);
673 static __poll_t
ib_umad_poll(struct file
*filp
, struct poll_table_struct
*wait
)
675 struct ib_umad_file
*file
= filp
->private_data
;
677 /* we will always be able to post a MAD send */
678 __poll_t mask
= EPOLLOUT
| EPOLLWRNORM
;
680 mutex_lock(&file
->mutex
);
681 poll_wait(filp
, &file
->recv_wait
, wait
);
683 if (!list_empty(&file
->recv_list
))
684 mask
|= EPOLLIN
| EPOLLRDNORM
;
685 if (file
->agents_dead
)
687 mutex_unlock(&file
->mutex
);
692 static int ib_umad_reg_agent(struct ib_umad_file
*file
, void __user
*arg
,
693 int compat_method_mask
)
695 struct ib_user_mad_reg_req ureq
;
696 struct ib_mad_reg_req req
;
697 struct ib_mad_agent
*agent
= NULL
;
701 mutex_lock(&file
->port
->file_mutex
);
702 mutex_lock(&file
->mutex
);
704 if (!file
->port
->ib_dev
) {
705 dev_notice(&file
->port
->dev
, "%s: invalid device\n", __func__
);
710 if (copy_from_user(&ureq
, arg
, sizeof ureq
)) {
715 if (ureq
.qpn
!= 0 && ureq
.qpn
!= 1) {
716 dev_notice(&file
->port
->dev
,
717 "%s: invalid QPN %u specified\n", __func__
,
723 for (agent_id
= 0; agent_id
< IB_UMAD_MAX_AGENTS
; ++agent_id
)
724 if (!__get_agent(file
, agent_id
))
727 dev_notice(&file
->port
->dev
, "%s: Max Agents (%u) reached\n", __func__
,
734 if (ureq
.mgmt_class
) {
735 memset(&req
, 0, sizeof(req
));
736 req
.mgmt_class
= ureq
.mgmt_class
;
737 req
.mgmt_class_version
= ureq
.mgmt_class_version
;
738 memcpy(req
.oui
, ureq
.oui
, sizeof req
.oui
);
740 if (compat_method_mask
) {
741 u32
*umm
= (u32
*) ureq
.method_mask
;
744 for (i
= 0; i
< BITS_TO_LONGS(IB_MGMT_MAX_METHODS
); ++i
)
746 umm
[i
* 2] | ((u64
) umm
[i
* 2 + 1] << 32);
748 memcpy(req
.method_mask
, ureq
.method_mask
,
749 sizeof req
.method_mask
);
752 agent
= ib_register_mad_agent(file
->port
->ib_dev
, file
->port
->port_num
,
753 ureq
.qpn
? IB_QPT_GSI
: IB_QPT_SMI
,
754 ureq
.mgmt_class
? &req
: NULL
,
756 send_handler
, recv_handler
, file
, 0);
758 ret
= PTR_ERR(agent
);
763 if (put_user(agent_id
,
764 (u32 __user
*) (arg
+ offsetof(struct ib_user_mad_reg_req
, id
)))) {
769 if (!file
->already_used
) {
770 file
->already_used
= 1;
771 if (!file
->use_pkey_index
) {
772 dev_warn(&file
->port
->dev
,
773 "process %s did not enable P_Key index support.\n",
775 dev_warn(&file
->port
->dev
,
776 " Documentation/infiniband/user_mad.rst has info on the new ABI.\n");
780 file
->agent
[agent_id
] = agent
;
784 mutex_unlock(&file
->mutex
);
787 ib_unregister_mad_agent(agent
);
789 mutex_unlock(&file
->port
->file_mutex
);
794 static int ib_umad_reg_agent2(struct ib_umad_file
*file
, void __user
*arg
)
796 struct ib_user_mad_reg_req2 ureq
;
797 struct ib_mad_reg_req req
;
798 struct ib_mad_agent
*agent
= NULL
;
802 mutex_lock(&file
->port
->file_mutex
);
803 mutex_lock(&file
->mutex
);
805 if (!file
->port
->ib_dev
) {
806 dev_notice(&file
->port
->dev
, "%s: invalid device\n", __func__
);
811 if (copy_from_user(&ureq
, arg
, sizeof(ureq
))) {
816 if (ureq
.qpn
!= 0 && ureq
.qpn
!= 1) {
817 dev_notice(&file
->port
->dev
, "%s: invalid QPN %u specified\n",
823 if (ureq
.flags
& ~IB_USER_MAD_REG_FLAGS_CAP
) {
824 dev_notice(&file
->port
->dev
,
825 "%s failed: invalid registration flags specified 0x%x; supported 0x%x\n",
826 __func__
, ureq
.flags
, IB_USER_MAD_REG_FLAGS_CAP
);
829 if (put_user((u32
)IB_USER_MAD_REG_FLAGS_CAP
,
830 (u32 __user
*) (arg
+ offsetof(struct
831 ib_user_mad_reg_req2
, flags
))))
837 for (agent_id
= 0; agent_id
< IB_UMAD_MAX_AGENTS
; ++agent_id
)
838 if (!__get_agent(file
, agent_id
))
841 dev_notice(&file
->port
->dev
, "%s: Max Agents (%u) reached\n", __func__
,
847 if (ureq
.mgmt_class
) {
848 memset(&req
, 0, sizeof(req
));
849 req
.mgmt_class
= ureq
.mgmt_class
;
850 req
.mgmt_class_version
= ureq
.mgmt_class_version
;
851 if (ureq
.oui
& 0xff000000) {
852 dev_notice(&file
->port
->dev
,
853 "%s failed: oui invalid 0x%08x\n", __func__
,
858 req
.oui
[2] = ureq
.oui
& 0x0000ff;
859 req
.oui
[1] = (ureq
.oui
& 0x00ff00) >> 8;
860 req
.oui
[0] = (ureq
.oui
& 0xff0000) >> 16;
861 memcpy(req
.method_mask
, ureq
.method_mask
,
862 sizeof(req
.method_mask
));
865 agent
= ib_register_mad_agent(file
->port
->ib_dev
, file
->port
->port_num
,
866 ureq
.qpn
? IB_QPT_GSI
: IB_QPT_SMI
,
867 ureq
.mgmt_class
? &req
: NULL
,
869 send_handler
, recv_handler
, file
,
872 ret
= PTR_ERR(agent
);
877 if (put_user(agent_id
,
879 offsetof(struct ib_user_mad_reg_req2
, id
)))) {
884 if (!file
->already_used
) {
885 file
->already_used
= 1;
886 file
->use_pkey_index
= 1;
889 file
->agent
[agent_id
] = agent
;
893 mutex_unlock(&file
->mutex
);
896 ib_unregister_mad_agent(agent
);
898 mutex_unlock(&file
->port
->file_mutex
);
904 static int ib_umad_unreg_agent(struct ib_umad_file
*file
, u32 __user
*arg
)
906 struct ib_mad_agent
*agent
= NULL
;
910 if (get_user(id
, arg
))
912 if (id
>= IB_UMAD_MAX_AGENTS
)
915 mutex_lock(&file
->port
->file_mutex
);
916 mutex_lock(&file
->mutex
);
918 id
= array_index_nospec(id
, IB_UMAD_MAX_AGENTS
);
919 if (!__get_agent(file
, id
)) {
924 agent
= file
->agent
[id
];
925 file
->agent
[id
] = NULL
;
928 mutex_unlock(&file
->mutex
);
931 ib_unregister_mad_agent(agent
);
933 mutex_unlock(&file
->port
->file_mutex
);
938 static long ib_umad_enable_pkey(struct ib_umad_file
*file
)
942 mutex_lock(&file
->mutex
);
943 if (file
->already_used
)
946 file
->use_pkey_index
= 1;
947 mutex_unlock(&file
->mutex
);
952 static long ib_umad_ioctl(struct file
*filp
, unsigned int cmd
,
956 case IB_USER_MAD_REGISTER_AGENT
:
957 return ib_umad_reg_agent(filp
->private_data
, (void __user
*) arg
, 0);
958 case IB_USER_MAD_UNREGISTER_AGENT
:
959 return ib_umad_unreg_agent(filp
->private_data
, (__u32 __user
*) arg
);
960 case IB_USER_MAD_ENABLE_PKEY
:
961 return ib_umad_enable_pkey(filp
->private_data
);
962 case IB_USER_MAD_REGISTER_AGENT2
:
963 return ib_umad_reg_agent2(filp
->private_data
, (void __user
*) arg
);
970 static long ib_umad_compat_ioctl(struct file
*filp
, unsigned int cmd
,
974 case IB_USER_MAD_REGISTER_AGENT
:
975 return ib_umad_reg_agent(filp
->private_data
, compat_ptr(arg
), 1);
976 case IB_USER_MAD_UNREGISTER_AGENT
:
977 return ib_umad_unreg_agent(filp
->private_data
, compat_ptr(arg
));
978 case IB_USER_MAD_ENABLE_PKEY
:
979 return ib_umad_enable_pkey(filp
->private_data
);
980 case IB_USER_MAD_REGISTER_AGENT2
:
981 return ib_umad_reg_agent2(filp
->private_data
, compat_ptr(arg
));
989 * ib_umad_open() does not need the BKL:
991 * - the ib_umad_port structures are properly reference counted, and
992 * everything else is purely local to the file being created, so
993 * races against other open calls are not a problem;
994 * - the ioctl method does not affect any global state outside of the
995 * file structure being operated on;
997 static int ib_umad_open(struct inode
*inode
, struct file
*filp
)
999 struct ib_umad_port
*port
;
1000 struct ib_umad_file
*file
;
1003 port
= container_of(inode
->i_cdev
, struct ib_umad_port
, cdev
);
1005 mutex_lock(&port
->file_mutex
);
1007 if (!port
->ib_dev
) {
1012 if (!rdma_dev_access_netns(port
->ib_dev
, current
->nsproxy
->net_ns
)) {
1017 file
= kzalloc(sizeof(*file
), GFP_KERNEL
);
1023 mutex_init(&file
->mutex
);
1024 spin_lock_init(&file
->send_lock
);
1025 INIT_LIST_HEAD(&file
->recv_list
);
1026 INIT_LIST_HEAD(&file
->send_list
);
1027 init_waitqueue_head(&file
->recv_wait
);
1030 filp
->private_data
= file
;
1032 list_add_tail(&file
->port_list
, &port
->file_list
);
1034 stream_open(inode
, filp
);
1036 mutex_unlock(&port
->file_mutex
);
1040 static int ib_umad_close(struct inode
*inode
, struct file
*filp
)
1042 struct ib_umad_file
*file
= filp
->private_data
;
1043 struct ib_umad_packet
*packet
, *tmp
;
1047 mutex_lock(&file
->port
->file_mutex
);
1048 mutex_lock(&file
->mutex
);
1050 already_dead
= file
->agents_dead
;
1051 file
->agents_dead
= 1;
1053 list_for_each_entry_safe(packet
, tmp
, &file
->recv_list
, list
) {
1054 if (packet
->recv_wc
)
1055 ib_free_recv_mad(packet
->recv_wc
);
1059 list_del(&file
->port_list
);
1061 mutex_unlock(&file
->mutex
);
1064 for (i
= 0; i
< IB_UMAD_MAX_AGENTS
; ++i
)
1066 ib_unregister_mad_agent(file
->agent
[i
]);
1068 mutex_unlock(&file
->port
->file_mutex
);
1069 mutex_destroy(&file
->mutex
);
1074 static const struct file_operations umad_fops
= {
1075 .owner
= THIS_MODULE
,
1076 .read
= ib_umad_read
,
1077 .write
= ib_umad_write
,
1078 .poll
= ib_umad_poll
,
1079 .unlocked_ioctl
= ib_umad_ioctl
,
1080 #ifdef CONFIG_COMPAT
1081 .compat_ioctl
= ib_umad_compat_ioctl
,
1083 .open
= ib_umad_open
,
1084 .release
= ib_umad_close
,
1087 static int ib_umad_sm_open(struct inode
*inode
, struct file
*filp
)
1089 struct ib_umad_port
*port
;
1090 struct ib_port_modify props
= {
1091 .set_port_cap_mask
= IB_PORT_SM
1095 port
= container_of(inode
->i_cdev
, struct ib_umad_port
, sm_cdev
);
1097 if (filp
->f_flags
& O_NONBLOCK
) {
1098 if (down_trylock(&port
->sm_sem
)) {
1103 if (down_interruptible(&port
->sm_sem
)) {
1109 if (!rdma_dev_access_netns(port
->ib_dev
, current
->nsproxy
->net_ns
)) {
1114 ret
= ib_modify_port(port
->ib_dev
, port
->port_num
, 0, &props
);
1118 filp
->private_data
= port
;
1120 nonseekable_open(inode
, filp
);
1130 static int ib_umad_sm_close(struct inode
*inode
, struct file
*filp
)
1132 struct ib_umad_port
*port
= filp
->private_data
;
1133 struct ib_port_modify props
= {
1134 .clr_port_cap_mask
= IB_PORT_SM
1138 mutex_lock(&port
->file_mutex
);
1140 ret
= ib_modify_port(port
->ib_dev
, port
->port_num
, 0, &props
);
1141 mutex_unlock(&port
->file_mutex
);
1148 static const struct file_operations umad_sm_fops
= {
1149 .owner
= THIS_MODULE
,
1150 .open
= ib_umad_sm_open
,
1151 .release
= ib_umad_sm_close
,
1154 static struct ib_umad_port
*get_port(struct ib_device
*ibdev
,
1155 struct ib_umad_device
*umad_dev
,
1159 return ERR_PTR(-EOPNOTSUPP
);
1160 if (!rdma_is_port_valid(ibdev
, port
))
1161 return ERR_PTR(-EINVAL
);
1162 if (!rdma_cap_ib_mad(ibdev
, port
))
1163 return ERR_PTR(-EOPNOTSUPP
);
1165 return &umad_dev
->ports
[port
- rdma_start_port(ibdev
)];
1168 static int ib_umad_get_nl_info(struct ib_device
*ibdev
, void *client_data
,
1169 struct ib_client_nl_info
*res
)
1171 struct ib_umad_port
*port
= get_port(ibdev
, client_data
, res
->port
);
1174 return PTR_ERR(port
);
1176 res
->abi
= IB_USER_MAD_ABI_VERSION
;
1177 res
->cdev
= &port
->dev
;
1181 static struct ib_client umad_client
= {
1183 .add
= ib_umad_add_one
,
1184 .remove
= ib_umad_remove_one
,
1185 .get_nl_info
= ib_umad_get_nl_info
,
1187 MODULE_ALIAS_RDMA_CLIENT("umad");
1189 static int ib_issm_get_nl_info(struct ib_device
*ibdev
, void *client_data
,
1190 struct ib_client_nl_info
*res
)
1192 struct ib_umad_port
*port
= get_port(ibdev
, client_data
, res
->port
);
1195 return PTR_ERR(port
);
1197 res
->abi
= IB_USER_MAD_ABI_VERSION
;
1198 res
->cdev
= &port
->sm_dev
;
1202 static struct ib_client issm_client
= {
1204 .get_nl_info
= ib_issm_get_nl_info
,
1206 MODULE_ALIAS_RDMA_CLIENT("issm");
1208 static ssize_t
ibdev_show(struct device
*dev
, struct device_attribute
*attr
,
1211 struct ib_umad_port
*port
= dev_get_drvdata(dev
);
1216 return sysfs_emit(buf
, "%s\n", dev_name(&port
->ib_dev
->dev
));
1218 static DEVICE_ATTR_RO(ibdev
);
1220 static ssize_t
port_show(struct device
*dev
, struct device_attribute
*attr
,
1223 struct ib_umad_port
*port
= dev_get_drvdata(dev
);
1228 return sysfs_emit(buf
, "%d\n", port
->port_num
);
1230 static DEVICE_ATTR_RO(port
);
1232 static struct attribute
*umad_class_dev_attrs
[] = {
1233 &dev_attr_ibdev
.attr
,
1234 &dev_attr_port
.attr
,
1237 ATTRIBUTE_GROUPS(umad_class_dev
);
1239 static char *umad_devnode(const struct device
*dev
, umode_t
*mode
)
1241 return kasprintf(GFP_KERNEL
, "infiniband/%s", dev_name(dev
));
1244 static ssize_t
abi_version_show(const struct class *class,
1245 const struct class_attribute
*attr
, char *buf
)
1247 return sysfs_emit(buf
, "%d\n", IB_USER_MAD_ABI_VERSION
);
1249 static CLASS_ATTR_RO(abi_version
);
1251 static struct attribute
*umad_class_attrs
[] = {
1252 &class_attr_abi_version
.attr
,
1255 ATTRIBUTE_GROUPS(umad_class
);
1257 static struct class umad_class
= {
1258 .name
= "infiniband_mad",
1259 .devnode
= umad_devnode
,
1260 .class_groups
= umad_class_groups
,
1261 .dev_groups
= umad_class_dev_groups
,
1264 static void ib_umad_release_port(struct device
*device
)
1266 struct ib_umad_port
*port
= dev_get_drvdata(device
);
1267 struct ib_umad_device
*umad_dev
= port
->umad_dev
;
1269 ib_umad_dev_put(umad_dev
);
1272 static void ib_umad_init_port_dev(struct device
*dev
,
1273 struct ib_umad_port
*port
,
1274 const struct ib_device
*device
)
1276 device_initialize(dev
);
1277 ib_umad_dev_get(port
->umad_dev
);
1278 dev
->class = &umad_class
;
1279 dev
->parent
= device
->dev
.parent
;
1280 dev_set_drvdata(dev
, port
);
1281 dev
->release
= ib_umad_release_port
;
1284 static int ib_umad_init_port(struct ib_device
*device
, int port_num
,
1285 struct ib_umad_device
*umad_dev
,
1286 struct ib_umad_port
*port
)
1293 devnum
= ida_alloc_max(&umad_ida
, IB_UMAD_MAX_PORTS
- 1, GFP_KERNEL
);
1296 port
->dev_num
= devnum
;
1297 if (devnum
>= IB_UMAD_NUM_FIXED_MINOR
) {
1298 base_umad
= dynamic_umad_dev
+ devnum
- IB_UMAD_NUM_FIXED_MINOR
;
1299 base_issm
= dynamic_issm_dev
+ devnum
- IB_UMAD_NUM_FIXED_MINOR
;
1301 base_umad
= devnum
+ base_umad_dev
;
1302 base_issm
= devnum
+ base_issm_dev
;
1305 port
->ib_dev
= device
;
1306 port
->umad_dev
= umad_dev
;
1307 port
->port_num
= port_num
;
1308 sema_init(&port
->sm_sem
, 1);
1309 mutex_init(&port
->file_mutex
);
1310 INIT_LIST_HEAD(&port
->file_list
);
1312 ib_umad_init_port_dev(&port
->dev
, port
, device
);
1313 port
->dev
.devt
= base_umad
;
1314 dev_set_name(&port
->dev
, "umad%d", port
->dev_num
);
1315 cdev_init(&port
->cdev
, &umad_fops
);
1316 port
->cdev
.owner
= THIS_MODULE
;
1318 ret
= cdev_device_add(&port
->cdev
, &port
->dev
);
1322 if (rdma_cap_ib_smi(device
, port_num
)) {
1323 ib_umad_init_port_dev(&port
->sm_dev
, port
, device
);
1324 port
->sm_dev
.devt
= base_issm
;
1325 dev_set_name(&port
->sm_dev
, "issm%d", port
->dev_num
);
1326 cdev_init(&port
->sm_cdev
, &umad_sm_fops
);
1327 port
->sm_cdev
.owner
= THIS_MODULE
;
1329 ret
= cdev_device_add(&port
->sm_cdev
, &port
->sm_dev
);
1337 put_device(&port
->sm_dev
);
1338 cdev_device_del(&port
->cdev
, &port
->dev
);
1340 put_device(&port
->dev
);
1341 ida_free(&umad_ida
, devnum
);
1345 static void ib_umad_kill_port(struct ib_umad_port
*port
)
1347 struct ib_umad_file
*file
;
1348 bool has_smi
= false;
1351 if (rdma_cap_ib_smi(port
->ib_dev
, port
->port_num
)) {
1352 cdev_device_del(&port
->sm_cdev
, &port
->sm_dev
);
1355 cdev_device_del(&port
->cdev
, &port
->dev
);
1357 mutex_lock(&port
->file_mutex
);
1359 /* Mark ib_dev NULL and block ioctl or other file ops to progress
1362 port
->ib_dev
= NULL
;
1364 list_for_each_entry(file
, &port
->file_list
, port_list
) {
1365 mutex_lock(&file
->mutex
);
1366 file
->agents_dead
= 1;
1367 wake_up_interruptible(&file
->recv_wait
);
1368 mutex_unlock(&file
->mutex
);
1370 for (id
= 0; id
< IB_UMAD_MAX_AGENTS
; ++id
)
1371 if (file
->agent
[id
])
1372 ib_unregister_mad_agent(file
->agent
[id
]);
1375 mutex_unlock(&port
->file_mutex
);
1377 ida_free(&umad_ida
, port
->dev_num
);
1379 /* balances device_initialize() */
1381 put_device(&port
->sm_dev
);
1382 put_device(&port
->dev
);
1385 static int ib_umad_add_one(struct ib_device
*device
)
1387 struct ib_umad_device
*umad_dev
;
1392 s
= rdma_start_port(device
);
1393 e
= rdma_end_port(device
);
1395 umad_dev
= kzalloc(struct_size(umad_dev
, ports
,
1396 size_add(size_sub(e
, s
), 1)),
1401 kref_init(&umad_dev
->kref
);
1402 for (i
= s
; i
<= e
; ++i
) {
1403 if (!rdma_cap_ib_mad(device
, i
))
1406 ret
= ib_umad_init_port(device
, i
, umad_dev
,
1407 &umad_dev
->ports
[i
- s
]);
1419 ib_set_client_data(device
, &umad_client
, umad_dev
);
1425 if (!rdma_cap_ib_mad(device
, i
))
1428 ib_umad_kill_port(&umad_dev
->ports
[i
- s
]);
1431 /* balances kref_init */
1432 ib_umad_dev_put(umad_dev
);
1436 static void ib_umad_remove_one(struct ib_device
*device
, void *client_data
)
1438 struct ib_umad_device
*umad_dev
= client_data
;
1441 rdma_for_each_port (device
, i
) {
1442 if (rdma_cap_ib_mad(device
, i
))
1444 &umad_dev
->ports
[i
- rdma_start_port(device
)]);
1446 /* balances kref_init() */
1447 ib_umad_dev_put(umad_dev
);
1450 static int __init
ib_umad_init(void)
1454 ret
= register_chrdev_region(base_umad_dev
,
1455 IB_UMAD_NUM_FIXED_MINOR
* 2,
1458 pr_err("couldn't register device number\n");
1462 ret
= alloc_chrdev_region(&dynamic_umad_dev
, 0,
1463 IB_UMAD_NUM_DYNAMIC_MINOR
* 2,
1466 pr_err("couldn't register dynamic device number\n");
1469 dynamic_issm_dev
= dynamic_umad_dev
+ IB_UMAD_NUM_DYNAMIC_MINOR
;
1471 ret
= class_register(&umad_class
);
1473 pr_err("couldn't create class infiniband_mad\n");
1477 ret
= ib_register_client(&umad_client
);
1481 ret
= ib_register_client(&issm_client
);
1488 ib_unregister_client(&umad_client
);
1490 class_unregister(&umad_class
);
1493 unregister_chrdev_region(dynamic_umad_dev
,
1494 IB_UMAD_NUM_DYNAMIC_MINOR
* 2);
1497 unregister_chrdev_region(base_umad_dev
,
1498 IB_UMAD_NUM_FIXED_MINOR
* 2);
1504 static void __exit
ib_umad_cleanup(void)
1506 ib_unregister_client(&issm_client
);
1507 ib_unregister_client(&umad_client
);
1508 class_unregister(&umad_class
);
1509 unregister_chrdev_region(base_umad_dev
,
1510 IB_UMAD_NUM_FIXED_MINOR
* 2);
1511 unregister_chrdev_region(dynamic_umad_dev
,
1512 IB_UMAD_NUM_DYNAMIC_MINOR
* 2);
1515 module_init(ib_umad_init
);
1516 module_exit(ib_umad_cleanup
);