From: Greg Kroah-Hartman Date: Wed, 11 Aug 2010 00:31:24 +0000 (-0700) Subject: .35 patches X-Git-Tag: v2.6.32.19~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=174ac92be631fab0364610f614993a4a11da1c7c;p=thirdparty%2Fkernel%2Fstable-queue.git .35 patches --- diff --git a/queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch b/queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch new file mode 100644 index 00000000000..1b43811ab0a --- /dev/null +++ b/queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch @@ -0,0 +1,31 @@ +From e096c8e6d5ed965f346d94befbbec2275dde3621 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Tue, 3 Aug 2010 17:20:35 +0200 +Subject: ALSA: hda - Add PC-beep whitelist for an Intel board + +From: Takashi Iwai + +commit e096c8e6d5ed965f346d94befbbec2275dde3621 upstream. + +An Intel board needs a white-list entry to enable PC-beep. +Otherwise the driver misdetects (due to bogus BIOS info) and ignores +the PC-beep on 2.6.35. + +Reported-and-tested-by: Leandro Lucarella +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -5183,6 +5183,7 @@ static void fillup_priv_adc_nids(struct + + static struct snd_pci_quirk beep_white_list[] = { + SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), ++ SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), + {} + }; + diff --git a/queue-2.6.35/char-nozomi-fix-tty-count-counting.patch b/queue-2.6.35/char-nozomi-fix-tty-count-counting.patch new file mode 100644 index 00000000000..02ba4e1280a --- /dev/null +++ b/queue-2.6.35/char-nozomi-fix-tty-count-counting.patch @@ -0,0 +1,33 @@ +From ee78bb95b7bea08b7774a02073ea2bb45611a9e1 Mon Sep 17 00:00:00 2001 +From: Jiri Slaby +Date: Thu, 29 Jul 2010 11:09:47 +0200 +Subject: Char: nozomi, fix tty->count counting + +From: Jiri Slaby + +commit ee78bb95b7bea08b7774a02073ea2bb45611a9e1 upstream. + +Currently ntty_install omits to increment tty count and we get the +following warnings: +Warning: dev (noz2) tty->count(0) != #fd's(1) in tty_open + +So to fix that, add one tty->count++ there. + +Signed-off-by: Jiri Slaby +Cc: Alan Cox +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/nozomi.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/char/nozomi.c ++++ b/drivers/char/nozomi.c +@@ -1611,6 +1611,7 @@ static int ntty_install(struct tty_drive + ret = tty_init_termios(tty); + if (ret == 0) { + tty_driver_kref_get(driver); ++ tty->count++; + driver->ttys[tty->index] = tty; + } + return ret; diff --git a/queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch b/queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch new file mode 100644 index 00000000000..8af5440f2ab --- /dev/null +++ b/queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch @@ -0,0 +1,60 @@ +From bf9c1fca9ae9a79ed209e7ab2c10b3862f3f6f72 Mon Sep 17 00:00:00 2001 +From: Jiri Slaby +Date: Thu, 29 Jul 2010 11:46:32 +0200 +Subject: Char: nozomi, set tty->driver_data appropriately + +From: Jiri Slaby + +commit bf9c1fca9ae9a79ed209e7ab2c10b3862f3f6f72 upstream. + +Sorry, one more fix, this one depends on the other, so this is rather 2/2. +-- + +tty->driver_data is used all over the code, but never set. This +results in oopses like: +BUG: unable to handle kernel NULL pointer dereference at 0000000000000130 +IP: [] mutex_lock+0x10/0x40 +... +Pid: 2157, comm: modem-manager Not tainted 2.6.34.1-0.1-desktop #1 2768DR7/2768DR7 +RIP: 0010:[] [] mutex_lock+0x10/0x40 +RSP: 0018:ffff88007b16fa50 EFLAGS: 00010286 +RAX: 0000000000000000 RBX: 0000000000000130 RCX: 0000000000000003 +RDX: 0000000000000003 RSI: 0000000000000286 RDI: 0000000000000130 +RBP: 0000000000001000 R08: 0000000000000000 R09: 0000000000000000 +R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000000130 +R13: 0000000000000001 R14: 0000000000000000 R15: ffff88007b16feb4 +... +Call Trace: + [] ntty_write_room+0x4d/0x90 [nozomi] +... + +Set tty->driver_data to the computed port in .install to not recompute it in +every place where needed. Switch .open to use driver_data too. + +Signed-off-by: Jiri Slaby +Cc: Alan Cox +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/nozomi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/char/nozomi.c ++++ b/drivers/char/nozomi.c +@@ -1612,6 +1612,7 @@ static int ntty_install(struct tty_drive + if (ret == 0) { + tty_driver_kref_get(driver); + tty->count++; ++ tty->driver_data = port; + driver->ttys[tty->index] = tty; + } + return ret; +@@ -1640,7 +1641,7 @@ static int ntty_activate(struct tty_port + + static int ntty_open(struct tty_struct *tty, struct file *filp) + { +- struct port *port = get_port_by_tty(tty); ++ struct port *port = tty->driver_data; + return tty_port_open(&port->port, tty, filp); + } + diff --git a/queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch b/queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch new file mode 100644 index 00000000000..1814278ff7e --- /dev/null +++ b/queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch @@ -0,0 +1,37 @@ +From fa260c00c1aa5c657793a7221e40d2400df5afd8 Mon Sep 17 00:00:00 2001 +From: Peter Huewe +Date: Mon, 9 Aug 2010 17:18:23 -0700 +Subject: drivers/video/w100fb.c: ignore void return value / fix build failure + +From: Peter Huewe + +commit fa260c00c1aa5c657793a7221e40d2400df5afd8 upstream. + +Fix a build failure "error: void value not ignored as it ought to be" +by removing an assignment of a void return value. The functionality of +the code is not changed. + +Signed-off-by: Peter Huewe +Acked-by: Henrik Kretzschmar +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/video/w100fb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/video/w100fb.c ++++ b/drivers/video/w100fb.c +@@ -858,9 +858,9 @@ unsigned long w100fb_gpio_read(int port) + void w100fb_gpio_write(int port, unsigned long value) + { + if (port==W100_GPIO_PORT_A) +- value = writel(value, remapped_regs + mmGPIO_DATA); ++ writel(value, remapped_regs + mmGPIO_DATA); + else +- value = writel(value, remapped_regs + mmGPIO_DATA2); ++ writel(value, remapped_regs + mmGPIO_DATA2); + } + EXPORT_SYMBOL(w100fb_gpio_read); + EXPORT_SYMBOL(w100fb_gpio_write); diff --git a/queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch b/queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch new file mode 100644 index 00000000000..c951ef7671d --- /dev/null +++ b/queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch @@ -0,0 +1,58 @@ +From 110712828365ccafcc61a7f4db44c31ed4cf8793 Mon Sep 17 00:00:00 2001 +From: Borislav Petkov +Date: Mon, 5 Jul 2010 21:23:52 -0700 +Subject: ide-cd: Do not access completed requests in the irq handler + +From: Borislav Petkov + +commit 110712828365ccafcc61a7f4db44c31ed4cf8793 upstream. + +ide_cd_error_cmd() can complete an erroneous request with leftover +buffers. Signal this with its return value so that the request is not +accessed after its completion in the irq handler and we oops. + +Signed-off-by: Borislav Petkov +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ide/ide-cd.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +--- a/drivers/ide/ide-cd.c ++++ b/drivers/ide/ide-cd.c +@@ -506,15 +506,22 @@ int ide_cd_queue_pc(ide_drive_t *drive, + return (flags & REQ_FAILED) ? -EIO : 0; + } + +-static void ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd) ++/* ++ * returns true if rq has been completed ++ */ ++static bool ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd) + { + unsigned int nr_bytes = cmd->nbytes - cmd->nleft; + + if (cmd->tf_flags & IDE_TFLAG_WRITE) + nr_bytes -= cmd->last_xfer_len; + +- if (nr_bytes > 0) ++ if (nr_bytes > 0) { + ide_complete_rq(drive, 0, nr_bytes); ++ return true; ++ } ++ ++ return false; + } + + static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) +@@ -679,7 +686,8 @@ out_end: + } + + if (uptodate == 0 && rq->bio) +- ide_cd_error_cmd(drive, cmd); ++ if (ide_cd_error_cmd(drive, cmd)) ++ return ide_stopped; + + /* make sure it's fully ended */ + if (blk_fs_request(rq) == 0) { diff --git a/queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch b/queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch new file mode 100644 index 00000000000..ff4d9472765 --- /dev/null +++ b/queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch @@ -0,0 +1,130 @@ +From d9e1b6c45059ccfff647a120769ae86da78dfdc4 Mon Sep 17 00:00:00 2001 +From: Yinghai Lu +Date: Mon, 9 Aug 2010 17:18:22 -0700 +Subject: ipmi: fix ACPI detection with regspacing + +From: Yinghai Lu + +commit d9e1b6c45059ccfff647a120769ae86da78dfdc4 upstream. + +After the commit that changed ipmi_si detecting sequence from SMBIOS/ACPI +to ACPI/SMBIOS, + +| commit 754d453185275951d39792865927ec494fa1ebd8 +| Author: Matthew Garrett +| Date: Wed May 26 14:43:47 2010 -0700 +| +| ipmi: change device discovery order +| +| The ipmi spec provides an ordering for si discovery. Change the driver to +| match, with the exception of preferring smbios to SPMI as HPs (at least) +| contain accurate information in the former but not the latter. + +ipmi_si can not be initialized. + +[ 138.799739] calling init_ipmi_devintf+0x0/0x109 @ 1 +[ 138.805050] ipmi device interface +[ 138.818131] initcall init_ipmi_devintf+0x0/0x109 returned 0 after 12797 usecs +[ 138.822998] calling init_ipmi_si+0x0/0xa90 @ 1 +[ 138.840276] IPMI System Interface driver. +[ 138.846137] ipmi_si: probing via ACPI +[ 138.849225] ipmi_si 00:09: [io 0x0ca2] regsize 1 spacing 1 irq 0 +[ 138.864438] ipmi_si: Adding ACPI-specified kcs state machine +[ 138.870893] ipmi_si: probing via SMBIOS +[ 138.880945] ipmi_si: Adding SMBIOS-specified kcs state machineipmi_si: duplicate interface +[ 138.896511] ipmi_si: probing via SPMI +[ 138.899861] ipmi_si: Adding SPMI-specified kcs state machineipmi_si: duplicate interface +[ 138.917095] ipmi_si: Trying ACPI-specified kcs state machine at i/o address 0xca2, slave address 0x0, irq 0 +[ 138.928658] ipmi_si: Interface detection failed +[ 138.953411] initcall init_ipmi_si+0x0/0xa90 returned 0 after 110847 usecs + +in smbios has +DMI/SMBIOS +Handle 0x00C5, DMI type 38, 18 bytes +IPMI Device Information + Interface Type: KCS (Keyboard Control Style) + Specification Version: 2.0 + I2C Slave Address: 0x00 + NV Storage Device: Not Present + Base Address: 0x0000000000000CA2 (I/O) + Register Spacing: 32-bit Boundaries +in DSDT has + Device (BMC) + { + + Name (_HID, EisaId ("IPI0001")) + Method (_STA, 0, NotSerialized) + { + If (LEqual (OSN, Zero)) + { + Return (Zero) + } + + Return (0x0F) + } + + Name (_STR, Unicode ("IPMI_KCS")) + Name (_UID, Zero) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x0CA2, // Range Minimum + 0x0CA2, // Range Maximum + 0x00, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0CA6, // Range Minimum + 0x0CA6, // Range Maximum + 0x00, // Alignment + 0x01, // Length + ) + }) + Method (_IFT, 0, NotSerialized) + { + Return (One) + } + + Method (_SRV, 0, NotSerialized) + { + Return (0x0200) + } + } + +so the reg spacing should be 4 instead of 1. + +Try to calculate regspacing for this kind of system. + +Observed on a Sun Fire X4800. Other OSes work and pass certification. + +Signed-off-by: Yinghai Lu +Cc: Bjorn Helgaas +Acked-by: Matthew Garrett +Cc: Len Brown +Cc: Myron Stowe +Cc: Corey Minyard +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/ipmi/ipmi_si_intf.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/char/ipmi/ipmi_si_intf.c ++++ b/drivers/char/ipmi/ipmi_si_intf.c +@@ -2176,6 +2176,14 @@ static int __devinit ipmi_pnp_probe(stru + info->io.addr_data = res->start; + + info->io.regspacing = DEFAULT_REGSPACING; ++ res = pnp_get_resource(dev, ++ (info->io.addr_type == IPMI_IO_ADDR_SPACE) ? ++ IORESOURCE_IO : IORESOURCE_MEM, ++ 1); ++ if (res) { ++ if (res->start > info->io.addr_data) ++ info->io.regspacing = res->start - info->io.addr_data; ++ } + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = 0; + diff --git a/queue-2.6.35/iwlwifi-fix-tx-tracer.patch b/queue-2.6.35/iwlwifi-fix-tx-tracer.patch new file mode 100644 index 00000000000..04a3ef58551 --- /dev/null +++ b/queue-2.6.35/iwlwifi-fix-tx-tracer.patch @@ -0,0 +1,32 @@ +From e95b743536937a72e1560c85696b425c5d1a1c18 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Fri, 6 Aug 2010 16:00:48 +0200 +Subject: iwlwifi: fix TX tracer + +From: Johannes Berg + +commit e95b743536937a72e1560c85696b425c5d1a1c18 upstream. + +The TX tracing code copies with the wrong length, +which will typically copy too little data. Fix +this by using the correct length variable. + +Signed-off-by: Johannes Berg +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/iwl-devtrace.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/iwlwifi/iwl-devtrace.h ++++ b/drivers/net/wireless/iwlwifi/iwl-devtrace.h +@@ -193,7 +193,7 @@ TRACE_EVENT(iwlwifi_dev_tx, + __entry->framelen = buf0_len + buf1_len; + memcpy(__get_dynamic_array(tfd), tfd, tfdlen); + memcpy(__get_dynamic_array(buf0), buf0, buf0_len); +- memcpy(__get_dynamic_array(buf1), buf1, buf0_len); ++ memcpy(__get_dynamic_array(buf1), buf1, buf1_len); + ), + TP_printk("[%p] TX %.2x (%zu bytes)", + __entry->priv, diff --git a/queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch b/queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch new file mode 100644 index 00000000000..2767040ff19 --- /dev/null +++ b/queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch @@ -0,0 +1,117 @@ +From bb4f1e9d0e2ef93de8e36ca0f5f26625fcd70b7d Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Sun, 8 Aug 2010 21:18:03 +1000 +Subject: md: fix another deadlock with removing sysfs attributes. + +From: NeilBrown + +commit bb4f1e9d0e2ef93de8e36ca0f5f26625fcd70b7d upstream. + +Move the deletion of sysfs attributes from reconfig_mutex to +open_mutex didn't really help as a process can try to take +open_mutex while holding reconfig_mutex, so the same deadlock can +happen, just requiring one more process to be involved in the chain. + +I looks like I cannot easily use locking to wait for the sysfs +deletion to complete, so don't. + +The only things that we cannot do while the deletions are still +pending is other things which can change the sysfs namespace: run, +takeover, stop. Each of these can fail with -EBUSY. +So set a flag while doing a sysfs deletion, and fail run, takeover, +stop if that flag is set. + +This is suitable for 2.6.35.x + +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/md.c | 31 +++++++++++++++++-------------- + drivers/md/md.h | 4 ++++ + 2 files changed, 21 insertions(+), 14 deletions(-) + +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -532,13 +532,17 @@ static void mddev_unlock(mddev_t * mddev + * an access to the files will try to take reconfig_mutex + * while holding the file unremovable, which leads to + * a deadlock. +- * So hold open_mutex instead - we are allowed to take +- * it while holding reconfig_mutex, and md_run can +- * use it to wait for the remove to complete. ++ * So hold set sysfs_active while the remove in happeing, ++ * and anything else which might set ->to_remove or my ++ * otherwise change the sysfs namespace will fail with ++ * -EBUSY if sysfs_active is still set. ++ * We set sysfs_active under reconfig_mutex and elsewhere ++ * test it under the same mutex to ensure its correct value ++ * is seen. + */ + struct attribute_group *to_remove = mddev->to_remove; + mddev->to_remove = NULL; +- mutex_lock(&mddev->open_mutex); ++ mddev->sysfs_active = 1; + mutex_unlock(&mddev->reconfig_mutex); + + if (to_remove != &md_redundancy_group) +@@ -550,7 +554,7 @@ static void mddev_unlock(mddev_t * mddev + sysfs_put(mddev->sysfs_action); + mddev->sysfs_action = NULL; + } +- mutex_unlock(&mddev->open_mutex); ++ mddev->sysfs_active = 0; + } else + mutex_unlock(&mddev->reconfig_mutex); + +@@ -2960,7 +2964,9 @@ level_store(mddev_t *mddev, const char * + * - new personality will access other array. + */ + +- if (mddev->sync_thread || mddev->reshape_position != MaxSector) ++ if (mddev->sync_thread || ++ mddev->reshape_position != MaxSector || ++ mddev->sysfs_active) + return -EBUSY; + + if (!mddev->pers->quiesce) { +@@ -4344,13 +4350,9 @@ static int md_run(mddev_t *mddev) + + if (mddev->pers) + return -EBUSY; +- +- /* These two calls synchronise us with the +- * sysfs_remove_group calls in mddev_unlock, +- * so they must have completed. +- */ +- mutex_lock(&mddev->open_mutex); +- mutex_unlock(&mddev->open_mutex); ++ /* Cannot run until previous stop completes properly */ ++ if (mddev->sysfs_active) ++ return -EBUSY; + + /* + * Analyze all RAID superblock(s) +@@ -4716,7 +4718,8 @@ static int do_md_stop(mddev_t * mddev, i + mdk_rdev_t *rdev; + + mutex_lock(&mddev->open_mutex); +- if (atomic_read(&mddev->openers) > is_open) { ++ if (atomic_read(&mddev->openers) > is_open || ++ mddev->sysfs_active) { + printk("md: %s still in use.\n",mdname(mddev)); + err = -EBUSY; + } else if (mddev->pers) { +--- a/drivers/md/md.h ++++ b/drivers/md/md.h +@@ -125,6 +125,10 @@ struct mddev_s + int suspended; + atomic_t active_io; + int ro; ++ int sysfs_active; /* set when sysfs deletes ++ * are happening, so run/ ++ * takeover/stop are not safe ++ */ + + struct gendisk *gendisk; + diff --git a/queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch b/queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch new file mode 100644 index 00000000000..68a46cad45f --- /dev/null +++ b/queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch @@ -0,0 +1,63 @@ +From 147e0b6a639ac581ca3bf627bedc3f4a6d3eca66 Mon Sep 17 00:00:00 2001 +From: Dan Williams +Date: Fri, 6 Aug 2010 18:01:59 -0700 +Subject: md: move revalidate_disk() back outside open_mutex + +From: Dan Williams + +commit 147e0b6a639ac581ca3bf627bedc3f4a6d3eca66 upstream. + +Commit b821eaa5 "md: remove ->changed and related code" moved +revalidate_disk() under open_mutex, and lockdep noticed. + +[ INFO: possible circular locking dependency detected ] +2.6.32-mdadm-locking #1 +------------------------------------------------------- +mdadm/3640 is trying to acquire lock: + (&bdev->bd_mutex){+.+.+.}, at: [] revalidate_disk+0x5b/0x90 + +but task is already holding lock: + (&mddev->open_mutex){+.+...}, at: [] do_md_stop+0x4a/0x4d0 [md_mod] + +which lock already depends on the new lock. + +It is suitable for 2.6.35.x + +Reported-by: Przemyslaw Czarnowski +Signed-off-by: Dan Williams +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/md.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -4711,7 +4711,7 @@ out: + */ + static int do_md_stop(mddev_t * mddev, int mode, int is_open) + { +- int err = 0; ++ int err = 0, revalidate = 0; + struct gendisk *disk = mddev->gendisk; + mdk_rdev_t *rdev; + +@@ -4740,7 +4740,7 @@ static int do_md_stop(mddev_t * mddev, i + } + + set_capacity(disk, 0); +- revalidate_disk(disk); ++ revalidate = 1; + + if (mddev->ro) + mddev->ro = 0; +@@ -4748,6 +4748,8 @@ static int do_md_stop(mddev_t * mddev, i + err = 0; + } + mutex_unlock(&mddev->open_mutex); ++ if (revalidate) ++ revalidate_disk(disk); + if (err) + return err; + /* diff --git a/queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch b/queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch new file mode 100644 index 00000000000..b4909fdeda4 --- /dev/null +++ b/queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch @@ -0,0 +1,59 @@ +From 51e9ac77035a3dfcb6fc0a88a0d80b6f99b5edb1 Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Sat, 7 Aug 2010 21:17:00 +1000 +Subject: md/raid10: fix deadlock with unaligned read during resync + +From: NeilBrown + +commit 51e9ac77035a3dfcb6fc0a88a0d80b6f99b5edb1 upstream. + +If the 'bio_split' path in raid10-read is used while +resync/recovery is happening it is possible to deadlock. +Fix this be elevating ->nr_waiting for the duration of both +parts of the split request. + +This fixes a bug that has been present since 2.6.22 +but has only started manifesting recently for unknown reasons. +It is suitable for and -stable since then. + +Reported-by: Justin Bronder +Tested-by: Justin Bronder +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/raid10.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +--- a/drivers/md/raid10.c ++++ b/drivers/md/raid10.c +@@ -825,11 +825,29 @@ static int make_request(mddev_t *mddev, + */ + bp = bio_split(bio, + chunk_sects - (bio->bi_sector & (chunk_sects - 1)) ); ++ ++ /* Each of these 'make_request' calls will call 'wait_barrier'. ++ * If the first succeeds but the second blocks due to the resync ++ * thread raising the barrier, we will deadlock because the ++ * IO to the underlying device will be queued in generic_make_request ++ * and will never complete, so will never reduce nr_pending. ++ * So increment nr_waiting here so no new raise_barriers will ++ * succeed, and so the second wait_barrier cannot block. ++ */ ++ spin_lock_irq(&conf->resync_lock); ++ conf->nr_waiting++; ++ spin_unlock_irq(&conf->resync_lock); ++ + if (make_request(mddev, &bp->bio1)) + generic_make_request(&bp->bio1); + if (make_request(mddev, &bp->bio2)) + generic_make_request(&bp->bio2); + ++ spin_lock_irq(&conf->resync_lock); ++ conf->nr_waiting--; ++ wake_up(&conf->wait_barrier); ++ spin_unlock_irq(&conf->resync_lock); ++ + bio_pair_release(bp); + return 0; + bad_map: diff --git a/queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch b/queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch new file mode 100644 index 00000000000..12cb248b73d --- /dev/null +++ b/queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch @@ -0,0 +1,65 @@ +From 966cca029f739716fbcc8068b8c6dfe381f86fc3 Mon Sep 17 00:00:00 2001 +From: KAMEZAWA Hiroyuki +Date: Mon, 9 Aug 2010 17:20:09 -0700 +Subject: mm: fix corruption of hibernation caused by reusing swap during image saving + +From: KAMEZAWA Hiroyuki + +commit 966cca029f739716fbcc8068b8c6dfe381f86fc3 upstream. + +Since 2.6.31, swap_map[]'s refcounting was changed to show that a used +swap entry is just for swap-cache, can be reused. Then, while scanning +free entry in swap_map[], a swap entry may be able to be reclaimed and +reused. It was caused by commit c9e444103b5e7a5 ("mm: reuse unused swap +entry if necessary"). + +But this caused deta corruption at resume. The scenario is + +- Assume a clean-swap cache, but mapped. + +- at hibernation_snapshot[], clean-swap-cache is saved as + clean-swap-cache and swap_map[] is marked as SWAP_HAS_CACHE. + +- then, save_image() is called. And reuse SWAP_HAS_CACHE entry to save + image, and break the contents. + +After resume: + +- the memory reclaim runs and finds clean-not-referenced-swap-cache and + discards it because it's marked as clean. But here, the contents on + disk and swap-cache is inconsistent. + +Hance memory is corrupted. + +This patch avoids the bug by not reclaiming swap-entry during hibernation. +This is a quick fix for backporting. + +Signed-off-by: KAMEZAWA Hiroyuki +Cc: Rafael J. Wysocki +Reported-by: Ondreg Zary +Tested-by: Ondreg Zary +Tested-by: Andrea Gelmini +Acked-by: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/swapfile.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/mm/swapfile.c ++++ b/mm/swapfile.c +@@ -318,8 +318,10 @@ checks: + if (offset > si->highest_bit) + scan_base = offset = si->lowest_bit; + +- /* reuse swap entry of cache-only swap if not busy. */ +- if (vm_swap_full() && si->swap_map[offset] == SWAP_HAS_CACHE) { ++ /* reuse swap entry of cache-only swap if not hibernation. */ ++ if (vm_swap_full() ++ && usage == SWAP_HAS_CACHE ++ && si->swap_map[offset] == SWAP_HAS_CACHE) { + int swap_was_freed; + spin_unlock(&swap_lock); + swap_was_freed = __try_to_reclaim_swap(si, offset); diff --git a/queue-2.6.35/pci-disable-msi-on-via-k8m800.patch b/queue-2.6.35/pci-disable-msi-on-via-k8m800.patch new file mode 100644 index 00000000000..a5f1755f3dc --- /dev/null +++ b/queue-2.6.35/pci-disable-msi-on-via-k8m800.patch @@ -0,0 +1,33 @@ +From 549e15611b4ac1de51ef0e0a79c2704f50a638a2 Mon Sep 17 00:00:00 2001 +From: Tejun Heo +Date: Sun, 23 May 2010 10:22:55 +0200 +Subject: PCI: disable MSI on VIA K8M800 + +From: Tejun Heo + +commit 549e15611b4ac1de51ef0e0a79c2704f50a638a2 upstream. + +MSI delivery from on-board ahci controller doesn't work on K8M800. At +this point, it's unclear whether the culprit is with the ahci +controller or the host bridge. Given the track record and considering +the rather minimal impact of MSI, disabling it seems reasonable. + +Signed-off-by: Tejun Heo +Reported-by: Rainer Hurtado Navarro +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/quirks.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -2115,6 +2115,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AT + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi); + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi); + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8380_0, quirk_disable_all_msi); + + /* Disable MSI on chipsets that are known to not support it */ + static void __devinit quirk_disable_msi(struct pci_dev *dev) diff --git a/queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch b/queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch new file mode 100644 index 00000000000..34bbf83cd1c --- /dev/null +++ b/queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch @@ -0,0 +1,38 @@ +From 3d2a531804d16cd8df6dbbb0429c6f143e756049 Mon Sep 17 00:00:00 2001 +From: Rafael J. Wysocki +Date: Fri, 23 Jul 2010 22:19:55 +0200 +Subject: PCI: Do not run NVidia quirks related to MSI with MSI disabled + +From: Rafael J. Wysocki + +commit 3d2a531804d16cd8df6dbbb0429c6f143e756049 upstream. + +There is no reason to run NVidia-specific quirks related to HT MSI +mappings with MSI disabled via pci=nomsi, so make +__nv_msi_ht_cap_quirk() return immediately in that case. + +This allows at least one machine to boot 100% of the time with +pci=nomsi (it still doesn't boot reliably without that). + +Addresses https://bugzilla.kernel.org/show_bug.cgi?id=16443 . + +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Jesse Barnes +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/quirks.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -2390,6 +2390,9 @@ static void __devinit __nv_msi_ht_cap_qu + int pos; + int found; + ++ if (!pci_msi_enabled()) ++ return; ++ + /* check if there is HT MSI cap or enabled on this device */ + found = ht_check_msi_mapping(dev); + diff --git a/queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch b/queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch new file mode 100644 index 00000000000..ebe685fe7b0 --- /dev/null +++ b/queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch @@ -0,0 +1,29 @@ +From 8f1d2d2be73a98c21e68fe2a26f633892d4abdd1 Mon Sep 17 00:00:00 2001 +From: John W. Linville +Date: Thu, 5 Aug 2010 13:46:27 -0400 +Subject: rtl8180: avoid potential NULL deref in rtl8180_beacon_work + +From: John W. Linville + +commit 8f1d2d2be73a98c21e68fe2a26f633892d4abdd1 upstream. + +ieee80211_beacon_get can return NULL... + +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/rtl818x/rtl8180_dev.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/net/wireless/rtl818x/rtl8180_dev.c ++++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c +@@ -688,6 +688,8 @@ void rtl8180_beacon_work(struct work_str + + /* grab a fresh beacon */ + skb = ieee80211_beacon_get(dev, vif); ++ if (!skb) ++ goto resched; + + /* + * update beacon timestamp w/ TSF value diff --git a/queue-2.6.35/serial-add-support-for-ox16pci958-card.patch b/queue-2.6.35/serial-add-support-for-ox16pci958-card.patch new file mode 100644 index 00000000000..4762853c30d --- /dev/null +++ b/queue-2.6.35/serial-add-support-for-ox16pci958-card.patch @@ -0,0 +1,61 @@ +From e847003f00d5eca3e3b3a6a1199f82b51293faf6 Mon Sep 17 00:00:00 2001 +From: Lytochkin Boris +Date: Mon, 26 Jul 2010 10:02:26 +0400 +Subject: serial: add support for OX16PCI958 card + +From: Lytochkin Boris + +commit e847003f00d5eca3e3b3a6a1199f82b51293faf6 upstream. + +Signed-off-by: Lytochkin Boris +Tested-by: Lytochkin Boris +Signed-off-by: Alexander Beregalov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/serial/8250_pci.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/drivers/serial/8250_pci.c ++++ b/drivers/serial/8250_pci.c +@@ -994,6 +994,7 @@ static int skip_tx_en_setup(struct seria + #define PCI_DEVICE_ID_TITAN_800E 0xA014 + #define PCI_DEVICE_ID_TITAN_200EI 0xA016 + #define PCI_DEVICE_ID_TITAN_200EISI 0xA017 ++#define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538 + + /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ + #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 +@@ -1542,6 +1543,8 @@ enum pci_board_num_t { + pbn_b2_4_921600, + pbn_b2_8_921600, + ++ pbn_b2_8_1152000, ++ + pbn_b2_bt_1_115200, + pbn_b2_bt_2_115200, + pbn_b2_bt_4_115200, +@@ -1960,6 +1963,13 @@ static struct pciserial_board pci_boards + .uart_offset = 8, + }, + ++ [pbn_b2_8_1152000] = { ++ .flags = FL_BASE2, ++ .num_ports = 8, ++ .base_baud = 1152000, ++ .uart_offset = 8, ++ }, ++ + [pbn_b2_bt_1_115200] = { + .flags = FL_BASE2|FL_BASE_BARS, + .num_ports = 1, +@@ -2875,6 +2885,9 @@ static struct pci_device_id serial_pci_t + { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, + pbn_b0_bt_2_921600 }, ++ { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI958, ++ PCI_ANY_ID , PCI_ANY_ID, 0, 0, ++ pbn_b2_8_1152000 }, + + /* + * Oxford Semiconductor Inc. Tornado PCI express device range. diff --git a/queue-2.6.35/series b/queue-2.6.35/series index fcf976023b3..20622f8bd29 100644 --- a/queue-2.6.35/series +++ b/queue-2.6.35/series @@ -6,3 +6,24 @@ x86-kmmio-mmiotrace-fix-double-free-of-kmmio_fault_pages.patch x86-pci-use-host-bridge-_crs-info-on-asrock-alivesata2-glan.patch pcmcia-avoid-buffer-overflow-in-pcmcia_setup_isa_irq.patch x86-add-memory-modify-constraints-to-xchg-and-cmpxchg.patch +staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch +staging-line6-needs-to-select-snd_pcm.patch +staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch +staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch +serial-add-support-for-ox16pci958-card.patch +pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch +pci-disable-msi-on-via-k8m800.patch +solos-pci-fix-race-condition-in-tasklet-rx-handling.patch +x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch +alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch +char-nozomi-fix-tty-count-counting.patch +char-nozomi-set-tty-driver_data-appropriately.patch +mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch +drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch +iwlwifi-fix-tx-tracer.patch +rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch +ipmi-fix-acpi-detection-with-regspacing.patch +ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch +md-move-revalidate_disk-back-outside-open_mutex.patch +md-fix-another-deadlock-with-removing-sysfs-attributes.patch +md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch diff --git a/queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch b/queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch new file mode 100644 index 00000000000..5bdf353ffd1 --- /dev/null +++ b/queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch @@ -0,0 +1,66 @@ +From 1f6ea6e511e5ec730d8e88651da1b7b6e8fd1333 Mon Sep 17 00:00:00 2001 +From: David Woodhouse +Date: Sat, 7 Aug 2010 23:02:59 -0700 +Subject: solos-pci: Fix race condition in tasklet RX handling + +From: David Woodhouse + +commit 1f6ea6e511e5ec730d8e88651da1b7b6e8fd1333 upstream. + +We were seeing faults in the solos-pci receive tasklet when packets +arrived for a VCC which was currently being closed: + +[18842.727906] EIP: [] br2684_push+0x19/0x234 [br2684] SS:ESP 0068:dfb89d14 + +[18845.090712] [] ? do_page_fault+0x0/0x2e1 +[18845.120042] [] ? br2684_push+0x19/0x234 [br2684] +[18845.153530] [] solos_bh+0x28b/0x7c8 [solos_pci] +[18845.186488] [] ? solos_irq+0x2d/0x51 [solos_pci] +[18845.219960] [] ? handle_irq+0x3b/0x48 +[18845.247732] [] ? irq_exit+0x34/0x57 +[18845.274437] [] tasklet_action+0x42/0x69 +[18845.303247] [] __do_softirq+0x8e/0x129 +[18845.331540] [] do_softirq+0x25/0x2a +[18845.358274] [] _local_bh_enable_ip+0x5e/0x6a +[18845.389677] [] local_bh_enable+0xb/0xe +[18845.417944] [] ppp_unregister_channel+0x32/0xbb [ppp_generic] +[18845.458193] [] pppox_unbind_sock+0x18/0x1f [pppox] + +This patch uses an RCU-inspired approach to fix it. In the RX tasklet's +find_vcc() function we first refuse to use a VCC which already has the +ATM_VF_READY bit cleared. And in the VCC close function, we synchronise +with the tasklet to ensure that it can't still be using the VCC before +we continue and allow the VCC to be destroyed. + +Signed-off-by: David Woodhouse +Tested-by: Nathan Williams +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/atm/solos-pci.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/atm/solos-pci.c ++++ b/drivers/atm/solos-pci.c +@@ -781,7 +781,8 @@ static struct atm_vcc *find_vcc(struct a + sk_for_each(s, node, head) { + vcc = atm_sk(s); + if (vcc->dev == dev && vcc->vci == vci && +- vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE) ++ vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE && ++ test_bit(ATM_VF_READY, &vcc->flags)) + goto out; + } + vcc = NULL; +@@ -907,6 +908,10 @@ static void pclose(struct atm_vcc *vcc) + clear_bit(ATM_VF_ADDR, &vcc->flags); + clear_bit(ATM_VF_READY, &vcc->flags); + ++ /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the ++ tasklet has finished processing any incoming packets (and, more to ++ the point, using the vcc pointer). */ ++ tasklet_unlock_wait(&card->tlet); + return; + } + diff --git a/queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch b/queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch new file mode 100644 index 00000000000..5770ed6185f --- /dev/null +++ b/queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch @@ -0,0 +1,33 @@ +From 54d2379c20d814ced657cbc2c4ead8d1f8389fa2 Mon Sep 17 00:00:00 2001 +From: Haiyang Zhang +Date: Fri, 23 Jul 2010 21:24:42 +0000 +Subject: staging: hv: Fix Kconfig dependency of hv_blkvsc + +From: Haiyang Zhang + +commit 54d2379c20d814ced657cbc2c4ead8d1f8389fa2 upstream. + +LBDAF is not available nor necessary on 64BIT kernel. This patch +fixed the dependency for hv_blkvsc module on 64BIT kernel. +Thanks vrataj2 [vrataj2@comcast.net] for reporting this problem. + +Reported-by: vrataj2 +Signed-off-by: Haiyang Zhang +Signed-off-by: Hank Janssen +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/hv/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/staging/hv/Kconfig ++++ b/drivers/staging/hv/Kconfig +@@ -17,7 +17,7 @@ config HYPERV_STORAGE + + config HYPERV_BLOCK + tristate "Microsoft Hyper-V virtual block driver" +- depends on BLOCK && SCSI && LBDAF ++ depends on BLOCK && SCSI && (LBDAF || 64BIT) + default HYPERV + help + Select this option to enable the Hyper-V virtual block driver. diff --git a/queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch b/queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch new file mode 100644 index 00000000000..5497bb2e2c9 --- /dev/null +++ b/queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch @@ -0,0 +1,39 @@ +From e928c077e5cdcd72ee762125b37232aec1ff49f3 Mon Sep 17 00:00:00 2001 +From: Randy Dunlap +Date: Tue, 27 Jul 2010 12:21:19 -0700 +Subject: Staging: line6: needs to select SND_PCM + +From: Randy Dunlap + +commit e928c077e5cdcd72ee762125b37232aec1ff49f3 upstream. + +line6 uses snd_pcm*() functions, so it should select SND_PCM. + +ERROR: "snd_pcm_period_elapsed" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_set_ops" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_lib_free_pages" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_lib_ioctl" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_lib_malloc_pages" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_hw_constraint_ratdens" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_format_physical_width" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_lib_preallocate_pages_for_all" [drivers/staging/line6/line6usb.ko] undefined! +ERROR: "snd_pcm_new" [drivers/staging/line6/line6usb.ko] undefined! + +Signed-off-by: Randy Dunlap +Cc: Markus Grabner +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/line6/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/staging/line6/Kconfig ++++ b/drivers/staging/line6/Kconfig +@@ -2,6 +2,7 @@ config LINE6_USB + tristate "Line6 USB support" + depends on USB && SND + select SND_RAWMIDI ++ select SND_PCM + help + This is a driver for the guitar amp, cab, and effects modeller + PODxt Pro by Line6 (and similar devices), supporting the diff --git a/queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch b/queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch new file mode 100644 index 00000000000..282d62dfccb --- /dev/null +++ b/queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch @@ -0,0 +1,43 @@ +From 060132ae42cce3f9d2fd34d9a17b98362b44b9f9 Mon Sep 17 00:00:00 2001 +From: Peter Huewe +Date: Wed, 7 Jul 2010 04:52:16 +0200 +Subject: Staging: panel: Prevent double-calling of parport_release - fix oops. + +From: Peter Huewe + +commit 060132ae42cce3f9d2fd34d9a17b98362b44b9f9 upstream. + +This patch prevents the code from calling parport_release and +parport_unregister_device twice with the same arguments - and thus fixes an oops. + +Rationale: +After the first call the parport is already released and the +handle isn't valid anymore and calling parport_release and +parport_unregister_device twice isn't a good idea. + +Signed-off-by: Peter Huewe +Acked-by: Willy Tarreau +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/panel/panel.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/staging/panel/panel.c ++++ b/drivers/staging/panel/panel.c +@@ -2179,6 +2179,7 @@ int panel_init(void) + if (pprt) { + parport_release(pprt); + parport_unregister_device(pprt); ++ pprt = NULL; + } + parport_unregister_driver(&panel_driver); + printk(KERN_ERR "Panel driver version " PANEL_VERSION +@@ -2228,6 +2229,7 @@ static void __exit panel_cleanup_module( + /* TODO: free all input signals */ + parport_release(pprt); + parport_unregister_device(pprt); ++ pprt = NULL; + } + parport_unregister_driver(&panel_driver); + } diff --git a/queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch b/queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch new file mode 100644 index 00000000000..907bd9cbab9 --- /dev/null +++ b/queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch @@ -0,0 +1,29 @@ +From 5d92fe3387d086fc2f10426fbdb6b86d6cce5a47 Mon Sep 17 00:00:00 2001 +From: Larry Finger +Date: Sun, 25 Jul 2010 16:14:53 -0500 +Subject: staging: rt2870: Add USB ID for Belkin F6D4050 v2 + +From: Larry Finger + +commit 5d92fe3387d086fc2f10426fbdb6b86d6cce5a47 upstream. + +Device missing from current tables. + +Signed-off-by: Larry Finger +Tested-by: Rod Huffaker +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/rt2860/usb_main_dev.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/staging/rt2860/usb_main_dev.c ++++ b/drivers/staging/rt2860/usb_main_dev.c +@@ -64,6 +64,7 @@ struct usb_device_id rtusb_usb_id[] = { + {USB_DEVICE(0x14B2, 0x3C07)}, /* AL */ + {USB_DEVICE(0x050D, 0x8053)}, /* Belkin */ + {USB_DEVICE(0x050D, 0x825B)}, /* Belkin */ ++ {USB_DEVICE(0x050D, 0x935B)}, /* Belkin F6D4050 v2 */ + {USB_DEVICE(0x14B2, 0x3C23)}, /* Airlink */ + {USB_DEVICE(0x14B2, 0x3C27)}, /* Airlink */ + {USB_DEVICE(0x07AA, 0x002F)}, /* Corega */ diff --git a/queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch b/queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch new file mode 100644 index 00000000000..3c626a2d8e6 --- /dev/null +++ b/queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch @@ -0,0 +1,216 @@ +From 68f202e4e87cfab4439568bf397fcc5c7cf8d729 Mon Sep 17 00:00:00 2001 +From: Suresh Siddha +Date: Fri, 30 Jul 2010 11:46:42 -0700 +Subject: x86, mtrr: Use stop machine context to rendezvous all the cpu's + +From: Suresh Siddha + +commit 68f202e4e87cfab4439568bf397fcc5c7cf8d729 upstream. + +Use the stop machine context rather than IPI's to rendezvous all the cpus for +MTRR initialization that happens during cpu bringup or for MTRR modifications +during runtime. + +This avoids deadlock scenario (reported by Prarit) like: + +cpu A holds a read_lock (tasklist_lock for example) with irqs enabled +cpu B waits for the same lock with irqs disabled using write_lock_irq +cpu C doing set_mtrr() (during AP bringup for example), which will try to +rendezvous all the cpus using IPI's + +This will result in C and A come to the rendezvous point and waiting +for B. B is stuck forever waiting for the lock and thus not +reaching the rendezvous point. + +Using stop cpu (run in the process context of per cpu based keventd) to do +this rendezvous, avoids this deadlock scenario. + +Also make sure all the cpu's are in the rendezvous handler before we proceed +with the local_irq_save() on each cpu. This lock step disabling irqs on all +the cpus will avoid other deadlock scenarios (for example involving +with the blocking smp_call_function's etc). + + [ This problem is very old. Marking -stable only for 2.6.35 as the + stop_one_cpu_nowait() API is present only in 2.6.35. Any older + kernel interested in this fix need to do some more work in backporting + this patch. ] + +Reported-by: Prarit Bhargava +Signed-off-by: Suresh Siddha +LKML-Reference: <1280515602.2682.10.camel@sbsiddha-MOBL3.sc.intel.com> +Acked-by: Prarit Bhargava +Signed-off-by: H. Peter Anvin +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/cpu/mtrr/main.c | 56 ++++++++++++++++++++++++++++++---------- + arch/x86/kernel/smpboot.c | 7 +++++ + 2 files changed, 50 insertions(+), 13 deletions(-) + +--- a/arch/x86/kernel/cpu/mtrr/main.c ++++ b/arch/x86/kernel/cpu/mtrr/main.c +@@ -35,6 +35,7 @@ + + #include /* FIXME: kvm_para.h needs this */ + ++#include + #include + #include + #include +@@ -143,22 +144,28 @@ struct set_mtrr_data { + mtrr_type smp_type; + }; + ++static DEFINE_PER_CPU(struct cpu_stop_work, mtrr_work); ++ + /** +- * ipi_handler - Synchronisation handler. Executed by "other" CPUs. ++ * mtrr_work_handler - Synchronisation handler. Executed by "other" CPUs. + * @info: pointer to mtrr configuration data + * + * Returns nothing. + */ +-static void ipi_handler(void *info) ++static int mtrr_work_handler(void *info) + { + #ifdef CONFIG_SMP + struct set_mtrr_data *data = info; + unsigned long flags; + ++ atomic_dec(&data->count); ++ while (!atomic_read(&data->gate)) ++ cpu_relax(); ++ + local_irq_save(flags); + + atomic_dec(&data->count); +- while (!atomic_read(&data->gate)) ++ while (atomic_read(&data->gate)) + cpu_relax(); + + /* The master has cleared me to execute */ +@@ -173,12 +180,13 @@ static void ipi_handler(void *info) + } + + atomic_dec(&data->count); +- while (atomic_read(&data->gate)) ++ while (!atomic_read(&data->gate)) + cpu_relax(); + + atomic_dec(&data->count); + local_irq_restore(flags); + #endif ++ return 0; + } + + static inline int types_compatible(mtrr_type type1, mtrr_type type2) +@@ -198,7 +206,7 @@ static inline int types_compatible(mtrr_ + * + * This is kinda tricky, but fortunately, Intel spelled it out for us cleanly: + * +- * 1. Send IPI to do the following: ++ * 1. Queue work to do the following on all processors: + * 2. Disable Interrupts + * 3. Wait for all procs to do so + * 4. Enter no-fill cache mode +@@ -215,14 +223,17 @@ static inline int types_compatible(mtrr_ + * 15. Enable interrupts. + * + * What does that mean for us? Well, first we set data.count to the number +- * of CPUs. As each CPU disables interrupts, it'll decrement it once. We wait +- * until it hits 0 and proceed. We set the data.gate flag and reset data.count. +- * Meanwhile, they are waiting for that flag to be set. Once it's set, each ++ * of CPUs. As each CPU announces that it started the rendezvous handler by ++ * decrementing the count, We reset data.count and set the data.gate flag ++ * allowing all the cpu's to proceed with the work. As each cpu disables ++ * interrupts, it'll decrement data.count once. We wait until it hits 0 and ++ * proceed. We clear the data.gate flag and reset data.count. Meanwhile, they ++ * are waiting for that flag to be cleared. Once it's cleared, each + * CPU goes through the transition of updating MTRRs. + * The CPU vendors may each do it differently, + * so we call mtrr_if->set() callback and let them take care of it. + * When they're done, they again decrement data->count and wait for data.gate +- * to be reset. ++ * to be set. + * When we finish, we wait for data.count to hit 0 and toggle the data.gate flag + * Everyone then enables interrupts and we all continue on. + * +@@ -234,6 +245,9 @@ set_mtrr(unsigned int reg, unsigned long + { + struct set_mtrr_data data; + unsigned long flags; ++ int cpu; ++ ++ preempt_disable(); + + data.smp_reg = reg; + data.smp_base = base; +@@ -246,10 +260,15 @@ set_mtrr(unsigned int reg, unsigned long + atomic_set(&data.gate, 0); + + /* Start the ball rolling on other CPUs */ +- if (smp_call_function(ipi_handler, &data, 0) != 0) +- panic("mtrr: timed out waiting for other CPUs\n"); ++ for_each_online_cpu(cpu) { ++ struct cpu_stop_work *work = &per_cpu(mtrr_work, cpu); ++ ++ if (cpu == smp_processor_id()) ++ continue; ++ ++ stop_one_cpu_nowait(cpu, mtrr_work_handler, &data, work); ++ } + +- local_irq_save(flags); + + while (atomic_read(&data.count)) + cpu_relax(); +@@ -259,6 +278,16 @@ set_mtrr(unsigned int reg, unsigned long + smp_wmb(); + atomic_set(&data.gate, 1); + ++ local_irq_save(flags); ++ ++ while (atomic_read(&data.count)) ++ cpu_relax(); ++ ++ /* Ok, reset count and toggle gate */ ++ atomic_set(&data.count, num_booting_cpus() - 1); ++ smp_wmb(); ++ atomic_set(&data.gate, 0); ++ + /* Do our MTRR business */ + + /* +@@ -279,7 +308,7 @@ set_mtrr(unsigned int reg, unsigned long + + atomic_set(&data.count, num_booting_cpus() - 1); + smp_wmb(); +- atomic_set(&data.gate, 0); ++ atomic_set(&data.gate, 1); + + /* + * Wait here for everyone to have seen the gate change +@@ -289,6 +318,7 @@ set_mtrr(unsigned int reg, unsigned long + cpu_relax(); + + local_irq_restore(flags); ++ preempt_enable(); + } + + /** +--- a/arch/x86/kernel/smpboot.c ++++ b/arch/x86/kernel/smpboot.c +@@ -816,6 +816,13 @@ do_rest: + if (cpumask_test_cpu(cpu, cpu_callin_mask)) + break; /* It has booted */ + udelay(100); ++ /* ++ * Allow other tasks to run while we wait for the ++ * AP to come online. This also gives a chance ++ * for the MTRR work(triggered by the AP coming online) ++ * to be completed in the stop machine context. ++ */ ++ schedule(); + } + + if (cpumask_test_cpu(cpu, cpu_callin_mask))