[openib-general] [PATCH] [CM] add OS administered service IDs

Itamar Rabenstein itamar at mellanox.co.il
Wed Jun 8 03:02:00 PDT 2005


Thanks Sean,
I will update the kdapl code soon.

 -Itamar

> -----Original Message-----
> From: Sean Hefty [mailto:sean.hefty at intel.com]
> Sent: Tuesday, June 07, 2005 8:50 PM
> To: openib-general at openib.org
> Subject: [openib-general] [PATCH] [CM] add OS administered service IDs
> 
> 
> The following patch adds support for OS administered service IDs.
> 
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> 
> 
> Index: include/ib_cm.h
> ===================================================================
> --- include/ib_cm.h	(revision 2563)
> +++ include/ib_cm.h	(working copy)
> @@ -311,16 +311,20 @@ struct ib_cm_id *ib_create_cm_id(ib_cm_h
>   */
>  void ib_destroy_cm_id(struct ib_cm_id *cm_id);
>  
> +#define IB_CM_ASSIGN_SERVICE_ID  
> __constant_cpu_to_be64(0x0200000000000000ULL)
> +
>  /**
>   * ib_cm_listen - Initiates listening on the specified service ID for
>   *   connection and service ID resolution requests.
>   * @cm_id: Connection identifier associated with the listen request.
>   * @service_id: Service identifier matched against incoming 
> connection
>   *   and service ID resolution requests.  The service ID 
> should be specified
> - *   network-byte order.
> + *   network-byte order.  If set to IB_CM_ASSIGN_SERVICE_ID, 
> the CM will
> + *   assign a service ID to the caller.
>   * @service_mask: Mask applied to service ID used to listen across a
>   *   range of service IDs.  If set to 0, the service ID is matched
> - *   exactly.
> + *   exactly.  This parameter is ignored if %service_id is set to
> + *   IB_CM_ASSIGN_SERVICE_ID.
>   */
>  int ib_cm_listen(struct ib_cm_id *cm_id,
>  		 u64 service_id,
> Index: core/cm.c
> ===================================================================
> --- core/cm.c	(revision 2563)
> +++ core/cm.c	(working copy)
> @@ -64,6 +64,7 @@ static struct ib_cm {
>  	struct list_head device_list;
>  	rwlock_t device_lock;
>  	struct rb_root listen_service_table;
> +	u64 listen_service_id;
>  	/* struct rb_root peer_service_table; todo: fix peer to peer */
>  	struct rb_root remote_qp_table;
>  	struct rb_root remote_id_table;
> @@ -718,14 +719,23 @@ int ib_cm_listen(struct ib_cm_id *cm_id,
>  	unsigned long flags;
>  	int ret = 0;
>  
> +	if ((service_id & IB_CM_ASSIGN_SERVICE_ID) == 
> IB_CM_ASSIGN_SERVICE_ID &&
> +	    (service_id != IB_CM_ASSIGN_SERVICE_ID))
> +		return -EINVAL;
> +
>  	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
>  	BUG_ON(cm_id->state != IB_CM_IDLE);
>  
>  	cm_id->state = IB_CM_LISTEN;
> -	cm_id->service_id = service_id;
> -	cm_id->service_mask = service_mask ? service_mask : ~0ULL;
>  
>  	spin_lock_irqsave(&cm.lock, flags);
> +	if (service_id == IB_CM_ASSIGN_SERVICE_ID) {
> +		cm_id->service_id = 
> __cpu_to_be64(cm.listen_service_id++);
> +		cm_id->service_mask = ~0ULL;
> +	} else {
> +		cm_id->service_id = service_id;
> +		cm_id->service_mask = service_mask ? 
> service_mask : ~0ULL;
> +	}
>  	cur_cm_id_priv = cm_insert_listen(cm_id_priv);
>  	spin_unlock_irqrestore(&cm.lock, flags);
>  
> @@ -3251,6 +3261,7 @@ static int __init ib_cm_init(void)
>  	rwlock_init(&cm.device_lock);
>  	spin_lock_init(&cm.lock);
>  	cm.listen_service_table = RB_ROOT;
> +	cm.listen_service_id = 
> __constant_be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
>  	cm.remote_id_table = RB_ROOT;
>  	cm.remote_qp_table = RB_ROOT;
>  	cm.remote_sidr_table = RB_ROOT;
> 
> 
> 
> _______________________________________________
> openib-general mailing list
> openib-general at openib.org
> http://openib.org/mailman/listinfo/openib-general
> 
> To unsubscribe, please visit 
> http://openib.org/mailman/listinfo/openib-general
> 



More information about the general mailing list