From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id C9D4B3858C83 for ; Tue, 16 May 2023 14:30:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C9D4B3858C83 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 34GEFk1h002282; Tue, 16 May 2023 14:30:14 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=references : from : to : cc : subject : in-reply-to : date : message-id : content-type : mime-version; s=corp-2023-03-30; bh=MwLf/B+Ghsa9KmomJf16R8d4+4OiLsm24E0HotxQNTA=; b=KaWnX7b3d3giFogyYoXKvZiHtM7Rs7RfvHCZcsKja3P4SEpGconHpasbkgGXXLeUcjyI M7yO1641pBuT42CIRXslggt/BhSQ56+YStyF4Mb6tXb113Ahg9xewWqdVqY2DThKhbvR 0HTFCgHg1QDYUobHOa9I8WxtdgFCXU6BSgWahfWwI19KK3Zt36kN8VJIJlm5/NmJkUuM jdqQmg5fb+2hT1FOGhss7JXaPwe5diPiN1SrEqtCsMlUGyqNysRVnXj3JP0Or9EiGmX+ MfqMgqezbweMZE7sRGOkc2qofSBaxRFeFJvlbrb130yQnOy/zPoq2cigoY2aHMTZzMd6 aQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3qj15237fk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 16 May 2023 14:30:14 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 34GDsRNv033897; Tue, 16 May 2023 14:30:13 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2044.outbound.protection.outlook.com [104.47.66.44]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3qj104mqqn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 16 May 2023 14:30:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cD6cM69qBlq9y4vMcn9MlPY/aHK3fj+0pPtYmqzILmTSAVs9oWIdCBIvjQ5cz69p7nj+R2stEjWXdcuH3Y36j+YhBCtti90HRyeWa5ZwS+wE382QtZq+p4FIZZ3M9t4rRMQ9jPydi36IRl3OvNh4Etar7FB5vycKzTUKwBNCjbP7EYqePoOveMVfnPUS92ZkfTOHunincCFAcBQgnr9rcV8ILjRuwxgfA/aqzse6Kv/BK+l5jsLOqTwzWG6YADYjlK1LWcgYP+TUtUFDRFwYWH6Q+9jxY9MVsvcTt0EbTSeRI3Vn90oQSi/si114HNiVOyV4iTuYtV6unmMcGjKn5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MwLf/B+Ghsa9KmomJf16R8d4+4OiLsm24E0HotxQNTA=; b=VW2DbMXwETbdSNnXjcbahMExRMtPt3KgCdYa10Uh9E/GUIbJZcywyFuCU0muwDCaBn/jQYAt6qM0YF9hrAXUAv6s228bNllJ76iWkjGgXTsZgPsoszKzEQkWpzGumdB/nDoM2jDJtyH9YSsS6OykApfFRnYVqtGYQxOBxiI8SniZXl51G58wplZiMeJmR03iTJDrexrsW6bLsu0g5KXwpGOtMv69BzAZoddtwhkkdluv+NsyM2MqLNjJoVoPC9qhO096JbJFumD6006UVr4kfLTWV9m0H+xS6b/Itwslz3bvfpBVDscKSEa5EJ8ZbcnJI3ycwdXMSGy+cpufmXtKuA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MwLf/B+Ghsa9KmomJf16R8d4+4OiLsm24E0HotxQNTA=; b=HICx/CjKkNXsYJGmeqamkQNVnZcHne9+SdSqW/gqW3z/nh+zXD75aLTIk7elxNf63u1dAUKjvoI1Hl9/d0EXN/QsxSrROMEvG0sVEvkcw+IzXkOPkiM2CJKaQ3hOJkyzBdAVEc6UN9wOeoGGHAZ8F5ylqXjkl7T4NHI7lbj5NWA= Received: from BN6PR1001MB2340.namprd10.prod.outlook.com (2603:10b6:405:30::36) by SA1PR10MB6613.namprd10.prod.outlook.com (2603:10b6:806:2be::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.30; Tue, 16 May 2023 14:30:11 +0000 Received: from BN6PR1001MB2340.namprd10.prod.outlook.com ([fe80::3696:ecb6:1f8e:b6ab]) by BN6PR1001MB2340.namprd10.prod.outlook.com ([fe80::3696:ecb6:1f8e:b6ab%6]) with mapi id 15.20.6387.033; Tue, 16 May 2023 14:30:11 +0000 References: <20230420172436.2013698-1-adhemerval.zanella@linaro.org> User-agent: mu4e 1.4.15; emacs 28.1 From: Cupertino Miranda To: Adhemerval Zanella Cc: libc-alpha@sourceware.org, Wilco Dijkstra Subject: Re: [PATCH] nptl: Disable THP on thread stack if it incurs in large RSS usage In-reply-to: <20230420172436.2013698-1-adhemerval.zanella@linaro.org> Date: Tue, 16 May 2023 15:30:06 +0100 Message-ID: <875y8stklt.fsf@oracle.com> Content-Type: text/plain X-ClientProxiedBy: AM0PR02CA0195.eurprd02.prod.outlook.com (2603:10a6:20b:28e::32) To BN6PR1001MB2340.namprd10.prod.outlook.com (2603:10b6:405:30::36) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN6PR1001MB2340:EE_|SA1PR10MB6613:EE_ X-MS-Office365-Filtering-Correlation-Id: 961c135a-da50-47d0-3fb0-08db561a0e57 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: wJtSyxGIykibGDGI8O+e2IwXgUXNcWjcaGbM46+0jFXNoHdv7xFxXAVh/H7/k0Ekehe/Nrniq59Pi7A1sU0+kAWrPkgV4sVAENhuDUTe6kfp/Ixj5XfZA+XMVozfxMWRDelWCHiE3chZDEW2Tcxj57SSYsaEC3EQVausr/wX4EPvct1zrEkFCssXAJwlxEwT9h8pFzbcwFupaOrv78u974fNsxIFsEAE0SOjZfsu5+WwF8HNteSeUlD7I1Kb59RQFkslvHIb0+KrVBgJR/4/sh73G51eZ6eiHkRCk02ukrVAT4IE6ZCHrwJEGoi4q2ywY/sxAwV9xsdbCVX5MEYxFX3oDAYTfxs+CYHDvWmh9fVOS5FCfTJbI5mlvk1FHCQXO47l2qezkBNCNYHQpRGz3qOxWMVp+NEzCCfTcR0mFxY1WEp5ypDUW/xvA56JIX+ajCwXiSc0r21t6sl90L3TXW+66SN+UmZcCxL2zZk3iIoej5fuA9Y3GHmlfDur2BMxiErin5uywSjeKDJ08UmW5GUBDf5LeThF9P9P6ZPCvBk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BN6PR1001MB2340.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(366004)(376002)(346002)(396003)(136003)(39860400002)(451199021)(83380400001)(66946007)(2616005)(4326008)(66556008)(66476007)(478600001)(6486002)(6512007)(6666004)(186003)(6916009)(86362001)(6506007)(8676002)(44832011)(8936002)(2906002)(5660300002)(36756003)(38100700002)(41300700001)(316002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4dYqWK2cotOrV4L89Bfng+DDKBGfOH2Bo6RvyWuhCnvDiBAZIK52Rdqdh7Ni?= =?us-ascii?Q?vXpIgdu6JlMJ4LTwMS8UihPzIjznoMX/Y3gQ8I0F5/vR45yw2CVrOSIoynWr?= =?us-ascii?Q?Iw4fHO9IhDRo5m0h1HHJz2NH/3cqBXU0supt4OS2g8DWIG0BzpEU/Bv77J+N?= =?us-ascii?Q?egrmBSUyqGr5wBwrfasrZNRRO9gTA5Vv9JtHyVS0mfs3yje6ky0PCjAeRMfr?= =?us-ascii?Q?YMW7An4TCqkIMuPxBe/CXa8EBz/xEKXxTCOiwjp9GFSf0qEse3vQZpPhlRPx?= =?us-ascii?Q?f9bsvLFevneaaOOGabbGCk2xi7EMhhBcHadMVG8YyEf8L3BfaHQFDU5KXOR7?= =?us-ascii?Q?HqUcusPf6As9z7DrBv/Zj7vUm+sJ1ATaiKEATLsu2L+ctdcJ2CdWk2/KSJq9?= =?us-ascii?Q?JFzC5jRucJ6XhwYUrrWjGS+jq6PDgkW83rx+PhmJISI4tpcNg4+mbVIFX68Q?= =?us-ascii?Q?xafYepd5fWsyhjX6QLroFoHelwY2p/GlZKoqLEOI9fZHak1Ijm+1tKrJFVMd?= =?us-ascii?Q?Vqbu8r4GFbkEd5CTrUJQTTJ+hN7P0+GIY4AZf3Kd8Sm0TI/nuK5yYKa940Hr?= =?us-ascii?Q?ar9SWGUNgFrvDFmkRYLw3/HoZwD2AZz7OL0bh4srVutVS4paaEEEKahpBp0y?= =?us-ascii?Q?RJi3XgteHueLbXzTWtOrIva4UGbGk8hTgYdSuzdMAnx0rWz2smEoTQpEJU+2?= =?us-ascii?Q?SOOP0T7Zuvdyge0iec8A0QX8bRRvYX+E7w9Uvzp+n1xLX9ZfpSEkIXHoQ9vd?= =?us-ascii?Q?2o5+t+dp0/RQ4jxmuuLfbLUgX/lwm6ft4JVf3+m4LnocSTeX+zFx3GqpTdAc?= =?us-ascii?Q?kL1faoiG2+mC+fMKrPJNuF6cq3uBMAknQrwRt9f9krcxC7q4ZZuiwxN6bufd?= =?us-ascii?Q?e3RxIM9Jl07ltiUMwN71k5ENsIJk49OYFs1qPUOocSFZciT+B/TRvEivZbSy?= =?us-ascii?Q?pNC2eqLpl4a92APYD5jNTC0NdhxJx7eefkPJGwU3zbay6K1xrZE9lfdWYhfi?= =?us-ascii?Q?jt8HnJZVSGgVmEzCfCf0FMOUh1RnSafCKAY2mfqgu36vQxuMXoK8uJCO42RQ?= =?us-ascii?Q?zr3YcjCnhuAKY7lNhyemV9bM98gs8YQYyHu4bzW9JZ9lf6S2IY6CKg9xSqrD?= =?us-ascii?Q?3hg3jRJMg7RwN947lKPkQ8IKzRZp5NkpqzLa0xDwBPY3LR7QQuqcD0ShtU72?= =?us-ascii?Q?TUHXnvrzXTugBy6c1uby7g5GFrNuW4M+dBYL6qO5rs6b+nE7KwhDIh1K/PD6?= =?us-ascii?Q?vTBp1NwmAyFMjK20W/dW3fv6gCCErxg+3JKZ7aOcDzIKyk+xed2STmjHSWEJ?= =?us-ascii?Q?ckp8kZ4GnSYMi3brpc9tnvpnaGXsQmxBEUvnkPOzFO54KqinY4ab1SY76TeY?= =?us-ascii?Q?pXfzzhFW+FrKFj3gj72AzXWdZiOrHsn4u51bd8U4wmfgeo7YImGhTQGi+K6d?= =?us-ascii?Q?j8kS6Rnlz7U4p7+BIH1oz9cXO14rS96aULDmU9+7FVEnnQ8P/1qYSSi6d4QB?= =?us-ascii?Q?WBmjdP3jObcxlrZM0qORKfIFuaPfQOUMm6UabLQlC9nkzDw76IBT0LOKYCD9?= =?us-ascii?Q?4VG3wi2fXMF1YqUVL/6jb3zCd3YwvzWHFK8NBL7aqz1wFynSHAdzZc5Ys6Sb?= =?us-ascii?Q?yaa6PVT65t/UubrSOkCO0j8=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: k8dMWdUaI3gkdMQ3OrR6ChdBwOS9WzZWO69i4i3UZTXFzTIN7L4uD9zLYCV/A8WPai+5etpm1lTY2G1bOgLRRNTj0vGevP1PZAq5Zt0g7YassVzsbaiabqNfGMvx4Gi4qQGoFKtfz7AM1VuVBVuK39f0/y+VjwQ3OYW9nz0qc/iN/3ZaU70MhgtByNzCq016w8YPufY4QPnLeC9FhHKiNyWqpNE+xuNz1sj9cZU87uxMojAIMRb1fbfIufzkEahHyfvLuRZc/BhRiXh7v2HNaDiNBOXPVdqwhh49SmVJKR2loOtdu6ORPzsh0Mc0/HLVIG857sh/s8oawSs1C+sy/VmgDG2OhYIr/opiDj8F7UwumGT79whUOIG0MHWHTXby7cK1XvQVnq/CVvfau2FxRDT0b3TLCPpasraGyJifVWMIH0PRO2Y6/3hdbmdn9tqZ5VvY7l1r3lF0U3wTTdqoNicRsjANTFqyL0/yOcCAcNAvLRVUGet1VO/T8T14Gu3vKGMqBBljniKj7a9e9yrmwdfIBOwngqKQlQokPe+70pvkM+vVDpNVWfHY/dn8GH75y0U/I5JNPFcU0a2ufzvzh897ctC6Gqtb5Goz78DPS2mFUtirbjy9uxbqdDrvQ3GQ3IvWBzi6BZMlfU9mWKrFIwzpQPg7iFF9cNANwxQvKthpTZpvKyYS8XOA58kyz3xyR6p47tn4GzaJ/RF7r1gLpzbJzs3AcOHN5BCnSosNJbNatnpPBXfGNQa6nkGBs72bllyL5i2qz4wCC73Q+c0er3yFcDKgSDxq4e0Z0AaJdXuZ2CUQOXTUac3uafTR+nC4 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 961c135a-da50-47d0-3fb0-08db561a0e57 X-MS-Exchange-CrossTenant-AuthSource: BN6PR1001MB2340.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2023 14:30:11.4709 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: VXKmSkZqjvLwbNuZkU37hfC3rciglxpcNajABGLq6Sqoti7KE2+dAeaZYA/Smiy4wjQ46hIx0V8dTBtl9wM364b3MlQcvUWjB0EGqQ2qdak= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR10MB6613 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-05-16_07,2023-05-16_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 phishscore=0 spamscore=0 bulkscore=0 suspectscore=0 mlxlogscore=700 adultscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2304280000 definitions=main-2305160122 X-Proofpoint-GUID: aW9qVQVPKRLHHHdoQoqvAX-MJRa5YPAr X-Proofpoint-ORIG-GUID: aW9qVQVPKRLHHHdoQoqvAX-MJRa5YPAr X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: Hi Adhemerval, Appologies for such late reply. For what it is worth, the patch LGTM. Regards, Cupertino Adhemerval Zanella writes: > If Transparent Huge Page (THP) is set to 'always', the thread stack might > be backed by Huge Pages depending of the asigned address by the kernel and > the resulting guard position. If the guard page is within the same large > page that might be used by the stack itself, changing stack permission > will make the allocated range no longer be server with THP. The kernel > will then revert back using default page size. > > In this case, besides the aditional work, the kernel will need to potential > keep all the pages since it can not distinguish which one was really touched > by the process. This result in a large RSS usage than just madvise the range > to not use huge pages. > > The glibc.pthread.stack_hugetlb is still useful for the case where the > caller either setup no guard page or a guard page multiple of default THP > size. In this case, the kernel might potentially backup the stack with > THP, but it would be up to the thread stack profile if THP is benefitial > or not. > > Checked on x86_64-linux-gnu. > --- > nptl/allocatestack.c | 34 ++++++++++++++++ > sysdeps/generic/malloc-hugepages.h | 1 + > sysdeps/unix/sysv/linux/malloc-hugepages.c | 46 ++++++++++++++++++---- > 3 files changed, 74 insertions(+), 7 deletions(-) > > diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c > index f9d8cdfd08..1eb34f816c 100644 > --- a/nptl/allocatestack.c > +++ b/nptl/allocatestack.c > @@ -33,6 +33,7 @@ > #include > #include > #include > +#include > > /* Default alignment of stack. */ > #ifndef STACK_ALIGN > @@ -206,6 +207,31 @@ advise_stack_range (void *mem, size_t size, uintptr_t pd, size_t guardsize) > #endif > } > > +/* If Transparent Huge Page (THP) is set to 'always', the thread stack might > + be backed by Huge Pages depending of the asigned address by the kernel and > + if resulting guard position. If the guard page is within the same large > + page that might be used by the stack itself, changing stack permission > + will make the allocated range no longer be server with THP. The kernel will > + then revert back using default page size. > + > + In this case, besides the aditional work, the kernel will need to potential > + keep all the pages since it can distinguish which one was really touched by > + the process. This result in a large RSS usage than just madvise the range > + to not use huge pages. */ > +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); > +} > + > /* Returns a usable stack for a new thread either by allocating a > new stack or reusing a cached stack of sufficient size. > ATTR must be non-NULL and point to a valid pthread_attr. > @@ -396,6 +422,14 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, > { > char *guard = guard_position (mem, size, guardsize, pd, > pagesize_m1); > + > + if (__glibc_unlikely (__nptl_stack_hugetlb == 1)) > + { > + int r = advise_thp (mem, size, guard); > + if (r != 0) > + return r; > + } > + > if (setup_stack_prot (mem, size, guard, guardsize, prot) != 0) > { > __munmap (mem, size); > diff --git a/sysdeps/generic/malloc-hugepages.h b/sysdeps/generic/malloc-hugepages.h > index d68b85630c..21d4844bc4 100644 > --- a/sysdeps/generic/malloc-hugepages.h > +++ b/sysdeps/generic/malloc-hugepages.h > @@ -26,6 +26,7 @@ unsigned long int __malloc_default_thp_pagesize (void) attribute_hidden; > > enum malloc_thp_mode_t > { > + malloc_thp_mode_unknown, > malloc_thp_mode_always, > malloc_thp_mode_madvise, > malloc_thp_mode_never, > diff --git a/sysdeps/unix/sysv/linux/malloc-hugepages.c b/sysdeps/unix/sysv/linux/malloc-hugepages.c > index 2f316474c1..e7877f098e 100644 > --- a/sysdeps/unix/sysv/linux/malloc-hugepages.c > +++ b/sysdeps/unix/sysv/linux/malloc-hugepages.c > @@ -22,19 +22,33 @@ > #include > #include > > +/* The __malloc_thp_mode is called only in single-thread mode, either in > + malloc initialization or pthread creation. */ > +static unsigned long int thp_pagesize = -1; > + > unsigned long int > __malloc_default_thp_pagesize (void) > { > + unsigned long int size = atomic_load_relaxed (&thp_pagesize); > + if (size != -1) > + return size; > + > int fd = __open64_nocancel ( > "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", O_RDONLY); > if (fd == -1) > - return 0; > + { > + atomic_store_relaxed (&thp_pagesize, 0); > + return 0; > + } > > char str[INT_BUFSIZE_BOUND (unsigned long int)]; > ssize_t s = __read_nocancel (fd, str, sizeof (str)); > __close_nocancel (fd); > if (s < 0) > - return 0; > + { > + atomic_store_relaxed (&thp_pagesize, 0); > + return 0; > + } > > unsigned long int r = 0; > for (ssize_t i = 0; i < s; i++) > @@ -44,16 +58,28 @@ __malloc_default_thp_pagesize (void) > r *= 10; > r += str[i] - '0'; > } > + atomic_store_relaxed (&thp_pagesize, r); > return r; > } > > +/* The __malloc_thp_mode is called only in single-thread mode, either in > + malloc initialization or pthread creation. */ > +static enum malloc_thp_mode_t thp_mode = malloc_thp_mode_unknown; > + > enum malloc_thp_mode_t > __malloc_thp_mode (void) > { > + enum malloc_thp_mode_t mode = atomic_load_relaxed (&thp_mode); > + if (mode != malloc_thp_mode_unknown) > + return mode; > + > int fd = __open64_nocancel ("/sys/kernel/mm/transparent_hugepage/enabled", > O_RDONLY); > if (fd == -1) > - return malloc_thp_mode_not_supported; > + { > + atomic_store_relaxed (&thp_mode, malloc_thp_mode_not_supported); > + return malloc_thp_mode_not_supported; > + } > > static const char mode_always[] = "[always] madvise never\n"; > static const char mode_madvise[] = "always [madvise] never\n"; > @@ -69,13 +95,19 @@ __malloc_thp_mode (void) > if (s == sizeof (mode_always) - 1) > { > if (strcmp (str, mode_always) == 0) > - return malloc_thp_mode_always; > + mode = malloc_thp_mode_always; > else if (strcmp (str, mode_madvise) == 0) > - return malloc_thp_mode_madvise; > + mode = malloc_thp_mode_madvise; > else if (strcmp (str, mode_never) == 0) > - return malloc_thp_mode_never; > + mode = malloc_thp_mode_never; > + else > + mode = malloc_thp_mode_not_supported; > } > - return malloc_thp_mode_not_supported; > + else > + mode = malloc_thp_mode_not_supported; > + > + atomic_store_relaxed (&thp_mode, mode); > + return mode; > } > > static size_t