]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/infiniband/core/uverbs_cmd.c
IB/core: Change provider's API of create_cq to be extendible
[karo-tx-linux.git] / drivers / infiniband / core / uverbs_cmd.c
1 /*
2  * Copyright (c) 2005 Topspin Communications.  All rights reserved.
3  * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
4  * Copyright (c) 2005 PathScale, Inc.  All rights reserved.
5  * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.
6  *
7  * This software is available to you under a choice of one of two
8  * licenses.  You may choose to be licensed under the terms of the GNU
9  * General Public License (GPL) Version 2, available from the file
10  * COPYING in the main directory of this source tree, or the
11  * OpenIB.org BSD license below:
12  *
13  *     Redistribution and use in source and binary forms, with or
14  *     without modification, are permitted provided that the following
15  *     conditions are met:
16  *
17  *      - Redistributions of source code must retain the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer.
20  *
21  *      - Redistributions in binary form must reproduce the above
22  *        copyright notice, this list of conditions and the following
23  *        disclaimer in the documentation and/or other materials
24  *        provided with the distribution.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33  * SOFTWARE.
34  */
35
36 #include <linux/file.h>
37 #include <linux/fs.h>
38 #include <linux/slab.h>
39 #include <linux/sched.h>
40
41 #include <asm/uaccess.h>
42
43 #include "uverbs.h"
44 #include "core_priv.h"
45
46 struct uverbs_lock_class {
47         struct lock_class_key   key;
48         char                    name[16];
49 };
50
51 static struct uverbs_lock_class pd_lock_class   = { .name = "PD-uobj" };
52 static struct uverbs_lock_class mr_lock_class   = { .name = "MR-uobj" };
53 static struct uverbs_lock_class mw_lock_class   = { .name = "MW-uobj" };
54 static struct uverbs_lock_class cq_lock_class   = { .name = "CQ-uobj" };
55 static struct uverbs_lock_class qp_lock_class   = { .name = "QP-uobj" };
56 static struct uverbs_lock_class ah_lock_class   = { .name = "AH-uobj" };
57 static struct uverbs_lock_class srq_lock_class  = { .name = "SRQ-uobj" };
58 static struct uverbs_lock_class xrcd_lock_class = { .name = "XRCD-uobj" };
59 static struct uverbs_lock_class rule_lock_class = { .name = "RULE-uobj" };
60
61 /*
62  * The ib_uobject locking scheme is as follows:
63  *
64  * - ib_uverbs_idr_lock protects the uverbs idrs themselves, so it
65  *   needs to be held during all idr operations.  When an object is
66  *   looked up, a reference must be taken on the object's kref before
67  *   dropping this lock.
68  *
69  * - Each object also has an rwsem.  This rwsem must be held for
70  *   reading while an operation that uses the object is performed.
71  *   For example, while registering an MR, the associated PD's
72  *   uobject.mutex must be held for reading.  The rwsem must be held
73  *   for writing while initializing or destroying an object.
74  *
75  * - In addition, each object has a "live" flag.  If this flag is not
76  *   set, then lookups of the object will fail even if it is found in
77  *   the idr.  This handles a reader that blocks and does not acquire
78  *   the rwsem until after the object is destroyed.  The destroy
79  *   operation will set the live flag to 0 and then drop the rwsem;
80  *   this will allow the reader to acquire the rwsem, see that the
81  *   live flag is 0, and then drop the rwsem and its reference to
82  *   object.  The underlying storage will not be freed until the last
83  *   reference to the object is dropped.
84  */
85
86 static void init_uobj(struct ib_uobject *uobj, u64 user_handle,
87                       struct ib_ucontext *context, struct uverbs_lock_class *c)
88 {
89         uobj->user_handle = user_handle;
90         uobj->context     = context;
91         kref_init(&uobj->ref);
92         init_rwsem(&uobj->mutex);
93         lockdep_set_class_and_name(&uobj->mutex, &c->key, c->name);
94         uobj->live        = 0;
95 }
96
97 static void release_uobj(struct kref *kref)
98 {
99         kfree(container_of(kref, struct ib_uobject, ref));
100 }
101
102 static void put_uobj(struct ib_uobject *uobj)
103 {
104         kref_put(&uobj->ref, release_uobj);
105 }
106
107 static void put_uobj_read(struct ib_uobject *uobj)
108 {
109         up_read(&uobj->mutex);
110         put_uobj(uobj);
111 }
112
113 static void put_uobj_write(struct ib_uobject *uobj)
114 {
115         up_write(&uobj->mutex);
116         put_uobj(uobj);
117 }
118
119 static int idr_add_uobj(struct idr *idr, struct ib_uobject *uobj)
120 {
121         int ret;
122
123         idr_preload(GFP_KERNEL);
124         spin_lock(&ib_uverbs_idr_lock);
125
126         ret = idr_alloc(idr, uobj, 0, 0, GFP_NOWAIT);
127         if (ret >= 0)
128                 uobj->id = ret;
129
130         spin_unlock(&ib_uverbs_idr_lock);
131         idr_preload_end();
132
133         return ret < 0 ? ret : 0;
134 }
135
136 void idr_remove_uobj(struct idr *idr, struct ib_uobject *uobj)
137 {
138         spin_lock(&ib_uverbs_idr_lock);
139         idr_remove(idr, uobj->id);
140         spin_unlock(&ib_uverbs_idr_lock);
141 }
142
143 static struct ib_uobject *__idr_get_uobj(struct idr *idr, int id,
144                                          struct ib_ucontext *context)
145 {
146         struct ib_uobject *uobj;
147
148         spin_lock(&ib_uverbs_idr_lock);
149         uobj = idr_find(idr, id);
150         if (uobj) {
151                 if (uobj->context == context)
152                         kref_get(&uobj->ref);
153                 else
154                         uobj = NULL;
155         }
156         spin_unlock(&ib_uverbs_idr_lock);
157
158         return uobj;
159 }
160
161 static struct ib_uobject *idr_read_uobj(struct idr *idr, int id,
162                                         struct ib_ucontext *context, int nested)
163 {
164         struct ib_uobject *uobj;
165
166         uobj = __idr_get_uobj(idr, id, context);
167         if (!uobj)
168                 return NULL;
169
170         if (nested)
171                 down_read_nested(&uobj->mutex, SINGLE_DEPTH_NESTING);
172         else
173                 down_read(&uobj->mutex);
174         if (!uobj->live) {
175                 put_uobj_read(uobj);
176                 return NULL;
177         }
178
179         return uobj;
180 }
181
182 static struct ib_uobject *idr_write_uobj(struct idr *idr, int id,
183                                          struct ib_ucontext *context)
184 {
185         struct ib_uobject *uobj;
186
187         uobj = __idr_get_uobj(idr, id, context);
188         if (!uobj)
189                 return NULL;
190
191         down_write(&uobj->mutex);
192         if (!uobj->live) {
193                 put_uobj_write(uobj);
194                 return NULL;
195         }
196
197         return uobj;
198 }
199
200 static void *idr_read_obj(struct idr *idr, int id, struct ib_ucontext *context,
201                           int nested)
202 {
203         struct ib_uobject *uobj;
204
205         uobj = idr_read_uobj(idr, id, context, nested);
206         return uobj ? uobj->object : NULL;
207 }
208
209 static struct ib_pd *idr_read_pd(int pd_handle, struct ib_ucontext *context)
210 {
211         return idr_read_obj(&ib_uverbs_pd_idr, pd_handle, context, 0);
212 }
213
214 static void put_pd_read(struct ib_pd *pd)
215 {
216         put_uobj_read(pd->uobject);
217 }
218
219 static struct ib_cq *idr_read_cq(int cq_handle, struct ib_ucontext *context, int nested)
220 {
221         return idr_read_obj(&ib_uverbs_cq_idr, cq_handle, context, nested);
222 }
223
224 static void put_cq_read(struct ib_cq *cq)
225 {
226         put_uobj_read(cq->uobject);
227 }
228
229 static struct ib_ah *idr_read_ah(int ah_handle, struct ib_ucontext *context)
230 {
231         return idr_read_obj(&ib_uverbs_ah_idr, ah_handle, context, 0);
232 }
233
234 static void put_ah_read(struct ib_ah *ah)
235 {
236         put_uobj_read(ah->uobject);
237 }
238
239 static struct ib_qp *idr_read_qp(int qp_handle, struct ib_ucontext *context)
240 {
241         return idr_read_obj(&ib_uverbs_qp_idr, qp_handle, context, 0);
242 }
243
244 static struct ib_qp *idr_write_qp(int qp_handle, struct ib_ucontext *context)
245 {
246         struct ib_uobject *uobj;
247
248         uobj = idr_write_uobj(&ib_uverbs_qp_idr, qp_handle, context);
249         return uobj ? uobj->object : NULL;
250 }
251
252 static void put_qp_read(struct ib_qp *qp)
253 {
254         put_uobj_read(qp->uobject);
255 }
256
257 static void put_qp_write(struct ib_qp *qp)
258 {
259         put_uobj_write(qp->uobject);
260 }
261
262 static struct ib_srq *idr_read_srq(int srq_handle, struct ib_ucontext *context)
263 {
264         return idr_read_obj(&ib_uverbs_srq_idr, srq_handle, context, 0);
265 }
266
267 static void put_srq_read(struct ib_srq *srq)
268 {
269         put_uobj_read(srq->uobject);
270 }
271
272 static struct ib_xrcd *idr_read_xrcd(int xrcd_handle, struct ib_ucontext *context,
273                                      struct ib_uobject **uobj)
274 {
275         *uobj = idr_read_uobj(&ib_uverbs_xrcd_idr, xrcd_handle, context, 0);
276         return *uobj ? (*uobj)->object : NULL;
277 }
278
279 static void put_xrcd_read(struct ib_uobject *uobj)
280 {
281         put_uobj_read(uobj);
282 }
283
284 ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
285                               const char __user *buf,
286                               int in_len, int out_len)
287 {
288         struct ib_uverbs_get_context      cmd;
289         struct ib_uverbs_get_context_resp resp;
290         struct ib_udata                   udata;
291         struct ib_device                 *ibdev = file->device->ib_dev;
292 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
293         struct ib_device_attr             dev_attr;
294 #endif
295         struct ib_ucontext               *ucontext;
296         struct file                      *filp;
297         int ret;
298
299         if (out_len < sizeof resp)
300                 return -ENOSPC;
301
302         if (copy_from_user(&cmd, buf, sizeof cmd))
303                 return -EFAULT;
304
305         mutex_lock(&file->mutex);
306
307         if (file->ucontext) {
308                 ret = -EINVAL;
309                 goto err;
310         }
311
312         INIT_UDATA(&udata, buf + sizeof cmd,
313                    (unsigned long) cmd.response + sizeof resp,
314                    in_len - sizeof cmd, out_len - sizeof resp);
315
316         ucontext = ibdev->alloc_ucontext(ibdev, &udata);
317         if (IS_ERR(ucontext)) {
318                 ret = PTR_ERR(ucontext);
319                 goto err;
320         }
321
322         ucontext->device = ibdev;
323         INIT_LIST_HEAD(&ucontext->pd_list);
324         INIT_LIST_HEAD(&ucontext->mr_list);
325         INIT_LIST_HEAD(&ucontext->mw_list);
326         INIT_LIST_HEAD(&ucontext->cq_list);
327         INIT_LIST_HEAD(&ucontext->qp_list);
328         INIT_LIST_HEAD(&ucontext->srq_list);
329         INIT_LIST_HEAD(&ucontext->ah_list);
330         INIT_LIST_HEAD(&ucontext->xrcd_list);
331         INIT_LIST_HEAD(&ucontext->rule_list);
332         rcu_read_lock();
333         ucontext->tgid = get_task_pid(current->group_leader, PIDTYPE_PID);
334         rcu_read_unlock();
335         ucontext->closing = 0;
336
337 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
338         ucontext->umem_tree = RB_ROOT;
339         init_rwsem(&ucontext->umem_rwsem);
340         ucontext->odp_mrs_count = 0;
341         INIT_LIST_HEAD(&ucontext->no_private_counters);
342
343         ret = ib_query_device(ibdev, &dev_attr);
344         if (ret)
345                 goto err_free;
346         if (!(dev_attr.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING))
347                 ucontext->invalidate_range = NULL;
348
349 #endif
350
351         resp.num_comp_vectors = file->device->num_comp_vectors;
352
353         ret = get_unused_fd_flags(O_CLOEXEC);
354         if (ret < 0)
355                 goto err_free;
356         resp.async_fd = ret;
357
358         filp = ib_uverbs_alloc_event_file(file, 1);
359         if (IS_ERR(filp)) {
360                 ret = PTR_ERR(filp);
361                 goto err_fd;
362         }
363
364         if (copy_to_user((void __user *) (unsigned long) cmd.response,
365                          &resp, sizeof resp)) {
366                 ret = -EFAULT;
367                 goto err_file;
368         }
369
370         file->async_file = filp->private_data;
371
372         INIT_IB_EVENT_HANDLER(&file->event_handler, file->device->ib_dev,
373                               ib_uverbs_event_handler);
374         ret = ib_register_event_handler(&file->event_handler);
375         if (ret)
376                 goto err_file;
377
378         kref_get(&file->async_file->ref);
379         kref_get(&file->ref);
380         file->ucontext = ucontext;
381
382         fd_install(resp.async_fd, filp);
383
384         mutex_unlock(&file->mutex);
385
386         return in_len;
387
388 err_file:
389         fput(filp);
390
391 err_fd:
392         put_unused_fd(resp.async_fd);
393
394 err_free:
395         put_pid(ucontext->tgid);
396         ibdev->dealloc_ucontext(ucontext);
397
398 err:
399         mutex_unlock(&file->mutex);
400         return ret;
401 }
402
403 static void copy_query_dev_fields(struct ib_uverbs_file *file,
404                                   struct ib_uverbs_query_device_resp *resp,
405                                   struct ib_device_attr *attr)
406 {
407         resp->fw_ver            = attr->fw_ver;
408         resp->node_guid         = file->device->ib_dev->node_guid;
409         resp->sys_image_guid    = attr->sys_image_guid;
410         resp->max_mr_size       = attr->max_mr_size;
411         resp->page_size_cap     = attr->page_size_cap;
412         resp->vendor_id         = attr->vendor_id;
413         resp->vendor_part_id    = attr->vendor_part_id;
414         resp->hw_ver            = attr->hw_ver;
415         resp->max_qp            = attr->max_qp;
416         resp->max_qp_wr         = attr->max_qp_wr;
417         resp->device_cap_flags  = attr->device_cap_flags;
418         resp->max_sge           = attr->max_sge;
419         resp->max_sge_rd        = attr->max_sge_rd;
420         resp->max_cq            = attr->max_cq;
421         resp->max_cqe           = attr->max_cqe;
422         resp->max_mr            = attr->max_mr;
423         resp->max_pd            = attr->max_pd;
424         resp->max_qp_rd_atom    = attr->max_qp_rd_atom;
425         resp->max_ee_rd_atom    = attr->max_ee_rd_atom;
426         resp->max_res_rd_atom   = attr->max_res_rd_atom;
427         resp->max_qp_init_rd_atom       = attr->max_qp_init_rd_atom;
428         resp->max_ee_init_rd_atom       = attr->max_ee_init_rd_atom;
429         resp->atomic_cap                = attr->atomic_cap;
430         resp->max_ee                    = attr->max_ee;
431         resp->max_rdd                   = attr->max_rdd;
432         resp->max_mw                    = attr->max_mw;
433         resp->max_raw_ipv6_qp           = attr->max_raw_ipv6_qp;
434         resp->max_raw_ethy_qp           = attr->max_raw_ethy_qp;
435         resp->max_mcast_grp             = attr->max_mcast_grp;
436         resp->max_mcast_qp_attach       = attr->max_mcast_qp_attach;
437         resp->max_total_mcast_qp_attach = attr->max_total_mcast_qp_attach;
438         resp->max_ah                    = attr->max_ah;
439         resp->max_fmr                   = attr->max_fmr;
440         resp->max_map_per_fmr           = attr->max_map_per_fmr;
441         resp->max_srq                   = attr->max_srq;
442         resp->max_srq_wr                = attr->max_srq_wr;
443         resp->max_srq_sge               = attr->max_srq_sge;
444         resp->max_pkeys                 = attr->max_pkeys;
445         resp->local_ca_ack_delay        = attr->local_ca_ack_delay;
446         resp->phys_port_cnt             = file->device->ib_dev->phys_port_cnt;
447 }
448
449 ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file,
450                                const char __user *buf,
451                                int in_len, int out_len)
452 {
453         struct ib_uverbs_query_device      cmd;
454         struct ib_uverbs_query_device_resp resp;
455         struct ib_device_attr              attr;
456         int                                ret;
457
458         if (out_len < sizeof resp)
459                 return -ENOSPC;
460
461         if (copy_from_user(&cmd, buf, sizeof cmd))
462                 return -EFAULT;
463
464         ret = ib_query_device(file->device->ib_dev, &attr);
465         if (ret)
466                 return ret;
467
468         memset(&resp, 0, sizeof resp);
469         copy_query_dev_fields(file, &resp, &attr);
470
471         if (copy_to_user((void __user *) (unsigned long) cmd.response,
472                          &resp, sizeof resp))
473                 return -EFAULT;
474
475         return in_len;
476 }
477
478 ssize_t ib_uverbs_query_port(struct ib_uverbs_file *file,
479                              const char __user *buf,
480                              int in_len, int out_len)
481 {
482         struct ib_uverbs_query_port      cmd;
483         struct ib_uverbs_query_port_resp resp;
484         struct ib_port_attr              attr;
485         int                              ret;
486
487         if (out_len < sizeof resp)
488                 return -ENOSPC;
489
490         if (copy_from_user(&cmd, buf, sizeof cmd))
491                 return -EFAULT;
492
493         ret = ib_query_port(file->device->ib_dev, cmd.port_num, &attr);
494         if (ret)
495                 return ret;
496
497         memset(&resp, 0, sizeof resp);
498
499         resp.state           = attr.state;
500         resp.max_mtu         = attr.max_mtu;
501         resp.active_mtu      = attr.active_mtu;
502         resp.gid_tbl_len     = attr.gid_tbl_len;
503         resp.port_cap_flags  = attr.port_cap_flags;
504         resp.max_msg_sz      = attr.max_msg_sz;
505         resp.bad_pkey_cntr   = attr.bad_pkey_cntr;
506         resp.qkey_viol_cntr  = attr.qkey_viol_cntr;
507         resp.pkey_tbl_len    = attr.pkey_tbl_len;
508         resp.lid             = attr.lid;
509         resp.sm_lid          = attr.sm_lid;
510         resp.lmc             = attr.lmc;
511         resp.max_vl_num      = attr.max_vl_num;
512         resp.sm_sl           = attr.sm_sl;
513         resp.subnet_timeout  = attr.subnet_timeout;
514         resp.init_type_reply = attr.init_type_reply;
515         resp.active_width    = attr.active_width;
516         resp.active_speed    = attr.active_speed;
517         resp.phys_state      = attr.phys_state;
518         resp.link_layer      = rdma_port_get_link_layer(file->device->ib_dev,
519                                                         cmd.port_num);
520
521         if (copy_to_user((void __user *) (unsigned long) cmd.response,
522                          &resp, sizeof resp))
523                 return -EFAULT;
524
525         return in_len;
526 }
527
528 ssize_t ib_uverbs_alloc_pd(struct ib_uverbs_file *file,
529                            const char __user *buf,
530                            int in_len, int out_len)
531 {
532         struct ib_uverbs_alloc_pd      cmd;
533         struct ib_uverbs_alloc_pd_resp resp;
534         struct ib_udata                udata;
535         struct ib_uobject             *uobj;
536         struct ib_pd                  *pd;
537         int                            ret;
538
539         if (out_len < sizeof resp)
540                 return -ENOSPC;
541
542         if (copy_from_user(&cmd, buf, sizeof cmd))
543                 return -EFAULT;
544
545         INIT_UDATA(&udata, buf + sizeof cmd,
546                    (unsigned long) cmd.response + sizeof resp,
547                    in_len - sizeof cmd, out_len - sizeof resp);
548
549         uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
550         if (!uobj)
551                 return -ENOMEM;
552
553         init_uobj(uobj, 0, file->ucontext, &pd_lock_class);
554         down_write(&uobj->mutex);
555
556         pd = file->device->ib_dev->alloc_pd(file->device->ib_dev,
557                                             file->ucontext, &udata);
558         if (IS_ERR(pd)) {
559                 ret = PTR_ERR(pd);
560                 goto err;
561         }
562
563         pd->device  = file->device->ib_dev;
564         pd->uobject = uobj;
565         atomic_set(&pd->usecnt, 0);
566
567         uobj->object = pd;
568         ret = idr_add_uobj(&ib_uverbs_pd_idr, uobj);
569         if (ret)
570                 goto err_idr;
571
572         memset(&resp, 0, sizeof resp);
573         resp.pd_handle = uobj->id;
574
575         if (copy_to_user((void __user *) (unsigned long) cmd.response,
576                          &resp, sizeof resp)) {
577                 ret = -EFAULT;
578                 goto err_copy;
579         }
580
581         mutex_lock(&file->mutex);
582         list_add_tail(&uobj->list, &file->ucontext->pd_list);
583         mutex_unlock(&file->mutex);
584
585         uobj->live = 1;
586
587         up_write(&uobj->mutex);
588
589         return in_len;
590
591 err_copy:
592         idr_remove_uobj(&ib_uverbs_pd_idr, uobj);
593
594 err_idr:
595         ib_dealloc_pd(pd);
596
597 err:
598         put_uobj_write(uobj);
599         return ret;
600 }
601
602 ssize_t ib_uverbs_dealloc_pd(struct ib_uverbs_file *file,
603                              const char __user *buf,
604                              int in_len, int out_len)
605 {
606         struct ib_uverbs_dealloc_pd cmd;
607         struct ib_uobject          *uobj;
608         int                         ret;
609
610         if (copy_from_user(&cmd, buf, sizeof cmd))
611                 return -EFAULT;
612
613         uobj = idr_write_uobj(&ib_uverbs_pd_idr, cmd.pd_handle, file->ucontext);
614         if (!uobj)
615                 return -EINVAL;
616
617         ret = ib_dealloc_pd(uobj->object);
618         if (!ret)
619                 uobj->live = 0;
620
621         put_uobj_write(uobj);
622
623         if (ret)
624                 return ret;
625
626         idr_remove_uobj(&ib_uverbs_pd_idr, uobj);
627
628         mutex_lock(&file->mutex);
629         list_del(&uobj->list);
630         mutex_unlock(&file->mutex);
631
632         put_uobj(uobj);
633
634         return in_len;
635 }
636
637 struct xrcd_table_entry {
638         struct rb_node  node;
639         struct ib_xrcd *xrcd;
640         struct inode   *inode;
641 };
642
643 static int xrcd_table_insert(struct ib_uverbs_device *dev,
644                             struct inode *inode,
645                             struct ib_xrcd *xrcd)
646 {
647         struct xrcd_table_entry *entry, *scan;
648         struct rb_node **p = &dev->xrcd_tree.rb_node;
649         struct rb_node *parent = NULL;
650
651         entry = kmalloc(sizeof *entry, GFP_KERNEL);
652         if (!entry)
653                 return -ENOMEM;
654
655         entry->xrcd  = xrcd;
656         entry->inode = inode;
657
658         while (*p) {
659                 parent = *p;
660                 scan = rb_entry(parent, struct xrcd_table_entry, node);
661
662                 if (inode < scan->inode) {
663                         p = &(*p)->rb_left;
664                 } else if (inode > scan->inode) {
665                         p = &(*p)->rb_right;
666                 } else {
667                         kfree(entry);
668                         return -EEXIST;
669                 }
670         }
671
672         rb_link_node(&entry->node, parent, p);
673         rb_insert_color(&entry->node, &dev->xrcd_tree);
674         igrab(inode);
675         return 0;
676 }
677
678 static struct xrcd_table_entry *xrcd_table_search(struct ib_uverbs_device *dev,
679                                                   struct inode *inode)
680 {
681         struct xrcd_table_entry *entry;
682         struct rb_node *p = dev->xrcd_tree.rb_node;
683
684         while (p) {
685                 entry = rb_entry(p, struct xrcd_table_entry, node);
686
687                 if (inode < entry->inode)
688                         p = p->rb_left;
689                 else if (inode > entry->inode)
690                         p = p->rb_right;
691                 else
692                         return entry;
693         }
694
695         return NULL;
696 }
697
698 static struct ib_xrcd *find_xrcd(struct ib_uverbs_device *dev, struct inode *inode)
699 {
700         struct xrcd_table_entry *entry;
701
702         entry = xrcd_table_search(dev, inode);
703         if (!entry)
704                 return NULL;
705
706         return entry->xrcd;
707 }
708
709 static void xrcd_table_delete(struct ib_uverbs_device *dev,
710                               struct inode *inode)
711 {
712         struct xrcd_table_entry *entry;
713
714         entry = xrcd_table_search(dev, inode);
715         if (entry) {
716                 iput(inode);
717                 rb_erase(&entry->node, &dev->xrcd_tree);
718                 kfree(entry);
719         }
720 }
721
722 ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,
723                             const char __user *buf, int in_len,
724                             int out_len)
725 {
726         struct ib_uverbs_open_xrcd      cmd;
727         struct ib_uverbs_open_xrcd_resp resp;
728         struct ib_udata                 udata;
729         struct ib_uxrcd_object         *obj;
730         struct ib_xrcd                 *xrcd = NULL;
731         struct fd                       f = {NULL, 0};
732         struct inode                   *inode = NULL;
733         int                             ret = 0;
734         int                             new_xrcd = 0;
735
736         if (out_len < sizeof resp)
737                 return -ENOSPC;
738
739         if (copy_from_user(&cmd, buf, sizeof cmd))
740                 return -EFAULT;
741
742         INIT_UDATA(&udata, buf + sizeof cmd,
743                    (unsigned long) cmd.response + sizeof resp,
744                    in_len - sizeof cmd, out_len - sizeof  resp);
745
746         mutex_lock(&file->device->xrcd_tree_mutex);
747
748         if (cmd.fd != -1) {
749                 /* search for file descriptor */
750                 f = fdget(cmd.fd);
751                 if (!f.file) {
752                         ret = -EBADF;
753                         goto err_tree_mutex_unlock;
754                 }
755
756                 inode = file_inode(f.file);
757                 xrcd = find_xrcd(file->device, inode);
758                 if (!xrcd && !(cmd.oflags & O_CREAT)) {
759                         /* no file descriptor. Need CREATE flag */
760                         ret = -EAGAIN;
761                         goto err_tree_mutex_unlock;
762                 }
763
764                 if (xrcd && cmd.oflags & O_EXCL) {
765                         ret = -EINVAL;
766                         goto err_tree_mutex_unlock;
767                 }
768         }
769
770         obj = kmalloc(sizeof *obj, GFP_KERNEL);
771         if (!obj) {
772                 ret = -ENOMEM;
773                 goto err_tree_mutex_unlock;
774         }
775
776         init_uobj(&obj->uobject, 0, file->ucontext, &xrcd_lock_class);
777
778         down_write(&obj->uobject.mutex);
779
780         if (!xrcd) {
781                 xrcd = file->device->ib_dev->alloc_xrcd(file->device->ib_dev,
782                                                         file->ucontext, &udata);
783                 if (IS_ERR(xrcd)) {
784                         ret = PTR_ERR(xrcd);
785                         goto err;
786                 }
787
788                 xrcd->inode   = inode;
789                 xrcd->device  = file->device->ib_dev;
790                 atomic_set(&xrcd->usecnt, 0);
791                 mutex_init(&xrcd->tgt_qp_mutex);
792                 INIT_LIST_HEAD(&xrcd->tgt_qp_list);
793                 new_xrcd = 1;
794         }
795
796         atomic_set(&obj->refcnt, 0);
797         obj->uobject.object = xrcd;
798         ret = idr_add_uobj(&ib_uverbs_xrcd_idr, &obj->uobject);
799         if (ret)
800                 goto err_idr;
801
802         memset(&resp, 0, sizeof resp);
803         resp.xrcd_handle = obj->uobject.id;
804
805         if (inode) {
806                 if (new_xrcd) {
807                         /* create new inode/xrcd table entry */
808                         ret = xrcd_table_insert(file->device, inode, xrcd);
809                         if (ret)
810                                 goto err_insert_xrcd;
811                 }
812                 atomic_inc(&xrcd->usecnt);
813         }
814
815         if (copy_to_user((void __user *) (unsigned long) cmd.response,
816                          &resp, sizeof resp)) {
817                 ret = -EFAULT;
818                 goto err_copy;
819         }
820
821         if (f.file)
822                 fdput(f);
823
824         mutex_lock(&file->mutex);
825         list_add_tail(&obj->uobject.list, &file->ucontext->xrcd_list);
826         mutex_unlock(&file->mutex);
827
828         obj->uobject.live = 1;
829         up_write(&obj->uobject.mutex);
830
831         mutex_unlock(&file->device->xrcd_tree_mutex);
832         return in_len;
833
834 err_copy:
835         if (inode) {
836                 if (new_xrcd)
837                         xrcd_table_delete(file->device, inode);
838                 atomic_dec(&xrcd->usecnt);
839         }
840
841 err_insert_xrcd:
842         idr_remove_uobj(&ib_uverbs_xrcd_idr, &obj->uobject);
843
844 err_idr:
845         ib_dealloc_xrcd(xrcd);
846
847 err:
848         put_uobj_write(&obj->uobject);
849
850 err_tree_mutex_unlock:
851         if (f.file)
852                 fdput(f);
853
854         mutex_unlock(&file->device->xrcd_tree_mutex);
855
856         return ret;
857 }
858
859 ssize_t ib_uverbs_close_xrcd(struct ib_uverbs_file *file,
860                              const char __user *buf, int in_len,
861                              int out_len)
862 {
863         struct ib_uverbs_close_xrcd cmd;
864         struct ib_uobject           *uobj;
865         struct ib_xrcd              *xrcd = NULL;
866         struct inode                *inode = NULL;
867         struct ib_uxrcd_object      *obj;
868         int                         live;
869         int                         ret = 0;
870
871         if (copy_from_user(&cmd, buf, sizeof cmd))
872                 return -EFAULT;
873
874         mutex_lock(&file->device->xrcd_tree_mutex);
875         uobj = idr_write_uobj(&ib_uverbs_xrcd_idr, cmd.xrcd_handle, file->ucontext);
876         if (!uobj) {
877                 ret = -EINVAL;
878                 goto out;
879         }
880
881         xrcd  = uobj->object;
882         inode = xrcd->inode;
883         obj   = container_of(uobj, struct ib_uxrcd_object, uobject);
884         if (atomic_read(&obj->refcnt)) {
885                 put_uobj_write(uobj);
886                 ret = -EBUSY;
887                 goto out;
888         }
889
890         if (!inode || atomic_dec_and_test(&xrcd->usecnt)) {
891                 ret = ib_dealloc_xrcd(uobj->object);
892                 if (!ret)
893                         uobj->live = 0;
894         }
895
896         live = uobj->live;
897         if (inode && ret)
898                 atomic_inc(&xrcd->usecnt);
899
900         put_uobj_write(uobj);
901
902         if (ret)
903                 goto out;
904
905         if (inode && !live)
906                 xrcd_table_delete(file->device, inode);
907
908         idr_remove_uobj(&ib_uverbs_xrcd_idr, uobj);
909         mutex_lock(&file->mutex);
910         list_del(&uobj->list);
911         mutex_unlock(&file->mutex);
912
913         put_uobj(uobj);
914         ret = in_len;
915
916 out:
917         mutex_unlock(&file->device->xrcd_tree_mutex);
918         return ret;
919 }
920
921 void ib_uverbs_dealloc_xrcd(struct ib_uverbs_device *dev,
922                             struct ib_xrcd *xrcd)
923 {
924         struct inode *inode;
925
926         inode = xrcd->inode;
927         if (inode && !atomic_dec_and_test(&xrcd->usecnt))
928                 return;
929
930         ib_dealloc_xrcd(xrcd);
931
932         if (inode)
933                 xrcd_table_delete(dev, inode);
934 }
935
936 ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,
937                          const char __user *buf, int in_len,
938                          int out_len)
939 {
940         struct ib_uverbs_reg_mr      cmd;
941         struct ib_uverbs_reg_mr_resp resp;
942         struct ib_udata              udata;
943         struct ib_uobject           *uobj;
944         struct ib_pd                *pd;
945         struct ib_mr                *mr;
946         int                          ret;
947
948         if (out_len < sizeof resp)
949                 return -ENOSPC;
950
951         if (copy_from_user(&cmd, buf, sizeof cmd))
952                 return -EFAULT;
953
954         INIT_UDATA(&udata, buf + sizeof cmd,
955                    (unsigned long) cmd.response + sizeof resp,
956                    in_len - sizeof cmd, out_len - sizeof resp);
957
958         if ((cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK))
959                 return -EINVAL;
960
961         ret = ib_check_mr_access(cmd.access_flags);
962         if (ret)
963                 return ret;
964
965         uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
966         if (!uobj)
967                 return -ENOMEM;
968
969         init_uobj(uobj, 0, file->ucontext, &mr_lock_class);
970         down_write(&uobj->mutex);
971
972         pd = idr_read_pd(cmd.pd_handle, file->ucontext);
973         if (!pd) {
974                 ret = -EINVAL;
975                 goto err_free;
976         }
977
978         if (cmd.access_flags & IB_ACCESS_ON_DEMAND) {
979                 struct ib_device_attr attr;
980
981                 ret = ib_query_device(pd->device, &attr);
982                 if (ret || !(attr.device_cap_flags &
983                                 IB_DEVICE_ON_DEMAND_PAGING)) {
984                         pr_debug("ODP support not available\n");
985                         ret = -EINVAL;
986                         goto err_put;
987                 }
988         }
989
990         mr = pd->device->reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
991                                      cmd.access_flags, &udata);
992         if (IS_ERR(mr)) {
993                 ret = PTR_ERR(mr);
994                 goto err_put;
995         }
996
997         mr->device  = pd->device;
998         mr->pd      = pd;
999         mr->uobject = uobj;
1000         atomic_inc(&pd->usecnt);
1001         atomic_set(&mr->usecnt, 0);
1002
1003         uobj->object = mr;
1004         ret = idr_add_uobj(&ib_uverbs_mr_idr, uobj);
1005         if (ret)
1006                 goto err_unreg;
1007
1008         memset(&resp, 0, sizeof resp);
1009         resp.lkey      = mr->lkey;
1010         resp.rkey      = mr->rkey;
1011         resp.mr_handle = uobj->id;
1012
1013         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1014                          &resp, sizeof resp)) {
1015                 ret = -EFAULT;
1016                 goto err_copy;
1017         }
1018
1019         put_pd_read(pd);
1020
1021         mutex_lock(&file->mutex);
1022         list_add_tail(&uobj->list, &file->ucontext->mr_list);
1023         mutex_unlock(&file->mutex);
1024
1025         uobj->live = 1;
1026
1027         up_write(&uobj->mutex);
1028
1029         return in_len;
1030
1031 err_copy:
1032         idr_remove_uobj(&ib_uverbs_mr_idr, uobj);
1033
1034 err_unreg:
1035         ib_dereg_mr(mr);
1036
1037 err_put:
1038         put_pd_read(pd);
1039
1040 err_free:
1041         put_uobj_write(uobj);
1042         return ret;
1043 }
1044
1045 ssize_t ib_uverbs_rereg_mr(struct ib_uverbs_file *file,
1046                            const char __user *buf, int in_len,
1047                            int out_len)
1048 {
1049         struct ib_uverbs_rereg_mr      cmd;
1050         struct ib_uverbs_rereg_mr_resp resp;
1051         struct ib_udata              udata;
1052         struct ib_pd                *pd = NULL;
1053         struct ib_mr                *mr;
1054         struct ib_pd                *old_pd;
1055         int                          ret;
1056         struct ib_uobject           *uobj;
1057
1058         if (out_len < sizeof(resp))
1059                 return -ENOSPC;
1060
1061         if (copy_from_user(&cmd, buf, sizeof(cmd)))
1062                 return -EFAULT;
1063
1064         INIT_UDATA(&udata, buf + sizeof(cmd),
1065                    (unsigned long) cmd.response + sizeof(resp),
1066                    in_len - sizeof(cmd), out_len - sizeof(resp));
1067
1068         if (cmd.flags & ~IB_MR_REREG_SUPPORTED || !cmd.flags)
1069                 return -EINVAL;
1070
1071         if ((cmd.flags & IB_MR_REREG_TRANS) &&
1072             (!cmd.start || !cmd.hca_va || 0 >= cmd.length ||
1073              (cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK)))
1074                         return -EINVAL;
1075
1076         uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle,
1077                               file->ucontext);
1078
1079         if (!uobj)
1080                 return -EINVAL;
1081
1082         mr = uobj->object;
1083
1084         if (cmd.flags & IB_MR_REREG_ACCESS) {
1085                 ret = ib_check_mr_access(cmd.access_flags);
1086                 if (ret)
1087                         goto put_uobjs;
1088         }
1089
1090         if (cmd.flags & IB_MR_REREG_PD) {
1091                 pd = idr_read_pd(cmd.pd_handle, file->ucontext);
1092                 if (!pd) {
1093                         ret = -EINVAL;
1094                         goto put_uobjs;
1095                 }
1096         }
1097
1098         if (atomic_read(&mr->usecnt)) {
1099                 ret = -EBUSY;
1100                 goto put_uobj_pd;
1101         }
1102
1103         old_pd = mr->pd;
1104         ret = mr->device->rereg_user_mr(mr, cmd.flags, cmd.start,
1105                                         cmd.length, cmd.hca_va,
1106                                         cmd.access_flags, pd, &udata);
1107         if (!ret) {
1108                 if (cmd.flags & IB_MR_REREG_PD) {
1109                         atomic_inc(&pd->usecnt);
1110                         mr->pd = pd;
1111                         atomic_dec(&old_pd->usecnt);
1112                 }
1113         } else {
1114                 goto put_uobj_pd;
1115         }
1116
1117         memset(&resp, 0, sizeof(resp));
1118         resp.lkey      = mr->lkey;
1119         resp.rkey      = mr->rkey;
1120
1121         if (copy_to_user((void __user *)(unsigned long)cmd.response,
1122                          &resp, sizeof(resp)))
1123                 ret = -EFAULT;
1124         else
1125                 ret = in_len;
1126
1127 put_uobj_pd:
1128         if (cmd.flags & IB_MR_REREG_PD)
1129                 put_pd_read(pd);
1130
1131 put_uobjs:
1132
1133         put_uobj_write(mr->uobject);
1134
1135         return ret;
1136 }
1137
1138 ssize_t ib_uverbs_dereg_mr(struct ib_uverbs_file *file,
1139                            const char __user *buf, int in_len,
1140                            int out_len)
1141 {
1142         struct ib_uverbs_dereg_mr cmd;
1143         struct ib_mr             *mr;
1144         struct ib_uobject        *uobj;
1145         int                       ret = -EINVAL;
1146
1147         if (copy_from_user(&cmd, buf, sizeof cmd))
1148                 return -EFAULT;
1149
1150         uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle, file->ucontext);
1151         if (!uobj)
1152                 return -EINVAL;
1153
1154         mr = uobj->object;
1155
1156         ret = ib_dereg_mr(mr);
1157         if (!ret)
1158                 uobj->live = 0;
1159
1160         put_uobj_write(uobj);
1161
1162         if (ret)
1163                 return ret;
1164
1165         idr_remove_uobj(&ib_uverbs_mr_idr, uobj);
1166
1167         mutex_lock(&file->mutex);
1168         list_del(&uobj->list);
1169         mutex_unlock(&file->mutex);
1170
1171         put_uobj(uobj);
1172
1173         return in_len;
1174 }
1175
1176 ssize_t ib_uverbs_alloc_mw(struct ib_uverbs_file *file,
1177                          const char __user *buf, int in_len,
1178                          int out_len)
1179 {
1180         struct ib_uverbs_alloc_mw      cmd;
1181         struct ib_uverbs_alloc_mw_resp resp;
1182         struct ib_uobject             *uobj;
1183         struct ib_pd                  *pd;
1184         struct ib_mw                  *mw;
1185         int                            ret;
1186
1187         if (out_len < sizeof(resp))
1188                 return -ENOSPC;
1189
1190         if (copy_from_user(&cmd, buf, sizeof(cmd)))
1191                 return -EFAULT;
1192
1193         uobj = kmalloc(sizeof(*uobj), GFP_KERNEL);
1194         if (!uobj)
1195                 return -ENOMEM;
1196
1197         init_uobj(uobj, 0, file->ucontext, &mw_lock_class);
1198         down_write(&uobj->mutex);
1199
1200         pd = idr_read_pd(cmd.pd_handle, file->ucontext);
1201         if (!pd) {
1202                 ret = -EINVAL;
1203                 goto err_free;
1204         }
1205
1206         mw = pd->device->alloc_mw(pd, cmd.mw_type);
1207         if (IS_ERR(mw)) {
1208                 ret = PTR_ERR(mw);
1209                 goto err_put;
1210         }
1211
1212         mw->device  = pd->device;
1213         mw->pd      = pd;
1214         mw->uobject = uobj;
1215         atomic_inc(&pd->usecnt);
1216
1217         uobj->object = mw;
1218         ret = idr_add_uobj(&ib_uverbs_mw_idr, uobj);
1219         if (ret)
1220                 goto err_unalloc;
1221
1222         memset(&resp, 0, sizeof(resp));
1223         resp.rkey      = mw->rkey;
1224         resp.mw_handle = uobj->id;
1225
1226         if (copy_to_user((void __user *)(unsigned long)cmd.response,
1227                          &resp, sizeof(resp))) {
1228                 ret = -EFAULT;
1229                 goto err_copy;
1230         }
1231
1232         put_pd_read(pd);
1233
1234         mutex_lock(&file->mutex);
1235         list_add_tail(&uobj->list, &file->ucontext->mw_list);
1236         mutex_unlock(&file->mutex);
1237
1238         uobj->live = 1;
1239
1240         up_write(&uobj->mutex);
1241
1242         return in_len;
1243
1244 err_copy:
1245         idr_remove_uobj(&ib_uverbs_mw_idr, uobj);
1246
1247 err_unalloc:
1248         ib_dealloc_mw(mw);
1249
1250 err_put:
1251         put_pd_read(pd);
1252
1253 err_free:
1254         put_uobj_write(uobj);
1255         return ret;
1256 }
1257
1258 ssize_t ib_uverbs_dealloc_mw(struct ib_uverbs_file *file,
1259                            const char __user *buf, int in_len,
1260                            int out_len)
1261 {
1262         struct ib_uverbs_dealloc_mw cmd;
1263         struct ib_mw               *mw;
1264         struct ib_uobject          *uobj;
1265         int                         ret = -EINVAL;
1266
1267         if (copy_from_user(&cmd, buf, sizeof(cmd)))
1268                 return -EFAULT;
1269
1270         uobj = idr_write_uobj(&ib_uverbs_mw_idr, cmd.mw_handle, file->ucontext);
1271         if (!uobj)
1272                 return -EINVAL;
1273
1274         mw = uobj->object;
1275
1276         ret = ib_dealloc_mw(mw);
1277         if (!ret)
1278                 uobj->live = 0;
1279
1280         put_uobj_write(uobj);
1281
1282         if (ret)
1283                 return ret;
1284
1285         idr_remove_uobj(&ib_uverbs_mw_idr, uobj);
1286
1287         mutex_lock(&file->mutex);
1288         list_del(&uobj->list);
1289         mutex_unlock(&file->mutex);
1290
1291         put_uobj(uobj);
1292
1293         return in_len;
1294 }
1295
1296 ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,
1297                                       const char __user *buf, int in_len,
1298                                       int out_len)
1299 {
1300         struct ib_uverbs_create_comp_channel       cmd;
1301         struct ib_uverbs_create_comp_channel_resp  resp;
1302         struct file                               *filp;
1303         int ret;
1304
1305         if (out_len < sizeof resp)
1306                 return -ENOSPC;
1307
1308         if (copy_from_user(&cmd, buf, sizeof cmd))
1309                 return -EFAULT;
1310
1311         ret = get_unused_fd_flags(O_CLOEXEC);
1312         if (ret < 0)
1313                 return ret;
1314         resp.fd = ret;
1315
1316         filp = ib_uverbs_alloc_event_file(file, 0);
1317         if (IS_ERR(filp)) {
1318                 put_unused_fd(resp.fd);
1319                 return PTR_ERR(filp);
1320         }
1321
1322         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1323                          &resp, sizeof resp)) {
1324                 put_unused_fd(resp.fd);
1325                 fput(filp);
1326                 return -EFAULT;
1327         }
1328
1329         fd_install(resp.fd, filp);
1330         return in_len;
1331 }
1332
1333 ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file,
1334                             const char __user *buf, int in_len,
1335                             int out_len)
1336 {
1337         struct ib_uverbs_create_cq      cmd;
1338         struct ib_uverbs_create_cq_resp resp;
1339         struct ib_udata                 udata;
1340         struct ib_ucq_object           *obj;
1341         struct ib_uverbs_event_file    *ev_file = NULL;
1342         struct ib_cq                   *cq;
1343         int                             ret;
1344         struct ib_cq_init_attr attr = {};
1345
1346         if (out_len < sizeof resp)
1347                 return -ENOSPC;
1348
1349         if (copy_from_user(&cmd, buf, sizeof cmd))
1350                 return -EFAULT;
1351
1352         INIT_UDATA(&udata, buf + sizeof cmd,
1353                    (unsigned long) cmd.response + sizeof resp,
1354                    in_len - sizeof cmd, out_len - sizeof resp);
1355
1356         if (cmd.comp_vector >= file->device->num_comp_vectors)
1357                 return -EINVAL;
1358
1359         obj = kmalloc(sizeof *obj, GFP_KERNEL);
1360         if (!obj)
1361                 return -ENOMEM;
1362
1363         init_uobj(&obj->uobject, cmd.user_handle, file->ucontext, &cq_lock_class);
1364         down_write(&obj->uobject.mutex);
1365
1366         if (cmd.comp_channel >= 0) {
1367                 ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel);
1368                 if (!ev_file) {
1369                         ret = -EINVAL;
1370                         goto err;
1371                 }
1372         }
1373
1374         obj->uverbs_file           = file;
1375         obj->comp_events_reported  = 0;
1376         obj->async_events_reported = 0;
1377         INIT_LIST_HEAD(&obj->comp_list);
1378         INIT_LIST_HEAD(&obj->async_list);
1379
1380         attr.cqe = cmd.cqe;
1381         attr.comp_vector = cmd.comp_vector;
1382         cq = file->device->ib_dev->create_cq(file->device->ib_dev, &attr,
1383                                              file->ucontext, &udata);
1384         if (IS_ERR(cq)) {
1385                 ret = PTR_ERR(cq);
1386                 goto err_file;
1387         }
1388
1389         cq->device        = file->device->ib_dev;
1390         cq->uobject       = &obj->uobject;
1391         cq->comp_handler  = ib_uverbs_comp_handler;
1392         cq->event_handler = ib_uverbs_cq_event_handler;
1393         cq->cq_context    = ev_file;
1394         atomic_set(&cq->usecnt, 0);
1395
1396         obj->uobject.object = cq;
1397         ret = idr_add_uobj(&ib_uverbs_cq_idr, &obj->uobject);
1398         if (ret)
1399                 goto err_free;
1400
1401         memset(&resp, 0, sizeof resp);
1402         resp.cq_handle = obj->uobject.id;
1403         resp.cqe       = cq->cqe;
1404
1405         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1406                          &resp, sizeof resp)) {
1407                 ret = -EFAULT;
1408                 goto err_copy;
1409         }
1410
1411         mutex_lock(&file->mutex);
1412         list_add_tail(&obj->uobject.list, &file->ucontext->cq_list);
1413         mutex_unlock(&file->mutex);
1414
1415         obj->uobject.live = 1;
1416
1417         up_write(&obj->uobject.mutex);
1418
1419         return in_len;
1420
1421 err_copy:
1422         idr_remove_uobj(&ib_uverbs_cq_idr, &obj->uobject);
1423
1424 err_free:
1425         ib_destroy_cq(cq);
1426
1427 err_file:
1428         if (ev_file)
1429                 ib_uverbs_release_ucq(file, ev_file, obj);
1430
1431 err:
1432         put_uobj_write(&obj->uobject);
1433         return ret;
1434 }
1435
1436 ssize_t ib_uverbs_resize_cq(struct ib_uverbs_file *file,
1437                             const char __user *buf, int in_len,
1438                             int out_len)
1439 {
1440         struct ib_uverbs_resize_cq      cmd;
1441         struct ib_uverbs_resize_cq_resp resp;
1442         struct ib_udata                 udata;
1443         struct ib_cq                    *cq;
1444         int                             ret = -EINVAL;
1445
1446         if (copy_from_user(&cmd, buf, sizeof cmd))
1447                 return -EFAULT;
1448
1449         INIT_UDATA(&udata, buf + sizeof cmd,
1450                    (unsigned long) cmd.response + sizeof resp,
1451                    in_len - sizeof cmd, out_len - sizeof resp);
1452
1453         cq = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
1454         if (!cq)
1455                 return -EINVAL;
1456
1457         ret = cq->device->resize_cq(cq, cmd.cqe, &udata);
1458         if (ret)
1459                 goto out;
1460
1461         resp.cqe = cq->cqe;
1462
1463         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1464                          &resp, sizeof resp.cqe))
1465                 ret = -EFAULT;
1466
1467 out:
1468         put_cq_read(cq);
1469
1470         return ret ? ret : in_len;
1471 }
1472
1473 static int copy_wc_to_user(void __user *dest, struct ib_wc *wc)
1474 {
1475         struct ib_uverbs_wc tmp;
1476
1477         tmp.wr_id               = wc->wr_id;
1478         tmp.status              = wc->status;
1479         tmp.opcode              = wc->opcode;
1480         tmp.vendor_err          = wc->vendor_err;
1481         tmp.byte_len            = wc->byte_len;
1482         tmp.ex.imm_data         = (__u32 __force) wc->ex.imm_data;
1483         tmp.qp_num              = wc->qp->qp_num;
1484         tmp.src_qp              = wc->src_qp;
1485         tmp.wc_flags            = wc->wc_flags;
1486         tmp.pkey_index          = wc->pkey_index;
1487         tmp.slid                = wc->slid;
1488         tmp.sl                  = wc->sl;
1489         tmp.dlid_path_bits      = wc->dlid_path_bits;
1490         tmp.port_num            = wc->port_num;
1491         tmp.reserved            = 0;
1492
1493         if (copy_to_user(dest, &tmp, sizeof tmp))
1494                 return -EFAULT;
1495
1496         return 0;
1497 }
1498
1499 ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
1500                           const char __user *buf, int in_len,
1501                           int out_len)
1502 {
1503         struct ib_uverbs_poll_cq       cmd;
1504         struct ib_uverbs_poll_cq_resp  resp;
1505         u8 __user                     *header_ptr;
1506         u8 __user                     *data_ptr;
1507         struct ib_cq                  *cq;
1508         struct ib_wc                   wc;
1509         int                            ret;
1510
1511         if (copy_from_user(&cmd, buf, sizeof cmd))
1512                 return -EFAULT;
1513
1514         cq = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
1515         if (!cq)
1516                 return -EINVAL;
1517
1518         /* we copy a struct ib_uverbs_poll_cq_resp to user space */
1519         header_ptr = (void __user *)(unsigned long) cmd.response;
1520         data_ptr = header_ptr + sizeof resp;
1521
1522         memset(&resp, 0, sizeof resp);
1523         while (resp.count < cmd.ne) {
1524                 ret = ib_poll_cq(cq, 1, &wc);
1525                 if (ret < 0)
1526                         goto out_put;
1527                 if (!ret)
1528                         break;
1529
1530                 ret = copy_wc_to_user(data_ptr, &wc);
1531                 if (ret)
1532                         goto out_put;
1533
1534                 data_ptr += sizeof(struct ib_uverbs_wc);
1535                 ++resp.count;
1536         }
1537
1538         if (copy_to_user(header_ptr, &resp, sizeof resp)) {
1539                 ret = -EFAULT;
1540                 goto out_put;
1541         }
1542
1543         ret = in_len;
1544
1545 out_put:
1546         put_cq_read(cq);
1547         return ret;
1548 }
1549
1550 ssize_t ib_uverbs_req_notify_cq(struct ib_uverbs_file *file,
1551                                 const char __user *buf, int in_len,
1552                                 int out_len)
1553 {
1554         struct ib_uverbs_req_notify_cq cmd;
1555         struct ib_cq                  *cq;
1556
1557         if (copy_from_user(&cmd, buf, sizeof cmd))
1558                 return -EFAULT;
1559
1560         cq = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
1561         if (!cq)
1562                 return -EINVAL;
1563
1564         ib_req_notify_cq(cq, cmd.solicited_only ?
1565                          IB_CQ_SOLICITED : IB_CQ_NEXT_COMP);
1566
1567         put_cq_read(cq);
1568
1569         return in_len;
1570 }
1571
1572 ssize_t ib_uverbs_destroy_cq(struct ib_uverbs_file *file,
1573                              const char __user *buf, int in_len,
1574                              int out_len)
1575 {
1576         struct ib_uverbs_destroy_cq      cmd;
1577         struct ib_uverbs_destroy_cq_resp resp;
1578         struct ib_uobject               *uobj;
1579         struct ib_cq                    *cq;
1580         struct ib_ucq_object            *obj;
1581         struct ib_uverbs_event_file     *ev_file;
1582         int                              ret = -EINVAL;
1583
1584         if (copy_from_user(&cmd, buf, sizeof cmd))
1585                 return -EFAULT;
1586
1587         uobj = idr_write_uobj(&ib_uverbs_cq_idr, cmd.cq_handle, file->ucontext);
1588         if (!uobj)
1589                 return -EINVAL;
1590         cq      = uobj->object;
1591         ev_file = cq->cq_context;
1592         obj     = container_of(cq->uobject, struct ib_ucq_object, uobject);
1593
1594         ret = ib_destroy_cq(cq);
1595         if (!ret)
1596                 uobj->live = 0;
1597
1598         put_uobj_write(uobj);
1599
1600         if (ret)
1601                 return ret;
1602
1603         idr_remove_uobj(&ib_uverbs_cq_idr, uobj);
1604
1605         mutex_lock(&file->mutex);
1606         list_del(&uobj->list);
1607         mutex_unlock(&file->mutex);
1608
1609         ib_uverbs_release_ucq(file, ev_file, obj);
1610
1611         memset(&resp, 0, sizeof resp);
1612         resp.comp_events_reported  = obj->comp_events_reported;
1613         resp.async_events_reported = obj->async_events_reported;
1614
1615         put_uobj(uobj);
1616
1617         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1618                          &resp, sizeof resp))
1619                 return -EFAULT;
1620
1621         return in_len;
1622 }
1623
1624 ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
1625                             const char __user *buf, int in_len,
1626                             int out_len)
1627 {
1628         struct ib_uverbs_create_qp      cmd;
1629         struct ib_uverbs_create_qp_resp resp;
1630         struct ib_udata                 udata;
1631         struct ib_uqp_object           *obj;
1632         struct ib_device               *device;
1633         struct ib_pd                   *pd = NULL;
1634         struct ib_xrcd                 *xrcd = NULL;
1635         struct ib_uobject              *uninitialized_var(xrcd_uobj);
1636         struct ib_cq                   *scq = NULL, *rcq = NULL;
1637         struct ib_srq                  *srq = NULL;
1638         struct ib_qp                   *qp;
1639         struct ib_qp_init_attr          attr;
1640         int ret;
1641
1642         if (out_len < sizeof resp)
1643                 return -ENOSPC;
1644
1645         if (copy_from_user(&cmd, buf, sizeof cmd))
1646                 return -EFAULT;
1647
1648         if (cmd.qp_type == IB_QPT_RAW_PACKET && !capable(CAP_NET_RAW))
1649                 return -EPERM;
1650
1651         INIT_UDATA(&udata, buf + sizeof cmd,
1652                    (unsigned long) cmd.response + sizeof resp,
1653                    in_len - sizeof cmd, out_len - sizeof resp);
1654
1655         obj = kzalloc(sizeof *obj, GFP_KERNEL);
1656         if (!obj)
1657                 return -ENOMEM;
1658
1659         init_uobj(&obj->uevent.uobject, cmd.user_handle, file->ucontext, &qp_lock_class);
1660         down_write(&obj->uevent.uobject.mutex);
1661
1662         if (cmd.qp_type == IB_QPT_XRC_TGT) {
1663                 xrcd = idr_read_xrcd(cmd.pd_handle, file->ucontext, &xrcd_uobj);
1664                 if (!xrcd) {
1665                         ret = -EINVAL;
1666                         goto err_put;
1667                 }
1668                 device = xrcd->device;
1669         } else {
1670                 if (cmd.qp_type == IB_QPT_XRC_INI) {
1671                         cmd.max_recv_wr = cmd.max_recv_sge = 0;
1672                 } else {
1673                         if (cmd.is_srq) {
1674                                 srq = idr_read_srq(cmd.srq_handle, file->ucontext);
1675                                 if (!srq || srq->srq_type != IB_SRQT_BASIC) {
1676                                         ret = -EINVAL;
1677                                         goto err_put;
1678                                 }
1679                         }
1680
1681                         if (cmd.recv_cq_handle != cmd.send_cq_handle) {
1682                                 rcq = idr_read_cq(cmd.recv_cq_handle, file->ucontext, 0);
1683                                 if (!rcq) {
1684                                         ret = -EINVAL;
1685                                         goto err_put;
1686                                 }
1687                         }
1688                 }
1689
1690                 scq = idr_read_cq(cmd.send_cq_handle, file->ucontext, !!rcq);
1691                 rcq = rcq ?: scq;
1692                 pd  = idr_read_pd(cmd.pd_handle, file->ucontext);
1693                 if (!pd || !scq) {
1694                         ret = -EINVAL;
1695                         goto err_put;
1696                 }
1697
1698                 device = pd->device;
1699         }
1700
1701         attr.event_handler = ib_uverbs_qp_event_handler;
1702         attr.qp_context    = file;
1703         attr.send_cq       = scq;
1704         attr.recv_cq       = rcq;
1705         attr.srq           = srq;
1706         attr.xrcd          = xrcd;
1707         attr.sq_sig_type   = cmd.sq_sig_all ? IB_SIGNAL_ALL_WR : IB_SIGNAL_REQ_WR;
1708         attr.qp_type       = cmd.qp_type;
1709         attr.create_flags  = 0;
1710
1711         attr.cap.max_send_wr     = cmd.max_send_wr;
1712         attr.cap.max_recv_wr     = cmd.max_recv_wr;
1713         attr.cap.max_send_sge    = cmd.max_send_sge;
1714         attr.cap.max_recv_sge    = cmd.max_recv_sge;
1715         attr.cap.max_inline_data = cmd.max_inline_data;
1716
1717         obj->uevent.events_reported     = 0;
1718         INIT_LIST_HEAD(&obj->uevent.event_list);
1719         INIT_LIST_HEAD(&obj->mcast_list);
1720
1721         if (cmd.qp_type == IB_QPT_XRC_TGT)
1722                 qp = ib_create_qp(pd, &attr);
1723         else
1724                 qp = device->create_qp(pd, &attr, &udata);
1725
1726         if (IS_ERR(qp)) {
1727                 ret = PTR_ERR(qp);
1728                 goto err_put;
1729         }
1730
1731         if (cmd.qp_type != IB_QPT_XRC_TGT) {
1732                 qp->real_qp       = qp;
1733                 qp->device        = device;
1734                 qp->pd            = pd;
1735                 qp->send_cq       = attr.send_cq;
1736                 qp->recv_cq       = attr.recv_cq;
1737                 qp->srq           = attr.srq;
1738                 qp->event_handler = attr.event_handler;
1739                 qp->qp_context    = attr.qp_context;
1740                 qp->qp_type       = attr.qp_type;
1741                 atomic_set(&qp->usecnt, 0);
1742                 atomic_inc(&pd->usecnt);
1743                 atomic_inc(&attr.send_cq->usecnt);
1744                 if (attr.recv_cq)
1745                         atomic_inc(&attr.recv_cq->usecnt);
1746                 if (attr.srq)
1747                         atomic_inc(&attr.srq->usecnt);
1748         }
1749         qp->uobject = &obj->uevent.uobject;
1750
1751         obj->uevent.uobject.object = qp;
1752         ret = idr_add_uobj(&ib_uverbs_qp_idr, &obj->uevent.uobject);
1753         if (ret)
1754                 goto err_destroy;
1755
1756         memset(&resp, 0, sizeof resp);
1757         resp.qpn             = qp->qp_num;
1758         resp.qp_handle       = obj->uevent.uobject.id;
1759         resp.max_recv_sge    = attr.cap.max_recv_sge;
1760         resp.max_send_sge    = attr.cap.max_send_sge;
1761         resp.max_recv_wr     = attr.cap.max_recv_wr;
1762         resp.max_send_wr     = attr.cap.max_send_wr;
1763         resp.max_inline_data = attr.cap.max_inline_data;
1764
1765         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1766                          &resp, sizeof resp)) {
1767                 ret = -EFAULT;
1768                 goto err_copy;
1769         }
1770
1771         if (xrcd) {
1772                 obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object,
1773                                           uobject);
1774                 atomic_inc(&obj->uxrcd->refcnt);
1775                 put_xrcd_read(xrcd_uobj);
1776         }
1777
1778         if (pd)
1779                 put_pd_read(pd);
1780         if (scq)
1781                 put_cq_read(scq);
1782         if (rcq && rcq != scq)
1783                 put_cq_read(rcq);
1784         if (srq)
1785                 put_srq_read(srq);
1786
1787         mutex_lock(&file->mutex);
1788         list_add_tail(&obj->uevent.uobject.list, &file->ucontext->qp_list);
1789         mutex_unlock(&file->mutex);
1790
1791         obj->uevent.uobject.live = 1;
1792
1793         up_write(&obj->uevent.uobject.mutex);
1794
1795         return in_len;
1796
1797 err_copy:
1798         idr_remove_uobj(&ib_uverbs_qp_idr, &obj->uevent.uobject);
1799
1800 err_destroy:
1801         ib_destroy_qp(qp);
1802
1803 err_put:
1804         if (xrcd)
1805                 put_xrcd_read(xrcd_uobj);
1806         if (pd)
1807                 put_pd_read(pd);
1808         if (scq)
1809                 put_cq_read(scq);
1810         if (rcq && rcq != scq)
1811                 put_cq_read(rcq);
1812         if (srq)
1813                 put_srq_read(srq);
1814
1815         put_uobj_write(&obj->uevent.uobject);
1816         return ret;
1817 }
1818
1819 ssize_t ib_uverbs_open_qp(struct ib_uverbs_file *file,
1820                           const char __user *buf, int in_len, int out_len)
1821 {
1822         struct ib_uverbs_open_qp        cmd;
1823         struct ib_uverbs_create_qp_resp resp;
1824         struct ib_udata                 udata;
1825         struct ib_uqp_object           *obj;
1826         struct ib_xrcd                 *xrcd;
1827         struct ib_uobject              *uninitialized_var(xrcd_uobj);
1828         struct ib_qp                   *qp;
1829         struct ib_qp_open_attr          attr;
1830         int ret;
1831
1832         if (out_len < sizeof resp)
1833                 return -ENOSPC;
1834
1835         if (copy_from_user(&cmd, buf, sizeof cmd))
1836                 return -EFAULT;
1837
1838         INIT_UDATA(&udata, buf + sizeof cmd,
1839                    (unsigned long) cmd.response + sizeof resp,
1840                    in_len - sizeof cmd, out_len - sizeof resp);
1841
1842         obj = kmalloc(sizeof *obj, GFP_KERNEL);
1843         if (!obj)
1844                 return -ENOMEM;
1845
1846         init_uobj(&obj->uevent.uobject, cmd.user_handle, file->ucontext, &qp_lock_class);
1847         down_write(&obj->uevent.uobject.mutex);
1848
1849         xrcd = idr_read_xrcd(cmd.pd_handle, file->ucontext, &xrcd_uobj);
1850         if (!xrcd) {
1851                 ret = -EINVAL;
1852                 goto err_put;
1853         }
1854
1855         attr.event_handler = ib_uverbs_qp_event_handler;
1856         attr.qp_context    = file;
1857         attr.qp_num        = cmd.qpn;
1858         attr.qp_type       = cmd.qp_type;
1859
1860         obj->uevent.events_reported = 0;
1861         INIT_LIST_HEAD(&obj->uevent.event_list);
1862         INIT_LIST_HEAD(&obj->mcast_list);
1863
1864         qp = ib_open_qp(xrcd, &attr);
1865         if (IS_ERR(qp)) {
1866                 ret = PTR_ERR(qp);
1867                 goto err_put;
1868         }
1869
1870         qp->uobject = &obj->uevent.uobject;
1871
1872         obj->uevent.uobject.object = qp;
1873         ret = idr_add_uobj(&ib_uverbs_qp_idr, &obj->uevent.uobject);
1874         if (ret)
1875                 goto err_destroy;
1876
1877         memset(&resp, 0, sizeof resp);
1878         resp.qpn       = qp->qp_num;
1879         resp.qp_handle = obj->uevent.uobject.id;
1880
1881         if (copy_to_user((void __user *) (unsigned long) cmd.response,
1882                          &resp, sizeof resp)) {
1883                 ret = -EFAULT;
1884                 goto err_remove;
1885         }
1886
1887         obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object, uobject);
1888         atomic_inc(&obj->uxrcd->refcnt);
1889         put_xrcd_read(xrcd_uobj);
1890
1891         mutex_lock(&file->mutex);
1892         list_add_tail(&obj->uevent.uobject.list, &file->ucontext->qp_list);
1893         mutex_unlock(&file->mutex);
1894
1895         obj->uevent.uobject.live = 1;
1896
1897         up_write(&obj->uevent.uobject.mutex);
1898
1899         return in_len;
1900
1901 err_remove:
1902         idr_remove_uobj(&ib_uverbs_qp_idr, &obj->uevent.uobject);
1903
1904 err_destroy:
1905         ib_destroy_qp(qp);
1906
1907 err_put:
1908         put_xrcd_read(xrcd_uobj);
1909         put_uobj_write(&obj->uevent.uobject);
1910         return ret;
1911 }
1912
1913 ssize_t ib_uverbs_query_qp(struct ib_uverbs_file *file,
1914                            const char __user *buf, int in_len,
1915                            int out_len)
1916 {
1917         struct ib_uverbs_query_qp      cmd;
1918         struct ib_uverbs_query_qp_resp resp;
1919         struct ib_qp                   *qp;
1920         struct ib_qp_attr              *attr;
1921         struct ib_qp_init_attr         *init_attr;
1922         int                            ret;
1923
1924         if (copy_from_user(&cmd, buf, sizeof cmd))
1925                 return -EFAULT;
1926
1927         attr      = kmalloc(sizeof *attr, GFP_KERNEL);
1928         init_attr = kmalloc(sizeof *init_attr, GFP_KERNEL);
1929         if (!attr || !init_attr) {
1930                 ret = -ENOMEM;
1931                 goto out;
1932         }
1933
1934         qp = idr_read_qp(cmd.qp_handle, file->ucontext);
1935         if (!qp) {
1936                 ret = -EINVAL;
1937                 goto out;
1938         }
1939
1940         ret = ib_query_qp(qp, attr, cmd.attr_mask, init_attr);
1941
1942         put_qp_read(qp);
1943
1944         if (ret)
1945                 goto out;
1946
1947         memset(&resp, 0, sizeof resp);
1948
1949         resp.qp_state               = attr->qp_state;
1950         resp.cur_qp_state           = attr->cur_qp_state;
1951         resp.path_mtu               = attr->path_mtu;
1952         resp.path_mig_state         = attr->path_mig_state;
1953         resp.qkey                   = attr->qkey;
1954         resp.rq_psn                 = attr->rq_psn;
1955         resp.sq_psn                 = attr->sq_psn;
1956         resp.dest_qp_num            = attr->dest_qp_num;
1957         resp.qp_access_flags        = attr->qp_access_flags;
1958         resp.pkey_index             = attr->pkey_index;
1959         resp.alt_pkey_index         = attr->alt_pkey_index;
1960         resp.sq_draining            = attr->sq_draining;
1961         resp.max_rd_atomic          = attr->max_rd_atomic;
1962         resp.max_dest_rd_atomic     = attr->max_dest_rd_atomic;
1963         resp.min_rnr_timer          = attr->min_rnr_timer;
1964         resp.port_num               = attr->port_num;
1965         resp.timeout                = attr->timeout;
1966         resp.retry_cnt              = attr->retry_cnt;
1967         resp.rnr_retry              = attr->rnr_retry;
1968         resp.alt_port_num           = attr->alt_port_num;
1969         resp.alt_timeout            = attr->alt_timeout;
1970
1971         memcpy(resp.dest.dgid, attr->ah_attr.grh.dgid.raw, 16);
1972         resp.dest.flow_label        = attr->ah_attr.grh.flow_label;
1973         resp.dest.sgid_index        = attr->ah_attr.grh.sgid_index;
1974         resp.dest.hop_limit         = attr->ah_attr.grh.hop_limit;
1975         resp.dest.traffic_class     = attr->ah_attr.grh.traffic_class;
1976         resp.dest.dlid              = attr->ah_attr.dlid;
1977         resp.dest.sl                = attr->ah_attr.sl;
1978         resp.dest.src_path_bits     = attr->ah_attr.src_path_bits;
1979         resp.dest.static_rate       = attr->ah_attr.static_rate;
1980         resp.dest.is_global         = !!(attr->ah_attr.ah_flags & IB_AH_GRH);
1981         resp.dest.port_num          = attr->ah_attr.port_num;
1982
1983         memcpy(resp.alt_dest.dgid, attr->alt_ah_attr.grh.dgid.raw, 16);
1984         resp.alt_dest.flow_label    = attr->alt_ah_attr.grh.flow_label;
1985         resp.alt_dest.sgid_index    = attr->alt_ah_attr.grh.sgid_index;
1986         resp.alt_dest.hop_limit     = attr->alt_ah_attr.grh.hop_limit;
1987         resp.alt_dest.traffic_class = attr->alt_ah_attr.grh.traffic_class;
1988         resp.alt_dest.dlid          = attr->alt_ah_attr.dlid;
1989         resp.alt_dest.sl            = attr->alt_ah_attr.sl;
1990         resp.alt_dest.src_path_bits = attr->alt_ah_attr.src_path_bits;
1991         resp.alt_dest.static_rate   = attr->alt_ah_attr.static_rate;
1992         resp.alt_dest.is_global     = !!(attr->alt_ah_attr.ah_flags & IB_AH_GRH);
1993         resp.alt_dest.port_num      = attr->alt_ah_attr.port_num;
1994
1995         resp.max_send_wr            = init_attr->cap.max_send_wr;
1996         resp.max_recv_wr            = init_attr->cap.max_recv_wr;
1997         resp.max_send_sge           = init_attr->cap.max_send_sge;
1998         resp.max_recv_sge           = init_attr->cap.max_recv_sge;
1999         resp.max_inline_data        = init_attr->cap.max_inline_data;
2000         resp.sq_sig_all             = init_attr->sq_sig_type == IB_SIGNAL_ALL_WR;
2001
2002         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2003                          &resp, sizeof resp))
2004                 ret = -EFAULT;
2005
2006 out:
2007         kfree(attr);
2008         kfree(init_attr);
2009
2010         return ret ? ret : in_len;
2011 }
2012
2013 /* Remove ignored fields set in the attribute mask */
2014 static int modify_qp_mask(enum ib_qp_type qp_type, int mask)
2015 {
2016         switch (qp_type) {
2017         case IB_QPT_XRC_INI:
2018                 return mask & ~(IB_QP_MAX_DEST_RD_ATOMIC | IB_QP_MIN_RNR_TIMER);
2019         case IB_QPT_XRC_TGT:
2020                 return mask & ~(IB_QP_MAX_QP_RD_ATOMIC | IB_QP_RETRY_CNT |
2021                                 IB_QP_RNR_RETRY);
2022         default:
2023                 return mask;
2024         }
2025 }
2026
2027 ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file,
2028                             const char __user *buf, int in_len,
2029                             int out_len)
2030 {
2031         struct ib_uverbs_modify_qp cmd;
2032         struct ib_udata            udata;
2033         struct ib_qp              *qp;
2034         struct ib_qp_attr         *attr;
2035         int                        ret;
2036
2037         if (copy_from_user(&cmd, buf, sizeof cmd))
2038                 return -EFAULT;
2039
2040         INIT_UDATA(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
2041                    out_len);
2042
2043         attr = kmalloc(sizeof *attr, GFP_KERNEL);
2044         if (!attr)
2045                 return -ENOMEM;
2046
2047         qp = idr_read_qp(cmd.qp_handle, file->ucontext);
2048         if (!qp) {
2049                 ret = -EINVAL;
2050                 goto out;
2051         }
2052
2053         attr->qp_state            = cmd.qp_state;
2054         attr->cur_qp_state        = cmd.cur_qp_state;
2055         attr->path_mtu            = cmd.path_mtu;
2056         attr->path_mig_state      = cmd.path_mig_state;
2057         attr->qkey                = cmd.qkey;
2058         attr->rq_psn              = cmd.rq_psn;
2059         attr->sq_psn              = cmd.sq_psn;
2060         attr->dest_qp_num         = cmd.dest_qp_num;
2061         attr->qp_access_flags     = cmd.qp_access_flags;
2062         attr->pkey_index          = cmd.pkey_index;
2063         attr->alt_pkey_index      = cmd.alt_pkey_index;
2064         attr->en_sqd_async_notify = cmd.en_sqd_async_notify;
2065         attr->max_rd_atomic       = cmd.max_rd_atomic;
2066         attr->max_dest_rd_atomic  = cmd.max_dest_rd_atomic;
2067         attr->min_rnr_timer       = cmd.min_rnr_timer;
2068         attr->port_num            = cmd.port_num;
2069         attr->timeout             = cmd.timeout;
2070         attr->retry_cnt           = cmd.retry_cnt;
2071         attr->rnr_retry           = cmd.rnr_retry;
2072         attr->alt_port_num        = cmd.alt_port_num;
2073         attr->alt_timeout         = cmd.alt_timeout;
2074
2075         memcpy(attr->ah_attr.grh.dgid.raw, cmd.dest.dgid, 16);
2076         attr->ah_attr.grh.flow_label        = cmd.dest.flow_label;
2077         attr->ah_attr.grh.sgid_index        = cmd.dest.sgid_index;
2078         attr->ah_attr.grh.hop_limit         = cmd.dest.hop_limit;
2079         attr->ah_attr.grh.traffic_class     = cmd.dest.traffic_class;
2080         attr->ah_attr.dlid                  = cmd.dest.dlid;
2081         attr->ah_attr.sl                    = cmd.dest.sl;
2082         attr->ah_attr.src_path_bits         = cmd.dest.src_path_bits;
2083         attr->ah_attr.static_rate           = cmd.dest.static_rate;
2084         attr->ah_attr.ah_flags              = cmd.dest.is_global ? IB_AH_GRH : 0;
2085         attr->ah_attr.port_num              = cmd.dest.port_num;
2086
2087         memcpy(attr->alt_ah_attr.grh.dgid.raw, cmd.alt_dest.dgid, 16);
2088         attr->alt_ah_attr.grh.flow_label    = cmd.alt_dest.flow_label;
2089         attr->alt_ah_attr.grh.sgid_index    = cmd.alt_dest.sgid_index;
2090         attr->alt_ah_attr.grh.hop_limit     = cmd.alt_dest.hop_limit;
2091         attr->alt_ah_attr.grh.traffic_class = cmd.alt_dest.traffic_class;
2092         attr->alt_ah_attr.dlid              = cmd.alt_dest.dlid;
2093         attr->alt_ah_attr.sl                = cmd.alt_dest.sl;
2094         attr->alt_ah_attr.src_path_bits     = cmd.alt_dest.src_path_bits;
2095         attr->alt_ah_attr.static_rate       = cmd.alt_dest.static_rate;
2096         attr->alt_ah_attr.ah_flags          = cmd.alt_dest.is_global ? IB_AH_GRH : 0;
2097         attr->alt_ah_attr.port_num          = cmd.alt_dest.port_num;
2098
2099         if (qp->real_qp == qp) {
2100                 ret = ib_resolve_eth_l2_attrs(qp, attr, &cmd.attr_mask);
2101                 if (ret)
2102                         goto release_qp;
2103                 ret = qp->device->modify_qp(qp, attr,
2104                         modify_qp_mask(qp->qp_type, cmd.attr_mask), &udata);
2105         } else {
2106                 ret = ib_modify_qp(qp, attr, modify_qp_mask(qp->qp_type, cmd.attr_mask));
2107         }
2108
2109         if (ret)
2110                 goto release_qp;
2111
2112         ret = in_len;
2113
2114 release_qp:
2115         put_qp_read(qp);
2116
2117 out:
2118         kfree(attr);
2119
2120         return ret;
2121 }
2122
2123 ssize_t ib_uverbs_destroy_qp(struct ib_uverbs_file *file,
2124                              const char __user *buf, int in_len,
2125                              int out_len)
2126 {
2127         struct ib_uverbs_destroy_qp      cmd;
2128         struct ib_uverbs_destroy_qp_resp resp;
2129         struct ib_uobject               *uobj;
2130         struct ib_qp                    *qp;
2131         struct ib_uqp_object            *obj;
2132         int                              ret = -EINVAL;
2133
2134         if (copy_from_user(&cmd, buf, sizeof cmd))
2135                 return -EFAULT;
2136
2137         memset(&resp, 0, sizeof resp);
2138
2139         uobj = idr_write_uobj(&ib_uverbs_qp_idr, cmd.qp_handle, file->ucontext);
2140         if (!uobj)
2141                 return -EINVAL;
2142         qp  = uobj->object;
2143         obj = container_of(uobj, struct ib_uqp_object, uevent.uobject);
2144
2145         if (!list_empty(&obj->mcast_list)) {
2146                 put_uobj_write(uobj);
2147                 return -EBUSY;
2148         }
2149
2150         ret = ib_destroy_qp(qp);
2151         if (!ret)
2152                 uobj->live = 0;
2153
2154         put_uobj_write(uobj);
2155
2156         if (ret)
2157                 return ret;
2158
2159         if (obj->uxrcd)
2160                 atomic_dec(&obj->uxrcd->refcnt);
2161
2162         idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
2163
2164         mutex_lock(&file->mutex);
2165         list_del(&uobj->list);
2166         mutex_unlock(&file->mutex);
2167
2168         ib_uverbs_release_uevent(file, &obj->uevent);
2169
2170         resp.events_reported = obj->uevent.events_reported;
2171
2172         put_uobj(uobj);
2173
2174         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2175                          &resp, sizeof resp))
2176                 return -EFAULT;
2177
2178         return in_len;
2179 }
2180
2181 ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
2182                             const char __user *buf, int in_len,
2183                             int out_len)
2184 {
2185         struct ib_uverbs_post_send      cmd;
2186         struct ib_uverbs_post_send_resp resp;
2187         struct ib_uverbs_send_wr       *user_wr;
2188         struct ib_send_wr              *wr = NULL, *last, *next, *bad_wr;
2189         struct ib_qp                   *qp;
2190         int                             i, sg_ind;
2191         int                             is_ud;
2192         ssize_t                         ret = -EINVAL;
2193
2194         if (copy_from_user(&cmd, buf, sizeof cmd))
2195                 return -EFAULT;
2196
2197         if (in_len < sizeof cmd + cmd.wqe_size * cmd.wr_count +
2198             cmd.sge_count * sizeof (struct ib_uverbs_sge))
2199                 return -EINVAL;
2200
2201         if (cmd.wqe_size < sizeof (struct ib_uverbs_send_wr))
2202                 return -EINVAL;
2203
2204         user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL);
2205         if (!user_wr)
2206                 return -ENOMEM;
2207
2208         qp = idr_read_qp(cmd.qp_handle, file->ucontext);
2209         if (!qp)
2210                 goto out;
2211
2212         is_ud = qp->qp_type == IB_QPT_UD;
2213         sg_ind = 0;
2214         last = NULL;
2215         for (i = 0; i < cmd.wr_count; ++i) {
2216                 if (copy_from_user(user_wr,
2217                                    buf + sizeof cmd + i * cmd.wqe_size,
2218                                    cmd.wqe_size)) {
2219                         ret = -EFAULT;
2220                         goto out_put;
2221                 }
2222
2223                 if (user_wr->num_sge + sg_ind > cmd.sge_count) {
2224                         ret = -EINVAL;
2225                         goto out_put;
2226                 }
2227
2228                 next = kmalloc(ALIGN(sizeof *next, sizeof (struct ib_sge)) +
2229                                user_wr->num_sge * sizeof (struct ib_sge),
2230                                GFP_KERNEL);
2231                 if (!next) {
2232                         ret = -ENOMEM;
2233                         goto out_put;
2234                 }
2235
2236                 if (!last)
2237                         wr = next;
2238                 else
2239                         last->next = next;
2240                 last = next;
2241
2242                 next->next       = NULL;
2243                 next->wr_id      = user_wr->wr_id;
2244                 next->num_sge    = user_wr->num_sge;
2245                 next->opcode     = user_wr->opcode;
2246                 next->send_flags = user_wr->send_flags;
2247
2248                 if (is_ud) {
2249                         next->wr.ud.ah = idr_read_ah(user_wr->wr.ud.ah,
2250                                                      file->ucontext);
2251                         if (!next->wr.ud.ah) {
2252                                 ret = -EINVAL;
2253                                 goto out_put;
2254                         }
2255                         next->wr.ud.remote_qpn  = user_wr->wr.ud.remote_qpn;
2256                         next->wr.ud.remote_qkey = user_wr->wr.ud.remote_qkey;
2257                         if (next->opcode == IB_WR_SEND_WITH_IMM)
2258                                 next->ex.imm_data =
2259                                         (__be32 __force) user_wr->ex.imm_data;
2260                 } else {
2261                         switch (next->opcode) {
2262                         case IB_WR_RDMA_WRITE_WITH_IMM:
2263                                 next->ex.imm_data =
2264                                         (__be32 __force) user_wr->ex.imm_data;
2265                         case IB_WR_RDMA_WRITE:
2266                         case IB_WR_RDMA_READ:
2267                                 next->wr.rdma.remote_addr =
2268                                         user_wr->wr.rdma.remote_addr;
2269                                 next->wr.rdma.rkey        =
2270                                         user_wr->wr.rdma.rkey;
2271                                 break;
2272                         case IB_WR_SEND_WITH_IMM:
2273                                 next->ex.imm_data =
2274                                         (__be32 __force) user_wr->ex.imm_data;
2275                                 break;
2276                         case IB_WR_SEND_WITH_INV:
2277                                 next->ex.invalidate_rkey =
2278                                         user_wr->ex.invalidate_rkey;
2279                                 break;
2280                         case IB_WR_ATOMIC_CMP_AND_SWP:
2281                         case IB_WR_ATOMIC_FETCH_AND_ADD:
2282                                 next->wr.atomic.remote_addr =
2283                                         user_wr->wr.atomic.remote_addr;
2284                                 next->wr.atomic.compare_add =
2285                                         user_wr->wr.atomic.compare_add;
2286                                 next->wr.atomic.swap = user_wr->wr.atomic.swap;
2287                                 next->wr.atomic.rkey = user_wr->wr.atomic.rkey;
2288                                 break;
2289                         default:
2290                                 break;
2291                         }
2292                 }
2293
2294                 if (next->num_sge) {
2295                         next->sg_list = (void *) next +
2296                                 ALIGN(sizeof *next, sizeof (struct ib_sge));
2297                         if (copy_from_user(next->sg_list,
2298                                            buf + sizeof cmd +
2299                                            cmd.wr_count * cmd.wqe_size +
2300                                            sg_ind * sizeof (struct ib_sge),
2301                                            next->num_sge * sizeof (struct ib_sge))) {
2302                                 ret = -EFAULT;
2303                                 goto out_put;
2304                         }
2305                         sg_ind += next->num_sge;
2306                 } else
2307                         next->sg_list = NULL;
2308         }
2309
2310         resp.bad_wr = 0;
2311         ret = qp->device->post_send(qp->real_qp, wr, &bad_wr);
2312         if (ret)
2313                 for (next = wr; next; next = next->next) {
2314                         ++resp.bad_wr;
2315                         if (next == bad_wr)
2316                                 break;
2317                 }
2318
2319         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2320                          &resp, sizeof resp))
2321                 ret = -EFAULT;
2322
2323 out_put:
2324         put_qp_read(qp);
2325
2326         while (wr) {
2327                 if (is_ud && wr->wr.ud.ah)
2328                         put_ah_read(wr->wr.ud.ah);
2329                 next = wr->next;
2330                 kfree(wr);
2331                 wr = next;
2332         }
2333
2334 out:
2335         kfree(user_wr);
2336
2337         return ret ? ret : in_len;
2338 }
2339
2340 static struct ib_recv_wr *ib_uverbs_unmarshall_recv(const char __user *buf,
2341                                                     int in_len,
2342                                                     u32 wr_count,
2343                                                     u32 sge_count,
2344                                                     u32 wqe_size)
2345 {
2346         struct ib_uverbs_recv_wr *user_wr;
2347         struct ib_recv_wr        *wr = NULL, *last, *next;
2348         int                       sg_ind;
2349         int                       i;
2350         int                       ret;
2351
2352         if (in_len < wqe_size * wr_count +
2353             sge_count * sizeof (struct ib_uverbs_sge))
2354                 return ERR_PTR(-EINVAL);
2355
2356         if (wqe_size < sizeof (struct ib_uverbs_recv_wr))
2357                 return ERR_PTR(-EINVAL);
2358
2359         user_wr = kmalloc(wqe_size, GFP_KERNEL);
2360         if (!user_wr)
2361                 return ERR_PTR(-ENOMEM);
2362
2363         sg_ind = 0;
2364         last = NULL;
2365         for (i = 0; i < wr_count; ++i) {
2366                 if (copy_from_user(user_wr, buf + i * wqe_size,
2367                                    wqe_size)) {
2368                         ret = -EFAULT;
2369                         goto err;
2370                 }
2371
2372                 if (user_wr->num_sge + sg_ind > sge_count) {
2373                         ret = -EINVAL;
2374                         goto err;
2375                 }
2376
2377                 next = kmalloc(ALIGN(sizeof *next, sizeof (struct ib_sge)) +
2378                                user_wr->num_sge * sizeof (struct ib_sge),
2379                                GFP_KERNEL);
2380                 if (!next) {
2381                         ret = -ENOMEM;
2382                         goto err;
2383                 }
2384
2385                 if (!last)
2386                         wr = next;
2387                 else
2388                         last->next = next;
2389                 last = next;
2390
2391                 next->next       = NULL;
2392                 next->wr_id      = user_wr->wr_id;
2393                 next->num_sge    = user_wr->num_sge;
2394
2395                 if (next->num_sge) {
2396                         next->sg_list = (void *) next +
2397                                 ALIGN(sizeof *next, sizeof (struct ib_sge));
2398                         if (copy_from_user(next->sg_list,
2399                                            buf + wr_count * wqe_size +
2400                                            sg_ind * sizeof (struct ib_sge),
2401                                            next->num_sge * sizeof (struct ib_sge))) {
2402                                 ret = -EFAULT;
2403                                 goto err;
2404                         }
2405                         sg_ind += next->num_sge;
2406                 } else
2407                         next->sg_list = NULL;
2408         }
2409
2410         kfree(user_wr);
2411         return wr;
2412
2413 err:
2414         kfree(user_wr);
2415
2416         while (wr) {
2417                 next = wr->next;
2418                 kfree(wr);
2419                 wr = next;
2420         }
2421
2422         return ERR_PTR(ret);
2423 }
2424
2425 ssize_t ib_uverbs_post_recv(struct ib_uverbs_file *file,
2426                             const char __user *buf, int in_len,
2427                             int out_len)
2428 {
2429         struct ib_uverbs_post_recv      cmd;
2430         struct ib_uverbs_post_recv_resp resp;
2431         struct ib_recv_wr              *wr, *next, *bad_wr;
2432         struct ib_qp                   *qp;
2433         ssize_t                         ret = -EINVAL;
2434
2435         if (copy_from_user(&cmd, buf, sizeof cmd))
2436                 return -EFAULT;
2437
2438         wr = ib_uverbs_unmarshall_recv(buf + sizeof cmd,
2439                                        in_len - sizeof cmd, cmd.wr_count,
2440                                        cmd.sge_count, cmd.wqe_size);
2441         if (IS_ERR(wr))
2442                 return PTR_ERR(wr);
2443
2444         qp = idr_read_qp(cmd.qp_handle, file->ucontext);
2445         if (!qp)
2446                 goto out;
2447
2448         resp.bad_wr = 0;
2449         ret = qp->device->post_recv(qp->real_qp, wr, &bad_wr);
2450
2451         put_qp_read(qp);
2452
2453         if (ret)
2454                 for (next = wr; next; next = next->next) {
2455                         ++resp.bad_wr;
2456                         if (next == bad_wr)
2457                                 break;
2458                 }
2459
2460         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2461                          &resp, sizeof resp))
2462                 ret = -EFAULT;
2463
2464 out:
2465         while (wr) {
2466                 next = wr->next;
2467                 kfree(wr);
2468                 wr = next;
2469         }
2470
2471         return ret ? ret : in_len;
2472 }
2473
2474 ssize_t ib_uverbs_post_srq_recv(struct ib_uverbs_file *file,
2475                                 const char __user *buf, int in_len,
2476                                 int out_len)
2477 {
2478         struct ib_uverbs_post_srq_recv      cmd;
2479         struct ib_uverbs_post_srq_recv_resp resp;
2480         struct ib_recv_wr                  *wr, *next, *bad_wr;
2481         struct ib_srq                      *srq;
2482         ssize_t                             ret = -EINVAL;
2483
2484         if (copy_from_user(&cmd, buf, sizeof cmd))
2485                 return -EFAULT;
2486
2487         wr = ib_uverbs_unmarshall_recv(buf + sizeof cmd,
2488                                        in_len - sizeof cmd, cmd.wr_count,
2489                                        cmd.sge_count, cmd.wqe_size);
2490         if (IS_ERR(wr))
2491                 return PTR_ERR(wr);
2492
2493         srq = idr_read_srq(cmd.srq_handle, file->ucontext);
2494         if (!srq)
2495                 goto out;
2496
2497         resp.bad_wr = 0;
2498         ret = srq->device->post_srq_recv(srq, wr, &bad_wr);
2499
2500         put_srq_read(srq);
2501
2502         if (ret)
2503                 for (next = wr; next; next = next->next) {
2504                         ++resp.bad_wr;
2505                         if (next == bad_wr)
2506                                 break;
2507                 }
2508
2509         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2510                          &resp, sizeof resp))
2511                 ret = -EFAULT;
2512
2513 out:
2514         while (wr) {
2515                 next = wr->next;
2516                 kfree(wr);
2517                 wr = next;
2518         }
2519
2520         return ret ? ret : in_len;
2521 }
2522
2523 ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
2524                             const char __user *buf, int in_len,
2525                             int out_len)
2526 {
2527         struct ib_uverbs_create_ah       cmd;
2528         struct ib_uverbs_create_ah_resp  resp;
2529         struct ib_uobject               *uobj;
2530         struct ib_pd                    *pd;
2531         struct ib_ah                    *ah;
2532         struct ib_ah_attr               attr;
2533         int ret;
2534
2535         if (out_len < sizeof resp)
2536                 return -ENOSPC;
2537
2538         if (copy_from_user(&cmd, buf, sizeof cmd))
2539                 return -EFAULT;
2540
2541         uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
2542         if (!uobj)
2543                 return -ENOMEM;
2544
2545         init_uobj(uobj, cmd.user_handle, file->ucontext, &ah_lock_class);
2546         down_write(&uobj->mutex);
2547
2548         pd = idr_read_pd(cmd.pd_handle, file->ucontext);
2549         if (!pd) {
2550                 ret = -EINVAL;
2551                 goto err;
2552         }
2553
2554         attr.dlid              = cmd.attr.dlid;
2555         attr.sl                = cmd.attr.sl;
2556         attr.src_path_bits     = cmd.attr.src_path_bits;
2557         attr.static_rate       = cmd.attr.static_rate;
2558         attr.ah_flags          = cmd.attr.is_global ? IB_AH_GRH : 0;
2559         attr.port_num          = cmd.attr.port_num;
2560         attr.grh.flow_label    = cmd.attr.grh.flow_label;
2561         attr.grh.sgid_index    = cmd.attr.grh.sgid_index;
2562         attr.grh.hop_limit     = cmd.attr.grh.hop_limit;
2563         attr.grh.traffic_class = cmd.attr.grh.traffic_class;
2564         attr.vlan_id           = 0;
2565         memset(&attr.dmac, 0, sizeof(attr.dmac));
2566         memcpy(attr.grh.dgid.raw, cmd.attr.grh.dgid, 16);
2567
2568         ah = ib_create_ah(pd, &attr);
2569         if (IS_ERR(ah)) {
2570                 ret = PTR_ERR(ah);
2571                 goto err_put;
2572         }
2573
2574         ah->uobject  = uobj;
2575         uobj->object = ah;
2576
2577         ret = idr_add_uobj(&ib_uverbs_ah_idr, uobj);
2578         if (ret)
2579                 goto err_destroy;
2580
2581         resp.ah_handle = uobj->id;
2582
2583         if (copy_to_user((void __user *) (unsigned long) cmd.response,
2584                          &resp, sizeof resp)) {
2585                 ret = -EFAULT;
2586                 goto err_copy;
2587         }
2588
2589         put_pd_read(pd);
2590
2591         mutex_lock(&file->mutex);
2592         list_add_tail(&uobj->list, &file->ucontext->ah_list);
2593         mutex_unlock(&file->mutex);
2594
2595         uobj->live = 1;
2596
2597         up_write(&uobj->mutex);
2598
2599         return in_len;
2600
2601 err_copy:
2602         idr_remove_uobj(&ib_uverbs_ah_idr, uobj);
2603
2604 err_destroy:
2605         ib_destroy_ah(ah);
2606
2607 err_put:
2608         put_pd_read(pd);
2609
2610 err:
2611         put_uobj_write(uobj);
2612         return ret;
2613 }
2614
2615 ssize_t ib_uverbs_destroy_ah(struct ib_uverbs_file *file,
2616                              const char __user *buf, int in_len, int out_len)
2617 {
2618         struct ib_uverbs_destroy_ah cmd;
2619         struct ib_ah               *ah;
2620         struct ib_uobject          *uobj;
2621         int                         ret;
2622
2623         if (copy_from_user(&cmd, buf, sizeof cmd))
2624                 return -EFAULT;
2625
2626         uobj = idr_write_uobj(&ib_uverbs_ah_idr, cmd.ah_handle, file->ucontext);
2627         if (!uobj)
2628                 return -EINVAL;
2629         ah = uobj->object;
2630
2631         ret = ib_destroy_ah(ah);
2632         if (!ret)
2633                 uobj->live = 0;
2634
2635         put_uobj_write(uobj);
2636
2637         if (ret)
2638                 return ret;
2639
2640         idr_remove_uobj(&ib_uverbs_ah_idr, uobj);
2641
2642         mutex_lock(&file->mutex);
2643         list_del(&uobj->list);
2644         mutex_unlock(&file->mutex);
2645
2646         put_uobj(uobj);
2647
2648         return in_len;
2649 }
2650
2651 ssize_t ib_uverbs_attach_mcast(struct ib_uverbs_file *file,
2652                                const char __user *buf, int in_len,
2653                                int out_len)
2654 {
2655         struct ib_uverbs_attach_mcast cmd;
2656         struct ib_qp                 *qp;
2657         struct ib_uqp_object         *obj;
2658         struct ib_uverbs_mcast_entry *mcast;
2659         int                           ret;
2660
2661         if (copy_from_user(&cmd, buf, sizeof cmd))
2662                 return -EFAULT;
2663
2664         qp = idr_write_qp(cmd.qp_handle, file->ucontext);
2665         if (!qp)
2666                 return -EINVAL;
2667
2668         obj = container_of(qp->uobject, struct ib_uqp_object, uevent.uobject);
2669
2670         list_for_each_entry(mcast, &obj->mcast_list, list)
2671                 if (cmd.mlid == mcast->lid &&
2672                     !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
2673                         ret = 0;
2674                         goto out_put;
2675                 }
2676
2677         mcast = kmalloc(sizeof *mcast, GFP_KERNEL);
2678         if (!mcast) {
2679                 ret = -ENOMEM;
2680                 goto out_put;
2681         }
2682
2683         mcast->lid = cmd.mlid;
2684         memcpy(mcast->gid.raw, cmd.gid, sizeof mcast->gid.raw);
2685
2686         ret = ib_attach_mcast(qp, &mcast->gid, cmd.mlid);
2687         if (!ret)
2688                 list_add_tail(&mcast->list, &obj->mcast_list);
2689         else
2690                 kfree(mcast);
2691
2692 out_put:
2693         put_qp_write(qp);
2694
2695         return ret ? ret : in_len;
2696 }
2697
2698 ssize_t ib_uverbs_detach_mcast(struct ib_uverbs_file *file,
2699                                const char __user *buf, int in_len,
2700                                int out_len)
2701 {
2702         struct ib_uverbs_detach_mcast cmd;
2703         struct ib_uqp_object         *obj;
2704         struct ib_qp                 *qp;
2705         struct ib_uverbs_mcast_entry *mcast;
2706         int                           ret = -EINVAL;
2707
2708         if (copy_from_user(&cmd, buf, sizeof cmd))
2709                 return -EFAULT;
2710
2711         qp = idr_write_qp(cmd.qp_handle, file->ucontext);
2712         if (!qp)
2713                 return -EINVAL;
2714
2715         ret = ib_detach_mcast(qp, (union ib_gid *) cmd.gid, cmd.mlid);
2716         if (ret)
2717                 goto out_put;
2718
2719         obj = container_of(qp->uobject, struct ib_uqp_object, uevent.uobject);
2720
2721         list_for_each_entry(mcast, &obj->mcast_list, list)
2722                 if (cmd.mlid == mcast->lid &&
2723                     !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
2724                         list_del(&mcast->list);
2725                         kfree(mcast);
2726                         break;
2727                 }
2728
2729 out_put:
2730         put_qp_write(qp);
2731
2732         return ret ? ret : in_len;
2733 }
2734
2735 static int kern_spec_to_ib_spec(struct ib_uverbs_flow_spec *kern_spec,
2736                                 union ib_flow_spec *ib_spec)
2737 {
2738         if (kern_spec->reserved)
2739                 return -EINVAL;
2740
2741         ib_spec->type = kern_spec->type;
2742
2743         switch (ib_spec->type) {
2744         case IB_FLOW_SPEC_ETH:
2745                 ib_spec->eth.size = sizeof(struct ib_flow_spec_eth);
2746                 if (ib_spec->eth.size != kern_spec->eth.size)
2747                         return -EINVAL;
2748                 memcpy(&ib_spec->eth.val, &kern_spec->eth.val,
2749                        sizeof(struct ib_flow_eth_filter));
2750                 memcpy(&ib_spec->eth.mask, &kern_spec->eth.mask,
2751                        sizeof(struct ib_flow_eth_filter));
2752                 break;
2753         case IB_FLOW_SPEC_IPV4:
2754                 ib_spec->ipv4.size = sizeof(struct ib_flow_spec_ipv4);
2755                 if (ib_spec->ipv4.size != kern_spec->ipv4.size)
2756                         return -EINVAL;
2757                 memcpy(&ib_spec->ipv4.val, &kern_spec->ipv4.val,
2758                        sizeof(struct ib_flow_ipv4_filter));
2759                 memcpy(&ib_spec->ipv4.mask, &kern_spec->ipv4.mask,
2760                        sizeof(struct ib_flow_ipv4_filter));
2761                 break;
2762         case IB_FLOW_SPEC_TCP:
2763         case IB_FLOW_SPEC_UDP:
2764                 ib_spec->tcp_udp.size = sizeof(struct ib_flow_spec_tcp_udp);
2765                 if (ib_spec->tcp_udp.size != kern_spec->tcp_udp.size)
2766                         return -EINVAL;
2767                 memcpy(&ib_spec->tcp_udp.val, &kern_spec->tcp_udp.val,
2768                        sizeof(struct ib_flow_tcp_udp_filter));
2769                 memcpy(&ib_spec->tcp_udp.mask, &kern_spec->tcp_udp.mask,
2770                        sizeof(struct ib_flow_tcp_udp_filter));
2771                 break;
2772         default:
2773                 return -EINVAL;
2774         }
2775         return 0;
2776 }
2777
2778 int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file,
2779                              struct ib_udata *ucore,
2780                              struct ib_udata *uhw)
2781 {
2782         struct ib_uverbs_create_flow      cmd;
2783         struct ib_uverbs_create_flow_resp resp;
2784         struct ib_uobject                 *uobj;
2785         struct ib_flow                    *flow_id;
2786         struct ib_uverbs_flow_attr        *kern_flow_attr;
2787         struct ib_flow_attr               *flow_attr;
2788         struct ib_qp                      *qp;
2789         int err = 0;
2790         void *kern_spec;
2791         void *ib_spec;
2792         int i;
2793
2794         if (ucore->inlen < sizeof(cmd))
2795                 return -EINVAL;
2796
2797         if (ucore->outlen < sizeof(resp))
2798                 return -ENOSPC;
2799
2800         err = ib_copy_from_udata(&cmd, ucore, sizeof(cmd));
2801         if (err)
2802                 return err;
2803
2804         ucore->inbuf += sizeof(cmd);
2805         ucore->inlen -= sizeof(cmd);
2806
2807         if (cmd.comp_mask)
2808                 return -EINVAL;
2809
2810         if ((cmd.flow_attr.type == IB_FLOW_ATTR_SNIFFER &&
2811              !capable(CAP_NET_ADMIN)) || !capable(CAP_NET_RAW))
2812                 return -EPERM;
2813
2814         if (cmd.flow_attr.num_of_specs > IB_FLOW_SPEC_SUPPORT_LAYERS)
2815                 return -EINVAL;
2816
2817         if (cmd.flow_attr.size > ucore->inlen ||
2818             cmd.flow_attr.size >
2819             (cmd.flow_attr.num_of_specs * sizeof(struct ib_uverbs_flow_spec)))
2820                 return -EINVAL;
2821
2822         if (cmd.flow_attr.reserved[0] ||
2823             cmd.flow_attr.reserved[1])
2824                 return -EINVAL;
2825
2826         if (cmd.flow_attr.num_of_specs) {
2827                 kern_flow_attr = kmalloc(sizeof(*kern_flow_attr) + cmd.flow_attr.size,
2828                                          GFP_KERNEL);
2829                 if (!kern_flow_attr)
2830                         return -ENOMEM;
2831
2832                 memcpy(kern_flow_attr, &cmd.flow_attr, sizeof(*kern_flow_attr));
2833                 err = ib_copy_from_udata(kern_flow_attr + 1, ucore,
2834                                          cmd.flow_attr.size);
2835                 if (err)
2836                         goto err_free_attr;
2837         } else {
2838                 kern_flow_attr = &cmd.flow_attr;
2839         }
2840
2841         uobj = kmalloc(sizeof(*uobj), GFP_KERNEL);
2842         if (!uobj) {
2843                 err = -ENOMEM;
2844                 goto err_free_attr;
2845         }
2846         init_uobj(uobj, 0, file->ucontext, &rule_lock_class);
2847         down_write(&uobj->mutex);
2848
2849         qp = idr_read_qp(cmd.qp_handle, file->ucontext);
2850         if (!qp) {
2851                 err = -EINVAL;
2852                 goto err_uobj;
2853         }
2854
2855         flow_attr = kmalloc(sizeof(*flow_attr) + cmd.flow_attr.size, GFP_KERNEL);
2856         if (!flow_attr) {
2857                 err = -ENOMEM;
2858                 goto err_put;
2859         }
2860
2861         flow_attr->type = kern_flow_attr->type;
2862         flow_attr->priority = kern_flow_attr->priority;
2863         flow_attr->num_of_specs = kern_flow_attr->num_of_specs;
2864         flow_attr->port = kern_flow_attr->port;
2865         flow_attr->flags = kern_flow_attr->flags;
2866         flow_attr->size = sizeof(*flow_attr);
2867
2868         kern_spec = kern_flow_attr + 1;
2869         ib_spec = flow_attr + 1;
2870         for (i = 0; i < flow_attr->num_of_specs &&
2871              cmd.flow_attr.size > offsetof(struct ib_uverbs_flow_spec, reserved) &&
2872              cmd.flow_attr.size >=
2873              ((struct ib_uverbs_flow_spec *)kern_spec)->size; i++) {
2874                 err = kern_spec_to_ib_spec(kern_spec, ib_spec);
2875                 if (err)
2876                         goto err_free;
2877                 flow_attr->size +=
2878                         ((union ib_flow_spec *) ib_spec)->size;
2879                 cmd.flow_attr.size -= ((struct ib_uverbs_flow_spec *)kern_spec)->size;
2880                 kern_spec += ((struct ib_uverbs_flow_spec *) kern_spec)->size;
2881                 ib_spec += ((union ib_flow_spec *) ib_spec)->size;
2882         }
2883         if (cmd.flow_attr.size || (i != flow_attr->num_of_specs)) {
2884                 pr_warn("create flow failed, flow %d: %d bytes left from uverb cmd\n",
2885                         i, cmd.flow_attr.size);
2886                 err = -EINVAL;
2887                 goto err_free;
2888         }
2889         flow_id = ib_create_flow(qp, flow_attr, IB_FLOW_DOMAIN_USER);
2890         if (IS_ERR(flow_id)) {
2891                 err = PTR_ERR(flow_id);
2892                 goto err_free;
2893         }
2894         flow_id->qp = qp;
2895         flow_id->uobject = uobj;
2896         uobj->object = flow_id;
2897
2898         err = idr_add_uobj(&ib_uverbs_rule_idr, uobj);
2899         if (err)
2900                 goto destroy_flow;
2901
2902         memset(&resp, 0, sizeof(resp));
2903         resp.flow_handle = uobj->id;
2904
2905         err = ib_copy_to_udata(ucore,
2906                                &resp, sizeof(resp));
2907         if (err)
2908                 goto err_copy;
2909
2910         put_qp_read(qp);
2911         mutex_lock(&file->mutex);
2912         list_add_tail(&uobj->list, &file->ucontext->rule_list);
2913         mutex_unlock(&file->mutex);
2914
2915         uobj->live = 1;
2916
2917         up_write(&uobj->mutex);
2918         kfree(flow_attr);
2919         if (cmd.flow_attr.num_of_specs)
2920                 kfree(kern_flow_attr);
2921         return 0;
2922 err_copy:
2923         idr_remove_uobj(&ib_uverbs_rule_idr, uobj);
2924 destroy_flow:
2925         ib_destroy_flow(flow_id);
2926 err_free:
2927         kfree(flow_attr);
2928 err_put:
2929         put_qp_read(qp);
2930 err_uobj:
2931         put_uobj_write(uobj);
2932 err_free_attr:
2933         if (cmd.flow_attr.num_of_specs)
2934                 kfree(kern_flow_attr);
2935         return err;
2936 }
2937
2938 int ib_uverbs_ex_destroy_flow(struct ib_uverbs_file *file,
2939                               struct ib_udata *ucore,
2940                               struct ib_udata *uhw)
2941 {
2942         struct ib_uverbs_destroy_flow   cmd;
2943         struct ib_flow                  *flow_id;
2944         struct ib_uobject               *uobj;
2945         int                             ret;
2946
2947         if (ucore->inlen < sizeof(cmd))
2948                 return -EINVAL;
2949
2950         ret = ib_copy_from_udata(&cmd, ucore, sizeof(cmd));
2951         if (ret)
2952                 return ret;
2953
2954         if (cmd.comp_mask)
2955                 return -EINVAL;
2956
2957         uobj = idr_write_uobj(&ib_uverbs_rule_idr, cmd.flow_handle,
2958                               file->ucontext);
2959         if (!uobj)
2960                 return -EINVAL;
2961         flow_id = uobj->object;
2962
2963         ret = ib_destroy_flow(flow_id);
2964         if (!ret)
2965                 uobj->live = 0;
2966
2967         put_uobj_write(uobj);
2968
2969         idr_remove_uobj(&ib_uverbs_rule_idr, uobj);
2970
2971         mutex_lock(&file->mutex);
2972         list_del(&uobj->list);
2973         mutex_unlock(&file->mutex);
2974
2975         put_uobj(uobj);
2976
2977         return ret;
2978 }
2979
2980 static int __uverbs_create_xsrq(struct ib_uverbs_file *file,
2981                                 struct ib_uverbs_create_xsrq *cmd,
2982                                 struct ib_udata *udata)
2983 {
2984         struct ib_uverbs_create_srq_resp resp;
2985         struct ib_usrq_object           *obj;
2986         struct ib_pd                    *pd;
2987         struct ib_srq                   *srq;
2988         struct ib_uobject               *uninitialized_var(xrcd_uobj);
2989         struct ib_srq_init_attr          attr;
2990         int ret;
2991
2992         obj = kmalloc(sizeof *obj, GFP_KERNEL);
2993         if (!obj)
2994                 return -ENOMEM;
2995
2996         init_uobj(&obj->uevent.uobject, cmd->user_handle, file->ucontext, &srq_lock_class);
2997         down_write(&obj->uevent.uobject.mutex);
2998
2999         if (cmd->srq_type == IB_SRQT_XRC) {
3000                 attr.ext.xrc.xrcd  = idr_read_xrcd(cmd->xrcd_handle, file->ucontext, &xrcd_uobj);
3001                 if (!attr.ext.xrc.xrcd) {
3002                         ret = -EINVAL;
3003                         goto err;
3004                 }
3005
3006                 obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object, uobject);
3007                 atomic_inc(&obj->uxrcd->refcnt);
3008
3009                 attr.ext.xrc.cq  = idr_read_cq(cmd->cq_handle, file->ucontext, 0);
3010                 if (!attr.ext.xrc.cq) {
3011                         ret = -EINVAL;
3012                         goto err_put_xrcd;
3013                 }
3014         }
3015
3016         pd  = idr_read_pd(cmd->pd_handle, file->ucontext);
3017         if (!pd) {
3018                 ret = -EINVAL;
3019                 goto err_put_cq;
3020         }
3021
3022         attr.event_handler  = ib_uverbs_srq_event_handler;
3023         attr.srq_context    = file;
3024         attr.srq_type       = cmd->srq_type;
3025         attr.attr.max_wr    = cmd->max_wr;
3026         attr.attr.max_sge   = cmd->max_sge;
3027         attr.attr.srq_limit = cmd->srq_limit;
3028
3029         obj->uevent.events_reported = 0;
3030         INIT_LIST_HEAD(&obj->uevent.event_list);
3031
3032         srq = pd->device->create_srq(pd, &attr, udata);
3033         if (IS_ERR(srq)) {
3034                 ret = PTR_ERR(srq);
3035                 goto err_put;
3036         }
3037
3038         srq->device        = pd->device;
3039         srq->pd            = pd;
3040         srq->srq_type      = cmd->srq_type;
3041         srq->uobject       = &obj->uevent.uobject;
3042         srq->event_handler = attr.event_handler;
3043         srq->srq_context   = attr.srq_context;
3044
3045         if (cmd->srq_type == IB_SRQT_XRC) {
3046                 srq->ext.xrc.cq   = attr.ext.xrc.cq;
3047                 srq->ext.xrc.xrcd = attr.ext.xrc.xrcd;
3048                 atomic_inc(&attr.ext.xrc.cq->usecnt);
3049                 atomic_inc(&attr.ext.xrc.xrcd->usecnt);
3050         }
3051
3052         atomic_inc(&pd->usecnt);
3053         atomic_set(&srq->usecnt, 0);
3054
3055         obj->uevent.uobject.object = srq;
3056         ret = idr_add_uobj(&ib_uverbs_srq_idr, &obj->uevent.uobject);
3057         if (ret)
3058                 goto err_destroy;
3059
3060         memset(&resp, 0, sizeof resp);
3061         resp.srq_handle = obj->uevent.uobject.id;
3062         resp.max_wr     = attr.attr.max_wr;
3063         resp.max_sge    = attr.attr.max_sge;
3064         if (cmd->srq_type == IB_SRQT_XRC)
3065                 resp.srqn = srq->ext.xrc.srq_num;
3066
3067         if (copy_to_user((void __user *) (unsigned long) cmd->response,
3068                          &resp, sizeof resp)) {
3069                 ret = -EFAULT;
3070                 goto err_copy;
3071         }
3072
3073         if (cmd->srq_type == IB_SRQT_XRC) {
3074                 put_uobj_read(xrcd_uobj);
3075                 put_cq_read(attr.ext.xrc.cq);
3076         }
3077         put_pd_read(pd);
3078
3079         mutex_lock(&file->mutex);
3080         list_add_tail(&obj->uevent.uobject.list, &file->ucontext->srq_list);
3081         mutex_unlock(&file->mutex);
3082
3083         obj->uevent.uobject.live = 1;
3084
3085         up_write(&obj->uevent.uobject.mutex);
3086
3087         return 0;
3088
3089 err_copy:
3090         idr_remove_uobj(&ib_uverbs_srq_idr, &obj->uevent.uobject);
3091
3092 err_destroy:
3093         ib_destroy_srq(srq);
3094
3095 err_put:
3096         put_pd_read(pd);
3097
3098 err_put_cq:
3099         if (cmd->srq_type == IB_SRQT_XRC)
3100                 put_cq_read(attr.ext.xrc.cq);
3101
3102 err_put_xrcd:
3103         if (cmd->srq_type == IB_SRQT_XRC) {
3104                 atomic_dec(&obj->uxrcd->refcnt);
3105                 put_uobj_read(xrcd_uobj);
3106         }
3107
3108 err:
3109         put_uobj_write(&obj->uevent.uobject);
3110         return ret;
3111 }
3112
3113 ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file,
3114                              const char __user *buf, int in_len,
3115                              int out_len)
3116 {
3117         struct ib_uverbs_create_srq      cmd;
3118         struct ib_uverbs_create_xsrq     xcmd;
3119         struct ib_uverbs_create_srq_resp resp;
3120         struct ib_udata                  udata;
3121         int ret;
3122
3123         if (out_len < sizeof resp)
3124                 return -ENOSPC;
3125
3126         if (copy_from_user(&cmd, buf, sizeof cmd))
3127                 return -EFAULT;
3128
3129         xcmd.response    = cmd.response;
3130         xcmd.user_handle = cmd.user_handle;
3131         xcmd.srq_type    = IB_SRQT_BASIC;
3132         xcmd.pd_handle   = cmd.pd_handle;
3133         xcmd.max_wr      = cmd.max_wr;
3134         xcmd.max_sge     = cmd.max_sge;
3135         xcmd.srq_limit   = cmd.srq_limit;
3136
3137         INIT_UDATA(&udata, buf + sizeof cmd,
3138                    (unsigned long) cmd.response + sizeof resp,
3139                    in_len - sizeof cmd, out_len - sizeof resp);
3140
3141         ret = __uverbs_create_xsrq(file, &xcmd, &udata);
3142         if (ret)
3143                 return ret;
3144
3145         return in_len;
3146 }
3147
3148 ssize_t ib_uverbs_create_xsrq(struct ib_uverbs_file *file,
3149                               const char __user *buf, int in_len, int out_len)
3150 {
3151         struct ib_uverbs_create_xsrq     cmd;
3152         struct ib_uverbs_create_srq_resp resp;
3153         struct ib_udata                  udata;
3154         int ret;
3155
3156         if (out_len < sizeof resp)
3157                 return -ENOSPC;
3158
3159         if (copy_from_user(&cmd, buf, sizeof cmd))
3160                 return -EFAULT;
3161
3162         INIT_UDATA(&udata, buf + sizeof cmd,
3163                    (unsigned long) cmd.response + sizeof resp,
3164                    in_len - sizeof cmd, out_len - sizeof resp);
3165
3166         ret = __uverbs_create_xsrq(file, &cmd, &udata);
3167         if (ret)
3168                 return ret;
3169
3170         return in_len;
3171 }
3172
3173 ssize_t ib_uverbs_modify_srq(struct ib_uverbs_file *file,
3174                              const char __user *buf, int in_len,
3175                              int out_len)
3176 {
3177         struct ib_uverbs_modify_srq cmd;
3178         struct ib_udata             udata;
3179         struct ib_srq              *srq;
3180         struct ib_srq_attr          attr;
3181         int                         ret;
3182
3183         if (copy_from_user(&cmd, buf, sizeof cmd))
3184                 return -EFAULT;
3185
3186         INIT_UDATA(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
3187                    out_len);
3188
3189         srq = idr_read_srq(cmd.srq_handle, file->ucontext);
3190         if (!srq)
3191                 return -EINVAL;
3192
3193         attr.max_wr    = cmd.max_wr;
3194         attr.srq_limit = cmd.srq_limit;
3195
3196         ret = srq->device->modify_srq(srq, &attr, cmd.attr_mask, &udata);
3197
3198         put_srq_read(srq);
3199
3200         return ret ? ret : in_len;
3201 }
3202
3203 ssize_t ib_uverbs_query_srq(struct ib_uverbs_file *file,
3204                             const char __user *buf,
3205                             int in_len, int out_len)
3206 {
3207         struct ib_uverbs_query_srq      cmd;
3208         struct ib_uverbs_query_srq_resp resp;
3209         struct ib_srq_attr              attr;
3210         struct ib_srq                   *srq;
3211         int                             ret;
3212
3213         if (out_len < sizeof resp)
3214                 return -ENOSPC;
3215
3216         if (copy_from_user(&cmd, buf, sizeof cmd))
3217                 return -EFAULT;
3218
3219         srq = idr_read_srq(cmd.srq_handle, file->ucontext);
3220         if (!srq)
3221                 return -EINVAL;
3222
3223         ret = ib_query_srq(srq, &attr);
3224
3225         put_srq_read(srq);
3226
3227         if (ret)
3228                 return ret;
3229
3230         memset(&resp, 0, sizeof resp);
3231
3232         resp.max_wr    = attr.max_wr;
3233         resp.max_sge   = attr.max_sge;
3234         resp.srq_limit = attr.srq_limit;
3235
3236         if (copy_to_user((void __user *) (unsigned long) cmd.response,
3237                          &resp, sizeof resp))
3238                 return -EFAULT;
3239
3240         return in_len;
3241 }
3242
3243 ssize_t ib_uverbs_destroy_srq(struct ib_uverbs_file *file,
3244                               const char __user *buf, int in_len,
3245                               int out_len)
3246 {
3247         struct ib_uverbs_destroy_srq      cmd;
3248         struct ib_uverbs_destroy_srq_resp resp;
3249         struct ib_uobject                *uobj;
3250         struct ib_srq                    *srq;
3251         struct ib_uevent_object          *obj;
3252         int                               ret = -EINVAL;
3253         struct ib_usrq_object            *us;
3254         enum ib_srq_type                  srq_type;
3255
3256         if (copy_from_user(&cmd, buf, sizeof cmd))
3257                 return -EFAULT;
3258
3259         uobj = idr_write_uobj(&ib_uverbs_srq_idr, cmd.srq_handle, file->ucontext);
3260         if (!uobj)
3261                 return -EINVAL;
3262         srq = uobj->object;
3263         obj = container_of(uobj, struct ib_uevent_object, uobject);
3264         srq_type = srq->srq_type;
3265
3266         ret = ib_destroy_srq(srq);
3267         if (!ret)
3268                 uobj->live = 0;
3269
3270         put_uobj_write(uobj);
3271
3272         if (ret)
3273                 return ret;
3274
3275         if (srq_type == IB_SRQT_XRC) {
3276                 us = container_of(obj, struct ib_usrq_object, uevent);
3277                 atomic_dec(&us->uxrcd->refcnt);
3278         }
3279
3280         idr_remove_uobj(&ib_uverbs_srq_idr, uobj);
3281
3282         mutex_lock(&file->mutex);
3283         list_del(&uobj->list);
3284         mutex_unlock(&file->mutex);
3285
3286         ib_uverbs_release_uevent(file, obj);
3287
3288         memset(&resp, 0, sizeof resp);
3289         resp.events_reported = obj->events_reported;
3290
3291         put_uobj(uobj);
3292
3293         if (copy_to_user((void __user *) (unsigned long) cmd.response,
3294                          &resp, sizeof resp))
3295                 ret = -EFAULT;
3296
3297         return ret ? ret : in_len;
3298 }
3299
3300 int ib_uverbs_ex_query_device(struct ib_uverbs_file *file,
3301                               struct ib_udata *ucore,
3302                               struct ib_udata *uhw)
3303 {
3304         struct ib_uverbs_ex_query_device_resp resp;
3305         struct ib_uverbs_ex_query_device  cmd;
3306         struct ib_device_attr attr;
3307         struct ib_device *device;
3308         int err;
3309
3310         device = file->device->ib_dev;
3311         if (ucore->inlen < sizeof(cmd))
3312                 return -EINVAL;
3313
3314         err = ib_copy_from_udata(&cmd, ucore, sizeof(cmd));
3315         if (err)
3316                 return err;
3317
3318         if (cmd.comp_mask)
3319                 return -EINVAL;
3320
3321         if (cmd.reserved)
3322                 return -EINVAL;
3323
3324         resp.response_length = offsetof(typeof(resp), odp_caps);
3325
3326         if (ucore->outlen < resp.response_length)
3327                 return -ENOSPC;
3328
3329         err = device->query_device(device, &attr);
3330         if (err)
3331                 return err;
3332
3333         copy_query_dev_fields(file, &resp.base, &attr);
3334         resp.comp_mask = 0;
3335
3336         if (ucore->outlen < resp.response_length + sizeof(resp.odp_caps))
3337                 goto end;
3338
3339 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
3340         resp.odp_caps.general_caps = attr.odp_caps.general_caps;
3341         resp.odp_caps.per_transport_caps.rc_odp_caps =
3342                 attr.odp_caps.per_transport_caps.rc_odp_caps;
3343         resp.odp_caps.per_transport_caps.uc_odp_caps =
3344                 attr.odp_caps.per_transport_caps.uc_odp_caps;
3345         resp.odp_caps.per_transport_caps.ud_odp_caps =
3346                 attr.odp_caps.per_transport_caps.ud_odp_caps;
3347         resp.odp_caps.reserved = 0;
3348 #else
3349         memset(&resp.odp_caps, 0, sizeof(resp.odp_caps));
3350 #endif
3351         resp.response_length += sizeof(resp.odp_caps);
3352
3353 end:
3354         err = ib_copy_to_udata(ucore, &resp, resp.response_length);
3355         if (err)
3356                 return err;
3357
3358         return 0;
3359 }