[ofa-general] [PATCH] fix some ehca limits

Anton Blanchard anton at samba.org
Wed Oct 10 09:56:34 PDT 2007


Hi Roland,

> I didn't see a response to my earlier email about the other uses of
> min_t(int, x, INT_MAX) so I fixed it up myself and added this to my
> tree.  I don't have a working setup to test yet so please let me know
> if you see anything wrong with this:

Thanks for doing this, sorry I didnt get back to you. I pulled your tree
and it tested out fine:

        max_cqe:                        2147483647
        max_pd:                         2147483647
        max_ah:                         2147483647

Acked-by: Anton Blanchard <anton at samba.org>

Anton

> commit 919225e60a1a73e3518f257f040f74e9379a61c3
> Author: Roland Dreier <rolandd at cisco.com>
> Date:   Tue Oct 9 13:17:42 2007 -0700
> 
>     IB/ehca: Fix clipping of device limits to INT_MAX
>     
>     Doing min_t(int, foo, INT_MAX) doesn't work correctly, because if foo
>     is bigger than INT_MAX, then when treated as a signed integer, it will
>     become negative and hence such an expression is just an elaborate NOP.
>     
>     Fix such cases in ehca to do min_t(unsigned, foo, INT_MAX) instead.
>     This fixes negative reported values for max_cqe, max_pd and max_ah:
>     
>     Before:
>     
>             max_cqe:                        -64
>             max_pd:                         -1
>             max_ah:                         -1
>     
>     After:
>             max_cqe:                        2147483647
>             max_pd:                         2147483647
>             max_ah:                         2147483647
>     
>     Based on a bug report and fix from Anton Blanchard <anton at samba.org>.
>     
>     Signed-off-by: Roland Dreier <rolandd at cisco.com>
> 
> diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
> index 3436c49..4aa3ffa 100644
> --- a/drivers/infiniband/hw/ehca/ehca_hca.c
> +++ b/drivers/infiniband/hw/ehca/ehca_hca.c
> @@ -82,17 +82,17 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
>  	props->vendor_id       = rblock->vendor_id >> 8;
>  	props->vendor_part_id  = rblock->vendor_part_id >> 16;
>  	props->hw_ver          = rblock->hw_ver;
> -	props->max_qp          = min_t(int, rblock->max_qp, INT_MAX);
> -	props->max_qp_wr       = min_t(int, rblock->max_wqes_wq, INT_MAX);
> -	props->max_sge         = min_t(int, rblock->max_sge, INT_MAX);
> -	props->max_sge_rd      = min_t(int, rblock->max_sge_rd, INT_MAX);
> -	props->max_cq          = min_t(int, rblock->max_cq, INT_MAX);
> -	props->max_cqe         = min_t(int, rblock->max_cqe, INT_MAX);
> -	props->max_mr          = min_t(int, rblock->max_mr, INT_MAX);
> -	props->max_mw          = min_t(int, rblock->max_mw, INT_MAX);
> -	props->max_pd          = min_t(int, rblock->max_pd, INT_MAX);
> -	props->max_ah          = min_t(int, rblock->max_ah, INT_MAX);
> -	props->max_fmr         = min_t(int, rblock->max_mr, INT_MAX);
> +	props->max_qp          = min_t(unsigned, rblock->max_qp, INT_MAX);
> +	props->max_qp_wr       = min_t(unsigned, rblock->max_wqes_wq, INT_MAX);
> +	props->max_sge         = min_t(unsigned, rblock->max_sge, INT_MAX);
> +	props->max_sge_rd      = min_t(unsigned, rblock->max_sge_rd, INT_MAX);
> +	props->max_cq          = min_t(unsigned, rblock->max_cq, INT_MAX);
> +	props->max_cqe         = min_t(unsigned, rblock->max_cqe, INT_MAX);
> +	props->max_mr          = min_t(unsigned, rblock->max_mr, INT_MAX);
> +	props->max_mw          = min_t(unsigned, rblock->max_mw, INT_MAX);
> +	props->max_pd          = min_t(unsigned, rblock->max_pd, INT_MAX);
> +	props->max_ah          = min_t(unsigned, rblock->max_ah, INT_MAX);
> +	props->max_fmr         = min_t(unsigned, rblock->max_mr, INT_MAX);
>  
>  	if (EHCA_BMASK_GET(HCA_CAP_SRQ, shca->hca_cap)) {
>  		props->max_srq         = props->max_qp;
> @@ -104,15 +104,15 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
>  	props->local_ca_ack_delay
>  		= rblock->local_ca_ack_delay;
>  	props->max_raw_ipv6_qp
> -		= min_t(int, rblock->max_raw_ipv6_qp, INT_MAX);
> +		= min_t(unsigned, rblock->max_raw_ipv6_qp, INT_MAX);
>  	props->max_raw_ethy_qp
> -		= min_t(int, rblock->max_raw_ethy_qp, INT_MAX);
> +		= min_t(unsigned, rblock->max_raw_ethy_qp, INT_MAX);
>  	props->max_mcast_grp
> -		= min_t(int, rblock->max_mcast_grp, INT_MAX);
> +		= min_t(unsigned, rblock->max_mcast_grp, INT_MAX);
>  	props->max_mcast_qp_attach
> -		= min_t(int, rblock->max_mcast_qp_attach, INT_MAX);
> +		= min_t(unsigned, rblock->max_mcast_qp_attach, INT_MAX);
>  	props->max_total_mcast_qp_attach
> -		= min_t(int, rblock->max_total_mcast_qp_attach, INT_MAX);
> +		= min_t(unsigned, rblock->max_total_mcast_qp_attach, INT_MAX);
>  
>  	/* translate device capabilities */
>  	props->device_cap_flags = IB_DEVICE_SYS_IMAGE_GUID |



More information about the general mailing list