aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c
index 6bf14d803e5a..cb43c2299ac0 100644
--- a/drivers/infiniband/hw/cxgb4/mem.c
+++ b/drivers/infiniband/hw/cxgb4/mem.c
@@ -50,6 +50,13 @@ static int inline_threshold = C4IW_INLINE_THRESHOLD;
50module_param(inline_threshold, int, 0644); 50module_param(inline_threshold, int, 0644);
51MODULE_PARM_DESC(inline_threshold, "inline vs dsgl threshold (default=128)"); 51MODULE_PARM_DESC(inline_threshold, "inline vs dsgl threshold (default=128)");
52 52
53static int mr_exceeds_hw_limits(struct c4iw_dev *dev, u64 length)
54{
55 return (is_t4(dev->rdev.lldi.adapter_type) ||
56 is_t5(dev->rdev.lldi.adapter_type)) &&
57 length >= 8*1024*1024*1024ULL;
58}
59
53static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr, 60static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr,
54 u32 len, dma_addr_t data, int wait) 61 u32 len, dma_addr_t data, int wait)
55{ 62{
@@ -538,6 +545,11 @@ int c4iw_reregister_phys_mem(struct ib_mr *mr, int mr_rereg_mask,
538 return ret; 545 return ret;
539 } 546 }
540 547
548 if (mr_exceeds_hw_limits(rhp, total_size)) {
549 kfree(page_list);
550 return -EINVAL;
551 }
552
541 ret = reregister_mem(rhp, php, &mh, shift, npages); 553 ret = reregister_mem(rhp, php, &mh, shift, npages);
542 kfree(page_list); 554 kfree(page_list);
543 if (ret) 555 if (ret)
@@ -598,6 +610,12 @@ struct ib_mr *c4iw_register_phys_mem(struct ib_pd *pd,
598 if (ret) 610 if (ret)
599 goto err; 611 goto err;
600 612
613 if (mr_exceeds_hw_limits(rhp, total_size)) {
614 kfree(page_list);
615 ret = -EINVAL;
616 goto err;
617 }
618
601 ret = alloc_pbl(mhp, npages); 619 ret = alloc_pbl(mhp, npages);
602 if (ret) { 620 if (ret) {
603 kfree(page_list); 621 kfree(page_list);
@@ -701,6 +719,10 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
701 719
702 php = to_c4iw_pd(pd); 720 php = to_c4iw_pd(pd);
703 rhp = php->rhp; 721 rhp = php->rhp;
722
723 if (mr_exceeds_hw_limits(rhp, length))
724 return ERR_PTR(-EINVAL);
725
704 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); 726 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
705 if (!mhp) 727 if (!mhp)
706 return ERR_PTR(-ENOMEM); 728 return ERR_PTR(-ENOMEM);