RE: [PATCH rdma-next v1] IB/cma: Define option to set ack timeout and pack tos_set

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----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>




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux