diff options
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_keys.c')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_keys.c | 41 |
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 | */ |
341 | int qib_fast_reg_mr(struct qib_qp *qp, struct ib_send_wr *wr) | 341 | int 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; |