From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21940 invoked by alias); 28 Apr 2014 14:56:47 -0000 Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org Received: (qmail 21913 invoked by uid 89); 28 Apr 2014 14:56:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ie0-f179.google.com Received: from mail-ie0-f179.google.com (HELO mail-ie0-f179.google.com) (209.85.223.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 28 Apr 2014 14:56:43 +0000 Received: by mail-ie0-f179.google.com with SMTP id lx4so6726191iec.10 for ; Mon, 28 Apr 2014 07:56:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=KEzyKqs2dQ7Ie0ChKC/MDCUg0fPylX0CgP3rJXTevgk=; b=Jf/SLctAf9u+mNcRIMwJNfre/Ew2oQyebw+x7Bhyll+lIePTiIfcLfT4XGqkv2lKDH v7+WdFEKNIChPVaaHR/I7pGN4xLhDTPBX/owvEw+THkDjpBO69lo94x1RaBk4YGfsR6f Q3h/UMZEU70olRTiQmmCHRGXYrIrS51wbp+9q9mhW/irv4vsguP7uEF/y/3IN5h8SHRU Czqna8itmrPKKjf8rhpSOZhurV8R8uuz5uboH4Q4PBfMbEGI2LcshU7ltaOzcZjzHvOi 8gmt3hQoGARcMaYcibbCwc+j2mYJf+tPBu35yjV5AwHv0VBkOLIdcxqFG42stfS3X0By r1EA== X-Gm-Message-State: ALoCoQkMZh04U1bB84UbxF1jsSetcor2QkH9scLEAHxuu5bnvlGMAKNKIH2mmiIG/Mhyo4LgbI/a MIME-Version: 1.0 X-Received: by 10.50.136.233 with SMTP id qd9mr23438988igb.0.1398697002083; Mon, 28 Apr 2014 07:56:42 -0700 (PDT) Received: by 10.64.14.33 with HTTP; Mon, 28 Apr 2014 07:56:42 -0700 (PDT) In-Reply-To: References: Date: Mon, 28 Apr 2014 14:56:00 -0000 Message-ID: Subject: Re: [PATCH] Remove arm lowlevellock.c From: Will Newton To: Bernie Ogden Cc: "libc-ports@sourceware.org" , libc-alpha Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2014-04/txt/msg00003.txt.bz2 Hi Bernie, ARM patches can now be sent to libc-alpha as ARM has moved from ports into the main tree. I'm not sure if we still use libc-ports for HPPA patches... On 28 April 2014 15:50, Bernie Ogden wrote: > lowlevellock.c for arm differs from the generic lowlevellock.c only in > insignificant ways, so can be removed. Happily, this fixes BZ 15119 > (unnecessary busy loop in __lll_timedlock_wait on arm). > > The notable differences between the arm and generic implementations are: > > 1) arm __lll_timedlock_wait has a fast path out if futex has been set > to 0 between since the function was called. This seems unlikely to > happen very often, so it seems at worst harmless to lose this fast > path. > > 2) Some function in arm's lowlevellock.c set futex to 2 if it was 1. > The generic version always sets the futex to 2. As futex can only be > 0, 1 or 2 on entry into these functions, the behaviour is equivalent. > (If the futex manages to be 0 on entry then we've just lost another > unlikely fast path out.) > > There are no test suite regressions. > > Note that hppa and sparc also have their own lowlevellock.c. I believe > hppa can also be removed, so I'll send a separate patch for that > shortly. sparc's seems to be genuinely needed as it uses a different > locking structure. > > Also note that the analysis at > https://sourceware.org/ml/libc-ports/2013-02/msg00021.html indicates a > further locking performance bug to fix - I've got a partial patch for > that which I can submit once I've finished testing. > > 2014-04-24 Bernard Ogden > > [BZ #15119] > * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c: Remove file. > > > diff --git a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c > b/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c > deleted file mode 100644 > index 9603d7b..0000000 > --- a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c > +++ /dev/null > @@ -1,132 +0,0 @@ > -/* low level locking for pthread library. Generic futex-using version. > - Copyright (C) 2003-2014 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - > - The GNU C Library is free software; you can redistribute it and/or > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library. If not, see > - . */ > - > -#include > -#include > -#include > -#include > - > -void > -__lll_lock_wait_private (int *futex) > -{ > - do > - { > - int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1); > - if (oldval != 0) > - lll_futex_wait (futex, 2, LLL_PRIVATE); > - } > - while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); > -} > - > - > -/* These functions don't get included in libc.so */ > -#ifdef IS_IN_libpthread > -void > -__lll_lock_wait (int *futex, int private) > -{ > - do > - { > - int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1); > - if (oldval != 0) > - lll_futex_wait (futex, 2, private); > - } > - while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); > -} > - > - > -int > -__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private) > -{ > - struct timespec rt; > - > - /* Reject invalid timeouts. */ > - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) > - return EINVAL; > - > - /* Upgrade the lock. */ > - if (atomic_exchange_acq (futex, 2) == 0) > - return 0; > - > - do > - { > - struct timeval tv; > - > - /* Get the current time. */ > - (void) __gettimeofday (&tv, NULL); > - > - /* Compute relative timeout. */ > - rt.tv_sec = abstime->tv_sec - tv.tv_sec; > - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; > - if (rt.tv_nsec < 0) > - { > - rt.tv_nsec += 1000000000; > - --rt.tv_sec; > - } > - > - /* Already timed out? */ > - if (rt.tv_sec < 0) > - return ETIMEDOUT; > - > - // XYZ: Lost the lock to check whether it was private. > - lll_futex_timed_wait (futex, 2, &rt, private); > - } > - while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); > - > - return 0; > -} > - > - > -int > -__lll_timedwait_tid (int *tidp, const struct timespec *abstime) > -{ > - int tid; > - > - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) > - return EINVAL; > - > - /* Repeat until thread terminated. */ > - while ((tid = *tidp) != 0) > - { > - struct timeval tv; > - struct timespec rt; > - > - /* Get the current time. */ > - (void) __gettimeofday (&tv, NULL); > - > - /* Compute relative timeout. */ > - rt.tv_sec = abstime->tv_sec - tv.tv_sec; > - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; > - if (rt.tv_nsec < 0) > - { > - rt.tv_nsec += 1000000000; > - --rt.tv_sec; > - } > - > - /* Already timed out? */ > - if (rt.tv_sec < 0) > - return ETIMEDOUT; > - > - /* Wait until thread terminates. */ > - // XYZ: Lost the lock to check whether it was private. > - if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT) > - return ETIMEDOUT; > - } > - > - return 0; > -} > -#endif -- Will Newton Toolchain Working Group, Linaro