All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Nick Terrell <terrelln@fb.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>, Kajol Jain <kjain@linux.ibm.com>,
	Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
	Huacai Chen <chenhuacai@kernel.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	"Steinar H. Gunderson" <sesse@google.com>,
	Liam Howlett <liam.howlett@oracle.com>,
	Miguel Ojeda <ojeda@kernel.org>,
	Colin Ian King <colin.i.king@gmail.com>,
	Dmitrii Dolgov <9erthalion6@gmail.com>,
	Yang Jihong <yangjihong1@huawei.com>,
	Ming Wang <wangming01@loongson.cn>,
	James Clark <james.clark@arm.com>,
	K Prateek Nayak <kprateek.nayak@amd.com>,
	Sean Christopherson <seanjc@google.com>,
	Leo Yan <leo.yan@linaro.org>,
	Ravi Bangoria <ravi.bangoria@amd.com>,
	German Gomez <german.gomez@arm.com>,
	Changbin Du <changbin.du@huawei.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Li Dong <lidong@vivo.com>,
	Sandipan Das <sandipan.das@amd.com>,
	liuwenyu <liuwenyu7@huawei.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Guilherme Amadio <amadio@gentoo.org>
Subject: Re: [PATCH v5 06/50] tools lib api: Add io_dir an allocation free readdir alternative
Date: Thu, 30 Nov 2023 18:25:50 -0300	[thread overview]
Message-ID: <ZWj93nq9GBpga7nT@kernel.org> (raw)
In-Reply-To: <CAP-5=fUj7ZCchuwBW7xLe0UK8eupQUH3n9t0vcXGg=F57g-eMQ@mail.gmail.com>

Em Thu, Nov 30, 2023 at 09:56:42AM -0800, Ian Rogers escreveu:
> On Thu, Nov 30, 2023 at 9:21 AM Arnaldo Carvalho de Melo
> <acme@kernel.org> wrote:
> >
> > Em Mon, Nov 27, 2023 at 02:08:18PM -0800, Ian Rogers escreveu:
> > > glibc's opendir allocates a minimum of 32kb, when called recursively
> > > for a directory tree the memory consumption can add up - nearly 300kb
> > > during perf start-up when processing modules. Add a stack allocated
> > > variant of readdir sized a little more than 1kb.
> >
> > Now, on some systems:
> >
> >   CC      /tmp/build/perf/pmu-events/pmu-events.o
> > In file included from util/machine.c:39:
> > /tmp/build/perf/libapi/include/api/io_dir.h: In function ‘io_dir__readdir’:
> > /tmp/build/perf/libapi/include/api/io_dir.h:46:16: error: implicit declaration of function ‘getdents64’; did you mean ‘getentropy’? [-Werror=implicit-function-declaration]
> >    ssize_t rc = getdents64(iod->dirfd, iod->buff, sizeof(iod->buff));
> >                 ^~~~~~~~~~
> >                 getentropy
> >   CC      /tmp/build/perf/tests/workloads/brstack.o
> >   CC      /tmp/build/perf/tests/workloads/datasym.o
> >   CC      /tmp/build/perf/util/maps.o
> 
> 
> Sorry for that. Is it a _GNU_SOURCE issue? I thought we generally had

Nope, some systems just don't have that function in its libc, for
instance, a Red Hat derivative with glibc 2.28:

glibc-2.28-189.5.el8_6.x86_64

[perfbuilder@56645cef2169 /]$ grep -r getdents64 /usr/include
/usr/include/bits/syscall.h:#ifdef __NR_getdents64
/usr/include/bits/syscall.h:# define SYS_getdents64 __NR_getdents64
/usr/include/asm-generic/unistd.h:#define __NR_getdents64 61
/usr/include/asm-generic/unistd.h:__SYSCALL(__NR_getdents64, sys_getdents64)
/usr/include/sanitizer/linux_syscall_hooks.h:#define __sanitizer_syscall_pre_getdents64(fd, dirent, count)         \
/usr/include/sanitizer/linux_syscall_hooks.h:  __sanitizer_syscall_pre_impl_getdents64((long)(fd), (long)(dirent), \
/usr/include/sanitizer/linux_syscall_hooks.h:#define __sanitizer_syscall_post_getdents64(res, fd, dirent, count)         \
/usr/include/sanitizer/linux_syscall_hooks.h:  __sanitizer_syscall_post_impl_getdents64(res, (long)(fd), (long)(dirent), \
/usr/include/sanitizer/linux_syscall_hooks.h:void __sanitizer_syscall_pre_impl_getdents64(long fd, long dirent, long count);
/usr/include/sanitizer/linux_syscall_hooks.h:void __sanitizer_syscall_post_impl_getdents64(long res, long fd, long dirent,
/usr/include/asm/unistd_64.h:#define __NR_getdents64 217
/usr/include/asm/unistd_x32.h:#define __NR_getdents64 (__X32_SYSCALL_BIT + 217)
/usr/include/asm/unistd_32.h:#define __NR_getdents64 220
[perfbuilder@56645cef2169 /]$

Systems with musl libc fail differently:

   6    19.51 alpine:3.18                   : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10)
      CC      /tmp/build/perf/util/sample-raw.o
      CC      /tmp/build/perf/tests/kmod-path.o
      CC      /tmp/build/perf/tests/thread-map.o
      CC      /tmp/build/perf/tests/topology.o
    In file included from util/machine.c:39:
    /tmp/build/perf/libapi/include/api/io_dir.h: In function 'io_dir__readdir':
    /tmp/build/perf/libapi/include/api/io_dir.h:46:56: error: passing argument 2 of 'getdents' from incompatible pointer type [-Werror=incompatible-pointer-types]
       46 |                 ssize_t rc = getdents64(iod->dirfd, iod->buff, sizeof(iod->buff));
          |                                                     ~~~^~~~~~
          |                                                        |
          |                                                        struct io_dirent64 *
    In file included from util/machine.c:2:
    /usr/include/dirent.h:52:19: note: expected 'struct dirent *' but argument is of type 'struct io_dirent64 *'
       52 | int getdents(int, struct dirent *, size_t);
          |                   ^~~~~~~~~~~~~~~

Their devel distro also fails like that:

   7    20.49 alpine:edge                   : FAIL gcc version 13.1.1 20230722 (Alpine 13.1.1_git20230722)
      CC      /tmp/build/perf/tests/sdt.o
      CC      /tmp/build/perf/util/maps.o
      CC      /tmp/build/perf/tests/is_printable_array.o
      CC      /tmp/build/perf/util/intel-pt-decoder/intel-pt-insn-decoder.o
    In file included from util/machine.c:39:
    /tmp/build/perf/libapi/include/api/io_dir.h: In function 'io_dir__readdir':
    /tmp/build/perf/libapi/include/api/io_dir.h:46:56: error: passing argument 2 of 'getdents' from incompatible pointer type [-Werror=incompatible-pointer-types]
       46 |                 ssize_t rc = getdents64(iod->dirfd, iod->buff, sizeof(iod->buff));
          |                                                     ~~~^~~~~~
          |                                                        |
          |                                                        struct io_dirent64 *
    In file included from util/machine.c:2:
    /usr/include/dirent.h:52:19: note: expected 'struct dirent *' but argument is of type 'struct io_dirent64 *'
       52 | int getdents(int, struct dirent *, size_t);
          |                   ^~~~~~~~~~~~~~~
      CC      /tmp/build/perf/tests/bitmap.o

And then we have nolibc:

⬢[acme@toolbox perf-tools-next]$ find tools/ -name nolibc
tools/include/nolibc
tools/testing/selftests/nolibc
⬢[acme@toolbox perf-tools-next]$ grep getdents64 tools/include/nolibc/*
tools/include/nolibc/sys.h: * int getdents64(int fd, struct linux_dirent64 *dirp, int count);
tools/include/nolibc/sys.h:int sys_getdents64(int fd, struct linux_dirent64 *dirp, int count)
tools/include/nolibc/sys.h:	return my_syscall3(__NR_getdents64, fd, dirp, count);
tools/include/nolibc/sys.h:int getdents64(int fd, struct linux_dirent64 *dirp, int count)
tools/include/nolibc/sys.h:	return __sysret(sys_getdents64(fd, dirp, count));
tools/include/nolibc/types.h:/* for getdents64() */
⬢[acme@toolbox perf-tools-next]$

On musl libc systems:

/ $ grep -A1 -B20 getdents64 /usr/include/*.h
/usr/include/dirent.h-#define DT_SOCK 12
/usr/include/dirent.h-#define DT_WHT 14
/usr/include/dirent.h-#define IFTODT(x) ((x)>>12 & 017)
/usr/include/dirent.h-#define DTTOIF(x) ((x)<<12)
/usr/include/dirent.h-int getdents(int, struct dirent *, size_t);
/usr/include/dirent.h-#endif
/usr/include/dirent.h-
/usr/include/dirent.h-#ifdef _GNU_SOURCE
/usr/include/dirent.h-int versionsort(const struct dirent **, const struct dirent **);
/usr/include/dirent.h-#endif
/usr/include/dirent.h-
/usr/include/dirent.h-#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
/usr/include/dirent.h-#define dirent64 dirent
/usr/include/dirent.h-#define readdir64 readdir
/usr/include/dirent.h-#define readdir64_r readdir_r
/usr/include/dirent.h-#define scandir64 scandir
/usr/include/dirent.h-#define alphasort64 alphasort
/usr/include/dirent.h-#define versionsort64 versionsort
/usr/include/dirent.h-#define off64_t off_t
/usr/include/dirent.h-#define ino64_t ino_t
/usr/include/dirent.h:#define getdents64 getdents
/usr/include/dirent.h-#endif
/ $

> _GNU_SOURCE defined on the command line for reallocarray. Maybe we
> shouldn't define this on the command line and do it immediately before
> the relevant include with:
> 
> #ifndef _GNU_SOURCE
> #define _GNU_SOURCE
> #endif
> 
> like in tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
> 
> Thanks,
> Ian
> 
> >
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > ---
> > >  tools/lib/api/Makefile |  2 +-
> > >  tools/lib/api/io_dir.h | 75 ++++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 76 insertions(+), 1 deletion(-)
> > >  create mode 100644 tools/lib/api/io_dir.h
> > >
> > > diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile
> > > index 044860ac1ed1..186aa407de8c 100644
> > > --- a/tools/lib/api/Makefile
> > > +++ b/tools/lib/api/Makefile
> > > @@ -99,7 +99,7 @@ install_lib: $(LIBFILE)
> > >               $(call do_install_mkdir,$(libdir_SQ)); \
> > >               cp -fpR $(LIBFILE) $(DESTDIR)$(libdir_SQ)
> > >
> > > -HDRS := cpu.h debug.h io.h
> > > +HDRS := cpu.h debug.h io.h io_dir.h
> > >  FD_HDRS := fd/array.h
> > >  FS_HDRS := fs/fs.h fs/tracing_path.h
> > >  INSTALL_HDRS_PFX := $(DESTDIR)$(prefix)/include/api
> > > diff --git a/tools/lib/api/io_dir.h b/tools/lib/api/io_dir.h
> > > new file mode 100644
> > > index 000000000000..f3479006edb6
> > > --- /dev/null
> > > +++ b/tools/lib/api/io_dir.h
> > > @@ -0,0 +1,75 @@
> > > +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
> > > +/*
> > > + * Lightweight directory reading library.
> > > + */
> > > +#ifndef __API_IO_DIR__
> > > +#define __API_IO_DIR__
> > > +
> > > +#include <dirent.h>
> > > +#include <fcntl.h>
> > > +#include <stdlib.h>
> > > +#include <unistd.h>
> > > +#include <sys/stat.h>
> > > +
> > > +struct io_dirent64 {
> > > +     ino64_t        d_ino;    /* 64-bit inode number */
> > > +     off64_t        d_off;    /* 64-bit offset to next structure */
> > > +     unsigned short d_reclen; /* Size of this dirent */
> > > +     unsigned char  d_type;   /* File type */
> > > +     char           d_name[NAME_MAX + 1]; /* Filename (null-terminated) */
> > > +};
> > > +
> > > +struct io_dir {
> > > +     int dirfd;
> > > +     ssize_t available_bytes;
> > > +     struct io_dirent64 *next;
> > > +     struct io_dirent64 buff[4];
> > > +};
> > > +
> > > +static inline void io_dir__init(struct io_dir *iod, int dirfd)
> > > +{
> > > +     iod->dirfd = dirfd;
> > > +     iod->available_bytes = 0;
> > > +}
> > > +
> > > +static inline void io_dir__rewinddir(struct io_dir *iod)
> > > +{
> > > +     lseek(iod->dirfd, 0, SEEK_SET);
> > > +     iod->available_bytes = 0;
> > > +}
> > > +
> > > +static inline struct io_dirent64 *io_dir__readdir(struct io_dir *iod)
> > > +{
> > > +     struct io_dirent64 *entry;
> > > +
> > > +     if (iod->available_bytes <= 0) {
> > > +             ssize_t rc = getdents64(iod->dirfd, iod->buff, sizeof(iod->buff));
> > > +
> > > +             if (rc <= 0)
> > > +                     return NULL;
> > > +             iod->available_bytes = rc;
> > > +             iod->next = iod->buff;
> > > +     }
> > > +     entry = iod->next;
> > > +     iod->next = (struct io_dirent64 *)((char *)entry + entry->d_reclen);
> > > +     iod->available_bytes -= entry->d_reclen;
> > > +     return entry;
> > > +}
> > > +
> > > +static inline bool io_dir__is_dir(const struct io_dir *iod, struct io_dirent64 *dent)
> > > +{
> > > +     if (dent->d_type == DT_UNKNOWN) {
> > > +             struct stat st;
> > > +
> > > +             if (fstatat(iod->dirfd, dent->d_name, &st, /*flags=*/0))
> > > +                     return false;
> > > +
> > > +             if (S_ISDIR(st.st_mode)) {
> > > +                     dent->d_type = DT_DIR;
> > > +                     return true;
> > > +             }
> > > +     }
> > > +     return dent->d_type == DT_DIR;
> > > +}
> > > +
> > > +#endif
> > > --
> > > 2.43.0.rc1.413.gea7ed67945-goog
> > >
> >
> > --
> >
> > - Arnaldo

-- 

- Arnaldo

  reply	other threads:[~2023-11-30 21:25 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-27 22:08 [PATCH v5 00/50] Improvements to memory use Ian Rogers
2023-11-27 22:08 ` [PATCH v5 01/50] perf comm: Use regular mutex Ian Rogers
2023-11-30  0:55   ` Namhyung Kim
2023-11-30 18:27     ` Ian Rogers
2023-12-02 23:54       ` Namhyung Kim
2023-12-07  0:05         ` Ian Rogers
2024-02-06  3:04           ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 02/50] libperf: Lazily allocate/size mmap event copy Ian Rogers
2023-11-30  1:25   ` Namhyung Kim
2023-11-30 13:15   ` Arnaldo Carvalho de Melo
2023-11-30 14:19     ` Arnaldo Carvalho de Melo
2023-11-30 17:17       ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 03/50] perf mmap: Lazily initialize zstd streams Ian Rogers
2023-11-30  1:28   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 04/50] tools api fs: Switch filename__read_str to use io.h Ian Rogers
2023-11-30  1:36   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 05/50] tools api fs: Avoid reading whole file for a 1 byte bool Ian Rogers
2023-11-30  1:42   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 06/50] tools lib api: Add io_dir an allocation free readdir alternative Ian Rogers
2023-11-30  1:49   ` Namhyung Kim
2023-11-30 17:21   ` Arnaldo Carvalho de Melo
2023-11-30 17:56     ` Ian Rogers
2023-11-30 21:25       ` Arnaldo Carvalho de Melo [this message]
2023-12-07  5:13         ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 07/50] perf maps: Switch modules tree walk to io_dir__readdir Ian Rogers
2023-11-30  1:59   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 08/50] perf record: Be lazier in allocating lost samples buffer Ian Rogers
2023-11-30  2:09   ` Namhyung Kim
2023-11-30 18:29     ` Ian Rogers
2023-12-02 23:56       ` Namhyung Kim
2023-12-05 15:54         ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 09/50] perf pmu: Switch to io_dir__readdir Ian Rogers
2023-11-30  2:16   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 10/50] perf header: Switch mem topology " Ian Rogers
2023-11-30  4:17   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 11/50] perf events: Remove scandir in thread synthesis Ian Rogers
2023-11-30  4:22   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 12/50] perf map: Simplify map_ip/unmap_ip and make map size smaller Ian Rogers
2023-12-04 23:39   ` Namhyung Kim
2023-12-06 13:49     ` Arnaldo Carvalho de Melo
2023-12-06 16:19       ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 13/50] perf maps: Move symbol maps functions to maps.c Ian Rogers
2023-12-04 23:40   ` Namhyung Kim
2023-12-06 13:50     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 14/50] perf thread: Add missing RC_CHK_EQUAL Ian Rogers
2023-12-04 23:41   ` Namhyung Kim
2023-12-06 13:51     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 15/50] perf maps: Add maps__for_each_map to call a function on each entry Ian Rogers
2023-12-04 23:46   ` Namhyung Kim
2023-12-06 13:53     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 16/50] perf maps: Add remove maps function to remove a map based on callback Ian Rogers
2023-12-04 23:49   ` Namhyung Kim
2023-12-06 23:28     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 17/50] perf debug: Expose debug file Ian Rogers
2023-12-04 23:53   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 18/50] perf maps: Refactor maps__fixup_overlappings Ian Rogers
2023-12-04 23:59   ` Namhyung Kim
2023-12-06 23:39     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 19/50] perf maps: Do simple merge if given map doesn't overlap Ian Rogers
2023-12-05  0:06   ` Namhyung Kim
2023-12-06 23:51     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 20/50] perf maps: Rename clone to copy from Ian Rogers
2023-12-05  0:07   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 21/50] perf maps: Add maps__load_first Ian Rogers
2023-11-27 22:08 ` [PATCH v5 22/50] perf maps: Add find next entry to give entry after the given map Ian Rogers
2023-11-27 22:08 ` [PATCH v5 23/50] perf maps: Reduce scope of map_rb_node and maps internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 24/50] perf maps: Fix up overlaps during fixup_end Ian Rogers
2023-11-27 22:08 ` [PATCH v5 25/50] perf maps: Switch from rbtree to lazily sorted array for addresses Ian Rogers
2023-11-27 22:08 ` [PATCH v5 26/50] perf maps: Get map before returning in maps__find Ian Rogers
2023-11-27 22:08 ` [PATCH v5 27/50] perf maps: Get map before returning in maps__find_by_name Ian Rogers
2023-11-27 22:08 ` [PATCH v5 28/50] perf maps: Get map before returning in maps__find_next_entry Ian Rogers
2023-11-27 22:08 ` [PATCH v5 29/50] perf maps: Hide maps internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 30/50] perf maps: Locking tidy up of nr_maps Ian Rogers
2023-11-27 22:08 ` [PATCH v5 31/50] perf dso: Reorder variables to save space in struct dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 32/50] perf report: Sort child tasks by tid Ian Rogers
2023-11-27 22:08 ` [PATCH v5 33/50] perf trace: Ignore thread hashing in summary Ian Rogers
2023-11-27 22:08 ` [PATCH v5 34/50] perf machine: Move fprintf to for_each loop and a callback Ian Rogers
2023-11-27 22:08 ` [PATCH v5 35/50] perf threads: Move threads to its own files Ian Rogers
2023-11-27 22:08 ` [PATCH v5 36/50] perf threads: Switch from rbtree to hashmap Ian Rogers
2023-11-27 22:08 ` [PATCH v5 37/50] perf threads: Reduce table size from 256 to 8 Ian Rogers
2023-11-27 22:08 ` [PATCH v5 38/50] perf dsos: Attempt to better abstract dsos internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 39/50] perf dsos: Tidy reference counting and locking Ian Rogers
2023-11-27 22:08 ` [PATCH v5 40/50] perf dsos: Add dsos__for_each_dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 41/50] perf dso: Move dso functions out of dsos Ian Rogers
2023-11-27 22:08 ` [PATCH v5 42/50] perf dsos: Switch more loops to dsos__for_each_dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 43/50] perf dsos: Switch backing storage to array from rbtree/list Ian Rogers
2023-11-27 22:08 ` [PATCH v5 44/50] perf dsos: Remove __dsos__addnew Ian Rogers
2023-11-27 22:08 ` [PATCH v5 45/50] perf dsos: Remove __dsos__findnew_link_by_longname_id Ian Rogers
2023-11-27 22:08 ` [PATCH v5 46/50] perf dsos: Switch hand code to bsearch Ian Rogers
2023-11-27 22:08 ` [PATCH v5 47/50] perf dso: Add reference count checking and accessor functions Ian Rogers
2023-11-27 22:09 ` [PATCH v5 48/50] perf dso: Reference counting related fixes Ian Rogers
2023-11-27 22:09 ` [PATCH v5 49/50] perf dso: Use container_of to avoid a pointer in dso_data Ian Rogers
2023-11-27 22:09 ` [PATCH v5 50/50] perf env: Avoid recursively taking env->bpf_progs.lock Ian Rogers
2023-11-30  1:16 ` [PATCH v5 00/50] Improvements to memory use Namhyung Kim
2023-12-07  0:10   ` Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZWj93nq9GBpga7nT@kernel.org \
    --to=acme@kernel.org \
    --cc=9erthalion6@gmail.com \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=amadio@gentoo.org \
    --cc=atrajeev@linux.vnet.ibm.com \
    --cc=changbin.du@huawei.com \
    --cc=chenhuacai@kernel.org \
    --cc=colin.i.king@gmail.com \
    --cc=german.gomez@arm.com \
    --cc=irogers@google.com \
    --cc=james.clark@arm.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=kjain@linux.ibm.com \
    --cc=kprateek.nayak@amd.com \
    --cc=leo.yan@linaro.org \
    --cc=liam.howlett@oracle.com \
    --cc=lidong@vivo.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=liuwenyu7@huawei.com \
    --cc=mark.rutland@arm.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=ravi.bangoria@amd.com \
    --cc=sandipan.das@amd.com \
    --cc=seanjc@google.com \
    --cc=sesse@google.com \
    --cc=terrelln@fb.com \
    --cc=vincent.whitchurch@axis.com \
    --cc=wangming01@loongson.cn \
    --cc=yangjihong1@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.