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.94.2) (envelope-from ) id 1tqDcH-001Mnb-Jb for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Mar 2025 15:58:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tqDcG-00G68o-9U for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Mar 2025 15:58:32 +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.94.2) (envelope-from ) id 1tqDcF-00G650-Qw for pgsql-hackers@lists.postgresql.org; Thu, 06 Mar 2025 15:58:31 +0000 Received: from mail-lf1-x136.google.com ([2a00:1450:4864:20::136]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tqDcC-001KBd-0N for pgsql-hackers@postgresql.org; Thu, 06 Mar 2025 15:58:31 +0000 Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-547bcef2f96so1043542e87.1 for ; Thu, 06 Mar 2025 07:58:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741276709; x=1741881509; 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=uswfsh8++e6fOK89ZG0hMSFLAyrW3KjquUBFSXgGq2I=; b=T/J5hNjDlCHcvG+ZNK8Zo7UHK+tBC8Q/CUv0HxJ6MhL059xvNgvnXGeuSqZiD6D7wk 1rh8LFiK3thWerfS0ZryGLwR/vxjxpZpIZ7b55aN5LyvpRRCMbjYmdbCG/9fEvHAt74p 8/PeFfK4TLA5D67eF8r/EZfJJXrYLfl26aoDSuEwfFcL1i6WABGPAEZS4jNpvhi2QFht adYwvBliexx5uvMAF+19U+WvlobDncZMD8lP9IDXSDU+/KJc15zqw2Ib7ivgP75Y0/HX p2O5u5Wy4T+4W8qQ6iFb8Mt4XQkb+A5Q2pDc0SeAHE8+ma2EYu1iA/1orVmZyJrjGrjy d6fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741276709; x=1741881509; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=uswfsh8++e6fOK89ZG0hMSFLAyrW3KjquUBFSXgGq2I=; b=jtbwHGQRNO2sLZ5G1URTDxk9DgzPGPWg5/0fH2f+Xrwzk1xCAOBkIYJJIOksmyMhF+ H5zAj+DokJDD1NAPXHWSq2hk64inQGcCnUH8DjOZwEQJ0DRlGL15FyvKJUeI/2Vcuqhk IjtOZBLPK6L/2UykbJenR2j9ZxClYYbVn+UB8cXn6u9vUsB6B9gymoybLd4QE9L+KzmO lajRAeuHpuax1dPGj3EsE7A9c995MVt87Ly8B2OgHgIQ8YN49PeHbP4rbt4yJgn2RBCt /L2VTNRtpRg6ZZUjO6zNropFkwJkNARXqJ0hGNhfMAUQhjwM3S9OmBi4sgGjJpvMg+QT RnCQ== X-Gm-Message-State: AOJu0Yynh4FwdwRfKNvwCZz49m6Xv33G9+53eoDrLY8/g/yZoY8N2786 YJxXo/cOdH9AhGfz4z7hqwwRZJtYEc6PpfKGds7hAZ+Cby5vxTyfBZ7Zj2sXBykT4eVywBxzJ4X HfjmklUJM0jTiThBFOozk+gVz5nlZ7+Bw X-Gm-Gg: ASbGncubqb7fb1212h8W2mk49DJs9apPpe/5DDD6YzfUUOqo/Yl9/jR6zAeiZ64KUgm qRuzSYxszbzk6ZbeZ5BpaRfR5eEGL7c3s+A4LWkF2KuWI3vYCv48v2rl0hbD75BqTH0NTb7LwOf SHdypTEMGdZdw5V4zHOYcHOmR8ulu0maIfL4sAlsEhKjvvJDiEA08aQDEJeiQ= X-Google-Smtp-Source: AGHT+IEkPn0DHEHtMNpreV5kjUgWJR6LfgZQ10R007EouYiXIysQK5GVVHSUflFSqm4ZK7QLgdjtrK2RsArrpVN5Imo= X-Received: by 2002:a05:6512:33d6:b0:545:8a1:5381 with SMTP id 2adb3069b0e04-5497d32f7e4mr3282024e87.11.1741276708259; Thu, 06 Mar 2025 07:58:28 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Rahila Syed Date: Thu, 6 Mar 2025 21:28:17 +0530 X-Gm-Features: AQ5f1JqsbfNHJwlBoBEQIr-LU5ft7E0EKwjnUUr3BXiSHpDSkLwTGN_WaKd8Mw4 Message-ID: Subject: Re: Improve monitoring of shared memory allocations To: Andres Freund Cc: PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000a6efd7062fae938e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a6efd7062fae938e Content-Type: multipart/alternative; boundary="000000000000a6efd5062fae938c" --000000000000a6efd5062fae938c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Thank you for the review. cfbot found a few compiler warnings: > > https://cirrus-ci.com/task/6526903542087680 > [16:47:46.964] make -s -j${BUILD_JOBS} clean > [16:47:47.452] time make -s -j${BUILD_JOBS} world-bin > [16:49:10.496] lwlock.c: In function =E2=80=98CreateLWLocks=E2=80=99: > [16:49:10.496] lwlock.c:467:22: error: unused variable =E2=80=98found=E2= =80=99 > [-Werror=3Dunused-variable] > [16:49:10.496] 467 | bool found; > [16:49:10.496] | ^~~~~ > [16:49:10.496] cc1: all warnings being treated as errors > [16:49:10.496] make[4]: *** [: lwlock.o] Error 1 > [16:49:10.496] make[3]: *** [../../../src/backend/common.mk:37: > lmgr-recursive] Error 2 > [16:49:10.496] make[3]: *** Waiting for unfinished jobs.... > [16:49:11.881] make[2]: *** [common.mk:37: storage-recursive] Error 2 > [16:49:11.881] make[2]: *** Waiting for unfinished jobs.... > [16:49:20.195] dynahash.c: In function =E2=80=98hash_create=E2=80=99: > [16:49:20.195] dynahash.c:643:37: error: =E2=80=98curr_offset=E2=80=99 ma= y be used > uninitialized [-Werror=3Dmaybe-uninitialized] > [16:49:20.195] 643 | curr_offset =3D (((char > *)curr_offset) + (temp * elementSize)); > [16:49:20.195] | > ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > [16:49:20.195] dynahash.c:588:23: note: =E2=80=98curr_offset=E2=80=99 was= declared here > [16:49:20.195] 588 | void *curr_offset; > [16:49:20.195] | ^~~~~~~~~~~ > [16:49:20.195] cc1: all warnings being treated as errors > [16:49:20.196] make[4]: *** [: dynahash.o] Error 1 > > Fixed these. > > > diff --git a/src/backend/utils/hash/dynahash.c > b/src/backend/utils/hash/dynahash.c > > index cd5a00132f..5203f5b30b 100644 > > --- a/src/backend/utils/hash/dynahash.c > > +++ b/src/backend/utils/hash/dynahash.c > > @@ -120,7 +120,6 @@ > > * a good idea of the maximum number of entries!). For non-shared has= h > > * tables, the initial directory size can be left at the default. > > */ > > -#define DEF_SEGSIZE 256 > > #define DEF_SEGSIZE_SHIFT 8 /* must be log2(DEF_SEGSIZE) */ > > #define DEF_DIRSIZE 256 > > Why did you move this to the header? Afaict it's just used in > hash_get_shared_size(), which is also in dynahash.c? > > Yes. This was accidentally left behind by the previous version of the patch, so I undid the change. > > static void register_seq_scan(HTAB *hashp); > > static void deregister_seq_scan(HTAB *hashp); > > static bool has_seq_scans(HTAB *hashp); > > - > > +static int find_num_of_segs(long nelem, int *nbuckets, long > num_partitions, long ssize); > > > > /* > > * memory allocation support > > You removed a newline here that probably shouldn't be removed. Fixed this. > > > @@ -468,7 +466,11 @@ hash_create(const char *tabname, long nelem, const > HASHCTL *info, int flags) > > else > > hashp->keycopy =3D memcpy; > > > > - /* And select the entry allocation function, too. */ > > + /* > > + * And select the entry allocation function, too. XXX should this > also > > + * Assert that flags & HASH_SHARED_MEM is true, since HASH_ALLOC = is > > + * currently only set with HASH_SHARED_MEM * > > + */ > > if (flags & HASH_ALLOC) > > hashp->alloc =3D info->alloc; > > else > > @@ -518,6 +520,7 @@ hash_create(const char *tabname, long nelem, const > HASHCTL *info, int flags) > > > > hashp->frozen =3D false; > > > > + /* Initializing the HASHHDR variables with default values */ > > hdefault(hashp); > > > > hctl =3D hashp->hctl; > > I assume these were just observations you made while looking into this? > They > seem unrelated to the change itself? Yes. I removed the first one and left the second one as a code comment. > > > @@ -582,7 +585,8 @@ hash_create(const char *tabname, long nelem, const > HASHCTL *info, int flags) > > freelist_partitions, > > nelem_alloc, > > nelem_alloc_first; > > - > > + void *curr_offset; > > + > > /* > > * If hash table is partitioned, give each freelist an > equal share of > > * the initial allocation. Otherwise only freeList[0] is > used. > > @@ -592,6 +596,20 @@ hash_create(const char *tabname, long nelem, const > HASHCTL *info, int flags) > > else > > freelist_partitions =3D 1; > > > > + /* > > + * If table is shared, calculate the offset at which to > find the > > + * the first partition of elements > > + */ > > + if (hashp->isshared) > > + { > > + int nsegs; > > + int nbuckets; > > + nsegs =3D find_num_of_segs(nelem, &nbuckets, > hctl->num_partitions, hctl->ssize); > > + > > + curr_offset =3D (((char *) hashp->hctl) + > sizeof(HASHHDR) + (info->dsize * sizeof(HASHSEGMENT)) + > > + + (sizeof(HASHBUCKET) * hctl->ssize * nsegs)); > > + } > > + > > Why only do this for shared hashtables? Couldn't we allocate the elments > together with the rest for non-share hashtables too? > I think it is possible to consolidate the allocations for non-shared hash tables too. However, initial elements are much smaller in non-shared hash tables due to their ease of expansion. Therefore, there is probably less benefit in trying to do that for non-shared tables. In addition, the proposed changes are targeted to improve the monitoring in pg_shmem_allocations which won't be applicable to non-shared hashtables. While I believe it is feasible, I am uncertain about the utility of such a change. > Seems a bit ugly to go through element_alloc() when pre-allocating. > Perhaps > it's the best thing we can do to avoid duplicating code, but it seems wor= th > checking if we can do better. Perhaps we could split element_alloc() into > element_alloc() and element_add() or such? With the latter doing > everything > after hashp->alloc(). > > Makes sense. I split the element_alloc() into element_alloc() and element_add(). > > > - > > + > > /* > > * initialize mutexes if it's a partitioned table > > */ > > Spurious change. > > Fixed. A function called find_num_of_segs() that also sets nbuckets seems a bit > confusing. I also don't like "find_*", as that sounds like it's searchin= g > some datastructure, rather than just doing a bit of math. > I renamed it to compute_buckets_and_segs(). I am open to better suggestions. > segp =3D (HASHSEGMENT) hashp->alloc(sizeof(HASHBUCKET) * > hashp->ssize); > > > > if (!segp) > > Spurious change. > Fixed. > -static int > > +int > > next_pow2_int(long num) > > { > > if (num > INT_MAX / 2) > > @@ -1957,3 +1995,31 @@ AtEOSubXact_HashTables(bool isCommit, int > nestDepth) > > } > > } > > } > > Why export this? > > It was a stale change, I removed it now > > diff --git a/src/include/utils/hsearch.h b/src/include/utils/hsearch.h > > index 932cc4f34d..5e16bd4183 100644 > > --- a/src/include/utils/hsearch.h > > +++ b/src/include/utils/hsearch.h > > @@ -151,7 +151,7 @@ extern void hash_seq_term(HASH_SEQ_STATUS *status); > > extern void hash_freeze(HTAB *hashp); > > extern Size hash_estimate_size(long num_entries, Size entrysize); > > extern long hash_select_dirsize(long num_entries); > > -extern Size hash_get_shared_size(HASHCTL *info, int flags); > > +extern Size hash_get_shared_size(HASHCTL *info, int flags, long > init_size); > > extern void AtEOXact_HashTables(bool isCommit); > > extern void AtEOSubXact_HashTables(bool isCommit, int nestDepth); > > It's imo a bit weird that we have very related logic in > hash_estimate_size() > and hash_get_shared_size(). Why do we need to duplicate it? > > hash_estimate_size() estimates using default values and hash_get_shared_size() calculates using specific values depending on the flags associated with the hash table. For instance, segment_size used by the former is DEF_SEGSIZE and the latter uses info->ssize which is set when the HASH_SEGMENT flag is true= . Hence, they might return different values for shared memory sizes. > > These I'd just combine with the ShmemInitStruct("PredXactList"), by > allocating > the additional space. The pointer math is a bit annoying, but it makes mu= ch > more sense to have one entry in pg_shmem_allocations. > > Fixed accordingly. > > > - (TransactionId *) ShmemAlloc(TotalProcs * > sizeof(*ProcGlobal->xids)); > > + (TransactionId *) ShmemInitStruct("Proc Transaction Ids", > TotalProcs * sizeof(*ProcGlobal->xids), &found); > > MemSet(ProcGlobal->xids, 0, TotalProcs * > sizeof(*ProcGlobal->xids)); > > - ProcGlobal->subxidStates =3D (XidCacheStatus *) > ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->subxidStates)); > > + ProcGlobal->subxidStates =3D (XidCacheStatus *) > ShmemInitStruct("Proc Sub-transaction id states", TotalProcs * > sizeof(*ProcGlobal->subxidStates), &found); > > MemSet(ProcGlobal->subxidStates, 0, TotalProcs * > sizeof(*ProcGlobal->subxidStates)); > > - ProcGlobal->statusFlags =3D (uint8 *) ShmemAlloc(TotalProcs * > sizeof(*ProcGlobal->statusFlags)); > > + ProcGlobal->statusFlags =3D (uint8 *) ShmemInitStruct("Proc Statu= s > Flags", TotalProcs * sizeof(*ProcGlobal->statusFlags), &found); > > MemSet(ProcGlobal->statusFlags, 0, TotalProcs * > sizeof(*ProcGlobal->statusFlags)); > > > > /* > > Same. > > Although here I'd say it's worth padding the size of each separate > "allocation" by PG_CACHE_LINE_SIZE. > Made this change. > > - fpPtr =3D ShmemAlloc(TotalProcs * (fpLockBitsSize + fpRelIdSize))= ; > > + fpPtr =3D ShmemInitStruct("Fast path lock arrays", TotalProcs * > (fpLockBitsSize + fpRelIdSize), &found); > > MemSet(fpPtr, 0, TotalProcs * (fpLockBitsSize + fpRelIdSize)); > > > > /* For asserts checking we did not overflow. */ > > This one might actually make sense to keep separate, depending on the > configuration it can be reasonably big (max_connection =3D 1k, > max_locks_per_transaction=3D1k results in ~5MB).. > > OK PFA the rebased patches with the above changes. Kindly let me know your views. Thank you, Rahila Syed --000000000000a6efd5062fae938c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

Thank you for the review= .


cfbot found a few compiler warnings:

https://cirrus-ci.com/task/6526903542087680
[16:47:46.964] make -s -j${BUILD_JOBS} clean
[16:47:47.452] time make -s -j${BUILD_JOBS} world-bin
[16:49:10.496] lwlock.c: In function =E2=80=98CreateLWLocks=E2=80=99:
[16:49:10.496] lwlock.c:467:22: error: unused variable =E2=80=98found=E2=80= =99 [-Werror=3Dunused-variable]
[16:49:10.496]=C2=A0 =C2=A0467 |=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0bool found;
[16:49:10.496]=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ^~~~~
[16:49:10.496] cc1: all warnings being treated as errors
[16:49:10.496] make[4]: *** [<builtin>: lwlock.o] Error 1
[16:49:10.496] make[3]: *** [../../../src/backend/common.mk:37: lmgr-recursiv= e] Error 2
[16:49:10.496] make[3]: *** Waiting for unfinished jobs....
[16:49:11.881] make[2]: *** [common.mk:37: storage-recursive] Error 2
[16:49:11.881] make[2]: *** Waiting for unfinished jobs....
[16:49:20.195] dynahash.c: In function =E2=80=98hash_create=E2=80=99:
[16:49:20.195] dynahash.c:643:37: error: =E2=80=98curr_offset=E2=80=99 may = be used uninitialized [-Werror=3Dmaybe-uninitialized]
[16:49:20.195]=C2=A0 =C2=A0643 |=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0curr_offset =3D (((char *)c= urr_offset) + (temp * elementSize));
[16:49:20.195]=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0~~~~~~~~~~~~^~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[16:49:20.195] dynahash.c:588:23: note: =E2=80=98curr_offset=E2=80=99 was d= eclared here
[16:49:20.195]=C2=A0 =C2=A0588 |=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0void *curr_offset;
[16:49:20.195]=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^~~~~~~~~~~
[16:49:20.195] cc1: all warnings being treated as errors
[16:49:20.196] make[4]: *** [<builtin>: dynahash.o] Error 1

=C2=A0
=C2=A0Fixed these.=C2=A0
=C2=A0<= /div>

> diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/has= h/dynahash.c
> index cd5a00132f..5203f5b30b 100644
> --- a/src/backend/utils/hash/dynahash.c
> +++ b/src/backend/utils/hash/dynahash.c
> @@ -120,7 +120,6 @@
>=C2=A0 =C2=A0* a good idea of the maximum number of entries!).=C2=A0 Fo= r non-shared hash
>=C2=A0 =C2=A0* tables, the initial directory size can be left at the de= fault.
>=C2=A0 =C2=A0*/
> -#define DEF_SEGSIZE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0256
>=C2=A0 #define DEF_SEGSIZE_SHIFT=C2=A0 =C2=A0 =C2=A0 =C2=A08=C2=A0 =C2= =A0 /* must be log2(DEF_SEGSIZE) */
>=C2=A0 #define DEF_DIRSIZE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0256

Why did you move this to the header? Afaict it's just used in
hash_get_shared_size(), which is also in dynahash.c?

=C2=A0
Yes. This was accidentally left behi= nd by the previous version of the
patch, so I undid the change.= =C2=A0


> @@ -468,7 +466,11 @@ hash_create(const char *tabname, long nelem, cons= t HASHCTL *info, int flags)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0else
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0hashp->keycop= y =3D memcpy;
>=C2=A0
> -=C2=A0 =C2=A0 =C2=A0/* And select the entry allocation function, too.= */
> +=C2=A0 =C2=A0 =C2=A0/*
> +=C2=A0 =C2=A0 =C2=A0 * And select the entry allocation function, too.= XXX should this also
> +=C2=A0 =C2=A0 =C2=A0 * Assert that flags & HASH_SHARED_MEM is tru= e, since HASH_ALLOC is
> +=C2=A0 =C2=A0 =C2=A0 * currently only set with HASH_SHARED_MEM *
> +=C2=A0 =C2=A0 =C2=A0 */
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if (flags & HASH_ALLOC)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0hashp->alloc = =3D info->alloc;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0else
> @@ -518,6 +520,7 @@ hash_create(const char *tabname, long nelem, const= HASHCTL *info, int flags)
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0hashp->frozen =3D false;
>=C2=A0
> +=C2=A0 =C2=A0 =C2=A0/* Initializing the HASHHDR variables with defaul= t values */
>=C2=A0 =C2=A0 =C2=A0 =C2=A0hdefault(hashp);
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0hctl =3D hashp->hctl;

I assume these were just observations you made while looking into this? The= y
seem unrelated to the change itself?
=C2=A0
Yes.= I removed the first one and left the second one as a code comment.=C2=A0=C2=A0

> @@ -582,7 +585,8 @@ hash_create(const char *tabname, long nelem, const= HASHCTL *info, int flags)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0freeli= st_partitions,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nelem_= alloc,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nelem_= alloc_first;
> -
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0void *curr_offset; > +=C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * If hash table= is partitioned, give each freelist an equal share of
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * the initial a= llocation.=C2=A0 Otherwise only freeList[0] is used.
> @@ -592,6 +596,20 @@ hash_create(const char *tabname, long nelem, cons= t HASHCTL *info, int flags)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0freelist_partitions =3D 1;
>=C2=A0
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * If table is shared= , calculate the offset at which to find the
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * the first partitio= n of elements
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (hashp->isshare= d)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0nsegs;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0nbuckets;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0nsegs =3D find_num_of_segs(nelem, &nbuckets, hctl->num_partit= ions, hctl->ssize);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0curr_offset =3D=C2=A0 (((char *) hashp->hctl) + sizeof(HASHHDR) += (info->dsize * sizeof(HASHSEGMENT)) +
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 + (sizeof(HASHBUCKET) * hctl->ssize * nsegs));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> +

Why only do this for shared hashtables? Couldn't we allocate the elment= s
together with the rest for non-share hashtables too?
<= br>I think it is possible to consolidate the allocations for non-shared has= h tables
too. However, initial elements are much smaller in non-shared h= ash tables due to
their ease of expansion. Therefore, there is probably= less benefit in trying to do
that for non-shared tables.
In additio= n, the proposed changes are targeted to improve the monitoring in=C2=A0
pg_shmem_allocations which won't=C2=A0be applicable to non-share= d hashtables.=C2=A0
While I believe it is feasible, I am uncertain about= the utility of such a change.=C2=A0


Seems a bit ugly to go through element_alloc() when pre-allocating.=C2=A0 P= erhaps
it's the best thing we can do to avoid duplicating code, but it seems w= orth
checking if we can do better. Perhaps we could split element_alloc() into element_alloc() and element_add() or such?=C2=A0 With the latter doing ever= ything
after hashp->alloc().

=C2=A0
Makes sense. I split the element_all= oc() into element_alloc() and element_add().
=C2=A0

> -
> +=C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 * initialize mutexes if it's a partitio= ned table
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 */

Spurious change.

=C2=A0
Fixed.=C2=A0

A function called find_num_of_segs() that also sets nbuckets seems a bit confusing.=C2=A0 I also don't like "find_*", as that sounds l= ike it's searching
some datastructure, rather than just doing a bit of math.
<= div>=C2=A0
=C2=A0I renamed it to compute_buckets_and_segs(). I am= open to better suggestions.=C2=A0

>=C2=A0 =C2=A0 =C2=A0 =C2=A0segp =3D (HASHSEGMENT) hashp->alloc(sizeo= f(HASHBUCKET) * hashp->ssize);
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!segp)

Spurious change.

Fixed.=C2=A0

> -static int
> +int
>=C2=A0 next_pow2_int(long num)
>=C2=A0 {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if (num > INT_MAX / 2)
> @@ -1957,3 +1995,31 @@ AtEOSubXact_HashTables(bool isCommit, int nestD= epth)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 }

Why export this?

It was a stale change, I removed it now=C2=A0

=C2=A0
> diff --git a/src/include/utils/hsearch.h b/src/include/utils/hsearch.h=
> index 932cc4f34d..5e16bd4183 100644
> --- a/src/include/utils/hsearch.h
> +++ b/src/include/utils/hsearch.h
> @@ -151,7 +151,7 @@ extern void hash_seq_term(HASH_SEQ_STATUS *status)= ;
>=C2=A0 extern void hash_freeze(HTAB *hashp);
>=C2=A0 extern Size hash_estimate_size(long num_entries, Size entrysize)= ;
>=C2=A0 extern long hash_select_dirsize(long num_entries);
> -extern Size hash_get_shared_size(HASHCTL *info, int flags);
> +extern Size hash_get_shared_size(HASHCTL *info, int flags, long init_= size);
>=C2=A0 extern void AtEOXact_HashTables(bool isCommit);
>=C2=A0 extern void AtEOSubXact_HashTables(bool isCommit, int nestDepth)= ;

It's imo a bit weird that we have very related logic in hash_estimate_s= ize()
and hash_get_shared_size(). Why do we need to duplicate it?

=C2=A0
hash_estimate_size() estimates using default val= ues and hash_get_shared_size()
calculates using specific values dependin= g on the flags associated with the hash
table.=C2=A0 For instance, segme= nt_size used by the former is DEF_SEGSIZE=C2=A0 and=C2=A0
the latter use= s info->ssize=C2=A0which is set when the HASH_SEGMENT flag is true.
H= ence, they might return different values for shared memory sizes.
=C2=A0

These I'd just combine with the ShmemInitStruct("PredXactList"= ;), by allocating
the additional space. The pointer math is a bit annoying, but it makes much=
more sense to have one entry in pg_shmem_allocations.

Fixed accordingly.
=C2=A0

> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(TransactionId *) Shm= emAlloc(TotalProcs * sizeof(*ProcGlobal->xids));
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(TransactionId *) Shm= emInitStruct("Proc Transaction Ids", TotalProcs * sizeof(*ProcGlo= bal->xids), &found);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0MemSet(ProcGlobal->xids, 0, TotalProcs * = sizeof(*ProcGlobal->xids));
> -=C2=A0 =C2=A0 =C2=A0ProcGlobal->subxidStates =3D (XidCacheStatus *= ) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->subxidStates));
> +=C2=A0 =C2=A0 =C2=A0ProcGlobal->subxidStates =3D (XidCacheStatus *= ) ShmemInitStruct("Proc Sub-transaction id states", TotalProcs * = sizeof(*ProcGlobal->subxidStates), &found);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0MemSet(ProcGlobal->subxidStates, 0, Total= Procs * sizeof(*ProcGlobal->subxidStates));
> -=C2=A0 =C2=A0 =C2=A0ProcGlobal->statusFlags =3D (uint8 *) ShmemAll= oc(TotalProcs * sizeof(*ProcGlobal->statusFlags));
> +=C2=A0 =C2=A0 =C2=A0ProcGlobal->statusFlags =3D (uint8 *) ShmemIni= tStruct("Proc Status Flags", TotalProcs * sizeof(*ProcGlobal->= statusFlags), &found);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0MemSet(ProcGlobal->statusFlags, 0, TotalP= rocs * sizeof(*ProcGlobal->statusFlags));
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0/*

Same.

Although here I'd say it's worth padding the size of each separate<= br> "allocation" by PG_CACHE_LINE_SIZE.

Made this change.
=C2=A0
> -=C2=A0 =C2=A0 =C2=A0fpPtr =3D ShmemAlloc(TotalProcs * (fpLockBitsSize= + fpRelIdSize));
> +=C2=A0 =C2=A0 =C2=A0fpPtr =3D ShmemInitStruct("Fast path lock ar= rays", TotalProcs * (fpLockBitsSize + fpRelIdSize), &found);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0MemSet(fpPtr, 0, TotalProcs * (fpLockBitsSiz= e + fpRelIdSize));
>=C2=A0
>=C2=A0 =C2=A0 =C2=A0 =C2=A0/* For asserts checking we did not overflow.= */

This one might actually make sense to keep separate, depending on the
configuration it can be reasonably big (max_connection =3D 1k,
max_locks_per_transaction=3D1k results in ~5MB)..

OK=C2=A0

PFA the rebased patches with the abov= e changes.

Kindly let me know your views.

Thank you,
Rahil= a Syed
--000000000000a6efd5062fae938c-- --000000000000a6efd7062fae938e Content-Type: application/octet-stream; name="v2-0002-Replace-ShmemAlloc-calls-by-ShmemInitStruct.patch" Content-Disposition: attachment; filename="v2-0002-Replace-ShmemAlloc-calls-by-ShmemInitStruct.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7xiqczc0 RnJvbSAyODU4NTk1OTk0Y2NjMWQ0OGE1MGMzMThjMDExYzIyZjhlNTZkN2U4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IFRodSwgNiBNYXIgMjAyNSAyMDozMjoyNyArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMi8y XSBSZXBsYWNlIFNobWVtQWxsb2MgY2FsbHMgYnkgU2htZW1Jbml0U3RydWN0CgpUaGUgc2hhcmVk IG1lbW9yeSBhbGxvY2F0ZWQgYnkgU2htZW1BbGxvYyBpcyBub3QgdHJhY2tlZApieSBwZ19zaG1l bV9hbGxvY2F0aW9ucy4gVGhpcyBjb21taXQgcmVwbGFjZXMgbW9zdCBvZiB0aGUKY2FsbHMgdG8g U2htZW1BbGxvYyBieSBTaG1lbUluaXRTdHJ1Y3QgdG8gYXNzb2NpYXRlIGEgbmFtZQp3aXRoIHRo ZSBhbGxvY2F0aW9ucyBhbmQgZW5zdXJlIHRoYXQgdGhleSBnZXQgdHJhY2tlZCBieQpwZ19zaG1l bV9hbGxvY2F0aW9ucy4gSXQgYWxzbyBtZXJnZXMgc2V2ZXJhbCBzbWFsbGVyClNobWVtQWxsb2Mg Y2FsbHMgaW50byBsYXJnZXIgU2htZW1Jbml0U3RydWN0IHRvIGFsbG9jYXRlCmFuZCB0cmFjayBh bGwgdGhlIHJlbGF0ZWQgbWVtb3J5IGFsbG9jYXRpb25zIHVuZGVyIHNpbmdsZQotLS0KIHNyYy9i YWNrZW5kL3N0b3JhZ2UvbG1nci9wcmVkaWNhdGUuYyB8IDE3ICsrKysrKysrLS0tLS0tLQogc3Jj L2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYyAgICAgIHwgMzEgKysrKysrKysrKysrKysrKysr KysrKystLS0tLQogMiBmaWxlcyBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJlZGljYXRlLmMg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJlZGljYXRlLmMKaW5kZXggNWIyMWEwNTM5OC4u ZGQ2Njk5MDMzNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3ByZWRpY2F0 ZS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcmVkaWNhdGUuYwpAQCAtMTIyNiw4 ICsxMjI2LDExIEBAIFByZWRpY2F0ZUxvY2tTaG1lbUluaXQodm9pZCkKIAkgKi8KIAltYXhfdGFi bGVfc2l6ZSAqPSAxMDsKIAorCXJlcXVlc3RTaXplID0gYWRkX3NpemUoUHJlZFhhY3RMaXN0RGF0 YVNpemUsCisJCQkJCQkgICAobXVsX3NpemUoKFNpemUpIG1heF90YWJsZV9zaXplLAorCQkJCQkJ CQkJIHNpemVvZihTRVJJQUxJWkFCTEVYQUNUKSkpKTsKIAlQcmVkWGFjdCA9IFNobWVtSW5pdFN0 cnVjdCgiUHJlZFhhY3RMaXN0IiwKLQkJCQkJCQkgICBQcmVkWGFjdExpc3REYXRhU2l6ZSwKKwkJ CQkJCQkgICByZXF1ZXN0U2l6ZSwKIAkJCQkJCQkgICAmZm91bmQpOwogCUFzc2VydChmb3VuZCA9 PSBJc1VuZGVyUG9zdG1hc3Rlcik7CiAJaWYgKCFmb3VuZCkKQEAgLTEyNDIsOSArMTI0NSw3IEBA IFByZWRpY2F0ZUxvY2tTaG1lbUluaXQodm9pZCkKIAkJUHJlZFhhY3QtPkxhc3RTeGFjdENvbW1p dFNlcU5vID0gRmlyc3ROb3JtYWxTZXJDb21taXRTZXFObyAtIDE7CiAJCVByZWRYYWN0LT5DYW5Q YXJ0aWFsQ2xlYXJUaHJvdWdoID0gMDsKIAkJUHJlZFhhY3QtPkhhdmVQYXJ0aWFsQ2xlYXJlZFRo cm91Z2ggPSAwOwotCQlyZXF1ZXN0U2l6ZSA9IG11bF9zaXplKChTaXplKSBtYXhfdGFibGVfc2l6 ZSwKLQkJCQkJCQkgICBzaXplb2YoU0VSSUFMSVpBQkxFWEFDVCkpOwotCQlQcmVkWGFjdC0+ZWxl bWVudCA9IFNobWVtQWxsb2MocmVxdWVzdFNpemUpOworCQlQcmVkWGFjdC0+ZWxlbWVudCA9IChT RVJJQUxJWkFCTEVYQUNUICopICgoY2hhciAqKSBQcmVkWGFjdCArIFByZWRYYWN0TGlzdERhdGFT aXplKTsKIAkJLyogQWRkIGFsbCBlbGVtZW50cyB0byBhdmFpbGFibGUgbGlzdCwgY2xlYW4uICov CiAJCW1lbXNldChQcmVkWGFjdC0+ZWxlbWVudCwgMCwgcmVxdWVzdFNpemUpOwogCQlmb3IgKGkg PSAwOyBpIDwgbWF4X3RhYmxlX3NpemU7IGkrKykKQEAgLTEyOTksOSArMTMwMCwxMSBAQCBQcmVk aWNhdGVMb2NrU2htZW1Jbml0KHZvaWQpCiAJICogcHJvYmFibHkgT0suCiAJICovCiAJbWF4X3Rh YmxlX3NpemUgKj0gNTsKKwlyZXF1ZXN0U2l6ZSA9IG11bF9zaXplKChTaXplKSBtYXhfdGFibGVf c2l6ZSwKKwkJCQkJCSAgIFJXQ29uZmxpY3REYXRhU2l6ZSk7CiAKIAlSV0NvbmZsaWN0UG9vbCA9 IFNobWVtSW5pdFN0cnVjdCgiUldDb25mbGljdFBvb2wiLAotCQkJCQkJCQkJIFJXQ29uZmxpY3RQ b29sSGVhZGVyRGF0YVNpemUsCisJCQkJCQkJCQkgUldDb25mbGljdFBvb2xIZWFkZXJEYXRhU2l6 ZSArIHJlcXVlc3RTaXplLAogCQkJCQkJCQkJICZmb3VuZCk7CiAJQXNzZXJ0KGZvdW5kID09IElz VW5kZXJQb3N0bWFzdGVyKTsKIAlpZiAoIWZvdW5kKQpAQCAtMTMwOSw5ICsxMzEyLDcgQEAgUHJl ZGljYXRlTG9ja1NobWVtSW5pdCh2b2lkKQogCQlpbnQJCQlpOwogCiAJCWRsaXN0X2luaXQoJlJX Q29uZmxpY3RQb29sLT5hdmFpbGFibGVMaXN0KTsKLQkJcmVxdWVzdFNpemUgPSBtdWxfc2l6ZSgo U2l6ZSkgbWF4X3RhYmxlX3NpemUsCi0JCQkJCQkJICAgUldDb25mbGljdERhdGFTaXplKTsKLQkJ UldDb25mbGljdFBvb2wtPmVsZW1lbnQgPSBTaG1lbUFsbG9jKHJlcXVlc3RTaXplKTsKKwkJUldD b25mbGljdFBvb2wtPmVsZW1lbnQgPSAoUldDb25mbGljdCkgKChjaGFyICopIFJXQ29uZmxpY3RQ b29sICsgUldDb25mbGljdFBvb2xIZWFkZXJEYXRhU2l6ZSk7CiAJCS8qIEFkZCBhbGwgZWxlbWVu dHMgdG8gYXZhaWxhYmxlIGxpc3QsIGNsZWFuLiAqLwogCQltZW1zZXQoUldDb25mbGljdFBvb2wt PmVsZW1lbnQsIDAsIHJlcXVlc3RTaXplKTsKIAkJZm9yIChpID0gMDsgaSA8IG1heF90YWJsZV9z aXplOyBpKyspCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYwppbmRleCA3NDlhNzlkNDhlLi40YmVmYmIw MzE4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCisrKyBiL3Ny Yy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMKQEAgLTg4LDYgKzg4LDcgQEAgc3RhdGljIHZv aWQgUmVtb3ZlUHJvY0Zyb21BcnJheShpbnQgY29kZSwgRGF0dW0gYXJnKTsKIHN0YXRpYyB2b2lk IFByb2NLaWxsKGludCBjb2RlLCBEYXR1bSBhcmcpOwogc3RhdGljIHZvaWQgQXV4aWxpYXJ5UHJv Y0tpbGwoaW50IGNvZGUsIERhdHVtIGFyZyk7CiBzdGF0aWMgdm9pZCBDaGVja0RlYWRMb2NrKHZv aWQpOworc3RhdGljIFNpemUgUEdQcm9jU2htZW1TaXplKHZvaWQpOwogCiAKIC8qCkBAIC0xNzUs NiArMTc2LDcgQEAgSW5pdFByb2NHbG9iYWwodm9pZCkKIAkJCSAgICpmcEVuZFB0ciBQR19VU0VE X0ZPUl9BU1NFUlRTX09OTFk7CiAJU2l6ZQkJZnBMb2NrQml0c1NpemUsCiAJCQkJZnBSZWxJZFNp emU7CisJU2l6ZQkJcmVxdWVzdFNpemU7CiAKIAkvKiBDcmVhdGUgdGhlIFByb2NHbG9iYWwgc2hh cmVkIHN0cnVjdHVyZSAqLwogCVByb2NHbG9iYWwgPSAoUFJPQ19IRFIgKikKQEAgLTIwNCw3ICsy MDYsMTAgQEAgSW5pdFByb2NHbG9iYWwodm9pZCkKIAkgKiB3aXRoIGEgc2luZ2xlIGZyZWVsaXN0 LikgIEVhY2ggUEdQUk9DIHN0cnVjdHVyZSBpcyBkZWRpY2F0ZWQgdG8gZXhhY3RseQogCSAqIG9u ZSBvZiB0aGVzZSBwdXJwb3NlcywgYW5kIHRoZXkgZG8gbm90IG1vdmUgYmV0d2VlbiBncm91cHMu CiAJICovCi0JcHJvY3MgPSAoUEdQUk9DICopIFNobWVtQWxsb2MoVG90YWxQcm9jcyAqIHNpemVv ZihQR1BST0MpKTsKKwlyZXF1ZXN0U2l6ZSA9IFBHUHJvY1NobWVtU2l6ZSgpOworCisJcHJvY3Mg PSAoUEdQUk9DICopIFNobWVtSW5pdFN0cnVjdCgiUEdQUk9DIHN0cnVjdHVyZXMiLCByZXF1ZXN0 U2l6ZSwgJmZvdW5kKTsKKwogCU1lbVNldChwcm9jcywgMCwgVG90YWxQcm9jcyAqIHNpemVvZihQ R1BST0MpKTsKIAlQcm9jR2xvYmFsLT5hbGxQcm9jcyA9IHByb2NzOwogCS8qIFhYWCBhbGxQcm9j Q291bnQgaXNuJ3QgcmVhbGx5IGFsbCBvZiB0aGVtOyBpdCBleGNsdWRlcyBwcmVwYXJlZCB4YWN0 cyAqLwpAQCAtMjE4LDExICsyMjMsMTEgQEAgSW5pdFByb2NHbG9iYWwodm9pZCkKIAkgKiBob3cg aG90bHkgdGhleSBhcmUgYWNjZXNzZWQuCiAJICovCiAJUHJvY0dsb2JhbC0+eGlkcyA9Ci0JCShU cmFuc2FjdGlvbklkICopIFNobWVtQWxsb2MoVG90YWxQcm9jcyAqIHNpemVvZigqUHJvY0dsb2Jh bC0+eGlkcykpOworCQkoVHJhbnNhY3Rpb25JZCAqKSAoKGNoYXIgKikgcHJvY3MgKyBUb3RhbFBy b2NzICogc2l6ZW9mKFBHUFJPQykpOwogCU1lbVNldChQcm9jR2xvYmFsLT54aWRzLCAwLCBUb3Rh bFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT54aWRzKSk7Ci0JUHJvY0dsb2JhbC0+c3VieGlk U3RhdGVzID0gKFhpZENhY2hlU3RhdHVzICopIFNobWVtQWxsb2MoVG90YWxQcm9jcyAqIHNpemVv ZigqUHJvY0dsb2JhbC0+c3VieGlkU3RhdGVzKSk7CisJUHJvY0dsb2JhbC0+c3VieGlkU3RhdGVz ID0gKFhpZENhY2hlU3RhdHVzICopICgoY2hhciAqKSBQcm9jR2xvYmFsLT54aWRzICsgVG90YWxQ cm9jcyAqIHNpemVvZigqUHJvY0dsb2JhbC0+eGlkcykgKyBQR19DQUNIRV9MSU5FX1NJWkUpOwog CU1lbVNldChQcm9jR2xvYmFsLT5zdWJ4aWRTdGF0ZXMsIDAsIFRvdGFsUHJvY3MgKiBzaXplb2Yo KlByb2NHbG9iYWwtPnN1YnhpZFN0YXRlcykpOwotCVByb2NHbG9iYWwtPnN0YXR1c0ZsYWdzID0g KHVpbnQ4ICopIFNobWVtQWxsb2MoVG90YWxQcm9jcyAqIHNpemVvZigqUHJvY0dsb2JhbC0+c3Rh dHVzRmxhZ3MpKTsKKwlQcm9jR2xvYmFsLT5zdGF0dXNGbGFncyA9ICh1aW50OCAqKSAoKGNoYXIg KikgUHJvY0dsb2JhbC0+c3VieGlkU3RhdGVzICsgVG90YWxQcm9jcyAqIHNpemVvZigqUHJvY0ds b2JhbC0+c3VieGlkU3RhdGVzKSArIFBHX0NBQ0hFX0xJTkVfU0laRSk7CiAJTWVtU2V0KFByb2NH bG9iYWwtPnN0YXR1c0ZsYWdzLCAwLCBUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT5z dGF0dXNGbGFncykpOwogCiAJLyoKQEAgLTIzMyw3ICsyMzgsNyBAQCBJbml0UHJvY0dsb2JhbCh2 b2lkKQogCWZwTG9ja0JpdHNTaXplID0gTUFYQUxJR04oRmFzdFBhdGhMb2NrR3JvdXBzUGVyQmFj a2VuZCAqIHNpemVvZih1aW50NjQpKTsKIAlmcFJlbElkU2l6ZSA9IE1BWEFMSUdOKEZhc3RQYXRo TG9ja1Nsb3RzUGVyQmFja2VuZCgpICogc2l6ZW9mKE9pZCkpOwogCi0JZnBQdHIgPSBTaG1lbUFs bG9jKFRvdGFsUHJvY3MgKiAoZnBMb2NrQml0c1NpemUgKyBmcFJlbElkU2l6ZSkpOworCWZwUHRy ID0gU2htZW1Jbml0U3RydWN0KCJGYXN0IHBhdGggbG9jayBhcnJheXMiLCBUb3RhbFByb2NzICog KGZwTG9ja0JpdHNTaXplICsgZnBSZWxJZFNpemUpLCAmZm91bmQpOwogCU1lbVNldChmcFB0ciwg MCwgVG90YWxQcm9jcyAqIChmcExvY2tCaXRzU2l6ZSArIGZwUmVsSWRTaXplKSk7CiAKIAkvKiBG b3IgYXNzZXJ0cyBjaGVja2luZyB3ZSBkaWQgbm90IG92ZXJmbG93LiAqLwpAQCAtMzM0LDYgKzMz OSwyMiBAQCBJbml0UHJvY0dsb2JhbCh2b2lkKQogCVNwaW5Mb2NrSW5pdChQcm9jU3RydWN0TG9j ayk7CiB9CiAKK3N0YXRpYyBTaXplCitQR1Byb2NTaG1lbVNpemUodm9pZCkKK3sKKwlTaXplCQlz aXplOworCXVpbnQzMgkJVG90YWxQcm9jcyA9IE1heEJhY2tlbmRzICsgTlVNX0FVWElMSUFSWV9Q Uk9DUyArIG1heF9wcmVwYXJlZF94YWN0czsKKworCXNpemUgPSBUb3RhbFByb2NzICogc2l6ZW9m KFBHUFJPQyk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFRvdGFsUHJvY3MgKiBzaXplb2YoKlBy b2NHbG9iYWwtPnhpZHMpKTsKKwlzaXplID0gYWRkX3NpemUoc2l6ZSwgUEdfQ0FDSEVfTElORV9T SVpFKTsKKwlzaXplID0gYWRkX3NpemUoc2l6ZSwgVG90YWxQcm9jcyAqIHNpemVvZigqUHJvY0ds b2JhbC0+c3VieGlkU3RhdGVzKSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFBHX0NBQ0hFX0xJ TkVfU0laRSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFRvdGFsUHJvY3MgKiBzaXplb2YoKlBy b2NHbG9iYWwtPnN0YXR1c0ZsYWdzKSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFBHX0NBQ0hF X0xJTkVfU0laRSk7CisJcmV0dXJuIHNpemU7Cit9CisKIC8qCiAgKiBJbml0UHJvY2VzcyAtLSBp bml0aWFsaXplIGEgcGVyLXByb2Nlc3MgUEdQUk9DIGVudHJ5IGZvciB0aGlzIGJhY2tlbmQKICAq LwotLSAKMi4zNC4xCgo= --000000000000a6efd7062fae938e Content-Type: application/octet-stream; name="v2-0001-Account-for-initial-shared-memory-allocated-by-hash_.patch" Content-Disposition: attachment; filename="v2-0001-Account-for-initial-shared-memory-allocated-by-hash_.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7xiqgth1 RnJvbSA2MDhkODY2N2ZiZDA1YjY5MDJjNGUxYWQxZDgxMGVkZjdkMGY3OGJmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IFRodSwgNiBNYXIgMjAyNSAyMDowNjoyMCArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMS8y XSBBY2NvdW50IGZvciBpbml0aWFsIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGVkIGJ5CiBoYXNoX2Ny ZWF0ZQoKcGdfc2htZW1fYWxsb2NhdGlvbnMgdHJhY2tzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5 IFNobWVtSW5pdFN0cnVjdCwKd2hpY2gsIGluIGNhc2Ugb2Ygc2hhcmVkIGhhc2ggdGFibGVzLCBv bmx5IGNvdmVycyBtZW1vcnkgYWxsb2NhdGVkCnRvIHRoZSBoYXNoIGRpcmVjdG9yeSBhbmQgY29u dHJvbCBzdHJ1Y3R1cmUuIFRoZSBoYXNoIHNlZ21lbnRzIGFuZApidWNrZXRzIGFyZSBhbGxvY2F0 ZWQgdXNpbmcgU2htZW1BbGxvY05vRXJyb3Igd2hpY2ggZG9lcyBub3QgYXR0cmlidXRlCnRoZSBh bGxvY2F0aW9ucyB0byB0aGUgaGFzaCB0YWJsZSBuYW1lLiBUaHVzLCB0aGVzZSBhbGxvY2F0aW9u cyBhcmUKbm90IHRyYWNrZWQgaW4gcGdfc2htZW1fYWxsb2NhdGlvbnMuCgpJbmNsdWRlIHRoZSBh bGxvY2F0aW9uIG9mIHNlZ21lbnRzLCBidWNrZXRzIGFuZCBlbGVtZW50cyBpbiB0aGUgaW5pdGlh bAphbGxvY2F0aW9uIG9mIHNoYXJlZCBoYXNoIGRpcmVjdG9yeS4gVGhpcyByZXN1bHRzIGluIHRo ZSBleGlzdGluZyBTaG1lbUluZGV4CmVudHJpZXMgdG8gcmVmbGVjdCBhbGwgdGhlc2UgYWxsb2Nh dGlvbnMuIFRoZSByZXN1bHRpbmcgdHVwbGVzIGluCnBnX3NobWVtX2FsbG9jYXRpb25zIHJlcHJl c2VudCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW5pdGlhbCBoYXNoIHRhYmxlCmluY2x1ZGluZyBh bGwgdGhlIGJ1Y2tldHMgYW5kIHRoZSBlbGVtZW50cyB0aGV5IGNvbnRhaW4sIGluc3RlYWQgb2Yg anVzdAp0aGUgZGlyZWN0b3J5IHNpemUuCi0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc2ht ZW0uYyAgIHwgICAzICstCiBzcmMvYmFja2VuZC91dGlscy9oYXNoL2R5bmFoYXNoLmMgfCAxNzIg KysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiBzcmMvaW5jbHVkZS91dGlscy9oc2VhcmNo LmggICAgICAgfCAgIDIgKy0KIDMgZmlsZXMgY2hhbmdlZCwgMTM1IGluc2VydGlvbnMoKyksIDQy IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVt LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9zaG1lbS5jCmluZGV4IDg5NWE0M2ZiMzkuLmM1 NmU5YjZjNzcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVtLmMKKysr IGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc2htZW0uYwpAQCAtNzMsNiArNzMsNyBAQAogI2lu Y2x1ZGUgInN0b3JhZ2Uvc2htZW0uaCIKICNpbmNsdWRlICJzdG9yYWdlL3NwaW4uaCIKICNpbmNs dWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2R5bmFoYXNoLmgiCiAKIHN0 YXRpYyB2b2lkICpTaG1lbUFsbG9jUmF3KFNpemUgc2l6ZSwgU2l6ZSAqYWxsb2NhdGVkX3NpemUp OwogCkBAIC0zNDYsNyArMzQ3LDcgQEAgU2htZW1Jbml0SGFzaChjb25zdCBjaGFyICpuYW1lLAkJ LyogdGFibGUgc3RyaW5nIG5hbWUgZm9yIHNobWVtIGluZGV4ICovCiAKIAkvKiBsb29rIGl0IHVw IGluIHRoZSBzaG1lbSBpbmRleCAqLwogCWxvY2F0aW9uID0gU2htZW1Jbml0U3RydWN0KG5hbWUs Ci0JCQkJCQkJICAgaGFzaF9nZXRfc2hhcmVkX3NpemUoaW5mb1AsIGhhc2hfZmxhZ3MpLAorCQkJ CQkJCSAgIGhhc2hfZ2V0X3NoYXJlZF9zaXplKGluZm9QLCBoYXNoX2ZsYWdzLCBpbml0X3NpemUp LAogCQkJCQkJCSAgICZmb3VuZCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvaGFzaC9keW5haGFzaC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvaGFzaC9keW5haGFzaC5jCmlu ZGV4IGNkNWEwMDEzMmYuLjBjNjZkNjNmOGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2hhc2gvZHluYWhhc2guYworKysgYi9zcmMvYmFja2VuZC91dGlscy9oYXNoL2R5bmFoYXNoLmMK QEAgLTI2NSw3ICsyNjUsNyBAQCBzdGF0aWMgbG9uZyBoYXNoX2FjY2Vzc2VzLAogICovCiBzdGF0 aWMgdm9pZCAqRHluYUhhc2hBbGxvYyhTaXplIHNpemUpOwogc3RhdGljIEhBU0hTRUdNRU5UIHNl Z19hbGxvYyhIVEFCICpoYXNocCk7Ci1zdGF0aWMgYm9vbCBlbGVtZW50X2FsbG9jKEhUQUIgKmhh c2hwLCBpbnQgbmVsZW0sIGludCBmcmVlbGlzdF9pZHgpOworc3RhdGljIEhBU0hFTEVNRU5UICpl bGVtZW50X2FsbG9jKEhUQUIgKmhhc2hwLCBpbnQgbmVsZW0pOwogc3RhdGljIGJvb2wgZGlyX3Jl YWxsb2MoSFRBQiAqaGFzaHApOwogc3RhdGljIGJvb2wgZXhwYW5kX3RhYmxlKEhUQUIgKmhhc2hw KTsKIHN0YXRpYyBIQVNIQlVDS0VUIGdldF9oYXNoX2VudHJ5KEhUQUIgKmhhc2hwLCBpbnQgZnJl ZWxpc3RfaWR4KTsKQEAgLTI4MSw2ICsyODEsOSBAQCBzdGF0aWMgdm9pZCByZWdpc3Rlcl9zZXFf c2NhbihIVEFCICpoYXNocCk7CiBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyX3NlcV9zY2FuKEhUQUIg Kmhhc2hwKTsKIHN0YXRpYyBib29sIGhhc19zZXFfc2NhbnMoSFRBQiAqaGFzaHApOwogCitzdGF0 aWMgaW50CWNvbXB1dGVfYnVja2V0c19hbmRfc2Vncyhsb25nIG5lbGVtLCBpbnQgKm5idWNrZXRz LAorCQkJCQkJCQkJIGxvbmcgbnVtX3BhcnRpdGlvbnMsIGxvbmcgc3NpemUpOworc3RhdGljIHZv aWQgZWxlbWVudF9hZGQoSFRBQiAqaGFzaHAsIEhBU0hFTEVNRU5UICpmaXJzdEVsZW1lbnQsIGlu dCBmcmVlbGlzdF9pZHgsIGludCBuZWxlbSk7CiAKIC8qCiAgKiBtZW1vcnkgYWxsb2NhdGlvbiBz dXBwb3J0CkBAIC01MTgsNiArNTIxLDcgQEAgaGFzaF9jcmVhdGUoY29uc3QgY2hhciAqdGFibmFt ZSwgbG9uZyBuZWxlbSwgY29uc3QgSEFTSENUTCAqaW5mbywgaW50IGZsYWdzKQogCiAJaGFzaHAt PmZyb3plbiA9IGZhbHNlOwogCisJLyogSW5pdGlhbGl6aW5nIHRoZSBIQVNISERSIHZhcmlhYmxl cyB3aXRoIGRlZmF1bHQgdmFsdWVzICovCiAJaGRlZmF1bHQoaGFzaHApOwogCiAJaGN0bCA9IGhh c2hwLT5oY3RsOwpAQCAtNTgyLDYgKzU4Niw3IEBAIGhhc2hfY3JlYXRlKGNvbnN0IGNoYXIgKnRh Ym5hbWUsIGxvbmcgbmVsZW0sIGNvbnN0IEhBU0hDVEwgKmluZm8sIGludCBmbGFncykKIAkJCQkJ ZnJlZWxpc3RfcGFydGl0aW9ucywKIAkJCQkJbmVsZW1fYWxsb2MsCiAJCQkJCW5lbGVtX2FsbG9j X2ZpcnN0OworCQl2b2lkCSAgICpjdXJyX29mZnNldCA9IE5VTEw7CiAKIAkJLyoKIAkJICogSWYg aGFzaCB0YWJsZSBpcyBwYXJ0aXRpb25lZCwgZ2l2ZSBlYWNoIGZyZWVsaXN0IGFuIGVxdWFsIHNo YXJlIG9mCkBAIC01OTIsNiArNTk3LDIxIEBAIGhhc2hfY3JlYXRlKGNvbnN0IGNoYXIgKnRhYm5h bWUsIGxvbmcgbmVsZW0sIGNvbnN0IEhBU0hDVEwgKmluZm8sIGludCBmbGFncykKIAkJZWxzZQog CQkJZnJlZWxpc3RfcGFydGl0aW9ucyA9IDE7CiAKKwkJLyoKKwkJICogSWYgdGFibGUgaXMgc2hh cmVkLCBjYWxjdWxhdGUgdGhlIG9mZnNldCBhdCB3aGljaCB0byBmaW5kIHRoZSB0aGUKKwkJICog Zmlyc3QgcGFydGl0aW9uIG9mIGVsZW1lbnRzCisJCSAqLworCQlpZiAoaGFzaHAtPmlzc2hhcmVk KQorCQl7CisJCQlpbnQJCQluc2VnczsKKwkJCWludAkJCW5idWNrZXRzOworCisJCQluc2VncyA9 IGNvbXB1dGVfYnVja2V0c19hbmRfc2VncyhuZWxlbSwgJm5idWNrZXRzLCBoY3RsLT5udW1fcGFy dGl0aW9ucywgaGN0bC0+c3NpemUpOworCisJCQljdXJyX29mZnNldCA9ICgoKGNoYXIgKikgaGFz aHAtPmhjdGwpICsgc2l6ZW9mKEhBU0hIRFIpICsgKGluZm8tPmRzaXplICogc2l6ZW9mKEhBU0hT RUdNRU5UKSkgKworCQkJCQkJICAgKyhzaXplb2YoSEFTSEJVQ0tFVCkgKiBoY3RsLT5zc2l6ZSAq IG5zZWdzKSk7CisJCX0KKwogCQluZWxlbV9hbGxvYyA9IG5lbGVtIC8gZnJlZWxpc3RfcGFydGl0 aW9uczsKIAkJaWYgKG5lbGVtX2FsbG9jIDw9IDApCiAJCQluZWxlbV9hbGxvYyA9IDE7CkBAIC02 MDksMTEgKzYyOSwyNyBAQCBoYXNoX2NyZWF0ZShjb25zdCBjaGFyICp0YWJuYW1lLCBsb25nIG5l bGVtLCBjb25zdCBIQVNIQ1RMICppbmZvLCBpbnQgZmxhZ3MpCiAJCWZvciAoaSA9IDA7IGkgPCBm cmVlbGlzdF9wYXJ0aXRpb25zOyBpKyspCiAJCXsKIAkJCWludAkJCXRlbXAgPSAoaSA9PSAwKSA/ IG5lbGVtX2FsbG9jX2ZpcnN0IDogbmVsZW1fYWxsb2M7CisJCQlIQVNIRUxFTUVOVCAqZmlyc3RF bGVtZW50OworCQkJU2l6ZQkJZWxlbWVudFNpemUgPSBNQVhBTElHTihzaXplb2YoSEFTSEVMRU1F TlQpKSArIE1BWEFMSUdOKGhjdGwtPmVudHJ5c2l6ZSk7CiAKLQkJCWlmICghZWxlbWVudF9hbGxv YyhoYXNocCwgdGVtcCwgaSkpCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVS UkNPREVfT1VUX09GX01FTU9SWSksCi0JCQkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IikpKTsK KwkJCS8qCisJCQkgKiBNZW1vcnkgaXMgYWxsb2NhdGVkIGFzIHBhcnQgb2YgaW5pdGlhbCBhbGxv Y2F0aW9uIGluCisJCQkgKiBTaG1lbUluaXRIYXNoCisJCQkgKi8KKwkJCWlmIChoYXNocC0+aXNz aGFyZWQpCisJCQl7CisJCQkJZmlyc3RFbGVtZW50ID0gKEhBU0hFTEVNRU5UICopIGN1cnJfb2Zm c2V0OworCQkJCWN1cnJfb2Zmc2V0ID0gKCgoY2hhciAqKSBjdXJyX29mZnNldCkgKyAodGVtcCAq IGVsZW1lbnRTaXplKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZmlyc3RFbGVtZW50ID0g ZWxlbWVudF9hbGxvYyhoYXNocCwgdGVtcCk7CisJCQkJaWYgKCFmaXJzdEVsZW1lbnQpCisJCQkJ CWVyZXBvcnQoRVJST1IsCisJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9PVVRfT0ZfTUVNT1JZKSwK KwkJCQkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IikpKTsKKwkJCX0KKwkJCWVsZW1lbnRfYWRk KGhhc2hwLCBmaXJzdEVsZW1lbnQsIGksIHRlbXApOwogCQl9CiAJfQogCkBAIC03MDEsMzAgKzcz NywxMSBAQCBpbml0X2h0YWIoSFRBQiAqaGFzaHAsIGxvbmcgbmVsZW0pCiAJCWZvciAoaSA9IDA7 IGkgPCBOVU1fRlJFRUxJU1RTOyBpKyspCiAJCQlTcGluTG9ja0luaXQoJihoY3RsLT5mcmVlTGlz dFtpXS5tdXRleCkpOwogCi0JLyoKLQkgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5leHQgZ3Jl YXRlciBwb3dlciBvZiB0d28gbnVtYmVyIG9mIGJ1Y2tldHMsCi0JICogYXNzdW1pbmcgYSBkZXNp cmVkIG1heGltdW0gbG9hZCBmYWN0b3Igb2YgMS4KLQkgKi8KLQluYnVja2V0cyA9IG5leHRfcG93 Ml9pbnQobmVsZW0pOwotCi0JLyoKLQkgKiBJbiBhIHBhcnRpdGlvbmVkIHRhYmxlLCBuYnVja2V0 cyBtdXN0IGJlIGF0IGxlYXN0IGVxdWFsIHRvCi0JICogbnVtX3BhcnRpdGlvbnM7IHdlcmUgaXQg bGVzcywga2V5cyB3aXRoIGFwcGFyZW50bHkgZGlmZmVyZW50IHBhcnRpdGlvbgotCSAqIG51bWJl cnMgd291bGQgbWFwIHRvIHRoZSBzYW1lIGJ1Y2tldCwgYnJlYWtpbmcgcGFydGl0aW9uIGluZGVw ZW5kZW5jZS4KLQkgKiAoTm9ybWFsbHkgbmJ1Y2tldHMgd2lsbCBiZSBtdWNoIGJpZ2dlcjsgdGhp cyBpcyBqdXN0IGEgc2FmZXR5IGNoZWNrLikKLQkgKi8KLQl3aGlsZSAobmJ1Y2tldHMgPCBoY3Rs LT5udW1fcGFydGl0aW9ucykKLQkJbmJ1Y2tldHMgPDw9IDE7CisJbnNlZ3MgPSBjb21wdXRlX2J1 Y2tldHNfYW5kX3NlZ3MobmVsZW0sICZuYnVja2V0cywgaGN0bC0+bnVtX3BhcnRpdGlvbnMsIGhj dGwtPnNzaXplKTsKIAogCWhjdGwtPm1heF9idWNrZXQgPSBoY3RsLT5sb3dfbWFzayA9IG5idWNr ZXRzIC0gMTsKIAloY3RsLT5oaWdoX21hc2sgPSAobmJ1Y2tldHMgPDwgMSkgLSAxOwogCi0JLyoK LQkgKiBGaWd1cmUgbnVtYmVyIG9mIGRpcmVjdG9yeSBzZWdtZW50cyBuZWVkZWQsIHJvdW5kIHVw IHRvIGEgcG93ZXIgb2YgMgotCSAqLwotCW5zZWdzID0gKG5idWNrZXRzIC0gMSkgLyBoY3RsLT5z c2l6ZSArIDE7Ci0JbnNlZ3MgPSBuZXh0X3BvdzJfaW50KG5zZWdzKTsKLQogCS8qCiAJICogTWFr ZSBzdXJlIGRpcmVjdG9yeSBpcyBiaWcgZW5vdWdoLiBJZiBwcmUtYWxsb2NhdGVkIGRpcmVjdG9y eSBpcyB0b28KIAkgKiBzbWFsbCwgY2hva2UgKGNhbGxlciBzY3Jld2VkIHVwKS4KQEAgLTc0OCwx MSArNzY1LDIyIEBAIGluaXRfaHRhYihIVEFCICpoYXNocCwgbG9uZyBuZWxlbSkKIAl9CiAKIAkv KiBBbGxvY2F0ZSBpbml0aWFsIHNlZ21lbnRzICovCisJaSA9IDA7CiAJZm9yIChzZWdwID0gaGFz aHAtPmRpcjsgaGN0bC0+bnNlZ3MgPCBuc2VnczsgaGN0bC0+bnNlZ3MrKywgc2VncCsrKQogCXsK LQkJKnNlZ3AgPSBzZWdfYWxsb2MoaGFzaHApOworCQlpZiAoaGFzaHAtPmlzc2hhcmVkKQorCQl7 CisJCQkqc2VncCA9IChIQVNIQlVDS0VUICopICgoKGNoYXIgKikgaGFzaHAtPmhjdGwpCisJCQkJ CQkJCQkrIHNpemVvZihIQVNISERSKQorCQkJCQkJCQkJKyAoaGFzaHAtPmhjdGwtPmRzaXplICog c2l6ZW9mKEhBU0hTRUdNRU5UKSkKKwkJCQkJCQkJCSsgKGkgKiBzaXplb2YoSEFTSEJVQ0tFVCkg KiBoYXNocC0+c3NpemUpKTsKKwkJCU1lbVNldCgqc2VncCwgMCwgc2l6ZW9mKEhBU0hCVUNLRVQp ICogaGFzaHAtPnNzaXplKTsKKwkJfQorCQllbHNlCisJCQkqc2VncCA9IHNlZ19hbGxvYyhoYXNo cCk7CiAJCWlmICgqc2VncCA9PSBOVUxMKQogCQkJcmV0dXJuIGZhbHNlOworCQlpID0gaSArIDE7 CiAJfQogCiAJLyogQ2hvb3NlIG51bWJlciBvZiBlbnRyaWVzIHRvIGFsbG9jYXRlIGF0IGEgdGlt ZSAqLwpAQCAtODUxLDExICs4NzksMzYgQEAgaGFzaF9zZWxlY3RfZGlyc2l6ZShsb25nIG51bV9l bnRyaWVzKQogICogYW5kIGZvciB0aGUgKG5vbiBleHBhbnNpYmxlKSBkaXJlY3RvcnkuCiAgKi8K IFNpemUKLWhhc2hfZ2V0X3NoYXJlZF9zaXplKEhBU0hDVEwgKmluZm8sIGludCBmbGFncykKK2hh c2hfZ2V0X3NoYXJlZF9zaXplKEhBU0hDVEwgKmluZm8sIGludCBmbGFncywgbG9uZyBpbml0X3Np emUpCiB7CisJaW50CQkJbmJ1Y2tldHM7CisJaW50CQkJbnNlZ3M7CisJaW50CQkJbnVtX3BhcnRp dGlvbnM7CisJaW50CQkJc3NpemU7CisJU2l6ZQkJZWxlbWVudFNpemUgPSBNQVhBTElHTihzaXpl b2YoSEFTSEVMRU1FTlQpKSArIE1BWEFMSUdOKGluZm8tPmVudHJ5c2l6ZSk7CisKIAlBc3NlcnQo ZmxhZ3MgJiBIQVNIX0RJUlNJWkUpOwogCUFzc2VydChpbmZvLT5kc2l6ZSA9PSBpbmZvLT5tYXhf ZHNpemUpOwotCXJldHVybiBzaXplb2YoSEFTSEhEUikgKyBpbmZvLT5kc2l6ZSAqIHNpemVvZihI QVNIU0VHTUVOVCk7CisKKwlpZiAoZmxhZ3MgJiBIQVNIX1BBUlRJVElPTikKKwkJbnVtX3BhcnRp dGlvbnMgPSBpbmZvLT5udW1fcGFydGl0aW9uczsKKwllbHNlCisJCW51bV9wYXJ0aXRpb25zID0g MDsKKworCWlmIChmbGFncyAmIEhBU0hfU0VHTUVOVCkKKwkJc3NpemUgPSBpbmZvLT5zc2l6ZTsK KwllbHNlCisJCXNzaXplID0gREVGX1NFR1NJWkU7CisKKwluc2VncyA9IGNvbXB1dGVfYnVja2V0 c19hbmRfc2Vncyhpbml0X3NpemUsICZuYnVja2V0cywgbnVtX3BhcnRpdGlvbnMsIHNzaXplKTsK KworCS8qIE51bWJlciBvZiBlbnRyaWVzIHNob3VsZCBiZSBhdGxlYXN0IGVxdWFsIHRvIG51bWJl ciBvZiBwYXJ0aXRpb25zICovCisJaWYgKGluaXRfc2l6ZSA8IG51bV9wYXJ0aXRpb25zKQorCQlp bml0X3NpemUgPSBudW1fcGFydGl0aW9uczsKKworCXJldHVybiBzaXplb2YoSEFTSEhEUikgKyBp bmZvLT5kc2l6ZSAqIHNpemVvZihIQVNIU0VHTUVOVCkgKworCQkrc2l6ZW9mKEhBU0hCVUNLRVQp ICogc3NpemUgKiBuc2VncworCQkrIGluaXRfc2l6ZSAqIGVsZW1lbnRTaXplOwogfQogCiAKQEAg LTEyODUsNyArMTMzOCw4IEBAIGdldF9oYXNoX2VudHJ5KEhUQUIgKmhhc2hwLCBpbnQgZnJlZWxp c3RfaWR4KQogCQkgKiBGYWlsaW5nIGJlY2F1c2UgdGhlIG5lZWRlZCBlbGVtZW50IGlzIGluIGEg ZGlmZmVyZW50IGZyZWVsaXN0IGlzCiAJCSAqIG5vdCBhY2NlcHRhYmxlLgogCQkgKi8KLQkJaWYg KCFlbGVtZW50X2FsbG9jKGhhc2hwLCBoY3RsLT5uZWxlbV9hbGxvYywgZnJlZWxpc3RfaWR4KSkK KwkJbmV3RWxlbWVudCA9IGVsZW1lbnRfYWxsb2MoaGFzaHAsIGhjdGwtPm5lbGVtX2FsbG9jKTsK KwkJaWYgKG5ld0VsZW1lbnQgPT0gTlVMTCkKIAkJewogCQkJaW50CQkJYm9ycm93X2Zyb21faWR4 OwogCkBAIC0xMzIyLDYgKzEzNzYsNyBAQCBnZXRfaGFzaF9lbnRyeShIVEFCICpoYXNocCwgaW50 IGZyZWVsaXN0X2lkeCkKIAkJCS8qIG5vIGVsZW1lbnRzIGF2YWlsYWJsZSB0byBib3Jyb3cgZWl0 aGVyLCBzbyBvdXQgb2YgbWVtb3J5ICovCiAJCQlyZXR1cm4gTlVMTDsKIAkJfQorCQllbGVtZW50 X2FkZChoYXNocCwgbmV3RWxlbWVudCwgZnJlZWxpc3RfaWR4LCBoY3RsLT5uZWxlbV9hbGxvYyk7 CiAJfQogCiAJLyogcmVtb3ZlIGVudHJ5IGZyb20gZnJlZWxpc3QsIGJ1bXAgbmVudHJpZXMgKi8K QEAgLTE3MDIsMjggKzE3NTcsMzggQEAgc2VnX2FsbG9jKEhUQUIgKmhhc2hwKQogLyoKICAqIGFs bG9jYXRlIHNvbWUgbmV3IGVsZW1lbnRzIGFuZCBsaW5rIHRoZW0gaW50byB0aGUgaW5kaWNhdGVk IGZyZWUgbGlzdAogICovCi1zdGF0aWMgYm9vbAotZWxlbWVudF9hbGxvYyhIVEFCICpoYXNocCwg aW50IG5lbGVtLCBpbnQgZnJlZWxpc3RfaWR4KQorc3RhdGljIEhBU0hFTEVNRU5UICoKK2VsZW1l bnRfYWxsb2MoSFRBQiAqaGFzaHAsIGludCBuZWxlbSkKIHsKIAlIQVNISERSICAgICpoY3RsID0g aGFzaHAtPmhjdGw7CiAJU2l6ZQkJZWxlbWVudFNpemU7Ci0JSEFTSEVMRU1FTlQgKmZpcnN0RWxl bWVudDsKLQlIQVNIRUxFTUVOVCAqdG1wRWxlbWVudDsKLQlIQVNIRUxFTUVOVCAqcHJldkVsZW1l bnQ7Ci0JaW50CQkJaTsKKwlIQVNIRUxFTUVOVCAqZmlyc3RFbGVtZW50ID0gTlVMTDsKIAogCWlm IChoYXNocC0+aXNmaXhlZCkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAogCS8q IEVhY2ggZWxlbWVudCBoYXMgYSBIQVNIRUxFTUVOVCBoZWFkZXIgcGx1cyB1c2VyIGRhdGEuICov CiAJZWxlbWVudFNpemUgPSBNQVhBTElHTihzaXplb2YoSEFTSEVMRU1FTlQpKSArIE1BWEFMSUdO KGhjdGwtPmVudHJ5c2l6ZSk7Ci0KIAlDdXJyZW50RHluYUhhc2hDeHQgPSBoYXNocC0+aGN4dDsK IAlmaXJzdEVsZW1lbnQgPSAoSEFTSEVMRU1FTlQgKikgaGFzaHAtPmFsbG9jKG5lbGVtICogZWxl bWVudFNpemUpOwogCiAJaWYgKCFmaXJzdEVsZW1lbnQpCi0JCXJldHVybiBmYWxzZTsKKwkJcmV0 dXJuIE5VTEw7CiAKKwlyZXR1cm4gZmlyc3RFbGVtZW50OworfQorCitzdGF0aWMgdm9pZAorZWxl bWVudF9hZGQoSFRBQiAqaGFzaHAsIEhBU0hFTEVNRU5UICpmaXJzdEVsZW1lbnQsIGludCBmcmVl bGlzdF9pZHgsIGludCBuZWxlbSkKK3sKKwlIQVNISERSICAgICpoY3RsID0gaGFzaHAtPmhjdGw7 CisJU2l6ZQkJZWxlbWVudFNpemU7CisJSEFTSEVMRU1FTlQgKnRtcEVsZW1lbnQ7CisJSEFTSEVM RU1FTlQgKnByZXZFbGVtZW50OworCWludAkJCWk7CisKKwkvKiBFYWNoIGVsZW1lbnQgaGFzIGEg SEFTSEVMRU1FTlQgaGVhZGVyIHBsdXMgdXNlciBkYXRhLiAqLworCWVsZW1lbnRTaXplID0gTUFY QUxJR04oc2l6ZW9mKEhBU0hFTEVNRU5UKSkgKyBNQVhBTElHTihoY3RsLT5lbnRyeXNpemUpOwog CS8qIHByZXBhcmUgdG8gbGluayBhbGwgdGhlIG5ldyBlbnRyaWVzIGludG8gdGhlIGZyZWVsaXN0 ICovCiAJcHJldkVsZW1lbnQgPSBOVUxMOwogCXRtcEVsZW1lbnQgPSBmaXJzdEVsZW1lbnQ7CkBA IC0xNzQ0LDggKzE4MDksNiBAQCBlbGVtZW50X2FsbG9jKEhUQUIgKmhhc2hwLCBpbnQgbmVsZW0s IGludCBmcmVlbGlzdF9pZHgpCiAKIAlpZiAoSVNfUEFSVElUSU9ORUQoaGN0bCkpCiAJCVNwaW5M b2NrUmVsZWFzZSgmaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5tdXRleCk7Ci0KLQlyZXR1 cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTE5NTcsMyArMjAyMCwzMiBAQCBBdEVPU3ViWGFjdF9IYXNo VGFibGVzKGJvb2wgaXNDb21taXQsIGludCBuZXN0RGVwdGgpCiAJCX0KIAl9CiB9CisKK3N0YXRp YyBpbnQKK2NvbXB1dGVfYnVja2V0c19hbmRfc2Vncyhsb25nIG5lbGVtLCBpbnQgKm5idWNrZXRz LCBsb25nIG51bV9wYXJ0aXRpb25zLCBsb25nIHNzaXplKQoreworCWludAkJCW5zZWdzOworCisJ LyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5leHQgZ3JlYXRlciBwb3dlciBvZiB0d28g bnVtYmVyIG9mIGJ1Y2tldHMsCisJICogYXNzdW1pbmcgYSBkZXNpcmVkIG1heGltdW0gbG9hZCBm YWN0b3Igb2YgMS4KKwkgKi8KKwkqbmJ1Y2tldHMgPSBuZXh0X3BvdzJfaW50KG5lbGVtKTsKKwor CS8qCisJICogSW4gYSBwYXJ0aXRpb25lZCB0YWJsZSwgbmJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFz dCBlcXVhbCB0bworCSAqIG51bV9wYXJ0aXRpb25zOyB3ZXJlIGl0IGxlc3MsIGtleXMgd2l0aCBh cHBhcmVudGx5IGRpZmZlcmVudCBwYXJ0aXRpb24KKwkgKiBudW1iZXJzIHdvdWxkIG1hcCB0byB0 aGUgc2FtZSBidWNrZXQsIGJyZWFraW5nIHBhcnRpdGlvbiBpbmRlcGVuZGVuY2UuCisJICogKE5v cm1hbGx5IG5idWNrZXRzIHdpbGwgYmUgbXVjaCBiaWdnZXI7IHRoaXMgaXMganVzdCBhIHNhZmV0 eSBjaGVjay4pCisJICovCisJd2hpbGUgKCgqbmJ1Y2tldHMpIDwgbnVtX3BhcnRpdGlvbnMpCisJ CSgqbmJ1Y2tldHMpIDw8PSAxOworCisKKwkvKgorCSAqIEZpZ3VyZSBudW1iZXIgb2YgZGlyZWN0 b3J5IHNlZ21lbnRzIG5lZWRlZCwgcm91bmQgdXAgdG8gYSBwb3dlciBvZiAyCisJICovCisJbnNl Z3MgPSAoKCpuYnVja2V0cykgLSAxKSAvIHNzaXplICsgMTsKKwluc2VncyA9IG5leHRfcG93Ml9p bnQobnNlZ3MpOworCXJldHVybiBuc2VnczsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0 aWxzL2hzZWFyY2guaCBiL3NyYy9pbmNsdWRlL3V0aWxzL2hzZWFyY2guaAppbmRleCA5MzJjYzRm MzRkLi41ZTE2YmQ0MTgzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9oc2VhcmNoLmgK KysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvaHNlYXJjaC5oCkBAIC0xNTEsNyArMTUxLDcgQEAgZXh0 ZXJuIHZvaWQgaGFzaF9zZXFfdGVybShIQVNIX1NFUV9TVEFUVVMgKnN0YXR1cyk7CiBleHRlcm4g dm9pZCBoYXNoX2ZyZWV6ZShIVEFCICpoYXNocCk7CiBleHRlcm4gU2l6ZSBoYXNoX2VzdGltYXRl X3NpemUobG9uZyBudW1fZW50cmllcywgU2l6ZSBlbnRyeXNpemUpOwogZXh0ZXJuIGxvbmcgaGFz aF9zZWxlY3RfZGlyc2l6ZShsb25nIG51bV9lbnRyaWVzKTsKLWV4dGVybiBTaXplIGhhc2hfZ2V0 X3NoYXJlZF9zaXplKEhBU0hDVEwgKmluZm8sIGludCBmbGFncyk7CitleHRlcm4gU2l6ZSBoYXNo X2dldF9zaGFyZWRfc2l6ZShIQVNIQ1RMICppbmZvLCBpbnQgZmxhZ3MsIGxvbmcgaW5pdF9zaXpl KTsKIGV4dGVybiB2b2lkIEF0RU9YYWN0X0hhc2hUYWJsZXMoYm9vbCBpc0NvbW1pdCk7CiBleHRl cm4gdm9pZCBBdEVPU3ViWGFjdF9IYXNoVGFibGVzKGJvb2wgaXNDb21taXQsIGludCBuZXN0RGVw dGgpOwogCi0tIAoyLjM0LjEKCg== --000000000000a6efd7062fae938e--