From 4020ed59a98e50ebf9b7495861f47fc6c0c11a9e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 22 Feb 2013 15:41:29 -0800 Subject: [PATCH] 3.8-stable patches added patches: alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch alsa-aloop-fix-oops-while-pm-resume.patch alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch workqueue-un-gpl-function-delayed_work_timer_fn.patch x86-hyper-v-register-clocksource-only-if-its-advertised.patch --- ...ove-irq-enabling-in-pointer-callback.patch | 34 +++++++ .../alsa-aloop-fix-oops-while-pm-resume.patch | 48 ++++++++++ ...2.c-irq-enabling-after-spin_lock_irq.patch | 35 +++++++ ...event-hrtimer_enqueue_reprogram-race.patch | 94 +++++++++++++++++++ queue-3.8/series | 6 ++ ...n-gpl-function-delayed_work_timer_fn.patch | 34 +++++++ ...r-clocksource-only-if-its-advertised.patch | 48 ++++++++++ 7 files changed, 299 insertions(+) create mode 100644 queue-3.8/alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch create mode 100644 queue-3.8/alsa-aloop-fix-oops-while-pm-resume.patch create mode 100644 queue-3.8/alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch create mode 100644 queue-3.8/hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch create mode 100644 queue-3.8/workqueue-un-gpl-function-delayed_work_timer_fn.patch create mode 100644 queue-3.8/x86-hyper-v-register-clocksource-only-if-its-advertised.patch diff --git a/queue-3.8/alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch b/queue-3.8/alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch new file mode 100644 index 00000000000..e3c5330a09e --- /dev/null +++ b/queue-3.8/alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch @@ -0,0 +1,34 @@ +From dacae5a19b4cbe1b5e3a86de23ea74cbe9ec9652 Mon Sep 17 00:00:00 2001 +From: Denis Efremov +Date: Mon, 11 Feb 2013 19:49:48 +0400 +Subject: ALSA: ali5451: remove irq enabling in pointer callback + +From: Denis Efremov + +commit dacae5a19b4cbe1b5e3a86de23ea74cbe9ec9652 upstream. + +snd_ali_pointer function is called with local +interrupts disabled. However it seems very strange to +reenable them in such way. + +Found by Linux Driver Verification project (linuxtesting.org). + +Signed-off-by: Denis Efremov +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/ali5451/ali5451.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/sound/pci/ali5451/ali5451.c ++++ b/sound/pci/ali5451/ali5451.c +@@ -1435,7 +1435,7 @@ static snd_pcm_uframes_t snd_ali_pointer + + spin_lock(&codec->reg_lock); + if (!pvoice->running) { +- spin_unlock_irq(&codec->reg_lock); ++ spin_unlock(&codec->reg_lock); + return 0; + } + outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR)); diff --git a/queue-3.8/alsa-aloop-fix-oops-while-pm-resume.patch b/queue-3.8/alsa-aloop-fix-oops-while-pm-resume.patch new file mode 100644 index 00000000000..6f62aa36cfa --- /dev/null +++ b/queue-3.8/alsa-aloop-fix-oops-while-pm-resume.patch @@ -0,0 +1,48 @@ +From edac894389f9c9de2a1368c78809c824b343f3a5 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 4 Feb 2013 10:28:15 +0100 +Subject: ALSA: aloop: Fix Oops while PM resume + +From: Takashi Iwai + +commit edac894389f9c9de2a1368c78809c824b343f3a5 upstream. + +snd-aloop driver has no proper PM implementation, thus the PM resume +may trigger Oops due to leftover timer instance. This patch adds the +missing suspend/resume implementation. + +Reported-and-tested-by: El boulangero +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/drivers/aloop.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/sound/drivers/aloop.c ++++ b/sound/drivers/aloop.c +@@ -286,12 +286,14 @@ static int loopback_trigger(struct snd_p + loopback_active_notify(dpcm); + break; + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: ++ case SNDRV_PCM_TRIGGER_SUSPEND: + spin_lock(&cable->lock); + cable->pause |= stream; + loopback_timer_stop(dpcm); + spin_unlock(&cable->lock); + break; + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: ++ case SNDRV_PCM_TRIGGER_RESUME: + spin_lock(&cable->lock); + dpcm->last_jiffies = jiffies; + cable->pause &= ~stream; +@@ -563,7 +565,8 @@ static snd_pcm_uframes_t loopback_pointe + static struct snd_pcm_hardware loopback_pcm_hardware = + { + .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP | +- SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_PAUSE), ++ SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_PAUSE | ++ SNDRV_PCM_INFO_RESUME), + .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | + SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE | + SNDRV_PCM_FMTBIT_FLOAT_LE | SNDRV_PCM_FMTBIT_FLOAT_BE), diff --git a/queue-3.8/alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch b/queue-3.8/alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch new file mode 100644 index 00000000000..534a8466777 --- /dev/null +++ b/queue-3.8/alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch @@ -0,0 +1,35 @@ +From f49a59c4471d81a233e09dda45187cc44fda009d Mon Sep 17 00:00:00 2001 +From: Denis Efremov +Date: Mon, 11 Feb 2013 19:04:06 +0400 +Subject: ALSA: rme32.c irq enabling after spin_lock_irq + +From: Denis Efremov + +commit f49a59c4471d81a233e09dda45187cc44fda009d upstream. + +According to the other code in this driver and similar +code in rme96 it seems, that spin_lock_irq in +snd_rme32_capture_close function should be paired +with spin_unlock_irq. + +Found by Linux Driver Verification project (linuxtesting.org). + +Signed-off-by: Denis Efremov +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/rme32.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/sound/pci/rme32.c ++++ b/sound/pci/rme32.c +@@ -1017,7 +1017,7 @@ static int snd_rme32_capture_close(struc + spin_lock_irq(&rme32->lock); + rme32->capture_substream = NULL; + rme32->capture_periodsize = 0; +- spin_unlock(&rme32->lock); ++ spin_unlock_irq(&rme32->lock); + return 0; + } + diff --git a/queue-3.8/hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch b/queue-3.8/hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch new file mode 100644 index 00000000000..f4c8a4132e1 --- /dev/null +++ b/queue-3.8/hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch @@ -0,0 +1,94 @@ +From b22affe0aef429d657bc6505aacb1c569340ddd2 Mon Sep 17 00:00:00 2001 +From: Leonid Shatz +Date: Mon, 4 Feb 2013 14:33:37 +0200 +Subject: hrtimer: Prevent hrtimer_enqueue_reprogram race + +From: Leonid Shatz + +commit b22affe0aef429d657bc6505aacb1c569340ddd2 upstream. + +hrtimer_enqueue_reprogram contains a race which could result in +timer.base switch during unlock/lock sequence. + +hrtimer_enqueue_reprogram is releasing the lock protecting the timer +base for calling raise_softirq_irqsoff() due to a lock ordering issue +versus rq->lock. + +If during that time another CPU calls __hrtimer_start_range_ns() on +the same hrtimer, the timer base might switch, before the current CPU +can lock base->lock again and therefor the unlock_timer_base() call +will unlock the wrong lock. + +[ tglx: Added comment and massaged changelog ] + +Signed-off-by: Leonid Shatz +Signed-off-by: Izik Eidus +Cc: Andrea Arcangeli +Link: http://lkml.kernel.org/r/1359981217-389-1-git-send-email-izik.eidus@ravellosystems.com +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/hrtimer.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +--- a/kernel/hrtimer.c ++++ b/kernel/hrtimer.c +@@ -640,21 +640,9 @@ static inline void hrtimer_init_hres(str + * and expiry check is done in the hrtimer_interrupt or in the softirq. + */ + static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, +- struct hrtimer_clock_base *base, +- int wakeup) ++ struct hrtimer_clock_base *base) + { +- if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { +- if (wakeup) { +- raw_spin_unlock(&base->cpu_base->lock); +- raise_softirq_irqoff(HRTIMER_SOFTIRQ); +- raw_spin_lock(&base->cpu_base->lock); +- } else +- __raise_softirq_irqoff(HRTIMER_SOFTIRQ); +- +- return 1; +- } +- +- return 0; ++ return base->cpu_base->hres_active && hrtimer_reprogram(timer, base); + } + + static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) +@@ -735,8 +723,7 @@ static inline int hrtimer_switch_to_hres + static inline void + hrtimer_force_reprogram(struct hrtimer_cpu_base *base, int skip_equal) { } + static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, +- struct hrtimer_clock_base *base, +- int wakeup) ++ struct hrtimer_clock_base *base) + { + return 0; + } +@@ -995,8 +982,21 @@ int __hrtimer_start_range_ns(struct hrti + * + * XXX send_remote_softirq() ? + */ +- if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases)) +- hrtimer_enqueue_reprogram(timer, new_base, wakeup); ++ if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases) ++ && hrtimer_enqueue_reprogram(timer, new_base)) { ++ if (wakeup) { ++ /* ++ * We need to drop cpu_base->lock to avoid a ++ * lock ordering issue vs. rq->lock. ++ */ ++ raw_spin_unlock(&new_base->cpu_base->lock); ++ raise_softirq_irqoff(HRTIMER_SOFTIRQ); ++ local_irq_restore(flags); ++ return ret; ++ } else { ++ __raise_softirq_irqoff(HRTIMER_SOFTIRQ); ++ } ++ } + + unlock_hrtimer_base(timer, &flags); + diff --git a/queue-3.8/series b/queue-3.8/series index 42eaa003e37..a1587e63bf5 100644 --- a/queue-3.8/series +++ b/queue-3.8/series @@ -6,3 +6,9 @@ perf-hists-fix-period-symbol_conf.field_sep-display.patch timeconst.pl-eliminate-perl-warning.patch genirq-avoid-deadlock-in-spurious-handling.patch posix-cpu-timers-fix-nanosleep-task_struct-leak.patch +hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch +x86-hyper-v-register-clocksource-only-if-its-advertised.patch +workqueue-un-gpl-function-delayed_work_timer_fn.patch +alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch +alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch +alsa-aloop-fix-oops-while-pm-resume.patch diff --git a/queue-3.8/workqueue-un-gpl-function-delayed_work_timer_fn.patch b/queue-3.8/workqueue-un-gpl-function-delayed_work_timer_fn.patch new file mode 100644 index 00000000000..09c0d7473ea --- /dev/null +++ b/queue-3.8/workqueue-un-gpl-function-delayed_work_timer_fn.patch @@ -0,0 +1,34 @@ +From 1438ade5670b56d5386c220e1ad4b5a824a1e585 Mon Sep 17 00:00:00 2001 +From: Konstantin Khlebnikov +Date: Thu, 24 Jan 2013 16:36:31 +0400 +Subject: workqueue: un-GPL function delayed_work_timer_fn() + +From: Konstantin Khlebnikov + +commit 1438ade5670b56d5386c220e1ad4b5a824a1e585 upstream. + +commit d8e794dfd51c368ed3f686b7f4172830b60ae47b ("workqueue: set +delayed_work->timer function on initialization") exports function +delayed_work_timer_fn() only for GPL modules. This makes delayed-works +unusable for non-GPL modules, because initialization macro now requires +GPL symbol. For example schedule_delayed_work() available for non-GPL. + +Signed-off-by: Konstantin Khlebnikov +Signed-off-by: Tejun Heo +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/workqueue.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -1352,7 +1352,7 @@ void delayed_work_timer_fn(unsigned long + /* should have been called from irqsafe timer with irq already off */ + __queue_work(dwork->cpu, cwq->wq, &dwork->work); + } +-EXPORT_SYMBOL_GPL(delayed_work_timer_fn); ++EXPORT_SYMBOL(delayed_work_timer_fn); + + static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, + struct delayed_work *dwork, unsigned long delay) diff --git a/queue-3.8/x86-hyper-v-register-clocksource-only-if-its-advertised.patch b/queue-3.8/x86-hyper-v-register-clocksource-only-if-its-advertised.patch new file mode 100644 index 00000000000..4f62005e2bd --- /dev/null +++ b/queue-3.8/x86-hyper-v-register-clocksource-only-if-its-advertised.patch @@ -0,0 +1,48 @@ +From 32068f6527b8f1822a30671dedaf59c567325026 Mon Sep 17 00:00:00 2001 +From: Olaf Hering <[mailto:olaf@aepfle.de]> +Date: Sun, 3 Feb 2013 17:22:37 -0800 +Subject: x86: Hyper-V: register clocksource only if its advertised + +From: Olaf Hering <[mailto:olaf@aepfle.de]> + +commit 32068f6527b8f1822a30671dedaf59c567325026 upstream. + +Enable hyperv_clocksource only if its advertised as a feature. +XenServer 6 returns the signature which is checked in +ms_hyperv_platform(), but it does not offer all features. Currently the +clocksource is enabled unconditionally in ms_hyperv_init_platform(), and +the result is a hanging guest. + +Hyper-V spec Bit 1 indicates the availability of Partition Reference +Counter. Register the clocksource only if this bit is set. + +The guest in question prints this in dmesg: + [ 0.000000] Hypervisor detected: Microsoft HyperV + [ 0.000000] HyperV: features 0x70, hints 0x0 + +This bug can be reproduced easily be setting 'viridian=1' in a HVM domU +.cfg file. A workaround without this patch is to boot the HVM guest with +'clocksource=jiffies'. + +Signed-off-by: Olaf Hering +Link: http://lkml.kernel.org/r/1359940959-32168-1-git-send-email-kys@microsoft.com +Signed-off-by: K. Y. Srinivasan +Signed-off-by: H. Peter Anvin +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/cpu/mshyperv.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/arch/x86/kernel/cpu/mshyperv.c ++++ b/arch/x86/kernel/cpu/mshyperv.c +@@ -68,7 +68,8 @@ static void __init ms_hyperv_init_platfo + printk(KERN_INFO "HyperV: features 0x%x, hints 0x%x\n", + ms_hyperv.features, ms_hyperv.hints); + +- clocksource_register_hz(&hyperv_cs, NSEC_PER_SEC/100); ++ if (ms_hyperv.features & HV_X64_MSR_TIME_REF_COUNT_AVAILABLE) ++ clocksource_register_hz(&hyperv_cs, NSEC_PER_SEC/100); + } + + const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { -- 2.47.3