[PATCH] binfmt_elf: Reordered object list so compat_binfmt_elf optionally comes first.

From: Ryan C . Gordon
Date: Wed Oct 21 2009 - 03:49:30 EST


This will make it call register_binfmt() after normal binfmt_elf, inserting it
at the end of the list of binfmts.

Now the kernel will try the compatibility formats as a backup if the actual
system format rejects the binary. As almost all binaries loaded won't be
compatibility formats, this saves a few cycles for each process.

For scenarios where favoring compatibility binaries makes sense, this can
be chosen via the configuration, reversing the order.

Signed-off-by: Ryan C. Gordon <icculus@xxxxxxxxxxx>
---
fs/Kconfig.binfmt | 14 ++++++++++++++
fs/Makefile | 7 +++++++
2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index bb4cc5b..b296ab6 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -27,6 +27,20 @@ config COMPAT_BINFMT_ELF
bool
depends on COMPAT && BINFMT_ELF

+config FAVOR_COMPAT_BINFMT_ELF
+ bool "Favor compatibility ELF binaries"
+ depends on COMPAT_BINFMT_ELF
+ default n
+ ---help---
+ Favor "compatibility" ELF binaries. The system will work either way,
+ but you can save a few cycles per process by choosing the type of
+ binary you expect to be loading most of the time. This scenario
+ makes sense if you have a 64-bit kernel to manage 4+ gigabytes of
+ physical RAM but want to run mostly 32-bit processes to conserve
+ that RAM.
+
+ If unsure, say N.
+
config BINFMT_ELF_FDPIC
bool "Kernel support for FDPIC ELF binaries"
default y
diff --git a/fs/Makefile b/fs/Makefile
index af6d047..d835dba 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -40,8 +40,15 @@ obj-$(CONFIG_BINFMT_MISC) += binfmt_misc.o
# binfmt_script is always there
obj-y += binfmt_script.o

+# binfmts are registered in order listed here. First registered, first tried!
+ifeq ($(CONFIG_FAVOR_COMPAT_BINFMT_ELF),y)
+obj-$(CONFIG_COMPAT_BINFMT_ELF) += compat_binfmt_elf.o
+obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
+else
obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
obj-$(CONFIG_COMPAT_BINFMT_ELF) += compat_binfmt_elf.o
+endif
+
obj-$(CONFIG_BINFMT_ELF_FDPIC) += binfmt_elf_fdpic.o
obj-$(CONFIG_BINFMT_SOM) += binfmt_som.o
obj-$(CONFIG_BINFMT_FLAT) += binfmt_flat.o
--
1.6.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/