whoops, this won't work against tip, I'll have to respin.
Auke On Sun, Jun 3, 2012 at 1:48 AM, Auke Kok <[email protected]> wrote: > This patch adds code to compile 'systemd-readahead-analyze' and install > it into $bindir. > > Use this program to parse the contents of the readahead pack file, or > an arbitrary pack file and display which files are listed in it, and > how much of the files are requested to be readahead. > > This code is not new - it's partially taken from sreadahead (formerly > maintained by Arjan van der Ven and me, and was originally written > by me), and adapted with the right bits to parse the systemd > readahead pack files, which are slightly different in format. > > Signed-off-by: Auke Kok <[email protected]> > --- > Makefile.am | 6 ++ > src/readahead/readahead-analyze.c | 122 > +++++++++++++++++++++++++++++++++++++ > 2 files changed, 128 insertions(+) > create mode 100644 src/readahead/readahead-analyze.c > > diff --git a/Makefile.am b/Makefile.am > index 597711e..ab5b67a 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -2407,6 +2407,9 @@ systemd_readahead_replay_LDADD = \ > libsystemd-daemon.la \ > libudev.la > > +systemd_readahead_analyze_SOURCES = \ > + src/readahead/readahead-analyze.c > + > pkginclude_HEADERS += \ > src/systemd/sd-readahead.h > > @@ -2414,6 +2417,9 @@ rootlibexec_PROGRAMS += \ > systemd-readahead-collect \ > systemd-readahead-replay > > +bin_PROGRAMS += \ > + systemd-readahead-analyze > + > dist_systemunit_DATA += \ > units/systemd-readahead-drop.service \ > units/systemd-readahead-done.timer > diff --git a/src/readahead/readahead-analyze.c > b/src/readahead/readahead-analyze.c > new file mode 100644 > index 0000000..944214b > --- /dev/null > +++ b/src/readahead/readahead-analyze.c > @@ -0,0 +1,122 @@ > +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ > + > +/*** > + This file is part of systemd. > + > + Copyright 2012 Auke Kok <[email protected]> > + > + systemd 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. > + > + systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>. > +***/ > + > + > +#include <stdio.h> > +#include <stdlib.h> > +#include <stdbool.h> > +#include <unistd.h> > +#include <inttypes.h> > +#include <linux/limits.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <string.h> > + > + > +int main(int argc, char *argv[]) > +{ > + char line[1024]; > + char path[PATH_MAX]; > + FILE *pack; > + int a; > + int missing = 0; > + off_t size; > + long tsize = 0; > + uint32_t b; > + uint32_t c; > + struct stat st; > + int pagesize = getpagesize(); > + > + if (argc != 2) > + snprintf(path, PATH_MAX, "/.readahead"); > + else > + snprintf(path, PATH_MAX, "%s", argv[1]); > + > + pack = fopen(path, "r"); > + if (!pack) { > + fprintf(stderr, "Pack file missing\n"); > + exit(EXIT_FAILURE); > + } > + > + if (!(fgets(line, sizeof(line), pack))) { > + fprintf(stderr, "Pack file corrupt\n"); > + exit(EXIT_FAILURE); > + } > + > + if ((a = getc(pack)) == EOF) { > + fprintf(stderr, "Pack file corrupt\n"); > + exit(EXIT_FAILURE); > + } > + > + fprintf(stdout, " pct sections size: path\n"); > + fprintf(stdout, " === ======== ====: ====\n"); > + > + while(true) { > + int pages = 0; > + int sections = 0; > + > + if (!fgets(path, sizeof(path), pack)) > + break; /* done */ > + > + path[strlen(path)-1] = 0; > + > + while (true) { > + if (fread(&b, sizeof(b), 1, pack) != 1 || > + fread(&c, sizeof(c), 1, pack) != 1) { > + fprintf(stderr, "Pack file corrupt\n"); > + exit(EXIT_FAILURE); > + } > + if ((b == 0) && (c == 0)) > + break; > + > + /* Uncomment this to get all the chunks separately > + fprintf(stdout, " %d: %d %d\n", sections, b, c); > + */ > + > + pages += (c - b); > + sections++; > + } > + > + if (stat(path, &st) == 0) { > + if (sections == 0) > + size = st.st_size; > + else > + size = pages * pagesize; > + > + tsize += size; > + if (sections) > + fprintf(stdout, " %4d%% (%2d) %12ld: %s\n", > (int)(size / st.st_size * 100.0), sections, (unsigned long)size, path); > + else > + fprintf(stdout, " %4d%% (%2d) %12ld: %s\n", > 100, 1, (unsigned long)size, path); > + } else { > + fprintf(stdout, " %4s%% (%2s) %12s: %s > (MISSING)\n", "???", "??", "???", path); > + missing++; > + } > + > + } > + > + fprintf(stdout, "\nHOST: %s", line); > + fprintf(stdout, "TYPE: %c\n", a); > + fprintf(stdout, "MISSING: %d\n", missing); > + fprintf(stdout, "TOTAL: %ld\n", tsize); > + > + exit(EXIT_SUCCESS); > +} > -- > 1.7.10 > _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
