From patchwork Mon Apr 28 14:50:29 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernie Ogden X-Patchwork-Id: 29252 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f72.google.com (mail-pa0-f72.google.com [209.85.220.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 9E3DD202FE for ; Mon, 28 Apr 2014 14:50:39 +0000 (UTC) Received: by mail-pa0-f72.google.com with SMTP id rd3sf18774562pab.11 for ; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mailing-list:precedence:list-id :list-unsubscribe:list-subscribe:list-post:list-help:sender :delivered-to:mime-version:date:message-id:subject:from:to :x-original-sender:x-original-authentication-results:list-archive :content-type; bh=INXZrcPvap3952+VQ8pV0vDLw+hkN2niL/ypuD64Em4=; b=HxVHvkhwiOcRqSsatypBhPZ6UZd9qu57MSjknkie3NP/sIg/5wlfa5Rm3rXBaj1a1F gKZWU9xmk7JCL1Grs1Atd8UKxJ4wyukhxNMtYUELqEgpcoDoxpbEo9AYBIpU4tWWV9N7 mqAOycTJpjS8085PeH9e4N19CSz6dwwhDBqLeG+jxeX8xT257fSWI9BLnt8HC8LY8tr8 w/sTjPE5GYNcqj2+R6kNzeQZFYkYr0YXP4PX3FRbWMu/mcAkG8XOYCD3s4sgfqh598c7 FcMd/XJNdjSp3DLMsS2dN1qIz2OryP1pb8rehJZqZvnYa40NuK3l2XHEFL2nIRp8FNrb W1cQ== X-Gm-Message-State: ALoCoQnBoeCqxYMMAhALFt4L5sZlTrQ1fpasYQjCsa6IVjNNPz9Xc70RNoyzi3jPozAwvnjzGaIR X-Received: by 10.66.163.33 with SMTP id yf1mr12348279pab.19.1398696638906; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.41.212 with SMTP id z78ls2725931qgz.93.gmail; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) X-Received: by 10.52.6.162 with SMTP id c2mr20688082vda.6.1398696638700; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) Received: from mail-ve0-x22d.google.com (mail-ve0-x22d.google.com [2607:f8b0:400c:c01::22d]) by mx.google.com with ESMTPS id at8si3685826vec.37.2014.04.28.07.50.38 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 28 Apr 2014 07:50:38 -0700 (PDT) Received-SPF: none (google.com: patch+caf_=patchwork-forward=linaro.org@linaro.org does not designate permitted sender hosts) client-ip=2607:f8b0:400c:c01::22d; Received: by mail-ve0-f173.google.com with SMTP id oy12so8065597veb.18 for ; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) X-Received: by 10.220.12.66 with SMTP id w2mr23825278vcw.15.1398696638272; Mon, 28 Apr 2014 07:50:38 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp123501vcb; Mon, 28 Apr 2014 07:50:37 -0700 (PDT) X-Received: by 10.68.225.74 with SMTP id ri10mr29696520pbc.116.1398696637438; Mon, 28 Apr 2014 07:50:37 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id gy7si10613448pac.444.2014.04.28.07.50.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Apr 2014 07:50:37 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-ports-return-4794-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 8830 invoked by alias); 28 Apr 2014 14:50:34 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list List-Id: List-Unsubscribe: , List-Subscribe: List-Post: , List-Help: , Sender: libc-ports-owner@sourceware.org Delivered-To: mailing list libc-ports@sourceware.org Received: (qmail 8816 invoked by uid 89); 28 Apr 2014 14:50:33 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qg0-f52.google.com Received: from mail-qg0-f52.google.com (HELO mail-qg0-f52.google.com) (209.85.192.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 28 Apr 2014 14:50:31 +0000 Received: by mail-qg0-f52.google.com with SMTP id j5so6979312qga.39 for ; Mon, 28 Apr 2014 07:50:29 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.140.43.70 with SMTP id d64mr32406752qga.11.1398696629445; Mon, 28 Apr 2014 07:50:29 -0700 (PDT) Received: by 10.96.152.200 with HTTP; Mon, 28 Apr 2014 07:50:29 -0700 (PDT) Date: Mon, 28 Apr 2014 15:50:29 +0100 Message-ID: Subject: [PATCH] Remove arm lowlevellock.c From: Bernie Ogden To: libc-ports@sourceware.org X-IsSubscribed: yes X-Original-Sender: bernie.ogden@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: patch+caf_=patchwork-forward=linaro.org@linaro.org does not designate permitted sender hosts) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 List-Archive: 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