diff options
-rw-r--r-- | meta/recipes-core/systemd/systemd/0002-readahead-chunk-on-spinning-media.patch | 142 | ||||
-rw-r--r-- | meta/recipes-core/systemd/systemd/0003-readahead-cleanups.patch | 86 | ||||
-rw-r--r-- | meta/recipes-core/systemd/systemd/0013-systemd-sysctl-Handle-missing-etc-sysctl.conf-proper.patch | 33 | ||||
-rw-r--r-- | meta/recipes-core/systemd/systemd_199.bb (renamed from meta/recipes-core/systemd/systemd_198.bb) | 11 |
4 files changed, 268 insertions, 4 deletions
diff --git a/meta/recipes-core/systemd/systemd/0002-readahead-chunk-on-spinning-media.patch b/meta/recipes-core/systemd/systemd/0002-readahead-chunk-on-spinning-media.patch new file mode 100644 index 0000000000..d57a01c916 --- /dev/null +++ b/meta/recipes-core/systemd/systemd/0002-readahead-chunk-on-spinning-media.patch @@ -0,0 +1,142 @@ +Upstream-Status: Backport + +-Khem 2013/03/28 + +From 94243ef299425d6c7089a7a05c48c9bb8f6cf3da Mon Sep 17 00:00:00 2001 +From: Auke Kok <auke-jan.h.kok@intel.com> +Date: Fri, 22 Mar 2013 15:09:45 -0700 +Subject: [PATCH 02/17] readahead: chunk on spinning media + +Readahead has all sorts of bad side effects depending on your +storage media. On rotating disks, it may be degrading startup +performance if enough requests are queued spanning linearly +over all blocks early at boot, and mount, blkid and friends +want to insert reads to the start of these block devices after. + +The end result is that on spinning disks with ext3/4 that udev +and mounts take a very long time, and nothing really happens until +readahead is completely finished. + +This has the net effect that the CPU is almost entirely idle +for the entire period that readahead is working. We could have +finished starting up quite a lot of services in this time if +we were smarter at how we do readahead. + +This patch sorts all requests into 2 second "chunks" and sub-sorts +each chunk by block. This adds a single cross-drive seek per "chunk" +but has the benefit that we will have a lot of the blocks we need +early on in the boot sequence loaded into memory faster. + +For a comparison of how before/after bootcharts look (ext4 on a +mobile 5400rpm 250GB drive) please look at: + + http://foo-projects.org/~sofar/blocked-tests/ + +There are bootcharts in the "before" and "after" folders where you +should be able to see that many low-level services finish 5-7 +seconds earlier with the patch applied (after). +--- + Makefile.am | 2 +- + src/readahead/readahead-collect.c | 28 +++++++++++++++++++++++++--- + 2 files changed, 26 insertions(+), 4 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 37c1cc2..5861976 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -2956,7 +2956,7 @@ systemd_readahead_SOURCES = \ + systemd_readahead_LDADD = \ + libsystemd-shared.la \ + libsystemd-daemon.la \ +- libudev.la ++ libudev.la -lm + + dist_doc_DATA += \ + src/readahead/sd-readahead.c \ +diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c +index 5d07f47..5d22949 100644 +--- a/src/readahead/readahead-collect.c ++++ b/src/readahead/readahead-collect.c +@@ -42,6 +42,7 @@ + #include <sys/vfs.h> + #include <getopt.h> + #include <sys/inotify.h> ++#include <math.h> + + #ifdef HAVE_FANOTIFY_INIT + #include <sys/fanotify.h> +@@ -67,6 +68,7 @@ + */ + + static ReadaheadShared *shared = NULL; ++static struct timespec starttime; + + /* Avoid collisions with the NULL pointer */ + #define SECTOR_TO_PTR(s) ULONG_TO_PTR((s)+1) +@@ -205,6 +207,7 @@ static unsigned long fd_first_block(int fd) { + struct item { + const char *path; + unsigned long block; ++ unsigned long bin; + }; + + static int qsort_compare(const void *a, const void *b) { +@@ -213,6 +216,13 @@ static int qsort_compare(const void *a, const void *b) { + i = a; + j = b; + ++ /* sort by bin first */ ++ if (i->bin < j->bin) ++ return -1; ++ if (i->bin > j->bin) ++ return 1; ++ ++ /* then sort by sector */ + if (i->block < j->block) + return -1; + if (i->block > j->block) +@@ -250,6 +260,8 @@ static int collect(const char *root) { + goto finish; + } + ++ clock_gettime(CLOCK_MONOTONIC, &starttime); ++ + /* If there's no pack file yet we lower the kernel readahead + * so that mincore() is accurate. If there is a pack file + * already we assume it is accurate enough so that kernel +@@ -447,10 +459,21 @@ static int collect(const char *root) { + free(p); + else { + unsigned long ul; ++ struct timespec ts; ++ struct item *entry; ++ ++ entry = new0(struct item, 1); + + ul = fd_first_block(m->fd); + +- if ((k = hashmap_put(files, p, SECTOR_TO_PTR(ul))) < 0) { ++ clock_gettime(CLOCK_MONOTONIC, &ts); ++ ++ entry->block = ul; ++ entry->path = strdup(p); ++ entry->bin = round((ts.tv_sec - starttime.tv_sec + ++ ((ts.tv_nsec - starttime.tv_nsec) / 1000000000.0)) / 2.0); ++ ++ if ((k = hashmap_put(files, p, entry)) < 0) { + log_warning("set_put() failed: %s", strerror(-k)); + free(p); + } +@@ -518,8 +541,7 @@ done: + + j = ordered; + HASHMAP_FOREACH_KEY(q, p, files, i) { +- j->path = p; +- j->block = PTR_TO_SECTOR(q); ++ memcpy(j, q, sizeof(struct item)); + j++; + } + +-- +1.7.9.5 + diff --git a/meta/recipes-core/systemd/systemd/0003-readahead-cleanups.patch b/meta/recipes-core/systemd/systemd/0003-readahead-cleanups.patch new file mode 100644 index 0000000000..e0b68df607 --- /dev/null +++ b/meta/recipes-core/systemd/systemd/0003-readahead-cleanups.patch @@ -0,0 +1,86 @@ +Upstream-Status: Backport + +-Khem 2013/03/28 + +From b0640287f784a320661f7206c9ade07b99003fd5 Mon Sep 17 00:00:00 2001 +From: Auke Kok <auke-jan.h.kok@intel.com> +Date: Tue, 26 Mar 2013 11:13:47 -0700 +Subject: [PATCH 03/17] readahead: cleanups + +- check for OOM +- no need to use floats and round() +--- + Makefile.am | 2 +- + src/readahead/readahead-collect.c | 20 ++++++++++++++------ + 2 files changed, 15 insertions(+), 7 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 5861976..37c1cc2 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -2956,7 +2956,7 @@ systemd_readahead_SOURCES = \ + systemd_readahead_LDADD = \ + libsystemd-shared.la \ + libsystemd-daemon.la \ +- libudev.la -lm ++ libudev.la + + dist_doc_DATA += \ + src/readahead/sd-readahead.c \ +diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c +index 5d22949..e2fd8df 100644 +--- a/src/readahead/readahead-collect.c ++++ b/src/readahead/readahead-collect.c +@@ -68,7 +68,7 @@ + */ + + static ReadaheadShared *shared = NULL; +-static struct timespec starttime; ++static usec_t starttime; + + /* Avoid collisions with the NULL pointer */ + #define SECTOR_TO_PTR(s) ULONG_TO_PTR((s)+1) +@@ -260,7 +260,7 @@ static int collect(const char *root) { + goto finish; + } + +- clock_gettime(CLOCK_MONOTONIC, &starttime); ++ starttime = now(CLOCK_MONOTONIC); + + /* If there's no pack file yet we lower the kernel readahead + * so that mincore() is accurate. If there is a pack file +@@ -459,19 +459,27 @@ static int collect(const char *root) { + free(p); + else { + unsigned long ul; +- struct timespec ts; ++ usec_t entrytime; + struct item *entry; + + entry = new0(struct item, 1); ++ if (!entry) { ++ r = log_oom(); ++ goto finish; ++ } + + ul = fd_first_block(m->fd); + +- clock_gettime(CLOCK_MONOTONIC, &ts); ++ entrytime = now(CLOCK_MONOTONIC); + + entry->block = ul; + entry->path = strdup(p); +- entry->bin = round((ts.tv_sec - starttime.tv_sec + +- ((ts.tv_nsec - starttime.tv_nsec) / 1000000000.0)) / 2.0); ++ if (!entry->path) { ++ free(entry); ++ r = log_oom(); ++ goto finish; ++ } ++ entry->bin = (entrytime - starttime) / 2000000; + + if ((k = hashmap_put(files, p, entry)) < 0) { + log_warning("set_put() failed: %s", strerror(-k)); +-- +1.7.9.5 + diff --git a/meta/recipes-core/systemd/systemd/0013-systemd-sysctl-Handle-missing-etc-sysctl.conf-proper.patch b/meta/recipes-core/systemd/systemd/0013-systemd-sysctl-Handle-missing-etc-sysctl.conf-proper.patch new file mode 100644 index 0000000000..f2c8e0290f --- /dev/null +++ b/meta/recipes-core/systemd/systemd/0013-systemd-sysctl-Handle-missing-etc-sysctl.conf-proper.patch @@ -0,0 +1,33 @@ +Upstream-Status: Backport + +-Khem 2013/03/28 + +From 6f6fad96addf6b00b55c98cc0d0d8026b0c1e7ca Mon Sep 17 00:00:00 2001 +From: Eelco Dolstra <eelco.dolstra@logicblox.com> +Date: Wed, 27 Mar 2013 13:41:59 +0100 +Subject: [PATCH 13/17] systemd-sysctl: Handle missing /etc/sysctl.conf + properly + +Since fabe5c0e5fce730aa66e10a9c4f9fdd443d7aeda, systemd-sysctl returns +a non-zero exit code if /etc/sysctl.conf does not exist, due to a +broken ENOENT check. +--- + src/sysctl/sysctl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c +index 2d43660..79f3f77 100644 +--- a/src/sysctl/sysctl.c ++++ b/src/sysctl/sysctl.c +@@ -125,7 +125,7 @@ static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_eno + + r = search_and_fopen_nulstr(path, "re", conf_file_dirs, &f); + if (r < 0) { +- if (ignore_enoent && errno == -ENOENT) ++ if (ignore_enoent && r == -ENOENT) + return 0; + + log_error("Failed to open file '%s', ignoring: %s", path, strerror(-r)); +-- +1.7.9.5 + diff --git a/meta/recipes-core/systemd/systemd_198.bb b/meta/recipes-core/systemd/systemd_199.bb index 6a8db512ca..74b14afeaf 100644 --- a/meta/recipes-core/systemd/systemd_198.bb +++ b/meta/recipes-core/systemd/systemd_199.bb @@ -23,10 +23,13 @@ SRC_URI = "http://www.freedesktop.org/software/systemd/systemd-${PV}.tar.xz \ file://var-run.conf \ ${UCLIBCPATCHES} \ file://00-create-volatile.conf \ + file://0002-readahead-chunk-on-spinning-media.patch \ + file://0003-readahead-cleanups.patch \ + file://0013-systemd-sysctl-Handle-missing-etc-sysctl.conf-proper.patch \ file://init \ " -SRC_URI[md5sum] = "26a75e2a310f8c1c1ea9ec26ddb171c5" -SRC_URI[sha256sum] = "444492355e5ff0ad99e0691ecaff1081ee8d45901580f47ba8b74e56107c71bf" +SRC_URI[md5sum] = "4bb13f84ce211e93f0141774a90a2322" +SRC_URI[sha256sum] = "8c4462a04f3ecf7f083782e5e0687913b1d33c6444bf20fa2f31df9222965fed" UCLIBCPATCHES = "" UCLIBCPATCHES_libc-uclibc = "file://systemd-pam-configure-check-uclibc.patch \ @@ -114,7 +117,7 @@ PACKAGES_DYNAMIC += "^lib(udev|gudev|systemd).*" PACKAGES =+ "${PN}-gui ${PN}-vconsole-setup ${PN}-initramfs ${PN}-analyze" USERADD_PACKAGES = "${PN}" -GROUPADD_PARAM_${PN} = "-r lock" +GROUPADD_PARAM_${PN} = "-r lock; -r systemd-journal" FILES_${PN}-analyze = "${base_bindir}/systemd-analyze" @@ -224,7 +227,7 @@ FILES_udev += "${base_sbindir}/udevd \ FILES_udev-consolekit += "/lib/ConsoleKit" RDEPENDS_udev-consolekit += "${@base_contains('DISTRO_FEATURES', 'x11', 'consolekit', '', d)}" -FILES_udev-utils = "${bindir}/udevadm" +FILES_udev-utils = "${base_bindir}/udevadm ${datadir}/bash-completion/completions/udevadm" FILES_udev-hwdb = "${base_libdir}/udev/hwdb.d" |