opensm/osm_trap_rcv.c: More minor reorg of trap_rcv_process_request
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
@@ -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]
Quoted 58 lines · Hal Rosenstock
Move some code out into separate
handle_babbling_portroutine for readability/maintainabilitySigned-off-by Hal Rosenstock <[email protected]>---
opensm/opensm/osm_trap_rcv.c +44
-0@@ -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
5ed9114a32f9536123af4bd135c7cc603d340f92Mon 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
@@ -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
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