From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-il1-x136.google.com (mail-il1-x136.google.com [IPv6:2607:f8b0:4864:20::136]) by sourceware.org (Postfix) with ESMTPS id 0ACD53858D37 for ; Mon, 4 Apr 2022 21:39:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0ACD53858D37 Received: by mail-il1-x136.google.com with SMTP id 8so7884166ilq.4 for ; Mon, 04 Apr 2022 14:39:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=PT/JspclKGcXkaiJxYxT1uVW+ElwjZ7qNfqYp1VYysE=; b=BNPY9bP4Y30PJjZZ/1A+cKqX7B8S0SC/zDn0SfsQWq7dbfvdSh8mBMP2vy/F8GeZIN VL/wvYb8BgP4i/Rx3qhoQKM+uVp/28VZC20+75S28emyJc3SFC214w7BqdEKigqF8ZpD 9tdPOFHQFWRbu2Bd1H8cfAxIBO+GgEbu40rdUqJkl4IPnw6xy7l/q2ZKWwyjP+NIPaUq 55dyNcd6uTtQz9x+P9AuqicmXEoN1c2KSqrDPKaoaCyVlfXowwYVV23Onz2kuz9teNpN G4OGtK1Z3201EVkR0pp567AWWHft5RSSO9TIdhtNQdzAFLavoMxe4JLqsfEhgUyV4U9t 6VQg== X-Gm-Message-State: AOAM532rNHqR/TyDrVS9H6KTjwRpgBJzggP1tCdMOYlbuFssfFJZqkP2 wg7Gj0HhOa/yLvSSqsI/sDZJ4F5W44k= X-Google-Smtp-Source: ABdhPJxPB9X2YLj6zQJEXuWzVvutnLF3lpG0gSiunWxMdIt8SeG6ey147dLhT2C2BXqtxHYVfqWgMg== X-Received: by 2002:a92:c56c:0:b0:2c9:db11:98d2 with SMTP id b12-20020a92c56c000000b002c9db1198d2mr155972ilj.152.1649108387975; Mon, 04 Apr 2022 14:39:47 -0700 (PDT) Received: from localhost.localdomain (node-17-161.flex.volo.net. [76.191.17.161]) by smtp.googlemail.com with ESMTPSA id p2-20020a5d9c82000000b00649b622f528sm6956662iop.18.2022.04.04.14.39.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Apr 2022 14:39:47 -0700 (PDT) From: Noah Goldstein To: libc-alpha@sourceware.org Subject: [PATCH v1] sysdeps: Add 'get_fast_jitter' interace in fast-jitter.h Date: Mon, 4 Apr 2022 16:39:42 -0500 Message-Id: <20220404213942.652799-1-goldstein.w.n@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Mon, 04 Apr 2022 21:39:51 -0000 'get_fast_jitter' is meant to be used purely for performance purposes. In all cases it's used it should be acceptable to get no randomness (see default case). An example use case is in setting jitter for retries between threads at a lock. There is a performance benefit to having jitter, but only if the jitter can be generated very quickly and ultimately there is no serious issue if no jitter is generated. The implementation generally uses 'HP_TIMING_NOW' or another cycle counter when the architecture supports it. The default case just returns zero. --- sysdeps/aarch64/fast-jitter.h | 33 +++++++++++++++++++++++++++++++++ sysdeps/alpha/fast-jitter.h | 34 ++++++++++++++++++++++++++++++++++ sysdeps/generic/fast-jitter.h | 35 +++++++++++++++++++++++++++++++++++ sysdeps/s390/fast-jitter.h | 33 +++++++++++++++++++++++++++++++++ sysdeps/sparc/fast-jitter.h | 33 +++++++++++++++++++++++++++++++++ sysdeps/x86_64/fast-jitter.h | 30 ++++++++++++++++++++++++++++++ 6 files changed, 198 insertions(+) create mode 100644 sysdeps/aarch64/fast-jitter.h create mode 100644 sysdeps/alpha/fast-jitter.h create mode 100644 sysdeps/generic/fast-jitter.h create mode 100644 sysdeps/s390/fast-jitter.h create mode 100644 sysdeps/sparc/fast-jitter.h create mode 100644 sysdeps/x86_64/fast-jitter.h diff --git a/sysdeps/aarch64/fast-jitter.h b/sysdeps/aarch64/fast-jitter.h new file mode 100644 index 0000000000..fb09d2632c --- /dev/null +++ b/sysdeps/aarch64/fast-jitter.h @@ -0,0 +1,33 @@ +/* Fast jitter on arm with HP_TIMING_NOW + Copyright (C) 2022-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include +#include + +static inline uint32_t +get_fast_jitter (void) +{ + hp_timing_t jitter; + HP_TIMING_NOW (jitter); + return (uint32_t) jitter; +} + +#endif diff --git a/sysdeps/alpha/fast-jitter.h b/sysdeps/alpha/fast-jitter.h new file mode 100644 index 0000000000..0a24290eaa --- /dev/null +++ b/sysdeps/alpha/fast-jitter.h @@ -0,0 +1,34 @@ +/* Fast jitter on alpha with rpcc + Copyright (C) 2022-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include + +static inline uint32_t +get_fast_jitter (void) +{ + unsigned long int x_; + asm volatile ("rpcc %0" : "=r"(x_)); + /* Don't both with process offset. We only need jitter not + monotonic cycle count. */ + return (uint32_t) x; +} + +#endif diff --git a/sysdeps/generic/fast-jitter.h b/sysdeps/generic/fast-jitter.h new file mode 100644 index 0000000000..63bcf3ccd7 --- /dev/null +++ b/sysdeps/generic/fast-jitter.h @@ -0,0 +1,35 @@ +/* Fallback for fast jitter just return 0. + Copyright (C) 2019-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include + +/* Baseline just return 0. We could create jitter using a clock or + 'random_bits' but that may imply a syscall and the goal of + 'get_fast_jitter' is minimal overhead "randomness" when such + randomness helps performance. Adding high overhead the function + defeats the purpose. */ +static inline uint32_t +get_fast_jitter (void) +{ + return 0; +} + +#endif diff --git a/sysdeps/s390/fast-jitter.h b/sysdeps/s390/fast-jitter.h new file mode 100644 index 0000000000..eb905b1413 --- /dev/null +++ b/sysdeps/s390/fast-jitter.h @@ -0,0 +1,33 @@ +/* Fast jitter on s390 with HP_TIMING_NOW + Copyright (C) 2022-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include +#include + +static inline uint32_t +get_fast_jitter (void) +{ + hp_timing_t jitter; + HP_TIMING_NOW (jitter); + return (uint32_t) jitter; +} + +#endif diff --git a/sysdeps/sparc/fast-jitter.h b/sysdeps/sparc/fast-jitter.h new file mode 100644 index 0000000000..f4413754c5 --- /dev/null +++ b/sysdeps/sparc/fast-jitter.h @@ -0,0 +1,33 @@ +/* Fast jitter on sparc with HP_TIMING_NOW + Copyright (C) 2022-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include +#include + +static inline uint32_t +get_fast_jitter (void) +{ + hp_timing_t jitter; + HP_TIMING_NOW (jitter); + return (uint32_t) jitter; +} + +#endif diff --git a/sysdeps/x86_64/fast-jitter.h b/sysdeps/x86_64/fast-jitter.h new file mode 100644 index 0000000000..1140f1c295 --- /dev/null +++ b/sysdeps/x86_64/fast-jitter.h @@ -0,0 +1,30 @@ +/* X86 use rdtsc to quickly generate pseudo-random for jitter + Copyright (C) 2022-2022 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 + . */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include + +static inline uint32_t +get_fast_jitter (void) +{ + return __builtin_ia32_rdtsc (); +} + +#endif -- 2.25.1