> -----Original Message----- > From: linux-rdma-owner@xxxxxxxxxxxxxxx <linux-rdma- > owner@xxxxxxxxxxxxxxx> On Behalf Of Leon Romanovsky > Sent: Thursday, January 24, 2019 6:18 AM > To: Doug Ledford <dledford@xxxxxxxxxx>; Jason Gunthorpe > <jgg@xxxxxxxxxxxx> > Cc: Danit Goldberg <danitg@xxxxxxxxxxxx>; RDMA mailing list <linux- > rdma@xxxxxxxxxxxxxxx>; Moni Shoua <monis@xxxxxxxxxxxx>; Leon > Romanovsky <leonro@xxxxxxxxxxxx> > Subject: [PATCH rdma-next v1] IB/cma: Define option to set ack timeout and > pack tos_set > > From: Danit Goldberg <danitg@xxxxxxxxxxxx> > > Define new option in 'rdma_set_option' to override calculated QP timeout > when requested to provide QP attributes to modify a QP. > > At the same time, pack tos_set to be bitfield. > > Signed-off-by: Danit Goldberg <danitg@xxxxxxxxxxxx> > Reviewed-by: Moni Shoua <monis@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > --- > Changelog v0->v1: > * Moved kdoc comments from .h to .c file > * Added check of right QP type prior to set ack timeout. > --- > drivers/infiniband/core/cma.c | 32 ++++++++++++++++++++++++++++++ > drivers/infiniband/core/cma_priv.h | 4 +++- > drivers/infiniband/core/ucma.c | 7 +++++++ > include/rdma/rdma_cm.h | 1 + > include/uapi/rdma/rdma_user_cm.h | 4 ++++ > 5 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c > index e15546ae4d0f..83aa2ad0c27e 100644 > --- a/drivers/infiniband/core/cma.c > +++ b/drivers/infiniband/core/cma.c > @@ -888,6 +888,7 @@ struct rdma_cm_id *__rdma_create_id(struct net > *net, > id_priv->id.ps = ps; > id_priv->id.qp_type = qp_type; > id_priv->tos_set = false; > + id_priv->timeout_set = false; > id_priv->gid_type = IB_GID_TYPE_IB; > spin_lock_init(&id_priv->lock); > mutex_init(&id_priv->qp_mutex); > @@ -1130,6 +1131,9 @@ int rdma_init_qp_attr(struct rdma_cm_id *id, > struct ib_qp_attr *qp_attr, > } else > ret = -ENOSYS; > > + if ((*qp_attr_mask & IB_QP_TIMEOUT) && id_priv->timeout_set) > + qp_attr->timeout = id_priv->timeout; > + > return ret; > } > EXPORT_SYMBOL(rdma_init_qp_attr); > @@ -2490,6 +2494,34 @@ void rdma_set_service_type(struct rdma_cm_id > *id, int tos) } EXPORT_SYMBOL(rdma_set_service_type); > > +/** > + * rdma_set_ack_timeout() - Set the ack timeout of QP associated > + * with a connection identifier. > + * @id: Communication identifier to associated with service type. > + * @timeout: Ack timeout to set a QP, expressed as 4.096 * 2^(timeout) > usec. > + * > + * This function should be called before rdma_connect() on active side, > + * and on passive side before rdma_accept(). It is applicable to > +primary > + * path only. The timeout will affect the local side of the QP, it is > +not > + * negotiated with remote side and zero disables the timer. > + * > + * Return: 0 for success > + */ > +int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout) { > + struct rdma_id_private *id_priv; > + > + if (id->qp_type != IB_QPT_RC) > + return -EINVAL; > + > + id_priv = container_of(id, struct rdma_id_private, id); > + id_priv->timeout = timeout; > + id_priv->timeout_set = true; > + > + return 0; > +} > +EXPORT_SYMBOL(rdma_set_ack_timeout); > + > static void cma_query_handler(int status, struct sa_path_rec *path_rec, > void *context) > { > diff --git a/drivers/infiniband/core/cma_priv.h > b/drivers/infiniband/core/cma_priv.h > index cf47c69436a7..ca7307277518 100644 > --- a/drivers/infiniband/core/cma_priv.h > +++ b/drivers/infiniband/core/cma_priv.h > @@ -84,9 +84,11 @@ struct rdma_id_private { > u32 options; > u8 srq; > u8 tos; > - bool tos_set; > + u8 tos_set:1; > + u8 timeout_set:1; > u8 reuseaddr; > u8 afonly; > + u8 timeout; > enum ib_gid_type gid_type; > > /* > diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c > index 01d68ed46c1b..7468b26b8a01 100644 > --- a/drivers/infiniband/core/ucma.c > +++ b/drivers/infiniband/core/ucma.c > @@ -1236,6 +1236,13 @@ static int ucma_set_option_id(struct > ucma_context *ctx, int optname, > } > ret = rdma_set_afonly(ctx->cm_id, *((int *) optval) ? 1 : 0); > break; > + case RDMA_OPTION_ID_ACK_TIMEOUT: > + if (optlen != sizeof(u8)) { > + ret = -EINVAL; > + break; > + } > + ret = rdma_set_ack_timeout(ctx->cm_id, *((u8 *)optval)); > + break; > default: > ret = -ENOSYS; > } > diff --git a/include/rdma/rdma_cm.h b/include/rdma/rdma_cm.h index > 60987a5903b7..71f48cfdc24c 100644 > --- a/include/rdma/rdma_cm.h > +++ b/include/rdma/rdma_cm.h > @@ -374,6 +374,7 @@ int rdma_set_reuseaddr(struct rdma_cm_id *id, int > reuse); > */ > int rdma_set_afonly(struct rdma_cm_id *id, int afonly); > > +int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout); > /** > * rdma_get_service_id - Return the IB service ID for a specified address. > * @id: Communication identifier associated with the address. > diff --git a/include/uapi/rdma/rdma_user_cm.h > b/include/uapi/rdma/rdma_user_cm.h > index 0d1e78ebad05..e42940a215a3 100644 > --- a/include/uapi/rdma/rdma_user_cm.h > +++ b/include/uapi/rdma/rdma_user_cm.h > @@ -300,6 +300,10 @@ enum { > RDMA_OPTION_ID_TOS = 0, > RDMA_OPTION_ID_REUSEADDR = 1, > RDMA_OPTION_ID_AFONLY = 2, > + RDMA_OPTION_ID_ACK_TIMEOUT = 3 > +}; > + > +enum { > RDMA_OPTION_IB_PATH = 1 > }; > > -- > 2.19.1 Reviewed-by: Parav Pandit <parav@xxxxxxxxxxxx>