On Wed, Apr 24, 2013 at 02:41:05PM -0400, Colin Walters wrote: > On Wed, 2013-04-24 at 16:22 +0200, Lennart Poettering wrote: > > > Happy to take a patch that turns this into a realloc() loop. > > Attached. Booted and tested in gnome-ostree. >
> From 6c11bcf7c151dfa8511aab0dd6e545572a7597ec Mon Sep 17 00:00:00 2001 > From: Colin Walters <walt...@verbum.org> > Date: Wed, 24 Apr 2013 14:17:03 -0400 > Subject: [PATCH] coredump: use realloc() loop instead of malloc(768M) > > I typically run VMs with 1024MiB allocated; systemd is unable to write > coredumps in this scenario at all because the default kernel > configuration will only overcommit 50% of available RAM. > > Avoid this failure by using a realloc() loop. Hi, we actually have greedy_realloc to wrap realloc. Using it will simplify things a bit. Zbyszek > See: > http://lists.freedesktop.org/archives/systemd-devel/2013-April/010709.html > --- > src/journal/coredump.c | 42 +++++++++++++++++++++++++++++++----------- > 1 files changed, 31 insertions(+), 11 deletions(-) > > diff --git a/src/journal/coredump.c b/src/journal/coredump.c > index 2be6d94..74782df 100644 > --- a/src/journal/coredump.c > +++ b/src/journal/coredump.c > @@ -37,6 +37,8 @@ > #include "special.h" > #include "cgroup-util.h" > > +/* Few programs have less than 3MiB resident */ > +#define COREDUMP_MIN_START (3*1024*1024) > /* Make sure to not make this larger than the maximum journal entry > * size. See ENTRY_SIZE_MAX in journald-native.c. */ > #define COREDUMP_MAX (768*1024*1024) > @@ -103,9 +105,11 @@ int main(int argc, char* argv[]) { > uid_t uid; > gid_t gid; > struct iovec iovec[14]; > + size_t coredump_bufsize; > + size_t coredump_size; > _cleanup_free_ char *core_pid = NULL, *core_uid = NULL, *core_gid = > NULL, *core_signal = NULL, > *core_timestamp = NULL, *core_comm = NULL, *core_exe = NULL, > *core_unit = NULL, > - *core_session = NULL, *core_message = NULL, *core_cmdline = > NULL, *p = NULL; > + *core_session = NULL, *core_message = NULL, *core_cmdline = > NULL, *coredump_data = NULL; > > prctl(PR_SET_DUMPABLE, 0); > > @@ -234,23 +238,39 @@ int main(int argc, char* argv[]) { > goto finish; > } > > - p = malloc(9 + COREDUMP_MAX); > - if (!p) { > + coredump_size = 0; > + coredump_bufsize = COREDUMP_MIN_START + 9; > + coredump_data = malloc(coredump_bufsize); > + if (!coredump_data) { > r = log_oom(); > goto finish; > } > > - memcpy(p, "COREDUMP=", 9); > + memcpy(coredump_data + coredump_size, "COREDUMP=", 9); > + coredump_size += 9; > > - n = loop_read(STDIN_FILENO, p + 9, COREDUMP_MAX, false); > - if (n < 0) { > - log_error("Failed to read core dump data: %s", strerror(-n)); > - r = (int) n; > - goto finish; > + for (;;) { > + n = loop_read(STDIN_FILENO, coredump_data + coredump_size, > + coredump_bufsize - coredump_size, false); > + if (n < 0) { > + log_error("Failed to read core dump data: %s", > strerror(-n)); > + r = (int) n; > + goto finish; > + } else if (n == 0) > + break; > + > + coredump_size += n; > + if (coredump_size == coredump_bufsize) { > + coredump_data = realloc(coredump_data, > coredump_bufsize *= 2); > + if (!coredump_data) { > + r = log_oom(); > + goto finish; > + } > + } > } > > - iovec[j].iov_base = p; > - iovec[j].iov_len = 9 + n; > + iovec[j].iov_base = coredump_data; > + iovec[j].iov_len = coredump_size; > j++; > > r = sd_journal_sendv(iovec, j); > -- > 1.7.1 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel