]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.17-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Dec 2014 23:57:06 +0000 (15:57 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Dec 2014 23:57:06 +0000 (15:57 -0800)
added patches:
bnx2fc-do-not-add-shared-skbs-to-the-fcoe_rx_list.patch
clk-divider-fix-read_only-when-divider-1.patch
irqchip-atmel-aic-fix-irqdomain-initialization.patch

queue-3.17/bnx2fc-do-not-add-shared-skbs-to-the-fcoe_rx_list.patch [new file with mode: 0644]
queue-3.17/clk-divider-fix-read_only-when-divider-1.patch [new file with mode: 0644]
queue-3.17/irqchip-atmel-aic-fix-irqdomain-initialization.patch [new file with mode: 0644]
queue-3.17/series

diff --git a/queue-3.17/bnx2fc-do-not-add-shared-skbs-to-the-fcoe_rx_list.patch b/queue-3.17/bnx2fc-do-not-add-shared-skbs-to-the-fcoe_rx_list.patch
new file mode 100644 (file)
index 0000000..d8c51d0
--- /dev/null
@@ -0,0 +1,72 @@
+From 01a4cc4d0cd6a836c7b923760e8eb1cbb6a47258 Mon Sep 17 00:00:00 2001
+From: Maurizio Lombardi <mlombard@redhat.com>
+Date: Thu, 20 Nov 2014 11:17:33 +0100
+Subject: bnx2fc: do not add shared skbs to the fcoe_rx_list
+
+From: Maurizio Lombardi <mlombard@redhat.com>
+
+commit 01a4cc4d0cd6a836c7b923760e8eb1cbb6a47258 upstream.
+
+In some cases, the fcoe_rx_list may contains multiple instances
+of the same skb (the so called "shared skbs").
+
+the bnx2fc_l2_rcv thread is a loop that extracts a skb from the list,
+modifies (and destroys) its content and then proceed to the next one.
+The problem is that if the skb is shared, the remaining instances will
+be corrupted.
+
+The solution is to use skb_share_check() before adding the skb to the
+fcoe_rx_list.
+
+[ 6286.808725] ------------[ cut here ]------------
+[ 6286.808729] WARNING: at include/scsi/fc_frame.h:173 bnx2fc_l2_rcv_thread+0x425/0x450 [bnx2fc]()
+[ 6286.808748] Modules linked in: bnx2x(-) mdio dm_service_time bnx2fc cnic uio fcoe libfcoe 8021q garp stp mrp libfc llc scsi_transport_fc scsi_tgt sg iTCO_wdt iTCO_vendor_support coretemp kvm_intel kvm crct10dif_pclmul crc32_pclmul crc32c_intel e1000e ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper ptp cryptd hpilo serio_raw hpwdt lpc_ich pps_core ipmi_si pcspkr mfd_core ipmi_msghandler shpchp pcc_cpufreq mperf nfsd auth_rpcgss nfs_acl lockd sunrpc dm_multipath xfs libcrc32c ata_generic pata_acpi sd_mod crc_t10dif crct10dif_common mgag200 syscopyarea sysfillrect sysimgblt i2c_algo_bit ata_piix drm_kms_helper ttm drm libata i2c_core hpsa dm_mirror dm_region_hash dm_log dm_mod [last unloaded: mdio]
+[ 6286.808750] CPU: 3 PID: 1304 Comm: bnx2fc_l2_threa Not tainted 3.10.0-121.el7.x86_64 #1
+[ 6286.808750] Hardware name: HP ProLiant DL120 G7, BIOS J01 07/01/2013
+[ 6286.808752]  0000000000000000 000000000b36e715 ffff8800deba1e00 ffffffff815ec0ba
+[ 6286.808753]  ffff8800deba1e38 ffffffff8105dee1 ffffffffa05618c0 ffff8801e4c81888
+[ 6286.808754]  ffffe8ffff663868 ffff8801f402b180 ffff8801f56bc000 ffff8800deba1e48
+[ 6286.808754] Call Trace:
+[ 6286.808759]  [<ffffffff815ec0ba>] dump_stack+0x19/0x1b
+[ 6286.808762]  [<ffffffff8105dee1>] warn_slowpath_common+0x61/0x80
+[ 6286.808763]  [<ffffffff8105e00a>] warn_slowpath_null+0x1a/0x20
+[ 6286.808765]  [<ffffffffa054f415>] bnx2fc_l2_rcv_thread+0x425/0x450 [bnx2fc]
+[ 6286.808767]  [<ffffffffa054eff0>] ? bnx2fc_disable+0x90/0x90 [bnx2fc]
+[ 6286.808769]  [<ffffffff81085aef>] kthread+0xcf/0xe0
+[ 6286.808770]  [<ffffffff81085a20>] ? kthread_create_on_node+0x140/0x140
+[ 6286.808772]  [<ffffffff815fc76c>] ret_from_fork+0x7c/0xb0
+[ 6286.808773]  [<ffffffff81085a20>] ? kthread_create_on_node+0x140/0x140
+[ 6286.808774] ---[ end trace c6cdb939184ccb4e ]---
+
+Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
+Acked-by: Chad Dupuis <chad.dupuis@qlogic.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/bnx2fc/bnx2fc_fcoe.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
++++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+@@ -412,6 +412,7 @@ static int bnx2fc_rcv(struct sk_buff *sk
+       struct fc_frame_header *fh;
+       struct fcoe_rcv_info *fr;
+       struct fcoe_percpu_s *bg;
++      struct sk_buff *tmp_skb;
+       unsigned short oxid;
+       interface = container_of(ptype, struct bnx2fc_interface,
+@@ -424,6 +425,12 @@ static int bnx2fc_rcv(struct sk_buff *sk
+               goto err;
+       }
++      tmp_skb = skb_share_check(skb, GFP_ATOMIC);
++      if (!tmp_skb)
++              goto err;
++
++      skb = tmp_skb;
++
+       if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
+               printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n");
+               goto err;
diff --git a/queue-3.17/clk-divider-fix-read_only-when-divider-1.patch b/queue-3.17/clk-divider-fix-read_only-when-divider-1.patch
new file mode 100644 (file)
index 0000000..724f363
--- /dev/null
@@ -0,0 +1,109 @@
+From e6d5e7d90be92cee626d7ec16ca9b06f1eed710b Mon Sep 17 00:00:00 2001
+From: James Hogan <james.hogan@imgtec.com>
+Date: Fri, 14 Nov 2014 15:32:09 +0000
+Subject: clk-divider: Fix READ_ONLY when divider > 1
+
+From: James Hogan <james.hogan@imgtec.com>
+
+commit e6d5e7d90be92cee626d7ec16ca9b06f1eed710b upstream.
+
+Commit 79c6ab509558 (clk: divider: add CLK_DIVIDER_READ_ONLY flag) in
+v3.16 introduced the CLK_DIVIDER_READ_ONLY flag which caused the
+recalc_rate() and round_rate() clock callbacks to be omitted.
+
+However using this flag has the unfortunate side effect of causing the
+clock recalculation code when a clock rate change is attempted to always
+treat it as a pass-through clock, i.e. with a fixed divide of 1, which
+may not be the case. Child clock rates are then recalculated using the
+wrong parent rate.
+
+Therefore instead of dropping the recalc_rate() and round_rate()
+callbacks, alter clk_divider_bestdiv() to always report the current
+divider as the best divider so that it is never altered.
+
+For me the read only clock was the system clock, which divided the PLL
+rate by 2, from which both the UART and the SPI clocks were divided.
+Initial setting of the UART rate set it correctly, but when the SPI
+clock was set, the other child clocks were miscalculated. The UART clock
+was recalculated using the PLL rate as the parent rate, resulting in a
+UART new_rate of double what it should be, and a UART which spewed forth
+garbage when the rate changes were propagated.
+
+Signed-off-by: James Hogan <james.hogan@imgtec.com>
+Cc: Thomas Abraham <thomas.ab@samsung.com>
+Cc: Tomasz Figa <t.figa@samsung.com>
+Cc: Max Schwarz <max.schwarz@online.de>
+Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com>
+Signed-off-by: Michael Turquette <mturquette@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/clk/clk-divider.c    |   18 +++++++++---------
+ drivers/clk/rockchip/clk.c   |    4 +---
+ include/linux/clk-provider.h |    1 -
+ 3 files changed, 10 insertions(+), 13 deletions(-)
+
+--- a/drivers/clk/clk-divider.c
++++ b/drivers/clk/clk-divider.c
+@@ -263,6 +263,14 @@ static int clk_divider_bestdiv(struct cl
+       if (!rate)
+               rate = 1;
++      /* if read only, just return current value */
++      if (divider->flags & CLK_DIVIDER_READ_ONLY) {
++              bestdiv = readl(divider->reg) >> divider->shift;
++              bestdiv &= div_mask(divider);
++              bestdiv = _get_div(divider, bestdiv);
++              return bestdiv;
++      }
++
+       maxdiv = _get_maxdiv(divider);
+       if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) {
+@@ -361,11 +369,6 @@ const struct clk_ops clk_divider_ops = {
+ };
+ EXPORT_SYMBOL_GPL(clk_divider_ops);
+-const struct clk_ops clk_divider_ro_ops = {
+-      .recalc_rate = clk_divider_recalc_rate,
+-};
+-EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
+-
+ static struct clk *_register_divider(struct device *dev, const char *name,
+               const char *parent_name, unsigned long flags,
+               void __iomem *reg, u8 shift, u8 width,
+@@ -391,10 +394,7 @@ static struct clk *_register_divider(str
+       }
+       init.name = name;
+-      if (clk_divider_flags & CLK_DIVIDER_READ_ONLY)
+-              init.ops = &clk_divider_ro_ops;
+-      else
+-              init.ops = &clk_divider_ops;
++      init.ops = &clk_divider_ops;
+       init.flags = flags | CLK_IS_BASIC;
+       init.parent_names = (parent_name ? &parent_name: NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+--- a/drivers/clk/rockchip/clk.c
++++ b/drivers/clk/rockchip/clk.c
+@@ -89,9 +89,7 @@ struct clk *rockchip_clk_register_branch
+               div->width = div_width;
+               div->lock = lock;
+               div->table = div_table;
+-              div_ops = (div_flags & CLK_DIVIDER_READ_ONLY)
+-                                              ? &clk_divider_ro_ops
+-                                              : &clk_divider_ops;
++              div_ops = &clk_divider_ops;
+       }
+       clk = clk_register_composite(NULL, name, parent_names, num_parents,
+--- a/include/linux/clk-provider.h
++++ b/include/linux/clk-provider.h
+@@ -341,7 +341,6 @@ struct clk_divider {
+ #define CLK_DIVIDER_READ_ONLY         BIT(5)
+ extern const struct clk_ops clk_divider_ops;
+-extern const struct clk_ops clk_divider_ro_ops;
+ struct clk *clk_register_divider(struct device *dev, const char *name,
+               const char *parent_name, unsigned long flags,
+               void __iomem *reg, u8 shift, u8 width,
diff --git a/queue-3.17/irqchip-atmel-aic-fix-irqdomain-initialization.patch b/queue-3.17/irqchip-atmel-aic-fix-irqdomain-initialization.patch
new file mode 100644 (file)
index 0000000..6181599
--- /dev/null
@@ -0,0 +1,53 @@
+From 45977fe35bf014f5cf9552717e1320783398ae0d Mon Sep 17 00:00:00 2001
+From: Boris Brezillon <boris.brezillon@free-electrons.com>
+Date: Tue, 11 Nov 2014 14:33:36 +0100
+Subject: irqchip: atmel-aic: Fix irqdomain initialization
+
+From: Boris Brezillon <boris.brezillon@free-electrons.com>
+
+commit 45977fe35bf014f5cf9552717e1320783398ae0d upstream.
+
+First of all IRQCHIP_SKIP_SET_WAKE is not a valid irq_gc_flags and thus
+should not be passed as the last argument of
+irq_alloc_domain_generic_chips.
+
+Then pass the correct handler (handle_fasteoi_irq) to
+irq_alloc_domain_generic_chips instead of manually re-setting it in the
+initialization loop.
+
+And eventually initialize default irq flags to the pseudo standard:
+IRQ_REQUEST | IRQ_PROBE | IRQ_AUTOEN.
+
+Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
+Tested-by: Kevin Hilman <khilman@linaro.org>
+Fixes: b1479ebb77200 ("irqchip: atmel-aic: Add atmel AIC/AIC5 drivers")
+Link: https://lkml.kernel.org/r/1415712816-9202-1-git-send-email-boris.brezillon@free-electrons.com
+Signed-off-by: Jason Cooper <jason@lakedaemon.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/irqchip/irq-atmel-aic-common.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/irqchip/irq-atmel-aic-common.c
++++ b/drivers/irqchip/irq-atmel-aic-common.c
+@@ -217,8 +217,9 @@ struct irq_domain *__init aic_common_of_
+       }
+       ret = irq_alloc_domain_generic_chips(domain, 32, 1, name,
+-                                           handle_level_irq, 0, 0,
+-                                           IRQCHIP_SKIP_SET_WAKE);
++                                           handle_fasteoi_irq,
++                                           IRQ_NOREQUEST | IRQ_NOPROBE |
++                                           IRQ_NOAUTOEN, 0, 0);
+       if (ret)
+               goto err_domain_remove;
+@@ -230,7 +231,6 @@ struct irq_domain *__init aic_common_of_
+               gc->unused = 0;
+               gc->wake_enabled = ~0;
+               gc->chip_types[0].type = IRQ_TYPE_SENSE_MASK;
+-              gc->chip_types[0].handler = handle_fasteoi_irq;
+               gc->chip_types[0].chip.irq_eoi = irq_gc_eoi;
+               gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake;
+               gc->chip_types[0].chip.irq_shutdown = aic_common_shutdown;
index 80ffbdeae7064cf74757aff2a1f878df3fa47b45..f317f4cbd2d3c4299b3d48fc70150314233ccd6e 100644 (file)
@@ -101,3 +101,6 @@ net-ping-handle-protocol-mismatching-scenario.patch
 revert-xhci-clear-root-port-wake-on-bits-if-controller-isn-t-wake-up-capable.patch
 ixgbe-correctly-disable-vlan-filter-in-promiscuous-mode.patch
 ixgbe-fix-use-after-free-adapter-state-test-in-ixgbe_remove-ixgbe_probe.patch
+irqchip-atmel-aic-fix-irqdomain-initialization.patch
+bnx2fc-do-not-add-shared-skbs-to-the-fcoe_rx_list.patch
+clk-divider-fix-read_only-when-divider-1.patch