Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vyvWm-000Xym-04 for pgsql-hackers@arkaria.postgresql.org; Sat, 07 Mar 2026 17:33:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vyvWj-0095fP-2j for pgsql-hackers@arkaria.postgresql.org; Sat, 07 Mar 2026 17:33:22 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vyvWj-0095fH-1i for pgsql-hackers@lists.postgresql.org; Sat, 07 Mar 2026 17:33:22 +0000 Received: from mail-ed1-x535.google.com ([2a00:1450:4864:20::535]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vyvWh-00000001NFw-0eDW for pgsql-hackers@postgresql.org; Sat, 07 Mar 2026 17:33:21 +0000 Received: by mail-ed1-x535.google.com with SMTP id 4fb4d7f45d1cf-65c4152313fso14878900a12.1 for ; Sat, 07 Mar 2026 09:33:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772904797; cv=none; d=google.com; s=arc-20240605; b=bfFc9S1FnKTp1WnS77uadkyTNirApu3wW8Z3suGu/nhCSF8jTWqq8g3FS3F3+/z4kQ gSKRbzbG0eCgwBNe8wV2QZxzHeSgF5hGVS2UvcJMV+chZ2iYrVfawQKuAv2s92qekej8 5r5Tqbpm9k/PT8hdS8MatP2m2vblAWwWqtjQm1vLlpVgyY9qnHIKHVjuncdFx2VRSo6a 6DbJb2w7BI4HgvOPa1j8agtQwLgPcIXLuSpYU6BF7Zy33ajeoh+RQlcro0JwPya6lkcn lEk6s7n3EyFOcbSv/0InrUiGq9LtXHShzpWetyLMcGBiuf3DumzyOuEv+5aM10ETujMP Lfzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=GBAhtkjw5hBjs0VdzFmQxV0++FBxENSFmdG4jFLc2Ds=; fh=wzlgcYwqtz3FOCA4tMgrrjO/eA/mCNxQNvLbWrsvVUw=; b=Lh2RDwT3Mc6OdmiezR816yakkbcKiy0iSkQVCL0cslZ0Rfwv68vnT4VAI5k4rjbHOi +i9CEGRLC/k2pQp88CONMBT08y1x8iQQOtRYnd8OAhegCVkTQS91uNFlAMLkPhQOd+rd uVNFcdjeuv5lG7eeya23RutPRVeEsUv6HYhV9T5lgN45e6j1VNjpFXRVI4nkzfkxH5ko o0q5OYdbVHzY3oRfwPFRq9WHyxC4jd1b4AVZBfvvCMVILKVjjI26FUbJb+LXI4rpWGbo te0SXL3ESczhhvk8N28Oo8wQw7HwzliZGzz4tjQgx5fMeBIqVQkpiejdqB8i8hLwbBYI mQxA==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772904797; x=1773509597; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=GBAhtkjw5hBjs0VdzFmQxV0++FBxENSFmdG4jFLc2Ds=; b=NoAf1RyrQxsVSOWLdHTaCyWB2Z8j+OuGCRPsXOnXUR4vczQuLoGXBPCvNGKXY67Nk+ K4QnZkSkrJ1DpzOeX1Mos63DAJvcSGTxTW5PIcbDDhvqaxx0Dz8SOGjeZEXAX2/e8I7n 8AY067S3/p5DhC4DNq/3NXzEiBDPL18IhwvShL716OSQ/iYlp/Xh6N7iAHCgDmOH7zeo c0P+oepjaA6ZunEI9PvKSV2ojR1yK3tiKlulfpGKCNVsonnQwBW3nmpS9RY2MXPv+r4k iteVtl16s9c7lIoJ9NkQz6KNBA5UH9YpA7C3DuI9PZs85TNWbI73JRSA0ojGQ58BIOT9 2rQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772904797; x=1773509597; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=GBAhtkjw5hBjs0VdzFmQxV0++FBxENSFmdG4jFLc2Ds=; b=AWnK9wj/ervHmbT/fSsp90kAXIWWxEOCIhLA4Wm/Cgxvng6K4Q8WIfDoK905yLrSTk PmV3jOi0qkU1z1vDlf5+ilJt/Xc7AUmDpkHTIa2gS7giM5OAnVZczyWgJUH6fiBD8vXX wjx82t+0UtHrc0m3dh7ldVr/ylwEWYtaWFGltfSzIi0JouMneGt6WOX6CXI0153l9g6b 9UHnwwQzmL2dxFKpx5UxFq4ZGXGgCk4Pl8180S6zg4TNIKc+phuqtgud5wNUOfcxy3WV qOOD5tb+3ohbJo7litckhgrwl92M4uzSntIzcy76JGoRgqqSfGNYhkXPAONfm+zhSJHG cvow== X-Gm-Message-State: AOJu0YzX9MKBXOHEWaC25h3gZCTq4OEDDFy1oyzjxucCAjRJ6PjvQbw/ PEr+85qnlwHP7f9GYkw994FTF/YW/O50mv8Jfwc/JNRy3CGx4o0ZWIrE79l1d3kePzM8H6qKI1Z iiie3xByjuq4m3OtGDMHsYzrsCwh6D8AjDOH3 X-Gm-Gg: ATEYQzzZPMWBKwtNGjZiuqJW1x01x7Y/TdJumAk/tQhx8OYJe+vK2Gfvcr1TIn7UfIt OM4lQq66Qz5ZaeCTtnBFyGP8XnNxDIYgBEaHqpclwfcLdzFHo0+F380J0SGqT/qM7PYI7S3mi2x 4n7fuka1i8v5OCpTFKtQCCsu4C1fmUnn92O6myDPxPUxNb2R20HiyWCko6W272CMaFUlkh4Ov4f vc48t6x/buSDvTjVtNo1kZu55eMaftXHmJhNHy5vrfmpZtyNE2GIvATEzDuYR1ClZ2yE1pFC9a4 iHGK+Ibf3cNm+DdHW0tACgfy4mhBJOY1n+mTnszrKQoBvMEBi5he1zlQPi9s1dUBoSOfm5O+BH8 FO+pa+xCN X-Received: by 2002:a05:6402:1e8e:b0:660:f443:379a with SMTP id 4fb4d7f45d1cf-6619d51ebddmr3188671a12.15.1772904796841; Sat, 07 Mar 2026 09:33:16 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Melanie Plageman Date: Sat, 7 Mar 2026 12:33:05 -0500 X-Gm-Features: AaiRm52s0XF60wcjrfAHmqDk7F596Ec6C3DPddF27mqyAqdZ9aG_SFNqMQ3ge9I Message-ID: Subject: Re: Unlogged rel fake lsn vs GetVictimBuffer() To: Andres Freund Cc: pgsql-hackers@postgresql.org, Heikki Linnakangas , Peter Geoghegan Content-Type: multipart/mixed; boundary="000000000000a31c31064c72904d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a31c31064c72904d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Feb 28, 2026 at 7:16=E2=80=AFPM Andres Freund = wrote: > > > +BufferNeedsWALFlush(BufferDesc *bufdesc, bool exclusive_locked) > > +{ > > + uint32 buf_state =3D pg_atomic_read_u64(&bufdesc->state)= ; > > + Buffer buffer; > > + char *page; > > + XLogRecPtr lsn; > > + > > + /* > > + * Unlogged buffers can't need WAL flush. See FlushBuffer() for m= ore > > + * details on unlogged relations with LSNs. > > + */ > > + if (!(buf_state & BM_PERMANENT)) > > + return false; > > + > > + buffer =3D BufferDescriptorGetBuffer(bufdesc); > > + page =3D BufferGetPage(buffer); > > + > > + if (!XLogHintBitIsNeeded() || BufferIsLocal(buffer) || exclusive_= locked) > > + lsn =3D PageGetLSN(page); > > + else > > + { > > + /* Buffer is either share locked or not locked */ > > + LockBufHdr(bufdesc); > > + lsn =3D PageGetLSN(page); > > + UnlockBufHdr(bufdesc); > > + } > > I buy the exclusive_locked branch, but the rest seems a bit dubious: > > - BufferIsLocal(buffer) is impossible, the buffer would not be permanent,= and > I don't think we use strategy Changed it to an assert. > - XLogHintBitIsNeeded() isn't *that* cheap and if we dirtied the buffer, = the > relative cost of locking the buffer header isn't going to matter. BufferGetLSNAtomic() checks XLogHintBitIsNeeded() as part of what it calls a "fast path". I suppose in the case of BufferNeedsWALFlush() we expect it only to be called on dirty buffers, so perhaps we don't need to worry about being "fast". But why would XLogHintBitIsNeeded() be slower than the buffer header lock? Is accessing the ControlFile variable expensive or is it just the external function call? > > diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storag= e/buffer/freelist.c > > > @@ -795,8 +800,14 @@ StrategyRejectBuffer(BufferAccessStrategy strategy= , BufferDesc *buf, bool from_r > > strategy->buffers[strategy->current] !=3D BufferDescripto= rGetBuffer(buf)) > > return false; > > > > + Assert(BufferIsLockedByMe(BufferDescriptorGetBuffer(buf))); > > + Assert(!(pg_atomic_read_u64(&buf->state) & BM_LOCKED)); > > + > > + if (!BufferNeedsWALFlush(buf, false)) > > + return false; > > It's a bit unfortunate that now you have an external function call from > bufmgr.c (for StrategyRejectBuffer()) and then an external call back to > bufmgr.c, just to then return back to freelist.c and then to bufmgr.c. A= nd > you need to re-read the buf_state in BufferNeedsWALFlush() again. > > I'd probably just call BufferNeedsWALFlush() in GetVictimBuffer() and pas= s it > the old buf_state, to avoid having to re-fetch it. My idea was to avoid taking the buffer header lock if it is a non-bulkread strategy -- which you can't do if you need to call BufferNeedsWALFlush() from bufmgr.c. You have to check BufferNeedsWALFlush() before StrategyRejectBuffer() because StrategyRejectBuffer() sets the buffer to InvalidBuffer in the ring. So you think that the external function call will be more expensive than taking the buffer header lock? And, I find the current StrategyRejectBuffer() kind of silly and hard to understand -- its comment mentions needing WAL flush, but, of course it doesn't check that at all. I've changed it as you suggest, but I did really prefer it the other way from a code readability perspective. - Melanie --000000000000a31c31064c72904d Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Avoid-WAL-flush-checks-for-unlogged-buffers-in-Ge.patch" Content-Disposition: attachment; filename="v2-0001-Avoid-WAL-flush-checks-for-unlogged-buffers-in-Ge.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmglq3ia0 RnJvbSA3ZGI3YWE2OWY1YzU2YWEyYWU0MTlkOTliMzMwOGE2MjA5ZjZmODJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNZWxhbmllIFBsYWdlbWFuIDxtZWxhbmllcGxhZ2VtYW5AZ21h aWwuY29tPgpEYXRlOiBTYXQsIDcgTWFyIDIwMjYgMTE6Mzg6MTQgLTA1MDAKU3ViamVjdDogW1BB VENIIHYyXSBBdm9pZCBXQUwtZmx1c2ggY2hlY2tzIGZvciB1bmxvZ2dlZCBidWZmZXJzIGluCiBH ZXRWaWN0aW1CdWZmZXIoKQoKR2V0VmljdGltQnVmZmVyKCkgcmVqZWN0cyBhIHZpY3RpbSBidWZm ZXIgaWYgaXQgaXMgZnJvbSBhIGJ1bGtyZWFkCnN0cmF0ZWd5IHJpbmcgYW5kIHJldXNpbmcgaXQg d291bGQgcmVxdWlyZSBmbHVzaGluZyBXQUwuIFVubG9nZ2VkIHRhYmxlCmJ1ZmZlcnMgY2FuIGhh dmUgZmFrZSBMU05zIChlLmcuIHVubG9nZ2VkIEdpU1QgcGFnZXMpIGFuZCBjYWxsaW5nClhMb2dO ZWVkc0ZsdXNoKCkgb24gYSBmYWtlIExTTiBpcyBtZWFuaW5nbGVzcy4KClRoaXMgaXNuJ3QgYW4g aXNzdWUgY3VycmVudGx5IGJlY2F1c2UgdGhlIGJ1bGtyZWFkIHN0cmF0ZWd5IGlzIG5vdCB1c2Vk CmZvciByZWxhdGlvbnMgd2l0aCBmYWtlIExTTnMuIEhvd2V2ZXIsIGZpeGluZyBpdCBhdm9pZHMg ZnV0dXJlIGlzc3VlcwphbmQgYXZvaWRzIGFjcXVpcmluZyB0aGUgYnVmZmVyIGhlYWRlciBsb2Nr IGZvciB1bmxvZ2dlZCB0YWJsZSBidWZmZXJzLgpXaGlsZSB3ZSdyZSBhdCBpdCwgYXZvaWQgdGFr aW5nIHRoZSBidWZmZXIgaGVhZGVyIGxvY2sgZm9yIGJ1ZmZlcnMgbm90CmZyb20gdGhlIHN0cmF0 ZWd5IHJpbmcuCgpBdXRob3I6IE1lbGFuaWUgUGxhZ2VtYW4gPG1lbGFuaWVwbGFnZW1hbkBnbWFp bC5jb20+ClJlcG9ydGVkLWJ5OiBBbmRyZXMgRnJldW5kIDxhbmRyZXNAYW5hcmF6ZWwuZGU+ClJl dmlld2VkLWJ5OiBBbmRyZXMgRnJldW5kIDxhbmRyZXNAYW5hcmF6ZWwuZGU+ClJldmlld2VkLWJ5 OiBDaGFvIExpIDxsaS5ldmFuLmNoYW9AZ21haWwuY29tPgpEaXNjdXNzaW9uOiBodHRwczovL3Bv c3Rnci5lcy9tL2ZsYXQvZm1rcW15ZXl5N2JkcHZjZ2toZWI2eWFxZXdlbWtpazNsczZhYXZleWk1 aWJtdnR4bmQlNDBudTJrdnk1cnEzYTYKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9nLmMgICAgIHwgIDMgKysKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jICAg fCA2OCArKysrKysrKysrKysrKysrKysrKystLS0tLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVm ZmVyL2ZyZWVsaXN0LmMgfCAgNCArLQogMyBmaWxlcyBjaGFuZ2VkLCA1OSBpbnNlcnRpb25zKCsp LCAxNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNh bS94bG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKaW5kZXggYjliNjc4 ZjM3MjIuLmY4NDZmMzgxNGI0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNh bS94bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCkBAIC0zMTgy LDYgKzMxODIsOSBAQCBYTG9nTmVlZHNGbHVzaChYTG9nUmVjUHRyIHJlY29yZCkKIAkJCXJldHVy biB0cnVlOwogCX0KIAorCS8qIFByb3RlY3QgYWdhaW5zdCBjYWxsZXJzIHVzaW5nIGZha2UgTFNO cyAqLworCUFzc2VydChyZWNvcmQgPD0gR2V0WExvZ0luc2VydFJlY1B0cigpKTsKKwogCS8qIFF1 aWNrIGV4aXQgaWYgYWxyZWFkeSBrbm93biBmbHVzaGVkICovCiAJaWYgKHJlY29yZCA8PSBMb2d3 cnRSZXN1bHQuRmx1c2gpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVm bWdyLmMKaW5kZXggNWYzZDA4M2U5MzguLjZkMTZmODcyNjc0IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1 ZmZlci9idWZtZ3IuYwpAQCAtNjI1LDYgKzYyNSw4IEBAIHN0YXRpYyBib29sIFBpbkJ1ZmZlcihC dWZmZXJEZXNjICpidWYsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5LAogc3RhdGljIHZv aWQgUGluQnVmZmVyX0xvY2tlZChCdWZmZXJEZXNjICpidWYpOwogc3RhdGljIHZvaWQgVW5waW5C dWZmZXIoQnVmZmVyRGVzYyAqYnVmKTsKIHN0YXRpYyB2b2lkIFVucGluQnVmZmVyTm9Pd25lcihC dWZmZXJEZXNjICpidWYpOworc3RhdGljIGJvb2wgQnVmZmVyTmVlZHNXQUxGbHVzaChCdWZmZXJE ZXNjICpidWZkZXNjLCB1aW50NjQgYnVmX3N0YXRlLAorCQkJCQkJCQlib29sIGV4Y2x1c2l2ZV9s b2NrZWQpOwogc3RhdGljIHZvaWQgQnVmZmVyU3luYyhpbnQgZmxhZ3MpOwogc3RhdGljIGludAlT eW5jT25lQnVmZmVyKGludCBidWZfaWQsIGJvb2wgc2tpcF9yZWNlbnRseV91c2VkLAogCQkJCQkJ ICBXcml0ZWJhY2tDb250ZXh0ICp3Yl9jb250ZXh0KTsKQEAgLTI1MjIsMjIgKzI1MjQsMTMgQEAg YWdhaW46CiAJCSAqIGxvY2sgdG8gaW5zcGVjdCB0aGUgcGFnZSBMU04sIHNvIHRoaXMgY2FuJ3Qg YmUgZG9uZSBpbnNpZGUKIAkJICogU3RyYXRlZ3lHZXRCdWZmZXIuCiAJCSAqLwotCQlpZiAoc3Ry YXRlZ3kgIT0gTlVMTCkKKwkJaWYgKHN0cmF0ZWd5ICYmIGZyb21fcmluZyAmJgorCQkJQnVmZmVy TmVlZHNXQUxGbHVzaChidWZfaGRyLCBidWZfc3RhdGUsIGZhbHNlKSAmJgorCQkJU3RyYXRlZ3lS ZWplY3RCdWZmZXIoc3RyYXRlZ3ksIGJ1Zl9oZHIsIGZyb21fcmluZykpCiAJCXsKLQkJCVhMb2dS ZWNQdHIJbHNuOwotCi0JCQkvKiBSZWFkIHRoZSBMU04gd2hpbGUgaG9sZGluZyBidWZmZXIgaGVh ZGVyIGxvY2sgKi8KLQkJCWJ1Zl9zdGF0ZSA9IExvY2tCdWZIZHIoYnVmX2hkcik7Ci0JCQlsc24g PSBCdWZmZXJHZXRMU04oYnVmX2hkcik7Ci0JCQlVbmxvY2tCdWZIZHIoYnVmX2hkcik7Ci0KLQkJ CWlmIChYTG9nTmVlZHNGbHVzaChsc24pCi0JCQkJJiYgU3RyYXRlZ3lSZWplY3RCdWZmZXIoc3Ry YXRlZ3ksIGJ1Zl9oZHIsIGZyb21fcmluZykpCi0JCQl7Ci0JCQkJTG9ja0J1ZmZlcihidWYsIEJV RkZFUl9MT0NLX1VOTE9DSyk7Ci0JCQkJVW5waW5CdWZmZXIoYnVmX2hkcik7Ci0JCQkJZ290byBh Z2FpbjsKLQkJCX0KKwkJCUxvY2tCdWZmZXIoYnVmLCBCVUZGRVJfTE9DS19VTkxPQ0spOworCQkJ VW5waW5CdWZmZXIoYnVmX2hkcik7CisJCQlnb3RvIGFnYWluOwogCQl9CiAKIAkJLyogT0ssIGRv IHRoZSBJL08gKi8KQEAgLTM0MzcsNiArMzQzMCw1MSBAQCBUcmFja05ld0J1ZmZlclBpbihCdWZm ZXIgYnVmKQogCQkJCQkJCSAgQkxDS1NaKTsKIH0KIAorLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0 aGUgYnVmZmVyIG5lZWRzIFdBTCBmbHVzaGVkIGJlZm9yZSBpdCBjYW4gYmUgd3JpdHRlbiBvdXQu CisgKgorICogVGhlIGNhbGxlciBtdXN0IHBhc3MgYSBidWZfc3RhdGUgdmFsdWUgcmVhZCBmcm9t IGJ1ZmRlc2MtPnN0YXRlLgorICoKKyAqIElmIHRoZSByZXN1bHQgaXMgcmVxdWlyZWQgdG8gYmUg Y29ycmVjdCwgdGhlIGNhbGxlciBtdXN0IGhvbGQgYSBidWZmZXIKKyAqIGNvbnRlbnQgbG9jay4g SWYgdGhleSBvbmx5IGhvbGQgYSBzaGFyZWQgY29udGVudCBsb2NrLCB3ZSdsbCBuZWVkIHRvCisg KiBhY3F1aXJlIHRoZSBidWZmZXIgaGVhZGVyIHNwaW5sb2NrLCBzbyB0aGV5IG11c3Qgbm90IGFs cmVhZHkgaG9sZCBpdC4KKyAqLworc3RhdGljIGJvb2wKK0J1ZmZlck5lZWRzV0FMRmx1c2goQnVm ZmVyRGVzYyAqYnVmZGVzYywgdWludDY0IGJ1Zl9zdGF0ZSwKKwkJCQkJYm9vbCBleGNsdXNpdmVf bG9ja2VkKQoreworCUJ1ZmZlcgkJYnVmZmVyOworCWNoYXIJICAgKnBhZ2U7CisJWExvZ1JlY1B0 cglsc247CisKKwkvKgorCSAqIFVubG9nZ2VkIGJ1ZmZlcnMgY2FuJ3QgbmVlZCBXQUwgZmx1c2gu IFNlZSBGbHVzaEJ1ZmZlcigpIGZvciBtb3JlCisJICogZGV0YWlscyBvbiB1bmxvZ2dlZCByZWxh dGlvbnMgd2l0aCBMU05zLgorCSAqLworCWlmICghKGJ1Zl9zdGF0ZSAmIEJNX1BFUk1BTkVOVCkp CisJCXJldHVybiBmYWxzZTsKKworCWJ1ZmZlciA9IEJ1ZmZlckRlc2NyaXB0b3JHZXRCdWZmZXIo YnVmZGVzYyk7CisJQXNzZXJ0KCFCdWZmZXJJc0xvY2FsKGJ1ZmZlcikpOworCXBhZ2UgPSBCdWZm ZXJHZXRQYWdlKGJ1ZmZlcik7CisKKwlpZiAoZXhjbHVzaXZlX2xvY2tlZCkKKwl7CisJCUFzc2Vy dChCdWZmZXJJc0xvY2tlZEJ5TWVJbk1vZGUoYnVmZmVyLCBCVUZGRVJfTE9DS19FWENMVVNJVkUp KTsKKwkJbHNuID0gUGFnZUdldExTTihwYWdlKTsKKwl9CisJZWxzZQorCXsKKwkJLyogQnVmZmVy IGlzIGVpdGhlciBzaGFyZSBsb2NrZWQgb3Igbm90IGxvY2tlZC4gKi8KKwkJTG9ja0J1Zkhkcihi dWZkZXNjKTsKKwkJbHNuID0gUGFnZUdldExTTihwYWdlKTsKKwkJVW5sb2NrQnVmSGRyKGJ1ZmRl c2MpOworCX0KKworCXJldHVybiBYTG9nTmVlZHNGbHVzaChsc24pOworfQorCisKICNkZWZpbmUg U1RfU09SVCBzb3J0X2NoZWNrcG9pbnRfYnVmZmVyaWRzCiAjZGVmaW5lIFNUX0VMRU1FTlRfVFlQ RSBDa3B0U29ydEl0ZW0KICNkZWZpbmUgU1RfQ09NUEFSRShhLCBiKSBja3B0X2J1Zm9yZGVyX2Nv bXBhcmF0b3IoYSwgYikKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2Zy ZWVsaXN0LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9mcmVlbGlzdC5jCmluZGV4IGI3 Njg3ODM2MTg4Li42ZjMxY2QyMjI4OSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9i dWZmZXIvZnJlZWxpc3QuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9mcmVlbGlz dC5jCkBAIC03ODYsNiArNzg2LDggQEAgSU9Db250ZXh0Rm9yU3RyYXRlZ3koQnVmZmVyQWNjZXNz U3RyYXRlZ3kgc3RyYXRlZ3kpCiBib29sCiBTdHJhdGVneVJlamVjdEJ1ZmZlcihCdWZmZXJBY2Nl c3NTdHJhdGVneSBzdHJhdGVneSwgQnVmZmVyRGVzYyAqYnVmLCBib29sIGZyb21fcmluZykKIHsK KwlBc3NlcnQoc3RyYXRlZ3kpOworCiAJLyogV2Ugb25seSBkbyB0aGlzIGluIGJ1bGtyZWFkIG1v ZGUgKi8KIAlpZiAoc3RyYXRlZ3ktPmJ0eXBlICE9IEJBU19CVUxLUkVBRCkKIAkJcmV0dXJuIGZh bHNlOwpAQCAtNzk2LDcgKzc5OCw3IEBAIFN0cmF0ZWd5UmVqZWN0QnVmZmVyKEJ1ZmZlckFjY2Vz c1N0cmF0ZWd5IHN0cmF0ZWd5LCBCdWZmZXJEZXNjICpidWYsIGJvb2wgZnJvbV9yCiAJCXJldHVy biBmYWxzZTsKIAogCS8qCi0JICogUmVtb3ZlIHRoZSBkaXJ0eSBidWZmZXIgZnJvbSB0aGUgcmlu ZzsgbmVjZXNzYXJ5IHRvIHByZXZlbnQgaW5maW5pdGUKKwkgKiBSZW1vdmUgdGhlIGRpcnR5IGJ1 ZmZlciBmcm9tIHRoZSByaW5nOyBuZWNlc3NhcnkgdG8gcHJldmVudCBhbiBpbmZpbml0ZQogCSAq IGxvb3AgaWYgYWxsIHJpbmcgbWVtYmVycyBhcmUgZGlydHkuCiAJICovCiAJc3RyYXRlZ3ktPmJ1 ZmZlcnNbc3RyYXRlZ3ktPmN1cnJlbnRdID0gSW52YWxpZEJ1ZmZlcjsKLS0gCjIuNDMuMAoK --000000000000a31c31064c72904d--