From: Greg Kroah-Hartman Date: Tue, 11 Dec 2012 18:34:39 +0000 (-0800) Subject: 3.6-stable patches X-Git-Tag: v3.6.11~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7261f799b40a9347d9b383e56b7e9d94787ccd16;p=thirdparty%2Fkernel%2Fstable-queue.git 3.6-stable patches added patches: asoc-dmaengine-correct-makefile-when-sound-is-built-as-module.patch drm-i915-do-not-default-to-18-bpp-for-edp-if-missing-from-vbt.patch drm-i915-do-not-ignore-edp-bpc-settings-from-vbt.patch edac-fix-the-dimm-filling-for-csrows-based-layouts.patch i82975x_edac-fix-dimm-label-initialization.patch input-matrix-keymap-provide-proper-module-license.patch staging-ipack-bridges-tpci200-avoid-kernel-bug-when-uninstalling-a-device.patch workqueue-convert-bug_on-s-in-__queue_delayed_work-to-warn_on_once-s.patch --- diff --git a/queue-3.6/asoc-dmaengine-correct-makefile-when-sound-is-built-as-module.patch b/queue-3.6/asoc-dmaengine-correct-makefile-when-sound-is-built-as-module.patch new file mode 100644 index 00000000000..49cedece6e2 --- /dev/null +++ b/queue-3.6/asoc-dmaengine-correct-makefile-when-sound-is-built-as-module.patch @@ -0,0 +1,35 @@ +From 961a7aeafab477f63d9eef26afde9cbb8badcd0f Mon Sep 17 00:00:00 2001 +From: Peter Ujfalusi +Date: Mon, 1 Oct 2012 12:29:26 +0300 +Subject: ASoC: dmaengine: Correct Makefile when sound is built as module + +From: Peter Ujfalusi + +commit 961a7aeafab477f63d9eef26afde9cbb8badcd0f upstream. + +soc-dmaengine-pcm library need to be part of the snd-soc-core in order to +be able to compile ASoC as modules when dmaengine is enabled on the platform. + +Signed-off-by: Peter Ujfalusi +Signed-off-by: Mark Brown +Cc: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/Makefile | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/sound/soc/Makefile ++++ b/sound/soc/Makefile +@@ -1,8 +1,9 @@ + snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o + snd-soc-core-objs += soc-pcm.o soc-io.o + +-snd-soc-dmaengine-pcm-objs := soc-dmaengine-pcm.o +-obj-$(CONFIG_SND_SOC_DMAENGINE_PCM) += snd-soc-dmaengine-pcm.o ++ifneq ($(CONFIG_SND_SOC_DMAENGINE_PCM),) ++snd-soc-core-objs += soc-dmaengine-pcm.o ++endif + + obj-$(CONFIG_SND_SOC) += snd-soc-core.o + obj-$(CONFIG_SND_SOC) += codecs/ diff --git a/queue-3.6/drm-i915-do-not-default-to-18-bpp-for-edp-if-missing-from-vbt.patch b/queue-3.6/drm-i915-do-not-default-to-18-bpp-for-edp-if-missing-from-vbt.patch new file mode 100644 index 00000000000..6d25aba8d3f --- /dev/null +++ b/queue-3.6/drm-i915-do-not-default-to-18-bpp-for-edp-if-missing-from-vbt.patch @@ -0,0 +1,78 @@ +From 9a30a61f3516871c5c638fd7c025fbaa11ddf7fe Mon Sep 17 00:00:00 2001 +From: Jani Nikula +Date: Mon, 12 Nov 2012 14:33:45 +0200 +Subject: drm/i915: do not default to 18 bpp for eDP if missing from VBT + +From: Jani Nikula + +commit 9a30a61f3516871c5c638fd7c025fbaa11ddf7fe upstream. + +commit 500a8cc466a24e2fbc4c86ef9c6467ae2ffdeb0c +Author: Zhenyu Wang +Date: Wed Jan 13 11:19:52 2010 +0800 + + drm/i915: parse eDP panel color depth from VBT block + +originally introduced parsing bpp for eDP from VBT, with a default of 18 +bpp if the eDP BIOS data block is not present. Turns out that default seems +to break the Macbook Pro with retina display, as noted in + +commit 4344b813f105a19f793f1fd93ad775b784648b95 +Author: Daniel Vetter +Date: Fri Aug 10 11:10:20 2012 +0200 + + drm/i915: ignore eDP bpc settings from vbt + +Since we can't ignore bpc settings from VBT completely after all, get rid +of the default. Do not clamp eDP to 18 bpp by default if the eDP BDB is +missing from VBT. + +Signed-off-by: Jani Nikula +Tested-by: Henrik Rydberg +[danvet: paste in the updated commit message from irc.] +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_bios.c | 11 ++--------- + drivers/gpu/drm/i915/intel_display.c | 2 +- + 2 files changed, 3 insertions(+), 10 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_bios.c ++++ b/drivers/gpu/drm/i915/intel_bios.c +@@ -500,12 +500,8 @@ parse_edp(struct drm_i915_private *dev_p + + edp = find_section(bdb, BDB_EDP); + if (!edp) { +- if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { +- DRM_DEBUG_KMS("No eDP BDB found but eDP panel " +- "supported, assume %dbpp panel color " +- "depth.\n", +- dev_priv->edp.bpp); +- } ++ if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) ++ DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); + return; + } + +@@ -658,9 +654,6 @@ init_vbt_defaults(struct drm_i915_privat + dev_priv->lvds_use_ssc = 1; + dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); + DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); +- +- /* eDP data */ +- dev_priv->edp.bpp = 18; + } + + static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -3795,7 +3795,7 @@ static bool intel_choose_pipe_bpp_dither + /* Use VBT settings if we have an eDP panel */ + unsigned int edp_bpc = dev_priv->edp.bpp / 3; + +- if (edp_bpc < display_bpc) { ++ if (edp_bpc && edp_bpc < display_bpc) { + DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); + display_bpc = edp_bpc; + } diff --git a/queue-3.6/drm-i915-do-not-ignore-edp-bpc-settings-from-vbt.patch b/queue-3.6/drm-i915-do-not-ignore-edp-bpc-settings-from-vbt.patch new file mode 100644 index 00000000000..eb4547f5804 --- /dev/null +++ b/queue-3.6/drm-i915-do-not-ignore-edp-bpc-settings-from-vbt.patch @@ -0,0 +1,52 @@ +From 2f4f649a69a9eb51f6e98130e19dd90a260a4145 Mon Sep 17 00:00:00 2001 +From: Jani Nikula +Date: Mon, 12 Nov 2012 14:33:44 +0200 +Subject: drm/i915: do not ignore eDP bpc settings from vbt + +From: Jani Nikula + +commit 2f4f649a69a9eb51f6e98130e19dd90a260a4145 upstream. + +There are laptops out there that need the eDP bpc from VBT. This is +effectively a revert of + +commit 4344b813f105a19f793f1fd93ad775b784648b95 +Author: Daniel Vetter +Date: Fri Aug 10 11:10:20 2012 +0200 + + drm/i915: ignore eDP bpc settings from vbt + +but putting the VBT check after the EDID check to see them both in dmesg if +this clamps more than the EDID. We have enough history with bpc clamping to +warrant the extra debug info. + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=47641 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56401 +Signed-off-by: Jani Nikula +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -3791,6 +3791,17 @@ static bool intel_choose_pipe_bpp_dither + } + } + ++ if (intel_encoder->type == INTEL_OUTPUT_EDP) { ++ /* Use VBT settings if we have an eDP panel */ ++ unsigned int edp_bpc = dev_priv->edp.bpp / 3; ++ ++ if (edp_bpc < display_bpc) { ++ DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); ++ display_bpc = edp_bpc; ++ } ++ continue; ++ } ++ + /* + * HDMI is either 12 or 8, so if the display lets 10bpc sneak + * through, clamp it down. (Note: >12bpc will be caught below.) diff --git a/queue-3.6/edac-fix-the-dimm-filling-for-csrows-based-layouts.patch b/queue-3.6/edac-fix-the-dimm-filling-for-csrows-based-layouts.patch new file mode 100644 index 00000000000..704b6e08604 --- /dev/null +++ b/queue-3.6/edac-fix-the-dimm-filling-for-csrows-based-layouts.patch @@ -0,0 +1,104 @@ +From 24bef66e74d647aebd34e0bef7693512b7912029 Mon Sep 17 00:00:00 2001 +From: Mauro Carvalho Chehab +Date: Wed, 24 Oct 2012 10:30:01 -0200 +Subject: edac: Fix the dimm filling for csrows-based layouts + +From: Mauro Carvalho Chehab + +commit 24bef66e74d647aebd34e0bef7693512b7912029 upstream. + +The driver is currently filling data in a wrong way, on drivers +for csrows-based memory controller, when the first layer is a +csrow. + +This is not easily to notice, as, in general, memories are +filed in dual, interleaved, symetric mode, as very few memory +controllers support asymetric modes. + +While digging into a bug for i82795_edac driver, the asymetric +mode there is now working, allowing us to fill the machine with +4x1GB ranks at channel 0, and 2x512GB at channel 1: + +Channel 0 ranks: +EDAC DEBUG: i82975x_init_csrows: DIMM A0: from page 0x00000000 to 0x0003ffff (size: 0x00040000 pages) +EDAC DEBUG: i82975x_init_csrows: DIMM A1: from page 0x00040000 to 0x0007ffff (size: 0x00040000 pages) +EDAC DEBUG: i82975x_init_csrows: DIMM A2: from page 0x00080000 to 0x000bffff (size: 0x00040000 pages) +EDAC DEBUG: i82975x_init_csrows: DIMM A3: from page 0x000c0000 to 0x000fffff (size: 0x00040000 pages) + +Channel 1 ranks: +EDAC DEBUG: i82975x_init_csrows: DIMM B0: from page 0x00100000 to 0x0011ffff (size: 0x00020000 pages) +EDAC DEBUG: i82975x_init_csrows: DIMM B1: from page 0x00120000 to 0x0013ffff (size: 0x00020000 pages) + +Instead of properly showing the memories as such, before this patch, it +shows the memory layout as: + + +-----------------------------------+ + | mc0 | + | csrow0 | csrow1 | csrow2 | +----------+-----------------------------------+ +channel1: | 1024 MB | 1024 MB | 512 MB | +channel0: | 1024 MB | 1024 MB | 512 MB | +----------+-----------------------------------+ + +as if both channels were symetric, grouping the DIMMs on a wrong +layout. + +After this patch, the memory is correctly represented. +So, for csrows at layers[0], it shows: + + +-----------------------------------------------+ + | mc0 | + | csrow0 | csrow1 | csrow2 | csrow3 | +----------+-----------------------------------------------+ +channel1: | 512 MB | 512 MB | 0 MB | 0 MB | +channel0: | 1024 MB | 1024 MB | 1024 MB | 1024 MB | +----------+-----------------------------------------------+ + +For csrows at layers[1], it shows: + + +-----------------------+ + | mc0 | + | channel0 | channel1 | +--------+-----------------------+ +csrow3: | 1024 MB | 0 MB | +csrow2: | 1024 MB | 0 MB | +--------+-----------------------+ +csrow1: | 1024 MB | 512 MB | +csrow0: | 1024 MB | 512 MB | +--------+-----------------------+ + +So, no matter of what comes first, the information between +channel and csrow will be properly represented. + +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: CAI Qian +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/edac/edac_mc.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +--- a/drivers/edac/edac_mc.c ++++ b/drivers/edac/edac_mc.c +@@ -416,10 +416,18 @@ struct mem_ctl_info *edac_mc_alloc(unsig + dimm->cschannel = chn; + + /* Increment csrow location */ +- row++; +- if (row == tot_csrows) { +- row = 0; ++ if (layers[0].is_virt_csrow) { + chn++; ++ if (chn == tot_channels) { ++ chn = 0; ++ row++; ++ } ++ } else { ++ row++; ++ if (row == tot_csrows) { ++ row = 0; ++ chn++; ++ } + } + + /* Increment dimm location */ diff --git a/queue-3.6/i82975x_edac-fix-dimm-label-initialization.patch b/queue-3.6/i82975x_edac-fix-dimm-label-initialization.patch new file mode 100644 index 00000000000..a3096cd9803 --- /dev/null +++ b/queue-3.6/i82975x_edac-fix-dimm-label-initialization.patch @@ -0,0 +1,79 @@ +From 479696840239e0cc43efb3c917bdcad2174d2215 Mon Sep 17 00:00:00 2001 +From: Mauro Carvalho Chehab +Date: Mon, 15 Oct 2012 21:48:48 -0300 +Subject: i82975x_edac: Fix dimm label initialization + +From: Mauro Carvalho Chehab + +commit 479696840239e0cc43efb3c917bdcad2174d2215 upstream. + +The driver has only 4 hardcoded labels, but allows much more memory. +Fix it by removing the hardcoded logic, using snprintf() instead. + +[ 19.833972] general protection fault: 0000 [#1] SMP +[ 19.837733] Modules linked in: i82975x_edac(+) edac_core firewire_ohci firewire_core crc_itu_t nouveau mxm_wmi wmi video i2c_algo_bit drm_kms_helper ttm drm i2c_core +[ 19.837733] CPU 0 +[ 19.837733] Pid: 390, comm: udevd Not tainted 3.6.1-1.fc17.x86_64.debug #1 Dell Inc. Precision WorkStation 390 /0MY510 +[ 19.837733] RIP: 0010:[] [] strncpy+0x18/0x30 +[ 19.837733] RSP: 0018:ffff880078535b68 EFLAGS: 00010202 +[ 19.837733] RAX: ffff880069fa9708 RBX: ffff880078588000 RCX: ffff880069fa9708 +[ 19.837733] RDX: 000000000000001f RSI: 5f706f5f63616465 RDI: ffff880069fa9708 +[ 19.837733] RBP: ffff880078535b68 R08: ffff880069fa9727 R09: 000000000000fffe +[ 19.837733] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000003 +[ 19.837733] R13: 0000000000000000 R14: ffff880069fa9290 R15: ffff880079624a80 +[ 19.837733] FS: 00007f3de01ee840(0000) GS:ffff88007c400000(0000) knlGS:0000000000000000 +[ 19.837733] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 19.837733] CR2: 00007f3de00b9000 CR3: 0000000078dbc000 CR4: 00000000000007f0 +[ 19.837733] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 +[ 19.837733] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 +[ 19.837733] Process udevd (pid: 390, threadinfo ffff880078534000, task ffff880079642450) +[ 19.837733] Stack: +[ 19.837733] ffff880078535c18 ffffffffa017c6b8 00040000816d627f ffff880079624a88 +[ 19.837733] ffffc90004cd6000 ffff880079624520 ffff88007ac21148 0000000000000000 +[ 19.837733] 0000000000000000 0004000000000000 feda000078535bc8 ffffffff810d696d +[ 19.837733] Call Trace: +[ 19.837733] [] i82975x_init_one+0x2e6/0x3e6 [i82975x_edac] +... + +Fix bug reported at: + https://bugzilla.redhat.com/show_bug.cgi?id=848149 +And, very likely: + https://bbs.archlinux.org/viewtopic.php?id=148033 + https://bugzilla.kernel.org/show_bug.cgi?id=47171 + +Cc: Alan Cox +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: CAI Qian +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/edac/i82975x_edac.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +--- a/drivers/edac/i82975x_edac.c ++++ b/drivers/edac/i82975x_edac.c +@@ -370,10 +370,6 @@ static enum dev_type i82975x_dram_type(v + static void i82975x_init_csrows(struct mem_ctl_info *mci, + struct pci_dev *pdev, void __iomem *mch_window) + { +- static const char *labels[4] = { +- "DIMM A1", "DIMM A2", +- "DIMM B1", "DIMM B2" +- }; + struct csrow_info *csrow; + unsigned long last_cumul_size; + u8 value; +@@ -423,9 +419,10 @@ static void i82975x_init_csrows(struct m + dimm = mci->csrows[index]->channels[chan]->dimm; + + dimm->nr_pages = nr_pages / csrow->nr_channels; +- strncpy(csrow->channels[chan]->dimm->label, +- labels[(index >> 1) + (chan * 2)], +- EDAC_MC_LABEL_LEN); ++ ++ snprintf(csrow->channels[chan]->dimm->label, EDAC_MC_LABEL_LEN, "DIMM %c%d", ++ (chan == 0) ? 'A' : 'B', ++ index); + dimm->grain = 1 << 7; /* 128Byte cache-line resolution */ + dimm->dtype = i82975x_dram_type(mch_window, index); + dimm->mtype = MEM_DDR2; /* I82975x supports only DDR2 */ diff --git a/queue-3.6/input-matrix-keymap-provide-proper-module-license.patch b/queue-3.6/input-matrix-keymap-provide-proper-module-license.patch new file mode 100644 index 00000000000..54796b3e43c --- /dev/null +++ b/queue-3.6/input-matrix-keymap-provide-proper-module-license.patch @@ -0,0 +1,39 @@ +From 55220bb3e5f917dd5fee1153c612f9a83599f639 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Mon, 10 Dec 2012 12:25:32 -0800 +Subject: Input: matrix-keymap - provide proper module license + +From: Florian Fainelli + +commit 55220bb3e5f917dd5fee1153c612f9a83599f639 upstream. + +The matrix-keymap module is currently lacking a proper module license, +add one so we don't have this module tainting the entire kernel. This +issue has been present since commit 1932811f426f ("Input: matrix-keymap +- uninline and prepare for device tree support") + +Signed-off-by: Florian Fainelli +Signed-off-by: Dmitry Torokhov +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/input/matrix-keymap.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/input/matrix-keymap.c ++++ b/drivers/input/matrix-keymap.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + #include + + static bool matrix_keypad_map_key(struct input_dev *input_dev, +@@ -161,3 +162,5 @@ int matrix_keypad_build_keymap(const str + return 0; + } + EXPORT_SYMBOL(matrix_keypad_build_keymap); ++ ++MODULE_LICENSE("GPL"); diff --git a/queue-3.6/series b/queue-3.6/series index e801151af36..414e501153d 100644 --- a/queue-3.6/series +++ b/queue-3.6/series @@ -2,3 +2,11 @@ tmpfs-fix-shared-mempolicy-leak.patch revert-misapplied-mmc-sh-mmcif-avoid-oops-on-spurious-interrupts.patch mmc-sh-mmcif-avoid-oops-on-spurious-interrupts-second-try.patch arm-7566-1-vfp-fix-save-and-restore-when-running-on-pre-vfpv3-and-config_vfpv3-set.patch +asoc-dmaengine-correct-makefile-when-sound-is-built-as-module.patch +staging-ipack-bridges-tpci200-avoid-kernel-bug-when-uninstalling-a-device.patch +input-matrix-keymap-provide-proper-module-license.patch +i82975x_edac-fix-dimm-label-initialization.patch +edac-fix-the-dimm-filling-for-csrows-based-layouts.patch +workqueue-convert-bug_on-s-in-__queue_delayed_work-to-warn_on_once-s.patch +drm-i915-do-not-ignore-edp-bpc-settings-from-vbt.patch +drm-i915-do-not-default-to-18-bpp-for-edp-if-missing-from-vbt.patch diff --git a/queue-3.6/staging-ipack-bridges-tpci200-avoid-kernel-bug-when-uninstalling-a-device.patch b/queue-3.6/staging-ipack-bridges-tpci200-avoid-kernel-bug-when-uninstalling-a-device.patch new file mode 100644 index 00000000000..9169feae990 --- /dev/null +++ b/queue-3.6/staging-ipack-bridges-tpci200-avoid-kernel-bug-when-uninstalling-a-device.patch @@ -0,0 +1,28 @@ +From 9e58d05a1b24d2c0471c3b4df8f473a7543d7647 Mon Sep 17 00:00:00 2001 +From: Samuel Iglesias Gonsálvez +Date: Fri, 20 Jul 2012 09:39:03 +0200 +Subject: Staging: ipack/bridges/tpci200: avoid kernel bug when uninstalling a device + +From: Samuel Iglesias Gonsálvez + +commit 9e58d05a1b24d2c0471c3b4df8f473a7543d7647 upstream. + +Signed-off-by: Samuel Iglesias Gonsálvez +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/ipack/bridges/tpci200.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/staging/ipack/bridges/tpci200.c ++++ b/drivers/staging/ipack/bridges/tpci200.c +@@ -604,8 +604,8 @@ static int tpci200_slot_unregister(struc + if (mutex_lock_interruptible(&tpci200->mutex)) + return -ERESTARTSYS; + +- ipack_device_unregister(dev); + tpci200->slots[dev->slot].dev = NULL; ++ ipack_device_unregister(dev); + mutex_unlock(&tpci200->mutex); + + return 0; diff --git a/queue-3.6/workqueue-convert-bug_on-s-in-__queue_delayed_work-to-warn_on_once-s.patch b/queue-3.6/workqueue-convert-bug_on-s-in-__queue_delayed_work-to-warn_on_once-s.patch new file mode 100644 index 00000000000..a5d72ee6c2d --- /dev/null +++ b/queue-3.6/workqueue-convert-bug_on-s-in-__queue_delayed_work-to-warn_on_once-s.patch @@ -0,0 +1,47 @@ +From fc4b514f2727f74a4587c31db87e0e93465518c3 Mon Sep 17 00:00:00 2001 +From: Tejun Heo +Date: Tue, 4 Dec 2012 07:40:39 -0800 +Subject: workqueue: convert BUG_ON()s in __queue_delayed_work() to WARN_ON_ONCE()s + +From: Tejun Heo + +commit fc4b514f2727f74a4587c31db87e0e93465518c3 upstream. + +8852aac25e ("workqueue: mod_delayed_work_on() shouldn't queue timer on +0 delay") unexpectedly uncovered a very nasty abuse of delayed_work in +megaraid - it allocated work_struct, casted it to delayed_work and +then pass that into queue_delayed_work(). + +Previously, this was okay because 0 @delay short-circuited to +queue_work() before doing anything with delayed_work. 8852aac25e +moved 0 @delay test into __queue_delayed_work() after sanity check on +delayed_work making megaraid trigger BUG_ON(). + +Although megaraid is already fixed by c1d390d8e6 ("megaraid: fix +BUG_ON() from incorrect use of delayed work"), this patch converts +BUG_ON()s in __queue_delayed_work() to WARN_ON_ONCE()s so that such +abusers, if there are more, trigger warning but don't crash the +machine. + +Signed-off-by: Tejun Heo +Cc: Xiaotian Feng +Signed-off-by: Shuah Khan +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/workqueue.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -1143,8 +1143,8 @@ int queue_delayed_work_on(int cpu, struc + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { + unsigned int lcpu; + +- BUG_ON(timer_pending(timer)); +- BUG_ON(!list_empty(&work->entry)); ++ WARN_ON_ONCE(timer_pending(timer)); ++ WARN_ON_ONCE(!list_empty(&work->entry)); + + timer_stats_timer_set_start_info(&dwork->timer); +