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 1uU2zB-00Ec86-F1 for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Jun 2025 12:42:49 +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 1uU2z9-00Bzpc-He for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Jun 2025 12:42:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uU2z9-00BzpU-89 for pgsql-hackers@lists.postgresql.org; Tue, 24 Jun 2025 12:42:47 +0000 Received: from relay1-d.mail.gandi.net ([217.70.183.193]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1uU2z7-003jB3-3A for pgsql-hackers@lists.postgresql.org; Tue, 24 Jun 2025 12:42:46 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 1A25243A03; Tue, 24 Jun 2025 12:42:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1750768964; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=opRwuLtHZKITh/h3w2fcJSodky+KDc4Jn2oI/PeUVQs=; b=oURCf1c8nAzLzQDFI9ueBAJ6Yr6vU9zas0U2c+ezJzB3Bg+Q6TGpNLVS1g9DN5eV4RZ/KH 6uGnEEQ9uWRhini9fX6ffcCz7CMFfyuBsT4uGy62zYj5/k2rITce296NMbfnrds2rQzPfL ycC1iRCNMPU/+WqKxLU6TgeI9JvEXLqrvLks2yOIWftOMhcH/Gvwkn9AlmOR0G+3UDsCnK Ni05n0b4U8qP1l6JztBcyN+be5UhO7BWRLJVE2eTLQpzMJ3d8V4OgGu4Cd+aHSpvZnxIFQ wtAK+QDRRf4b7wLRJNJfBBd8ptyTUqpTZSD2b9+Y3lwn59k1SH+aAuaeyh8WOQ== Message-ID: Date: Tue, 24 Jun 2025 14:42:43 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: pgsql: Introduce pg_shmem_allocations_numa view To: Andres Freund Cc: Christoph Berg , Tomas Vondra , pgsql-hackers@lists.postgresql.org References: <6c9f9f7e-947b-4fc3-bdb6-b0696d7492e5@vondra.me> <0643ae61-cf9d-482c-9b2c-fb861b24fd22@vondra.me> <6342f601-77de-4ee0-8c2a-3deb50ceac5b@vondra.me> Content-Language: en-US From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtddvgdduleelvdcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhepkfffgggfuffvvehfhfgjtgfgsehtjeertddtvdejnecuhfhrohhmpefvohhmrghsucggohhnughrrgcuoehtohhmrghssehvohhnughrrgdrmhgvqeenucggtffrrghtthgvrhhnpeeludegieekgfelhffgffeuvdelteetveeghfdvieekfeduudduvdfhvedufefhveenucfkphepkeeirdegledrvdeftddrvddtieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpeekiedrgeelrddvfedtrddvtdeipdhhvghloheplgdutddrudefjedrtddrvdgnpdhmrghilhhfrhhomhepthhomhgrshesvhhonhgurhgrrdhmvgdpnhgspghrtghpthhtohepgedprhgtphhtthhopegrnhgurhgvshesrghnrghrrgiivghlrdguvgdprhgtphhtthhopehmhihonhesuggvsghirghnrdhorhhgpdhrtghpthhtohepthhomhgrshdrvhhonhgurhgrsehpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrgh X-GND-Sasl: tomas@vondra.me List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 6/24/25 13:10, Andres Freund wrote: > Hi, > > On 2025-06-24 03:43:19 +0200, Tomas Vondra wrote: >> FWIW while looking into this, I tried running this under valgrind (on a >> regular 64-bit system, not in the chroot), and I get this report: >> >> ==65065== Invalid read of size 8 >> ==65065== at 0x113B0EBE: pg_buffercache_numa_pages >> (pg_buffercache_pages.c:380) >> ==65065== by 0x6B539D: ExecMakeTableFunctionResult (execSRF.c:234) >> ==65065== by 0x6CEB7E: FunctionNext (nodeFunctionscan.c:94) >> ==65065== by 0x6B6ACA: ExecScanFetch (execScan.h:126) >> ==65065== by 0x6B6B31: ExecScanExtended (execScan.h:170) >> ==65065== by 0x6B6C9D: ExecScan (execScan.c:59) >> ==65065== by 0x6CEF0F: ExecFunctionScan (nodeFunctionscan.c:269) >> ==65065== by 0x6B29FA: ExecProcNodeFirst (execProcnode.c:469) >> ==65065== by 0x6A6F56: ExecProcNode (executor.h:313) >> ==65065== by 0x6A9533: ExecutePlan (execMain.c:1679) >> ==65065== by 0x6A7422: standard_ExecutorRun (execMain.c:367) >> ==65065== by 0x6A7330: ExecutorRun (execMain.c:304) >> ==65065== by 0x934EF0: PortalRunSelect (pquery.c:921) >> ==65065== by 0x934BD8: PortalRun (pquery.c:765) >> ==65065== by 0x92E4CD: exec_simple_query (postgres.c:1273) >> ==65065== by 0x93301E: PostgresMain (postgres.c:4766) >> ==65065== by 0x92A88B: BackendMain (backend_startup.c:124) >> ==65065== by 0x85A7C7: postmaster_child_launch (launch_backend.c:290) >> ==65065== by 0x860111: BackendStartup (postmaster.c:3580) >> ==65065== by 0x85DE6F: ServerLoop (postmaster.c:1702) >> ==65065== Address 0x7b6c000 is in a rw- anonymous segment >> >> >> This fails here (on the pg_numa_touch_mem_if_required call): >> >> for (char *ptr = startptr; ptr < endptr; ptr += os_page_size) >> { >> os_page_ptrs[idx++] = ptr; >> >> /* Only need to touch memory once per backend process */ >> if (firstNumaTouch) >> pg_numa_touch_mem_if_required(touch, ptr); >> } > > That's because we mark unpinned pages as inaccessible / mark them as > accessible when pinning. See logic related to that in PinBuffer(): > > /* > * Assume that we acquired a buffer pin for the purposes of > * Valgrind buffer client checks (even in !result case) to > * keep things simple. Buffers that are unsafe to access are > * not generally guaranteed to be marked undefined or > * non-accessible in any case. > */ > > >> The 0x7b6c000 is the very first pointer, and it's the only pointer that >> triggers this warning. > > I suspect that that's because valgrind combines different reports or such. > Thanks. It probably is something like that, although I made sure to not use any such options when running valgrind (so --error-limit=no). But maybe there's something else, hiding the reports. I guess there are two ways to address this - make sure the buffers are marked as accessible/defined, or add a valgrind suppression. I think the suppression is the right approach here, otherwise we'd need to worry about already pinned buffers etc. Which seems not great, the functions don't even care about buffers right now, they mostly work with memory pages (especially pg_shmem_allocations_numa). Barring objections, I'll fix it this way. regards -- Tomas Vondra