* [PATCH 0/6] mklibs library size optimization commits
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Here are the commits implementing the mklibs library size optimization for
images. More information in the commit logs.
Pull URL: git://git.pokylinux.org/poky-contrib.git
Branch: nitin/mklibs
Browse: http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=nitin/mklibs
Thanks,
Nitin A Kamble <nitin.a.kamble@intel.com>
---
Nitin A Kamble (6):
distro_tracking: update latest upstream versions
elfutils: add a missing depedancy
mklibs-native: new recipe for optimizing size of library files
image-mklibs.bbclass: add the library optimization functionality
subversion: upgrade from 1.6.13 to 1.6 15
distro_Tracking: update as per current devel/toolchain recipes
meta/classes/image-mklibs.bbclass | 70 ++++++++++++++++++++
.../conf/distro/include/distro_tracking_fields.inc | 41 ++++++-----
meta/conf/local.conf.sample | 10 +++-
meta/recipes-devtools/elfutils/elfutils_0.148.bb | 3 +-
.../mklibs/files/ac_init_fix.patch | 17 +++++
.../mklibs/mklibs-native_0.1.31.bb | 23 +++++++
.../subversion/disable-revision-install.patch | 24 +++++--
.../{subversion_1.6.13.bb => subversion_1.6.15.bb} | 6 +-
8 files changed, 164 insertions(+), 30 deletions(-)
create mode 100644 meta/classes/image-mklibs.bbclass
create mode 100644 meta/recipes-devtools/mklibs/files/ac_init_fix.patch
create mode 100644 meta/recipes-devtools/mklibs/mklibs-native_0.1.31.bb
rename meta/recipes-devtools/subversion/{subversion_1.6.13.bb => subversion_1.6.15.bb} (86%)
--
1.7.3.4
^ permalink raw reply
* [PATCH 2/6] elfutils: add a missing depedancy
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
while implementing the mklibs optimization, found out that an executable from
elfutils package, viz eu-findtextrel is dynamically linked to libbz2.so
library. But the poky-image-minimal did not have that library.
adding the depedency to the bzip2 to get that library for eu-fundtextrel
executable.
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
meta/recipes-devtools/elfutils/elfutils_0.148.bb | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/meta/recipes-devtools/elfutils/elfutils_0.148.bb b/meta/recipes-devtools/elfutils/elfutils_0.148.bb
index 44b3c52..14060e6 100644
--- a/meta/recipes-devtools/elfutils/elfutils_0.148.bb
+++ b/meta/recipes-devtools/elfutils/elfutils_0.148.bb
@@ -5,8 +5,9 @@ LICENSE = "GPLv2 with exceptions"
LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3\
file://EXCEPTION;md5=570adcb0c1218ab57f2249c67d0ce417"
DEPENDS = "libtool zlib"
+RDEPENDS = "bzip2"
-PR = "r1"
+PR = "r2"
SRC_URI = "https://fedorahosted.org/releases/e/l/elfutils/elfutils-${PV}.tar.bz2"
--
1.7.3.4
^ permalink raw reply related
* [PATCH 1/6] distro_tracking: update latest upstream versions
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
.../conf/distro/include/distro_tracking_fields.inc | 43 ++++++++++---------
1 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/meta/conf/distro/include/distro_tracking_fields.inc b/meta/conf/distro/include/distro_tracking_fields.inc
index 9f99e50..1bdf521 100644
--- a/meta/conf/distro/include/distro_tracking_fields.inc
+++ b/meta/conf/distro/include/distro_tracking_fields.inc
@@ -102,9 +102,14 @@ RECIPE_LATEST_VERSION_pn-run-postinsts = "check"
RECIPE_LAST_UPDATE_pn-run-postinsts = "Nov 22, 2010"
RECIPE_MAINTAINER_pn-run-postinsts = "Dongxiao Xu <dongxiao.xu@intel.com"
-RECIPE_STATUS_pn-subversion = "green"
-RECIPE_LATEST_VERSION_pn-subversion = "1.6.13"
-RECIPE_LAST_UPDATE_pn-subversion = "Nov 18, 2010"
+RECIPE_STATUS_pn-screen = "red"
+RECIPE_LATEST_VERSION_pn-screen = "check"
+RECIPE_LAST_UPDATE_pn-screen = "Aug 31, 2010"
+RECIPE_MAINTAINER_pn-screen = "Qing He <qing.he@intel.com>"
+
+RECIPE_STATUS_pn-subversion = "red"
+RECIPE_LATEST_VERSION_pn-subversion = "1.6.15"
+RECIPE_MANUAL_CHECK_DATE_pn-subversion = "Jan 25, 2011"
RECIPE_MAINTAINER_pn-subversion = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-trace-cmd = "red"
@@ -2807,17 +2812,16 @@ RECIPE_STATUS_pn-ldconfig-native = "red"
RECIPE_LAST_UPDATE_pn-ldconfig-native = "Nov 23, 2007"
DISTRO_PN_ALIAS_pn-ldconfig-native = "Ubuntu=libc-bin Fedora=glibc"
-RECIPE_STATUS_pn-gcc="green"
-RECIPE_LATEST_VERSION_pn-gcc="4.5.1"
-RECIPE_NO_OF_PATCHES_pn-gcc="8"
-RECIPE_TIME_BETWEEN_LAST_TWO_RELEASES_pn-gcc="5 months"
+RECIPE_STATUS_pn-gcc="red"
+RECIPE_LATEST_VERSION_pn-gcc="4.5.2"
RECIPE_LATEST_RELEASE_DATE_pn-gcc="2010/03/03"
RECIPE_LAST_UPDATE_pn-gcc = "Nov 8, 2010"
RECIPE_MAINTAINER_pn-gcc = "Nitin A Kamble <nitin.a.kamble@intel.com>"
-RECIPE_STATUS_pn-autoconf="green"
+RECIPE_STATUS_pn-autoconf="red"
RECIPE_LATEST_VERSION_pn-autoconf="2.68"
RECIPE_LAST_UPDATE_pn-autoconf = "Jan 29, 2010"
+RECIPE_NO_UPDATE_REASON_autoconf="seeing rpm issue with the 2.68 version, a bug is open"
RECIPE_MAINTAINER_pn-autoconf = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-automake="green"
@@ -2887,7 +2891,7 @@ RECIPE_MAINTAINER_pn-postinsts = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-nasm="green"
RECIPE_LATEST_VERSION_pn-nasm="2.07"
-RECIPE_LAST_UPDATE_pn-nasm = "Jun 23, 2010"
+RECIPE_MANUAL_CHECK_DATE_pn-nasm = "Jan 25, 2011"
RECIPE_MAINTAINER_pn-nasm = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-perl="red" # upgrade needed
@@ -2898,7 +2902,7 @@ RECIPE_MAINTAINER_pn-perl = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-prelink="red"
RECIPE_LATEST_VERSION_pn-prelink="1.0+git0+0x909470ee441237563d6236c505cb2d02ddc48704"
RECIPE_LAST_UPDATE_pn-perl = "Jul 23, 2010"
-RECIPE_MAINTAINER_pn-prelink = "Nitin A Kamble <nitin.a.kamble@intel.com>"
+RECIPE_MAINTAINER_pn-prelink = "Mark Hatle <mark.hatle@windriver.com>"
RECIPE_STATUS_pn-python-dbus="red"
RECIPE_LATEST_VERSION_pn-python-dbus="0.83.1"
@@ -2906,8 +2910,8 @@ RECIPE_LAST_UPDATE_pn-python-dbus = "Jul 7, 2010"
RECIPE_MAINTAINER_pn-python-dbus = "Nitin A Kamble <nitin.a.kamble@intel.com>"
DISTRO_PN_ALIAS_pn-python-dbus = "Ubuntu=python-dbus Debian=python-dbus Mandriva=python-dbus"
-RECIPE_STATUS_pn-python-gst="green"
-RECIPE_LATEST_VERSION_pn-python-gst="0.10.19"
+RECIPE_STATUS_pn-python-gst="red"
+RECIPE_LATEST_VERSION_pn-python-gst="0.10.21"
DISTRO_PN_ALIAS_pn-python-gst = "OpenSuSE=python-gstreamer Ubuntu=gst0.10-python Debian=gst0.10-python"
RECIPE_LAST_UPDATE_pn-python-gst = "Nov 8, 2010"
RECIPE_MAINTAINER_pn-python-gst = "Nitin A Kamble <nitin.a.kamble@intel.com>"
@@ -2948,9 +2952,6 @@ RECIPE_MAINTAINER_pn-python-scons = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-python="red"
RECIPE_LATEST_VERSION_pn-python="2.7.1"
-RECIPE_NO_OF_PATCHES_pn-python="8"
-RECIPE_LATEST_RELEASE_DATE_pn-python="2010/03/18"
-RECIPE_TIME_BETWEEN_LAST_TWO_RELEASES_pn-python="5 months"
RECIPE_LAST_UPDATE_pn-python = "Nov 8, 2010"
RECIPE_MAINTAINER_pn-python = "Nitin A Kamble <nitin.a.kamble@intel.com>"
@@ -2976,7 +2977,7 @@ RECIPE_MAINTAINER_pn-gnu-config = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-mpfr="green"
RECIPE_LATEST_VERSION_pn-mpfr="3.0.0"
-RECIPE_LAST_UPDATE_pn-mpfr = "Aug 27, 2010"
+RECIPE_MANUAL_CHECK_DATE_pn-mpfr = "Jan 25, 2011"
RECIPE_MAINTAINER_pn-mpfr = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-gmp="green"
@@ -2986,16 +2987,18 @@ RECIPE_MAINTAINER_pn-gmp = "Nitin A Kamble <nitin.a.kamble@intel.com>"
RECIPE_STATUS_pn-libmpc="green"
RECIPE_LATEST_VERSION_pn-libmpc="0.8.2"
-RECIPE_LAST_UPDATE_pn-libmpc = "Jul 19, 2010"
+RECIPE_MANUAL_CHECK_DATE_pn-libmpc = "Jan 25, 2011"
RECIPE_MAINTAINER_pn-libmpc = "Nitin A Kamble <nitin.a.kamble@intel.com>"
DISTRO_PN_ALIAS_pn-libmpc = "Fedora=libmpc OpenSuse=libmpc2"
-RECIPE_STATUS_pn-byacc="green"
-RECIPE_LATEST_VERSION_pn-byacc="20101127"
+RECIPE_STATUS_pn-byacc="red"
+RECIPE_LATEST_VERSION_pn-byacc="20101229"
RECIPE_MAINTAINER_pn-byacc = "Nitin A Kamble <nitin.a.kamble@intel.com>"
-RECIPE_STATUS_pn-libconvert-asn1-perl="green" # 0.22 version does not build, so created a recipe for version 0.21
+RECIPE_STATUS_pn-libconvert-asn1-perl="green"
+# 0.22 version does not build, so created a recipe for version 0.21
RECIPE_LATEST_VERSION_pn-libconvert-asn1-perl="0.22"
+RECIPE_NO_UPDATE_REASON_pn-libconvert-asn1-perl = "0.22 version does not build, so created a recipe for version 0.21"
RECIPE_LAST_UPDATE_pn-libconvert-asn1-perl = "Aug 13, 2010"
RECIPE_MAINTAINER_pn-libconvert-asn1-perl = "Nitin A Kamble <nitin.a.kamble@intel.com>"
--
1.7.3.4
^ permalink raw reply related
* [PATCH 6/6] distro_Tracking: update as per current devel/toolchain recipes
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
.../conf/distro/include/distro_tracking_fields.inc | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/meta/conf/distro/include/distro_tracking_fields.inc b/meta/conf/distro/include/distro_tracking_fields.inc
index 1bdf521..9fb1147 100644
--- a/meta/conf/distro/include/distro_tracking_fields.inc
+++ b/meta/conf/distro/include/distro_tracking_fields.inc
@@ -107,7 +107,7 @@ RECIPE_LATEST_VERSION_pn-screen = "check"
RECIPE_LAST_UPDATE_pn-screen = "Aug 31, 2010"
RECIPE_MAINTAINER_pn-screen = "Qing He <qing.he@intel.com>"
-RECIPE_STATUS_pn-subversion = "red"
+RECIPE_STATUS_pn-subversion = "green"
RECIPE_LATEST_VERSION_pn-subversion = "1.6.15"
RECIPE_MANUAL_CHECK_DATE_pn-subversion = "Jan 25, 2011"
RECIPE_MAINTAINER_pn-subversion = "Nitin A Kamble <nitin.a.kamble@intel.com>"
--
1.7.3.4
^ permalink raw reply related
* [PATCH 3/6] mklibs-native: new recipe for optimizing size of library files
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
.../mklibs/files/ac_init_fix.patch | 17 ++++++++++++++
.../mklibs/mklibs-native_0.1.31.bb | 23 ++++++++++++++++++++
2 files changed, 40 insertions(+), 0 deletions(-)
create mode 100644 meta/recipes-devtools/mklibs/files/ac_init_fix.patch
create mode 100644 meta/recipes-devtools/mklibs/mklibs-native_0.1.31.bb
diff --git a/meta/recipes-devtools/mklibs/files/ac_init_fix.patch b/meta/recipes-devtools/mklibs/files/ac_init_fix.patch
new file mode 100644
index 0000000..7325931
--- /dev/null
+++ b/meta/recipes-devtools/mklibs/files/ac_init_fix.patch
@@ -0,0 +1,17 @@
+Get the version of mklibs by simpler means. The MKLIBS_VERSION string in the
+configure.ac file is replaced with real version string by the
+do_configure_prepend() function from the recipe .bb file.
+
+Nitin A Kamble <nitin.a.kamble@intel.com>
+Date: 2011/01/24
+
+Index: mklibs/configure.ac
+===================================================================
+--- mklibs.orig/configure.ac 2010-02-21 17:34:56.000000000 -0800
++++ mklibs/configure.ac 2011-01-24 18:52:19.943242079 -0800
+@@ -1,4 +1,4 @@
+-AC_INIT([mklibs],m4_esyscmd(dpkg-parsechangelog | perl -ne 'print $1 if m/^Version: (.*)$/;'))
++AC_INIT([mklibs], MKLIBS_VERSION)
+ AM_INIT_AUTOMAKE([foreign no-define])
+ AC_CONFIG_HEADERS([config.h])
+ AM_MAINTAINER_MODE
diff --git a/meta/recipes-devtools/mklibs/mklibs-native_0.1.31.bb b/meta/recipes-devtools/mklibs/mklibs-native_0.1.31.bb
new file mode 100644
index 0000000..2044d12
--- /dev/null
+++ b/meta/recipes-devtools/mklibs/mklibs-native_0.1.31.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "mklibs produces cut-down shared libraries that contain only the routines required by a particular set of executables."
+HOMEPAGE = "https://code.launchpad.net/mklibs"
+SECTION = "devel"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://debian/copyright;md5=98d31037b13d896e33890738ef01af64"
+DEPENDS = "python-native"
+
+PR = "r0"
+
+SRC_URI = "http://ftp.de.debian.org/debian/pool/main/m/mklibs/${BPN}_${PV}.tar.gz \
+ file://ac_init_fix.patch\
+"
+
+SRC_URI[md5sum] = "f4df0307ccbdf60070e42277513f27ed"
+SRC_URI[sha256sum] = "8f5595621eb09d52871c771861e81b032d10c31d15e5dd61fa7f5a9e5b7de405"
+
+S = "${WORKDIR}/${BPN}"
+
+inherit autotools gettext native
+
+do_configure_prepend() {
+ sed "s+MKLIBS_VERSION+${PV}+" ${S}/configure.ac
+}
--
1.7.3.4
^ permalink raw reply related
* [PATCH 5/6] subversion: upgrade from 1.6.13 to 1.6 15
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Rebased this patch to the newer code
modified: subversion/disable-revision-install.patch
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
.../subversion/disable-revision-install.patch | 24 +++++++++++++++-----
.../{subversion_1.6.13.bb => subversion_1.6.15.bb} | 6 ++--
2 files changed, 21 insertions(+), 9 deletions(-)
rename meta/recipes-devtools/subversion/{subversion_1.6.13.bb => subversion_1.6.15.bb} (86%)
diff --git a/meta/recipes-devtools/subversion/subversion/disable-revision-install.patch b/meta/recipes-devtools/subversion/subversion/disable-revision-install.patch
index a1c6065..ad716d0 100644
--- a/meta/recipes-devtools/subversion/subversion/disable-revision-install.patch
+++ b/meta/recipes-devtools/subversion/subversion/disable-revision-install.patch
@@ -1,6 +1,8 @@
---- subversion-1.2.0-r0/Makefile.in.old 2005-07-17 22:28:21.898728312 +0200
-+++ subversion-1.2.0-r0/Makefile.in 2005-07-17 22:30:05.361999504 +0200
-@@ -260,7 +260,7 @@
+Index: subversion-1.6.15/Makefile.in
+===================================================================
+--- subversion-1.6.15.orig/Makefile.in 2010-11-17 06:47:23.000000000 -0800
++++ subversion-1.6.15/Makefile.in 2011-01-31 10:11:07.358779686 -0800
+@@ -305,7 +305,7 @@
clean: external-clean local-clean
distclean: external-distclean local-distclean
extraclean: external-extraclean local-extraclean
@@ -9,14 +11,24 @@
@INCLUDE_OUTPUTS@
-@@ -320,8 +320,8 @@
+@@ -363,13 +363,13 @@
local-install: @INSTALL_RULES@
### HACK!! Find a better way to do this
-revision-install:
-- subversion/svnversion/svnversion $(top_srcdir) /repos/svn/trunk > $(DESTDIR)$(includedir)/subversion-1/svn-revision.txt
+- test -d $(DESTDIR)$(includedir)/subversion-1 || \
+- $(MKDIR) $(DESTDIR)$(includedir)/subversion-1
+- (subversion/svnversion/svnversion $(top_srcdir) || \
+- svnversion $(top_srcdir) || \
+- echo "unknown"; \
+- ) > $(DESTDIR)$(includedir)/subversion-1/svn-revision.txt
+#revision-install:
-+# subversion/svnversion/svnversion $(top_srcdir) /repos/svn/trunk > $(DESTDIR)$(includedir)/subversion-1/svn-revision.txt
++# test -d $(DESTDIR)$(includedir)/subversion-1 || \
++# $(MKDIR) $(DESTDIR)$(includedir)/subversion-1
++# (subversion/svnversion/svnversion $(top_srcdir) || \
++# svnversion $(top_srcdir) || \
++# echo "unknown"; \
++# ) > $(DESTDIR)$(includedir)/subversion-1/svn-revision.txt
install-static: @INSTALL_STATIC_RULES@
diff --git a/meta/recipes-devtools/subversion/subversion_1.6.13.bb b/meta/recipes-devtools/subversion/subversion_1.6.15.bb
similarity index 86%
rename from meta/recipes-devtools/subversion/subversion_1.6.13.bb
rename to meta/recipes-devtools/subversion/subversion_1.6.15.bb
index b535f06..de40863 100644
--- a/meta/recipes-devtools/subversion/subversion_1.6.13.bb
+++ b/meta/recipes-devtools/subversion/subversion_1.6.15.bb
@@ -5,15 +5,15 @@ RDEPENDS_${PN} = "neon"
LICENSE = "Apache BSD"
HOMEPAGE = "http://subversion.tigris.org"
-PR = "r1"
+PR = "r0"
SRC_URI = "http://subversion.tigris.org/downloads/${P}.tar.bz2 \
file://disable-revision-install.patch;patch=1 \
file://neon-detection.patch;patch=1 \
file://libtool2.patch;patch=1"
-SRC_URI[md5sum] = "7ae1c827689f21cf975804005be30aeb"
-SRC_URI[sha256sum] = "3a30327bdb04109f369586196ee4a6993cdab2cfa85c3134549f02c229bf0d15"
+SRC_URI[md5sum] = "113fca1d9e4aa389d7dc2b210010fa69"
+SRC_URI[sha256sum] = "b2919d603a5f3c19f42e3265c4b930e2376c43b3969b90ef9c42b2f72d5aaa45"
LIC_FILES_CHKSUM = "file://COPYING;md5=2a69fef414e2cb907b4544298569300b"
--
1.7.3.4
^ permalink raw reply related
* [PATCH 4/6] image-mklibs.bbclass: add the library optimization functionality
From: Nitin A Kamble @ 2011-02-01 22:43 UTC (permalink / raw)
To: poky
In-Reply-To: <cover.1296600047.git.nitin.a.kamble@intel.com>
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Now by default the mklibs library size optimization for poky-image-minimal is
enabled.
If you want to enable the mklibs library size optimization for your image
then, edit the MKLIBS_OPTIMIZED_IMAGES line in the local.conf like this:
MKLIBS_OPTIMIZED_IMAGES ?= "poky-image-minimal your-own-image"
on qemux86 machine this reduced the rootfs size from 7.9MB to 7.2MB.
That is around 11% image foot print reduction. that image had 38 elf
executables. Generally the size optimization by mklibs is reversely
proportional to the number of elf executables in the rootfs. so
bigger images won't see less optimization, and smaller images will see
large image size reductions.
Thanks to mark hatle for his help in implementation of this.
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
meta/classes/image-mklibs.bbclass | 70 +++++++++++++++++++++++++++++++++++++
meta/conf/local.conf.sample | 10 +++++-
2 files changed, 79 insertions(+), 1 deletions(-)
create mode 100644 meta/classes/image-mklibs.bbclass
diff --git a/meta/classes/image-mklibs.bbclass b/meta/classes/image-mklibs.bbclass
new file mode 100644
index 0000000..8ba3eb4
--- /dev/null
+++ b/meta/classes/image-mklibs.bbclass
@@ -0,0 +1,70 @@
+do_rootfs[depends] += "mklibs-native:do_populate_sysroot"
+
+IMAGE_PREPROCESS_COMMAND += "mklibs_optimize_image; "
+
+mklibs_optimize_image_doit() {
+ rm -rf ${WORKDIR}/mklibs
+ mkdir -p ${WORKDIR}/mklibs/dest
+ cd ${IMAGE_ROOTFS}
+ du -bs > ${WORKDIR}/mklibs/du.before.mklibs.txt
+ for i in `find .`; do file $i; done \
+ | grep ELF \
+ | grep "LSB executable" \
+ | grep "dynamically linked" \
+ | sed "s/:.*//" \
+ | sed "s+^\./++" \
+ > ${WORKDIR}/mklibs/executables.list
+
+ case ${TARGET_ARCH} in
+ powerpc | mips )
+ dynamic_loader="/lib/ld.so.1"
+ ;;
+ x86_64)
+ dynamic_loader="/lib/ld-linux-x86-64.so.2"
+ ;;
+ i586 )
+ dynamic_loader="/lib/ld-linux.so.2"
+ ;;
+ arm )
+ dynamic_loader="/lib/ld-linux.so.3"
+ ;;
+ * )
+ dynamic_loader="/unknown_dynamic_linker"
+ ;;
+ esac
+
+ mklibs -v \
+ --ldlib ${dynamic_loader} \
+ --sysroot ${PKG_CONFIG_SYSROOT_DIR} \
+ --root ${IMAGE_ROOTFS} \
+ --target `echo ${TARGET_PREFIX} | sed 's/-$//' ` \
+ -d ${WORKDIR}/mklibs/dest \
+ `cat ${WORKDIR}/mklibs/executables.list`
+
+ cd ${WORKDIR}/mklibs/dest
+ for i in *
+ do
+ cp $i `find ${IMAGE_ROOTFS} -name $i`
+ done
+
+ cd ${IMAGE_ROOTFS}
+ du -bs > ${WORKDIR}/mklibs/du.after.mklibs.txt
+
+ echo rootfs size before mklibs optimization: `cat ${WORKDIR}/mklibs/du.before.mklibs.txt`
+ echo rootfs size after mklibs optimization: `cat ${WORKDIR}/mklibs/du.after.mklibs.txt`
+}
+
+mklibs_optimize_image() {
+ for img in ${MKLIBS_OPTIMIZED_IMAGES}
+ do
+ if [ "${img}" == "${PN}" ]
+ then
+ mklibs_optimize=1
+ mklibs_optimize_image_doit
+ break
+ fi
+ done
+}
+
+
+EXPORT_FUNCTIONS mklibs_optimize_image
diff --git a/meta/conf/local.conf.sample b/meta/conf/local.conf.sample
index f9953d1..362dbf0 100644
--- a/meta/conf/local.conf.sample
+++ b/meta/conf/local.conf.sample
@@ -73,10 +73,18 @@ EXTRA_IMAGE_FEATURES_mx31ads = "tools-testapps debug-tweaks"
#PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"
PACKAGE_CLASSES ?= "package_rpm package_ipk"
+# mklibs library size optimization is more useful to smaller images,
+# and less useful for bigger images. Also mklibs library optimization can break the ABI compatibility, so should not be applied to the images which are tobe
+# extended or upgraded later.
+# mklibs librarys size optimization will be enabled just for these images.
+MKLIBS_OPTIMIZED_IMAGES ?= "poky-image-minimal"
+
# A list of additional classes to use when building the system
+# include 'image-mklibs' to reduce shared library files size for an image
# include 'image-prelink' in order to prelink the filesystem image
# include 'image-swab' to perform host system intrusion detection
-USER_CLASSES ?= "image-prelink"
+# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink
+USER_CLASSES ?= "image-mklibs image-prelink"
# POKYMODE controls the characteristics of the generated packages/images by
# telling poky which type of toolchain to use.
--
1.7.3.4
^ permalink raw reply related
* [PATCH] cgroups: respect cgroup timer slack value in prctl
From: jacob.jun.pan @ 2011-02-01 22:41 UTC (permalink / raw)
To: LKML, Li Zefan, Arjan van de Ven, Paul Menage, Kirill A. Shutemov,
Jacob Pan, container cgroup
Cc: Jacob Pan
From: Jacob Pan <jacob.jun.pan@linux.intel.com>
Per cgroup timer slack value is used to manage task groups
for more friendly power management behavior. Once a task is
attached to a cgroup, we should not allow user to change
(escape) the per cgroup restriction unless a more relaxed
timer slack value is given by user via prctl.
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
---
include/linux/cgroup.h | 13 +++++++++++++
kernel/cgroup_timer_slack.c | 4 ----
kernel/sys.c | 21 ++++++++++++++++++++-
3 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index ed4ba11..4405666 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -627,6 +627,19 @@ bool css_is_ancestor(struct cgroup_subsys_state *cg,
unsigned short css_id(struct cgroup_subsys_state *css);
unsigned short css_depth(struct cgroup_subsys_state *css);
+#ifdef CONFIG_CGROUP_TIMER_SLACK
+struct timer_slack_cgroup {
+ struct cgroup_subsys_state css;
+ unsigned long timer_slack_ns;
+};
+
+static inline struct timer_slack_cgroup *task_timer_slack(struct task_struct *task)
+{
+ return container_of(task_subsys_state(task, timer_slack_subsys_id),
+ struct timer_slack_cgroup, css);
+}
+#endif
+
#else /* !CONFIG_CGROUPS */
static inline int cgroup_init_early(void) { return 0; }
diff --git a/kernel/cgroup_timer_slack.c b/kernel/cgroup_timer_slack.c
index daa452d..1de122a 100644
--- a/kernel/cgroup_timer_slack.c
+++ b/kernel/cgroup_timer_slack.c
@@ -4,10 +4,6 @@
#include <linux/slab.h>
struct cgroup_subsys timer_slack_subsys;
-struct timer_slack_cgroup {
- struct cgroup_subsys_state css;
- unsigned long timer_slack_ns;
-};
static struct timer_slack_cgroup *cgroup_to_tslack_cgroup(struct cgroup *cgroup)
{
diff --git a/kernel/sys.c b/kernel/sys.c
index 7f5a0cd..433fcdb 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -37,6 +37,8 @@
#include <linux/ptrace.h>
#include <linux/fs_struct.h>
#include <linux/gfp.h>
+#include <linux/cgroup.h>
+#include <linux/init_task.h>
#include <linux/compat.h>
#include <linux/syscalls.h>
@@ -1688,8 +1690,25 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
if (arg2 <= 0)
current->timer_slack_ns =
current->default_timer_slack_ns;
- else
+ else {
+#ifdef CONFIG_CGROUP_TIMER_SLACK
+ /* only allow more relaxed slack value than
+ * the attached timer slack cgroup allows.
+ */
+ unsigned long cg_timer_slack;
+
+ rcu_read_lock();
+ cg_timer_slack = task_timer_slack(current)->timer_slack_ns;
+ rcu_read_unlock();
+ if (cg_timer_slack < arg2 || cg_timer_slack
+ == TIMER_SLACK_NS_DEFAULT)
+ current->timer_slack_ns = arg2;
+ else
+ return -EINVAL;
+#else
current->timer_slack_ns = arg2;
+#endif
+ }
error = 0;
break;
case PR_MCE_KILL:
--
1.7.0.4
^ permalink raw reply related
* RE: XFS Preallocation
From: Peter Vajgel @ 2011-02-01 22:47 UTC (permalink / raw)
To: Stan Hoeppner; +Cc: Jef Fox, xfs@oss.sgi.com
In-Reply-To: <4D48691C.8000006@hardwarefreak.com>
Correct. But I've been using similar methods for evaluation and benchmarking purposes at my previous employers as well. I guess it's hard to part with the tools you learn to use. It's not a secret that we use xfs at Facebook. Xfs is the filesystem of choice for the media infrastructure group at the moment. Different projects are free to pick anything they want but I think database tier uses xfs as well. Our usage tends to create large files (databases, haystacks) so limited fragmentation, preallocation and as-close-to-raw performance are important features for us - all aspects where xfs excels. When I am talking about multiple variables which affect the testing it's RAID level, RAID stripe size (same stripe size sometimes produces different results from different controller vendors), IO scheduler, memory available, number of threads, readahead size and other external and application tuning variables.
Peter
> -----Original Message-----
> From: Stan Hoeppner [mailto:stan@hardwarefreak.com]
> Sent: Tuesday, February 01, 2011 12:12 PM
> To: Peter Vajgel
> Cc: Dave Chinner; Jef Fox; xfs@oss.sgi.com
> Subject: Re: XFS Preallocation
>
> Peter Vajgel put forth on 2/1/2011 1:20 PM:
>
> > At the scale we operate it does. We have multiple variables so the number of
> combinations is large. We have hit every single possible hardware and software
> problem and problem resolution can take months if it takes days to reproduce the
> problem. Hardware vendors (disk, controller, motherboard manufacturers) are much
> more responsive when you can reproduce a problem on the fly in seconds (especially
> in comparative benchmarking). The tests usually run only couple of minutes. With
> 12x3TB (possibly multiplied by a factor of X with our new platform) it would be
> unacceptable to wait for writes to finish.
>
> Hi Peter,
>
> When you mention scale, you're referring to the storage back end at facebook.com,
> your employer, correct?
>
> --
> Stan
>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply
* [PATCH 7/9 v2] ds3000: remove unnecessary dnxt, dcur structures
From: Igor M. Liplianin @ 2011-02-01 22:41 UTC (permalink / raw)
To: mchehab, linux-media
All necessary parameters already stored in frontend cache.
Signed-off-by: Igor M. Liplianin <liplianin@me.by>
---
drivers/media/dvb/frontends/ds3000.c | 108 ++++-----------------------------
1 files changed, 13 insertions(+), 95 deletions(-)
diff --git a/drivers/media/dvb/frontends/ds3000.c b/drivers/media/dvb/frontends/ds3000.c
index 11f1aa2..b2ba5f4 100644
--- a/drivers/media/dvb/frontends/ds3000.c
+++ b/drivers/media/dvb/frontends/ds3000.c
@@ -229,31 +229,11 @@ static u8 ds3000_dvbs2_init_tab[] = {
0xb8, 0x00,
};
-/* DS3000 doesn't need some parameters as input and auto-detects them */
-/* save input from the application of those parameters */
-struct ds3000_tuning {
- u32 frequency;
- u32 symbol_rate;
- fe_spectral_inversion_t inversion;
- enum fe_code_rate fec;
-
- /* input values */
- u8 inversion_val;
- fe_modulation_t delivery;
- u8 rolloff;
-};
-
struct ds3000_state {
struct i2c_adapter *i2c;
const struct ds3000_config *config;
-
struct dvb_frontend frontend;
-
- struct ds3000_tuning dcur;
- struct ds3000_tuning dnxt;
-
u8 skip_fw_load;
-
/* previous uncorrected block counter for DVB-S2 */
u16 prevUCBS2;
};
@@ -401,45 +381,6 @@ static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg)
return b1[0];
}
-static int ds3000_set_inversion(struct ds3000_state *state,
- fe_spectral_inversion_t inversion)
-{
- dprintk("%s(%d)\n", __func__, inversion);
-
- switch (inversion) {
- case INVERSION_OFF:
- case INVERSION_ON:
- case INVERSION_AUTO:
- break;
- default:
- return -EINVAL;
- }
-
- state->dnxt.inversion = inversion;
-
- return 0;
-}
-
-static int ds3000_set_symbolrate(struct ds3000_state *state, u32 rate)
-{
- int ret = 0;
-
- dprintk("%s()\n", __func__);
-
- dprintk("%s() symbol_rate = %d\n", __func__, state->dnxt.symbol_rate);
-
- /* check if symbol rate is within limits */
- if ((state->dnxt.symbol_rate >
- state->frontend.ops.info.symbol_rate_max) ||
- (state->dnxt.symbol_rate <
- state->frontend.ops.info.symbol_rate_min))
- ret = -EOPNOTSUPP;
-
- state->dnxt.symbol_rate = rate;
-
- return ret;
-}
-
static int ds3000_load_firmware(struct dvb_frontend *fe,
const struct firmware *fw);
@@ -790,13 +731,6 @@ static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
return 0;
}
-/* Overwrite the current tuning params, we are about to tune */
-static void ds3000_clone_params(struct dvb_frontend *fe)
-{
- struct ds3000_state *state = fe->demodulator_priv;
- memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur));
-}
-
static int ds3000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
{
struct ds3000_state *state = fe->demodulator_priv;
@@ -1027,22 +961,6 @@ static int ds3000_tune(struct dvb_frontend *fe,
dprintk("%s() ", __func__);
- state->dnxt.delivery = c->modulation;
- state->dnxt.frequency = c->frequency;
- state->dnxt.rolloff = 2; /* fixme */
- state->dnxt.fec = c->fec_inner;
-
- ret = ds3000_set_inversion(state, p->inversion);
- if (ret != 0)
- return ret;
-
- ret = ds3000_set_symbolrate(state, c->symbol_rate);
- if (ret != 0)
- return ret;
-
- /* discard the 'current' tuning parameters and prepare to tune */
- ds3000_clone_params(fe);
-
/* Reset status register */
status = 0;
/* Tune */
@@ -1053,14 +971,14 @@ static int ds3000_tune(struct dvb_frontend *fe,
ds3000_tuner_writereg(state, 0x08, 0x01);
ds3000_tuner_writereg(state, 0x00, 0x01);
/* calculate and set freq divider */
- if (state->dcur.frequency < 1146000) {
+ if (p->frequency < 1146000) {
ds3000_tuner_writereg(state, 0x10, 0x11);
- ndiv = ((state->dcur.frequency * (6 + 8) * 4) +
+ ndiv = ((p->frequency * (6 + 8) * 4) +
(DS3000_XTAL_FREQ / 2)) /
DS3000_XTAL_FREQ - 1024;
} else {
ds3000_tuner_writereg(state, 0x10, 0x01);
- ndiv = ((state->dcur.frequency * (6 + 8) * 2) +
+ ndiv = ((p->frequency * (6 + 8) * 2) +
(DS3000_XTAL_FREQ / 2)) /
DS3000_XTAL_FREQ - 1024;
}
@@ -1106,8 +1024,8 @@ static int ds3000_tune(struct dvb_frontend *fe,
ds3000_tuner_writereg(state, 0x50, 0x00);
msleep(5);
- f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000;
- if ((state->dcur.symbol_rate / 1000) < 5000)
+ f3db = ((c->symbol_rate / 1000) << 2) / 5 + 2000;
+ if ((c->symbol_rate / 1000) < 5000)
f3db += 3000;
if (f3db < 7000)
f3db = 7000;
@@ -1196,30 +1114,30 @@ static int ds3000_tune(struct dvb_frontend *fe,
ds3000_writereg(state, 0x25, 0x8a);
/* enhance symbol rate performance */
- if ((state->dcur.symbol_rate / 1000) <= 5000) {
- value = 29777 / (state->dcur.symbol_rate / 1000) + 1;
+ if ((c->symbol_rate / 1000) <= 5000) {
+ value = 29777 / (c->symbol_rate / 1000) + 1;
if (value % 2 != 0)
value++;
ds3000_writereg(state, 0xc3, 0x0d);
ds3000_writereg(state, 0xc8, value);
ds3000_writereg(state, 0xc4, 0x10);
ds3000_writereg(state, 0xc7, 0x0e);
- } else if ((state->dcur.symbol_rate / 1000) <= 10000) {
- value = 92166 / (state->dcur.symbol_rate / 1000) + 1;
+ } else if ((c->symbol_rate / 1000) <= 10000) {
+ value = 92166 / (c->symbol_rate / 1000) + 1;
if (value % 2 != 0)
value++;
ds3000_writereg(state, 0xc3, 0x07);
ds3000_writereg(state, 0xc8, value);
ds3000_writereg(state, 0xc4, 0x09);
ds3000_writereg(state, 0xc7, 0x12);
- } else if ((state->dcur.symbol_rate / 1000) <= 20000) {
- value = 64516 / (state->dcur.symbol_rate / 1000) + 1;
+ } else if ((c->symbol_rate / 1000) <= 20000) {
+ value = 64516 / (c->symbol_rate / 1000) + 1;
ds3000_writereg(state, 0xc3, value);
ds3000_writereg(state, 0xc8, 0x0e);
ds3000_writereg(state, 0xc4, 0x07);
ds3000_writereg(state, 0xc7, 0x18);
} else {
- value = 129032 / (state->dcur.symbol_rate / 1000) + 1;
+ value = 129032 / (c->symbol_rate / 1000) + 1;
ds3000_writereg(state, 0xc3, value);
ds3000_writereg(state, 0xc8, 0x0a);
ds3000_writereg(state, 0xc4, 0x05);
@@ -1227,7 +1145,7 @@ static int ds3000_tune(struct dvb_frontend *fe,
}
/* normalized symbol rate rounded to the closest integer */
- value = (((state->dcur.symbol_rate / 1000) << 16) +
+ value = (((c->symbol_rate / 1000) << 16) +
(DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
ds3000_writereg(state, 0x61, value & 0x00ff);
ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
--
1.7.1
^ permalink raw reply related
* [PATCH v2 1/2] block: skip elevator initialization for flush requests
From: Mike Snitzer @ 2011-02-01 22:46 UTC (permalink / raw)
To: Tejun Heo, Jens Axboe
Cc: tytso, djwong, shli, neilb, adilger.kernel, jack, linux-kernel,
kmannth, cmm, linux-ext4, rwheeler, hch, josef, jmoyer, vgoyal,
snitzer
In-Reply-To: <20110201185225.GT14211@htj.dyndns.org>
Skip elevator initialization during request allocation if REQ_SORTED
is not set in the @rw_flags passed to the request allocator.
Set REQ_SORTED for all requests that may be put on IO scheduler. Flush
requests are not put on IO scheduler so REQ_SORTED is not set for
them.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
block/blk-core.c | 24 +++++++++++++++++++-----
1 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 72dd23b..f6fcc64 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -764,7 +764,7 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
struct request_list *rl = &q->rq;
struct io_context *ioc = NULL;
const bool is_sync = rw_is_sync(rw_flags) != 0;
- int may_queue, priv;
+ int may_queue, priv = 0;
may_queue = elv_may_queue(q, rw_flags);
if (may_queue == ELV_MQUEUE_NO)
@@ -808,9 +808,14 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
rl->count[is_sync]++;
rl->starved[is_sync] = 0;
- priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
- if (priv)
- rl->elvpriv++;
+ /*
+ * Only initialize elevator data if REQ_SORTED is set.
+ */
+ if (rw_flags & REQ_SORTED) {
+ priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
+ if (priv)
+ rl->elvpriv++;
+ }
if (blk_queue_io_stat(q))
rw_flags |= REQ_IO_STAT;
@@ -1197,6 +1202,7 @@ static int __make_request(struct request_queue *q, struct bio *bio)
const unsigned short prio = bio_prio(bio);
const bool sync = !!(bio->bi_rw & REQ_SYNC);
const bool unplug = !!(bio->bi_rw & REQ_UNPLUG);
+ const bool flush = !!(bio->bi_rw & (REQ_FLUSH | REQ_FUA));
const unsigned long ff = bio->bi_rw & REQ_FAILFAST_MASK;
int where = ELEVATOR_INSERT_SORT;
int rw_flags;
@@ -1210,7 +1216,7 @@ static int __make_request(struct request_queue *q, struct bio *bio)
spin_lock_irq(q->queue_lock);
- if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) {
+ if (flush) {
where = ELEVATOR_INSERT_FLUSH;
goto get_rq;
}
@@ -1293,6 +1299,14 @@ get_rq:
rw_flags |= REQ_SYNC;
/*
+ * Set REQ_SORTED for all requests that may be put on IO scheduler.
+ * The request allocator's IO scheduler initialization will be skipped
+ * if REQ_SORTED is not set.
+ */
+ if (!flush)
+ rw_flags |= REQ_SORTED;
+
+ /*
* Grab a free request. This is might sleep but can not fail.
* Returns with the queue unlocked.
*/
--
1.7.3.4
^ permalink raw reply related
* Re: Kernel 2.6.32-5-amd64 fails to boot.
From: Rudy Zijlstra @ 2011-02-01 22:46 UTC (permalink / raw)
To: lrhorer; +Cc: 'Linux RAID'
In-Reply-To: <26.D7.19545.BDE784D4@cdptpa-omtalb.mail.rr.com>
On 02/01/2011 10:44 PM, Leslie Rhorer wrote:
>> -----Original Message-----
>> From: Rudy Zijlstra [mailto:rudy@grumpydevil.homelinux.org]
>> Sent: Tuesday, February 01, 2011 3:02 PM
>> To: lrhorer@satx.rr.com
>> Cc: 'Linux RAID'
>> Subject: Re: Kernel 2.6.32-5-amd64 fails to boot.
>>
>> On 02/01/2011 09:52 PM, Leslie Rhorer wrote:
>>
>>>> On 02/01/2011 09:23 PM, Leslie Rhorer wrote:
>>>>
>>>>
>>>>
>>>>> doesn't boot, either. It gives a bit more detail in the output, but
>>>>>
>>>>>
>>>> nothing
>>>>
>>>>
>>>>> illuminating. The old kernel (2.6.32-3-amd64) boots just fine.
>>>>>
>>>>>
>>>>>
>>>> Can you enable serial console and catch the console output that way?
>>>>
>>>>
>>> Well, not easily. I don't have a serial terminal. I suppose I
>>> could set something up. You're suggesting I poke around to see what md
>>>
>> is
>>
>>> reporting? Also, I'm not sure why - if the keyboard console is failing
>>>
>> -
>>
>>> the serial console would work better.
>>>
>>>
>>>
>>>
>> Serial console can be captured to a file and then the output analysed.
>> So you can read afterwards the messages that are flying past.
>>
>> What i do in such case, is that i take serial connector from a laptop,
>> and run a terminal emulater like minicom. And capture it to a file so i
>> can analyse what has been happening.
>>
> Yeah, I don't think there is anything pertinent prior to the md
> failures, but it might be worth a shot. I don't have a laptop, but I do
> have another server sitting right below the one in question. The main
> problem is, neither one has a serial port.
>
>
Network console? I could tell you how to setup serial console, but i've
never done the network console
^ permalink raw reply
* Re: RAID HDDs spin up sequence
From: Roberto Spadim @ 2011-02-01 22:46 UTC (permalink / raw)
To: Stan Hoeppner; +Cc: John Robinson, Phillip Susi, Piergiorgio Sartor, linux-raid
In-Reply-To: <4D487D22.7090405@hardwarefreak.com>
some hardware solutions....
change PSU
change hard disk to solid state disks (OCZ is fast, energy saver, with
high MTBF, a very good disk is OCZ VERTEX 2, REVODRIVE (pci-express)
and OCZ AGILITY 2, check read random 4kb >=200 MB/s is better than any
SAS disk... latency is <0.1ms)
maybe changing to solid state is a good solution (cost is the point here)
another point is when startup remove (hot plug) some disks, and plug after
2011/2/1 Stan Hoeppner <stan@hardwarefreak.com>:
> John Robinson put forth on 2/1/2011 7:10 AM:
>
>> That'd be an excessive amount of time to wait. A quarter of a second is more
>> than enough, a tenth of a second would probably be enough. It's just the motor
>> inrush current you're trying to avoid having simultaneously.
>
> The blowers in a typical 2U server chassis will have slightly more startup
> current draw than the drives, assuming 5 80mm blowers and 8 2.5" drives. Mobos
> don't do staggered startup of blowers. Thus, staggering the drive spin up is
> pointless. Add to that the fact that most server chassis ship with PSUs large
> enough to carry the current draw of anything/everything you can stuff into them.
>
>> So waiting another second for your array to wake up would mean you could use a
>> sensibly-sized PSU operating in its 80%+ efficiency range, rather than a huge
>> PSU operating inefficiently.
>
> A typical 2.5" 10K RPM 600GB enterprise HDD, such as the Seagate Savvio, has a
> startup draw of 24.1 watts combined from the 12v and 5v rails. A RAID/JBOD
> chassis of 24 such drives, which is sold by dozens of vendors today, will draw
> only 578.4 watts with all drives spinning up concurrently. Most such chassis on
> the market today are sold with 800w to 1800w redundant PSUs, again, making
> staggered spin up moot.
>
> --
> Stan
> --
> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
Roberto Spadim
Spadim Technology / SPAEmpresarial
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH v2 2/2] block: share request flush fields with elevator_private
From: Mike Snitzer @ 2011-02-01 22:46 UTC (permalink / raw)
To: Tejun Heo, Jens Axboe
Cc: tytso, djwong, shli, neilb, adilger.kernel, jack, linux-kernel,
kmannth, cmm, linux-ext4, rwheeler, hch, josef, jmoyer, vgoyal,
snitzer
In-Reply-To: <20110201185225.GT14211@htj.dyndns.org>
Flush requests are never put on the IO scheduler. Convert request
structure's elevator_private* into an array and have the flush fields
share a union with it.
Reclaim the space lost in 'struct request' by moving 'completion_data'
back in the union with 'rb_node'.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
block/cfq-iosched.c | 18 +++++++++---------
block/elevator.c | 2 +-
include/linux/blkdev.h | 23 ++++++++++++-----------
3 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 501ffdf..8692958 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -54,9 +54,9 @@ static const int cfq_hist_divisor = 4;
#define CFQQ_SEEKY(cfqq) (hweight32(cfqq->seek_history) > 32/8)
#define RQ_CIC(rq) \
- ((struct cfq_io_context *) (rq)->elevator_private)
-#define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private2)
-#define RQ_CFQG(rq) (struct cfq_group *) ((rq)->elevator_private3)
+ ((struct cfq_io_context *) (rq)->elevator_private[0])
+#define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private[1])
+#define RQ_CFQG(rq) (struct cfq_group *) ((rq)->elevator_private[2])
static struct kmem_cache *cfq_pool;
static struct kmem_cache *cfq_ioc_pool;
@@ -3609,12 +3609,12 @@ static void cfq_put_request(struct request *rq)
put_io_context(RQ_CIC(rq)->ioc);
- rq->elevator_private = NULL;
- rq->elevator_private2 = NULL;
+ rq->elevator_private[0] = NULL;
+ rq->elevator_private[1] = NULL;
/* Put down rq reference on cfqg */
cfq_put_cfqg(RQ_CFQG(rq));
- rq->elevator_private3 = NULL;
+ rq->elevator_private[2] = NULL;
cfq_put_queue(cfqq);
}
@@ -3702,9 +3702,9 @@ new_queue:
cfqq->allocated[rw]++;
cfqq->ref++;
- rq->elevator_private = cic;
- rq->elevator_private2 = cfqq;
- rq->elevator_private3 = cfq_ref_get_cfqg(cfqq->cfqg);
+ rq->elevator_private[0] = cic;
+ rq->elevator_private[1] = cfqq;
+ rq->elevator_private[2] = cfq_ref_get_cfqg(cfqq->cfqg);
spin_unlock_irqrestore(q->queue_lock, flags);
diff --git a/block/elevator.c b/block/elevator.c
index 270e097..f98e92e 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -764,7 +764,7 @@ int elv_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask)
if (e->ops->elevator_set_req_fn)
return e->ops->elevator_set_req_fn(q, rq, gfp_mask);
- rq->elevator_private = NULL;
+ rq->elevator_private[0] = NULL;
return 0;
}
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 8a082a5..e3ee74f 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -99,25 +99,26 @@ struct request {
/*
* The rb_node is only used inside the io scheduler, requests
* are pruned when moved to the dispatch queue. So let the
- * flush fields share space with the rb_node.
+ * completion_data share space with the rb_node.
*/
union {
struct rb_node rb_node; /* sort/lookup */
- struct {
- unsigned int seq;
- struct list_head list;
- } flush;
+ void *completion_data;
};
- void *completion_data;
^ permalink raw reply related
* [PATCH v2 2/2] block: share request flush fields with elevator_private
From: Mike Snitzer @ 2011-02-01 22:46 UTC (permalink / raw)
To: Tejun Heo, Jens Axboe
Cc: tytso, djwong, shli, neilb, adilger.kernel, jack, linux-kernel,
kmannth, cmm, linux-ext4, rwheeler, hch, josef, jmoyer, vgoyal,
snitzer
In-Reply-To: <20110201185225.GT14211@htj.dyndns.org>
Flush requests are never put on the IO scheduler. Convert request
structure's elevator_private* into an array and have the flush fields
share a union with it.
Reclaim the space lost in 'struct request' by moving 'completion_data'
back in the union with 'rb_node'.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
block/cfq-iosched.c | 18 +++++++++---------
block/elevator.c | 2 +-
include/linux/blkdev.h | 23 ++++++++++++-----------
3 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 501ffdf..8692958 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -54,9 +54,9 @@ static const int cfq_hist_divisor = 4;
#define CFQQ_SEEKY(cfqq) (hweight32(cfqq->seek_history) > 32/8)
#define RQ_CIC(rq) \
- ((struct cfq_io_context *) (rq)->elevator_private)
-#define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private2)
-#define RQ_CFQG(rq) (struct cfq_group *) ((rq)->elevator_private3)
+ ((struct cfq_io_context *) (rq)->elevator_private[0])
+#define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private[1])
+#define RQ_CFQG(rq) (struct cfq_group *) ((rq)->elevator_private[2])
static struct kmem_cache *cfq_pool;
static struct kmem_cache *cfq_ioc_pool;
@@ -3609,12 +3609,12 @@ static void cfq_put_request(struct request *rq)
put_io_context(RQ_CIC(rq)->ioc);
- rq->elevator_private = NULL;
- rq->elevator_private2 = NULL;
+ rq->elevator_private[0] = NULL;
+ rq->elevator_private[1] = NULL;
/* Put down rq reference on cfqg */
cfq_put_cfqg(RQ_CFQG(rq));
- rq->elevator_private3 = NULL;
+ rq->elevator_private[2] = NULL;
cfq_put_queue(cfqq);
}
@@ -3702,9 +3702,9 @@ new_queue:
cfqq->allocated[rw]++;
cfqq->ref++;
- rq->elevator_private = cic;
- rq->elevator_private2 = cfqq;
- rq->elevator_private3 = cfq_ref_get_cfqg(cfqq->cfqg);
+ rq->elevator_private[0] = cic;
+ rq->elevator_private[1] = cfqq;
+ rq->elevator_private[2] = cfq_ref_get_cfqg(cfqq->cfqg);
spin_unlock_irqrestore(q->queue_lock, flags);
diff --git a/block/elevator.c b/block/elevator.c
index 270e097..f98e92e 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -764,7 +764,7 @@ int elv_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask)
if (e->ops->elevator_set_req_fn)
return e->ops->elevator_set_req_fn(q, rq, gfp_mask);
- rq->elevator_private = NULL;
+ rq->elevator_private[0] = NULL;
return 0;
}
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 8a082a5..e3ee74f 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -99,25 +99,26 @@ struct request {
/*
* The rb_node is only used inside the io scheduler, requests
* are pruned when moved to the dispatch queue. So let the
- * flush fields share space with the rb_node.
+ * completion_data share space with the rb_node.
*/
union {
struct rb_node rb_node; /* sort/lookup */
- struct {
- unsigned int seq;
- struct list_head list;
- } flush;
+ void *completion_data;
};
- void *completion_data;
-
/*
* Three pointers are available for the IO schedulers, if they need
- * more they have to dynamically allocate it.
+ * more they have to dynamically allocate it. Flush requests are
+ * never put on the IO scheduler. So let the flush fields share
+ * space with the three elevator_private pointers.
*/
- void *elevator_private;
- void *elevator_private2;
- void *elevator_private3;
+ union {
+ void *elevator_private[3];
+ struct {
+ unsigned int seq;
+ struct list_head list;
+ } flush;
+ };
struct gendisk *rq_disk;
struct hd_struct *part;
--
1.7.3.4
^ permalink raw reply related
* Re: [PATCH 17/18] wl1251: enable tx path in monitor mode if necessary for packet injection
From: Kalle Valo @ 2011-02-01 22:47 UTC (permalink / raw)
To: David Gnedt
Cc: John W. Linville, linux-wireless, Grazvydas Ignotas,
Denis 'GNUtoo' Carikli
In-Reply-To: <4D473F16.4010102@davizone.at>
David Gnedt <david.gnedt@davizone.at> writes:
> Am 2011-01-31 17:02, schrieb Kalle Valo:
>
>> I would like to step back and first look at the problem you are trying
>> to solve and maybe there's a way we can fix the join command. Was it
>> something to do with firmware sending extra frames? Unfortunately TI
>> firmwares are notorious for that.
>
> Yeah, you are right, but I don't think the JOIN command can be
> fixed. Even if we use it with a zero BSSID and zero SSID, it sends
> some frames.
What frames are we talking about exactly? (I can't test this right now.)
> All in all I think the JOIN command was only meant to be used when you really
> want to associate.
Yes, that has been my impression as well. But I really don't know if
we have any better options. Adding the hack you did to tx path is
really awkward as well.
> It would be really unpleasant if the firmware keeps sending frames
> while channel hopping (through user-space software) in monitor mode.
I don't see it as that bad really, but of course it depends what
frames are sent.
--
Kalle Valo
^ permalink raw reply
* Re: [Qemu-devel] [PULL 0/8] spice patch queue
From: Anthony Liguori @ 2011-02-01 21:24 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: qemu-devel
In-Reply-To: <1296123150-11599-1-git-send-email-kraxel@redhat.com>
On 01/27/2011 04:12 AM, Gerd Hoffmann wrote:
> Hi,
>
> This is the updated spice patch queue. Changes:
>
> * rebased against latest master, solved conflicts (trace-events).
> * added one more locking bugfix, found by Alon.
>
> please pull,
> Gerd
>
> The following changes since commit 0fad6efce5d3f18278b7239dece3c251b3e7c04d:
>
> target-arm: Fix loading of scalar value for Neon multiply-by-scalar (2011-01-26 14:30:24 +0100)
>
> are available in the git repository at:
> git://anongit.freedesktop.org/spice/qemu spice.v30.pull
>
> Alon Levy (1):
> spice: add chardev (v5)
>
Pulled. Thanks.
Although I expect that we'll continue working together in the future to
come up with a common guest agent infrastructure.
Regards,
Anthony Liguori
> Gerd Hoffmann (5):
> add migration state change notifiers
> spice/vnc: client migration.
> spice: MAINTAINERS update
> spice/qxl: zap spice 0.4 migration compatibility bits
> qxl: locking fixes
>
> Jiri Denemark (1):
> configure: Fix spice probe
>
> Marc-André Lureau (1):
> vnc/spice: fix "never" and "now" expire_time
>
> MAINTAINERS | 8 ++
> Makefile.objs | 2 +-
> configure | 6 +-
> hmp-commands.hx | 17 +++++
> hw/qxl.c | 83 ++++-------------------
> hw/qxl.h | 4 -
> migration.c | 28 ++++++++
> migration.h | 5 ++
> monitor.c | 31 ++++++++-
> qemu-char.c | 4 +
> qemu-config.c | 6 ++
> qemu-options.hx | 16 ++++-
> qmp-commands.hx | 35 ++++++++++
> spice-qemu-char.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> trace-events | 7 ++
> ui/qemu-spice.h | 7 ++
> ui/spice-core.c | 25 +++++++
> 17 files changed, 394 insertions(+), 80 deletions(-)
> create mode 100644 spice-qemu-char.c
>
>
>
^ permalink raw reply
* AVB support (IEEE802.1 audio/video bridging)
From: Eliot Blennerhassett @ 2011-02-01 22:47 UTC (permalink / raw)
To: netdev
Grettings,
before I go into any details, please tell me if this is the right place
to enquire/discuss if/how linux network stacks can support the various
protocols required by AVB
To quote the introduction from wikipedia [1]
"Audio Video Bridging (AVB) is a common name for the set of standards in
development by the IEEE 802.1 Audio Video Bridging Task Group. The
charter of this organization is to "provide the specifications that will
allow time-synchronized low latency streaming services through IEEE 802
networks"."
regards
--
Eliot Blennerhassett
AudioScience Inc.
[1] http://en.wikipedia.org/wiki/Audio_Video_Bridging
^ permalink raw reply
* Re: moving to a git-backed wiki
From: J.H. @ 2011-02-01 22:48 UTC (permalink / raw)
To: Jay Soffian; +Cc: Jeff King, Scott Chacon, Junio C Hamano, git
In-Reply-To: <AANLkTikfzzELUaN3B+20rh9D51St8mUYs4p-WYjp8JVV@mail.gmail.com>
On 02/01/2011 02:36 PM, Jay Soffian wrote:
> On Tue, Feb 1, 2011 at 3:11 PM, Jeff King <peff@peff.net> wrote:
>> https://github.com/peff/foo/wiki
>
> A git-backed git wiki would be great. As a related matter, the hosting
> infrastructure for https://git.wiki.kernel.org/index.php/Main_Page
> seems overloaded. About half the time I try to access it, it's either
> down completely or very slow to respond. If the wiki were git-backed I
> could get to it even if the central site were down. :-)
The wiki will almost universally have a "central site" no matter what
the backend. Personally I see little advantage to having a git backed
wiki myself.
Speaking to the slowness, it's caused by at least 2 different kernel
related bugs on the two boxes that run the wikis that I haven't had
enough time to track down to nail to specific developers to fix. I have
20u of equipment sitting in my apartment that is heading to Portland in
the next two weeks to eliminate the bits I'm pretty sure are the root
cause of the problems.
Trust me when I say it's not only been a thorn in my side, and something
I've been rather angry at several people about, but it's something that
has kept me up at night trying to get fixed.
> That said, didn't the wiki just migrate to Mediawiki recently?
It did.
- John 'Warthog9' Hawley
^ permalink raw reply
* Re: [RFC/RFT PATCH] cgroup: enable write permission for the group of users
From: Paul Menage @ 2011-02-01 22:44 UTC (permalink / raw)
To: Jordi Pujol; +Cc: linux-kernel, Ingo Molnar, Mike Galbraith
In-Reply-To: <201102011002.09819.jordipujolp@gmail.com>
On Tue, Feb 1, 2011 at 1:02 AM, Jordi Pujol <jordipujolp@gmail.com> wrote:
> Hello,
>
> Working in a development that uses control groups and libcgroup, I have found
> that the files in control groups directories need write permission for the
> group of users also.
This can be configured from userspace - chmod() works just fine on
control files in cgroupfs.
Paul
^ permalink raw reply
* Re: [PATCH 0/2] x86/microcode: support for microcode update in Xen dom0
From: Jeremy Fitzhardinge @ 2011-02-01 22:52 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Xen Devel, the arch/x86 maintainers, Linux Kernel Mailing List,
Jeremy Fitzhardinge, Borislav Petkov, Ingo Molnar
In-Reply-To: <4D475DB5.1020300@zytor.com>
On 01/31/2011 05:11 PM, H. Peter Anvin wrote:
> Note: Xen may not have devices, but it is already using multiboot to
> load multiple modules. It could load the microcode blob that way.
>
> That would enable an earlier loading of microcode, which is a very
> good thing.
Yes, that is a thought, but it would require some distro support to make
sure the firmware is copied into /boot, and grub updated appropriately.
The principle advantage of updating the microcode driver is that it Just
Works regardless of whether the system is booting native or Xen.
J
^ permalink raw reply
* Re: [PATCH 0/2] x86/microcode: support for microcode update in Xen dom0
From: Jeremy Fitzhardinge @ 2011-02-01 22:52 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Borislav Petkov, Ingo Molnar, the arch/x86 maintainers,
Linux Kernel Mailing List, Xen Devel, Jeremy Fitzhardinge
In-Reply-To: <4D475DB5.1020300@zytor.com>
On 01/31/2011 05:11 PM, H. Peter Anvin wrote:
> Note: Xen may not have devices, but it is already using multiboot to
> load multiple modules. It could load the microcode blob that way.
>
> That would enable an earlier loading of microcode, which is a very
> good thing.
Yes, that is a thought, but it would require some distro support to make
sure the firmware is copied into /boot, and grub updated appropriately.
The principle advantage of updating the microcode driver is that it Just
Works regardless of whether the system is booting native or Xen.
J
^ permalink raw reply
* Re: [PATCH] include/net/genetlink.h: Allow genlmsg_cancel to accept a NULL argument
From: David Miller @ 2011-02-01 22:54 UTC (permalink / raw)
To: julia; +Cc: netdev, linux-kernel, paul.moore, kernel-janitors
In-Reply-To: <Pine.LNX.4.64.1101281642080.8546@pc-004.diku.dk>
From: Julia Lawall <julia@diku.dk>
Date: Fri, 28 Jan 2011 16:43:40 +0100 (CET)
> nlmsg_cancel can accept NULL as its second argument, so for similarity,
> this patch extends genlmsg_cancel to be able to accept a NULL second
> argument as well.
>
> Signed-off-by: Julia Lawall <julia@diku.dk>
I did a scan of all of the cases where this interface is used, and
I cannot find a situation where this capability would even be useful.
The use pattern is always:
hdr = genlmsg_put(skb, ...);
if (!hdr)
goto out;
NLA_PUT_*();
NLA_PUT_*();
....
return genlmsg_end(skb, hdr);
nla_put_failure:
genlmsg_cancel(skb, hdr);
out:
return -EWHATEVER;
Always, hdr will be non-NULL.
We have to allocate the header first, then put the netlink
attributes.
Looking over users of nlmsg_cancel(), the situation seems to
match identically.
Therefore, it seems to me that it makes more sense to remove
the NULL check from nlmsg_cancel() than to add the NULL check
to genlmsg_cancel().
Thanks.
^ permalink raw reply
* Re: [PATCH] include/net/genetlink.h: Allow genlmsg_cancel to
From: David Miller @ 2011-02-01 22:54 UTC (permalink / raw)
To: julia; +Cc: netdev, linux-kernel, paul.moore, kernel-janitors
In-Reply-To: <Pine.LNX.4.64.1101281642080.8546@pc-004.diku.dk>
From: Julia Lawall <julia@diku.dk>
Date: Fri, 28 Jan 2011 16:43:40 +0100 (CET)
> nlmsg_cancel can accept NULL as its second argument, so for similarity,
> this patch extends genlmsg_cancel to be able to accept a NULL second
> argument as well.
>
> Signed-off-by: Julia Lawall <julia@diku.dk>
I did a scan of all of the cases where this interface is used, and
I cannot find a situation where this capability would even be useful.
The use pattern is always:
hdr = genlmsg_put(skb, ...);
if (!hdr)
goto out;
NLA_PUT_*();
NLA_PUT_*();
....
return genlmsg_end(skb, hdr);
nla_put_failure:
genlmsg_cancel(skb, hdr);
out:
return -EWHATEVER;
Always, hdr will be non-NULL.
We have to allocate the header first, then put the netlink
attributes.
Looking over users of nlmsg_cancel(), the situation seems to
match identically.
Therefore, it seems to me that it makes more sense to remove
the NULL check from nlmsg_cancel() than to add the NULL check
to genlmsg_cancel().
Thanks.
^ permalink raw reply
* big files in git was: Re: Features from GitSurvey 2010
From: david @ 2011-02-01 22:50 UTC (permalink / raw)
To: Jakub Narebski; +Cc: Jonathan Nieder, Dmitry S. Kravtsov, git
In-Reply-To: <201102011451.17456.jnareb@gmail.com>
On Tue, 1 Feb 2011, Jakub Narebski wrote:
> On Sun, 30 Jan 2011, Jonathan Nieder wrote:
>> Hi Dmitry,
>>
>> Dmitry S. Kravtsov wrote:
>>
>>> I want to dedicate my coursework at University to implementation of
>>> some useful git feature. So I'm interesting in some kind of list of
>>> development status of these features
>> [...]
>>> Or I'll be glad to know what features are now 'free' and what are
>>> currently in active development.
>>
>> Interesting question. The short answer is that they are all "free".
>> Generally people seem to be happy to learn of an alternative approach
>> to what they have been working on.
>>
>> [For the following pointers, the easiest way to follow up is probably
>> to search the mailing list archives.]
>>
>>> better support for big files (large media)
>>
>> For a conservative approach, you might want to get in touch with Sam
>> Hocevar, Nicolas Pitre, and Miklos Vajna. The idea is to stream big
>> files directly to pack and not waste time trying to compress them.
>
> There is also, supposedly stalled, git-bigfiles project.
why is the clean/smudge approach that came through the list a week or two
ago not acceptable?
While people talked about how it would be nice to store the large files on
$remote_destination, just create a .git/bigfiles and store them in there.
with the ability to pass the filename to the clean/smudge scripts, you can
even avoid the copy (replacing it with a mv) and have a working, if
bare-bones system.
Then people can create/submit enhanced versions of these scripts that
store the large files elsewhere if they want, but we would be past the
"git can't handle large files" into "git handles large files less
efficiently", which is a much better place to be.
If nobody else has time to take those e-mails and create a set of
clean/smudge scripts, I'll do so later this week (unless there is some
reason why they wouldn't be acceptable)
I guess the only question is how to tell what files need to be handled
this way, but can't we have something in .gitattributes about the file
size? (and if that's a problem for checking files out, have the stored
file be a sparse file, that way it's large, but doesn't take much space on
sane filesystems)
David Lang
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
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.