From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x231.google.com (mail-oi1-x231.google.com [IPv6:2607:f8b0:4864:20::231]) by sourceware.org (Postfix) with ESMTPS id 604273858D20 for ; Mon, 15 May 2023 17:57:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 604273858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-oi1-x231.google.com with SMTP id 5614622812f47-39415d35301so2724289b6e.1 for ; Mon, 15 May 2023 10:57:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1684173434; x=1686765434; h=in-reply-to:organization:from:references:to:content-language :subject:user-agent:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; bh=zatoc9Xqp+6VJMBDSrw2hIcQ6xofMAnrUQtCnDiDuyw=; b=iyr7fYoTbkRTCQHzAuiNnP+BWCvx3q5P9xyXEQUWii7g0/FZAqij9D39YioDMF347u PULbn9XkPsR6AKak0xPk2sd0a4TRzol5FXZ0buo/UtBpT1yuoG6OcKTNpXFK0ndjyPkf Q4Mm39c+PK7HHx2H85mcsb2nb8YIeUaWkvi2bGzkpvCMJ49EOgm3p64yX8pyp04MgoR9 HiFdPDNvVti6wJgRTS7rgJ7xQLTn1sqzw6G+vBv8IkcPV5s+6CPZZHxpM9UhRK6mzLmX hxTiqOaJtCKFBI4LnAWPp7cWbvVEzjp9eUCIFl1TeDJQhEhzZooTbzurT2I3YLQtyqmI +KTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684173434; x=1686765434; h=in-reply-to:organization:from:references:to:content-language :subject:user-agent:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=zatoc9Xqp+6VJMBDSrw2hIcQ6xofMAnrUQtCnDiDuyw=; b=ihOMI+5ySsNS7oEjvZpGqAGGDG307Hv0vJFw9Erd2DrdeqQmqg5ziMgISRqS9lpnSv JGzU3c6yDPfBfD618YKMxcl89AtNdhUoLn2zjXMHznMuK4QXFssTaf3fU2FVSk69R4Mn hf/40yP7I50Q1lBGtbhhFZc9cu2Z4PjBTqncowxtVNAZvcETr7KlQNqLNm21Tq/cRZd1 3BQcEkcNgdTNDHgaHBR+0X9V0a/e8DIz7b7jTEA4cKFk6zg6TPvUOAM83lIEwR1zUV7Z zXxXOuy0uiCbDdqgzrVPI0G19C54hc/AP/GPN8OjsMo+swaE7X/3eEB9FkdRJUQXeQwY Saig== X-Gm-Message-State: AC+VfDzprk/FJYoqhUSDxXh/zeTyAmljhe7k0Ud4rVY2KTFmSai0Yp/K Y5FF73eXsTQUQ/ZeH+KyvDvIrA== X-Google-Smtp-Source: ACHHUZ70d0X8+YqFh4IHk8rOBLQ6Zg/X7ANVjYjnppgcVpf6KzXbyfcrlt3P08SwudgrCbgQ/r1y+w== X-Received: by 2002:aca:a858:0:b0:395:df6e:a845 with SMTP id r85-20020acaa858000000b00395df6ea845mr4159954oie.4.1684173434689; Mon, 15 May 2023 10:57:14 -0700 (PDT) Received: from ?IPV6:2804:1b3:a7c0:7359:809b:29db:c429:1aa0? ([2804:1b3:a7c0:7359:809b:29db:c429:1aa0]) by smtp.gmail.com with ESMTPSA id b82-20020aca3455000000b003924c15cf58sm7850243oia.20.2023.05.15.10.57.12 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 15 May 2023 10:57:13 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------o4vyP2x6hk4bL4pZMLTky0X0" Message-ID: <4115d7fd-d7a7-cdb1-3833-daf45186480f@linaro.org> Date: Mon, 15 May 2023 14:57:11 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Subject: Re: [PATCH] nptl: Disable THP on thread stack if it incurs in large RSS usage Content-Language: en-US To: Wilco Dijkstra , "libc-alpha@sourceware.org" , Cupertino Miranda References: <20230420172436.2013698-1-adhemerval.zanella@linaro.org> From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: X-Spam-Status: No, score=-8.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------o4vyP2x6hk4bL4pZMLTky0X0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 03/05/23 09:42, Wilco Dijkstra wrote: > Hi Adhemerval, > >> +static __always_inline int >> +advise_thp (void *mem, size_t size, char *guard) >> +{ >> +  enum malloc_thp_mode_t thpmode = __malloc_thp_mode (); >> +  if (thpmode != malloc_thp_mode_always) >> +    return 0; >> + >> +  unsigned long int thpsize = __malloc_default_thp_pagesize (); >> +  if (PTR_ALIGN_DOWN (mem, thpsize) != PTR_ALIGN_DOWN (guard, thpsize)) >> +    return 0; >> + >> +  return __madvise (mem, size, MADV_NOHUGEPAGE); >> +} > > This still doesn't make sense since if _STACK_GROWS_DOWN, mem == guard, so > this will always execute the madvise. Yes, if THP is set to always this is exactly the idea of this patch since afaiu the kernel might still back up the stack with large pages if the request a size is smaller than the default THP. It is only an issue if the guard page address is not aligned to THP default size, which will potentially trigger issues Cupertino has brought (since we do not prior hand which is the mapping flags used on page used to fulfill the allocation). > As I mentioned, I couldn't find evidence that > the claimed scenario of a huge page allocated, written to and then split due to the > mprotect exists. I adapted Cupertino original test to allow specify both the thread stack and guard size by command line. Just: $ gcc -std=gnu11 -O2 -g -I. -D_LARGEFILE64_SOURCE=1 -D_GNU_SOURCE -c -o tststackalloc.o tststackalloc.c $ echo "always" | sudo tee /sys/kernel/mm/transparent_hugepage/enabled $ ./tststackalloc -m [...] [statm] RSS: 65964 pages (270188544 bytes = 257 MB) [smaps] RSS: 270327808 bytes = 257 MB [...] With either the new tunable or this patch: $ ld-linux-x86-64.so.2 --library-path . ./tststackalloc -m [...] [statm] RSS: 531 pages (2174976 bytes = 2 MB) [smaps] RSS: 3002368 bytes = 2 MB [...] > > So the real issue is that the current stack allocation code randomly (based on > alignment from previous mmap calls) uses huge pages even for small stacks. Keep in mind this heuristic is only enabled if THP is set to 'always', meaning the kernel will try to back *all* the stack with large pages. The issue is when the *guard* page is within a large page. --------------o4vyP2x6hk4bL4pZMLTky0X0 Content-Type: text/plain; charset=UTF-8; name="tststackalloc.c" Content-Disposition: attachment; filename="tststackalloc.c" Content-Transfer-Encoding: base64 Ly8gQ29tcGlsZSAmIHJ1bjoKLy8gICAgZ2NjIC1XYWxsIC1nIC1vIHRzdHN0YWNrYWxsb2Mg dHN0c3RhY2thbGxvYy5jICQ8IC1scHRocmVhZAovLyAgICAuL3RzdHN0YWNrYWxsb2MgMSAg ICAgIyBBdHRlbXB0IHRvIHVzZSBodWdlIHBhZ2VzIGZvciBzdGFja3MgLT4gUlNTIGJsb2F0 Ci8vICAgIC4vdHN0c3RhY2thbGxvYyAwICAgICAjIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBo dWdlIHBhZ2VzIC0+IE5vIFJTUyBibG9hdAoKI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1 ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNp bmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3Rk Lmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGludHR5cGVzLmg+CiNpbmNsdWRl IDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoj aW5jbHVkZSA8Y3R5cGUuaD4KCi8vIE51bWJlciBvZiB0aHJlYWRzIHRvIGNyZWF0ZQojZGVm aW5lIE5PT0ZfVEhSRUFEUyAoMTI4KQoKLy8gU2l6ZSBvZiBhIHNtYWxsIHBhZ2UgKGhhcmQt Y29kZWQpCiNkZWZpbmUgU01BTExfUEFHRV9TSVpFICg0KjEwMjQpCnN0YXRpYyBzaXplX3Qg c21hbGxfcGFnZV9zaXplID0gMDsKCi8vIFNpemUgb2YgYSBodWdlIHBhZ2UgKGhhcmQtY29k ZWQpCiNkZWZpbmUgSFVHRV9QQUdFX1NJWkUgKDIqMTAyNCoxMDI0KQpzdGF0aWMgc2l6ZV90 IGh1Z2VfcGFnZV9zaXplID0gMDsKCi8vIFRvdGFsIHNpemUgb2YgdGhlIHRocmVhZCBzdGFj aywgaW5jbHVkaW5nIHRoZSBndWFyZCBwYWdlKHMpCiNkZWZpbmUgU1RBQ0tfU0laRV9UT1RB TCAoSFVHRV9QQUdFX1NJWkUpCgovLyBTaXplIG9mIHRoZSBndWFyZCBwYWdlKHMpCiNkZWZp bmUgR1VBUkRfU0laRSAoU01BTExfUEFHRV9TSVpFKQoKLy8gV2hlbiBlbmFibGVkIChzZXQg dG8gbm9uLXplcm8pLCB0cmllcyB0byBhbGlnbiB0aHJlYWQgc3RhY2tzIG9uCi8vIGh1Z2Ug cGFnZSBib3VuZGFyaWVzLCBtYWtpbmcgdGhlbSBlbGlnaWJsZSBmb3IgaHVnZSBwYWdlcwpz dGF0aWMgaW50IGh1Z2VfcGFnZV9hbGlnbl9zdGFja3M7CgpzdGF0aWMgdm9sYXRpbGUgaW50 IGV4aXRfdGhyZWFkID0gMDsKCnVuc2lnbmVkIGxvbmcgaW50CmRlZmF1bHRfdGhwX3BhZ2Vz aXplICh2b2lkKQp7CiAgaW50IGZkID0gb3BlbiAoCiAgICAiL3N5cy9rZXJuZWwvbW0vdHJh bnNwYXJlbnRfaHVnZXBhZ2UvaHBhZ2VfcG1kX3NpemUiLCBPX1JET05MWSk7CiAgaWYgKGZk ID09IC0xKQogICAgcmV0dXJuIC0xOwoKICBjaGFyIHN0cls2NF07CiAgc3NpemVfdCBzID0g cmVhZCAoZmQsIHN0ciwgc2l6ZW9mIChzdHIpKTsKICBjbG9zZSAoZmQpOwogIGlmIChzIDwg MCkKICAgIHJldHVybiAtMTsKCiAgdW5zaWduZWQgbG9uZyBpbnQgciA9IDA7CiAgZm9yIChz c2l6ZV90IGkgPSAwOyBpIDwgczsgaSsrKQogICAgewogICAgICBpZiAoc3RyW2ldID09ICdc bicpCiAgICAgICAgYnJlYWs7CiAgICAgIHIgKj0gMTA7CiAgICAgIHIgKz0gc3RyW2ldIC0g JzAnOwogICAgfQogIHJldHVybiByOwp9CgpzdGF0aWMgdm9pZCAqCnN0YXJ0ICh2b2lkICph cmcpCnsKICB3aGlsZSAoIWV4aXRfdGhyZWFkKQogICAgc2xlZXAgKDEpOwogIHJldHVybiBO VUxMOwp9CgpzdGF0aWMgY2hhciAqCm5leHRfbGluZSAoaW50IGZkLCBjaGFyICpjb25zdCBi dWZmZXIsIGNoYXIgKipjcCwgY2hhciAqKnJlLAogICAgICAgICAgIGNoYXIgKmNvbnN0IGJ1 ZmZlcl9lbmQpCnsKICBjaGFyICpyZXMgPSAqY3A7CiAgY2hhciAqbmwgPSBtZW1jaHIgKCpj cCwgJ1xuJywgKnJlIC0gKmNwKTsKICBpZiAobmwgPT0gTlVMTCkKICAgIHsKICAgICAgaWYg KCpjcCAhPSBidWZmZXIpCiAgICAgICAgewogICAgICAgICAgaWYgKCpyZSA9PSBidWZmZXJf ZW5kKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbWVtbW92ZSAoYnVmZmVyLCAqY3As ICpyZSAtICpjcCk7CiAgICAgICAgICAgICAgKnJlID0gYnVmZmVyICsgKCpyZSAtICpjcCk7 CiAgICAgICAgICAgICAgKmNwID0gYnVmZmVyOwoKICAgICAgICAgICAgICBzc2l6ZV90IG4g PSByZWFkIChmZCwgKnJlLCBidWZmZXJfZW5kIC0gKnJlKTsKICAgICAgICAgICAgICBpZiAo biA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgICAgICAgKnJl ICs9IG47CgogICAgICAgICAgICAgIG5sID0gbWVtY2hyICgqY3AsICdcbicsICpyZSAtICpj cCk7CiAgICAgICAgICAgICAgd2hpbGUgKG5sID09IE5VTEwgJiYgKnJlID09IGJ1ZmZlcl9l bmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC8qIFRydW5jYXRlIHRv byBsb25nIGxpbmVzLiAgKi8KICAgICAgICAgICAgICAgICAgKnJlID0gYnVmZmVyICsgMyAq IChidWZmZXJfZW5kIC0gYnVmZmVyKSAvIDQ7CiAgICAgICAgICAgICAgICAgIG4gPSByZWFk IChmZCwgKnJlLCBidWZmZXJfZW5kIC0gKnJlKTsKICAgICAgICAgICAgICAgICAgaWYgKG4g PCAwKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAgICAgICAg ICAgbmwgPSBtZW1jaHIgKCpyZSwgJ1xuJywgbik7CiAgICAgICAgICAgICAgICAgICoqcmUg PSAnXG4nOwogICAgICAgICAgICAgICAgICAqcmUgKz0gbjsKICAgICAgICAgICAgICAgIH0K ICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBubCA9IG1lbWNociAo KmNwLCAnXG4nLCAqcmUgLSAqY3ApOwoKICAgICAgICAgIHJlcyA9ICpjcDsKICAgICAgICB9 CgogICAgICBpZiAobmwgPT0gTlVMTCkKICAgICAgICBubCA9ICpyZSAtIDE7CiAgICB9Cgog ICpjcCA9IG5sICsgMTsKICBhc3NlcnQgKCpjcCA8PSAqcmUpOwoKICByZXR1cm4gcmVzID09 ICpyZSA/IE5VTEwgOiByZXM7Cn0KCnN0YXRpYyB2b2lkCnJlYWRfcHJvY19maWxlIChjb25z dCBjaGFyICpmbmFtZSwgdm9pZCAoKmNsb3N1cmUpKGNvbnN0IGNoYXIgKiwgc2l6ZV90ICop LAoJCQkJCQkgICBzaXplX3QgKmFyZykKewogIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JE T05MWSB8IE9fQ0xPRVhFQyk7CiAgYXNzZXJ0IChmZCAhPSAtMSk7CgogIGVudW0geyBidWZm ZXJfc2l6ZSA9IDEwMjQgfTsKICBjaGFyIGJ1ZmZlcltidWZmZXJfc2l6ZV07CiAgY2hhciAq YnVmZmVyX2VuZCA9IGJ1ZmZlciArIGJ1ZmZlcl9zaXplOwogIGNoYXIgKmNwID0gYnVmZmVy X2VuZDsKICBjaGFyICpyZSA9IGJ1ZmZlcl9lbmQ7CgogIGNoYXIgKmw7CiAgd2hpbGUgKChs ID0gbmV4dF9saW5lIChmZCwgYnVmZmVyLCAmY3AsICZyZSwgYnVmZmVyX2VuZCkpICE9IE5V TEwpCiAgICBjbG9zdXJlIChsLCBhcmcpOwoKICBjbG9zZSAoZmQpOwp9CgpzdGF0aWMgdm9p ZApwYXJzZV9zdGF0bV9saW5lIChjb25zdCBjaGFyICpsaW5lLCBzaXplX3QgKnJldCkKewog IGxvbmcgaW50IHJzczsKICBhc3NlcnQgKHNzY2FuZiAobGluZSwgIiUqZCAlbGQiLCAmcnNz KSA9PSAxKTsKICAqcmV0ID0gcnNzOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9zdGF0bSAodm9p ZCkKewogIHNpemVfdCByc3MgPSAwOwogIHJlYWRfcHJvY19maWxlICgiL3Byb2Mvc2VsZi9z dGF0bSIsIHBhcnNlX3N0YXRtX2xpbmUsICZyc3MpOwoKICBmcHJpbnRmIChzdGRlcnIsICJb c3RhdG1dIFJTUzogJXpkIHBhZ2VzICglemQgYnl0ZXMgPSAlemQgTUIpXG4iLCByc3MsCgkg ICByc3MgKiBzbWFsbF9wYWdlX3NpemUsIHJzcyAqIHNtYWxsX3BhZ2Vfc2l6ZSAvIDEwMjQg LyAxMDI0KTsKfQoKc3RhdGljIHZvaWQKcGFyc2Vfc21hcHNfbGluZSAoY29uc3QgY2hhciAq bGluZSwgc2l6ZV90ICp0b3RhbCkKewogIHN0YXRpYyBjb25zdCBjaGFyIGZpZWxkW10gPSAi UnNzOiI7CiAgc2l6ZV90IGZpZWxkbGVuID0gc3RybGVuIChmaWVsZCk7CiAgaWYgKHN0cm5j bXAgKGxpbmUsIGZpZWxkLCBmaWVsZGxlbikgIT0gMCkKICAgIHJldHVybjsKCiAgLy8gc2tp cCBzcGFjZXMKICBmb3IgKGxpbmUgKz0gZmllbGRsZW47IGlzc3BhY2UgKCpsaW5lKTsgbGlu ZSsrKTsKCiAgZW51bSB7IG51bWJlcmxlbiA9IDMyIH07CiAgY2hhciBudW1iZXJbbnVtYmVy bGVuXTsKICBzaXplX3QgaTsKICBmb3IgKGkgPSAwOyBpc2RpZ2l0IChsaW5lW2ldKSAmJiBp IDwgbnVtYmVybGVuIC0gMTsgaSsrKQogICAgbnVtYmVyW2ldID0gbGluZVtpXTsKICBudW1i ZXJbaV0gPSAnXDAnOwoKICAvLyBBc3N1bWUga0IuCiAgbG9uZyBpbnQgdmFsdWUgPSBzdHJ0 b2wgKG51bWJlciwgTlVMTCwgMTApOwogIGFzc2VydCAodmFsdWUgIT0gTE9OR19NSU4gJiYg dmFsdWUgIT0gTE9OR19NQVggJiYgZXJybm8gIT0gRVJBTkdFKTsKCiAgKnRvdGFsICs9IHZh bHVlICogMTAyNDsKfQoKc3RhdGljIHZvaWQKcGFyc2Vfc21hcHMgKHZvaWQpCnsKICBzaXpl X3QgcnNzID0gMDsKICByZWFkX3Byb2NfZmlsZSAoIi9wcm9jL3NlbGYvc21hcHMiLCBwYXJz ZV9zbWFwc19saW5lLCAmcnNzKTsKCiAgZnByaW50ZiAoc3RkZXJyLCAiW3NtYXBzXSBSU1M6 ICV6ZCBieXRlcyA9ICV6ZCBNQlxuIiwgcnNzLAoJICAgcnNzIC8gKDEwMjQgKiAxMDI0KSk7 Cn0KCgpzdGF0aWMgaW5saW5lIHVpbnRwdHJfdAphbGlnbl9kb3duICh1aW50cHRyX3QgdmFs dWUsIHVpbnRwdHJfdCBhbGlnbm1lbnQpCnsKICByZXR1cm4gdmFsdWUgJiB+KGFsaWdubWVu dCAtIDEpOwp9CgovLyBEbyBhIHNlcmllcyBvZiBzbWFsbCwgc2luZ2xlIHBhZ2UgbW1hcCBj YWxscyB0byBhdHRlbXB0IHRvIHNldAovLyBldmVyeXRoaW5nIHVwIHNvIHRoYXQgdGhlIG5l eHQgbW1hcCBjYWxsIChnbGliYyBhbGxvY2F0aW5nIHRoZQovLyBzdGFjaykgcmV0dXJucyBh IDJNQiBhbGlnbmVkIHJhbmdlLiBUaGUga2VybmVsICJleHBhbmRzIiB2bWFzIGZyb20KLy8g aGlnaGVyIHRvIGxvd2VyIGFkZHJlc3NlcyAoc3Vic2VxdWVudCBjYWxscyByZXR1cm4gcmFu Z2VzIHN0YXJ0aW5nCi8vIGF0IGxvd2VyIGFkZHJlc3NlcyksIHNvIHRoaXMgZnVuY3Rpb24g a2VlcHMgY2FsbGluZyBtbWFwIHVudGlsIGl0IGEKLy8gaHVnZSBwYWdlIGFsaWduZWQgYWRk cmVzcyBpcyByZXR1cm5lZC4gVGhlIG5leHQgcmFuZ2UgKHRoZSBzdGFjaykKLy8gd2lsbCB0 aGVuIGVuZCBvbiB0aGF0IHNhbWUgYWRkcmVzcy4Kc3RhdGljIHZvaWQKYWxpZ25fbmV4dF9v biAodWludHB0cl90IGFsaWdubWVudCkKewogIHVpbnRwdHJfdCBwOwogIGRvCiAgICB7CiAg ICAgIHAgPQoJKHVpbnRwdHJfdCkgbW1hcCAoTlVMTCwgc21hbGxfcGFnZV9zaXplLCBQUk9U X05PTkUsCgkJCSAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX05PUkVTRVJW RSwgLTEsIDApOwogICAgfQogIHdoaWxlIChwICE9IGFsaWduX2Rvd24gKHAsIGh1Z2VfcGFn ZV9zaXplKSk7Cn0KCnN0YXRpYyBzaXplX3QKcGFyc2Vfc2l6ZV90IChjb25zdCBjaGFyICp2 YWx1ZSkKewogIGNoYXIgKmVuZHB0cjsKICBlcnJubyA9IDA7CiAgc2l6ZV90IG4gPSBzdHJ0 b3VsbCAodmFsdWUsICZlbmRwdHIsIDEwKTsKICBpZiAoZXJybm8gPT0gRVJBTkdFKQogICAg ewogICAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogaW52YWxpZCAlcyB2YWx1ZVxuIiwg dmFsdWUpOwogICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwogICAgfQogIHJldHVybiBuOwp9 CgppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIGludCBvcHQ7CgogIHNp emVfdCBndWFyZF9zaXplID0gR1VBUkRfU0laRTsKICBzaXplX3Qgc3RhY2tfc2l6ZSA9IFNU QUNLX1NJWkVfVE9UQUw7CgogIHdoaWxlICgob3B0ID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAi ZzpzOm0iKSkgIT0gLTEpCiAgICB7CiAgICAgIHN3aXRjaCAob3B0KQoJewoJY2FzZSAnZyc6 CgkgIGd1YXJkX3NpemUgPSBwYXJzZV9zaXplX3QgKG9wdGFyZyk7CgkgIGJyZWFrOwoJY2Fz ZSAncyc6CgkgIHN0YWNrX3NpemUgPSBwYXJzZV9zaXplX3QgKG9wdGFyZyk7CgkgIGJyZWFr OwoJY2FzZSAnbSc6CgkgIGh1Z2VfcGFnZV9hbGlnbl9zdGFja3MgPSAxOwoJICBicmVhazsK CWRlZmF1bHQ6CgkgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXMgc3RhY2tzaXpl XSBbLWcgZ3VhcmRzaXplXSBbLW1dXG4iLAoJCSAgIGFyZ3ZbMF0pOwoJICBleGl0IChFWElU X0ZBSUxVUkUpOwoJfQogICAgfQoKICBodWdlX3BhZ2Vfc2l6ZSA9IGRlZmF1bHRfdGhwX3Bh Z2VzaXplICgpOwogIGlmIChodWdlX3BhZ2Vfc2l6ZSA9PSAwKQogICAgaHVnZV9wYWdlX3Np emUgPSBIVUdFX1BBR0VfU0laRTsKCiAgewogICAgbG9uZyBpbnQgc3ogPSBzeXNjb25mIChf U0NfUEFHRVNJWkUpOwogICAgaWYgKHN6ID09IC0xKQogICAgICBzbWFsbF9wYWdlX3NpemUg PSBTTUFMTF9QQUdFX1NJWkU7CiAgICBlbHNlCiAgICAgIHNtYWxsX3BhZ2Vfc2l6ZSA9IHN6 OwogIH0KCiAgcHRocmVhZF90IHRbTk9PRl9USFJFQURTXTsKICBwdGhyZWFkX2F0dHJfdCBh dHRyOwogIGludCBpOwoKICB2b2lkICpkdW1teSA9IG1hbGxvYyAoMTAyNCk7CiAgZnJlZSAo ZHVtbXkpOwoKICBmcHJpbnRmIChzdGRlcnIsICJQYWdlIHNpemU6ICV6ZCBrQiwgJXpkIE1C IGh1Z2UgcGFnZXNcbiIsCgkgICBzbWFsbF9wYWdlX3NpemUgLyAxMDI0LCBodWdlX3BhZ2Vf c2l6ZSAvICgxMDI0ICogMTAyNCkpOwogIGZwcmludGYgKHN0ZGVyciwgIlN0YWNrIHNpemU6 ICV6ZCBrQiwgZ3VhcmQgc2l6ZTogJXpkIGtCXG4iLAoJICAgc3RhY2tfc2l6ZSAvIDEwMjQs IGd1YXJkX3NpemUgLyAxMDI0KTsKICBpZiAoaHVnZV9wYWdlX2FsaWduX3N0YWNrcykKICAg IHsKICAgICAgZnByaW50ZiAoc3RkZXJyLAoJICAgICAgICJXaWxsIGF0dGVtcHQgdG8gYWxp Z24gYWxsb2NhdGlvbnMgdG8gbWFrZSBzdGFja3MgZWxpZ2libGUgZm9yIGh1Z2UgcGFnZXNc biIpOwogICAgfQogIHBpZF90IHBpZCA9IGdldHBpZCAoKTsKICBmcHJpbnRmIChzdGRlcnIs ICJwaWQ6ICVkICgvcHJvYy8lZC9zbWFwcylcbiIsIHBpZCwgcGlkKTsKCiAgcHRocmVhZF9h dHRyX2luaXQgKCZhdHRyKTsKICBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplICgmYXR0ciwg c3RhY2tfc2l6ZSk7CiAgcHRocmVhZF9hdHRyX3NldGd1YXJkc2l6ZSAoJmF0dHIsIGd1YXJk X3NpemUpOwoKICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGluZyAlZCB0aHJlYWRzLi4uXG4i LCBOT09GX1RIUkVBRFMpOwogIGZvciAoaSA9IDA7IGkgPCBOT09GX1RIUkVBRFM7IGkrKykK ICAgIHsKICAgICAgaWYgKGh1Z2VfcGFnZV9hbGlnbl9zdGFja3MpCgl7CgkgIC8vIGFsaWdu IChuZXh0KSBhbGxvY2F0aW9uIG9uIGh1Z2UgcGFnZSBib3VuZGFyeQoJICBhbGlnbl9uZXh0 X29uIChodWdlX3BhZ2Vfc2l6ZSk7Cgl9CiAgICAgIHB0aHJlYWRfY3JlYXRlICgmdFtpXSwg JmF0dHIsIHN0YXJ0LCBOVUxMKTsKICAgIH0KICBzbGVlcCAoMSk7CgogIHBhcnNlX3N0YXRt ICgpOwogIHBhcnNlX3NtYXBzICgpOwoKICBmcHJpbnRmIChzdGRlcnIsICJQcmVzcyBlbnRl ciB0byBleGl0Li4uXG4iKTsKICBnZXRjaGFyICgpOwoKICBleGl0X3RocmVhZCA9IDE7CiAg Zm9yIChpID0gMDsgaSA8IE5PT0ZfVEhSRUFEUzsgaSsrKQogICAgcHRocmVhZF9qb2luICh0 W2ldLCBOVUxMKTsKICByZXR1cm4gMDsKfQo= --------------o4vyP2x6hk4bL4pZMLTky0X0--