Skip to contentSkip to conversation

opensm/osm_trap_rcv.c: More minor reorg of trap_rcv_process_request

PATCH In review Hal Rosenstock 3 participants 3 messages Nov 2, 2009 – Nov 3, 2009 1 message not in the archive InfiniBand

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 opensm/osm_trap_rcv.c: More minor reorg of trap_rcv_process_request

Move some code out into separate handle_babbling_port routine for readability/maintainability

---

opensm/opensm/osm_trap_rcv.c +60 -62
index 5790461..1621fbc 100644
@@ -312,6 +312,61 @@ static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci,
 			cl_ntoh16(source_lid), cl_ntoh64(trans_id));
 }
 
+static int handle_babbling_port(osm_sm_t *sm, ib_mad_notice_attr_t *p_ntci,
+				uint32_t num_received,
+				boolean_t physp_change_trap,
+				osm_physp_t **pp_physp,
+				boolean_t *run_heavy_sweep,
+				uint64_t *event_wheel_timeout)
+{
+	if (print_num_received(num_received))
+		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3804: "
+			"Received trap %u times consecutively\n",
+			num_received);
+	/* If the trap provides info about a bad port, mark it as unhealthy. */
+	if (physp_change_trap == TRUE) {
+		/* get the port */
+		*pp_physp = get_physp_by_lid_and_num(sm,
+						     cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+						     p_ntci->data_details.ntc_129_131.port_num);
+
+		if (!*pp_physp)
+			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3805: "
+				"Failed to find physical port by lid:%u num:%u\n",
+				cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+				p_ntci->data_details.ntc_129_131.port_num);
+		else {
+			/* When babbling port policy option is enabled and
+			   Threshold for disabling a "babbling" port is exceeded */
+			if (sm->p_subn->opt.babbling_port_policy &&
+			    num_received >= 250 &&
+			    disable_port(sm, *pp_physp) == 0)
+				return 1;
+
+			OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
+				"Marking unhealthy physical port by lid:%u num:%u\n",
+				cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+				p_ntci->data_details.ntc_129_131.port_num);
+			/* check if the current state of the p_physp is healthy. If
+			   it is - then this is a first change of state. Run a heavy sweep.
+			   if it is not - no need to mark it again - just restart the timer. */
+			if (osm_physp_is_healthy(*pp_physp)) {
+				osm_physp_set_health(*pp_physp, FALSE);
+				/* Make sure we sweep again - force a heavy sweep. */
+				/* The sweep should be done only after the re-registration, or
+				   else we'll be losing track of the timer. */
+				*run_heavy_sweep = TRUE;
+			}
+			/* If we are marking the port as unhealthy - we want to
+			   keep this for a longer period of time than the
+			   OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT. Use the
+			   OSM_DEFAULT_UNHEALTHY_TIMEOUT */
+			*event_wheel_timeout = OSM_DEFAULT_UNHEALTHY_TIMEOUT;
+		}
+	}
+	return 0;
+}
+
 /**********************************************************************
  **********************************************************************/
 static void
@@ -454,68 +509,11 @@ trap_rcv_process_request(IN osm_sm_t * sm, IN const osm_madw_t * const p_madw)
 					    trap_key);
 
 		/* Now we know how many times it provided this trap */
-		if (num_received > 10) {
-			if (print_num_received(num_received))
-				OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3804: "
-					"Received trap %u times consecutively\n",
-					num_received);
-			/*
-			 * If the trap provides info about a bad port
-			 * we mark it as unhealthy.
-			 */
-			if (physp_change_trap == TRUE) {
-				/* get the port */
-				p_physp = get_physp_by_lid_and_num(sm,
-								   cl_ntoh16
-								   (p_ntci->
-								    data_details.
-								    ntc_129_131.
-								    lid),
-								   port_num);
-
-				if (!p_physp)
-					OSM_LOG(sm->p_log, OSM_LOG_ERROR,
-						"ERR 3805: "
-						"Failed to find physical port by lid:%u num:%u\n",
-						cl_ntoh16(p_ntci->data_details.
-							  ntc_129_131.lid),
-						p_ntci->data_details.
-						ntc_129_131.port_num);
-				else {
-					/* When babbling port policy option is enabled and
-					   Threshold for disabling a "babbling" port is exceeded */
-					if (sm->p_subn->opt.
-					    babbling_port_policy
-					    && num_received >= 250
-					    && disable_port(sm, p_physp) == 0)
-						goto Exit;
-
-					OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
-						"Marking unhealthy physical port by lid:%u num:%u\n",
-						cl_ntoh16(p_ntci->data_details.
-							  ntc_129_131.lid),
-						p_ntci->data_details.
-						ntc_129_131.port_num);
-					/* check if the current state of the p_physp is healthy. If
-					   it is - then this is a first change of state. Run a heavy sweep.
-					   if it is not - no need to mark it again - just restart the timer. */
-					if (osm_physp_is_healthy(p_physp)) {
-						osm_physp_set_health(p_physp,
-								     FALSE);
-						/* Make sure we sweep again - force a heavy sweep. */
-						/* The sweep should be done only after the re-registration, or
-						   else we'll be losing track of the timer. */
-						run_heavy_sweep = TRUE;
-					}
-					/* If we are marking the port as unhealthy - we want to
-					   keep this for a longer period of time than the
-					   OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT. Use the
-					   OSM_DEFAULT_UNHEALTHY_TIMEOUT */
-					event_wheel_timeout =
-					    OSM_DEFAULT_UNHEALTHY_TIMEOUT;
-				}
-			}
-		}
+		if (num_received > 10 &&
+		    handle_babbling_port(sm, p_ntci, num_received,
+					 physp_change_trap, &p_physp,
+					 &run_heavy_sweep, &event_wheel_timeout))
+			goto Exit; 
 
 		/* restart the aging anyway */
 		/* If physp_change_trap is TRUE - then use a callback to unset

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw
Quoted 58 lines · Hal Rosenstock

Move some code out into separate handle_babbling_port routine for readability/maintainability

---

opensm/opensm/osm_trap_rcv.c +44 -0
index 5790461..1621fbc 100644
@@ -312,6 +312,61 @@ static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci,
 			cl_ntoh16(source_lid), cl_ntoh64(trans_id));
 }
 
+static int handle_babbling_port(osm_sm_t *sm, ib_mad_notice_attr_t *p_ntci,
+				uint32_t num_received,
+				boolean_t physp_change_trap,
+				osm_physp_t **pp_physp,
+				boolean_t *run_heavy_sweep,
+				uint64_t *event_wheel_timeout)
+{
+	if (print_num_received(num_received))
+		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3804: "
+			"Received trap %u times consecutively\n",
+			num_received);
+	/* If the trap provides info about a bad port, mark it as unhealthy. */
+	if (physp_change_trap == TRUE) {
+		/* get the port */
+		*pp_physp = get_physp_by_lid_and_num(sm,
+						     cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+						     p_ntci->data_details.ntc_129_131.port_num);
+
+		if (!*pp_physp)
+			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3805: "
+				"Failed to find physical port by lid:%u num:%u\n",
+				cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+				p_ntci->data_details.ntc_129_131.port_num);
+		else {
+			/* When babbling port policy option is enabled and
+			   Threshold for disabling a "babbling" port is exceeded */
+			if (sm->p_subn->opt.babbling_port_policy &&
+			    num_received >= 250 &&
+			    disable_port(sm, *pp_physp) == 0)
+				return 1;
+
+			OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
+				"Marking unhealthy physical port by lid:%u num:%u\n",
+				cl_ntoh16(p_ntci->data_details.ntc_129_131.lid),
+				p_ntci->data_details.ntc_129_131.port_num);
+			/* check if the current state of the p_physp is healthy. If
+			   it is - then this is a first change of state. Run a heavy sweep.
+			   if it is not - no need to mark it again - just restart the timer. */
+			if (osm_physp_is_healthy(*pp_physp)) {
+				osm_physp_set_health(*pp_physp, FALSE);
+				/* Make sure we sweep again - force a heavy sweep. */
+				/* The sweep should be done only after the re-registration, or
+				   else we'll be losing track of the timer. */
+				*run_heavy_sweep = TRUE;

opensm/opensm/osm_trap_rcv.c static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci, · line 368

Quoted 10 lines
opensm/opensm/osm_trap_rcv.c +10 -0
+			}
+			/* If we are marking the port as unhealthy - we want to
+			   keep this for a longer period of time than the
+			   OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT. Use the
+			   OSM_DEFAULT_UNHEALTHY_TIMEOUT */
+			*event_wheel_timeout = OSM_DEFAULT_UNHEALTHY_TIMEOUT;
+	}
+	return 0;
+}
+

It looks that you are moving the code as it is to a separate function where many flow switchers (run_heavy_sweep, event_wheel_timeout, pp_physp) are magically modified.

What about something like below instead?

Sasha

Quoted 1 line

From 5ed9114a32f9536123af4bd135c7cc603d340f92 Mon Sep 17 00:00:00 2001

From: Sasha Khapyorsky <sashak-smomgflXvOZWk0Htik3J/[email protected]>
Date: Tue, 3 Nov 2009 03:46:54 +0200
Subject: [PATCH] opensm/osm_trap_rcv.c: some consolidation

Consolidate noisy port handling code in shutup_noisy_port() function. As before it will try to disable port or to mark it unhealthy.

---
 opensm/opensm/osm_trap_rcv.c |  113 ++++++++++++++++++++----------------------
 1 files changed, 53 insertions(+), 60 deletions(-)
opensm/opensm/osm_trap_rcv.c +53 -60
index 0ee4e77..dae892e 100644
@@ -226,7 +226,6 @@ static int disable_port(osm_sm_t *sm, osm_physp_t *p)
 	uint8_t payload[IB_SMP_DATA_SIZE];
 	osm_madw_context_t context;
 	ib_port_info_t *pi = (ib_port_info_t *)payload;
-	int ret;
 
 	/* select the nearest port to master opensm */
 	if (p->p_remote_physp &&
@@ -236,10 +235,6 @@ static int disable_port(osm_sm_t *sm, osm_physp_t *p)
 	/* If trap 131, might want to disable peer port if available */
 	/* but peer port has been observed not to respond to SM requests */
 
-	OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3810: "
-		"Disabling physical port 0x%016" PRIx64 " num:%u\n",
-		cl_ntoh64(osm_physp_get_port_guid(p)), p->port_num);
-
 	memcpy(payload, &p->port_info, sizeof(ib_port_info_t));
 
 	/* Set port to disabled/down */
@@ -253,15 +248,10 @@ static int disable_port(osm_sm_t *sm, osm_physp_t *p)
 	context.pi_context.light_sweep = FALSE;
 	context.pi_context.active_transition = FALSE;
 
-	ret = osm_req_set(sm, osm_physp_get_dr_path_ptr(p),
-			  payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
-			  cl_hton32(osm_physp_get_port_num(p)),
-			  CL_DISP_MSGID_NONE, &context);
-	if (ret)
-		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3811: "
-			"Request to set PortInfo failed\n");
-
-	return ret;
+	return osm_req_set(sm, osm_physp_get_dr_path_ptr(p),
+			   payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
+			   cl_hton32(osm_physp_get_port_num(p)),
+			   CL_DISP_MSGID_NONE, &context);
 }
 
 static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci,
@@ -301,6 +291,42 @@ static void log_trap_info(osm_log_t *p_log, ib_mad_notice_attr_t *p_ntci,
 			cl_ntoh16(source_lid), cl_ntoh64(trans_id));
 }
 
+static int shutup_noisy_port(osm_sm_t *sm, uint16_t lid, uint8_t port,
+			     unsigned num)
+{
+	osm_physp_t *p = get_physp_by_lid_and_num(sm, lid, port);
+	if (!p) {
+		OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3805: "
+			"Failed to find physical port by lid:%u num:%u\n",
+			lid, port);
+		return -1;
+	}
+
+	/* When babbling port policy option is enabled and
+	   Threshold for disabling a "babbling" port is exceeded */
+	if (sm->p_subn->opt.babbling_port_policy && num >= 250) {
+		OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
+			"Disabling noisy physical port 0x%016" PRIx64
+			": lid %u, num %u\n",
+			cl_ntoh64(osm_physp_get_port_guid(p)), lid, port);
+		if (disable_port(sm, p))
+			OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3811: "
+				"Failed to disable.\n");
+		else
+			return 1;
+	}
+
+	/* check if the current state of the p_physp is healthy. If
+	   it is - then this is a first change of state. Run a heavy sweep. */
+	if (osm_physp_is_healthy(p)) {
+		OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
+			"Marking unhealthy physical port by lid:%u num:%u\n",
+			lid, port);
+		osm_physp_set_health(p, FALSE);
+		return 2;
+	}
+	return 0;
+}
 /**********************************************************************
  **********************************************************************/
 static void trap_rcv_process_request(IN osm_sm_t * sm,
@@ -438,7 +464,7 @@ static void trap_rcv_process_request(IN osm_sm_t * sm,
 		/* Now we know how many times it provided this trap */
 		if (num_received > 10) {
 			if (print_num_received(num_received))
-				OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3804: "
+				OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
 					"Received trap %u times consecutively\n",
 					num_received);
 			/*
@@ -446,49 +472,17 @@ static void trap_rcv_process_request(IN osm_sm_t * sm,
 			 * we mark it as unhealthy.
 			 */
 			if (physp_change_trap == TRUE) {
-				/* get the port */
-				p_physp = get_physp_by_lid_and_num(sm,
-								   cl_ntoh16
-								   (source_lid),
-								   port_num);
-
-				if (!p_physp)
-					OSM_LOG(sm->p_log, OSM_LOG_ERROR,
-						"ERR 3805: "
-						"Failed to find physical port by lid:%u num:%u\n",
-						cl_ntoh16(source_lid),
-						port_num);
-				else {
-					/* When babbling port policy option is enabled and
-					   Threshold for disabling a "babbling" port is exceeded */
-					if (sm->p_subn->opt.
-					    babbling_port_policy
-					    && num_received >= 250
-					    && disable_port(sm, p_physp) == 0)
-						goto Exit;
-
-					OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
-						"Marking unhealthy physical port by lid:%u num:%u\n",
-						cl_ntoh16(source_lid),
-						port_num);
-					/* check if the current state of the p_physp is healthy. If
-					   it is - then this is a first change of state. Run a heavy sweep.
-					   if it is not - no need to mark it again - just restart the timer. */
-					if (osm_physp_is_healthy(p_physp)) {
-						osm_physp_set_health(p_physp,
-								     FALSE);
-						/* Make sure we sweep again - force a heavy sweep. */
-						/* The sweep should be done only after the re-registration, or
-						   else we'll be losing track of the timer. */
-						run_heavy_sweep = TRUE;
-					}
-					/* If we are marking the port as unhealthy - we want to
-					   keep this for a longer period of time than the
-					   OSM_DEFAULT_TRAP_SUPRESSION_TIMEOUT. Use the
-					   OSM_DEFAULT_UNHEALTHY_TIMEOUT */
-					event_wheel_timeout =
-					    OSM_DEFAULT_UNHEALTHY_TIMEOUT;
-				}
+				int ret = shutup_noisy_port(sm,
+							    cl_ntoh16(source_lid),
+							    port_num,
+							    num_received);
+				if (ret == 1) /* port disabled */
+					goto Exit;
+				else if (ret == 2) /* unhealthy - run sweep */
+					run_heavy_sweep = TRUE;
+				/* in any case increase timeout interval */
+				event_wheel_timeout =
+				    OSM_DEFAULT_UNHEALTHY_TIMEOUT;
 			}
 		}
 
@@ -508,8 +502,7 @@ static void trap_rcv_process_request(IN osm_sm_t * sm,
 		if (num_received > 10 && run_heavy_sweep == FALSE) {
 			if (print_num_received(num_received))
 				OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
-					"Continuously received this trap %u times. Ignoring\n",
-					num_received);
+					"Ignoring noisy traps.\n");
 			goto Exit;
 		}
 	}
Signature · 6 lines
1.6.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#3 lore raw

T24gTW9uLCBOb3YgMiwgMjAwOSBhdCA5OjAwIFBNLCBTYXNoYSBLaGFweW9yc2t5IDxzYXNoYWtA dm9sdGFpcmUuY29tPiB3cm90ZToKPiBPbiAwNjo1MCBNb24gMDIgTm92IMKgIMKgICwgSGFsIFJv c2Vuc3RvY2sgd3JvdGU6Cj4+Cj4+IE1vdmUgc29tZSBjb2RlIG91dCBpbnRvIHNlcGFyYXRlIGhh bmRsZV9iYWJibGluZ19wb3J0IHJvdXRpbmUKPj4gZm9yIHJlYWRhYmlsaXR5L21haW50YWluYWJp bGl0eQo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIYWwgUm9zZW5zdG9jayA8aGFsLnJvc2Vuc3RvY2tA Z21haWwuY29tPgo+PiAtLS0KPj4gZGlmZiAtLWdpdCBhL29wZW5zbS9vcGVuc20vb3NtX3RyYXBf cmN2LmMgYi9vcGVuc20vb3BlbnNtL29zbV90cmFwX3Jjdi5jCj4+IGluZGV4IDU3OTA0NjEuLjE2 MjFmYmMgMTAwNjQ0Cj4+IC0tLSBhL29wZW5zbS9vcGVuc20vb3NtX3RyYXBfcmN2LmMKPj4gKysr IGIvb3BlbnNtL29wZW5zbS9vc21fdHJhcF9yY3YuYwo+PiBAQCAtMzEyLDYgKzMxMiw2MSBAQCBz dGF0aWMgdm9pZCBsb2dfdHJhcF9pbmZvKG9zbV9sb2dfdCAqcF9sb2csIGliX21hZF9ub3RpY2Vf YXR0cl90ICpwX250Y2ksCj4+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNsX250 b2gxNihzb3VyY2VfbGlkKSwgY2xfbnRvaDY0KHRyYW5zX2lkKSk7Cj4+IMKgfQo+Pgo+PiArc3Rh dGljIGludCBoYW5kbGVfYmFiYmxpbmdfcG9ydChvc21fc21fdCAqc20sIGliX21hZF9ub3RpY2Vf YXR0cl90ICpwX250Y2ksCj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdWludDMyX3QgbnVtX3JlY2VpdmVkLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGJvb2xlYW5fdCBwaHlzcF9jaGFuZ2VfdHJhcCwKPj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBvc21fcGh5c3BfdCAqKnBwX3Bo eXNwLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJvb2xl YW5fdCAqcnVuX2hlYXZ5X3N3ZWVwLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHVpbnQ2NF90ICpldmVudF93aGVlbF90aW1lb3V0KQo+PiArewo+PiArIMKg IMKgIGlmIChwcmludF9udW1fcmVjZWl2ZWQobnVtX3JlY2VpdmVkKSkKPj4gKyDCoCDCoCDCoCDC oCDCoCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19FUlJPUiwgIkVSUiAzODA0OiAiCj4+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIlJlY2VpdmVkIHRyYXAgJXUgdGltZXMg Y29uc2VjdXRpdmVseVxuIiwKPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBudW1f cmVjZWl2ZWQpOwo+PiArIMKgIMKgIC8qIElmIHRoZSB0cmFwIHByb3ZpZGVzIGluZm8gYWJvdXQg YSBiYWQgcG9ydCwgbWFyayBpdCBhcyB1bmhlYWx0aHkuICovCj4+ICsgwqAgwqAgaWYgKHBoeXNw X2NoYW5nZV90cmFwID09IFRSVUUpIHsKPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCAvKiBnZXQgdGhl IHBvcnQgKi8KPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCAqcHBfcGh5c3AgPSBnZXRfcGh5c3BfYnlf bGlkX2FuZF9udW0oc20sCj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjbF9udG9oMTYocF9udGNpLT5k YXRhX2RldGFpbHMubnRjXzEyOV8xMzEubGlkKSwKPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfbnRj aS0+ZGF0YV9kZXRhaWxzLm50Y18xMjlfMTMxLnBvcnRfbnVtKTsKPj4gKwo+PiArIMKgIMKgIMKg IMKgIMKgIMKgIGlmICghKnBwX3BoeXNwKQo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIE9TTV9MT0coc20tPnBfbG9nLCBPU01fTE9HX0VSUk9SLCAiRVJSIDM4MDU6ICIKPj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiRmFpbGVkIHRvIGZpbmQg cGh5c2ljYWwgcG9ydCBieSBsaWQ6JXUgbnVtOiV1XG4iLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNsX250b2gxNihwX250Y2ktPmRhdGFfZGV0YWlscy5u dGNfMTI5XzEzMS5saWQpLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHBfbnRjaS0+ZGF0YV9kZXRhaWxzLm50Y18xMjlfMTMxLnBvcnRfbnVtKTsKPj4gKyDC oCDCoCDCoCDCoCDCoCDCoCBlbHNlIHsKPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCAvKiBXaGVuIGJhYmJsaW5nIHBvcnQgcG9saWN5IG9wdGlvbiBpcyBlbmFibGVkIGFuZAo+PiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhyZXNob2xkIGZvciBkaXNhYmxp bmcgYSAiYmFiYmxpbmciIHBvcnQgaXMgZXhjZWVkZWQgKi8KPj4gKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBpZiAoc20tPnBfc3Vibi0+b3B0LmJhYmJsaW5nX3BvcnRfcG9saWN5ICYm Cj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbnVtX3JlY2VpdmVkID49 IDI1MCAmJgo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRpc2FibGVf cG9ydChzbSwgKnBwX3BoeXNwKSA9PSAwKQo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHJldHVybiAxOwo+PiArCj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgT1NNX0xPRyhzbS0+cF9sb2csIE9TTV9MT0dfVkVSQk9TRSwKPj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiTWFya2luZyB1bmhlYWx0aHkgcGh5 c2ljYWwgcG9ydCBieSBsaWQ6JXUgbnVtOiV1XG4iLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNsX250b2gxNihwX250Y2ktPmRhdGFfZGV0YWlscy5udGNf MTI5XzEzMS5saWQpLAo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHBfbnRjaS0+ZGF0YV9kZXRhaWxzLm50Y18xMjlfMTMxLnBvcnRfbnVtKTsKPj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBjaGVjayBpZiB0aGUgY3VycmVudCBzdGF0ZSBv ZiB0aGUgcF9waHlzcCBpcyBoZWFsdGh5LiBJZgo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaXQgaXMgLSB0aGVuIHRoaXMgaXMgYSBmaXJzdCBjaGFuZ2Ugb2Ygc3RhdGUu IFJ1biBhIGhlYXZ5IHN3ZWVwLgo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgaWYgaXQgaXMgbm90IC0gbm8gbmVlZCB0byBtYXJrIGl0IGFnYWluIC0ganVzdCByZXN0YXJ0 IHRoZSB0aW1lci4gKi8KPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAob3Nt X3BoeXNwX2lzX2hlYWx0aHkoKnBwX3BoeXNwKSkgewo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9zbV9waHlzcF9zZXRfaGVhbHRoKCpwcF9waHlzcCwgRkFM U0UpOwo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIE1h a2Ugc3VyZSB3ZSBzd2VlcCBhZ2FpbiAtIGZvcmNlIGEgaGVhdnkgc3dlZXAuICovCj4+ICsgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogVGhlIHN3ZWVwIHNob3Vs ZCBiZSBkb25lIG9ubHkgYWZ0ZXIgdGhlIHJlLXJlZ2lzdHJhdGlvbiwgb3IKPj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVsc2Ugd2UnbGwgYmUgbG9z aW5nIHRyYWNrIG9mIHRoZSB0aW1lci4gKi8KPj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAqcnVuX2hlYXZ5X3N3ZWVwID0gVFJVRTsKPj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg LyogSWYgd2UgYXJlIG1hcmtpbmcgdGhlIHBvcnQgYXMgdW5oZWFsdGh5IC0gd2Ugd2FudCB0bwo+ PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKga2VlcCB0aGlzIGZvciBhIGxv bmdlciBwZXJpb2Qgb2YgdGltZSB0aGFuIHRoZQo+PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgT1NNX0RFRkFVTFRfVFJBUF9TVVBSRVNTSU9OX1RJTUVPVVQuIFVzZSB0aGUK Pj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoE9TTV9ERUZBVUxUX1VOSEVB TFRIWV9USU1FT1VUICovCj4+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKmV2ZW50 X3doZWVsX3RpbWVvdXQgPSBPU01fREVGQVVMVF9VTkhFQUxUSFlfVElNRU9VVDsKPj4gKyDCoCDC oCB9Cj4+ICsgwqAgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPgo+IEl0IGxvb2tzIHRoYXQgeW91 IGFyZSBtb3ZpbmcgdGhlIGNvZGUgYXMgaXQgaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbgo+IHdo ZXJlIG1hbnkgZmxvdyBzd2l0Y2hlcnMgKHJ1bl9oZWF2eV9zd2VlcCwgZXZlbnRfd2hlZWxfdGlt ZW91dCwKPiBwcF9waHlzcCkgYXJlIG1hZ2ljYWxseSBtb2RpZmllZC4KPgo+IFdoYXQgYWJvdXQg c29tZXRoaW5nIGxpa2UgYmVsb3cgaW5zdGVhZD8KClJldmlld2VkLWJ5OiBIYWwgUm9zZW5zdG9j ayA8aGFsLnJvc2Vuc3RvY2tAZ21haWwuY29tPgoKPgo+IFNhc2hhCj4KPgo+ID5Gcm9tIDVlZDkx MTRhMzJmOTUzNjEyM2FmNGJkMTM1YzdjYzYwM2QzNDBmOTIgTW9uIFNlcCAxNyAwMDowMDowMCAy MDAxCj4gRnJvbTogU2FzaGEgS2hhcHlvcnNreSA8c2FzaGFrQHZvbHRhaXJlLmNvbT4KPiBEYXRl OiBUdWUsIDMgTm92IDIwMDkgMDM6NDY6NTQgKzAyMDAKPiBTdWJqZWN0OiBbUEFUQ0hdIG9wZW5z bS9vc21fdHJhcF9yY3YuYzogc29tZSBjb25zb2xpZGF0aW9uCj4KPiBDb25zb2xpZGF0ZSBub2lz eSBwb3J0IGhhbmRsaW5nIGNvZGUgaW4gc2h1dHVwX25vaXN5X3BvcnQoKSBmdW5jdGlvbi4KPiBB cyBiZWZvcmUgaXQgd2lsbCB0cnkgdG8gZGlzYWJsZSBwb3J0IG9yIHRvIG1hcmsgaXQgdW5oZWFs dGh5Lgo+Cj4gU2lnbmVkLW9mZi1ieTogU2FzaGEgS2hhcHlvcnNreSA8c2FzaGFrQHZvbHRhaXJl LmNvbT4KPiAtLS0KPiDCoG9wZW5zbS9vcGVuc20vb3NtX3RyYXBfcmN2LmMgfCDCoDExMyArKysr KysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiDCoDEgZmlsZXMgY2hhbmdl ZCwgNTMgaW5zZXJ0aW9ucygrKSwgNjAgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvb3Bl bnNtL29wZW5zbS9vc21fdHJhcF9yY3YuYyBiL29wZW5zbS9vcGVuc20vb3NtX3RyYXBfcmN2LmMK PiBpbmRleCAwZWU0ZTc3Li5kYWU4OTJlIDEwMDY0NAo+IC0tLSBhL29wZW5zbS9vcGVuc20vb3Nt X3RyYXBfcmN2LmMKPiArKysgYi9vcGVuc20vb3BlbnNtL29zbV90cmFwX3Jjdi5jCj4gQEAgLTIy Niw3ICsyMjYsNiBAQCBzdGF0aWMgaW50IGRpc2FibGVfcG9ydChvc21fc21fdCAqc20sIG9zbV9w aHlzcF90ICpwKQo+IMKgIMKgIMKgIMKgdWludDhfdCBwYXlsb2FkW0lCX1NNUF9EQVRBX1NJWkVd Owo+IMKgIMKgIMKgIMKgb3NtX21hZHdfY29udGV4dF90IGNvbnRleHQ7Cj4gwqAgwqAgwqAgwqBp Yl9wb3J0X2luZm9fdCAqcGkgPSAoaWJfcG9ydF9pbmZvX3QgKilwYXlsb2FkOwo+IC0gwqAgwqAg wqAgaW50IHJldDsKPgo+IMKgIMKgIMKgIMKgLyogc2VsZWN0IHRoZSBuZWFyZXN0IHBvcnQgdG8g bWFzdGVyIG9wZW5zbSAqLwo+IMKgIMKgIMKgIMKgaWYgKHAtPnBfcmVtb3RlX3BoeXNwICYmCj4g QEAgLTIzNiwxMCArMjM1LDYgQEAgc3RhdGljIGludCBkaXNhYmxlX3BvcnQob3NtX3NtX3QgKnNt LCBvc21fcGh5c3BfdCAqcCkKPiDCoCDCoCDCoCDCoC8qIElmIHRyYXAgMTMxLCBtaWdodCB3YW50 IHRvIGRpc2FibGUgcGVlciBwb3J0IGlmIGF2YWlsYWJsZSAqLwo+IMKgIMKgIMKgIMKgLyogYnV0 IHBlZXIgcG9ydCBoYXMgYmVlbiBvYnNlcnZlZCBub3QgdG8gcmVzcG9uZCB0byBTTSByZXF1ZXN0 cyAqLwo+Cj4gLSDCoCDCoCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19FUlJPUiwgIkVS UiAzODEwOiAiCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiRGlzYWJsaW5nIHBoeXNpY2FsIHBv cnQgMHglMDE2IiBQUkl4NjQgIiBudW06JXVcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCBj bF9udG9oNjQob3NtX3BoeXNwX2dldF9wb3J0X2d1aWQocCkpLCBwLT5wb3J0X251bSk7Cj4gLQo+ IMKgIMKgIMKgIMKgbWVtY3B5KHBheWxvYWQsICZwLT5wb3J0X2luZm8sIHNpemVvZihpYl9wb3J0 X2luZm9fdCkpOwo+Cj4gwqAgwqAgwqAgwqAvKiBTZXQgcG9ydCB0byBkaXNhYmxlZC9kb3duICov Cj4gQEAgLTI1MywxNSArMjQ4LDEwIEBAIHN0YXRpYyBpbnQgZGlzYWJsZV9wb3J0KG9zbV9zbV90 ICpzbSwgb3NtX3BoeXNwX3QgKnApCj4gwqAgwqAgwqAgwqBjb250ZXh0LnBpX2NvbnRleHQubGln aHRfc3dlZXAgPSBGQUxTRTsKPiDCoCDCoCDCoCDCoGNvbnRleHQucGlfY29udGV4dC5hY3RpdmVf dHJhbnNpdGlvbiA9IEZBTFNFOwo+Cj4gLSDCoCDCoCDCoCByZXQgPSBvc21fcmVxX3NldChzbSwg b3NtX3BoeXNwX2dldF9kcl9wYXRoX3B0cihwKSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHBheWxvYWQsIHNpemVvZihwYXlsb2FkKSwgSUJfTUFEX0FUVFJfUE9SVF9J TkZPLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY2xfaHRvbjMyKG9z bV9waHlzcF9nZXRfcG9ydF9udW0ocCkpLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgQ0xfRElTUF9NU0dJRF9OT05FLCAmY29udGV4dCk7Cj4gLSDCoCDCoCDCoCBpZiAo cmV0KQo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgT1NNX0xPRyhzbS0+cF9sb2csIE9TTV9MT0df RVJST1IsICJFUlIgMzgxMTogIgo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg IlJlcXVlc3QgdG8gc2V0IFBvcnRJbmZvIGZhaWxlZFxuIik7Cj4gLQo+IC0gwqAgwqAgwqAgcmV0 dXJuIHJldDsKPiArIMKgIMKgIMKgIHJldHVybiBvc21fcmVxX3NldChzbSwgb3NtX3BoeXNwX2dl dF9kcl9wYXRoX3B0cihwKSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcGF5bG9hZCwgc2l6ZW9mKHBheWxvYWQpLCBJQl9NQURfQVRUUl9QT1JUX0lORk8sCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNsX2h0b24zMihvc21fcGh5c3Bf Z2V0X3BvcnRfbnVtKHApKSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgQ0xfRElTUF9NU0dJRF9OT05FLCAmY29udGV4dCk7Cj4gwqB9Cj4KPiDCoHN0YXRpYyB2b2lk IGxvZ190cmFwX2luZm8ob3NtX2xvZ190ICpwX2xvZywgaWJfbWFkX25vdGljZV9hdHRyX3QgKnBf bnRjaSwKPiBAQCAtMzAxLDYgKzI5MSw0MiBAQCBzdGF0aWMgdm9pZCBsb2dfdHJhcF9pbmZvKG9z bV9sb2dfdCAqcF9sb2csIGliX21hZF9ub3RpY2VfYXR0cl90ICpwX250Y2ksCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjbF9udG9oMTYoc291cmNlX2xpZCksIGNsX250b2g2 NCh0cmFuc19pZCkpOwo+IMKgfQo+Cj4gK3N0YXRpYyBpbnQgc2h1dHVwX25vaXN5X3BvcnQob3Nt X3NtX3QgKnNtLCB1aW50MTZfdCBsaWQsIHVpbnQ4X3QgcG9ydCwKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdW5zaWduZWQgbnVtKQo+ICt7Cj4gKyDCoCDCoCDC oCBvc21fcGh5c3BfdCAqcCA9IGdldF9waHlzcF9ieV9saWRfYW5kX251bShzbSwgbGlkLCBwb3J0 KTsKPiArIMKgIMKgIMKgIGlmICghcCkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgT1NNX0xP RyhzbS0+cF9sb2csIE9TTV9MT0dfRVJST1IsICJFUlIgMzgwNTogIgo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgIkZhaWxlZCB0byBmaW5kIHBoeXNpY2FsIHBvcnQgYnkgbGlk OiV1IG51bToldVxuIiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxpZCwg cG9ydCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gLTE7Cj4gKyDCoCDCoCDCoCB9 Cj4gKwo+ICsgwqAgwqAgwqAgLyogV2hlbiBiYWJibGluZyBwb3J0IHBvbGljeSBvcHRpb24gaXMg ZW5hYmxlZCBhbmQKPiArIMKgIMKgIMKgIMKgIMKgVGhyZXNob2xkIGZvciBkaXNhYmxpbmcgYSAi YmFiYmxpbmciIHBvcnQgaXMgZXhjZWVkZWQgKi8KPiArIMKgIMKgIMKgIGlmIChzbS0+cF9zdWJu LT5vcHQuYmFiYmxpbmdfcG9ydF9wb2xpY3kgJiYgbnVtID49IDI1MCkgewo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgT1NNX0xPRyhzbS0+cF9sb2csIE9TTV9MT0dfVkVSQk9TRSwKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJEaXNhYmxpbmcgbm9pc3kgcGh5c2ljYWwgcG9y dCAweCUwMTYiIFBSSXg2NAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIjog bGlkICV1LCBudW0gJXVcbiIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBj bF9udG9oNjQob3NtX3BoeXNwX2dldF9wb3J0X2d1aWQocCkpLCBsaWQsIHBvcnQpOwo+ICsgwqAg wqAgwqAgwqAgwqAgwqAgwqAgaWYgKGRpc2FibGVfcG9ydChzbSwgcCkpCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19FUlJPUiwg IkVSUiAzODExOiAiCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAiRmFpbGVkIHRvIGRpc2FibGUuXG4iKTsKCk1pZ2h0IHdhbnQgdG8gaW5jbHVkZSBwb3J0 IGluZm9ybWF0aW9uIGluIHRoaXMgbG9nIG1lc3NhZ2UuCgotLSBIYWwKCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCBlbHNlCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1 cm4gMTsKPiArIMKgIMKgIMKgIH0KPiArCj4gKyDCoCDCoCDCoCAvKiBjaGVjayBpZiB0aGUgY3Vy cmVudCBzdGF0ZSBvZiB0aGUgcF9waHlzcCBpcyBoZWFsdGh5LiBJZgo+ICsgwqAgwqAgwqAgwqAg wqBpdCBpcyAtIHRoZW4gdGhpcyBpcyBhIGZpcnN0IGNoYW5nZSBvZiBzdGF0ZS4gUnVuIGEgaGVh dnkgc3dlZXAuICovCj4gKyDCoCDCoCDCoCBpZiAob3NtX3BoeXNwX2lzX2hlYWx0aHkocCkpIHsK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE9TTV9MT0coc20tPnBfbG9nLCBPU01fTE9HX1ZFUkJP U0UsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiTWFya2luZyB1bmhlYWx0 aHkgcGh5c2ljYWwgcG9ydCBieSBsaWQ6JXUgbnVtOiV1XG4iLAo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgbGlkLCBwb3J0KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9z bV9waHlzcF9zZXRfaGVhbHRoKHAsIEZBTFNFKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJl dHVybiAyOwo+ICsgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgcmV0dXJuIDA7Cj4gK30KPiDCoC8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCj4gwqAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwo+IMKgc3RhdGljIHZvaWQgdHJhcF9yY3Zf cHJvY2Vzc19yZXF1ZXN0KElOIG9zbV9zbV90ICogc20sCj4gQEAgLTQzOCw3ICs0NjQsNyBAQCBz dGF0aWMgdm9pZCB0cmFwX3Jjdl9wcm9jZXNzX3JlcXVlc3QoSU4gb3NtX3NtX3QgKiBzbSwKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qIE5vdyB3ZSBrbm93IGhvdyBtYW55IHRpbWVzIGl0IHBy b3ZpZGVkIHRoaXMgdHJhcCAqLwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG51bV9yZWNl aXZlZCA+IDEwKSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocHJp bnRfbnVtX3JlY2VpdmVkKG51bV9yZWNlaXZlZCkpCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19FUlJPUiwg IkVSUiAzODA0OiAiCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19WRVJCT1NFLAo+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIlJlY2VpdmVkIHRy YXAgJXUgdGltZXMgY29uc2VjdXRpdmVseVxuIiwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG51bV9yZWNlaXZlZCk7Cj4gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKgo+IEBAIC00NDYsNDkgKzQ3MiwxNyBAQCBz dGF0aWMgdm9pZCB0cmFwX3Jjdl9wcm9jZXNzX3JlcXVlc3QoSU4gb3NtX3NtX3QgKiBzbSwKPiDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIHdlIG1hcmsgaXQgYXMgdW5oZWFs dGh5Lgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICovCj4gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocGh5c3BfY2hhbmdlX3RyYXAgPT0gVFJVRSkg ewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogZ2V0 IHRoZSBwb3J0ICovCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBwX3BoeXNwID0gZ2V0X3BoeXNwX2J5X2xpZF9hbmRfbnVtKHNtLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjbF9udG9oMTYKPiAtIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHNvdXJjZV9saWQpLAo+IC0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwb3J0X251bSk7Cj4gLQo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKCFwX3BoeXNwKQo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg T1NNX0xPRyhzbS0+cF9sb2csIE9TTV9MT0dfRVJST1IsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiRVJSIDM4 MDU6ICIKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICJGYWlsZWQgdG8gZmluZCBwaHlzaWNhbCBwb3J0IGJ5IGxp ZDoldSBudW06JXVcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjbF9udG9oMTYoc291cmNlX2xpZCksCj4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwb3J0X251bSk7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBlbHNlIHsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIFdoZW4gYmFiYmxpbmcgcG9ydCBwb2xpY3kg b3B0aW9uIGlzIGVuYWJsZWQgYW5kCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRocmVzaG9sZCBmb3IgZGlzYWJsaW5nIGEg ImJhYmJsaW5nIiBwb3J0IGlzIGV4Y2VlZGVkICovCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoc20tPnBfc3Vibi0+b3B0Lgo+ IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgYmFiYmxpbmdfcG9ydF9wb2xpY3kKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICYmIG51bV9yZWNlaXZlZCA+ PSAyNTAKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgICYmIGRpc2FibGVfcG9ydChzbSwgcF9waHlzcCkgPT0gMCkKPiAtIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGdvdG8gRXhpdDsKPiAtCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBPU01fTE9HKHNtLT5wX2xvZywgT1NNX0xPR19W RVJCT1NFLAo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIk1hcmtpbmcgdW5oZWFsdGh5IHBoeXNpY2FsIHBvcnQg YnkgbGlkOiV1IG51bToldVxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNsX250b2gxNihzb3VyY2VfbGlk KSwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHBvcnRfbnVtKTsKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIGNoZWNrIGlmIHRoZSBjdXJyZW50 IHN0YXRlIG9mIHRoZSBwX3BoeXNwIGlzIGhlYWx0aHkuIElmCj4gLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGl0IGlzIC0gdGhl biB0aGlzIGlzIGEgZmlyc3QgY2hhbmdlIG9mIHN0YXRlLiBSdW4gYSBoZWF2eSBzd2VlcC4KPiAt IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgaXQgaXMgbm90IC0gbm8gbmVlZCB0byBtYXJrIGl0IGFnYWluIC0ganVzdCByZXN0 YXJ0IHRoZSB0aW1lci4gKi8KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChvc21fcGh5c3BfaXNfaGVhbHRoeShwX3BoeXNwKSkg ewo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgb3NtX3BoeXNwX3NldF9oZWFsdGgocF9waHlzcCwKPiAtIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRkFMU0UpOwo+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgLyogTWFrZSBzdXJlIHdlIHN3ZWVwIGFnYWluIC0gZm9yY2UgYSBoZWF2eSBzd2VlcC4g Ki8KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIC8qIFRoZSBzd2VlcCBzaG91bGQgYmUgZG9uZSBvbmx5IGFmdGVy IHRoZSByZS1yZWdpc3RyYXRpb24sIG9yCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVsc2Ugd2UnbGwg YmUgbG9zaW5nIHRyYWNrIG9mIHRoZSB0aW1lci4gKi8KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJ1bl9oZWF2 eV9zd2VlcCA9IFRSVUU7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBJZiB3ZSBhcmUgbWFya2luZyB0aGUgcG9ydCBh cyB1bmhlYWx0aHkgLSB3ZSB3YW50IHRvCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGtlZXAgdGhpcyBmb3IgYSBsb25nZXIg cGVyaW9kIG9mIHRpbWUgdGhhbiB0aGUKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgT1NNX0RFRkFVTFRfVFJBUF9TVVBSRVNT SU9OX1RJTUVPVVQuIFVzZSB0aGUKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgT1NNX0RFRkFVTFRfVU5IRUFMVEhZX1RJTUVP VVQgKi8KPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGV2ZW50X3doZWVsX3RpbWVvdXQgPQo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgT1NNX0RFRkFVTFRfVU5I RUFMVEhZX1RJTUVPVVQ7Cj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBpbnQgcmV0ID0gc2h1dHVwX25vaXN5X3BvcnQoc20sCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBjbF9udG9oMTYoc291cmNlX2xpZCksCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBwb3J0X251bSwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG51 bV9yZWNlaXZlZCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBpZiAocmV0ID09IDEpIC8qIHBvcnQgZGlzYWJsZWQgKi8KPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gRXhpdDsKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2UgaWYgKHJl dCA9PSAyKSAvKiB1bmhlYWx0aHkgLSBydW4gc3dlZXAgKi8KPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJ1bl9oZWF2eV9zd2VlcCA9 IFRSVUU7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAv KiBpbiBhbnkgY2FzZSBpbmNyZWFzZSB0aW1lb3V0IGludGVydmFsICovCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBldmVudF93aGVlbF90aW1lb3V0ID0K PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE9T TV9ERUZBVUxUX1VOSEVBTFRIWV9USU1FT1VUOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+Cj4gQEAgLTUwOCw4ICs1MDIs NyBAQCBzdGF0aWMgdm9pZCB0cmFwX3Jjdl9wcm9jZXNzX3JlcXVlc3QoSU4gb3NtX3NtX3QgKiBz bSwKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChudW1fcmVjZWl2ZWQgPiAxMCAmJiBydW5f aGVhdnlfc3dlZXAgPT0gRkFMU0UpIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChwcmludF9udW1fcmVjZWl2ZWQobnVtX3JlY2VpdmVkKSkKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoE9TTV9MT0coc20tPnBfbG9nLCBPU01f TE9HX1ZFUkJPU0UsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAiQ29udGludW91c2x5IHJlY2VpdmVkIHRoaXMgdHJhcCAldSB0aW1l cy4gSWdub3JpbmdcbiIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBudW1fcmVjZWl2ZWQpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIklnbm9yaW5nIG5vaXN5IHRy YXBzLlxuIik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIEV4aXQ7 Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAgwqAgwqAgwqB9Cj4gLS0KPiAxLjYuNS4x Cj4KPiAtLQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1 bnN1YnNjcmliZSBsaW51eC1yZG1hIiBpbgo+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpv cmRvbW9Admdlci5rZXJuZWwub3JnCj4gTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCDCoGh0dHA6Ly92 Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAo+Cg==
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html