Deleted Added
full compact
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 ---