18117487 saquery -m -t 50000 failed with multiple VFs created s11-update
authorboris.chiu@oracle.com
Fri, 23 Jan 2015 08:29:14 -0800
branchs11-update
changeset 3679 c058dce9610f
parent 3678 96c88473320c
child 3681 f09b6b7085b5
18117487 saquery -m -t 50000 failed with multiple VFs created 18247164 SUNBT7167127 Some OFED tools print errors with a connect-x VPI card (userland) 18368329 Should use snprintf to convert numeric link_layer to string for ibstat to work 19187537 iberror() of open-fabrics dumps core because of buffer overrun 19195181 wrong handling of getaddrinfo() retval in open-fabrics dumps core 19448949 libibverbs cleanup incomplete
components/open-fabrics/ibutils/patches/base.patch
components/open-fabrics/infiniband-diags/patches/base.patch
components/open-fabrics/infiniband-diags/solaris_set_nodedesc.c
components/open-fabrics/libibumad/patches/base.patch
components/open-fabrics/libibverbs/patches/base.patch
components/open-fabrics/libibverbs/solaris_compatibility.c
components/open-fabrics/opensm/patches/base.patch
components/open-fabrics/perftest/patches/base.patch
--- a/components/open-fabrics/ibutils/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/ibutils/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/ibutils-1.5.7/config/osm.m4 ibutils-1.5.7/config/osm.m4
 --- /tmp/ibutils-1.5.7/config/osm.m4	Thu Feb 18 03:31:34 2010
 +++ ibutils-1.5.7/config/osm.m4	Thu Feb 24 16:51:16 2011
@@ -210,7 +213,7 @@
  INSTALL_HEADER = $(INSTALL_DATA)
 diff -r -u /tmp/ibutils-1.5.7/ibdiag/src/ibdebug.tcl ibutils-1.5.7/ibdiag/src/ibdebug.tcl
 --- /tmp/ibutils-1.5.7/ibdiag/src/ibdebug.tcl	Tue Mar  8 03:08:02 2011
-+++ ibutils-1.5.7/ibdiag/src/ibdebug.tcl	Thu Jun 27 22:46:57 2013
++++ ibutils-1.5.7/ibdiag/src/ibdebug.tcl	Wed Apr 16 17:45:12 2014
 @@ -352,13 +352,16 @@
      if {[file exists $ibisOutDir/$ibisLogFile] && (![file writable $ibisOutDir/$ibisLogFile])} {
  	set ibisLogFile $ibisLogFile.[pid]
@@ -253,7 +256,7 @@
      foreach {array_name data} {G data* Neighbor *} {
 diff -r -u /tmp/ibutils-1.5.7/ibdiag/src/ibdebug_if.tcl ibutils-1.5.7/ibdiag/src/ibdebug_if.tcl
 --- /tmp/ibutils-1.5.7/ibdiag/src/ibdebug_if.tcl	Thu Oct  7 07:29:56 2010
-+++ ibutils-1.5.7/ibdiag/src/ibdebug_if.tcl	Wed Jun 19 07:43:17 2013
++++ ibutils-1.5.7/ibdiag/src/ibdebug_if.tcl	Wed Apr 16 17:45:12 2014
 @@ -675,6 +675,16 @@
      }
  
@@ -947,6 +950,18 @@
  
  #define CR_CLASS        0x09
  #define CR_ATTR_50      0x50
+diff -r -u /tmp/ibutils-1.5.7/ibis/src/ibis_base.h ibutils-1.5.7/ibis/src/ibis_base.h
+--- /tmp/ibutils-1.5.7/ibis/src/ibis_base.h	Wed Feb 24 02:09:25 2010
++++ ibutils-1.5.7/ibis/src/ibis_base.h	Wed Apr  9 10:54:26 2014
+@@ -64,7 +64,7 @@
+ #define IBIS_FILE_PATH_MAX	PATH_MAX
+ #endif
+ 
+-#define MAX_LOCAL_IBPORTS 32
++#define MAX_LOCAL_IBPORTS MAX_PORTS
+ #define DISP_HANDLE_MAX 32
+ 
+ END_C_DECLS
 diff -r -u /tmp/ibutils-1.5.7/ibis/src/ibis_wrap.c ibutils-1.5.7/ibis/src/ibis_wrap.c
 --- /tmp/ibutils-1.5.7/ibis/src/ibis_wrap.c	Mon Nov  1 16:03:44 2010
 +++ ibutils-1.5.7/ibis/src/ibis_wrap.c	Mon Jun  6 15:35:52 2011
@@ -1366,7 +1381,7 @@
     OSM_CLFAGS=disabled
 diff -r -u /tmp/ibutils-1.5.7/Makefile.in ibutils-1.5.7/Makefile.in
 --- /tmp/ibutils-1.5.7/Makefile.in	Tue Mar  8 03:09:29 2011
-+++ ibutils-1.5.7/Makefile.in	Thu Mar 10 18:33:24 2011
++++ ibutils-1.5.7/Makefile.in	Thu Dec 12 15:36:52 2013
 @@ -54,7 +54,7 @@
  pkglibdir = $(libdir)/@PACKAGE@
  pkglibexecdir = $(libexecdir)/@PACKAGE@
@@ -1378,7 +1393,7 @@
  INSTALL_HEADER = $(INSTALL_DATA)
 diff -r -u /tmp/ibutils-1.5.7/configure ibutils-1.5.7/configure
 --- /tmp/ibutils-1.5.7/configure	Tue Mar  8 03:09:29 2011
-+++ ibutils-1.5.7/configure	Thu Mar 10 18:33:24 2011
++++ ibutils-1.5.7/configure	Thu Dec 12 16:51:11 2013
 @@ -1824,7 +1824,7 @@
  
  test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
--- a/components/open-fabrics/infiniband-diags/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/infiniband-diags/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/infiniband-diags-1.5.8/Makefile.am infiniband-diags-1.5.8/Makefile.am
 --- /tmp/infiniband-diags-1.5.8/Makefile.am	Wed Feb 16 02:13:21 2011
 +++ infiniband-diags-1.5.8/Makefile.am	Fri Feb 25 03:09:22 2011
@@ -1803,16 +1806,17 @@
 diff -r -u /tmp/infiniband-diags-1.5.8/src/saquery.c infiniband-diags-1.5.8/src/saquery.c
 --- /tmp/infiniband-diags-1.5.8/src/saquery.c	Wed Feb 16 02:13:21 2011
 +++ infiniband-diags-1.5.8/src/saquery.c	Thu Jun 23 10:36:40 2011
-@@ -105,7 +105,7 @@
+@@ -104,8 +104,7 @@
+ /**
   * Declare some globals because I don't want this to be too complex.
   */
- #define MAX_PORTS (8)
+-#define MAX_PORTS (8)
 -#define DEFAULT_SA_TIMEOUT_MS (1000)
 +#define DEFAULT_SA_TIMEOUT_MS (10000)
  static struct query_res result;
  
  enum {
-@@ -1757,7 +1757,7 @@
+@@ -1757,7 +1756,7 @@
  			requested_lid = (uint16_t) strtoul(argv[0], NULL, 0);
  			requested_lid_flag++;
  		} else if (node_print_desc == NAME_OF_GUID) {
@@ -1868,7 +1872,54 @@
 diff -r -u /tmp/infiniband-diags-1.5.8/src/ibstat.c infiniband-diags-1.5.8/src/ibstat.c
 --- /tmp/infiniband-diags-1.5.8/src/ibstat.c	Wed Feb 16 02:13:21 2011
 +++ infiniband-diags-1.5.8/src/ibstat.c	Fri Feb 25 03:09:28 2011
-@@ -245,7 +245,7 @@
+@@ -46,6 +46,7 @@
+ 
+ #include <infiniband/umad.h>
+ #include <infiniband/mad.h>
++#include <infiniband/verbs.h>
+ 
+ #include <ibdiag_common.h>
+ 
+@@ -78,7 +79,7 @@
+ }
+ 
+ static char *port_state_str[] = {
+-	"???",
++	"Unknown",
+ 	"Down",
+ 	"Initializing",
+ 	"Armed",
+@@ -112,10 +113,10 @@
+ 	printf("%sPort %d:\n", hdrpre, port->portnum);
+ 	printf("%sState: %s\n", pre,
+ 	       (unsigned)port->state <=
+-	       4 ? port_state_str[port->state] : "???");
++	       4 ? port_state_str[port->state] : "Unknown");
+ 	printf("%sPhysical state: %s\n", pre,
+ 	       (unsigned)port->phys_state <=
+-	       7 ? port_phy_state_str[port->phys_state] : "???");
++	       7 ? port_phy_state_str[port->phys_state] : "Unknown");
+ 	printf("%sRate: %d\n", pre, port->rate);
+ 	printf("%sBase lid: %d\n", pre, port->base_lid);
+ 	printf("%sLMC: %d\n", pre, port->lmc);
+@@ -167,13 +168,13 @@
+ 
+ static int ports_list(char names[][UMAD_CA_NAME_LEN], int n)
+ {
+-	uint64_t guids[64];
++	uint64_t guids[MAX_PORTS];
+ 	int found, ports, i;
+ 
+-	for (i = 0, found = 0; i < n && found < 64; i++) {
++	for (i = 0, found = 0; i < n && found < MAX_PORTS; i++) {
+ 		if ((ports =
+ 		     umad_get_ca_portguids(names[i], guids + found,
+-					   64 - found)) < 0)
++					   MAX_PORTS - found)) < 0)
+ 			return -1;
+ 		found += ports;
+ 	}
+@@ -245,7 +246,7 @@
  		if (i >= n)
  			IBPANIC("'%s' IB device can't be found", argv[0]);
  
@@ -1880,7 +1931,18 @@
 diff -r -u /tmp/infiniband-diags-1.5.8/src/ibdiag_common.c infiniband-diags-1.5.8/src/ibdiag_common.c
 --- /tmp/infiniband-diags-1.5.8/src/ibdiag_common.c	Wed Feb 16 02:13:21 2011
 +++ infiniband-diags-1.5.8/src/ibdiag_common.c	Tue May  3 13:50:05 2011
-@@ -330,7 +330,7 @@
+@@ -322,15 +322,17 @@
+ 	char buf[512];
+ 	va_list va;
+ 	int n;
++	int bufsz;
+ 
+ 	va_start(va, msg);
+-	n = vsprintf(buf, msg, va);
++	bufsz = strlen(msg) < sizeof (buf) ? strlen(msg) : sizeof (buf);
++	n = vsnprintf(buf, bufsz, msg, va);
+ 	va_end(va);
+ 	buf[n] = 0;
  
  	if (ibdebug)
  		printf("%s: iberror: [pid %d] %s: failed: %s\n",
--- a/components/open-fabrics/infiniband-diags/solaris_set_nodedesc.c	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/infiniband-diags/solaris_set_nodedesc.c	Fri Jan 23 08:29:14 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. 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 GNU
@@ -54,6 +54,7 @@
 
 #include <infiniband/verbs.h>
 #include <infiniband/arch.h>
+#include <infiniband/umad.h>
 
 #include <sys/ib/adapters/hermon/hermon_ioctl.h>
 
@@ -87,7 +88,6 @@
 static di_node_t	di_rootnode;
 char *argv0 = "solaris_set_nodedesc";
 
-#define	MAX_HCAS	32
 static struct nodedesc_read_info_s {
 	boolean_t	info_valid;
 	uint64_t	guid;
--- a/components/open-fabrics/libibumad/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/libibumad/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/libibumad-1.3.7/Makefile.in libibumad-1.3.7/Makefile.in
 --- /tmp/libibumad-1.3.7/Makefile.in	Mon Feb 14 06:18:00 2011
 +++ libibumad-1.3.7/Makefile.in	Fri Feb 25 03:11:40 2011
@@ -15,9 +18,29 @@
 diff -r -u /tmp/libibumad-1.3.7/include/infiniband/umad.h libibumad-1.3.7/include/infiniband/umad.h
 --- /tmp/libibumad-1.3.7/include/infiniband/umad.h	Mon Feb 14 01:08:29 2011
 +++ libibumad-1.3.7/include/infiniband/umad.h	Fri May 13 04:28:12 2011
-@@ -96,7 +96,11 @@
+@@ -45,7 +45,15 @@
+ #endif				/* __cplusplus */
  
- #define UMAD_MAX_PORTS		64
+ BEGIN_C_DECLS
+-#define UMAD_MAX_DEVICES 32
++/* To accomodate max. of 16 PCIe slots and 63 VFs per HCA, */
++/* we define	MAX_HCAS = (63VFs + 1PF) * 16HCAs */
++/* 		MAX_PORTS = MAX_HCAS * 2ports per HCA */
++#define MAX_HCAS	(64*16)
++#define MAX_PORTS	(MAX_HCAS*2)
++#define UMAD_MAX_DEVICES MAX_HCAS
++#define	UMAD_MAX_HCAS	MAX_HCAS
++#define	UMAD_MAX_PORTS	MAX_PORTS
++
+ #define UMAD_ANY_PORT	0
+ typedef struct ib_mad_addr {
+ 	uint32_t qpn;
+@@ -94,9 +102,13 @@
+ #define SYS_IB_MAD_PORT		"port"
+ #define SYS_IB_MAD_DEV		"ibdev"
+ 
+-#define UMAD_MAX_PORTS		64
++#define UMAD_MAX_PORTS		MAX_PORTS
  
 +#if defined(__SVR4) && defined(__sun)
 +#define	UMAD_DEV_DIR		"/dev/infiniband/ofs"
--- a/components/open-fabrics/libibverbs/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/libibverbs/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/846623/libibverbs-1.1.4/Makefile.am libibverbs-1.1.4/Makefile.am
 --- /tmp/846623/libibverbs-1.1.4/Makefile.am	Thu Feb  3 01:53:17 2011
 +++ libibverbs-1.1.4/Makefile.am	Fri Feb 11 04:02:12 2011
@@ -2524,6 +2527,27 @@
  device_list.o: examples/device_list.c
  @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT device_list.o -MD -MP -MF $(DEPDIR)/device_list.Tpo -c -o device_list.o `test -f 'examples/device_list.c' || echo '$(srcdir)/'`examples/device_list.c
  @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/device_list.Tpo $(DEPDIR)/device_list.Po
+diff -r -u /tmp/846623/libibverbs-1.1.4/examples/uc_pingpong.c libibverbs-1.1.4/examples/uc_pingpong.c
+--- /tmp/846623/libibverbs-1.1.4/examples/uc_pingpong.c	Thu Mar 10 06:58:21 2011
++++ libibverbs-1.1.4/examples/uc_pingpong.c	Tue Jan  6 10:05:55 2015
+@@ -144,7 +144,7 @@
+ 
+ 	n = getaddrinfo(servername, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
+ 		free(service);
+ 		return NULL;
+@@ -219,7 +219,7 @@
+ 
+ 	n = getaddrinfo(NULL, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ 		free(service);
+ 		return NULL;
 diff -r -u /tmp/846623/libibverbs-1.1.4/examples/asyncwatch.c libibverbs-1.1.4/examples/asyncwatch.c
 --- /tmp/846623/libibverbs-1.1.4/examples/asyncwatch.c	Thu Mar 10 06:58:21 2011
 +++ libibverbs-1.1.4/examples/asyncwatch.c	Fri Feb 11 04:02:18 2011
@@ -2916,51 +2940,87 @@
 diff -r -u /tmp/846623/libibverbs-1.1.4/examples/srq_pingpong.c libibverbs-1.1.4/examples/srq_pingpong.c
 --- /tmp/846623/libibverbs-1.1.4/examples/srq_pingpong.c	Thu Mar 10 06:58:21 2011
 +++ libibverbs-1.1.4/examples/srq_pingpong.c	Wed Jun  8 09:46:34 2011
-@@ -171,6 +171,12 @@
+@@ -165,8 +165,13 @@
+ 
+ 	n = getaddrinfo(servername, service, &hints, &res);
+ 
+-	if (n < 0) {
+-		fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++	if (n != 0) {
++		if (n == EAI_NONAME)
++			fprintf(stderr,
++			    "Name or service not known for %s:%d\n", servername, port);
++		else
++			fprintf(stderr,
++			    "%s for %s:%d\n", gai_strerror(n), servername, port);
+ 		free(service);
  		return NULL;
  	}
+@@ -253,7 +258,7 @@
  
-+	if (n == EAI_NONAME) {
-+		fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+		free(service);
-+		return NULL;
-+	}
-+
- 	for (t = res; t; t = t->ai_next) {
- 		sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- 		if (sockfd >= 0) {
+ 	n = getaddrinfo(NULL, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ 		free(service);
+ 		return NULL;
 diff -r -u /tmp/846623/libibverbs-1.1.4/examples/ud_pingpong.c libibverbs-1.1.4/examples/ud_pingpong.c
 --- /tmp/846623/libibverbs-1.1.4/examples/ud_pingpong.c	Thu Mar 10 06:58:21 2011
 +++ libibverbs-1.1.4/examples/ud_pingpong.c	Wed Jun  8 09:46:34 2011
-@@ -149,6 +149,12 @@
+@@ -143,8 +143,13 @@
+ 
+ 	n = getaddrinfo(servername, service, &hints, &res);
+ 
+-	if (n < 0) {
+-		fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++	if (n != 0) {
++		if (n == EAI_NONAME)
++			fprintf(stderr,
++			    "Name or service not known for %s:%d\n", servername, port);
++		else
++			fprintf(stderr,
++			    "%s for %s:%d\n", gai_strerror(n), servername, port);
+ 		free(service);
  		return NULL;
  	}
+@@ -217,7 +222,7 @@
  
-+	if (n == EAI_NONAME) {
-+		fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+		free(service);
-+		return NULL;
-+	}
-+
- 	for (t = res; t; t = t->ai_next) {
- 		sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- 		if (sockfd >= 0) {
+ 	n = getaddrinfo(NULL, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ 		free(service);
+ 		return NULL;
 diff -r -u /tmp/846623/libibverbs-1.1.4/examples/rc_pingpong.c libibverbs-1.1.4/examples/rc_pingpong.c
 --- /tmp/846623/libibverbs-1.1.4/examples/rc_pingpong.c	Thu Mar 10 06:58:21 2011
 +++ libibverbs-1.1.4/examples/rc_pingpong.c	Wed Jun  8 09:46:34 2011
-@@ -161,6 +161,12 @@
+@@ -155,8 +155,13 @@
+ 
+ 	n = getaddrinfo(servername, service, &hints, &res);
+ 
+-	if (n < 0) {
+-		fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++	if (n != 0) {
++		if (n == EAI_NONAME)
++			fprintf(stderr,
++			    "Name or service not known for %s:%d\n", servername, port);
++		else
++			fprintf(stderr,
++			    "%s for %s:%d\n", gai_strerror(n), servername, port);
+ 		free(service);
  		return NULL;
  	}
+@@ -230,7 +235,7 @@
  
-+	if (n == EAI_NONAME) {
-+		fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+		free(service);
-+		return NULL;
-+	}
-+
- 	for (t = res; t; t = t->ai_next) {
- 		sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- 		if (sockfd >= 0) {
+ 	n = getaddrinfo(NULL, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ 		free(service);
+ 		return NULL;
 diff -r -u /tmp/846623/libibverbs-1.1.4/examples/device_list.c libibverbs-1.1.4/examples/device_list.c
 --- /tmp/846623/libibverbs-1.1.4/examples/device_list.c	Sun Nov  1 06:47:19 2009
 +++ libibverbs-1.1.4/examples/device_list.c	Fri Feb 11 04:02:18 2011
--- a/components/open-fabrics/libibverbs/solaris_compatibility.c	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/libibverbs/solaris_compatibility.c	Fri Jan 23 08:29:14 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. 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 GNU
@@ -101,8 +101,6 @@
 #define	RDMA_USER_CM_MAX_ABI_VERSION	4 /* rdma_cma_abi.h */
 
 #define	MLX4	0
-#define	MAX_HCAS				260
-#define	MAX_HCA_PORTS				16
 #define	HW_DRIVER_MAX_NAME_LEN			20
 #define	UVERBS_KERNEL_SYSFS_NAME_BASE		"uverbs"
 #define	UMAD_KERNEL_SYSFS_NAME_BASE		"umad"
@@ -119,6 +117,9 @@
 #define	INFINIHOST_DEVICE_ID_2			0x5a45
 #define	INFINIHOST_DEVICE_ID_4			0x6279
 
+#define	MAX_HCAS				(64*16)
+#define	MAX_PORTS				(MAX_HCAS*2)
+
 /*
  * sol_uverbs_drv_status is the status of what libibverbs knows
  * about the status of sol_uverbs driver.
@@ -164,7 +165,7 @@
 	char		ibd_node_guid_external_str[20];
 	char		ibd_sys_image_guid[20];
 	char		ibd_fw_ver[16];
-	char		ibd_name[8];
+	char		ibd_name[16];
 	int		ibd_boardid_index;
 	uint_t		ibd_device_id;
 } ibdev_cache_info_t;
@@ -178,7 +179,7 @@
 	uint_t		uvc_vendor_id;
 	uint_t		uvc_device_id;
 	int		uvc_hca_instance;
-	char		uvc_ibdev_name[8];
+	char		uvc_ibdev_name[16];
 	char		uvc_ibdev_hca_path[MAXPATHLEN];
 } uverbs_cache_info_t;
 static uverbs_cache_info_t	uverbs_dev_cache[MAX_HCAS];
@@ -189,7 +190,7 @@
 	int		umc_port;
 	char		umc_ib_dev[16];
 } umad_cache_info_t;
-static umad_cache_info_t	umad_dev_cache[MAX_HCAS * MAX_HCA_PORTS];
+static umad_cache_info_t	umad_dev_cache[MAX_PORTS];
 static int			umad_abi_version = -1;
 
 pthread_once_t		oneTimeInit = PTHREAD_ONCE_INIT;
@@ -236,8 +237,7 @@
 static int
 umad_cache_add(uint_t dev_num, int port, char *ibdev)
 {
-	if ((dev_num >= (MAX_HCAS  * MAX_HCA_PORTS)) ||
-	    (umad_cache_cnt >= (MAX_HCAS  * MAX_HCA_PORTS))) {
+	if ((dev_num >= MAX_PORTS) || (umad_cache_cnt >= MAX_PORTS)) {
 		fprintf(stderr, "dev %d: exceeds umad cache size\n", dev_num);
 		return (1);
 	}
@@ -371,13 +371,8 @@
 	uverbs_cache_info_t	info;
 	int			dev_num, fd, i, bufsize, hca_cnt;
 	char			uverbs_devpath[MAXPATHLEN];
-#ifndef	IB_USER_VERBS_V2_IN_V1
 	sol_uverbs_info_t	*uverbs_infop;
 	sol_uverbs_hca_info_t	*hca_infop;
-#else
-	sol_uverbs_info_v2_t	*uverbs_infop;
-	sol_uverbs_hca_info_v2_t	*hca_infop;
-#endif
 	char *buf;
 
 	snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s%d",
@@ -394,20 +389,11 @@
 		goto error_exit1;
 	}
 
-#ifndef	IB_USER_VERBS_V2_IN_V1
 	bufsize = sizeof (sol_uverbs_info_t) + sizeof (sol_uverbs_hca_info_t) *
 	    MAX_HCAS;
-#else
-	bufsize = sizeof (sol_uverbs_info_v2_t) +
-	    sizeof (sol_uverbs_hca_info_v2_t) * MAX_HCAS;
-#endif
 	buf = malloc(bufsize);
 	memset(buf, 0, bufsize);
-#ifndef	IB_USER_VERBS_V2_IN_V1
 	uverbs_infop = (sol_uverbs_info_t *)buf;
-#else
-	uverbs_infop = (sol_uverbs_info_v2_t *)buf;
-#endif
 	uverbs_infop->uverbs_hca_cnt = MAX_HCAS;
 
 	if (ioctl(fd, UVERBS_IOCTL_GET_HCA_INFO, uverbs_infop) != 0) {
@@ -484,7 +470,7 @@
 	sol_umad_ioctl_info_t		*umad_infop;
 	sol_umad_ioctl_port_info_t	*port_infop;
 
-	for (minor = 0; minor < MAX_HCAS * MAX_HCA_PORTS; minor++) {
+	for (minor = 0; minor < MAX_PORTS; minor++) {
 		snprintf(umad_devpath, MAXPATHLEN, "%s/%s%d",
 		    IB_OFS_DEVPATH_PREFIX, UMAD_KERNEL_SYSFS_NAME_BASE,
 		    minor);
@@ -496,7 +482,7 @@
 			save_errno = errno;
 	}
 
-	if ((minor == MAX_HCAS * MAX_HCA_PORTS) && (fd < 0)) {
+	if ((minor == MAX_PORTS) && (fd < 0)) {
 		if (! save_errno)
 			save_errno = errno;
 		fprintf(stderr, "failed to open sol_umad: %s\n",
@@ -505,12 +491,12 @@
 	}
 
 	bufsize = sizeof (sol_umad_ioctl_info_t) +
-	    (sizeof (sol_umad_ioctl_port_info_t) * MAX_HCAS * MAX_HCA_PORTS);
+	    (sizeof (sol_umad_ioctl_port_info_t) * MAX_PORTS);
 
 	buf = malloc(bufsize);
 	memset(buf, 0, bufsize);
 	umad_infop = (sol_umad_ioctl_info_t *)buf;
-	umad_infop->umad_port_cnt = MAX_HCAS * MAX_HCA_PORTS;
+	umad_infop->umad_port_cnt = MAX_PORTS;
 
 	if (ioctl(fd, IB_USER_MAD_GET_PORT_INFO, umad_infop) != 0) {
 		fprintf(stderr, "sol_umad ioctl failed: %s\n",
@@ -593,7 +579,7 @@
 	memset(&uverbs_dev_cache, 0, (sizeof (uverbs_cache_info_t) * MAX_HCAS));
 	memset(&ibdev_cache, 0, (sizeof (ibdev_cache_info_t) * MAX_HCAS * 2));
 	memset(&umad_dev_cache, 0,
-	    (sizeof (umad_cache_info_t) * MAX_HCAS * MAX_HCA_PORTS));
+	    (sizeof (umad_cache_info_t) * MAX_PORTS));
 
 	initialized = B_TRUE;
 }
@@ -1146,6 +1132,19 @@
 		} else if (strcmp(path, "cap_mask") == 0) {
 			len = 1 + sprintf(buf, "0x%08x",
 			    port_attr.port_cap_flags);
+		} else if (strcmp(path, "link_layer") == 0) {
+			switch (port_attr.link_layer) {
+				case IBV_LINK_LAYER_UNSPECIFIED:
+				case IBV_LINK_LAYER_INFINIBAND:
+					len = 1 + sprintf(buf, "%s", "IB");
+					break;
+				case IBV_LINK_LAYER_ETHERNET:
+					len =
+					    1 + sprintf(buf, "%s", "Ethernet");
+					break;
+				default:
+					len = 1 + sprintf(buf, "%s", "Unknown");
+			}
 		}
 	}
 exit:
@@ -1396,7 +1395,7 @@
 	(void) pthread_mutex_unlock(&umad_cache_mutex);
 
 	if (check_path(path, CP_UMAD, &dev_num)) {
-		if (dev_num >= MAX_HCAS * MAX_HCA_PORTS) {
+		if (dev_num >= MAX_PORTS) {
 			fprintf(stderr, "Invalid Path: %s\n", path);
 			goto exit;
 		}
--- a/components/open-fabrics/opensm/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/opensm/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/opensm-3.3.9/complib/Makefile.in opensm-3.3.9/complib/Makefile.in
 --- /tmp/opensm-3.3.9/complib/Makefile.in	Mon Mar  7 00:01:52 2011
 +++ opensm-3.3.9/complib/Makefile.in	Mon Mar 14 03:17:52 2011
@@ -665,6 +668,18 @@
  }
  
  /*
+diff -r -u /tmp/opensm-3.3.9/include/vendor/osm_vendor_ibumad.h opensm-3.3.9/include/vendor/osm_vendor_ibumad.h
+--- /tmp/opensm-3.3.9/include/vendor/osm_vendor_ibumad.h	Sun Mar  6 23:51:12 2011
++++ opensm-3.3.9/include/vendor/osm_vendor_ibumad.h	Wed Apr  9 10:54:26 2014
+@@ -64,7 +64,7 @@
+ *
+ *********/
+ #define OSM_DEFAULT_RETRY_COUNT 3
+-#define OSM_UMAD_MAX_CAS	32
++#define OSM_UMAD_MAX_CAS	UMAD_MAX_HCAS
+ #define OSM_UMAD_MAX_PORTS_PER_CA	2
+ #define OSM_UMAD_MAX_AGENTS	32
+ 
 diff -r -u /tmp/opensm-3.3.9/configure opensm-3.3.9/configure
 --- /tmp/opensm-3.3.9/configure	Mon Mar  7 00:01:54 2011
 +++ opensm-3.3.9/configure	Mon Mar 14 03:13:28 2011
--- a/components/open-fabrics/perftest/patches/base.patch	Tue Jan 20 05:18:57 2015 -0800
+++ b/components/open-fabrics/perftest/patches/base.patch	Fri Jan 23 08:29:14 2015 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
 diff -r -u /tmp/perftest-1.3.0/Makefile perftest-1.3.0/Makefile
 --- /tmp/perftest-1.3.0/Makefile	Thu Jan 20 01:37:35 2011
 +++ perftest-1.3.0/Makefile	Fri Feb 11 04:12:45 2011
@@ -214,9 +217,12 @@
  
  #include <infiniband/verbs.h>
  #include <rdma/rdma_cma.h>
-@@ -144,7 +147,7 @@
+@@ -142,9 +145,9 @@
  
- 	if (n < 0) {
+ 	n = getaddrinfo(data->servername, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
  		fprintf(stderr, "%d:%s: %s for %s:%d\n", 
 -				pid, __func__, gai_strerror(n),
 +				(int)pid, __func__, gai_strerror(n),
@@ -343,11 +349,13 @@
  			free(data->rem_dest);
  			goto err;
  		}
-@@ -347,7 +350,7 @@
+@@ -346,8 +349,8 @@
+ 	if (asprintf(&service, "%d", data->port) < 0)
  		goto err5;
  
- 	if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
+-	if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
 -		fprintf(stderr, "%d:%s: %s for port %d\n", pid, __func__, 
++	if ( (n = getaddrinfo(NULL, service, &hints, &res) != 0) ) {
 +		fprintf(stderr, "%d:%s: %s for port %d\n", (int)pid, __func__, 
  					gai_strerror(n), data->port);
  		goto err5;
@@ -828,6 +836,15 @@
  				return 1;
  			}
  			ccnt += 1;
+@@ -1265,7 +1277,7 @@
+ 		
+ 		write(data.sockfd, "done", sizeof "done");
+ 		close(data.sockfd);
+-		
++
+ 	}
+ 	
+ 	print_report(iters, data.size, duplex, tposted, tcompleted);
 diff -r -u /tmp/perftest-1.3.0/rdma_lat.c perftest-1.3.0/rdma_lat.c
 --- /tmp/perftest-1.3.0/rdma_lat.c	Wed Apr  7 09:44:33 2010
 +++ perftest-1.3.0/rdma_lat.c	Fri Feb 11 04:12:46 2011
@@ -874,9 +891,12 @@
  			&rem_dest->psn, &rem_dest->rkey, &rem_dest->vaddr);
  
  	if (parsed != 5) {
-@@ -220,7 +229,7 @@
+@@ -218,9 +227,9 @@
  
- 	if (n < 0) {
+ 	n = getaddrinfo(data->servername, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
  		fprintf(stderr, "%d:%s: %s for %s:%d\n", 
 -				pid, __func__, gai_strerror(n),
 +				(int)pid, __func__, gai_strerror(n),
@@ -962,11 +982,13 @@
  			goto err3;
  		}
  		ctx = pp_init_ctx(data->ib_dev, data);
-@@ -393,7 +402,7 @@
+@@ -392,8 +401,8 @@
+ 	if (asprintf(&service, "%d", data->port) < 0)
  		goto err5;
  
- 	if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
+-	if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
 -		fprintf(stderr, "%d:%s: %s for port %d\n", pid, __func__, 
++	if ( (n = getaddrinfo(NULL, service, &hints, &res) != 0) ) {
 +		fprintf(stderr, "%d:%s: %s for port %d\n", (int)pid, __func__, 
  					gai_strerror(n), data->port);
  		goto err5;
@@ -1384,6 +1406,24 @@
  	} else {
  
  		switch (params->mtu) {
+@@ -791,7 +807,7 @@
+ 
+ 	n = getaddrinfo(servername, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
+ 		return n;
+ 	}
+@@ -835,7 +851,7 @@
+ 
+ 	n = getaddrinfo(NULL, service, &hints, &res);
+ 
+-	if (n < 0) {
++	if (n != 0) {
+ 		fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ 		return n;
+ 	}
 @@ -869,7 +885,6 @@
  		close(sockfd);
  		return connfd;