On 2/13/2020 7:30 AM, Jason Gunthorpe wrote: > On Wed, Feb 12, 2020 at 09:26:29AM +0200, Leon Romanovsky wrote: >> From: Parav Pandit <parav@xxxxxxxxxxxx> >> >> This reverts commit 219d2e9dfda9431b808c28d5efc74b404b95b638. >> >> Below flow requires cm_id_priv's destination address to be setup >> before performing rdma_bind_addr(). >> Without which, source port allocation for existing bind list fails >> when port range is small, resulting into rdma_resolve_addr() >> failure. > > I don't quite understands this - what is "when port range is small" ? > There is sysfs knob to reduce source port range to use for binding. So it is easy to create the issue by reducing port range to handful of them. >> rdma_resolve_addr() >> cma_bind_addr() >> rdma_bind_addr() >> cma_get_port() >> cma_alloc_any_port() >> cma_port_is_unique() <- compared with zero daddr > > Do you understand why cma_port_is_unique is even testing the dst_addr? > It seems very strange. ma_port_unique() reuses the source port as long as destination is different (destination = either different dest.addr or different dest.port between two cm_ids ). This behavior is synonymous to TCP also. > Outbound connections should not alias the source port in the first > place?? > I believe it can because TCP seems to allow that too as long destination is different. I think it allows if it results into different 4-tuple.