Message ID | 20220404213942.652799-1-goldstein.w.n@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v1] sysdeps: Add 'get_fast_jitter' interace in fast-jitter.h | expand |
On Mon, Apr 4, 2022 at 4:39 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > '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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +/* 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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +static inline uint32_t > +get_fast_jitter (void) > +{ > + return __builtin_ia32_rdtsc (); > +} > + > +#endif > -- > 2.25.1 > Ping.
On 04/04/2022 18:39, Noah Goldstein via Libc-alpha wrote: > '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. I think it should ok, although I think it would be better to be sent along with a actual usage (as the pthread mutex optimization). > --- > 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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +/* 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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > +#include <hp-timing.h> > + > +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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _FAST_JITTER_H > +# define _FAST_JITTER_H > + > +#include <stdint.h> > + > +static inline uint32_t > +get_fast_jitter (void) > +{ > + return __builtin_ia32_rdtsc (); Why can we use HP_TIMING_NOW for x86 as well? So you then you can use only a generic implementation like: static inline uint32_t get_fast_jitter (void) { #if HP_TIMING_INLINE hp_timing_t jitter; HP_TIMING_NOW (jitter); return (uint32_t) jitter; #else return 0; #endif }
On Wed, Apr 27, 2022 at 10:48 AM Adhemerval Zanella via Libc-alpha <libc-alpha@sourceware.org> wrote: > > > > On 04/04/2022 18:39, Noah Goldstein via Libc-alpha wrote: > > '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. > > I think it should ok, although I think it would be better to be sent > along with a actual usage (as the pthread mutex optimization). > > > --- > > 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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > +#include <hp-timing.h> > > + > > +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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > + > > +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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > + > > +/* 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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > +#include <hp-timing.h> > > + > > +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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > +#include <hp-timing.h> > > + > > +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 > > + <https://www.gnu.org/licenses/>. */ > > + > > +#ifndef _FAST_JITTER_H > > +# define _FAST_JITTER_H > > + > > +#include <stdint.h> > > + > > +static inline uint32_t > > +get_fast_jitter (void) > > +{ > > + return __builtin_ia32_rdtsc (); > > Why can we use HP_TIMING_NOW for x86 as well? So you then you can use > only a generic implementation like: > > static inline uint32_t > get_fast_jitter (void) > { > #if HP_TIMING_INLINE > hp_timing_t jitter; > HP_TIMING_NOW (jitter); > return (uint32_t) jitter; > #else > return 0; > #endif > } I'd like this version. Noah, can you send v2? Thanks,
On Wed, Apr 27, 2022 at 1:05 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Wed, Apr 27, 2022 at 10:48 AM Adhemerval Zanella via Libc-alpha > <libc-alpha@sourceware.org> wrote: > > > > > > > > On 04/04/2022 18:39, Noah Goldstein via Libc-alpha wrote: > > > '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. > > > > I think it should ok, although I think it would be better to be sent > > along with a actual usage (as the pthread mutex optimization). > > > > > --- > > > 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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > +#include <hp-timing.h> > > > + > > > +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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > + > > > +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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > + > > > +/* 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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > +#include <hp-timing.h> > > > + > > > +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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > +#include <hp-timing.h> > > > + > > > +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 > > > + <https://www.gnu.org/licenses/>. */ > > > + > > > +#ifndef _FAST_JITTER_H > > > +# define _FAST_JITTER_H > > > + > > > +#include <stdint.h> > > > + > > > +static inline uint32_t > > > +get_fast_jitter (void) > > > +{ > > > + return __builtin_ia32_rdtsc (); > > > > Why can we use HP_TIMING_NOW for x86 as well? So you then you can use > > only a generic implementation like: > > > > static inline uint32_t > > get_fast_jitter (void) > > { > > #if HP_TIMING_INLINE > > hp_timing_t jitter; > > HP_TIMING_NOW (jitter); > > return (uint32_t) jitter; > > #else > > return 0; > > #endif > > } > > I'd like this version. Noah, can you send v2? > Fixed in V2, alpha arch will be slower but otherwise should be the same. > Thanks, > > -- > H.J.
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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> +#include <hp-timing.h> + +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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> + +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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> + +/* 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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> +#include <hp-timing.h> + +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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> +#include <hp-timing.h> + +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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _FAST_JITTER_H +# define _FAST_JITTER_H + +#include <stdint.h> + +static inline uint32_t +get_fast_jitter (void) +{ + return __builtin_ia32_rdtsc (); +} + +#endif