aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/qib/qib_keys.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_keys.c')
-rw-r--r--drivers/infiniband/hw/qib/qib_keys.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/infiniband/hw/qib/qib_keys.c b/drivers/infiniband/hw/qib/qib_keys.c
index 5afaa218508d..d725c565518d 100644
--- a/drivers/infiniband/hw/qib/qib_keys.c
+++ b/drivers/infiniband/hw/qib/qib_keys.c
@@ -336,14 +336,15 @@ bail:
336} 336}
337 337
338/* 338/*
339 * Initialize the memory region specified by the work reqeust. 339 * Initialize the memory region specified by the work request.
340 */ 340 */
341int qib_fast_reg_mr(struct qib_qp *qp, struct ib_send_wr *wr) 341int qib_reg_mr(struct qib_qp *qp, struct ib_reg_wr *wr)
342{ 342{
343 struct qib_lkey_table *rkt = &to_idev(qp->ibqp.device)->lk_table; 343 struct qib_lkey_table *rkt = &to_idev(qp->ibqp.device)->lk_table;
344 struct qib_pd *pd = to_ipd(qp->ibqp.pd); 344 struct qib_pd *pd = to_ipd(qp->ibqp.pd);
345 struct qib_mregion *mr; 345 struct qib_mr *mr = to_imr(wr->mr);
346 u32 rkey = wr->wr.fast_reg.rkey; 346 struct qib_mregion *mrg;
347 u32 key = wr->key;
347 unsigned i, n, m; 348 unsigned i, n, m;
348 int ret = -EINVAL; 349 int ret = -EINVAL;
349 unsigned long flags; 350 unsigned long flags;
@@ -351,33 +352,33 @@ int qib_fast_reg_mr(struct qib_qp *qp, struct ib_send_wr *wr)
351 size_t ps; 352 size_t ps;
352 353
353 spin_lock_irqsave(&rkt->lock, flags); 354 spin_lock_irqsave(&rkt->lock, flags);
354 if (pd->user || rkey == 0) 355 if (pd->user || key == 0)
355 goto bail; 356 goto bail;
356 357
357 mr = rcu_dereference_protected( 358 mrg = rcu_dereference_protected(
358 rkt->table[(rkey >> (32 - ib_qib_lkey_table_size))], 359 rkt->table[(key >> (32 - ib_qib_lkey_table_size))],
359 lockdep_is_held(&rkt->lock)); 360 lockdep_is_held(&rkt->lock));
360 if (unlikely(mr == NULL || qp->ibqp.pd != mr->pd)) 361 if (unlikely(mrg == NULL || qp->ibqp.pd != mrg->pd))
361 goto bail; 362 goto bail;
362 363
363 if (wr->wr.fast_reg.page_list_len > mr->max_segs) 364 if (mr->npages > mrg->max_segs)
364 goto bail; 365 goto bail;
365 366
366 ps = 1UL << wr->wr.fast_reg.page_shift; 367 ps = mr->ibmr.page_size;
367 if (wr->wr.fast_reg.length > ps * wr->wr.fast_reg.page_list_len) 368 if (mr->ibmr.length > ps * mr->npages)
368 goto bail; 369 goto bail;
369 370
370 mr->user_base = wr->wr.fast_reg.iova_start; 371 mrg->user_base = mr->ibmr.iova;
371 mr->iova = wr->wr.fast_reg.iova_start; 372 mrg->iova = mr->ibmr.iova;
372 mr->lkey = rkey; 373 mrg->lkey = key;
373 mr->length = wr->wr.fast_reg.length; 374 mrg->length = mr->ibmr.length;
374 mr->access_flags = wr->wr.fast_reg.access_flags; 375 mrg->access_flags = wr->access;
375 page_list = wr->wr.fast_reg.page_list->page_list; 376 page_list = mr->pages;
376 m = 0; 377 m = 0;
377 n = 0; 378 n = 0;
378 for (i = 0; i < wr->wr.fast_reg.page_list_len; i++) { 379 for (i = 0; i < mr->npages; i++) {
379 mr->map[m]->segs[n].vaddr = (void *) page_list[i]; 380 mrg->map[m]->segs[n].vaddr = (void *) page_list[i];
380 mr->map[m]->segs[n].length = ps; 381 mrg->map[m]->segs[n].length = ps;
381 if (++n == QIB_SEGSZ) { 382 if (++n == QIB_SEGSZ) {
382 m++; 383 m++;
383 n = 0; 384 n = 0;