18382333 libibverbs ibv_cmd_get_context() fails when mcxnex driver UAR space is exhausted
authorBoris Chiu <boris.chiu@oracle.com>
Fri, 09 May 2014 13:24:16 -0700
changeset 1887 dc9ed1510572
parent 1886 09b39660eb0b
child 1888 67cbe9886a54
18382333 libibverbs ibv_cmd_get_context() fails when mcxnex driver UAR space is exhausted 18422470 modify librdmacm on solaris to avoid opening device context per hca on startup 18720315 open-fabrics needs TPNOs in pkg manifest
components/open-fabrics/libibverbs/solaris_compatibility.c
components/open-fabrics/librdmacm/patches/base.patch
components/open-fabrics/open-fabrics.license
components/open-fabrics/open-fabrics.p5m
--- a/components/open-fabrics/libibverbs/solaris_compatibility.c	Fri May 09 07:58:08 2014 -0700
+++ b/components/open-fabrics/libibverbs/solaris_compatibility.c	Fri May 09 13:24:16 2014 -0700
@@ -56,6 +56,8 @@
 #include <alloca.h>
 #include "../include/infiniband/arch.h"
 #include "../include/infiniband/verbs.h"
+#include "../include/infiniband/kern-abi.h"
+#include "../include/infiniband/driver.h"
 #include <errno.h>
 #include <pthread.h>
 #include <kstat.h>
@@ -208,6 +210,12 @@
 void __attribute__((constructor))solaris_init(void);
 void __attribute__((destructor))solaris_fini(void);
 
+int sol_ibv_query_device(struct ibv_device *device,
+    struct ibv_device_attr *device_attr);
+
+int sol_ibv_query_port(struct ibv_context *, uint8_t, struct ibv_port_attr *);
+
+
 void
 solaris_init(void)
 {
@@ -283,7 +291,6 @@
 {
 	ibdev_cache_info_t	info;
 	struct ibv_device	**root_dev_list, **dev_list = NULL;
-	struct ibv_context	*ctx = NULL;
 	struct ibv_device_attr	device_attr;
 	int			i, num_dev, dev_num, ret = 1;
 	uint64_t		guid;
@@ -298,17 +305,12 @@
 
 	for (i = 0; i < num_dev; i++, dev_list++) {
 
-		if (!(ctx = ibv_open_device(*dev_list))) {
-			fprintf(stderr, "failed to open device %p\n",
+		if (sol_ibv_query_device(*dev_list, &device_attr)) {
+			fprintf(stderr, "failed to query device %p\n",
 			    *dev_list);
 			goto error_exit2;
 		}
 
-		if (ibv_query_device(ctx, &device_attr)) {
-			fprintf(stderr, "failed to query device %p\n", ctx);
-			goto error_exit3;
-		}
-
 		guid = ntohll(device_attr.node_guid);
 		sprintf(info.ibd_node_guid_str, "%04x:%04x:%04x:%04x",
 		    (unsigned)(guid >> 48) & 0xffff,
@@ -339,7 +341,7 @@
 			p = ibdev + (strlen("mlx4_"));
 		} else {
 			fprintf(stderr, "Invalid device %s\n", ibdev);
-			goto error_exit3;
+			goto error_exit2;
 		}
 		dev_num = atoi(p);
 		(void) strcpy(info.ibd_name, ibdev);
@@ -349,16 +351,13 @@
 		if (ibdev_cache_add(dev_num, &info)) {
 			fprintf(stderr, "failed to add dev %d to ibdev cache\n",
 			    dev_num);
-			goto error_exit3;
+			goto error_exit2;
 		}
 	}
 
 	ret = 0;
 
 	/* clean up and Return */
-error_exit3:
-	if (ctx)
-		ibv_close_device(ctx);
 error_exit2:
 	if (root_dev_list)
 		ibv_free_device_list(root_dev_list);
@@ -747,10 +746,11 @@
     uint16_t **pkey_table)
 {
 	struct ibv_device 	**root_dev_list, **dev_list = NULL;
-	struct ibv_context 	*ctx = NULL;
+	struct ibv_context	ctx;
 	union ibv_gid 		*gids = NULL;
 	uint16_t		*pkeys = NULL;
 	int 			i, num_dev, rv, ret = 1;
+	char			uverbs_devpath[MAXPATHLEN];
 
 	root_dev_list = dev_list = ibv_get_device_list(&num_dev);
 	if (!dev_list) {
@@ -769,14 +769,17 @@
 		goto error_exit2;
 	}
 
-	if (!(ctx = ibv_open_device(*dev_list))) {
-		fprintf(stderr, "failed to open device %p\n", *dev_list);
+	snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s", IB_OFS_DEVPATH_PREFIX,
+	    (*dev_list)->dev_name);
+
+	ctx.device = *dev_list;
+
+	if ((ctx.cmd_fd = open(uverbs_devpath, O_RDWR)) < 0)
 		goto error_exit2;
-	}
 
-	if (ibv_query_port(ctx, port_num, port_attr)) {
+	if (sol_ibv_query_port(&ctx, port_num, port_attr)) {
 		fprintf(stderr, "failed to query dev %p, port %d\n",
-		    ctx, port_num);
+		    &ctx, port_num);
 		goto error_exit3;
 	}
 
@@ -789,7 +792,7 @@
 		 * set high bit of port_num to get all gids in one shot.
 		 */
 		port_num |= 0x80;
-		rv = sol_ibv_query_gid(ctx, port_num, port_attr->gid_tbl_len,
+		rv = sol_ibv_query_gid(&ctx, port_num, port_attr->gid_tbl_len,
 		    gids);
 		if (rv != 0)
 			goto error_exit4;
@@ -808,7 +811,7 @@
 		 * set high bit of port_num to get all pkeys in one shot.
 		 */
 		port_num |= 0x80;
-		rv = sol_ibv_query_pkey(ctx, port_num, port_attr->pkey_tbl_len,
+		rv = sol_ibv_query_pkey(&ctx, port_num, port_attr->pkey_tbl_len,
 		    pkeys);
 		if (rv != 0)
 			goto error_exit5;
@@ -829,8 +832,8 @@
 	if (gids)
 		free(gids);
 error_exit3:
-	if (ctx)
-		ibv_close_device(ctx);
+	if (ctx.cmd_fd > 0)
+		close(ctx.cmd_fd);
 error_exit2:
 	if (root_dev_list)
 		ibv_free_device_list(root_dev_list);
@@ -1626,10 +1629,8 @@
 sol_ibv_query_gid(struct ibv_context *context, uint8_t port_num, int index,
     union ibv_gid *gid)
 {
-	char uverbs_devpath[MAXPATHLEN];
-	int uverbs_fd;
-	int count, start;
-	sol_uverbs_gid_t *uverbs_gidp;
+	int			count, start;
+	sol_uverbs_gid_t	*uverbs_gidp;
 
 	/*
 	 * Not exported via sysfs, use ioctl.
@@ -1638,12 +1639,6 @@
 	    ((port_num & 0x80) && (index == 0)))
 		return (-1);
 
-	snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s", IB_OFS_DEVPATH_PREFIX,
-	    context->device->dev_name);
-
-	if ((uverbs_fd = open(uverbs_devpath, O_RDWR)) < 0)
-		return (-1);
-
 	if (port_num & 0x80) {
 		start = 0;
 		count = index;
@@ -1655,7 +1650,6 @@
 	uverbs_gidp = (sol_uverbs_gid_t *)malloc(count *
 	    sizeof (union ibv_gid) + sizeof (sol_uverbs_gid_t));
 	if (uverbs_gidp == NULL) {
-		close(uverbs_fd);
 		return (-1);
 	}
 
@@ -1663,7 +1657,7 @@
 	uverbs_gidp->uverbs_gid_cnt = count;
 	uverbs_gidp->uverbs_gid_start_index = start;
 
-	if (ioctl(uverbs_fd, UVERBS_IOCTL_GET_GIDS, uverbs_gidp) != 0) {
+	if (ioctl(context->cmd_fd, UVERBS_IOCTL_GET_GIDS, uverbs_gidp) != 0) {
 #ifdef	DEBUG
 		fprintf(stderr, "UVERBS_IOCTL_GET_GIDS failed: %s\n",
 		    strerror(errno));
@@ -1682,12 +1676,10 @@
 	}
 	memcpy(gid, uverbs_gidp->uverbs_gids, sizeof (union ibv_gid) * count);
 	free(uverbs_gidp);
-	close(uverbs_fd);
 	return (0);
 
 gid_error_exit:
 	free(uverbs_gidp);
-	close(uverbs_fd);
 	return (-1);
 }
 
@@ -1695,10 +1687,8 @@
 sol_ibv_query_pkey(struct ibv_context *context, uint8_t port_num,
     int index, uint16_t *pkey)
 {
-	char uverbs_devpath[MAXPATHLEN];
-	int uverbs_fd;
-	int count, start;
-	sol_uverbs_pkey_t *uverbs_pkeyp;
+	int			count, start;
+	sol_uverbs_pkey_t	*uverbs_pkeyp;
 
 	/*
 	 * Not exported via sysfs, use ioctl.
@@ -1707,9 +1697,7 @@
 	    ((port_num & 0x80) && (index == 0)))
 		return (-1);
 
-	snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s", IB_OFS_DEVPATH_PREFIX,
-	    context->device->dev_name);
-	if ((uverbs_fd = open(uverbs_devpath, O_RDWR)) < 0)
+	if (context->cmd_fd < 0)
 		return (-1);
 
 	if (port_num & 0x80) {
@@ -1723,7 +1711,6 @@
 	uverbs_pkeyp = (sol_uverbs_pkey_t *)malloc(count *
 	    sizeof (uint16_t) + sizeof (sol_uverbs_pkey_t));
 	if (uverbs_pkeyp == NULL) {
-		close(uverbs_fd);
 		return (-1);
 	}
 
@@ -1731,7 +1718,7 @@
 	uverbs_pkeyp->uverbs_pkey_cnt = count;
 	uverbs_pkeyp->uverbs_pkey_start_index = start;
 
-	if (ioctl(uverbs_fd, UVERBS_IOCTL_GET_PKEYS, uverbs_pkeyp) != 0) {
+	if (ioctl(context->cmd_fd, UVERBS_IOCTL_GET_PKEYS, uverbs_pkeyp) != 0) {
 #ifdef	DEBUG
 		fprintf(stderr, "UVERBS_IOCTL_GET_PKEYS failed: %s\n",
 		    strerror(errno));
@@ -1750,12 +1737,57 @@
 	}
 	memcpy(pkey, uverbs_pkeyp->uverbs_pkey, sizeof (uint16_t) * count);
 	free(uverbs_pkeyp);
-	close(uverbs_fd);
 	return (0);
 
 pkey_error_exit:
 	free(uverbs_pkeyp);
-	close(uverbs_fd);
 	return (-1);
 }
+
+int
+sol_ibv_query_device(struct ibv_device *device, struct ibv_device_attr *attr)
+{
+	struct ibv_query_device cmd;
+	struct ibv_context	context;
+	char			uverbs_devpath[MAXPATHLEN];
+	int			uverbs_fd, ret;
+	uint64_t		raw_fw_ver;
+	unsigned		major, minor, sub_minor;
+
+	context.device = device;
+
+	if (!device || !attr)
+		return (-1);
+
+	snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s", IB_OFS_DEVPATH_PREFIX,
+	    device->dev_name);
+
+	if ((context.cmd_fd = open(uverbs_devpath, O_RDWR)) <  0)
+		return (-1);
+
+	ret = ibv_cmd_query_device(&context, attr, &raw_fw_ver, &cmd,
+	    sizeof (cmd));
+
+	if (ret)
+		return (ret);
+
+	major	  = (raw_fw_ver >> 32) & 0xffff;
+	minor	  = (raw_fw_ver >> 16) & 0xffff;
+	sub_minor = raw_fw_ver & 0xffff;
+
+	snprintf(attr->fw_ver, sizeof (attr->fw_ver),
+	    "%d.%d.%03d", major, minor, sub_minor);
+
+	close(context.cmd_fd);
+	return (0);
+}
+
+int
+sol_ibv_query_port(struct ibv_context *context, uint8_t port,
+    struct ibv_port_attr *attr)
+{
+	struct	ibv_query_port cmd;
+
+	return (ibv_cmd_query_port(context, port, attr, &cmd, sizeof (cmd)));
+}
 #endif
--- a/components/open-fabrics/librdmacm/patches/base.patch	Fri May 09 07:58:08 2014 -0700
+++ b/components/open-fabrics/librdmacm/patches/base.patch	Fri May 09 13:24:16 2014 -0700
@@ -59,6 +59,15 @@
  #define min(a, b) (a < b ? a : b)
  
  static inline int ERR(int err)
[email protected]@ -74,7 +68,7 @@
+ 	return -1;
+ }
+ 
+-int ucma_init();
++int ucma_init(void);
+ extern int af_ib_support;
+ 
+ #define RAI_ROUTEONLY		0x01000000
 diff -r -u /tmp/librdmacm-1.0.14.1/src/cma.c librdmacm-1.0.14.1/src/cma.c
 --- /tmp/librdmacm-1.0.14.1/src/cma.c	Fri Dec 10 12:05:34 2010
 +++ librdmacm-1.0.14.1/src/cma.c	Mon Mar 28 16:44:55 2011
@@ -81,7 +90,217 @@
  #include <infiniband/driver.h>
  #include <infiniband/marshall.h>
  #include <rdma/rdma_cma.h>
[email protected]@ -354,9 +360,18 @@
[email protected]@ -100,6 +106,8 @@
+ 	struct ibv_pd	   *pd;
+ 	uint64_t	    guid;
+ 	int		    port_cnt;
++	int		    refcnt;
++	int		    max_qpsize;
+ 	uint8_t		    max_initiator_depth;
+ 	uint8_t		    max_responder_resources;
+ };
[email protected]@ -143,6 +151,7 @@
+ 
+ static struct cma_device *cma_dev_array;
+ static int cma_dev_cnt;
++static int cma_init_cnt;
+ static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+ static int abi_ver = RDMA_USER_CM_MAX_ABI_VERSION;
+ int af_ib_support;
[email protected]@ -156,12 +165,16 @@
+ 
+ 	if (cma_dev_cnt) {
+ 		while (cma_dev_cnt--) {
+-			ibv_dealloc_pd(cma_dev_array[cma_dev_cnt].pd);
++			if (!cma_dev_array[cma_dev_cnt].verbs)
++				continue;
++
++			if (cma_dev_array[cma_dev_cnt].refcnt)
++				ibv_dealloc_pd(cma_dev_array[cma_dev_cnt].pd);
+ 			ibv_close_device(cma_dev_array[cma_dev_cnt].verbs);
++			cma_init_cnt--;
+ 		}
+ 
+ 		free(cma_dev_array);
+-		cma_dev_cnt = 0;
+ 	}
+ }
+ 
[email protected]@ -228,9 +241,7 @@
+ int ucma_init(void)
+ {
+ 	struct ibv_device **dev_list = NULL;
+-	struct cma_device *cma_dev;
+-	struct ibv_device_attr attr;
+-	int i, ret, dev_cnt, ib;
++	int i, ret, dev_cnt;
+ 
+ 	/* Quick check without lock to see if we're already initialized */
+ 	if (cma_dev_cnt)
[email protected]@ -253,46 +264,20 @@
+ 		goto err1;
+ 	}
+ 
+-	cma_dev_array = malloc(sizeof *cma_dev * dev_cnt);
++	if (!dev_cnt) {
++		printf("CMA: no RDMA devices found\n");
++		ret = ERR(ENODEV);
++		goto err2;
++	}
++	cma_dev_array = calloc(dev_cnt, sizeof *cma_dev_array);
+ 	if (!cma_dev_array) {
+ 		ret = ERR(ENOMEM);
+ 		goto err2;
+ 	}
+ 
+-	for (i = 0, ib = 0; dev_list[i];) {
+-		cma_dev = &cma_dev_array[i];
++	for (i = 0; dev_list[i]; i++)
++		cma_dev_array[i].guid = ibv_get_device_guid(dev_list[i]);
+ 
+-		cma_dev->guid = ibv_get_device_guid(dev_list[i]);
+-		cma_dev->verbs = ibv_open_device(dev_list[i]);
+-		if (!cma_dev->verbs) {
+-			printf("CMA: unable to open RDMA device\n");
+-			ret = ERR(ENODEV);
+-			goto err3;
+-		}
+-
+-		cma_dev->pd = ibv_alloc_pd(cma_dev->verbs);
+-		if (!cma_dev->pd) {
+-			ibv_close_device(cma_dev->verbs);
+-			ret = ERR(ENOMEM);
+-			goto err3;
+-		}
+-
+-		i++;
+-		ret = ibv_query_device(cma_dev->verbs, &attr);
+-		if (ret) {
+-			printf("CMA: unable to query RDMA device\n");
+-			ret = ERR(ret);
+-			goto err3;
+-		}
+-
+-		cma_dev->port_cnt = attr.phys_port_cnt;
+-		cma_dev->max_initiator_depth = (uint8_t) attr.max_qp_init_rd_atom;
+-		cma_dev->max_responder_resources = (uint8_t) attr.max_qp_rd_atom;
+-		ib += (cma_dev->verbs->device->transport_type == IBV_TRANSPORT_IB);
+-	}
+-
+-	if (ib)
+-		ucma_ib_init();
+ 	cma_dev_cnt = dev_cnt;
+ 	ucma_set_af_ib_support();
+ 	pthread_mutex_unlock(&mut);
[email protected]@ -299,12 +284,6 @@
+ 	ibv_free_device_list(dev_list);
+ 	return 0;
+ 
+-err3:
+-	while (i--) {
+-		ibv_dealloc_pd(cma_dev_array[i].pd);
+-		ibv_close_device(cma_dev_array[i].verbs);
+-	}
+-	free(cma_dev_array);
+ err2:
+ 	ibv_free_device_list(dev_list);
+ err1:
[email protected]@ -312,12 +291,93 @@
+ 	return ret;
+ }
+ 
++static struct ibv_context *ucma_open_device(uint64_t guid)
++{
++	struct ibv_device **dev_list;
++	struct ibv_context *verbs = NULL;
++	int i;
++
++	dev_list = ibv_get_device_list(NULL);
++	if (!dev_list) {
++		fprintf(stderr, PFX "Fatal: unable to get RDMA device list\n");
++		return NULL;
++	}
++
++	for (i = 0; dev_list[i]; i++) {
++		if (ibv_get_device_guid(dev_list[i]) == guid) {
++			verbs = ibv_open_device(dev_list[i]);
++			break;
++		}
++	}
++
++	if (!verbs)
++		fprintf(stderr, PFX "Fatal: unable to open RDMA device\n");
++
++	ibv_free_device_list(dev_list);
++	return verbs;
++}
++
++static int ucma_init_device(struct cma_device *cma_dev)
++{
++	struct ibv_device_attr attr;
++	int ret;
++
++	if (cma_dev->verbs)
++		return 0;
++
++	cma_dev->verbs = ucma_open_device(cma_dev->guid);
++	if (!cma_dev->verbs)
++		return ERR(ENODEV);
++
++	ret = ibv_query_device(cma_dev->verbs, &attr);
++	if (ret) {
++		fprintf(stderr, PFX "Fatal: unable to query RDMA device\n");
++		ret = ERR(ret);
++		goto err;
++	}
++
++	cma_dev->port_cnt = attr.phys_port_cnt;
++	cma_dev->max_qpsize = attr.max_qp_wr;
++	cma_dev->max_initiator_depth = (uint8_t) attr.max_qp_init_rd_atom;
++	cma_dev->max_responder_resources = (uint8_t) attr.max_qp_rd_atom;
++	cma_init_cnt++;
++	return 0;
++
++err:
++	ibv_close_device(cma_dev->verbs);
++	cma_dev->verbs = NULL;
++	return ret;
++}
++
++static int ucma_init_all(void)
++{
++	int i, ret = 0;
++
++	if (!cma_dev_cnt) {
++		ret = ucma_init();
++		if (ret)
++			return ret;
++	}
++
++	if (cma_init_cnt == cma_dev_cnt)
++		return 0;
++
++	pthread_mutex_lock(&mut);
++	for (i = 0; i < cma_dev_cnt; i++) {
++		ret = ucma_init_device(&cma_dev_array[i]);
++		if (ret)
++			break;
++	}
++	pthread_mutex_unlock(&mut);
++	return ret;
++}
++
+ struct ibv_context **rdma_get_devices(int *num_devices)
+ {
+ 	struct ibv_context **devs = NULL;
+ 	int i;
+ 
+-	if (ucma_init())
++	if (ucma_init_all())
+ 		goto out;
+ 
+ 	devs = malloc(sizeof *devs * (cma_dev_cnt + 1));
[email protected]@ -354,9 +414,18 @@
  	if (!channel)
  		return NULL;
  
@@ -100,7 +319,48 @@
  		goto err;
  	}
  	return channel;
[email protected]@ -1186,6 +1201,10 @@
[email protected]@ -374,18 +443,33 @@
+ static int ucma_get_device(struct cma_id_private *id_priv, uint64_t guid)
+ {
+ 	struct cma_device *cma_dev;
+-	int i;
++	int i, ret;
+ 
+ 	for (i = 0; i < cma_dev_cnt; i++) {
+ 		cma_dev = &cma_dev_array[i];
+-		if (cma_dev->guid == guid) {
+-			id_priv->cma_dev = cma_dev;
+-			id_priv->id.verbs = cma_dev->verbs;
+-			return 0;
+-		}
++		if (cma_dev->guid == guid)
++			goto match;
+ 	}
+-
++ 
+ 	return ERR(ENODEV);
++match:
++	pthread_mutex_lock(&mut);
++	if ((ret = ucma_init_device(cma_dev)))
++		goto out;
++ 
++	if (!cma_dev->refcnt++) {
++		cma_dev->pd = ibv_alloc_pd(cma_dev->verbs);
++		if (!cma_dev->pd) {
++			cma_dev->refcnt--;
++			ret = ERR(ENOMEM);
++			goto out;
++		}
++	}
++	id_priv->cma_dev = cma_dev;
++	id_priv->id.verbs = cma_dev->verbs;
++out:
++	pthread_mutex_unlock(&mut);
++	return ret;
+ }
+ 
+ static void ucma_free_id(struct cma_id_private *id_priv)
[email protected]@ -1186,6 +1270,10 @@
  	if (ret)
  		return ret;
  
@@ -111,7 +371,7 @@
  	qp = ibv_create_qp(pd, qp_init_attr);
  	if (!qp) {
  		ret = ERR(ENOMEM);
[email protected]@ -1787,6 +1806,9 @@
[email protected]@ -1787,6 +1875,9 @@
  
  	CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_ACCEPT, size);
  	cmd->id = id_priv->handle;
@@ -121,7 +381,7 @@
  
  	ret = write(id_priv->id.channel->fd, msg, size);
  	if (ret != size) {
[email protected]@ -2051,8 +2073,20 @@
[email protected]@ -2051,8 +2142,20 @@
  
  	CMA_CREATE_MSG_CMD_RESP(msg, cmd, resp, UCMA_CMD_MIGRATE_ID, size);
  	cmd->id = id_priv->handle;
@@ -361,7 +621,7 @@
  #include <rdma/rdma_cma.h>
 diff -r -u /tmp/librdmacm-1.0.14.1/examples/rping.c librdmacm-1.0.14.1/examples/rping.c
 --- /tmp/librdmacm-1.0.14.1/examples/rping.c	Tue Feb 15 17:10:48 2011
-+++ librdmacm-1.0.14.1/examples/rping.c	Wed May 25 14:46:30 2011
++++ librdmacm-1.0.14.1/examples/rping.c	Wed Apr 23 10:37:57 2014
 @@ -40,11 +40,17 @@
  #include <netinet/in.h>
  #include <sys/socket.h>
--- a/components/open-fabrics/open-fabrics.license	Fri May 09 07:58:08 2014 -0700
+++ b/components/open-fabrics/open-fabrics.license	Fri May 09 13:24:16 2014 -0700
@@ -23,6 +23,7 @@
 Copyright (c) 2009 HNR Consulting.  All rights reserved.
 Copyright (c) 2005 Hewlett Packard, Inc (Grant Grundler).
 Copyright (c) 2006 Mellanox Technologies Ltd.  All rights reserved
+Copyright (c) 2009 Mellanox Technologies Ltd.  All rights reserved
 
 
 This software is available to you under a choice of one of two
@@ -65,7 +66,9 @@
 Copyright (c) 2006 Oracle.  All rights reserved.
 Copyright (C) 2008 Oracle.  All rights reserved.
 Copyright (c) 2008 Chelsio, Inc. All rights reserved.
-
+Copyright (c) 1996 by Sun Microsystems, Inc.
+Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+Copyright (C) 1989-2003 Free Software Foundation, Inc.
 
 * This software is available to you under a choice of one of two
 * licenses. You may choose to be licensed under the terms of the GNU
@@ -509,6 +512,8 @@
 Copyright (c) 2004 Intel Corporation.  All rights reserved.
 Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc.  All rights reserved.
 Copyright (c) 2008 Lawrence Livermore National Laboratory
+Copyright (C) 1989-2009 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the the
@@ -923,6 +928,8 @@
 Copyright (c) 2004-2009 Voltaire, Inc.  All rights reserved
 Copyright (c) 2009 HNR Consulting.  All rights reserved.
 Copyright (c) 2007 Xsigo Systems Inc.  All rights reserved.
+Copyright (C) 1989-2009 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software with the exception of OpenSM is available to you
 under a choice of one of two licenses. You may chose to be
@@ -1341,6 +1348,8 @@
 
 Copyright (c) 2004 Topspin Communications.  All rights reserved.
 Copyright (c) 2005-2006 Mellanox Technologies Ltd.  All rights reserved.
+Copyright (C) 1999-2005 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the GNU
@@ -1433,6 +1442,8 @@
 Copyright (c) 2009,2010 HNR Consulting. All rights reserved.
 Copyright (c) 2009 Simula Research Laboratory. All rights reserved.
 Copyright (c) 2009      HNR Consulting. All rights reserved
+Copyright (C) 1994 X Consortium
+Copyright (C) 1996-2009 Free Software Foundation, Inc.
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the GNU
@@ -1496,6 +1507,9 @@
 
 
 Copyright (c) 2004-2010 Mellanox Technologies LTD. All rights reserved.
+Copyright (C) 1996-2009 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
+Copyright (c) 1996 by Sun Microsystems, Inc.
 
 Portions Copyright (c) 1995-1998
 The University of Utah and The Regents of the University of California.
@@ -1545,9 +1559,10 @@
 The Software contains the following Copyrights, which are reproduced for
 this distribution as per OpenIB.org BSD license conditions:
 
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 Copyright (c) 2002-2009 Johann George.  All rights reserved.
 Copyright (c) 2006-2009 QLogic Corporation.  All rights reserved.
+Copyright (C) 1989-2010 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the GNU
@@ -1612,10 +1627,11 @@
 The Software contains the following Copyrights, which are reproduced for
 this distribution as per OpenIB.org BSD license conditions:
 
-Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
 Copyright (c) 2010 Lawrence Livermore National Lab.  All rights reserved.
 Copyright (c) 2009 Mellanox Technologies LTD.  All rights reserved.
 Copyright (c) 2009 HNR Consulting.  All rights reserved.
+Copyright (c) 2010 HNR Consulting.  All rights reserved.
 Copyright (c) 2009 Lawrence Livermore National Security
 Copyright (c) 2004-2009 Voltaire Inc.  All rights reserved.
 Copyright (c) 2008 Lawrence Livermore National Lab.  All rights reserved.
@@ -1626,6 +1642,9 @@
 Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved.
 Copyright (C) 2001-2003 The Regents of the University of California.
 Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+Copyright (C) 2006 The Regents of the University of California.
+Copyright (C) 1996-2009 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software with the exception of OpenSM is available to you
 under a choice of one of two licenses. You may chose to be
@@ -2047,6 +2066,8 @@
 Copyright (c) 2005 Ammasso, Inc. All rights reserved.
 Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
 Copyright (c) 2005 Voltaire Inc.  All rights reserved.
+Copyright (C) 1989-2005 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the the
@@ -2435,6 +2456,8 @@
 this distribution as per OpenIB.org BSD license conditions:
 
 Copyright (c) 2004-2009 Voltaire Inc.  All rights reserved.
+Copyright (C) 1989-2008 Free Software Foundation, Inc.
+Copyright (C) 1994 X Consortium
 
 This software with the exception of OpenSM is available to you
 under a choice of one of two licenses. You may chose to be
@@ -2856,6 +2879,10 @@
 Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
 Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
 Copyright (c) 2005 Mellanox Technologies Ltd.  All rights reserved.
+Copyright (c) 2009, Damien Lespiau <[email protected]>
+Copyright (C) 1994 X Consortium
+Copyright (C) 1989-2009 Free Software Foundation, Inc.
+Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
 
 This software is available to you under a choice of one of two
 licenses. You may choose to be licensed under the terms of the the
--- a/components/open-fabrics/open-fabrics.p5m	Fri May 09 07:58:08 2014 -0700
+++ b/components/open-fabrics/open-fabrics.p5m	Fri May 09 13:24:16 2014 -0700
@@ -18,7 +18,7 @@
 #
 # CDDL HEADER END
 #
-# Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
 #
 <transform file path=usr.*/man/.+ -> default mangler.man.stability volatile>
 
@@ -417,66 +417,79 @@
 license open-fabrics.license license='open-fabrics' \
     com.oracle.info.description="the OpenFabrics Enterprise Distribution" \
     com.oracle.info.name=open-fabrics \
-    com.oracle.info.version=1.5.3
+    com.oracle.info.version=1.5.3 \
+    com.oracle.info.tpno=3369
 
 license open-fabrics.license license='open-fabrics (ibutils)' \
     com.oracle.info.description="the OpenFabrics User Level InfiniBand Management Utilities" \
     com.oracle.info.name=ibutils \
-    com.oracle.info.version=1.5.7
+    com.oracle.info.version=1.5.7 \
+    com.oracle.info.tpno=5084
 
 license open-fabrics.license license='open-fabrics (infiniband-diags)' \
     com.oracle.info.description="the OpenFabrics Diagnostic Tools" \
     com.oracle.info.name=infiniband-diags \
-    com.oracle.info.version=1.5.8
+    com.oracle.info.version=1.5.8 \
+    com.oracle.info.tpno=5085
 
 license open-fabrics.license license='open-fabrics (libibmad)' \
     com.oracle.info.description="the OpenFabrics InfiniBand MAD library" \
     com.oracle.info.name=libibmad \
-    com.oracle.info.version=1.3.7
+    com.oracle.info.version=1.3.7 \
+    com.oracle.info.tpno=5086
 
 license open-fabrics.license license='open-fabrics (libibumad)' \
     com.oracle.info.description="the OpenFabrics user MAD interface library" \
     com.oracle.info.name=libibumad \
-    com.oracle.info.version=1.3.7
+    com.oracle.info.version=1.3.7 \
+    com.oracle.info.tpno=5087
 
 license open-fabrics.license license='open-fabrics (libibverbs)' \
     com.oracle.info.description="the OpenFabrics RDMA verbs library" \
     com.oracle.info.name=libibverbs \
-    com.oracle.info.version=1.1.4
+    com.oracle.info.version=1.1.4 \
+    com.oracle.info.tpno=5082
 
 license open-fabrics.license license='open-fabrics (libmlx4)' \
     com.oracle.info.description="the OpenFabrics Mellanox ConnectX driver" \
     com.oracle.info.name=libmlx4 \
-    com.oracle.info.version=1.0.1
+    com.oracle.info.version=1.0.1 \
+    com.oracle.info.tpno=5088
 
 license open-fabrics.license license='open-fabrics (librdmacm)' \
     com.oracle.info.description="the OpenFabrics RDMA cm library" \
     com.oracle.info.name=librdmacm \
-    com.oracle.info.version=1.0.14.1
+    com.oracle.info.version=1.0.14.1 \
+    com.oracle.info.tpno=5089
 
 license open-fabrics.license license='open-fabrics (libsdp)' \
     com.oracle.info.description="the OpenFabrics InfiniBand SDP library" \
     com.oracle.info.name=libsdp \
-    com.oracle.info.version=1.1.108
+    com.oracle.info.version=1.1.108 \
+    com.oracle.info.tpno=5080
 
 license open-fabrics.license license='open-fabrics (opensm)' \
     com.oracle.info.description="the OpenFabrics InfiniBand Subnet Manager and Administrator" \
     com.oracle.info.name=opensm \
-    com.oracle.info.version=3.3.9
+    com.oracle.info.version=3.3.9 \
+    com.oracle.info.tpno=5091
 
 license open-fabrics.license license='open-fabrics (perftest)' \
     com.oracle.info.description="the OpenFabrics performance tests" \
     com.oracle.info.name=perftest \
-    com.oracle.info.version=1.3.0
+    com.oracle.info.version=1.3.0 \
+    com.oracle.info.tpno=5081
 
 license open-fabrics.license license='open-fabrics (qperf)' \
     com.oracle.info.description="the OpenFabrics RDMA and IP performance tests" \
     com.oracle.info.name=qperf \
-    com.oracle.info.version=0.4.6
+    com.oracle.info.version=0.4.6 \
+    com.oracle.info.tpno=5083
 
 license open-fabrics.license license='open-fabrics (rds-tools)' \
     com.oracle.info.description="the OpenFabrics RDS support tools" \
     com.oracle.info.name=rds-tools \
-    com.oracle.info.version=2.0.4
+    com.oracle.info.version=2.0.4 \
+    com.oracle.info.tpno=5092
 
 depend fmri=text/gawk type=require