[ofa-general] [PATCH] libmlx4: Re-calculate number of inline segments

Vincent Rizza vinnie at sgi.com
Sun Oct 19 22:55:14 PDT 2008


Hi,
When we set qp_attr.cap.max_inline_data between 461 and 928 we're seeing ENOMEM.
Shouldn't the maximum handled be 928?

Roland Dreier wrote:
>  > Supplying an ibv_qp_cap.max_inline_data value of 460 for mlx4_create_qp
>  > was getting back ENOMEM when the max should have been 928. Tracked the bug
>  > to the inline segment calculation. Here's the fix.
> 
> I don't see what's wrong with the current code, or why your change is
> anything but a more obfuscated way of calculating the same thing.  And
> indeed, I just adapted a quick test program (below) which tries to
> create QPs with max_inline_data of 460, and I get the results:
> 
>   RC: inline 460 ok (got 928)
>   UC: inline 460 ok (got 928)
>   UD: inline 460 ok (got 900)
> 
> so it seems to work on my system.
> 
>  - R.
> 
> Here's the test code:
> 
> #include <stdio.h>
> #include <string.h>
> 
> #include <infiniband/verbs.h>
> 
> int main(int argc, char *argv)
> {
> 	struct ibv_device      **dev_list;
> 	struct ibv_device_attr	 dev_attr;
> 	struct ibv_context	*context;
> 	struct ibv_pd		*pd;
> 	struct ibv_cq		*cq;
> 	struct ibv_qp_init_attr  qp_attr;
> 	int			 t;
> 	static const struct {
> 		enum ibv_qp_type type;
> 		char		*name;
> 	}			 type_tab[] = {
> 		{ IBV_QPT_RC, "RC" },
> 		{ IBV_QPT_UC, "UC" },
> 		{ IBV_QPT_UD, "UD" },
> 	};
> 
> 	dev_list = ibv_get_device_list(NULL);
> 	if (!dev_list) {
> 		printf("No IB devices found\n");
> 		return 1;
> 	}
> 
> 	for (; *dev_list; ++dev_list) {
> 		printf("%s:\n", ibv_get_device_name(*dev_list));
> 
> 		context = ibv_open_device(*dev_list);
> 		if (!context) {
> 			printf("  ibv_open_device failed\n");
> 			continue;
> 		}
> 
> 		if (ibv_query_device(context, &dev_attr)) {
> 			printf("  ibv_query_device failed\n");
> 			continue;
> 		}
> 
> 		cq = ibv_create_cq(context, 1, NULL, NULL, 0);
> 		if (!cq) {
> 			printf("  ibv_create_cq failed\n");
> 			continue;
> 		}
> 
> 		pd = ibv_alloc_pd(context);
> 		if (!pd) {
> 			printf("  ibv_alloc_pd failed\n");
> 			continue;
> 		}
> 
> 		for (t = 0; t < sizeof type_tab / sizeof type_tab[0]; ++t) {
> 			memset(&qp_attr, 0, sizeof qp_attr);
> 
> 			qp_attr.send_cq = cq;
> 			qp_attr.recv_cq = cq;
> 			qp_attr.cap.max_send_wr = 1;
> 			qp_attr.cap.max_recv_wr = 1;
> 			qp_attr.cap.max_send_sge = 1;
> 			qp_attr.cap.max_recv_sge = 1;
> 			qp_attr.cap.max_inline_data = 460;
> 			qp_attr.qp_type = type_tab[t].type;
> 
> 			printf("  %s: inline %d ", type_tab[t].name, qp_attr.cap.max_inline_data);
> 
> 			if (ibv_create_qp(pd, &qp_attr))
> 				printf("ok (got %d)\n",
> 				       qp_attr.cap.max_inline_data);
> 			else
> 				printf("FAILED\n");
> 		}
> 	}
> 
> 	return 0;
> }



More information about the general mailing list