From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) by sourceware.org (Postfix) with ESMTPS id 215B03858004 for ; Sun, 7 Aug 2022 12:51:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 215B03858004 Received: by mail-wr1-f52.google.com with SMTP id l22so8116613wrz.7 for ; Sun, 07 Aug 2022 05:51:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=xaGk//Krb5tMkSVjteJ3Sf0ROObpFq4l+05gId0zvMk=; b=OynzUUbpCL85OHECkTGILg0VpikKxBDlb3DUyIjjAMTdcy72+4UeA2kxoMy/4AEYxO TBeW9giA0wrugXGLrecUxbrKq/w+2P0tNeJPxnWbSxFoDsUEwrjoaKGYfyGr1wWAPDw2 shhjnlvZLh3mFcKqZUiDwzZEyJP5O/ZyDJ4jLxEaK8Ot8IXf9Y98eqvkirJXuiCVnvni 93IUVCkfibsQnJXlT8uXKVkdpyKO11eF0z2NS/2YX22cIp1SOeLkyVxAkQw9L/Ogs7IT pW3YF0mCWYhsIgcs96AZJwpzw9+5zkMv1MfTjOyzl9RbnUJIrEGbRPT3BsmnxymBSqN9 /7Nw== X-Gm-Message-State: ACgBeo0BydhiUAitafwyCpvhg8R5ZrhmnBtU9BfYqhSbbSl8pAw4l2dR YfnKJi4aYgRzPK2pxbjq/0rxVNkSupCU3squsL6h2w== X-Google-Smtp-Source: AA6agR7WMHbVMz+IWPMzIy3Eyb5HVo2PXazJUBTlH9xkMkFc+CaOl9KxUo/S6xp05xZDZ3x6TSR4rCjgQuOrn/DXtNQ= X-Received: by 2002:a05:6000:1863:b0:220:6d5f:deb5 with SMTP id d3-20020a056000186300b002206d5fdeb5mr8656285wri.470.1659876678819; Sun, 07 Aug 2022 05:51:18 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: =?UTF-8?Q?Cristian_Rodr=C3=ADguez?= Date: Sun, 7 Aug 2022 08:51:08 -0400 Message-ID: Subject: Re: [PATCH] Improve performance of IO locks To: Wilco Dijkstra Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, 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 X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Aug 2022 12:51:22 -0000 Sounds good, tested on x86_64. On Mon, Aug 1, 2022 at 7:06 AM Wilco Dijkstra via Libc-alpha wrote: > > > ping > > > Improve performance of recursive IO locks by adding a fast path for > the single-threaded case. To reduce the number of memory accesses for > locking/unlocking, only increment the recursion counter if the lock > is already taken. > > On Neoverse V1, a microbenchmark with many small freads improved by > 2.9 times. Multithreaded performance improved by 2%. > > Passes GLIBC testsuite, OK for commit? > > --- > > diff --git a/sysdeps/nptl/stdio-lock.h b/sysdeps/nptl/stdio-lock.h > index afa0b779c81d7dd915f8edb6c0974e4f231d4e0a..45823cd1629d3e3efecc64a7d07706a6e6de9af1 100644 > --- a/sysdeps/nptl/stdio-lock.h > +++ b/sysdeps/nptl/stdio-lock.h > @@ -37,12 +37,18 @@ typedef struct { int lock; int cnt; void *owner; } _IO_lock_t; > #define _IO_lock_lock(_name) \ > do { \ > void *__self = THREAD_SELF; \ > - if ((_name).owner != __self) \ > + if (SINGLE_THREAD_P && (_name).owner == NULL) \ > + { \ > + (_name).lock = LLL_LOCK_INITIALIZER_LOCKED; \ > + (_name).owner = __self; \ > + } \ > + else if ((_name).owner != __self) \ > { \ > lll_lock ((_name).lock, LLL_PRIVATE); \ > - (_name).owner = __self; \ > + (_name).owner = __self; \ > } \ > - ++(_name).cnt; \ > + else \ > + ++(_name).cnt; \ > } while (0) > > #define _IO_lock_trylock(_name) \ > @@ -52,10 +58,7 @@ typedef struct { int lock; int cnt; void *owner; } _IO_lock_t; > if ((_name).owner != __self) \ > { \ > if (lll_trylock ((_name).lock) == 0) \ > - { \ > - (_name).owner = __self; \ > - (_name).cnt = 1; \ > - } \ > + (_name).owner = __self; \ > else \ > __result = EBUSY; \ > } \ > @@ -66,11 +69,18 @@ typedef struct { int lock; int cnt; void *owner; } _IO_lock_t; > > #define _IO_lock_unlock(_name) \ > do { \ > - if (--(_name).cnt == 0) \ > + if (SINGLE_THREAD_P && (_name).cnt == 0) \ > + { \ > + (_name).owner = NULL; \ > + (_name).lock = 0; \ > + } \ > + else if ((_name).cnt == 0) \ > { \ > - (_name).owner = NULL; \ > + (_name).owner = NULL; \ > lll_unlock ((_name).lock, LLL_PRIVATE); \ > } \ > + else \ > + --(_name).cnt; \ > } while (0) > >