* [patch 0/2] ACPI: generic initramfs table override support #3
@ 2009-10-09 19:55 Jeff Mahoney
2009-10-09 19:55 ` [patch 1/2] init: move populate_rootfs back to start_kernel Jeff Mahoney
2009-10-09 19:55 ` [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
0 siblings, 2 replies; 8+ messages in thread
From: Jeff Mahoney @ 2009-10-09 19:55 UTC (permalink / raw)
To: linux-acpi
Cc: Éric Piel, Jan Beulich, Thomas Renninger, H. Peter Anvin,
Len Brown
This patch set contains two patches:
1) Move populate_rootfs back to start_kernel, so it can be used by
acpi_early_init
2) Add the ability to override ACPI tables from the initramfs
I'd like some review for the second patch. I expect objections to what is
essentially open coding the top of acpi_load_table in a separate function,
but Jan Beulich advised me that modifying code under acpica/ was not
recommended. Ideally there would be a way to replace an existing table
before it is loaded, or at the very least be able to request the table
descriptor instead of just the table header.
I've tested this patch set successfully at home, but I don't have a
particularly exotic setup.
Thanks!
-Jeff
--
Jeff Mahoney
SuSE Labs
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 1/2] init: move populate_rootfs back to start_kernel
2009-10-09 19:55 [patch 0/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
@ 2009-10-09 19:55 ` Jeff Mahoney
2009-10-09 19:55 ` [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
1 sibling, 0 replies; 8+ messages in thread
From: Jeff Mahoney @ 2009-10-09 19:55 UTC (permalink / raw)
To: linux-acpi
Cc: Éric Piel, Jan Beulich, Thomas Renninger, H. Peter Anvin,
Len Brown
[-- Attachment #1: patches.suse/populate_rootfs-in-start_kernel --]
[-- Type: text/plain, Size: 2851 bytes --]
Mainline commit 8d610dd5 introduced the rootfs_initcall and moved
populate_rootfs out of start_kernel. This was because of issues
with userspace helpers being executed way too early. Things like
pipes weren't initialized yet and users were seeing Oopses or
unpredictable behavior in certain circumstances.
The fix worked by causing the execve to fail because it couldn't lookup
the helper in the file system since the file system wasn't populate yet.
It turns out that's a really late place to fail since the entire
usermodehelper infrastructure depends on a work queue that is already
checked to see if it has been initialized. We can fail earlier without
having to fork threads that will ultimately fail.
This patch moves populate_rootfs back to start_kernel and avoids the
race against a very early userspace by moving the initialization of
khelper_wq to rootfs_initcall.
This may seem like a small win, but it is essential for my next patch
which adds the ability to override ACPI tables at boot-time.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
include/linux/init.h | 1 +
init/initramfs.c | 3 +--
init/main.c | 10 +++++++++-
kernel/kmod.c | 1 +
4 files changed, 12 insertions(+), 3 deletions(-)
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -146,6 +146,7 @@ extern unsigned int reset_devices;
/* used by init/main.c */
void setup_arch(char **);
void prepare_namespace(void);
+int populate_rootfs(void);
extern void (*late_time_init)(void);
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -565,7 +565,7 @@ static void __init clean_rootfs(void)
}
#endif
-static int __init populate_rootfs(void)
+int __init populate_rootfs(void)
{
char *err = unpack_to_rootfs(__initramfs_start,
__initramfs_end - __initramfs_start);
@@ -605,4 +605,3 @@ static int __init populate_rootfs(void)
}
return 0;
}
-rootfs_initcall(populate_rootfs);
--- a/init/main.c
+++ b/init/main.c
@@ -747,6 +747,15 @@ asmlinkage void __init start_kernel(void
check_bugs();
+ /*
+ * Do this before starting ACPI so we can read-in
+ * override tables before the tables are actually
+ * loaded. The usermode helper won't be initialized
+ * until much later so we don't race against things
+ * calling out to userspace.
+ */
+ populate_rootfs();
+
acpi_early_init(); /* before LAPIC and SMP init */
ftrace_init();
@@ -844,7 +853,6 @@ static void __init do_basic_setup(void)
rcu_init_sched(); /* needed by module_init stage. */
init_workqueues();
cpuset_init_smp();
- usermodehelper_init();
init_tmpfs();
driver_init();
init_irq_proc();
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -527,3 +527,4 @@ void __init usermodehelper_init(void)
khelper_wq = create_singlethread_workqueue("khelper");
BUG_ON(!khelper_wq);
}
+rootfs_initcall(usermodehelper_init);
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-09 19:55 [patch 0/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
2009-10-09 19:55 ` [patch 1/2] init: move populate_rootfs back to start_kernel Jeff Mahoney
@ 2009-10-09 19:55 ` Jeff Mahoney
2009-10-09 20:19 ` Matthew Garrett
1 sibling, 1 reply; 8+ messages in thread
From: Jeff Mahoney @ 2009-10-09 19:55 UTC (permalink / raw)
To: linux-acpi
Cc: Éric Piel, Jan Beulich, Thomas Renninger, H. Peter Anvin,
Len Brown
[-- Attachment #1: patches.suse/acpi-generic-initramfs-table-override --]
[-- Type: TEXT/PLAIN, Size: 12864 bytes --]
This patch allows the system administrator to override ACPI tables with
versions provided in an initramfs.
This works by moving the initialization of populate_rootfs earlier
in the initialization so that we can use the VFS file system routines.
The system is initialized enough to support this by acpi_early_init().
My understanding is that an early version of original patch posted at
http://gaugusch.at/kernel.shtml may have done something similar.
This version provides the infrastructure to override any ACPI table, but
only provides support for overriding DSDT. If other tables are desired,
extending the support is trivial.
During early ACPI initialization, when the initramfs is still loaded,
we go through a table of override entries which specify the name of the
table to override, the file name that contains it, and a pointer to the
data loaded from the file. The override tables and headers are kept in
memory so that they available to the ACPI subsystem after the __init
sections and the initramfs have been jettisoned.
Changes:
v2 - Moved code from acpi/acpica/tbxface.c to acpi/osl.c
v3 - Moved init code into a separate patch which handles the race initially
fixed by mainline commit 8d610dd5.
This patch is derived from the work by Ãric Piel <eric.piel@tremplin-utc.net>.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
Documentation/acpi/dsdt-override.txt | 8 +
Documentation/acpi/initramfs-add-dsdt.sh | 43 +++++++
Documentation/acpi/table-override.txt | 21 +++
Documentation/kernel-parameters.txt | 4
drivers/acpi/Kconfig | 13 ++
drivers/acpi/bus.c | 7 +
drivers/acpi/osl.c | 169 +++++++++++++++++++++++++++++++
include/acpi/acpiosxf.h | 7 +
8 files changed, 271 insertions(+), 1 deletion(-)
--- a/Documentation/acpi/dsdt-override.txt
+++ b/Documentation/acpi/dsdt-override.txt
@@ -1,7 +1,13 @@
-Linux supports a method of overriding the BIOS DSDT:
+Linux supports two methods of overriding the BIOS DSDT:
CONFIG_ACPI_CUSTOM_DSDT builds the image into the kernel.
+CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS loads the image from
+the initramfs at boot-time. It is more flexible in that it
+does not need to be built into the kernel and tables other
+than DSDT can potentially be overridden. Please see
+Documentation/acpi/table-override.txt for more information.
+
When to use this method is described in detail on the
Linux/ACPI home page:
http://www.lesswatts.org/projects/acpi/overridingDSDT.php
--- /dev/null
+++ b/Documentation/acpi/initramfs-add-dsdt.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Adds a DSDT file to the initrd (if it's an initramfs)
+# first argument is the name of archive
+# second argument is the name of the file to add
+# The file will be copied as /DSDT.aml
+
+# 20060126: fix "Premature end of file" with some old cpio (Roland Robic)
+# 20060205: this time it should really work
+
+# check the arguments
+if [ $# -ne 2 ]; then
+ program_name=$(basename $0)
+ echo "\
+$program_name: too few arguments
+Usage: $program_name initrd-name.img DSDT-to-add.aml
+Adds a DSDT file to an initrd (in initramfs format)
+
+ initrd-name.img: filename of the initrd in initramfs format
+ DSDT-to-add.aml: filename of the DSDT file to add
+ " 1>&2
+ exit 1
+fi
+
+# we should check it's an initramfs
+
+tempcpio=$(mktemp -d)
+# cleanup on exit, hangup, interrupt, quit, termination
+trap 'rm -rf $tempcpio' 0 1 2 3 15
+
+# extract the archive
+gunzip -c "$1" > "$tempcpio"/initramfs.cpio || exit 1
+
+# copy the DSDT file at the root of the directory so that we can call it "/DSDT.aml"
+cp -f "$2" "$tempcpio"/DSDT.aml
+
+# add the file
+cd "$tempcpio"
+(echo DSDT.aml | cpio --quiet -H newc -o -A -O "$tempcpio"/initramfs.cpio) || exit 1
+cd "$OLDPWD"
+
+# re-compress the archive
+gzip -c "$tempcpio"/initramfs.cpio > "$1"
+
--- /dev/null
+++ b/Documentation/acpi/table-override.txt
@@ -0,0 +1,21 @@
+CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS provides a mechanism for
+the user to add table images to the initramfs for loading at
+runtime. Tables used before expansion of the initramfs may not
+be replaced. Fortunately this list is small and the one most
+typically used, DSDT, is not one of them.
+
+In order to override a table, the image must be placed in the root
+of the initramfs with a filename of <table-name>.aml (e.g. DSDT.aml).
+
+As the ACPI subsystem initializes, it will load the tables into memory
+and override them as the tables are needed.
+
+This option takes precedence over the in-kernel method provided by
+the ACPI_CUSTOM_DSDT config option.
+
+When to use these methods is described in detail on the
+Linux/ACPI home page:
+http://www.lesswatts.org/projects/acpi/overridingDSDT.php
+
+Documentation/initramfs-add-dsdt.sh is provided for convenience
+for use with the CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS method.
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -216,6 +216,10 @@ and is between 256 and 4096 characters.
acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT
+ acpi_no_initrd_override [KNL,ACPI]
+ acpi_no_initramfs_override [KNL,ACPI]
+ Disable loading custom ACPI tables from the initramfs
+
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
Format: To spoof as Windows 98: ="Microsoft Windows"
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -233,6 +233,19 @@ config ACPI_CUSTOM_DSDT
bool
default ACPI_CUSTOM_DSDT_FILE != ""
+config ACPI_CUSTOM_OVERRIDE_INITRAMFS
+ bool "Load ACPI override tables from initramfs"
+ depends on BLK_DEV_INITRD
+ default n
+ help
+ This option supports loading custom replacement tables by optionally
+ loading them from the initramfs.
+
+ See Documentation/acpi/table-override.txt
+
+ If you are not using this feature now, but may use it later,
+ it is safe to say Y here.
+
config ACPI_BLACKLIST_YEAR
int "Disable ACPI for systems before Jan 1st this year" if X86_32
default 0
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -669,6 +669,13 @@ void __init acpi_early_init(void)
goto error0;
}
+ status = acpi_load_override_tables();
+ if (ACPI_FAILURE(status)) {
+ printk(KERN_ERR PREFIX
+ "Unable to load Override Tables\n");
+ goto error0;
+ }
+
status = acpi_load_tables();
if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -43,6 +43,7 @@
#include <linux/list.h>
#include <linux/jiffies.h>
#include <linux/semaphore.h>
+#include <linux/syscalls.h>
#include <asm/io.h>
#include <asm/uaccess.h>
@@ -51,6 +52,15 @@
#include <acpi/acpi_bus.h>
#include <acpi/processor.h>
+/* We need these to manipulate the global table array. The existing
+ * accessors in acpica/ only pass back the table header and we need
+ * the descriptor. */
+#include "acpica/acconfig.h"
+#include "acpica/aclocal.h"
+#include "acpica/acglobal.h"
+#include "acpica/acutils.h"
+#include "acpica/actables.h"
+
#define _COMPONENT ACPI_OS_SERVICES
ACPI_MODULE_NAME("osl");
#define PREFIX "ACPI: "
@@ -96,6 +106,23 @@ static DEFINE_SPINLOCK(acpi_res_lock);
#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
static char osi_additional_string[OSI_STRING_LENGTH_MAX];
+#ifdef CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS
+static int acpi_no_initrd_override;
+static int __init acpi_no_initrd_override_setup(char *s)
+{
+ acpi_no_initrd_override = 1;
+ return 1;
+}
+
+static int __init acpi_no_initramfs_override_setup(char *s)
+{
+ return acpi_no_initrd_override_setup(s);
+}
+
+__setup("acpi_no_initrd_override", acpi_no_initrd_override_setup);
+__setup("acpi_no_initramfs_override", acpi_no_initramfs_override_setup);
+#endif
+
/*
* The story of _OSI(Linux)
*
@@ -350,6 +377,144 @@ acpi_os_predefined_override(const struct
return AE_OK;
}
+#ifdef CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS
+struct acpi_override_table_entry
+{
+ const char *name;
+ struct acpi_table_header *table;
+};
+
+static struct acpi_override_table_entry acpi_override_table_entries[] = {
+ { .name = "DSDT", },
+ {}
+};
+
+acpi_status __init
+acpi_load_one_override_table(struct acpi_override_table_entry *entry)
+{
+ int fd, ret;
+ acpi_status err = AE_OK;
+ char filename[10]; /* /DSDT.aml\0 */
+ struct kstat stat;
+
+ snprintf(filename, sizeof(filename), "/%.4s.aml", entry->name);
+
+ fd = sys_open(filename, O_RDONLY, 0);
+ if (fd < 0)
+ return AE_NOT_FOUND;
+
+ ret = vfs_fstat(fd, &stat);
+ if (ret < 0) {
+ printk(KERN_ERR "ACPI: fstat failed while trying to read %s\n",
+ filename);
+ err = AE_ERROR;
+ goto out;
+ }
+
+ entry->table = kmalloc(stat.size, GFP_KERNEL);
+ if (!entry->table) {
+ printk(KERN_ERR "ACPI: Could not allocate memory to "
+ "override %s\n", entry->name);
+ err = AE_NO_MEMORY;
+ goto out;
+ }
+
+ ret = sys_read(fd, (char *)entry->table, stat.size);
+ sys_close(fd);
+ if (ret != stat.size) {
+ printk(KERN_ERR "ACPI: Failed to read %s from initramfs\n",
+ entry->name);
+ err = AE_ERROR;
+ goto out;
+ }
+
+out:
+ if (err != AE_OK) {
+ kfree(entry->table);
+ entry->table = NULL;
+ }
+ sys_close(fd);
+ return ret;
+}
+
+static void __init
+acpi_replace_table(struct acpi_table_desc *table, struct acpi_table_header *new)
+{
+ /* This is the top part of acpi_load_table */
+ memset(table, 0, sizeof(*table));
+ table->address = ACPI_PTR_TO_PHYSADDR(new);
+ table->pointer = new;
+ table->length = new->length;
+ table->flags |= ACPI_TABLE_ORIGIN_OVERRIDE;
+ table->flags |= ACPI_TABLE_ORIGIN_ALLOCATED;
+ memcpy(table->signature.ascii, new->signature, ACPI_NAME_SIZE);
+}
+
+/* This replaces tables already opportunistically loaded, but not used.
+ * If the acpica code provided a table descriptor lookup then we wouldn't
+ * need to open code this. */
+static void __init
+acpi_override_tables(void)
+{
+ struct acpi_table_header *new = NULL;
+ struct acpi_table_desc *table;
+ acpi_status status;
+ int i;
+
+ /* This is early enough that we don't need the mutex yet */
+ for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
+ if (acpi_tb_is_table_loaded(i))
+ continue;
+
+ table = &acpi_gbl_root_table_list.tables[i];
+ if (!table->pointer)
+ status = acpi_tb_verify_table(table);
+
+ if (ACPI_FAILURE(status) || !table->pointer)
+ continue;
+
+ status = acpi_os_table_override(table->pointer, &new);
+ if (ACPI_SUCCESS(status) && new) {
+ acpi_replace_table(table, new);
+ acpi_tb_print_table_header(table->address, new);
+ }
+ }
+}
+
+acpi_status __init
+acpi_load_override_tables(void)
+{
+ struct acpi_override_table_entry *entry = acpi_override_table_entries;
+ while (entry && entry->name) {
+ acpi_load_one_override_table(entry);
+ entry++;
+ }
+
+ acpi_override_tables();
+ return AE_OK;
+}
+
+static struct acpi_table_header *
+acpi_get_override_table(const char *name)
+{
+ struct acpi_override_table_entry *entry = acpi_override_table_entries;
+
+ while (entry && entry->name) {
+ if (!memcmp(name, entry->name, ACPI_NAME_SIZE))
+ return entry->table;;
+ entry++;
+ }
+
+ return NULL;
+}
+#else
+acpi_status
+acpi_load_override_tables(void)
+{
+ return AE_OK;
+}
+#endif
+
acpi_status
acpi_os_table_override(struct acpi_table_header * existing_table,
struct acpi_table_header ** new_table)
@@ -363,6 +528,10 @@ acpi_os_table_override(struct acpi_table
if (strncmp(existing_table->signature, "DSDT", 4) == 0)
*new_table = (struct acpi_table_header *)AmlCode;
#endif
+#ifdef CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS
+ if (!acpi_no_initrd_override)
+ *new_table = acpi_get_override_table(existing_table->signature);
+#endif
if (*new_table != NULL) {
printk(KERN_WARNING PREFIX "Override [%4.4s-%8.8s], "
"this is unsafe: tainting kernel\n",
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -91,6 +91,13 @@ acpi_status
acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
acpi_string * new_val);
+#ifdef CONFIG_ACPI_CUSTOM_OVERRIDE_INITRAMFS
+acpi_status
+acpi_load_override_tables(void);
+#else
+static inline acpi_status acpi_load_override_tables(void) {}
+#endif
+
acpi_status
acpi_os_table_override(struct acpi_table_header *existing_table,
struct acpi_table_header **new_table);
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" 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 [flat|nested] 8+ messages in thread
* Re: [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-09 19:55 ` [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
@ 2009-10-09 20:19 ` Matthew Garrett
2009-10-10 14:08 ` Leo "costela" Antunes
2009-10-10 14:32 ` Jeff Mahoney
0 siblings, 2 replies; 8+ messages in thread
From: Matthew Garrett @ 2009-10-09 20:19 UTC (permalink / raw)
To: Jeff Mahoney
Cc: linux-acpi, Éric Piel, Jan Beulich, Thomas Renninger,
H. Peter Anvin, Len Brown
On Fri, Oct 09, 2009 at 03:55:10PM -0400, Jeff Mahoney wrote:
> This version provides the infrastructure to override any ACPI table, but
> only provides support for overriding DSDT. If other tables are desired,
> extending the support is trivial.
I'm really unenthusiastic about this. The majority of use cases appear
to be people working around Linux bugs and never reporting the bugs to
us, leaving everybody worse off.
--
Matthew Garrett | mjg59@srcf.ucam.org
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-09 20:19 ` Matthew Garrett
@ 2009-10-10 14:08 ` Leo "costela" Antunes
2009-10-10 14:32 ` Jeff Mahoney
1 sibling, 0 replies; 8+ messages in thread
From: Leo "costela" Antunes @ 2009-10-10 14:08 UTC (permalink / raw)
To: linux-acpi
Matthew Garrett wrote:
> I'm really unenthusiastic about this. The majority of use cases appear
> to be people working around Linux bugs and never reporting the bugs to
> us, leaving everybody worse off.
I can't judge the technical quality of the patch, but I don't think the
social side of it is a problem (assuming I correctly understood the
change in question).
Case in point: I reported a problem[0] with the thermal/fan subsystems
which was left unanswered and forced me to recompile kernels with
overridden DSDTs for every new release expecting a fix and eventually
replace the laptop in question. I'm obviously not demanding that my
problem be solved, but the point is that not all problems can be solved
in a timely fashion even when they are reported (for whatever reason:
lack of manpower, lack of test machines, etc), so avoiding this change
which could ease the testing of new DSDTs seems a bit sadistic. :)
Another point of view to the same argument is that the current situation
doesn't guarantee feedback either. The added hassle of needing a
recompile doesn't IMHO necessarily mean users report these sort of problems.
Just my technically inapt 0,2 €. :)
Cheers
[0] http://thread.gmane.org/gmane.linux.acpi.devel/37612
--
Leo "costela" Antunes
[insert a witty retort here]
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" 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 [flat|nested] 8+ messages in thread
* Re: [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-09 20:19 ` Matthew Garrett
2009-10-10 14:08 ` Leo "costela" Antunes
@ 2009-10-10 14:32 ` Jeff Mahoney
2009-10-10 14:43 ` Matthew Garrett
1 sibling, 1 reply; 8+ messages in thread
From: Jeff Mahoney @ 2009-10-10 14:32 UTC (permalink / raw)
To: Matthew Garrett
Cc: linux-acpi, Éric Piel, Jan Beulich, Thomas Renninger,
H. Peter Anvin, Len Brown
On 10/09/2009 04:19 PM, Matthew Garrett wrote:
> On Fri, Oct 09, 2009 at 03:55:10PM -0400, Jeff Mahoney wrote:
>
>> This version provides the infrastructure to override any ACPI table, but
>> only provides support for overriding DSDT. If other tables are desired,
>> extending the support is trivial.
>
> I'm really unenthusiastic about this. The majority of use cases appear
> to be people working around Linux bugs and never reporting the bugs to
> us, leaving everybody worse off.
I agree. In an ideal world this would be unnecessary. It's true that
ACPI bugs have become must less common than they used to be but I think
users would prefer their machines be usable while the ACPI developers
are diagnosing why they need a workaround in the first place.
In some cases it's just that the MS AML compiler is just so much more
lax than the Intel one. I had a notebook where I had to extract, fix,
and rebuild my DSDT and then it worked fine. Without the ability to
override it, I would've been stuck.
BTW, a similar version of this patch was committed to mainline in Feb
2008 though it was reverted shortly after that. Judging from the commit
message, it's because it reintroduced the early userspace bugs. I
believe this patch addresses that by not allowing the usermode helper to
run until rootfs_initcall has been completed.
-Jeff
--
Jeff Mahoney
SUSE Labs
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-10 14:32 ` Jeff Mahoney
@ 2009-10-10 14:43 ` Matthew Garrett
2009-10-10 15:37 ` Jeff Mahoney
0 siblings, 1 reply; 8+ messages in thread
From: Matthew Garrett @ 2009-10-10 14:43 UTC (permalink / raw)
To: Jeff Mahoney
Cc: linux-acpi, Éric Piel, Jan Beulich, Thomas Renninger,
H. Peter Anvin, Len Brown
On Sat, Oct 10, 2009 at 10:32:10AM -0400, Jeff Mahoney wrote:
> I agree. In an ideal world this would be unnecessary. It's true that
> ACPI bugs have become must less common than they used to be but I think
> users would prefer their machines be usable while the ACPI developers
> are diagnosing why they need a workaround in the first place.
If that were the tradeoff then I'd be happy, but what tends to happen is
that the section of users who are able to help us debug just work around
it instead and the ones who have no idea how to report a bug end up with
broken machines.
> In some cases it's just that the MS AML compiler is just so much more
> lax than the Intel one. I had a notebook where I had to extract, fix,
> and rebuild my DSDT and then it worked fine. Without the ability to
> override it, I would've been stuck.
For a user who can do these fixups themselves, it's easy enough to
rebuild a kernel with the DSDT override. However, pretty much every
recent ACPI bug I've seen has had nothing to do with the MS compiler's
less strict error checking - we run the in-kernel interpreter in a lax
mode that's intended to be bug for bug compatible with the Microsoft
one.
--
Matthew Garrett | mjg59@srcf.ucam.org
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3
2009-10-10 14:43 ` Matthew Garrett
@ 2009-10-10 15:37 ` Jeff Mahoney
0 siblings, 0 replies; 8+ messages in thread
From: Jeff Mahoney @ 2009-10-10 15:37 UTC (permalink / raw)
To: Matthew Garrett
Cc: linux-acpi, Éric Piel, Jan Beulich, Thomas Renninger,
H. Peter Anvin, Len Brown
On 10/10/2009 10:43 AM, Matthew Garrett wrote:
> On Sat, Oct 10, 2009 at 10:32:10AM -0400, Jeff Mahoney wrote:
>
>> I agree. In an ideal world this would be unnecessary. It's true that
>> ACPI bugs have become must less common than they used to be but I think
>> users would prefer their machines be usable while the ACPI developers
>> are diagnosing why they need a workaround in the first place.
>
> If that were the tradeoff then I'd be happy, but what tends to happen is
> that the section of users who are able to help us debug just work around
> it instead and the ones who have no idea how to report a bug end up with
> broken machines.
Well then maybe the answer is to make it complain loudly that it's a bug
that is being worked around. More than just the taint message. Perhaps
even an autogenerated report on the DSDT if it's overridden to be sent
at the user's discretion. There has to be a middle ground here. Most
distros don't backport minor ACPI fixes for their maintenance kernels.
So it's great that it would get fixed in the next release, but it still
leaves the user out in the cold in the meantime. Sometimes it's the
temperature or battery usage getting misreported. Other times it means
the user can't suspend or a docking station won't work.
>> In some cases it's just that the MS AML compiler is just so much more
>> lax than the Intel one. I had a notebook where I had to extract, fix,
>> and rebuild my DSDT and then it worked fine. Without the ability to
>> override it, I would've been stuck.
>
> For a user who can do these fixups themselves, it's easy enough to
> rebuild a kernel with the DSDT override. However, pretty much every
> recent ACPI bug I've seen has had nothing to do with the MS compiler's
> less strict error checking - we run the in-kernel interpreter in a lax
> mode that's intended to be bug for bug compatible with the Microsoft
> one.
Sure, it was a few years ago and things have changed. It was just an
example of how it fixed my system. I've seen several openSUSE bug
reports that get fixed by replacing the DSDT. And yes, I do assign those
bugs to our ACPI developers for actual fixing.
The thing is that there are sites out there that provide fixed DSDTs so
users don't actually have to go through the effort of extracting,
fixing, and rebuilding themselves. Even if they did have to do that,
building your own kernel to fix your DSDT kicks you right out of the
maintenance stream of your distro. So then they're stuck between
rebuilding the kernel at every update or losing security fixes. Neither
sound particularly fun.
-Jeff
--
Jeff Mahoney
SUSE Labs
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-10-10 15:38 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-09 19:55 [patch 0/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
2009-10-09 19:55 ` [patch 1/2] init: move populate_rootfs back to start_kernel Jeff Mahoney
2009-10-09 19:55 ` [patch 2/2] [PATCH 2/2] ACPI: generic initramfs table override support #3 Jeff Mahoney
2009-10-09 20:19 ` Matthew Garrett
2009-10-10 14:08 ` Leo "costela" Antunes
2009-10-10 14:32 ` Jeff Mahoney
2009-10-10 14:43 ` Matthew Garrett
2009-10-10 15:37 ` Jeff Mahoney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).