From patchwork Tue Jul 22 14:58:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dora, Sunil Kumar" X-Patchwork-Id: 116786 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id ED784385084D for ; Tue, 22 Jul 2025 15:05:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ED784385084D X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mx0b-0064b401.pphosted.com (mx0b-0064b401.pphosted.com [205.220.178.238]) by sourceware.org (Postfix) with ESMTPS id EF21B3858C39 for ; Tue, 22 Jul 2025 14:58:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EF21B3858C39 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=windriver.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=windriver.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org EF21B3858C39 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=205.220.178.238 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1753196328; cv=pass; b=uAwwNifm1UP4O8Y3MfXCEf5WMWlI9folqHU2PBx3b0zw3OTTTk3E88LGu0tfeCIzoL8NqotDnPLF8etgrsHB3eYGz0nxELbHvjROzMc1ec4pAbYFNc+amNnJ+a+o0FCGus7wjCxStXC646KUNXX5/M0w9ruFTyTu1+N3J3tjxd4= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1753196328; c=relaxed/simple; bh=t7bvbUNrjCiRXvutiNiKw6GcQoHlvVcJeFTTxbQzMc8=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=A1/dVbMxaMG9dtdVg72LDS4NitmkLvKByynaaEKoyvXHFVgiMztnlg1mXIG/XvtphIwxCN0rVU4noxSEsPt3pw8k5DT2yomE4QSCmUGjSEbcdA54uUJUJP4llN91ijQPLKnJmRWQljfI3/lsUcHq06C68A8eZELNZgA2POo1stA= ARC-Authentication-Results: i=2; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EF21B3858C39 Received: from pps.filterd (m0250811.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.8/8.18.1.8) with ESMTP id 56M5f5wd3558072; Tue, 22 Jul 2025 14:58:45 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12on2062.outbound.protection.outlook.com [40.107.244.62]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 481vqu8xc9-9 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 22 Jul 2025 14:58:44 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OhF10GylFq+TGRKgDko/7mZZQYvHNDvKrjQrrflZv6hKXDRAxh/ehms171ZLWSmwt5KRvEzvdUlxaiC+eGQlCoFrsurCQNC2z5aoanp7Ex96rbJYkm1+OOBC4b9j37SknWzmF9x9yuHsgfaVNzZoNmf4qGSa+7kUMb3vFbTB2S0RX9fKwn1fux69l8Xef0W7P6Mxiq7Wyrir9nREmBD9XXCcKQJ7+rHhgqo/zQ3vq0p2D6KrO2sSckKYGMWCpXMTPIF/3iIXcA/WT8sBm8+CmaHv0dZ2X47jAuOheI+Apix0FjQc9TDkGOdVj4I5cHHCT+4/8VHR0GUkq/3IJA3UyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=j2DmjQrnjs9T82nNpAb9rShu8lA7HUGXIiNmLEM5nPE=; b=v2YgBK818F6xsKi0d9YsLWNDu4SrW4x4IZI8gDKKbd35DnWJww5Ny+NTNGBFJ8qa/XtDlzBQRgyTN9XDzN2HpbiBtXxRUrRtHv9EZCfliTmygDQbmU2QqIq4W73ImOnNfkZw6uMhWOGUatHG5niTz0fPyQV+b0D2NzYeml2WDslpS1x+EXqKTmGtLfA1c9UsEayvxCfoy0/ZQtctX5vPfZD294nsH6n6dBcoKetNxiF29xIn4PLWSbmNOfINmTjLaWxgAVss0F3W44S4lf8Lp8WCKZEh8lVH1dK6RTb9D7HX+bPLmldEOnycoQuve/UP8raqoa5v81DSnwR5E3zX1Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=windriver.com; dmarc=pass action=none header.from=windriver.com; dkim=pass header.d=windriver.com; arc=none Received: from DS0PR11MB7901.namprd11.prod.outlook.com (2603:10b6:8:f4::20) by BL3PR11MB6313.namprd11.prod.outlook.com (2603:10b6:208:3b0::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8943.29; Tue, 22 Jul 2025 14:58:42 +0000 Received: from DS0PR11MB7901.namprd11.prod.outlook.com ([fe80::9fa:eb3f:cf26:264d]) by DS0PR11MB7901.namprd11.prod.outlook.com ([fe80::9fa:eb3f:cf26:264d%3]) with mapi id 15.20.8943.029; Tue, 22 Jul 2025 14:58:42 +0000 From: sunilkumar.dora@windriver.com To: libc-alpha@sourceware.org Cc: sunilkumar.dora@windriver.com, carlos@redhat.com, fweimer@redhat.com, Sundeep.Kokkonda@windriver.com Subject: [PATCH 09/10] [2.36] nptl: Use all of g1_start and g_signals Date: Tue, 22 Jul 2025 07:58:20 -0700 Message-ID: <20250722145821.2214847-10-sunilkumar.dora@windriver.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250722145821.2214847-1-sunilkumar.dora@windriver.com> References: <20250722145821.2214847-1-sunilkumar.dora@windriver.com> X-ClientProxiedBy: SJ0PR13CA0232.namprd13.prod.outlook.com (2603:10b6:a03:2c1::27) To DS0PR11MB7901.namprd11.prod.outlook.com (2603:10b6:8:f4::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB7901:EE_|BL3PR11MB6313:EE_ X-MS-Office365-Filtering-Correlation-Id: 7e4034d3-9687-4857-2193-08ddc9303fa5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|52116014|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: UggwJ36FD3WpG89x4gCDFlGSGB/hPTqCdA02pYm+Wag3WbcqwSwgDuDK/0QYjSJOyh4WL95cWz6knebVB4ULEH0IHwRa1/RO0E1HVR6w7at6SN87/kNh6kp2aaGLugUrdNivclN0tKeJuY3ZbLySADWvy+z2IHxLtnzoVMHAzliBiYgm1ikAcB2/qU21wu/sijJXDwzA2k3MTGhsLq1lbkKA9CAPh2i/Vhbn88cQXQS9K8ldSq9aEQwPjoXVceThg23zP/os1D0mShPVVAr5Wt//cAS8V9DJ3DnN5hO+SUrpfTeoD2iQVxO8a8xNoQgTPV8DudyynhGInvwCq9yZQc5ueyxJhMVb1qAd0Mkcrha2tynaZQzysSZ+w36pE/TWDYt7YwbJ0PNmntSy9ZNd9mmG27UEK+D6HvrCUYR9wJ7VaXqQAc0hiNtO2eafSdFFMCOlhuruVyY3Lp7XILCbkFiumF2XgOlK3woUDNr9HTbtjWF4xCf+5zmPv/49jdIwblpghNzRAy7SGtY9n8qNXXgxvRF3rGpFSsJCBLLVeebkU27EFcT87GTB0Raqct2l9MOkvaPlWAuEx2Rc6mPxbg+emMTz6EiTDVTF0JSoTjRTMaunMp8f6+XmurtrjEkqmBPqndSSSiH0MMFmmvlDpVJJ6IfkNQJlMJB5NL2xmqcB60+saJ8hzM6PcMnCz93XEcnfrE1533SkIRSkTlUyO+T5WjDMh73Zkc6/fYsW2pBl2VkfRNh9QAOz0dZiQBQGw3TvPTRxeszYJ9rQcs9+PeH/c1MjlY+oi7g6g2gJEl070ZSF2HNecc4bhfSRFZ6WI7kDAj1R1IPIU8ZOlYuKtmNbRTILwgJj1lrF9QBeG6bYdOtZn2+esNqr14jOPPUIpOjMf4pLznAxJ3YpOSgpDgBXi3SICksWZkJlEzjWibXxlEunCLvTbOUr2l7ePu6SAXzKSDhn+AJSVy2KI2qkxtaiGaqPKC9qLP4+zkYQSW0RL7xu3NkpgNmgogBtytTrK2LaF2ObIF/kl9+jfxXf0MqEMpiPg/2H/aF27o3vp67ztA/5nLbkItZ7aVYrQmPv/UvgT6fK8W4tofDDTzxs+7q6DlSR5a/haQX97wimpWsRXNMLwiUfpK7ayd8kl531dEIpkPHEc0AQ30nUqMMfl1DBtbu9wDa7FEckML2EG0O/qPdgw4rrMJcRy6sfjRI40iVKT86xeiwPAv9JbYFNAt2U4ATQF+sqXL0Fmaix/cQTjmT+BqW4eJDVds8kJ/1IZeRu89jeYGbVQowFe6EYf8QYERv8CkNWNVgcC5hyA/7a7rAixS3++f7CzLXvYFqtDTgQzvNwpzHWOIVFcsW1i9mp4flGmrGj9Hxu3++tj3/DMyjrdSX8MPeASzZ1ynEK49XH+2B4o01u6NkCuIQZb2Z9JXfyKkjsl4NqH+HZ558SnnQJiIwihTxUjG4dC6dregzU1dfVDfLemBFvOCnHPQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DS0PR11MB7901.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(52116014)(1800799024)(366016)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: J7AIrncNeKbz+Ju482Zq4BseJdkJe5tJ5iLhW5HalWXlEhpsMObG+Sq1SY58ghDqgrWRp90nRLypj0EAb01w4t3tIGkXf3OFwlotNUuvac2U4ovDjpk2CA6hJk4lhS2t/LaULp+5Zj5UPOpu5fD5hMOA/oQMntkiLb3Q99VWxlLylmoqzbEZGhgFFRUZhODiZTnpKgCqoGIwRU93nb8j8usqyF+13sMk0FYEUFrmo3Q9brGIaPgVGLKsmAvkcFfUyunTKR2pxDCFkzzD8otbdmxtqeshz+U1anVV6/tknnsEGO15MTSdGdIxWChvC4i3isoujR+9TaJYtU8E0I27vwJvi+XkKJ7ZDMrCMJQJ7Tn9XdRKwaxK9Q5pxXTzgfKt+ejJOpQrtmkn5GLzEQurXDowGON6cE8hg97SMrQkT4inqLGOCvSQ9CNQHv5ONQOyM5EC4D0ClawJLRLlQ4Vz0RApb+eQCuP2bnHv0jT1V7gbgfKy2/h7mLXz24BOQl9Fl/ZuJYDDu9FGedbm4ACgnWMUjABo9+/LrVmjZWJampGMnx52BRAyT/3oQb+C/9anhD46vmaNdDJylH/j2eu4h0VdzqPfoFQg8dNYfrZ8LGZIZPupmO0MiYTkqd/DHi+lmmwrUAu3mz3yTKEgxQQM9IjKkIiHTWBEtisvWUkz6sgEi/InzT3S372p0/QnyR4ZyfeNBSwePinD5SbFDfSSsQeR6n5E+ps0Mtno/a1OaoDwzqc5LdjJHP8kjeA8fqpeiomc1TIXj+jxybj+slgTug1Pdx35WYzXBjhKR+dvSys+rhXTGIbrHySTmk7bTIIqETEHpHOmOvIsqFIRgpXzElpRlRy4XugHTHk5irpno7qDu27cDQuB/NqOe6Z5TRSxOuCYLoWfhSti8CFyGdkZYXsVvpXouCnCXUbWbaOL/hQ8LI9c8jomWlw0KsaFIyelSCKPc7kHFpP1gIZH/J1iLexb8KlekpyVgR3QPYY1ZypLaCLLtS03VpSPbHNDLX8S7M5JV1w05DpQ8brCoCDl5FCjawL+7fO+VeDTUuQy2wkg7JOldONbD53GmbD7shF9gTusitWDcUEjpGnhcs23PXZI0o+GAV4aFAUX9J0bfM3gmL9ZUIXCD/kpCnZo+iSg1S2qhSXnDpQ1lHtwYWwjlS7DkkOV8YE77VxT7EhptjMg8P6Iu7AqmoHr4BcnnUBQWPVH9hLpUtOR6e69e7IwelRj7NElfY8pCCZGMmOi+gpJM70cHP+0nAIZjmB5hkBqUK1nisyWEtayvNChtZl46GZI+8fEv5Mq+x7tNMATdYF1ykY04iEdBK7SrkBDniqDfBprxUxJ7dCsbJFgtidEgx+JhrWmQhtal6C1kKVnLUwAH0jiGvlSXQHjgcZzCVwe2tvLEEbV+JOoe7gUSijjvBruwQ0uTbp1Vq4zsbjYIvXi6Oyxmz0BELli39+MyBbUg9EgSQRcVbLGUH7MsnKAXNukUeBOw+kaHGRBcnyTiBMkXHN3CQh8X4jninVoMW8mt2lNYLOqAsCVOL3n0jzO1mWS50qwDnXcZ6qhB2ZuYewI0WajQ+3V+jqjAWLt1fw/v5kwPGTGiHQqN6n27dT6ow== X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7e4034d3-9687-4857-2193-08ddc9303fa5 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB7901.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2025 14:58:42.1372 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ddb2873-a1ad-4a18-ae4e-4644631433be X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kleL/w8Qpk+yRnsudW3l26RDlDcuqbLHAUoAcyzIZrvWwIJ9j1scpkSayWWUnFv3fpjJpDfvuHO2vnq9JP1ZUuBaAM/D5sWMt00ifc+5LXc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR11MB6313 X-Proofpoint-GUID: SdrE6FUT5GCavIYKvWyD6KRIcZ3_W6Xj X-Proofpoint-ORIG-GUID: SdrE6FUT5GCavIYKvWyD6KRIcZ3_W6Xj X-Authority-Analysis: v=2.4 cv=AbqxH2XG c=1 sm=1 tr=0 ts=687fa725 cx=c_pps a=7j0Ltmo+QGRCGvpdpD29zg==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=Wb1JkmetP80A:10 a=t7CeM3EgAAAA:8 a=irFmdI_V5gXsOLP1DOAA:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNzIyMDEyNCBTYWx0ZWRfX5uq6OWnDynL/ /yNtk089crlwSDXIzzUQX9LuY3266AlK5Wf74dItoIjkru6GWGMbaJJv11pMkP0moTlBXm/tWIV wN8Zb0EqG0lNm5+sCAAU0KAOBhkHUQjKuIOf9uqXhYoIEWcEue+qx0QH+YJi9AotWanz2f9W4Dg W25wsv63AjKb8DYkSxwYQNCcfSAXlNN4zwH5Zggs1/OuwCiz41z0EEB4jlQMiI4jVEZ6qDNVjz/ GLCGoAxRksbbfJEUrJuhGG4lf01mK2gdXoLx8ELUUjrHEkDNq7/PST8XK75pf3hVDD03OVpMdKk 0jN9pnpXPsowePArjvce65N0QI/vsFVMiJf2VYMJKquMmFCPIPsMsRYCuq16z4S4L46dqABPK7R Yo0IwrNd X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-07-22_02,2025-07-21_02,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 malwarescore=0 suspectscore=0 spamscore=0 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2507210000 definitions=main-2507210183 X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org From: Malte Skarupke [BZ #25847] The LSB of g_signals was unused. The LSB of g1_start was used to indicate which group is G2. This was used to always go to sleep in pthread_cond_wait if a waiter is in G2. A comment earlier in the file says that this is not correct to do: "Waiters cannot determine whether they are currently in G2 or G1 -- but they do not have to because all they are interested in is whether there are available signals" I either would have had to update the comment, or get rid of the check. I chose to get rid of the check. In fact I don't quite know why it was there. There will never be available signals for group G2, so we didn't need the special case. Even if there were, this would just be a spurious wake. This might have caught some cases where the count has wrapped around, but it wouldn't reliably do that, (and even if it did, why would you want to force a sleep in that case?) and we don't support that many concurrent waiters anyway. Getting rid of it allows us to use one more bit, making us more robust to wraparound. (cherry picked from commit 91bb902f58264a2fd50fbce8f39a9a290dd23706) Signed-off-by: Sunil Dora --- nptl/pthread_cond_broadcast.c | 4 ++-- nptl/pthread_cond_common.c | 26 ++++++++++---------------- nptl/pthread_cond_signal.c | 2 +- nptl/pthread_cond_wait.c | 14 +++++--------- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c index a07435589a..ef0943cdc5 100644 --- a/nptl/pthread_cond_broadcast.c +++ b/nptl/pthread_cond_broadcast.c @@ -57,7 +57,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) { /* Add as many signals as the remaining size of the group. */ atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, - cond->__data.__g_size[g1] << 1); + cond->__data.__g_size[g1]); cond->__data.__g_size[g1] = 0; /* We need to wake G1 waiters before we switch G1 below. */ @@ -73,7 +73,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) { /* Step (3): Send signals to all waiters in the old G2 / new G1. */ atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, - cond->__data.__g_size[g1] << 1); + cond->__data.__g_size[g1]); cond->__data.__g_size[g1] = 0; /* TODO Only set it if there are indeed futex waiters. */ do_futex_wake = true; diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c index 3baac4dabc..e48f914321 100644 --- a/nptl/pthread_cond_common.c +++ b/nptl/pthread_cond_common.c @@ -208,9 +208,9 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, behavior. Note that this works correctly for a zero-initialized condvar too. */ unsigned int old_orig_size = __condvar_get_orig_size (cond); - uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; - if (((unsigned) (wseq - old_g1_start - old_orig_size) - + cond->__data.__g_size[g1 ^ 1]) == 0) + uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond); + uint64_t new_g1_start = old_g1_start + old_orig_size; + if (((unsigned) (wseq - new_g1_start) + cond->__data.__g_size[g1 ^ 1]) == 0) return false; /* We have to consider the following kinds of waiters: @@ -221,16 +221,10 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, are not affected. * Waiters in G1 have already received a signal and been woken. */ - /* Update __g1_start, which closes this group. The value we add will never - be negative because old_orig_size can only be zero when we switch groups - the first time after a condvar was initialized, in which case G1 will be - at index 1 and we will add a value of 1. Relaxed MO is fine because the - change comes with no additional constraints that others would have to - observe. */ - __condvar_add_g1_start_relaxed (cond, - (old_orig_size << 1) + (g1 == 1 ? 1 : - 1)); - - unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U; + /* Update __g1_start, which closes this group. Relaxed MO is fine because + the change comes with no additional constraints that others would have + to observe. */ + __condvar_add_g1_start_relaxed (cond, old_orig_size); /* At this point, the old G1 is now a valid new G2 (but not in use yet). No old waiter can neither grab a signal nor acquire a reference without @@ -242,13 +236,13 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, g1 ^= 1; *g1index ^= 1; - /* Now advance the new G1 g_signals to the new lowseq, giving it + /* Now advance the new G1 g_signals to the new g1_start, giving it an effective signal count of 0 to start. */ - atomic_store_release (cond->__data.__g_signals + g1, lowseq); + atomic_store_release (cond->__data.__g_signals + g1, (unsigned)new_g1_start); /* These values are just observed by signalers, and thus protected by the lock. */ - unsigned int orig_size = wseq - (old_g1_start + old_orig_size); + unsigned int orig_size = wseq - new_g1_start; __condvar_set_orig_size (cond, orig_size); /* Use and addition to not loose track of cancellations in what was previously G2. */ diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c index a9bc10dcca..07427369aa 100644 --- a/nptl/pthread_cond_signal.c +++ b/nptl/pthread_cond_signal.c @@ -80,7 +80,7 @@ ___pthread_cond_signal (pthread_cond_t *cond) release-MO store when initializing a group in __condvar_switch_g1 because we use an atomic read-modify-write and thus extend that store's release sequence. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2); + atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 1); cond->__data.__g_size[g1]--; /* TODO Only set it if there are indeed futex waiters. */ do_futex_wake = true; diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c index 1d4213eab9..05cd76a3b5 100644 --- a/nptl/pthread_cond_wait.c +++ b/nptl/pthread_cond_wait.c @@ -84,7 +84,7 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g, not hold a reference on the group. */ __condvar_acquire_lock (cond, private); - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; + uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); if (g1_start > seq) { /* Our group is closed, so someone provided enough signals for it. @@ -259,7 +259,6 @@ __condvar_cleanup_waiting (void *arg) * Waiters fetch-add while having acquire the mutex associated with the condvar. Signalers load it and fetch-xor it concurrently. __g1_start: Starting position of G1 (inclusive) - * LSB is index of current G2. * Modified by signalers while having acquired the condvar-internal lock and observed concurrently by waiters. __g1_orig_size: Initial size of G1 @@ -280,11 +279,9 @@ __condvar_cleanup_waiting (void *arg) * Reference count used by waiters concurrently with signalers that have acquired the condvar-internal lock. __g_signals: The number of signals that can still be consumed, relative to - the current g1_start. (i.e. bits 31 to 1 of __g_signals are bits - 31 to 1 of g1_start with the signal count added) + the current g1_start. (i.e. g1_start with the signal count added) * Used as a futex word by waiters. Used concurrently by waiters and signalers. - * LSB is currently reserved and 0. __g_size: Waiters remaining in this group (i.e., which have not been signaled yet. * Accessed by signalers and waiters that cancel waiting (both do so only @@ -391,9 +388,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, too. */ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - if (seq < (g1_start >> 1)) + if (seq < g1_start) { /* If the group is closed already, then this waiter originally had enough extra signals to @@ -406,13 +402,13 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, by now, perhaps in the process of switching back to an older G2, but in either case we're allowed to consume the available signal and should not block anymore. */ - if ((int)(signals - lowseq) >= 2) + if ((int)(signals - (unsigned int)g1_start) > 0) { /* Try to grab a signal. See above for MO. (if we do another loop iteration we need to see the correct value of g1_start) */ if (atomic_compare_exchange_weak_acquire ( cond->__data.__g_signals + g, - &signals, signals - 2)) + &signals, signals - 1)) break; else continue;