mem.c (278886) | mem.c (297124) |
---|---|
1/* 2 * Copyright (c) 2009-2013 Chelsio, Inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 16 unchanged lines hidden (view full) --- 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 */ 32#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 2009-2013 Chelsio, Inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 16 unchanged lines hidden (view full) --- 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 */ 32#include <sys/cdefs.h> |
33__FBSDID("$FreeBSD: head/sys/dev/cxgbe/iw_cxgbe/mem.c 278886 2015-02-17 08:40:27Z hselasky $"); | 33__FBSDID("$FreeBSD: head/sys/dev/cxgbe/iw_cxgbe/mem.c 297124 2016-03-21 00:29:45Z np $"); |
34 35#include "opt_inet.h" 36 37#ifdef TCP_OFFLOAD 38#include <linux/types.h> 39#include <linux/kref.h> 40#include <rdma/ib_umem.h> 41#include <asm/atomic.h> 42 43#include <common/t4_msg.h> 44#include "iw_cxgbe.h" 45 46#define T4_ULPTX_MIN_IO 32 47#define C4IW_MAX_INLINE_SIZE 96 48 | 34 35#include "opt_inet.h" 36 37#ifdef TCP_OFFLOAD 38#include <linux/types.h> 39#include <linux/kref.h> 40#include <rdma/ib_umem.h> 41#include <asm/atomic.h> 42 43#include <common/t4_msg.h> 44#include "iw_cxgbe.h" 45 46#define T4_ULPTX_MIN_IO 32 47#define C4IW_MAX_INLINE_SIZE 96 48 |
49static int mr_exceeds_hw_limits(struct c4iw_dev *dev, u64 length) 50{ 51 return (is_t4(dev->rdev.adap) || 52 is_t5(dev->rdev.adap)) && 53 length >= 8*1024*1024*1024ULL; 54} |
|
49static int 50write_adapter_mem(struct c4iw_rdev *rdev, u32 addr, u32 len, void *data) 51{ 52 struct adapter *sc = rdev->adap; 53 struct ulp_mem_io *ulpmc; 54 struct ulptx_idata *ulpsc; 55 u8 wr_len, *to_dp, *from_dp; 56 int copy_len, num_wqe, i, ret = 0; --- 82 unchanged lines hidden (view full) --- 139 if (c4iw_fatal_error(rdev)) 140 return -EIO; 141 142 stag_state = stag_state > 0; 143 stag_idx = (*stag) >> 8; 144 145 if ((!reset_tpt_entry) && (*stag == T4_STAG_UNSET)) { 146 stag_idx = c4iw_get_resource(&rdev->resource.tpt_table); | 55static int 56write_adapter_mem(struct c4iw_rdev *rdev, u32 addr, u32 len, void *data) 57{ 58 struct adapter *sc = rdev->adap; 59 struct ulp_mem_io *ulpmc; 60 struct ulptx_idata *ulpsc; 61 u8 wr_len, *to_dp, *from_dp; 62 int copy_len, num_wqe, i, ret = 0; --- 82 unchanged lines hidden (view full) --- 145 if (c4iw_fatal_error(rdev)) 146 return -EIO; 147 148 stag_state = stag_state > 0; 149 stag_idx = (*stag) >> 8; 150 151 if ((!reset_tpt_entry) && (*stag == T4_STAG_UNSET)) { 152 stag_idx = c4iw_get_resource(&rdev->resource.tpt_table); |
147 if (!stag_idx) | 153 if (!stag_idx) { 154 mutex_lock(&rdev->stats.lock); 155 rdev->stats.stag.fail++; 156 mutex_unlock(&rdev->stats.lock); |
148 return -ENOMEM; | 157 return -ENOMEM; |
158 } |
|
149 mutex_lock(&rdev->stats.lock); 150 rdev->stats.stag.cur += 32; 151 if (rdev->stats.stag.cur > rdev->stats.stag.max) 152 rdev->stats.stag.max = rdev->stats.stag.cur; 153 mutex_unlock(&rdev->stats.lock); 154 *stag = (stag_idx << 8) | (atomic_inc_return(&key) & 0xff); 155 } 156 CTR5(KTR_IW_CXGBE, --- 88 unchanged lines hidden (view full) --- 245 246static int register_mem(struct c4iw_dev *rhp, struct c4iw_pd *php, 247 struct c4iw_mr *mhp, int shift) 248{ 249 u32 stag = T4_STAG_UNSET; 250 int ret; 251 252 ret = write_tpt_entry(&rhp->rdev, 0, &stag, 1, mhp->attr.pdid, | 159 mutex_lock(&rdev->stats.lock); 160 rdev->stats.stag.cur += 32; 161 if (rdev->stats.stag.cur > rdev->stats.stag.max) 162 rdev->stats.stag.max = rdev->stats.stag.cur; 163 mutex_unlock(&rdev->stats.lock); 164 *stag = (stag_idx << 8) | (atomic_inc_return(&key) & 0xff); 165 } 166 CTR5(KTR_IW_CXGBE, --- 88 unchanged lines hidden (view full) --- 255 256static int register_mem(struct c4iw_dev *rhp, struct c4iw_pd *php, 257 struct c4iw_mr *mhp, int shift) 258{ 259 u32 stag = T4_STAG_UNSET; 260 int ret; 261 262 ret = write_tpt_entry(&rhp->rdev, 0, &stag, 1, mhp->attr.pdid, |
253 FW_RI_STAG_NSMR, mhp->attr.perms, | 263 FW_RI_STAG_NSMR, mhp->attr.len ? mhp->attr.perms : 0, |
254 mhp->attr.mw_bind_enable, mhp->attr.zbva, | 264 mhp->attr.mw_bind_enable, mhp->attr.zbva, |
255 mhp->attr.va_fbo, mhp->attr.len, shift - 12, | 265 mhp->attr.va_fbo, mhp->attr.len ? mhp->attr.len : -1, shift - 12, |
256 mhp->attr.pbl_size, mhp->attr.pbl_addr); 257 if (ret) 258 return ret; 259 260 ret = finish_mem_reg(mhp, stag); 261 if (ret) 262 dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, 263 mhp->attr.pbl_addr); --- 112 unchanged lines hidden (view full) --- 376 int num_phys_buf, int acc, u64 *iova_start) 377{ 378 379 struct c4iw_mr mh, *mhp; 380 struct c4iw_pd *php; 381 struct c4iw_dev *rhp; 382 __be64 *page_list = NULL; 383 int shift = 0; | 266 mhp->attr.pbl_size, mhp->attr.pbl_addr); 267 if (ret) 268 return ret; 269 270 ret = finish_mem_reg(mhp, stag); 271 if (ret) 272 dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, 273 mhp->attr.pbl_addr); --- 112 unchanged lines hidden (view full) --- 386 int num_phys_buf, int acc, u64 *iova_start) 387{ 388 389 struct c4iw_mr mh, *mhp; 390 struct c4iw_pd *php; 391 struct c4iw_dev *rhp; 392 __be64 *page_list = NULL; 393 int shift = 0; |
384 u64 total_size; | 394 u64 total_size = 0; |
385 int npages = 0; 386 int ret; 387 388 CTR3(KTR_IW_CXGBE, "%s ib_mr %p ib_pd %p", __func__, mr, pd); 389 390 /* There can be no memory windows */ 391 if (atomic_read(&mr->usecnt)) 392 return -EINVAL; --- 18 unchanged lines hidden (view full) --- 411 if (mr_rereg_mask & IB_MR_REREG_TRANS) { 412 ret = build_phys_page_list(buffer_list, num_phys_buf, 413 iova_start, 414 &total_size, &npages, 415 &shift, &page_list); 416 if (ret) 417 return ret; 418 } | 395 int npages = 0; 396 int ret; 397 398 CTR3(KTR_IW_CXGBE, "%s ib_mr %p ib_pd %p", __func__, mr, pd); 399 400 /* There can be no memory windows */ 401 if (atomic_read(&mr->usecnt)) 402 return -EINVAL; --- 18 unchanged lines hidden (view full) --- 421 if (mr_rereg_mask & IB_MR_REREG_TRANS) { 422 ret = build_phys_page_list(buffer_list, num_phys_buf, 423 iova_start, 424 &total_size, &npages, 425 &shift, &page_list); 426 if (ret) 427 return ret; 428 } |
419 | 429 if (mr_exceeds_hw_limits(rhp, total_size)) { 430 kfree(page_list); 431 return -EINVAL; 432 } |
420 ret = reregister_mem(rhp, php, &mh, shift, npages); 421 kfree(page_list); 422 if (ret) 423 return ret; 424 if (mr_rereg_mask & IB_MR_REREG_PD) 425 mhp->attr.pdid = php->pdid; 426 if (mr_rereg_mask & IB_MR_REREG_ACCESS) 427 mhp->attr.perms = c4iw_ib_to_tpt_access(acc); --- 44 unchanged lines hidden (view full) --- 472 } 473 474 ret = build_phys_page_list(buffer_list, num_phys_buf, iova_start, 475 &total_size, &npages, &shift, 476 &page_list); 477 if (ret) 478 goto err; 479 | 433 ret = reregister_mem(rhp, php, &mh, shift, npages); 434 kfree(page_list); 435 if (ret) 436 return ret; 437 if (mr_rereg_mask & IB_MR_REREG_PD) 438 mhp->attr.pdid = php->pdid; 439 if (mr_rereg_mask & IB_MR_REREG_ACCESS) 440 mhp->attr.perms = c4iw_ib_to_tpt_access(acc); --- 44 unchanged lines hidden (view full) --- 485 } 486 487 ret = build_phys_page_list(buffer_list, num_phys_buf, iova_start, 488 &total_size, &npages, &shift, 489 &page_list); 490 if (ret) 491 goto err; 492 |
493 if (mr_exceeds_hw_limits(rhp, total_size)) { 494 kfree(page_list); 495 ret = -EINVAL; 496 goto err; 497 } |
|
480 ret = alloc_pbl(mhp, npages); 481 if (ret) { 482 kfree(page_list); | 498 ret = alloc_pbl(mhp, npages); 499 if (ret) { 500 kfree(page_list); |
483 goto err_pbl; | 501 goto err; |
484 } 485 486 ret = write_pbl(&mhp->rhp->rdev, page_list, mhp->attr.pbl_addr, 487 npages); 488 kfree(page_list); 489 if (ret) 490 goto err_pbl; 491 --- 83 unchanged lines hidden (view full) --- 575 if (length == ~0ULL) 576 return ERR_PTR(-EINVAL); 577 578 if ((length + start) < start) 579 return ERR_PTR(-EINVAL); 580 581 php = to_c4iw_pd(pd); 582 rhp = php->rhp; | 502 } 503 504 ret = write_pbl(&mhp->rhp->rdev, page_list, mhp->attr.pbl_addr, 505 npages); 506 kfree(page_list); 507 if (ret) 508 goto err_pbl; 509 --- 83 unchanged lines hidden (view full) --- 593 if (length == ~0ULL) 594 return ERR_PTR(-EINVAL); 595 596 if ((length + start) < start) 597 return ERR_PTR(-EINVAL); 598 599 php = to_c4iw_pd(pd); 600 rhp = php->rhp; |
601 602 if (mr_exceeds_hw_limits(rhp, length)) 603 return ERR_PTR(-EINVAL); 604 |
|
583 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); 584 if (!mhp) 585 return ERR_PTR(-ENOMEM); 586 587 mhp->rhp = rhp; 588 589 mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); 590 if (IS_ERR(mhp->umem)) { --- 233 unchanged lines hidden --- | 605 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); 606 if (!mhp) 607 return ERR_PTR(-ENOMEM); 608 609 mhp->rhp = rhp; 610 611 mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); 612 if (IS_ERR(mhp->umem)) { --- 233 unchanged lines hidden --- |