Messages in this thread | | | From | Ian Rogers <> | Date | Mon, 27 Nov 2023 12:26:29 -0800 | Subject | Re: [PATCH v4 06/53] tools api fs: Switch filename__read_str to use io.h |
| |
On Sun, Nov 5, 2023 at 7:53 PM Namhyung Kim <namhyung@kernel.org> wrote: > > On Thu, Nov 2, 2023 at 10:58 AM Ian Rogers <irogers@google.com> wrote: > > > > filename__read_str has its own string reading code that allocates > > memory before reading into it. The memory allocated is sized at BUFSIZ > > that is 8kb. Most strings are short and so most of this 8kb is > > wasted. > > > > Refactor io__getline so that the newline character can be configurable > > and ignored in the case of filename__read_str. > > > > Code like build_caches_for_cpu in perf's header.c will read many > > strings and hold them in a data structure, in this case multiple > > strings per cache level per CPU. Using io.h's io__getline avoids the > > wasted memory as strings are temporarily read into a buffer on the > > stack before being copied to a buffer that grows 128 bytes at a time > > and is never sized larger than the string. > > > > For a 16 hyperthread system the memory consumption of "perf record > > true" is reduced by 180kb, primarily through saving memory when > > reading the cache information. > > > > Signed-off-by: Ian Rogers <irogers@google.com> > > --- > > [SNIP] > > diff --git a/tools/lib/api/io.h b/tools/lib/api/io.h > > index a77b74c5fb65..50d33e14fb56 100644 > > --- a/tools/lib/api/io.h > > +++ b/tools/lib/api/io.h > > @@ -141,7 +141,7 @@ static inline int io__get_dec(struct io *io, __u64 *dec) > > } > > > > /* Read up to and including the first newline following the pattern of getline. */ > > You may want to update the comment as well. > > > -static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_len_out) > > +static inline ssize_t io__getline_nl(struct io *io, char **line_out, size_t *line_len_out, int nl) > > How about io__getdelim() similar to POSIX?
Thanks done for v5.
Ian
> Thanks, > Namhyung > > > > { > > char buf[128]; > > int buf_pos = 0; > > @@ -151,7 +151,7 @@ static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_l > > > > /* TODO: reuse previously allocated memory. */ > > free(*line_out); > > - while (ch != '\n') { > > + while (ch != nl) { > > ch = io__get_char(io); > > > > if (ch < 0) > > @@ -184,4 +184,9 @@ static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_l > > return -ENOMEM; > > } > > > > +static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_len_out) > > +{ > > + return io__getline_nl(io, line_out, line_len_out, /*nl=*/'\n'); > > +} > > + > > #endif /* __API_IO__ */ > > -- > > 2.42.0.869.gea05f2083d-goog > > >
| |