ibcore: Define option to set ack timeout.
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. Linux commit: 2c1619edef61a03cb516efaa81750784c3071d10 MFC after: 1 week Reviewed by: kib Sponsored by: Mellanox Technologies // NVIDIA Networking
This commit is contained in:
parent
df1df0c742
commit
20fea7ac64
@ -336,8 +336,10 @@ struct rdma_id_private {
|
||||
u32 options;
|
||||
u8 srq;
|
||||
u8 tos;
|
||||
u8 timeout_set:1;
|
||||
u8 reuseaddr;
|
||||
u8 afonly;
|
||||
u8 timeout;
|
||||
enum ib_gid_type gid_type;
|
||||
};
|
||||
|
||||
@ -775,6 +777,7 @@ struct rdma_cm_id *rdma_create_id(struct vnet *net,
|
||||
id_priv->id.event_handler = event_handler;
|
||||
id_priv->id.ps = ps;
|
||||
id_priv->id.qp_type = qp_type;
|
||||
id_priv->timeout_set = false;
|
||||
spin_lock_init(&id_priv->lock);
|
||||
mutex_init(&id_priv->qp_mutex);
|
||||
init_completion(&id_priv->comp);
|
||||
@ -1021,6 +1024,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);
|
||||
@ -2495,6 +2501,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 ib_sa_path_rec *path_rec,
|
||||
void *context)
|
||||
{
|
||||
|
@ -1204,6 +1204,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;
|
||||
}
|
||||
|
@ -385,6 +385,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.
|
||||
|
@ -296,6 +296,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
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user