mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	IB/cma: Define option to set ack timeout and pack tos_set
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@mellanox.com> Reviewed-by: Moni Shoua <monis@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
		
							parent
							
								
									ecb53febfc
								
							
						
					
					
						commit
						2c1619edef
					
				
					 5 changed files with 47 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue