]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
more .24 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Thu, 7 Feb 2008 06:01:19 +0000 (22:01 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 7 Feb 2008 06:01:19 +0000 (22:01 -0800)
queue-2.6.24/acpi-update-acpi-blacklist.patch [new file with mode: 0644]
queue-2.6.24/lockdep-annotate-epoll.patch [new file with mode: 0644]
queue-2.6.24/pci-fix-fakephp-deadlock.patch [new file with mode: 0644]
queue-2.6.24/series
queue-2.6.24/sys_remap_file_pages-fix-vm_file-accounting.patch [new file with mode: 0644]

diff --git a/queue-2.6.24/acpi-update-acpi-blacklist.patch b/queue-2.6.24/acpi-update-acpi-blacklist.patch
new file mode 100644 (file)
index 0000000..7652c1b
--- /dev/null
@@ -0,0 +1,158 @@
+From stable-bounces@linux.kernel.org Sun Feb  3 14:44:14 2008
+From: Len Brown <lenb@kernel.org>
+Date: Sun, 3 Feb 2008 17:43:57 -0500
+Subject: ACPI: update ACPI blacklist
+To: stable@kernel.org
+Message-ID: <200802031743.57309.lenb@kernel.org>
+Content-Disposition: inline
+
+
+From: Len Brown <len.brown@intel.com>
+
+These minor changes sync the latest ACPI blacklist into 2.6.24.
+The main benefit of this patch is to make any future
+changes easier to apply.  The immediate benefit is one less
+dmesg line on Acer systems.
+
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/blacklist.c    |   23 ++++++++++++++---------
+ drivers/acpi/osl.c          |   16 ++++++++--------
+ drivers/firmware/dmi_scan.c |    9 ---------
+ include/linux/dmi.h         |    2 --
+ 4 files changed, 22 insertions(+), 28 deletions(-)
+
+--- a/drivers/acpi/blacklist.c
++++ b/drivers/acpi/blacklist.c
+@@ -208,24 +208,24 @@ static struct dmi_system_id acpi_osi_dmi
+        * Disable OSI(Linux) warnings on all "Acer, inc."
+        *
+        * _OSI(Linux) disables the latest Windows BIOS code:
++       * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
++       * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
+        * _OSI(Linux) effect unknown:
+        * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
+        */
+-      {
+-      .callback = dmi_disable_osi_linux,
+-      .ident = "Acer, inc.",
+-      .matches = {
+-                   DMI_MATCH(DMI_SYS_VENDOR, "Acer, inc."),
+-              },
+-      },
++      /*
++       * note that dmi_check_system() uses strstr()
++       * to match sub-strings rather than !strcmp(),
++       * so "Acer" below matches "Acer, inc." above.
++       */
+       /*
+        * Disable OSI(Linux) warnings on all "Acer"
+        *
+        * _OSI(Linux) effect unknown:
+-       * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
++       * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
+        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
+@@ -300,7 +300,7 @@ static struct dmi_system_id acpi_osi_dmi
+                    DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
+               },
+       },
+-      { /* OSI(Linux) touches USB, breaks suspend to disk */
++      { /* OSI(Linux) touches USB, unknown side-effect */
+       .callback = dmi_disable_osi_linux,
+       .ident = "Dell Dimension 5150",
+       .matches = {
+@@ -474,6 +474,11 @@ static struct dmi_system_id acpi_osi_dmi
+        *
+        * _OSI(Linux) confirmed to be a NOP:
+        * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
++       * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
++       *
++       * unknown:
++       * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
++       * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
+        */
+       {
+       .callback = dmi_disable_osi_linux,
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -120,7 +120,7 @@ static char osi_additional_string[OSI_ST
+  */
+ #define OSI_LINUX_ENABLE 0
+-struct osi_linux {
++static struct osi_linux {
+       unsigned int    enable:1;
+       unsigned int    dmi:1;
+       unsigned int    cmdline:1;
+@@ -1213,24 +1213,24 @@ acpi_status acpi_os_release_object(acpi_
+  *
+  *    Returns 0 on success
+  */
+-int acpi_dmi_dump(void)
++static int acpi_dmi_dump(void)
+ {
+       if (!dmi_available)
+               return -1;
+       printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
+-              dmi_get_slot(DMI_SYS_VENDOR));
++              dmi_get_system_info(DMI_SYS_VENDOR));
+       printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
+-              dmi_get_slot(DMI_PRODUCT_NAME));
++              dmi_get_system_info(DMI_PRODUCT_NAME));
+       printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
+-              dmi_get_slot(DMI_PRODUCT_VERSION));
++              dmi_get_system_info(DMI_PRODUCT_VERSION));
+       printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
+-              dmi_get_slot(DMI_BOARD_NAME));
++              dmi_get_system_info(DMI_BOARD_NAME));
+       printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
+-              dmi_get_slot(DMI_BIOS_VENDOR));
++              dmi_get_system_info(DMI_BIOS_VENDOR));
+       printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
+-              dmi_get_slot(DMI_BIOS_DATE));
++              dmi_get_system_info(DMI_BIOS_DATE));
+       return 0;
+ }
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -469,12 +469,3 @@ int dmi_get_year(int field)
+       return year;
+ }
+-
+-/**
+- *    dmi_get_slot - return dmi_ident[slot]
+- *    @slot:  index into dmi_ident[]
+- */
+-char *dmi_get_slot(int slot)
+-{
+-      return(dmi_ident[slot]);
+-}
+--- a/include/linux/dmi.h
++++ b/include/linux/dmi.h
+@@ -79,7 +79,6 @@ extern void dmi_scan_machine(void);
+ extern int dmi_get_year(int field);
+ extern int dmi_name_in_vendors(const char *str);
+ extern int dmi_available;
+-extern char *dmi_get_slot(int slot);
+ #else
+@@ -90,7 +89,6 @@ static inline const struct dmi_device * 
+ static inline int dmi_get_year(int year) { return 0; }
+ static inline int dmi_name_in_vendors(const char *s) { return 0; }
+ #define dmi_available 0
+-static inline char *dmi_get_slot(int slot) { return NULL; }
+ #endif
diff --git a/queue-2.6.24/lockdep-annotate-epoll.patch b/queue-2.6.24/lockdep-annotate-epoll.patch
new file mode 100644 (file)
index 0000000..6be6f54
--- /dev/null
@@ -0,0 +1,95 @@
+From stable-bounces@linux.kernel.org Mon Feb  4 22:27:35 2008
+From: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Date: Mon, 04 Feb 2008 22:27:20 -0800
+Subject: lockdep: annotate epoll
+To: torvalds@linux-foundation.org
+Cc: akpm@linux-foundation.org, stefanr@s5r6.in-berlin.de, a.p.zijlstra@chello.nl, davidel@xmailserver.org, stable@kernel.org
+Message-ID: <200802050627.m156R10c006376@imap1.linux-foundation.org>
+
+
+From: Peter Zijlstra <a.p.zijlstra@chello.nl>
+
+patch 0ccf831cbee94df9c5006dd46248c0f07847dd7c in mainline.
+
+On Sat, 2008-01-05 at 13:35 -0800, Davide Libenzi wrote:
+
+> I remember I talked with Arjan about this time ago. Basically, since 1)
+> you can drop an epoll fd inside another epoll fd 2) callback-based wakeups
+> are used, you can see a wake_up() from inside another wake_up(), but they
+> will never refer to the same lock instance.
+> Think about:
+>
+>      dfd = socket(...);
+>      efd1 = epoll_create();
+>      efd2 = epoll_create();
+>      epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
+>      epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
+>
+> When a packet arrives to the device underneath "dfd", the net code will
+> issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
+> callback wakeup entry on that queue, and the wake_up() performed by the
+> "dfd" net code will end up in ep_poll_callback(). At this point epoll
+> (efd1) notices that it may have some event ready, so it needs to wake up
+> the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
+> that ends up in another wake_up(), after having checked about the
+> recursion constraints. That are, no more than EP_MAX_POLLWAKE_NESTS, to
+> avoid stack blasting. Never hit the same queue, to avoid loops like:
+>
+>      epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
+>      epoll_ctl(efd3, EPOLL_CTL_ADD, efd2, ...);
+>      epoll_ctl(efd4, EPOLL_CTL_ADD, efd3, ...);
+>      epoll_ctl(efd1, EPOLL_CTL_ADD, efd4, ...);
+>
+> The code "if (tncur->wq == wq || ..." prevents re-entering the same
+> queue/lock.
+
+Since the epoll code is very careful to not nest same instance locks
+allow the recursion.
+
+Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Tested-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
+Acked-by: Davide Libenzi <davidel@xmailserver.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/eventpoll.c       |    2 +-
+ include/linux/wait.h |   16 ++++++++++++++++
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -353,7 +353,7 @@ static void ep_poll_safewake(struct poll
+       spin_unlock_irqrestore(&psw->lock, flags);
+       /* Do really wake up now */
+-      wake_up(wq);
++      wake_up_nested(wq, 1 + wake_nests);
+       /* Remove the current task from the list */
+       spin_lock_irqsave(&psw->lock, flags);
+--- a/include/linux/wait.h
++++ b/include/linux/wait.h
+@@ -161,6 +161,22 @@ wait_queue_head_t *FASTCALL(bit_waitqueu
+ #define       wake_up_locked(x)               __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
+ #define wake_up_interruptible_sync(x)   __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
++#ifdef CONFIG_DEBUG_LOCK_ALLOC
++/*
++ * macro to avoid include hell
++ */
++#define wake_up_nested(x, s)                                          \
++do {                                                                  \
++      unsigned long flags;                                            \
++                                                                      \
++      spin_lock_irqsave_nested(&(x)->lock, flags, (s));               \
++      wake_up_locked(x);                                              \
++      spin_unlock_irqrestore(&(x)->lock, flags);                      \
++} while (0)
++#else
++#define wake_up_nested(x, s)          wake_up(x)
++#endif
++
+ #define __wait_event(wq, condition)                                   \
+ do {                                                                  \
+       DEFINE_WAIT(__wait);                                            \
diff --git a/queue-2.6.24/pci-fix-fakephp-deadlock.patch b/queue-2.6.24/pci-fix-fakephp-deadlock.patch
new file mode 100644 (file)
index 0000000..9098bf3
--- /dev/null
@@ -0,0 +1,137 @@
+From stable-bounces@linux.kernel.org Mon Feb  4 06:11:08 2008
+From: Ian Abbott <abbotti@mev.co.uk>
+Date: Mon, 04 Feb 2008 13:43:13 +0000
+Subject: PCI: Fix fakephp deadlock
+To: stable@kernel.org
+Cc: linux-pci@atrey.karlin.mff.cuni.cz, linux-kernel@vger.kernel.org
+Message-ID: <47A71671.7080306@mev.co.uk>
+
+
+From: Ian Abbott <abbotti@mev.co.uk>
+
+This patch works around a problem in the fakephp driver when a process
+writing "0" to a "power" sysfs file to fake removal of a PCI device ends
+up deadlocking itself in the sysfs code.
+
+The patch was recently accepted into Linus' tree after the 2.6.24 release:
+http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=5c796ae7a7ebe56967ed9b9963d7c16d733635ff
+
+Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/hotplug/fakephp.c |   39 +++++++++++++++++++++++++++++++++++----
+ 1 file changed, 35 insertions(+), 4 deletions(-)
+
+--- a/drivers/pci/hotplug/fakephp.c
++++ b/drivers/pci/hotplug/fakephp.c
+@@ -39,6 +39,7 @@
+ #include <linux/init.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
++#include <linux/workqueue.h>
+ #include "../pci.h"
+ #if !defined(MODULE)
+@@ -63,10 +64,16 @@ struct dummy_slot {
+       struct list_head node;
+       struct hotplug_slot *slot;
+       struct pci_dev *dev;
++      struct work_struct remove_work;
++      unsigned long removed;
+ };
+ static int debug;
+ static LIST_HEAD(slot_list);
++static struct workqueue_struct *dummyphp_wq;
++
++static void pci_rescan_worker(struct work_struct *work);
++static DECLARE_WORK(pci_rescan_work, pci_rescan_worker);
+ static int enable_slot (struct hotplug_slot *slot);
+ static int disable_slot (struct hotplug_slot *slot);
+@@ -109,7 +116,7 @@ static int add_slot(struct pci_dev *dev)
+       slot->name = &dev->dev.bus_id[0];
+       dbg("slot->name = %s\n", slot->name);
+-      dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
++      dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
+       if (!dslot)
+               goto error_info;
+@@ -164,6 +171,14 @@ static void remove_slot(struct dummy_slo
+               err("Problem unregistering a slot %s\n", dslot->slot->name);
+ }
++/* called from the single-threaded workqueue handler to remove a slot */
++static void remove_slot_worker(struct work_struct *work)
++{
++      struct dummy_slot *dslot =
++              container_of(work, struct dummy_slot, remove_work);
++      remove_slot(dslot);
++}
++
+ /**
+  * pci_rescan_slot - Rescan slot
+  * @temp: Device template. Should be set: bus and devfn.
+@@ -267,11 +282,17 @@ static inline void pci_rescan(void) {
+       pci_rescan_buses(&pci_root_buses);
+ }
++/* called from the single-threaded workqueue handler to rescan all pci buses */
++static void pci_rescan_worker(struct work_struct *work)
++{
++      pci_rescan();
++}
+ static int enable_slot(struct hotplug_slot *hotplug_slot)
+ {
+       /* mis-use enable_slot for rescanning of the pci bus */
+-      pci_rescan();
++      cancel_work_sync(&pci_rescan_work);
++      queue_work(dummyphp_wq, &pci_rescan_work);
+       return -ENODEV;
+ }
+@@ -306,6 +327,10 @@ static int disable_slot(struct hotplug_s
+               err("Can't remove PCI devices with other PCI devices behind it yet.\n");
+               return -ENODEV;
+       }
++      if (test_and_set_bit(0, &dslot->removed)) {
++              dbg("Slot already scheduled for removal\n");
++              return -ENODEV;
++      }
+       /* search for subfunctions and disable them first */
+       if (!(dslot->dev->devfn & 7)) {
+               for (func = 1; func < 8; func++) {
+@@ -328,8 +353,9 @@ static int disable_slot(struct hotplug_s
+       /* remove the device from the pci core */
+       pci_remove_bus_device(dslot->dev);
+-      /* blow away this sysfs entry and other parts. */
+-      remove_slot(dslot);
++      /* queue work item to blow away this sysfs entry and other parts. */
++      INIT_WORK(&dslot->remove_work, remove_slot_worker);
++      queue_work(dummyphp_wq, &dslot->remove_work);
+       return 0;
+ }
+@@ -340,6 +366,7 @@ static void cleanup_slots (void)
+       struct list_head *next;
+       struct dummy_slot *dslot;
++      destroy_workqueue(dummyphp_wq);
+       list_for_each_safe (tmp, next, &slot_list) {
+               dslot = list_entry (tmp, struct dummy_slot, node);
+               remove_slot(dslot);
+@@ -351,6 +378,10 @@ static int __init dummyphp_init(void)
+ {
+       info(DRIVER_DESC "\n");
++      dummyphp_wq = create_singlethread_workqueue(MY_NAME);
++      if (!dummyphp_wq)
++              return -ENOMEM;
++
+       return pci_scan_buses();
+ }
index b80f84b9f89b3cf40194897a9350c4d32b3d9451..634d4e1cb3b41df9d87b6b7de474cd3fc534822f 100644 (file)
@@ -21,3 +21,7 @@ usb-fix-usbtest-halt-check-on-big-endian-systems.patch
 usb-handle-idvendor-of-0x0000.patch
 usb-fix-usb_serial_driver-structure-for-kobil-cardreader-driver.patch
 forcedeth-mac-address-mcp77-79.patch
+lockdep-annotate-epoll.patch
+sys_remap_file_pages-fix-vm_file-accounting.patch
+pci-fix-fakephp-deadlock.patch
+acpi-update-acpi-blacklist.patch
diff --git a/queue-2.6.24/sys_remap_file_pages-fix-vm_file-accounting.patch b/queue-2.6.24/sys_remap_file_pages-fix-vm_file-accounting.patch
new file mode 100644 (file)
index 0000000..95c8259
--- /dev/null
@@ -0,0 +1,42 @@
+From stable-bounces@linux.kernel.org Mon Feb  4 22:27:28 2008
+From: Oleg Nesterov <oleg@tv-sign.ru>
+Date: Mon, 04 Feb 2008 22:27:18 -0800
+Subject: sys_remap_file_pages: fix ->vm_file accounting
+To: torvalds@linux-foundation.org
+Cc: akpm@linux-foundation.org, mszeredi@suse.cz, oleg@tv-sign.ru, stable@kernel.org
+Message-ID: <200802050627.m156R0c2006368@imap1.linux-foundation.org>
+
+
+From: Oleg Nesterov <oleg@tv-sign.ru>
+
+patch 8a459e44ad837018ea5c34a9efe8eb4ad27ded26 in mainline.
+
+Fix ->vm_file accounting, mmap_region() may do do_munmap().
+
+Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
+Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+
+ mm/fremap.c |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/mm/fremap.c
++++ b/mm/fremap.c
+@@ -190,10 +190,13 @@ asmlinkage long sys_remap_file_pages(uns
+                */
+               if (mapping_cap_account_dirty(mapping)) {
+                       unsigned long addr;
++                      struct file *file = vma->vm_file;
+                       flags &= MAP_NONBLOCK;
+-                      addr = mmap_region(vma->vm_file, start, size,
++                      get_file(file);
++                      addr = mmap_region(file, start, size,
+                                       flags, vma->vm_flags, pgoff, 1);
++                      fput(file);
+                       if (IS_ERR_VALUE(addr)) {
+                               err = addr;
+                       } else {