diff options
-rw-r--r-- | drivers/infiniband/hw/cxgb4/mem.c | 22 |
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; | |||
50 | module_param(inline_threshold, int, 0644); | 50 | module_param(inline_threshold, int, 0644); |
51 | MODULE_PARM_DESC(inline_threshold, "inline vs dsgl threshold (default=128)"); | 51 | MODULE_PARM_DESC(inline_threshold, "inline vs dsgl threshold (default=128)"); |
52 | 52 | ||
53 | static 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 | |||
53 | static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr, | 60 | static 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); |