4.19.88-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainerPATCH 1/321 clk: meson: gxbb: let sar_adc_clk_div set the parent clock rate
In reply to Greg Kroah-HartmanFrom: Martin Blumenstingl <[email protected]>
[ Upstream commit 44b09b11b813b8550e6b976ea51593bc23bba8d1 ]
The meson-saradc driver manually sets the input clock for sar_adc_clk_sel. Update the GXBB clock driver (which is used on GXBB, GXL and GXM) so the rate settings on sar_adc_clk_div are propagated up to sar_adc_clk_sel which will let the common clock framework select the best matching parent clock if we want that.
This makes sar_adc_clk_div consistent with the axg-aoclk and g12a-aoclk drivers, which both also specify CLK_SET_RATE_PARENT.
--- drivers/clk/meson/gxbb.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/meson/gxbb.c +1 -0
@@ -836,6 +836,7 @@ static struct clk_regmap gxbb_sar_adc_clk_div = { .ops = &clk_regmap_divider_ops, .parent_names = (const char *[]){ "sar_adc_clk_sel" }, .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, }, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 10/321 pinctrl: cherryview: Allocate IRQ chip dynamic
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 67d33aecd030226f0a577eb683aaa6853ecf8f91 ]
Keeping the IRQ chip definition static shares it with multiple instances of the GPIO chip in the system. This is bad and now we get this warning from GPIO library:
"detected irqchip that is shared with multiple gpiochips: please fix the driver."
Hence, move the IRQ chip definition from being driver static into the struct intel_pinctrl. So a unique IRQ chip is used for each GPIO chip instance.
This patch is heavily based on the attachment to the bug by Christoph Marz.
Depends-on: 83b9dc11312f ("pinctrl: cherryview: Associate IRQ descriptors to irqdomain")
--- drivers/pinctrl/intel/pinctrl-cherryview.c | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/pinctrl/intel/pinctrl-cherryview.c +12 -12
@@ -157,6 +157,7 @@ struct chv_pin_context {* @pctldesc: Pin controller description * @pctldev: Pointer to the pin controller device * @chip: GPIO chip in this pin controller +* @irqchip: IRQ chip in this pin controller * @regs: MMIO registers * @intr_lines: Stores mapping between 16 HW interrupt wires and GPIO * offset (in GPIO number space)
@@ -170,6 +171,7 @@ struct chv_pinctrl {struct pinctrl_desc pctldesc;struct pinctrl_dev *pctldev;struct gpio_chip chip; +struct irq_chip irqchip;void __iomem *regs;unsigned intr_lines[16 ];const struct chv_community *community;
@@ -1477,16 +1479,6 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type)return 0 ; } -static struct irq_chip chv_gpio_irqchip = { - .name ="chv-gpio" , - .irq_startup = chv_gpio_irq_startup, - .irq_ack = chv_gpio_irq_ack, - .irq_mask = chv_gpio_irq_mask, - .irq_unmask = chv_gpio_irq_unmask, - .irq_set_type = chv_gpio_irq_type, - .flags =IRQCHIP_SKIP_SET_WAKE , -}; -static void chv_gpio_irq_handler (struct irq_desc *desc) {struct gpio_chip *gc =irq_desc_get_handler_data (desc);
@@ -1626,7 +1618,15 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) } } - ret =gpiochip_irqchip_add (chip, &chv_gpio_irqchip,0 , + pctrl->irqchip.name ="chv-gpio" ; + pctrl->irqchip.irq_startup = chv_gpio_irq_startup; + pctrl->irqchip.irq_ack = chv_gpio_irq_ack; + pctrl->irqchip.irq_mask = chv_gpio_irq_mask; + pctrl->irqchip.irq_unmask = chv_gpio_irq_unmask; + pctrl->irqchip.irq_set_type = chv_gpio_irq_type; + pctrl->irqchip.flags =IRQCHIP_SKIP_SET_WAKE ; + + ret =gpiochip_irqchip_add (chip, &pctrl->irqchip,0 , handle_bad_irq,IRQ_TYPE_NONE );if (ret) {dev_err (pctrl->dev,"failed to add IRQ chip\n" );
@@ -1643,7 +1643,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) } } -gpiochip_set_chained_irqchip (chip, &chv_gpio_irqchip, irq, +gpiochip_set_chained_irqchip (chip, &pctrl->irqchip, irq, chv_gpio_irq_handler);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 12/321 reset: fix reset_control_ops kerneldoc comment
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit f430c7ed8bc22992ed528b518da465b060b9223f ]
Add a missing short description to the reset_control_ops documentation.
--- include/linux/reset-controller.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/reset-controller.h +1 -1
@@ -7,7 +7,7 @@struct reset_controller_dev ;/** -* struct reset_control_ops +* struct reset_control_ops - reset controller driver callbacks * * @reset: for self-deasserting resets, does all necessary * things to reset the device
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 13/321 clk: at91: avoid sleeping early
In reply to Greg Kroah-HartmanFrom: Alexandre Belloni <[email protected]>
[ Upstream commit 658fd65cf0b0d511de1718e48d9a28844c385ae0 ]
It is not allowed to sleep to early in the boot process and this may lead to kernel issues if the bootloader didn't prepare the slow clock and main clock.
This results in the following error and dump stack on the AriettaG25:
bad: scheduling from the idle thread!
Ensure it is possible to sleep, else simply have a delay.
--- drivers/clk/at91/clk-main.c | 5 ++++- drivers/clk/at91/sckc.c | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-)
drivers/clk/at91/clk-main.c +4 -1
@@ -354,7 +354,10 @@ static int clk_main_probe_frequency(struct regmap *regmap)regmap_read (regmap,AT91_CKGR_MCFR , &mcfr);if (mcfr &AT91_PMC_MAINRDY )return 0 ; -usleep_range (MAINF_LOOP_MIN_WAIT ,MAINF_LOOP_MAX_WAIT ); +if (system_state <SYSTEM_RUNNING ) +udelay (MAINF_LOOP_MIN_WAIT ); +else +usleep_range (MAINF_LOOP_MIN_WAIT ,MAINF_LOOP_MAX_WAIT ); }while (time_before (prep_time, timeout));return -ETIMEDOUT ;
drivers/clk/at91/sckc.c +16 -4
@@ -74,7 +74,10 @@ static int clk_slow_osc_prepare(struct clk_hw *hw)writel (tmp |AT91_SCKC_OSC32EN , sckcr); -usleep_range (osc->startup_usec, osc->startup_usec +1 ); +if (system_state <SYSTEM_RUNNING ) +udelay (osc->startup_usec); +else +usleep_range (osc->startup_usec, osc->startup_usec +1 );return 0 ; }
@@ -197,7 +200,10 @@ static int clk_slow_rc_osc_prepare(struct clk_hw *hw)writel (readl (sckcr) |AT91_SCKC_RCEN , sckcr); -usleep_range (osc->startup_usec, osc->startup_usec +1 ); +if (system_state <SYSTEM_RUNNING ) +udelay (osc->startup_usec); +else +usleep_range (osc->startup_usec, osc->startup_usec +1 );return 0 ; }
@@ -310,7 +316,10 @@ static int clk_sam9x5_slow_set_parent(struct clk_hw *hw, u8 index)writel (tmp, sckcr); -usleep_range (SLOWCK_SW_TIME_USEC ,SLOWCK_SW_TIME_USEC +1 ); +if (system_state <SYSTEM_RUNNING ) +udelay (SLOWCK_SW_TIME_USEC ); +else +usleep_range (SLOWCK_SW_TIME_USEC ,SLOWCK_SW_TIME_USEC +1 );return 0 ; }
@@ -443,7 +452,10 @@ static int clk_sama5d4_slow_osc_prepare(struct clk_hw *hw)return 0 ; } -usleep_range (osc->startup_usec, osc->startup_usec +1 ); +if (system_state <SYSTEM_RUNNING ) +udelay (osc->startup_usec); +else +usleep_range (osc->startup_usec, osc->startup_usec +1 ); osc->prepared = true;return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 11/321 ARM: dts: imx6qdl-sabreauto: Fix storm of accelerometer interrupts
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 7e5d0bf6afcc7bd72f78e7f33570e2e0945624f0 ]
Since commit a211b8c55f3c ("ARM: dts: imx6qdl-sabreauto: Add sensors") a storm of accelerometer interrupts is seen:
[ 114.211283] irq 260: nobody cared (try booting with the "irqpoll" option) [ 114.218108] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.3.4 #1 [ 114.223960] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) [ 114.230531] [<c0112858>] (unwind_backtrace) from [<c010cdc8>] (show_stack+0x10/0x14) [ 114.238301] [<c010cdc8>] (show_stack) from [<c0c1aa1c>] (dump_stack+0xd8/0x110) [ 114.245644] [<c0c1aa1c>] (dump_stack) from [<c0193594>] (__report_bad_irq+0x30/0xc0) [ 114.253417] [<c0193594>] (__report_bad_irq) from [<c01933ac>] (note_interrupt+0x108/0x298) [ 114.261707] [<c01933ac>] (note_interrupt) from [<c018ffe4>] (handle_irq_event_percpu+0x70/0x80) [ 114.270433] [<c018ffe4>] (handle_irq_event_percpu) from [<c019002c>] (handle_irq_event+0x38/0x5c) [ 114.279326] [<c019002c>] (handle_irq_event) from [<c019438c>] (handle_level_irq+0xc8/0x154) [ 114.287701] [<c019438c>] (handle_level_irq) from [<c018eda0>] (generic_handle_irq+0x20/0x34) [ 114.296166] [<c018eda0>] (generic_handle_irq) from [<c0534214>] (mxc_gpio_irq_handler+0x30/0xf0) [ 114.304975] [<c0534214>] (mxc_gpio_irq_handler) from [<c0534334>] (mx3_gpio_irq_handler+0x60/0xb0) [ 114.313955] [<c0534334>] (mx3_gpio_irq_handler) from [<c018eda0>] (generic_handle_irq+0x20/0x34) [ 114.322762] [<c018eda0>] (generic_handle_irq) from [<c018f3ac>] (__handle_domain_irq+0x64/0xe0) [ 114.331485] [<c018f3ac>] (__handle_domain_irq) from [<c05215a8>] (gic_handle_irq+0x4c/0xa8) [ 114.339862] [<c05215a8>] (gic_handle_irq) from [<c0101a70>] (__irq_svc+0x70/0x98) [ 114.347361] Exception stack(0xc1301ec0 to 0xc1301f08) [ 114.352435] 1ec0: 00000001 00000006 00000000 c130c340 00000001 c130f688 9785636d c13ea2e8 [ 114.360635] 1ee0: 9784907d 0000001a eaf99d78 0000001a 00000000 c1301f10 c0182b00 c0878de4 [ 114.368830] 1f00: 20000013 ffffffff [ 114.372349] [<c0101a70>] (__irq_svc) from [<c0878de4>] (cpuidle_enter_state+0x168/0x5f4) [ 114.380464] [<c0878de4>] (cpuidle_enter_state) from [<c08792ac>] (cpuidle_enter+0x28/0x38) [ 114.388751] [<c08792ac>] (cpuidle_enter) from [<c015ef9c>] (do_idle+0x224/0x2a8) [ 114.396168] [<c015ef9c>] (do_idle) from [<c015f3b8>] (cpu_startup_entry+0x18/0x20) [ 114.403765] [<c015f3b8>] (cpu_startup_entry) from [<c1200e54>] (start_kernel+0x43c/0x500) [ 114.411958] handlers: [ 114.414302] [<a01028b8>] irq_default_primary_handler threaded [<fd7a3b08>] mma8452_interrupt [ 114.422974] Disabling IRQ #260
CPU0 CPU1
....
260: 100001 0 gpio-mxc 31 Level mma8451
The MMA8451 interrupt triggers as low level, so the GPIO6_IO31 pin needs to activate its pull up, otherwise it will stay always at low level generating multiple interrupts.
The current device tree does not configure the IOMUX for this pin, so it uses whathever comes configured from the bootloader.
The IOMUXC_SW_PAD_CTL_PAD_EIM_BCLK register value comes as 0x8000 from the bootloader, which has PKE bit cleared, hence disabling the pull-up.
Instead of relying on a previous configuration from the bootloader, configure the GPIO6_IO31 pin with pull-up enabled in order to fix this problem.
--- arch/arm/boot/dts/imx6qdl-sabreauto.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/boot/dts/imx6qdl-sabreauto.dtsi +8 -0
@@ -177,6 +177,8 @@ accelerometer@1c { compatible = "fsl,mma8451"; reg = <0x1c>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_mma8451_int>; interrupt-parent = <&gpio6>; interrupts = <31 IRQ_TYPE_LEVEL_LOW>; };
@@ -522,6 +524,12 @@ >; }; + pinctrl_mma8451_int: mma8451intgrp { + fsl,pins = < + MX6QDL_PAD_EIM_BCLK__GPIO6_IO31 0xb0b1 + >; + }; + pinctrl_pwm3: pwm1grp { fsl,pins = < MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x1b0b1
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 14/321 clk: sunxi: Fix operator precedence in sunxi_divs_clk_setup
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit afdc74ed2d57e86c10b1d6831339770a802bab9a ]
r375326 in Clang exposes an issue with operator precedence in sunxi_div_clk_setup:
drivers/clk/sunxi/clk-sunxi.c:1083:30: warning: operator '?:' has lower precedence than '|'; '|' will be evaluated first [-Wbitwise-conditional-parentheses]
data->div[i].critical ?
~~~~~~~~~~~~~~~~~~~~~ ^
drivers/clk/sunxi/clk-sunxi.c:1083:30: note: place parentheses around
the '|' expression to silence this warning
data->div[i].critical ?
^
)
drivers/clk/sunxi/clk-sunxi.c:1083:30: note: place parentheses around
the '?:' expression to evaluate it first
data->div[i].critical ?
^
(1 warning generated.
It appears that the intention was for ?: to be evaluated first so that CLK_IS_CRITICAL could be added to clkflags if the critical boolean was set; right now, | is being evaluated first. Add parentheses around the ?: block to have it be evaluated first.
--- drivers/clk/sunxi/clk-sunxi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/sunxi/clk-sunxi.c +2 -2
@@ -1086,8 +1086,8 @@ static struct clk ** __init sunxi_divs_clk_setup(struct device_node *node, rate_hw, rate_ops, gate_hw, &clk_gate_ops, clkflags | - data->div[i].critical ? - CLK_IS_CRITICAL : 0); + (data->div[i].critical ? + CLK_IS_CRITICAL : 0));WARN_ON (IS_ERR (clk_data->clks[i])); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 16/321 ARM: dts: sun8i-a83t-tbs-a711: Fix WiFi resume from suspend
In reply to Greg Kroah-HartmanFrom: Ondrej Jirman <[email protected]>
[ Upstream commit e614f341253f8541baf0230a8dc6a016b544b1e2 ]
Without enabling keep-power-in-suspend, we can't wake the device up using WOL packet, and the log is flooded with these messages on resume:
sunxi-mmc 1c10000.mmc: send stop command failed sunxi-mmc 1c10000.mmc: data error, sending stop command sunxi-mmc 1c10000.mmc: send stop command failed sunxi-mmc 1c10000.mmc: data error, sending stop command
So to make the WiFi really a wakeup-source, we need to keep it powered during suspend.
--- arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts +1 -0
@@ -171,6 +171,7 @@ vqmmc-supply = <®_dldo1>; non-removable; wakeup-source; + keep-power-in-suspend; status = "okay"; brcmf: wifi@1 {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 17/321 samples/bpf: fix build by setting HAVE_ATTR_TEST to zero
In reply to Greg Kroah-HartmanFrom: Björn Töpel <[email protected]>
[ Upstream commit 04ec044b7d30800296824783df7d9728d16d7567 ]
To remove that test_attr__{enabled/open} are used by perf-sys.h, we set HAVE_ATTR_TEST to zero.
--- samples/bpf/Makefile | 1 + 1 file changed, 1 insertion(+)
samples/bpf/Makefile +1 -0
@@ -172,6 +172,7 @@ KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/ KBUILD_HOSTCFLAGS += -I$(srctree)/tools/testing/selftests/bpf/ KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/ -I$(srctree)/tools/include KBUILD_HOSTCFLAGS += -I$(srctree)/tools/perf +KBUILD_HOSTCFLAGS += -DHAVE_ATTR_TEST=0 HOSTCFLAGS_bpf_load.o += -I$(objtree)/usr/include -Wno-unused-variable HOSTCFLAGS_trace_helpers.o += -I$(srctree)/tools/lib/bpf/
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 2/321 clocksource/drivers/mediatek: Fix error handling
In reply to Greg Kroah-HartmanFrom: Fabien Parent <[email protected]>
[ Upstream commit 41d49e7939de5ec532d86494185b2ca2e99c848a ]
When timer_of_init fails, it cleans up after itself by undoing everything it did during the initialization function.
mtk_syst_init and mtk_gpt_init both call timer_of_cleanup if timer_of_init fails. timer_of_cleanup try to release the resource taken. Since these resources have already been cleaned up by timer_of_init, we end up getting a few warnings printed:
[ 0.001935] WARNING: CPU: 0 PID: 0 at __clk_put+0xe8/0x128 [ 0.002650] Modules linked in: [ 0.003058] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.19.67+ #1 [ 0.003852] Hardware name: MediaTek MT8183 (DT) [ 0.004446] pstate: 20400085 (nzCv daIf +PAN -UAO) [ 0.005073] pc : __clk_put+0xe8/0x128 [ 0.005555] lr : clk_put+0xc/0x14 [ 0.005988] sp : ffffff80090b3ea0 [ 0.006422] x29: ffffff80090b3ea0 x28: 0000000040e20018 [ 0.007121] x27: ffffffc07bfff780 x26: 0000000000000001 [ 0.007819] x25: ffffff80090bda80 x24: ffffff8008ec5828 [ 0.008517] x23: ffffff80090bd000 x22: ffffff8008d8b2e8 [ 0.009216] x21: 0000000000000001 x20: fffffffffffffdfb [ 0.009914] x19: ffffff8009166180 x18: 00000000002bffa8 [ 0.010612] x17: ffffffc012996980 x16: 0000000000000000 [ 0.011311] x15: ffffffbf004a6800 x14: 3536343038393334 [ 0.012009] x13: 2079726576652073 x12: 7eb9c62c5c38f100 [ 0.012707] x11: ffffff80090b3ba0 x10: ffffff80090b3ba0 [ 0.013405] x9 : 0000000000000004 x8 : 0000000000000040 [ 0.014103] x7 : ffffffc079400270 x6 : 0000000000000000 [ 0.014801] x5 : ffffffc079400248 x4 : 0000000000000000 [ 0.015499] x3 : 0000000000000000 x2 : 0000000000000000 [ 0.016197] x1 : ffffff80091661c0 x0 : fffffffffffffdfb [ 0.016896] Call trace: [ 0.017218] __clk_put+0xe8/0x128 [ 0.017654] clk_put+0xc/0x14 [ 0.018048] timer_of_cleanup+0x60/0x7c [ 0.018551] mtk_syst_init+0x8c/0x9c [ 0.019020] timer_probe+0x6c/0xe0 [ 0.019469] time_init+0x14/0x44 [ 0.019893] start_kernel+0x2d0/0x46c [ 0.020378] ---[ end trace 8c1efabea1267649 ]--- [ 0.020982] ------------[ cut here ]------------ [ 0.021586] Trying to vfree() nonexistent vm area ((____ptrval____)) [ 0.022427] WARNING: CPU: 0 PID: 0 at __vunmap+0xd0/0xd8 [ 0.023119] Modules linked in: [ 0.023524] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W 4.19.67+ #1 [ 0.024498] Hardware name: MediaTek MT8183 (DT) [ 0.025091] pstate: 60400085 (nZCv daIf +PAN -UAO) [ 0.025718] pc : __vunmap+0xd0/0xd8 [ 0.026176] lr : __vunmap+0xd0/0xd8 [ 0.026632] sp : ffffff80090b3e90 [ 0.027066] x29: ffffff80090b3e90 x28: 0000000040e20018 [ 0.027764] x27: ffffffc07bfff780 x26: 0000000000000001 [ 0.028462] x25: ffffff80090bda80 x24: ffffff8008ec5828 [ 0.029160] x23: ffffff80090bd000 x22: ffffff8008d8b2e8 [ 0.029858] x21: 0000000000000000 x20: 0000000000000000 [ 0.030556] x19: ffffff800800d000 x18: 00000000002bffa8 [ 0.031254] x17: 0000000000000000 x16: 0000000000000000 [ 0.031952] x15: ffffffbf004a6800 x14: 3536343038393334 [ 0.032651] x13: 2079726576652073 x12: 7eb9c62c5c38f100 [ 0.033349] x11: ffffff80090b3b40 x10: ffffff80090b3b40 [ 0.034047] x9 : 0000000000000005 x8 : 5f5f6c6176727470 [ 0.034745] x7 : 5f5f5f5f28282061 x6 : ffffff80091c86ef [ 0.035443] x5 : ffffff800852b690 x4 : 0000000000000000 [ 0.036141] x3 : 0000000000000002 x2 : 0000000000000002 [ 0.036839] x1 : 7eb9c62c5c38f100 x0 : 7eb9c62c5c38f100 [ 0.037536] Call trace: [ 0.037859] __vunmap+0xd0/0xd8 [ 0.038271] vunmap+0x24/0x30 [ 0.038664] __iounmap+0x2c/0x34 [ 0.039088] timer_of_cleanup+0x70/0x7c [ 0.039591] mtk_syst_init+0x8c/0x9c [ 0.040060] timer_probe+0x6c/0xe0 [ 0.040507] time_init+0x14/0x44 [ 0.040932] start_kernel+0x2d0/0x46c
This commit remove the calls to timer_of_cleanup when timer_of_init fails since it is unnecessary and actually cause warnings to be printed.
--- drivers/clocksource/timer-mediatek.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/clocksource/timer-mediatek.c +2 -8
@@ -277,15 +277,12 @@ static int __init mtk_syst_init(struct device_node *node) ret =timer_of_init (node, &to);if (ret) - goto err; +return ret;clockevents_config_and_register (&to.clkevt,timer_of_rate (&to),TIMER_SYNC_TICKS ,0xffffffff );return 0 ; -err: -timer_of_cleanup (&to); -return ret; }static int __init mtk_gpt_init (struct device_node *node)
@@ -302,7 +299,7 @@ static int __init mtk_gpt_init(struct device_node *node) ret =timer_of_init (node, &to);if (ret) - goto err; +return ret;/* Configure clock source */ mtk_gpt_setup (&to,TIMER_CLK_SRC ,GPT_CTRL_OP_FREERUN );
@@ -320,9 +317,6 @@ static int __init mtk_gpt_init(struct device_node *node)mtk_gpt_enable_irq (&to,TIMER_CLK_EVT );return 0 ; -err: -timer_of_cleanup (&to); -return ret; }TIMER_OF_DECLARE (mtk_mt6577,"mediatek,mt6577-timer" , mtk_gpt_init);TIMER_OF_DECLARE (mtk_mt6765,"mediatek,mt6765-timer" , mtk_syst_init);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 20/321 idr: Fix idr_alloc_u32 on 32-bit systems
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit b7e9728f3d7fc5c5c8508d99f1675212af5cfd49 ]
Attempting to allocate an entry at 0xffffffff when one is already present would succeed in allocating one at 2^32, which would confuse everything. Return -ENOSPC in this case, as expected.
--- lib/radix-tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/radix-tree.c +1 -1
@@ -2172,7 +2172,7 @@ void __rcu **idr_get_free(struct radix_tree_root *root, offset =radix_tree_find_next_bit (node,IDR_FREE , offset +1 ); start =next_index (start, node, offset); -if (start > max) +if (start > max || start ==0 )return ERR_PTR (-ENOSPC );while (offset ==RADIX_TREE_MAP_SIZE ) { offset = node->offset +1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 21/321 x86/resctrl: Prevent NULL pointer dereference when reading mondata
In reply to Greg Kroah-HartmanFrom: Xiaochen Shen <[email protected]>
[ Upstream commit 26467b0f8407cbd628fa5b7bcfd156e772004155 ]
When a mon group is being deleted, rdtgrp->flags is set to RDT_DELETED in rdtgroup_rmdir_mon() firstly. The structure of rdtgrp will be freed until rdtgrp->waitcount is dropped to 0 in rdtgroup_kn_unlock() later.
During the window of deleting a mon group, if an application calls rdtgroup_mondata_show() to read mondata under this mon group, 'rdtgrp' returned from rdtgroup_kn_lock_live() is a NULL pointer when rdtgrp->flags is RDT_DELETED. And then 'rdtgrp' is passed in this path:rdtgroup_mondata_show() --> mon_event_read() --> mon_event_count(). Thus it results in NULL pointer dereference in mon_event_count().
Check 'rdtgrp' in rdtgroup_mondata_show(), and return -ENOENT immediately when reading mondata during the window of deleting a mon group.
--- arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +4 -0
@@ -459,6 +459,10 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)int ret =0 ; rdtgrp =rdtgroup_kn_lock_live (of->kn); +if (!rdtgrp) { + ret = -ENOENT ; + goto out; + } md.priv = of->kn->priv; resid = md.u.rid;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 22/321 clk: ti: dra7-atl-clock: Remove ti_clk_add_alias call
In reply to Greg Kroah-HartmanFrom: Peter Ujfalusi <[email protected]>
[ Upstream commit 9982b0f69b49931b652d35f86f519be2ccfc7027 ]
ti_clk_register() calls it already so the driver should not create duplicated alias.
--- drivers/clk/ti/clk-dra7-atl.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/clk/ti/clk-dra7-atl.c +0 -6
@@ -174,7 +174,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)struct clk_init_data init = {NULL };const char **parent_names =NULL ;struct clk *clk; -int ret; clk_hw =kzalloc (sizeof (*clk_hw),GFP_KERNEL );if (!clk_hw) {
@@ -207,11 +206,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) clk =ti_clk_register (NULL , &clk_hw->hw, node->name);if (!IS_ERR (clk)) { - ret =ti_clk_add_alias (NULL , clk, node->name); -if (ret) { -clk_unregister (clk); - goto cleanup; - }of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (parent_names);return ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 23/321 clk: ti: clkctrl: Fix failed to enable error with double udelay timeout
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 81a41901ffd46bac6df4c95b8290ac259e0feda8 ]
Commit 3d8598fb9c5a ("clk: ti: clkctrl: use fallback udelay approach if timekeeping is suspended") added handling for cases when timekeeping is suspended. But looks like we can still get occasional "failed to enable" errors on the PM runtime resume path with udelay() returning faster than expected.
With ti-sysc interconnect target module driver this leads into device failure with PM runtime failing with "failed to enable" clkctrl error.
Let's fix the issue with a delay of two times the desired delay as in often done for udelay() to account for the inaccuracy.
--- drivers/clk/ti/clkctrl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/clk/ti/clkctrl.c +3 -2
@@ -100,11 +100,12 @@ static bool _omap4_is_timeout(union omap4_timeout *time, u32 timeout)* can be from a timer that requires pm_runtime access, which * will eventually bring us here with timekeeping_suspended, * during both suspend entry and resume paths. This happens -* at least on am43xx platform. +* at least on am43xx platform. Account for flakeyness +* with udelay() by multiplying the timeout value by 2. */ if (unlikely (_early_timeout || timekeeping_suspended)) {if (time->cycles++ < timeout) { -udelay (1 ); +udelay (1 *2 );return false; } }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 24/321 net: fec: add missed clk_disable_unprepare in remove
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit c43eab3eddb4c6742ac20138659a9b701822b274 ]
This driver forgets to disable and unprepare clks when remove. Add calls to clk_disable_unprepare to fix it.
--- drivers/net/ethernet/freescale/fec_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/freescale/fec_main.c +2 -0
@@ -3606,6 +3606,8 @@ fec_drv_remove(struct platform_device *pdev)regulator_disable (fep->reg_phy);pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev); +clk_disable_unprepare (fep->clk_ahb); +clk_disable_unprepare (fep->clk_ipg);if (of_phy_is_fixed_link (np))of_phy_deregister_fixed_link (np);of_node_put (fep->phy_node);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 25/321 bridge: ebtables: dont crash when using dnat target in output chains
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit b23c0742c2ce7e33ed79d10e451f70fdb5ca85d1 ]
xt_in() returns NULL in the output hook, skip the pkt_type change for that case, redirection only makes sense in broute/prerouting hooks.
--- net/bridge/netfilter/ebt_dnat.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
net/bridge/netfilter/ebt_dnat.c +15 -4
@@ -19,7 +19,6 @@ static unsigned int ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) { const struct ebt_nat_info *info = par->targinfo; -struct net_device *dev;if (!skb_make_writable (skb,0 ))return EBT_DROP ;
@@ -32,10 +31,22 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par)else skb->pkt_type =PACKET_MULTICAST ; }else { -if (xt_hooknum (par) !=NF_BR_BROUTING ) - dev =br_port_get_rcu (xt_in (par))->br->dev; -else +const struct net_device *dev; + +switch (xt_hooknum (par)) { +case NF_BR_BROUTING : dev =xt_in (par); +break ; +case NF_BR_PRE_ROUTING : + dev =br_port_get_rcu (xt_in (par))->br->dev; +break ; +default : + dev =NULL ; +break ; + } + +if (!dev)/* NF_BR_LOCAL_OUT */ +return info->target;if (ether_addr_equal (info->mac, dev->dev_addr)) skb->pkt_type =PACKET_HOST ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 26/321 can: peak_usb: report bus recovery as well
In reply to Greg Kroah-HartmanFrom: Jeroen Hofstee <[email protected]>
[ Upstream commit 128a1b87d3ceb2ba449d5aadb222fe22395adeb0 ]
While the state changes are reported when the error counters increase and decrease, there is no event when the bus recovers and the error counters decrease again. So add those as well.
Change the state going downward to be ERROR_PASSIVE -> ERROR_WARNING -> ERROR_ACTIVE instead of directly to ERROR_ACTIVE again.
--- drivers/net/can/usb/peak_usb/pcan_usb.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/net/can/usb/peak_usb/pcan_usb.c +10 -5
@@ -444,8 +444,8 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, }if ((n &PCAN_USB_ERROR_BUS_LIGHT ) ==0 ) {/* no error (back to active state) */ - mc->pdev->dev.can.state =CAN_STATE_ERROR_ACTIVE ; -return 0 ; + new_state =CAN_STATE_ERROR_ACTIVE ; +break ; }break ;
@@ -468,9 +468,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, }if ((n &PCAN_USB_ERROR_BUS_HEAVY ) ==0 ) { -/* no error (back to active state) */ - mc->pdev->dev.can.state =CAN_STATE_ERROR_ACTIVE ; -return 0 ; +/* no error (back to warning state) */ + new_state =CAN_STATE_ERROR_WARNING ; +break ; }break ;
@@ -509,6 +509,11 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, mc->pdev->dev.can.can_stats.error_warning++;break ; +case CAN_STATE_ERROR_ACTIVE : + cf->can_id |=CAN_ERR_CRTL ; + cf->data[1 ] =CAN_ERR_CRTL_ACTIVE ; +break ; +default :/* CAN_STATE_MAX (trick to handle other errors) */ cf->can_id |=CAN_ERR_CRTL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 28/321 can: rx-offload: can_rx_offload_queue_tail(): fix error handling, avoid skb mem leak
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
[ Upstream commit 6caf8a6d6586d44fd72f4aa1021d14aa82affafb ]
If the rx-offload skb_queue is full can_rx_offload_queue_tail() will not queue the skb and return with an error.
This patch frees the skb in case of a full queue, which brings can_rx_offload_queue_tail() in line with the can_rx_offload_queue_sorted() function, which has been adjusted in the previous patch.
The return value is adjusted to -ENOBUFS to better reflect the actual problem.
The device stats handling is left to the caller.
--- drivers/net/can/rx-offload.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/can/rx-offload.c +4 -2
@@ -261,8 +261,10 @@ int can_rx_offload_queue_tail(struct can_rx_offload *offload, struct sk_buff *skb) {if (skb_queue_len (&offload->skb_queue) > - offload->skb_queue_len_max) -return -ENOMEM ; + offload->skb_queue_len_max) { +kfree_skb (skb); +return -ENOBUFS ; + }skb_queue_tail (&offload->skb_queue, skb);can_rx_offload_schedule (offload);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 3/321 ASoC: msm8916-wcd-analog: Fix RX1 selection in RDAC2 MUX
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit 9110d1b0e229cebb1ffce0c04db2b22beffd513d ]
According to the PM8916 Hardware Register Description, CDC_D_CDC_CONN_HPHR_DAC_CTL has only a single bit (RX_SEL) to switch between RX1 (0) and RX2 (1). It is not possible to disable it entirely to achieve the "ZERO" state.
However, at the moment the "RDAC2 MUX" mixer defines three possible values ("ZERO", "RX2" and "RX1"). Setting the mixer to "ZERO" actually configures it to RX1. Setting the mixer to "RX1" has (seemingly) no effect.
Remove "ZERO" and replace it with "RX1" to fix this.
--- sound/soc/codecs/msm8916-wcd-analog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/msm8916-wcd-analog.c +2 -2
@@ -303,7 +303,7 @@ struct pm8916_wcd_analog_priv { };static const char *const adc2_mux_text[] = {"ZERO" ,"INP2" ,"INP3" }; -static const char *const rdac2_mux_text[] = {"ZERO" ,"RX2" ,"RX1" }; +static const char *const rdac2_mux_text[] = {"RX1" ,"RX2" };static const char *const hph_text[] = {"ZERO" ,"Switch" , }; static const struct soc_enum hph_enum = SOC_ENUM_SINGLE_VIRT(
@@ -318,7 +318,7 @@ static const struct soc_enum adc2_enum = SOC_ENUM_SINGLE_VIRT(/* RDAC2 MUX */ static const struct soc_enum rdac2_mux_enum =SOC_ENUM_SINGLE ( -CDC_D_CDC_CONN_HPHR_DAC_CTL ,0 ,3 , rdac2_mux_text); +CDC_D_CDC_CONN_HPHR_DAC_CTL ,0 ,2 , rdac2_mux_text);static const struct snd_kcontrol_new spkr_switch[] = {SOC_DAPM_SINGLE ("Switch" ,CDC_A_SPKR_DAC_CTL ,7 ,1 ,0 )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 30/321 can: rx-offload: can_rx_offload_offload_one(): increment rx_fifo_errors on queue overflow or OOM
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
[ Upstream commit 4e9016bee3bf0c24963097edace034ff205b565c ]
If the rx-offload skb_queue is full or the skb allocation fails (due to OOM), the mailbox contents is discarded.
This patch adds the incrementing of the rx_fifo_errors statistics counter.
--- drivers/net/can/rx-offload.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/can/rx-offload.c +3 -1
@@ -134,8 +134,10 @@ static struct sk_buff *can_rx_offload_offload_one(struct can_rx_offload *offload ret = offload->mailbox_read (offload, &cf_overflow, ×tamp, n); -if (ret) +if (ret) { offload->dev->stats.rx_dropped++; + offload->dev->stats.rx_fifo_errors++; + }return NULL ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 31/321 can: rx-offload: can_rx_offload_offload_one(): use ERR_PTR() to propagate error value in case of errors
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
[ Upstream commit d763ab3044f0bf50bd0e6179f6b2cf1c125d1d94 ]
Before this patch can_rx_offload_offload_one() returns a pointer to a skb containing the read CAN frame or a NULL pointer.
However the meaning of the NULL pointer is ambiguous, it can either mean the requested mailbox is empty or there was an error.
This patch fixes this situation by returning:
- pointer to skb on success
- NULL pointer if mailbox is empty
- ERR_PTR() in case of an error
All users of can_rx_offload_offload_one() have been adopted, no functional change intended.
--- drivers/net/can/rx-offload.c | 86 ++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 13 deletions(-)
drivers/net/can/rx-offload.c +73 -13
@@ -116,39 +116,95 @@ static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b)return cb_b->timestamp - cb_a->timestamp; } -static struct sk_buff *can_rx_offload_offload_one (struct can_rx_offload *offload,unsigned int n) +/** +* can_rx_offload_offload_one() - Read one CAN frame from HW +* @offload: pointer to rx_offload context +* @n: number of mailbox to read +* +* The task of this function is to read a CAN frame from mailbox @n +* from the device and return the mailbox's content as a struct +* sk_buff. +* +* If the struct can_rx_offload::skb_queue exceeds the maximal queue +* length (struct can_rx_offload::skb_queue_len_max) or no skb can be +* allocated, the mailbox contents is discarded by reading it into an +* overflow buffer. This way the mailbox is marked as free by the +* driver. +* +* Return: A pointer to skb containing the CAN frame on success. +* +* NULL if the mailbox @n is empty. +* +* ERR_PTR() in case of an error +*/ +static struct sk_buff * +can_rx_offload_offload_one (struct can_rx_offload *offload,unsigned int n) { -struct sk_buff *skb =NULL ; +struct sk_buff *skb =NULL , *skb_error =NULL ;struct can_rx_offload_cb *cb;struct can_frame *cf;int ret; -/* If queue is full or skb not available, read to discard mailbox */ if (likely (skb_queue_len (&offload->skb_queue) < - offload->skb_queue_len_max)) + offload->skb_queue_len_max)) { skb =alloc_can_skb (offload->dev, &cf); +if (unlikely (!skb)) + skb_error =ERR_PTR (-ENOMEM );/* skb alloc failed */ + }else { + skb_error =ERR_PTR (-ENOBUFS );/* skb_queue is full */ + } -if (!skb) { +/* If queue is full or skb not available, drop by reading into +* overflow buffer. +*/ +if (unlikely (skb_error)) {struct can_frame cf_overflow;u32 timestamp; ret = offload->mailbox_read (offload, &cf_overflow, ×tamp, n); -if (ret) { - offload->dev->stats.rx_dropped++; - offload->dev->stats.rx_fifo_errors++; - } -return NULL ; +/* Mailbox was empty. */ +if (unlikely (!ret)) +return NULL ; + +/* Mailbox has been read and we're dropping it or +* there was a problem reading the mailbox. +* +* Increment error counters in any case. +*/ + offload->dev->stats.rx_dropped++; + offload->dev->stats.rx_fifo_errors++; + +/* There was a problem reading the mailbox, propagate +* error value. +*/ +if (unlikely (ret <0 )) +return ERR_PTR (ret); + +return skb_error; } cb =can_rx_offload_get_cb (skb); ret = offload->mailbox_read (offload, cf, &cb->timestamp, n); -if (!ret) { + +/* Mailbox was empty. */ +if (unlikely (!ret)) {kfree_skb (skb);return NULL ; } +/* There was a problem reading the mailbox, propagate error value. */ +if (unlikely (ret <0 )) { +kfree_skb (skb); + + offload->dev->stats.rx_dropped++; + offload->dev->stats.rx_fifo_errors++; + +return ERR_PTR (ret); + } + +/* Mailbox was read. */ return skb; }
@@ -168,7 +224,7 @@ int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pencontinue ; skb =can_rx_offload_offload_one (offload, i); -if (!skb) +if (IS_ERR_OR_NULL (skb))break ;__skb_queue_add_sort (&skb_queue, skb, can_rx_offload_compare);
@@ -199,7 +255,11 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload)struct sk_buff *skb;int received =0 ; -while ((skb =can_rx_offload_offload_one (offload,0 ))) { +while (1 ) { + skb =can_rx_offload_offload_one (offload,0 ); +if (IS_ERR_OR_NULL (skb)) +break ; +skb_queue_tail (&offload->skb_queue, skb); received++; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 32/321 can: rx-offload: can_rx_offload_irq_offload_timestamp(): continue on error
In reply to Greg Kroah-HartmanFrom: Jeroen Hofstee <[email protected]>
[ Upstream commit c2a9f74c9d18acfdcabd3361adc7eac82c537a66 ]
In case of a resource shortage, i.e. the rx_offload queue will overflow or a skb fails to be allocated (due to OOM), can_rx_offload_offload_one() will call mailbox_read() to discard the mailbox and return an ERR_PTR.
However can_rx_offload_irq_offload_timestamp() bails out in the error case. In case of a resource shortage all mailboxes should be discarded, to avoid an IRQ storm and give the system some time to recover.
Since can_rx_offload_irq_offload_timestamp() is typically called from a while loop, all message will eventually be discarded. So let's continue on error instead to discard them directly.
--- drivers/net/can/rx-offload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/rx-offload.c +1 -1
@@ -225,7 +225,7 @@ int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pen skb =can_rx_offload_offload_one (offload, i);if (IS_ERR_OR_NULL (skb)) -break ; +continue ;__skb_queue_add_sort (&skb_queue, skb, can_rx_offload_compare); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 34/321 can: flexcan: increase error counters if skb enqueueing via can_rx_offload_queue_sorted() fails
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
[ Upstream commit 758124335a9dd649ab820bfb5b328170919ee7dc ]
The call to can_rx_offload_queue_sorted() may fail and return an error (in the current implementation due to resource shortage). The passed skb is consumed.
This patch adds incrementing of the appropriate error counters to let the device statistics reflect that there's a problem.
--- drivers/net/can/flexcan.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/can/flexcan.c +8 -2
@@ -566,6 +566,7 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr)struct can_frame *cf;bool rx_errors = false, tx_errors = false;u32 timestamp; +int err; timestamp = priv->read (®s->timer) <<16 ;
@@ -614,7 +615,9 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr)if (tx_errors) dev->stats.tx_errors++; -can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); + err =can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); +if (err) + dev->stats.rx_fifo_errors++; }static void flexcan_irq_state (struct net_device *dev,u32 reg_esr)
@@ -627,6 +630,7 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr)int flt;struct can_berr_counter bec;u32 timestamp; +int err; timestamp = priv->read (®s->timer) <<16 ;
@@ -658,7 +662,9 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr)if (unlikely (new_state ==CAN_STATE_BUS_OFF ))can_bus_off (dev); -can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); + err =can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); +if (err) + dev->stats.rx_fifo_errors++; }static inline struct flexcan_priv *rx_offload_to_priv (struct can_rx_offload *offload)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 36/321 watchdog: meson: Fix the wrong value of left time
In reply to Greg Kroah-HartmanFrom: Xingyu Chen <[email protected]>
[ Upstream commit 2c77734642d52448aca673e889b39f981110828b ]
The left time value is wrong when we get it by sysfs. The left time value should be equal to preset timeout value minus elapsed time value. According to the Meson-GXB/GXL datasheets which can be found at [0], the timeout value is saved to BIT[0-15] of the WATCHDOG_TCNT, and elapsed time value is saved to BIT[16-31] of the WATCHDOG_TCNT.
--- drivers/watchdog/meson_gxbb_wdt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/watchdog/meson_gxbb_wdt.c +2 -2
@@ -89,8 +89,8 @@ static unsigned int meson_gxbb_wdt_get_timeleft(struct watchdog_device *wdt_dev) reg =readl (data->reg_base +GXBB_WDT_TCNT_REG ); -return ((reg >>GXBB_WDT_TCNT_CNT_SHIFT ) - - (reg &GXBB_WDT_TCNT_SETUP_MASK )) /1000 ; +return ((reg &GXBB_WDT_TCNT_SETUP_MASK ) - + (reg >>GXBB_WDT_TCNT_CNT_SHIFT )) /1000 ; }static const struct watchdog_ops meson_gxbb_wdt_ops = {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 35/321 can: mcp251x: mcp251x_restart_work_handler(): Fix potential force_quit race condition
In reply to Greg Kroah-HartmanFrom: Timo Schlüßler <[email protected]>
[ Upstream commit 27a0e54bae09d2dd023a01254db506d61cc50ba1 ]
In mcp251x_restart_work_handler() the variable to stop the interrupt handler (priv->force_quit) is reset after the chip is restarted and thus a interrupt might occur.
This patch fixes the potential race condition by resetting force_quit before enabling interrupts.
--- drivers/net/can/spi/mcp251x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/spi/mcp251x.c +1 -1
@@ -773,6 +773,7 @@ static void mcp251x_restart_work_handler(struct work_struct *ws)if (priv->after_suspend) {mcp251x_hw_reset (spi);mcp251x_setup (net, spi); + priv->force_quit =0 ;if (priv->after_suspend &AFTER_SUSPEND_RESTART ) {mcp251x_set_normal_mode (spi); }else if (priv->after_suspend &AFTER_SUSPEND_UP ) {
@@ -784,7 +785,6 @@ static void mcp251x_restart_work_handler(struct work_struct *ws)mcp251x_hw_sleep (spi); } priv->after_suspend =0 ; - priv->force_quit =0 ; }if (priv->restart_tx) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 37/321 ASoC: stm32: sai: add restriction on mmap support
In reply to Greg Kroah-HartmanFrom: Olivier Moysan <[email protected]>
[ Upstream commit eaf072e512d54c95b0977eda06cbca3151ace1e5 ]
Do not support mmap in S/PDIF mode. In S/PDIF mode the buffer has to be copied, to allow the channel status bits insertion.
--- sound/soc/stm/stm32_sai_sub.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
sound/soc/stm/stm32_sai_sub.c +11 -1
@@ -994,6 +994,16 @@ static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream,return 0 ; } +/* No support of mmap in S/PDIF mode */ +static const struct snd_pcm_hardware stm32_sai_pcm_hw_spdif = { + .info =SNDRV_PCM_INFO_INTERLEAVED , + .buffer_bytes_max =8 *PAGE_SIZE , + .period_bytes_min =1024 , + .period_bytes_max =PAGE_SIZE , + .periods_min =2 , + .periods_max =8 , +}; +static const struct snd_pcm_hardware stm32_sai_pcm_hw = { .info =SNDRV_PCM_INFO_INTERLEAVED |SNDRV_PCM_INFO_MMAP , .buffer_bytes_max =8 *PAGE_SIZE ,
@@ -1050,7 +1060,7 @@ static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = { };static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = { - .pcm_hardware = &stm32_sai_pcm_hw, + .pcm_hardware = &stm32_sai_pcm_hw_spdif, .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, .process = stm32_sai_pcm_process_spdif, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 38/321 scripts/gdb: fix debugging modules compiled with hot/cold partitioning
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit 8731acc5068eb3f422a45c760d32198175c756f8 ]
gcc's -freorder-blocks-and-partition option makes it group frequently and infrequently used code in .text.hot and .text.unlikely sections respectively. At least when building modules on s390, this option is used by default.
gdb assumes that all code is located in .text section, and that .text section is located at module load address. With such modules this is no longer the case: there is code in .text.hot and .text.unlikely, and either of them might precede .text.
Fix by explicitly telling gdb the addresses of code sections.
It might be tempting to do this for all sections, not only the ones in the white list. Unfortunately, gdb appears to have an issue, when telling it about e.g. loadable .note.gnu.build-id section causes it to think that non-loadable .note.Linux section is loaded at address 0, which in turn causes NULL pointers to be resolved to bogus symbols. So keep using the white list approach for the time being.
--- scripts/gdb/linux/symbols.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
scripts/gdb/linux/symbols.py +2 -1
@@ -99,7 +99,8 @@ lx-symbols command.""" attrs[n]['name'].string(): attrs[n]['address'] for n in range(int(sect_attrs['nsections']))} args = [] - for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]: + for section_name in [".data", ".data..read_mostly", ".rodata", ".bss", + ".text", ".text.hot", ".text.unlikely"]: address = section_name_to_address.get(section_name) if address: args.append(" -s {name} {addr}".format(
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 39/321 net: bcmgenet: use RGMII loopback for MAC reset
In reply to Greg Kroah-HartmanFrom: Doug Berger <[email protected]>
[ Upstream commit 3a55402c93877d291b0a612d25edb03d1b4b93ac ]
As noted in commit 28c2d1a7a0bf ("net: bcmgenet: enable loopback during UniMAC sw_reset") the UniMAC must be clocked while sw_reset is asserted for its state machines to reset cleanly.
The transmit and receive clocks used by the UniMAC are derived from the signals used on its PHY interface. The bcmgenet MAC can be configured to work with different PHY interfaces including MII, GMII, RGMII, and Reverse MII on internal and external interfaces. Unfortunately for the UniMAC, when configured for MII the Tx clock is always driven from the PHY which places it outside of the direct control of the MAC.
The earlier commit enabled a local loopback mode within the UniMAC so that the receive clock would be derived from the transmit clock which addressed the observed issue with an external GPHY disabling it's Rx clock. However, when a Tx clock is not available this loopback is insufficient.
This commit implements a workaround that leverages the fact that the MAC can reliably generate all of its necessary clocking by enterring the external GPHY RGMII interface mode with the UniMAC in local loopback during the sw_reset interval. Unfortunately, this has the undesirable side efect of the RGMII GTXCLK signal being driven during the same window.
In most configurations this is a benign side effect as the signal is either not routed to a pin or is already expected to drive the pin. The one exception is when an external MII PHY is expected to drive the same pin with its TX_CLK output creating output driver contention.
This commit exploits the IEEE 802.3 clause 22 standard defined isolate mode to force an external MII PHY to present a high impedance on its TX_CLK output during the window to prevent any contention at the pin.
The MII interface is used internally with the 40nm internal EPHY which agressively disables its clocks for power savings leading to incomplete resets of the UniMAC and many instabilities observed over the years. The workaround of this commit is expected to put an end to those problems.
--- .../net/ethernet/broadcom/genet/bcmgenet.c | 2 -- drivers/net/ethernet/broadcom/genet/bcmmii.c | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/genet/bcmgenet.c +0 -2
@@ -1998,8 +1998,6 @@ static void reset_umac(struct bcmgenet_priv *priv)/* issue soft reset with (rg)mii loopback to ensure a stable rxclk */ bcmgenet_umac_writel (priv,CMD_SW_RESET |CMD_LCL_LOOP_EN ,UMAC_CMD ); -udelay (2 ); -bcmgenet_umac_writel (priv,0 ,UMAC_CMD ); }static void bcmgenet_intr_disable (struct bcmgenet_priv *priv)
drivers/net/ethernet/broadcom/genet/bcmmii.c +33 -0
@@ -184,8 +184,38 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)const char *phy_name =NULL ;u32 id_mode_dis =0 ;u32 port_ctrl; +int bmcr =-1 ; +int ret;u32 reg; +/* MAC clocking workaround during reset of umac state machines */ + reg =bcmgenet_umac_readl (priv,UMAC_CMD ); +if (reg &CMD_SW_RESET ) { +/* An MII PHY must be isolated to prevent TXC contention */ +if (priv->phy_interface ==PHY_INTERFACE_MODE_MII ) { + ret =phy_read (phydev,MII_BMCR ); +if (ret >=0 ) { + bmcr = ret; + ret =phy_write (phydev,MII_BMCR , + bmcr |BMCR_ISOLATE ); + } +if (ret) { +netdev_err (dev,"failed to isolate PHY\n" ); +return ret; + } + } +/* Switch MAC clocking to RGMII generated clock */ +bcmgenet_sys_writel (priv,PORT_MODE_EXT_GPHY ,SYS_PORT_CTRL ); +/* Ensure 5 clks with Rx disabled +* followed by 5 clks with Reset asserted +*/ +udelay (4 ); + reg &= ~(CMD_SW_RESET |CMD_LCL_LOOP_EN ); +bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +/* Ensure 5 more clocks before Rx is enabled */ +udelay (2 ); + } + priv->ext_phy = !priv->internal_phy && (priv->phy_interface !=PHY_INTERFACE_MODE_MOCA );
@@ -217,6 +247,9 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) phydev->supported &=PHY_BASIC_FEATURES ;bcmgenet_sys_writel (priv,PORT_MODE_EXT_EPHY ,SYS_PORT_CTRL ); +/* Restore the MII PHY after isolation */ +if (bmcr >=0 ) +phy_write (phydev,MII_BMCR , bmcr);break ;case PHY_INTERFACE_MODE_REVMII :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 5/321 reset: Fix memory leak in reset_control_array_put()
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
[ Upstream commit 532f9cd6ee994ed10403e856ca27501428048597 ]
Memory allocated for 'struct reset_control_array' in of_reset_control_array_get() is never freed in reset_control_array_put() resulting in kmemleak showing the following backtrace.
backtrace:
[<00000000c5f17595>] __kmalloc+0x1b0/0x2b0
[<00000000bd499e13>] of_reset_control_array_get+0xa4/0x180
[<000000004cc02754>] 0xffff800008c669e4
[<0000000050a83b24>] platform_drv_probe+0x50/0xa0
[<00000000d3a0b0bc>] really_probe+0x108/0x348
[<000000005aa458ac>] driver_probe_device+0x58/0x100
[<000000008853626c>] device_driver_attach+0x6c/0x90
[<0000000085308d19>] __driver_attach+0x84/0xc8
[<00000000080d35f2>] bus_for_each_dev+0x74/0xc8
[<00000000dd7f015b>] driver_attach+0x20/0x28
[<00000000923ba6e6>] bus_add_driver+0x148/0x1f0
[<0000000061473b66>] driver_register+0x60/0x110
[<00000000c5bec167>] __platform_driver_register+0x40/0x48
[<000000007c764b4f>] 0xffff800008c6c020
[<0000000047ec2e8c>] do_one_initcall+0x5c/0x1b0
[<0000000093d4b50d>] do_init_module+0x54/0x1d0--- drivers/reset/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/reset/core.c +1 -0
@@ -607,6 +607,7 @@ static void reset_control_array_put(struct reset_control_array *resets)for (i =0 ; i < resets->num_rstcs; i++)__reset_control_put_internal (resets->rstc[i]);mutex_unlock (&reset_list_mutex); +kfree (resets); }/**
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 4/321 ASoC: compress: fix unsigned integer overflow check
In reply to Greg Kroah-HartmanFrom: Xiaojun Sang <[email protected]>
[ Upstream commit d3645b055399538415586ebaacaedebc1e5899b0 ]
Parameter fragments and fragment_size are type of u32. U32_MAX is the correct check.
--- sound/core/compress_offload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/core/compress_offload.c +1 -1
@@ -529,7 +529,7 @@ static int snd_compress_check_input(struct snd_compr_params *params) {/* first let's check the buffer parameter's */ if (params->buffer.fragment_size ==0 || - params->buffer.fragments >INT_MAX / params->buffer.fragment_size || + params->buffer.fragments >U32_MAX / params->buffer.fragment_size || params->buffer.fragments ==0 )return -EINVAL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 7/321 ASoC: kirkwood: fix external clock probe defer
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit 4523817d51bc3b2ef38da768d004fda2c8bc41de ]
When our call to get the external clock fails, we forget to clean up the enabled internal clock correctly. Enable the clock after we have obtained all our resources.
--- sound/soc/kirkwood/kirkwood-i2s.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/soc/kirkwood/kirkwood-i2s.c +4 -4
@@ -563,10 +563,6 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)return PTR_ERR (priv->clk); } - err =clk_prepare_enable (priv->clk); -if (err <0 ) -return err; - priv->extclk =devm_clk_get (&pdev->dev,"extclk" );if (IS_ERR (priv->extclk)) {if (PTR_ERR (priv->extclk) == -EPROBE_DEFER )
@@ -582,6 +578,10 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) } } + err =clk_prepare_enable (priv->clk); +if (err <0 ) +return err; +/* Some sensible defaults - this reflects the powerup values */ priv->ctl_play =KIRKWOOD_PLAYCTL_SIZE_24 ; priv->ctl_rec =KIRKWOOD_RECCTL_SIZE_24 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 8/321 ASoC: kirkwood: fix device remove ordering
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit dc39596a906d5b604f4e64597b6e904fc14625e8 ]
The devm conversion of kirkwood was incorrect; on removal, devm takes effect after the "remove" function has returned. So, the effect of the conversion was to change the order during remove from:
- snd_soc_unregister_component() (unpublishes interfaces)
- clk_disable_unprepare()
- cleanup resources
After the conversion, this became:
- clk_disable_unprepare() - while the device may still be active
- snd_soc_unregister_component()
- cleanup resources
Hence, it introduces a bug, where the internal clock for the device may be shut down before the device itself has been shut down. It is known that Marvell SoCs, including Dove, locks up if registers for a peripheral that has its clocks disabled are accessed.
--- sound/soc/kirkwood/kirkwood-i2s.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/kirkwood/kirkwood-i2s.c +2 -1
@@ -595,7 +595,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) priv->ctl_rec |=KIRKWOOD_RECCTL_BURST_128 ; } - err =devm_snd_soc_register_component (&pdev->dev, &kirkwood_soc_component, + err =snd_soc_register_component (&pdev->dev, &kirkwood_soc_component, soc_dai,2 );if (err) {dev_err (&pdev->dev,"snd_soc_register_component failed\n" );
@@ -618,6 +618,7 @@ static int kirkwood_i2s_dev_remove(struct platform_device *pdev) {struct kirkwood_dma_data *priv =dev_get_drvdata (&pdev->dev); +snd_soc_unregister_component (&pdev->dev);if (!IS_ERR (priv->extclk))clk_disable_unprepare (priv->extclk);clk_disable_unprepare (priv->clk);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 9/321 clk: samsung: exynos5420: Preserve PLL configuration during suspend/resume
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit e9323b664ce29547d996195e8a6129a351c39108 ]
Properly save and restore all top PLL related configuration registers during suspend/resume cycle. So far driver only handled EPLL and RPLL clocks, all other were reset to default values after suspend/resume cycle. This caused for example lower G3D (MALI Panfrost) performance after system resume, even if performance governor has been selected.
--- drivers/clk/samsung/clk-exynos5420.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/samsung/clk-exynos5420.c +6 -0
@@ -171,12 +171,18 @@ static const unsigned long exynos5x_clk_regs[] __initconst = {GATE_BUS_CPU ,GATE_SCLK_CPU ,CLKOUT_CMU_CPU , +CPLL_CON0 , +DPLL_CON0 ,EPLL_CON0 ,EPLL_CON1 ,EPLL_CON2 ,RPLL_CON0 ,RPLL_CON1 ,RPLL_CON2 , +IPLL_CON0 , +SPLL_CON0 , +VPLL_CON0 , +MPLL_CON0 ,SRC_TOP0 ,SRC_TOP1 , SRC_TOP2,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 41/321 net: mscc: ocelot: fix __ocelot_rmw_ix prototype
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 17fdd7638cb687cd7f15a48545f25d738f0101e0 ]
The "read-modify-write register index" function is declared with a confusing prototype: the "mask" and "reg" arguments are swapped.
Fortunately, this does not affect callers so far. Both arguments are u32, and the wrapper macros (ocelot_rmw_ix etc) have the arguments in the correct order (the one from ocelot_io.c).
--- drivers/net/ethernet/mscc/ocelot.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mscc/ocelot.h +1 -1
@@ -541,7 +541,7 @@ void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset);#define ocelot_write_rix (ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri))#define ocelot_write (ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) -void __ocelot_rmw_ix (struct ocelot *ocelot,u32 val,u32 reg,u32 mask, +void __ocelot_rmw_ix (struct ocelot *ocelot,u32 val,u32 mask,u32 reg,u32 offset);#define ocelot_rmw_ix (ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri))#define ocelot_rmw_gix (ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 50/321 arm64: dts: marvell: armada-37xx: Enable emmc on espressobin
In reply to Greg Kroah-HartmanFrom: Ding Tao <[email protected]>
[ Upstream commit 43ebc7c1b3ed8198b9acf3019eca16e722f7331c ]
The ESPRESSObin board has a emmc interface available on U11: declare it and let the bootloader enable it if the emmc is present.
--- .../dts/marvell/armada-3720-espressobin.dts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+)
arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts +22 -0
@@ -60,9 +60,31 @@ cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>; marvell,pad-type = "sd"; vqmmc-supply = <&vcc_sd_reg1>; + + pinctrl-names = "default"; + pinctrl-0 = <&sdio_pins>; status = "okay"; }; +/* U11 */ +&sdhci0 { + non-removable; + bus-width = <8>; + mmc-ddr-1_8v; + mmc-hs400-1_8v; + marvell,xenon-emmc; + marvell,xenon-tun-count = <9>; + marvell,pad-type = "fixed-1-8v"; + + pinctrl-names = "default"; + pinctrl-0 = <&mmc_pins>; +/* + * This eMMC is not populated on all boards, so disable it by + * default and let the bootloader enable it, if it is present + */ + status = "disabled"; +}; + &spi0 { status = "okay";
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 51/321 ARM: dts: Fix up SQ201 flash access
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit d88b11ef91b15d0af9c0676cbf4f441a0dff0c56 ]
This sets the partition information on the SQ201 to be read out from the RedBoot partition table, removes the static partition table and sets our boot options to mount root from /dev/mtdblock2 where the squashfs+JFFS2 resides.
--- arch/arm/boot/dts/gemini-sq201.dts | 37 ++++-------------------------- 1 file changed, 5 insertions(+), 32 deletions(-)
arch/arm/boot/dts/gemini-sq201.dts +5 -32
@@ -20,7 +20,7 @@ }; chosen { - bootargs = "console=ttyS0,115200n8"; + bootargs = "console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=squashfs,jffs2 rootwait"; stdout-path = &uart0; };
@@ -138,37 +138,10 @@ /* 16MB of flash */ reg = <0x30000000 0x01000000>; - partition@0 { - label = "RedBoot"; - reg = <0x00000000 0x00120000>; - read-only; - }; - partition@120000 { - label = "Kernel"; - reg = <0x00120000 0x00200000>; - }; - partition@320000 { - label = "Ramdisk"; - reg = <0x00320000 0x00600000>; - }; - partition@920000 { - label = "Application"; - reg = <0x00920000 0x00600000>; - }; - partition@f20000 { - label = "VCTL"; - reg = <0x00f20000 0x00020000>; - read-only; - }; - partition@f40000 { - label = "CurConf"; - reg = <0x00f40000 0x000a0000>; - read-only; - }; - partition@fe0000 { - label = "FIS directory"; - reg = <0x00fe0000 0x00020000>; - read-only; + partitions { + compatible = "redboot-fis"; + /* Eraseblock at 0xfe0000 */ + fis-index-block = <0x1fc>; }; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 52/321 tracing: Lock event_mutex before synth_event_mutex
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit fc800a10be26017f8f338bc8e500d48e3e6429d9 ]
synthetic event is using synth_event_mutex for protecting synth_event_list, and event_trigger_write() path acquires locks as below order.
event_trigger_write(event_mutex)
->trigger_process_regex(trigger_cmd_mutex)
->event_hist_trigger_func(synth_event_mutex)
On the other hand, synthetic event creation and deletion paths call trace_add_event_call() and trace_remove_event_call() which acquires event_mutex. In that case, if we keep the synth_event_mutex locked while registering/unregistering synthetic events, its dependency will be inversed.
To avoid this issue, current synthetic event is using a 2 phase process to create/delete events. For example, it searches existing events under synth_event_mutex to check for event-name conflicts, and unlocks synth_event_mutex, then registers a new event under event_mutex locked. Finally, it locks synth_event_mutex and tries to add the new event to the list. But it can introduce complexity and a chance for name conflicts.
To solve this simpler, this introduces trace_add_event_call_nolock() and trace_remove_event_call_nolock() which don't acquire event_mutex inside. synthetic event can lock event_mutex before synth_event_mutex to solve the lock dependency issue simpler.
--- include/linux/trace_events.h | 2 ++ kernel/trace/trace_events.c | 34 ++++++++++++++++++++++++++------ kernel/trace/trace_events_hist.c | 24 ++++++++++------------ 3 files changed, 40 insertions(+), 20 deletions(-)
include/linux/trace_events.h +2 -0
@@ -529,6 +529,8 @@ extern int trace_event_raw_init(struct trace_event_call *call);extern int trace_define_field (struct trace_event_call *call,const char *type,const char *name,int offset,int size,int is_signed,int filter_type); +extern int trace_add_event_call_nolock (struct trace_event_call *call); +extern int trace_remove_event_call_nolock (struct trace_event_call *call);extern int trace_add_event_call (struct trace_event_call *call);extern int trace_remove_event_call (struct trace_event_call *call);extern int trace_event_get_offsets (struct trace_event_call *call);
kernel/trace/trace_events.c +28 -6
@@ -2302,11 +2302,11 @@ __trace_early_add_new_event(struct trace_event_call *call,struct ftrace_module_file_ops ;static void __add_event_to_tracers (struct trace_event_call *call); -/* Add an additional event_call dynamically */ -int trace_add_event_call (struct trace_event_call *call) +int trace_add_event_call_nolock (struct trace_event_call *call) {int ret; -mutex_lock (&event_mutex); +lockdep_assert_held (&event_mutex); +mutex_lock (&trace_types_lock); ret =__register_event (call,NULL );
@@ -2314,6 +2314,16 @@ int trace_add_event_call(struct trace_event_call *call)__add_event_to_tracers (call);mutex_unlock (&trace_types_lock); +return ret; +} + +/* Add an additional event_call dynamically */ +int trace_add_event_call (struct trace_event_call *call) +{ +int ret; + +mutex_lock (&event_mutex); + ret =trace_add_event_call_nolock (call);mutex_unlock (&event_mutex);return ret; }
@@ -2363,17 +2373,29 @@ static int probe_remove_event_call(struct trace_event_call *call)return 0 ; } -/* Remove an event_call */ -int trace_remove_event_call (struct trace_event_call *call) +/* no event_mutex version */ +int trace_remove_event_call_nolock (struct trace_event_call *call) {int ret; -mutex_lock (&event_mutex); +lockdep_assert_held (&event_mutex); +mutex_lock (&trace_types_lock);down_write (&trace_event_sem); ret =probe_remove_event_call (call);up_write (&trace_event_sem);mutex_unlock (&trace_types_lock); + +return ret; +} + +/* Remove an event_call */ +int trace_remove_event_call (struct trace_event_call *call) +{ +int ret; + +mutex_lock (&event_mutex); + ret =trace_remove_event_call_nolock (call);mutex_unlock (&event_mutex);return ret;
kernel/trace/trace_events_hist.c +10 -14
@@ -914,7 +914,7 @@ static int register_synth_event(struct synth_event *event) call->data = event; call->tp = event->tp; - ret =trace_add_event_call (call); + ret =trace_add_event_call_nolock (call);if (ret) {pr_warn ("Failed to register synthetic event: %s\n" ,trace_event_name (call));
@@ -938,7 +938,7 @@ static int unregister_synth_event(struct synth_event *event)struct trace_event_call *call = &event->call;int ret; - ret =trace_remove_event_call (call); + ret =trace_remove_event_call_nolock (call);return ret; }
@@ -1015,12 +1015,10 @@ static void add_or_delete_synth_event(struct synth_event *event, int delete)if (delete)free_synth_event (event);else { -mutex_lock (&synth_event_mutex);if (!find_synth_event (event->name))list_add (&event->list, &synth_event_list);else free_synth_event (event); -mutex_unlock (&synth_event_mutex); } }
@@ -1032,6 +1030,7 @@ static int create_synth_event(int argc, char **argv)int i, consumed =0 , n_fields =0 , ret =0 ;char *name; +mutex_lock (&event_mutex);mutex_lock (&synth_event_mutex);/*
@@ -1104,8 +1103,6 @@ static int create_synth_event(int argc, char **argv) goto err; } out: -mutex_unlock (&synth_event_mutex); -if (event) {if (delete_event) { ret =unregister_synth_event (event);
@@ -1115,10 +1112,13 @@ static int create_synth_event(int argc, char **argv)add_or_delete_synth_event (event, ret); } } +mutex_unlock (&synth_event_mutex); +mutex_unlock (&event_mutex);return ret; err:mutex_unlock (&synth_event_mutex); +mutex_unlock (&event_mutex);for (i =0 ; i < n_fields; i++)free_synth_field (fields[i]);
@@ -1129,12 +1129,10 @@ static int create_synth_event(int argc, char **argv)static int release_all_synth_events (void ) { -struct list_head release_events;struct synth_event *event, *e;int ret =0 ; -INIT_LIST_HEAD (&release_events); - +mutex_lock (&event_mutex);mutex_lock (&synth_event_mutex);list_for_each_entry (event, &synth_event_list, list) {
@@ -1144,16 +1142,14 @@ static int release_all_synth_events(void) } } -list_splice_init (&event->list, &release_events); - -mutex_unlock (&synth_event_mutex); - -list_for_each_entry_safe (event, e, &release_events, list) { +list_for_each_entry_safe (event, e, &synth_event_list, list) {list_del (&event->list); ret =unregister_synth_event (event);add_or_delete_synth_event (event, !ret); } +mutex_unlock (&synth_event_mutex); +mutex_unlock (&event_mutex);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 53/321 ARM: debug-imx: only define DEBUG_IMX_UART_PORT if needed
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 7c41ea57beb2aee96fa63091a457b1a2826f3c42 ]
If debugging on i.MX is enabled DEBUG_IMX_UART_PORT defines which UART is used for the debug output. If however debugging is off don't only hide the then unused config item but drop it completely by using a dependency instead of a conditional prompt.
This fixes DEBUG_IMX_UART_PORT being present in the kernel config even if DEBUG_LL is disabled.
--- arch/arm/Kconfig.debug | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
arch/arm/Kconfig.debug +14 -14
@@ -1432,21 +1432,21 @@ config DEBUG_OMAP2PLUS_UART depends on ARCH_OMAP2PLUS config DEBUG_IMX_UART_PORT - int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \ - DEBUG_IMX25_UART || \ - DEBUG_IMX21_IMX27_UART || \ - DEBUG_IMX31_UART || \ - DEBUG_IMX35_UART || \ - DEBUG_IMX50_UART || \ - DEBUG_IMX51_UART || \ - DEBUG_IMX53_UART || \ - DEBUG_IMX6Q_UART || \ - DEBUG_IMX6SL_UART || \ - DEBUG_IMX6SX_UART || \ - DEBUG_IMX6UL_UART || \ - DEBUG_IMX7D_UART + int "i.MX Debug UART Port Selection" + depends on DEBUG_IMX1_UART || \ + DEBUG_IMX25_UART || \ + DEBUG_IMX21_IMX27_UART || \ + DEBUG_IMX31_UART || \ + DEBUG_IMX35_UART || \ + DEBUG_IMX50_UART || \ + DEBUG_IMX51_UART || \ + DEBUG_IMX53_UART || \ + DEBUG_IMX6Q_UART || \ + DEBUG_IMX6SL_UART || \ + DEBUG_IMX6SX_UART || \ + DEBUG_IMX6UL_UART || \ + DEBUG_IMX7D_UART default 1 - depends on ARCH_MXC help Choose UART port on which kernel low-level debug messages should be output.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 54/321 ARM: dts: imx51: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 6a9681168b83c62abfa457c709f2f4b126bd6b92 ]
Boards based on imx51 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx51.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx51-apf51.dts | 1 + arch/arm/boot/dts/imx51-babbage.dts | 1 + arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi | 1 + arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi | 1 + arch/arm/boot/dts/imx51-ts4800.dts | 1 + arch/arm/boot/dts/imx51-zii-rdu1.dts | 1 + arch/arm/boot/dts/imx51-zii-scu2-mezz.dts | 1 + arch/arm/boot/dts/imx51-zii-scu3-esb.dts | 1 + arch/arm/boot/dts/imx51.dtsi | 2 -- 9 files changed, 8 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx51-apf51.dts +1 -0
@@ -22,6 +22,7 @@ compatible = "armadeus,imx51-apf51", "fsl,imx51"; memory@90000000 { + device_type = "memory"; reg = <0x90000000 0x20000000>; };
arch/arm/boot/dts/imx51-babbage.dts +1 -0
@@ -15,6 +15,7 @@ }; memory@90000000 { + device_type = "memory"; reg = <0x90000000 0x20000000>; };
arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi +1 -0
@@ -17,6 +17,7 @@ compatible = "digi,connectcore-ccxmx51-som", "fsl,imx51"; memory@90000000 { + device_type = "memory"; reg = <0x90000000 0x08000000>; }; };
arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi +1 -0
@@ -23,6 +23,7 @@ compatible = "eukrea,cpuimx51", "fsl,imx51"; memory@90000000 { + device_type = "memory"; reg = <0x90000000 0x10000000>; /* 256M */ }; };
arch/arm/boot/dts/imx51-ts4800.dts +1 -0
@@ -18,6 +18,7 @@ }; memory@90000000 { + device_type = "memory"; reg = <0x90000000 0x10000000>; };
arch/arm/boot/dts/imx51-zii-rdu1.dts +1 -0
@@ -53,6 +53,7 @@ /* Will be filled by the bootloader */ memory@90000000 { + device_type = "memory"; reg = <0x90000000 0>; };
arch/arm/boot/dts/imx51-zii-scu2-mezz.dts +1 -0
@@ -18,6 +18,7 @@ /* Will be filled by the bootloader */ memory@90000000 { + device_type = "memory"; reg = <0x90000000 0>; };
arch/arm/boot/dts/imx51-zii-scu3-esb.dts +1 -0
@@ -18,6 +18,7 @@ /* Will be filled by the bootloader */ memory@90000000 { + device_type = "memory"; reg = <0x90000000 0>; };
arch/arm/boot/dts/imx51.dtsi +0 -2
@@ -16,10 +16,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 55/321 ARM: dts: imx53: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit e8fd17b900a4a1e3a8bef7b44727cbad35db05a7 ]
Boards based on imx53 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx53.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx53-ard.dts | 1 + arch/arm/boot/dts/imx53-cx9020.dts | 1 + arch/arm/boot/dts/imx53-m53.dtsi | 1 + arch/arm/boot/dts/imx53-qsb-common.dtsi | 1 + arch/arm/boot/dts/imx53-smd.dts | 1 + arch/arm/boot/dts/imx53-tqma53.dtsi | 1 + arch/arm/boot/dts/imx53-tx53.dtsi | 1 + arch/arm/boot/dts/imx53-usbarmory.dts | 1 + arch/arm/boot/dts/imx53.dtsi | 2 -- 9 files changed, 8 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx53-ard.dts +1 -0
@@ -19,6 +19,7 @@ compatible = "fsl,imx53-ard", "fsl,imx53"; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x40000000>; };
arch/arm/boot/dts/imx53-cx9020.dts +1 -0
@@ -22,6 +22,7 @@ }; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x20000000>, <0xb0000000 0x20000000>; };
arch/arm/boot/dts/imx53-m53.dtsi +1 -0
@@ -16,6 +16,7 @@ compatible = "aries,imx53-m53", "denx,imx53-m53", "fsl,imx53"; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x20000000>, <0xb0000000 0x20000000>; };
arch/arm/boot/dts/imx53-qsb-common.dtsi +1 -0
@@ -11,6 +11,7 @@ }; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x20000000>, <0xb0000000 0x20000000>; };
arch/arm/boot/dts/imx53-smd.dts +1 -0
@@ -12,6 +12,7 @@ compatible = "fsl,imx53-smd", "fsl,imx53"; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x40000000>; };
arch/arm/boot/dts/imx53-tqma53.dtsi +1 -0
@@ -17,6 +17,7 @@ compatible = "tq,tqma53", "fsl,imx53"; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x40000000>; /* Up to 1GiB */ };
arch/arm/boot/dts/imx53-tx53.dtsi +1 -0
@@ -51,6 +51,7 @@ /* Will be filled by the bootloader */ memory@70000000 { + device_type = "memory"; reg = <0x70000000 0>; };
arch/arm/boot/dts/imx53-usbarmory.dts +1 -0
@@ -58,6 +58,7 @@ }; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x20000000>; };
arch/arm/boot/dts/imx53.dtsi +0 -2
@@ -23,10 +23,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 56/321 ARM: dts: imx31: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 013d37e4707e24c7b9bc3fc55aeda55ce9c2b262 ]
Boards based on imx31 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx31.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx31-bug.dts | 1 + arch/arm/boot/dts/imx31-lite.dts | 1 + arch/arm/boot/dts/imx31.dtsi | 2 -- 3 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx31-bug.dts +1 -0
@@ -17,6 +17,7 @@ compatible = "buglabs,imx31-bug", "fsl,imx31"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x8000000>; /* 128M */ }; };
arch/arm/boot/dts/imx31-lite.dts +1 -0
@@ -18,6 +18,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x8000000>; };
arch/arm/boot/dts/imx31.dtsi +0 -2
@@ -10,10 +10,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { gpio0 = &gpio1;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 58/321 ARM: dts: imx7: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 29988e867cb17de7119e971f9acfad2c3fccdb47 ]
Boards based on imx7 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx7s.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx7d-cl-som-imx7.dts | 3 ++- arch/arm/boot/dts/imx7d-colibri-emmc.dtsi | 1 + arch/arm/boot/dts/imx7d-colibri.dtsi | 1 + arch/arm/boot/dts/imx7d-nitrogen7.dts | 1 + arch/arm/boot/dts/imx7d-pico.dtsi | 1 + arch/arm/boot/dts/imx7d-sdb.dts | 1 + arch/arm/boot/dts/imx7s-colibri.dtsi | 1 + arch/arm/boot/dts/imx7s-warp.dts | 1 + arch/arm/boot/dts/imx7s.dtsi | 2 -- 9 files changed, 9 insertions(+), 3 deletions(-)
arch/arm/boot/dts/imx7d-cl-som-imx7.dts +2 -1
@@ -19,6 +19,7 @@ compatible = "compulab,cl-som-imx7", "fsl,imx7d"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x10000000>; /* 256 MB - minimal configuration */ };
@@ -284,4 +285,4 @@ MX7D_PAD_LPSR_GPIO1_IO05__GPIO1_IO5 0x14 /* OTG PWREN */ >; }; -}; +};
arch/arm/boot/dts/imx7d-colibri-emmc.dtsi +1 -0
@@ -8,6 +8,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; }; };
arch/arm/boot/dts/imx7d-colibri.dtsi +1 -0
@@ -45,6 +45,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; }; };
arch/arm/boot/dts/imx7d-nitrogen7.dts +1 -0
@@ -12,6 +12,7 @@ compatible = "boundary,imx7d-nitrogen7", "fsl,imx7d"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; };
arch/arm/boot/dts/imx7d-pico.dtsi +1 -0
@@ -49,6 +49,7 @@ compatible = "technexion,imx7d-pico", "fsl,imx7d"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x80000000>; };
arch/arm/boot/dts/imx7d-sdb.dts +1 -0
@@ -15,6 +15,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x80000000>; };
arch/arm/boot/dts/imx7s-colibri.dtsi +1 -0
@@ -45,6 +45,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x10000000>; }; };
arch/arm/boot/dts/imx7s-warp.dts +1 -0
@@ -51,6 +51,7 @@ compatible = "warp,imx7s-warp", "fsl,imx7s"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; };
arch/arm/boot/dts/imx7s.dtsi +0 -2
@@ -17,10 +17,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { gpio0 = &gpio1;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 59/321 ARM: dts: imx6ul: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 750d8df6e7b269b828f66631a1d39ea027afc92a ]
Boards based on imx6ul have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx6ul.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx6ul-14x14-evk.dtsi | 1 + arch/arm/boot/dts/imx6ul-geam.dts | 1 + arch/arm/boot/dts/imx6ul-isiot.dtsi | 1 + arch/arm/boot/dts/imx6ul-litesom.dtsi | 1 + arch/arm/boot/dts/imx6ul-opos6ul.dtsi | 1 + arch/arm/boot/dts/imx6ul-pico-hobbit.dts | 1 + arch/arm/boot/dts/imx6ul-tx6ul.dtsi | 1 + arch/arm/boot/dts/imx6ul.dtsi | 2 -- arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi | 1 + arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi | 1 + 10 files changed, 9 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx6ul-14x14-evk.dtsi +1 -0
@@ -12,6 +12,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; };
arch/arm/boot/dts/imx6ul-geam.dts +1 -0
@@ -51,6 +51,7 @@ compatible = "engicam,imx6ul-geam", "fsl,imx6ul"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x08000000>; };
arch/arm/boot/dts/imx6ul-isiot.dtsi +1 -0
@@ -46,6 +46,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; };
arch/arm/boot/dts/imx6ul-litesom.dtsi +1 -0
@@ -48,6 +48,7 @@ compatible = "grinn,imx6ul-litesom", "fsl,imx6ul"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; }; };
arch/arm/boot/dts/imx6ul-opos6ul.dtsi +1 -0
@@ -49,6 +49,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0>; /* will be filled by U-Boot */ };
arch/arm/boot/dts/imx6ul-pico-hobbit.dts +1 -0
@@ -53,6 +53,7 @@ /* Will be filled by the bootloader */ memory@80000000 { + device_type = "memory"; reg = <0x80000000 0>; };
arch/arm/boot/dts/imx6ul-tx6ul.dtsi +1 -0
@@ -71,6 +71,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0>; /* will be filled by U-Boot */ };
arch/arm/boot/dts/imx6ul.dtsi +0 -2
@@ -15,10 +15,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec1;
arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi +1 -0
@@ -7,6 +7,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x10000000>; }; };
arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi +1 -0
@@ -7,6 +7,7 @@ / { memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 60/321 ARM: dts: imx6sx: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 216f35fedd8688c8b654ebfbad18c6e64713fad7 ]
Boards based on imx6sx have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx6sx.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx6sx-nitrogen6sx.dts | 1 + arch/arm/boot/dts/imx6sx-sabreauto.dts | 1 + arch/arm/boot/dts/imx6sx-sdb.dtsi | 1 + arch/arm/boot/dts/imx6sx-softing-vining-2000.dts | 1 + arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts | 1 + arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts | 1 + arch/arm/boot/dts/imx6sx-udoo-neo-full.dts | 1 + arch/arm/boot/dts/imx6sx.dtsi | 2 -- 8 files changed, 7 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx6sx-nitrogen6sx.dts +1 -0
@@ -12,6 +12,7 @@ compatible = "boundary,imx6sx-nitrogen6sx", "fsl,imx6sx"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; };
arch/arm/boot/dts/imx6sx-sabreauto.dts +1 -0
@@ -11,6 +11,7 @@ compatible = "fsl,imx6sx-sabreauto", "fsl,imx6sx"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x80000000>; };
arch/arm/boot/dts/imx6sx-sdb.dtsi +1 -0
@@ -21,6 +21,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; };
arch/arm/boot/dts/imx6sx-softing-vining-2000.dts +1 -0
@@ -21,6 +21,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; };
arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts +1 -0
@@ -49,6 +49,7 @@ compatible = "udoo,neobasic", "fsl,imx6sx"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; }; };
arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts +1 -0
@@ -49,6 +49,7 @@ compatible = "udoo,neoextended", "fsl,imx6sx"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; }; };
arch/arm/boot/dts/imx6sx-udoo-neo-full.dts +1 -0
@@ -49,6 +49,7 @@ compatible = "udoo,neofull", "fsl,imx6sx"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; }; };
arch/arm/boot/dts/imx6sx.dtsi +0 -2
@@ -15,10 +15,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { can0 = &flexcan1;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 61/321 ARM: dts: imx6sl: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 7fa8ab65ee15e386558ac5e971004712da91e2dd ]
Boards based on imx6sl have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx6sl.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx6sl-evk.dts | 1 + arch/arm/boot/dts/imx6sl-warp.dts | 1 + arch/arm/boot/dts/imx6sl.dtsi | 2 -- arch/arm/boot/dts/imx6sll-evk.dts | 1 + 4 files changed, 3 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx6sl-evk.dts +1 -0
@@ -17,6 +17,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x40000000>; };
arch/arm/boot/dts/imx6sl-warp.dts +1 -0
@@ -55,6 +55,7 @@ compatible = "warp,imx6sl-warp", "fsl,imx6sl"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x20000000>; };
arch/arm/boot/dts/imx6sl.dtsi +0 -2
@@ -13,10 +13,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
arch/arm/boot/dts/imx6sll-evk.dts +1 -0
@@ -20,6 +20,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x80000000>; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 62/321 ARM: dts: imx50: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit aab5e3ea95b958cf22a24e756a84e635bdb081c1 ]
imx50-evk has duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx50.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx50-evk.dts | 1 + arch/arm/boot/dts/imx50.dtsi | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-)
arch/arm/boot/dts/imx50-evk.dts +1 -0
@@ -12,6 +12,7 @@ compatible = "fsl,imx50-evk", "fsl,imx50"; memory@70000000 { + device_type = "memory"; reg = <0x70000000 0x80000000>; }; };
arch/arm/boot/dts/imx50.dtsi +0 -2
@@ -22,10 +22,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/321 ARM: dts: imx1: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 62864d5665c4fc636d3021f829b3ac00fa058e30 ]
Boards based on imx1 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx1.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx1-ads.dts | 1 + arch/arm/boot/dts/imx1-apf9328.dts | 1 + arch/arm/boot/dts/imx1.dtsi | 2 -- 3 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx1-ads.dts +1 -0
@@ -21,6 +21,7 @@ }; memory@8000000 { + device_type = "memory"; reg = <0x08000000 0x04000000>; }; };
arch/arm/boot/dts/imx1-apf9328.dts +1 -0
@@ -21,6 +21,7 @@ }; memory@8000000 { + device_type = "memory"; reg = <0x08000000 0x00800000>; }; };
arch/arm/boot/dts/imx1.dtsi +0 -2
@@ -15,10 +15,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { gpio0 = &gpio1;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 65/321 ARM: dts: imx27: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 38715dcd49b4430ac5b6bc1293278d91a4d32bd5 ]
Boards based on imx27 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx27.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx27-apf27.dts | 1 + arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi | 1 + arch/arm/boot/dts/imx27-pdk.dts | 1 + arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi | 1 + arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi | 1 + arch/arm/boot/dts/imx27.dtsi | 2 -- 6 files changed, 5 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx27-apf27.dts +1 -0
@@ -20,6 +20,7 @@ compatible = "armadeus,imx27-apf27", "fsl,imx27"; memory@a0000000 { + device_type = "memory"; reg = <0xa0000000 0x04000000>; }; };
arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi +1 -0
@@ -17,6 +17,7 @@ compatible = "eukrea,cpuimx27", "fsl,imx27"; memory@a0000000 { + device_type = "memory"; reg = <0xa0000000 0x04000000>; };
arch/arm/boot/dts/imx27-pdk.dts +1 -0
@@ -10,6 +10,7 @@ compatible = "fsl,imx27-pdk", "fsl,imx27"; memory@a0000000 { + device_type = "memory"; reg = <0xa0000000 0x08000000>; };
arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi +1 -0
@@ -18,6 +18,7 @@ compatible = "phytec,imx27-pca100", "fsl,imx27"; memory@a0000000 { + device_type = "memory"; reg = <0xa0000000 0x08000000>; /* 128MB */ }; };
arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi +1 -0
@@ -17,6 +17,7 @@ compatible = "phytec,imx27-pcm038", "fsl,imx27"; memory@a0000000 { + device_type = "memory"; reg = <0xa0000000 0x08000000>; };
arch/arm/boot/dts/imx27.dtsi +0 -2
@@ -16,10 +16,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 66/321 ARM: dts: imx25: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 59d8bb363f563e4a147a291037bf979cb8ff9a59 ]
Boards based on imx25 have duplicate memory nodes:
- One coming from the board dts file: memory@
- One coming from the imx25.dtsi file.
Fix the duplication by removing the memory node from the dtsi file and by adding 'device_type = "memory";' in the board dts.
--- arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi | 1 + arch/arm/boot/dts/imx25-karo-tx25.dts | 1 + arch/arm/boot/dts/imx25-pdk.dts | 1 + arch/arm/boot/dts/imx25.dtsi | 2 -- 4 files changed, 3 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi +1 -0
@@ -18,6 +18,7 @@ compatible = "eukrea,cpuimx25", "fsl,imx25"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x4000000>; /* 64M */ }; };
arch/arm/boot/dts/imx25-karo-tx25.dts +1 -0
@@ -37,6 +37,7 @@ }; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x02000000 0x90000000 0x02000000>; }; };
arch/arm/boot/dts/imx25-pdk.dts +1 -0
@@ -12,6 +12,7 @@ compatible = "fsl,imx25-pdk", "fsl,imx25"; memory@80000000 { + device_type = "memory"; reg = <0x80000000 0x4000000>; };
arch/arm/boot/dts/imx25.dtsi +0 -2
@@ -12,10 +12,8 @@ * The decompressor and also some bootloaders rely on a * pre-existing /chosen node to be available to insert the * command line and merge other ATAGS info. - * Also for U-Boot there must be a pre-existing /memory node. */ chosen {}; - memory { device_type = "memory"; }; aliases { ethernet0 = &fec;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 67/321 ARM: dts: imx53-voipac-dmm-668: Fix memory node duplication
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
[ Upstream commit 998a84c27a7f3f9133d32af64e19c05cec161a1a ]
imx53-voipac-dmm-668 has two memory nodes, but the correct representation would be to use a single one with two reg entries - one for each RAM chip select, so fix it accordingly.
--- arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi +2 -6
@@ -17,12 +17,8 @@ memory@70000000 { device_type = "memory"; - reg = <0x70000000 0x20000000>; - }; - - memory@b0000000 { - device_type = "memory"; - reg = <0xb0000000 0x20000000>; + reg = <0x70000000 0x20000000>, + <0xb0000000 0x20000000>; }; regulators {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/321 parisc: Fix HP SDC hpa address output
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
[ Upstream commit c4bff35ca1bfba886da6223c9fed76a2b1382b8e ]
Show the hpa address of the HP SDC instead of a hashed value, e.g.:
HP SDC: HP SDC at 0xf0201000, IRQ 23 (NMI IRQ 24)
--- drivers/input/serio/hp_sdc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/serio/hp_sdc.c +2 -2
@@ -884,8 +884,8 @@ static int __init hp_sdc_init(void) "HP SDC NMI", &hp_sdc)) goto err2; - printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", - (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); +pr_info (PREFIX "HP SDC at 0x%08lx, IRQ %d (NMI IRQ %d)\n" , + hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);hp_sdc_status_in8 ();hp_sdc_data_in8 ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 43/321 net/fq_impl: Switch to kvmalloc() for memory allocation
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 71e67c3bd127cfe7863f54e4b087eba1cc8f9a7a ]
The FQ implementation used by mac80211 allocates memory using kmalloc(), which can fail; and Johannes reported that this actually happens in practice.
To avoid this, switch the allocation to kvmalloc() instead; this also brings fq_impl in line with all the FQ qdiscs.
--- include/net/fq_impl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/net/fq_impl.h +2 -2
@@ -312,7 +312,7 @@ static int fq_init(struct fq *fq, int flows_cnt) fq->limit =8192 ; fq->memory_limit =16 <<20 ;/* 16 MBytes */ - fq->flows =kcalloc (fq->flows_cnt,sizeof (fq->flows[0 ]),GFP_KERNEL ); + fq->flows =kvcalloc (fq->flows_cnt,sizeof (fq->flows[0 ]),GFP_KERNEL );if (!fq->flows)return -ENOMEM ;
@@ -330,7 +330,7 @@ static void fq_reset(struct fq *fq,for (i =0 ; i < fq->flows_cnt; i++)fq_flow_reset (fq, &fq->flows[i], free_func); -kfree (fq->flows); +kvfree (fq->flows); fq->flows =NULL ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/321 arm64: mm: Prevent mismatched 52-bit VA support
In reply to Greg Kroah-HartmanFrom: Steve Capper <[email protected]>
[ Upstream commit a96a33b1ca57dbea4285893dedf290aeb8eb090b ]
For cases where there is a mismatch in ARMv8.2-LVA support between CPUs we have to be careful in allowing secondary CPUs to boot if 52-bit virtual addresses have already been enabled on the boot CPU.
This patch adds code to the secondary startup path. If the boot CPU has enabled 52-bit VAs then ID_AA64MMFR2_EL1 is checked to see if the secondary can also enable 52-bit support. If not, the secondary is prevented from booting and an error message is displayed indicating why.
Technically this patch could be implemented using the cpufeature code when considering 52-bit userspace support. However, we employ low level checks here as the cpufeature code won't be able to run if we have mismatched 52-bit kernel va support.
--- arch/arm64/kernel/head.S | 26 ++++++++++++++++++++++++++ arch/arm64/kernel/smp.c | 5 +++++ 2 files changed, 31 insertions(+)
arch/arm64/kernel/head.S +26 -0
@@ -703,6 +703,7 @@ secondary_startup: /* * Common entry point for secondary CPUs. */ + bl __cpu_secondary_check52bitva bl __cpu_setup // initialise processor bl __enable_mmu ldr x8, =__secondary_switched
@@ -779,6 +780,31 @@ ENTRY(__enable_mmu) ret ENDPROC(__enable_mmu) +ENTRY(__cpu_secondary_check52bitva) +#ifdef CONFIG_ARM64_52BIT_VA + ldr_l x0, vabits_user + cmp x0, #52 + b.ne 2f + + mrs_s x0, SYS_ID_AA64MMFR2_EL1 + and x0, x0, #(0xf << ID_AA64MMFR2_LVA_SHIFT) + cbnz x0, 2f + + adr_l x0, va52mismatch + mov w1, #1 + strb w1, [x0] + dmb sy + dc ivac, x0 // Invalidate potentially stale cache line + + update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x0, x1 +1: wfe + wfi + b 1b + +#endif +2: ret +ENDPROC(__cpu_secondary_check52bitva) + __no_granule_support: /* Indicate that this CPU can't boot and is stuck in the kernel */ update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x1, x2
arch/arm64/kernel/smp.c +5 -0
@@ -108,6 +108,7 @@ static int boot_secondary(unsigned int cpu, struct task_struct *idle) }static DECLARE_COMPLETION (cpu_running); +bool va52mismatch__ro_after_init ;int __cpu_up (unsigned int cpu,struct task_struct *idle) {
@@ -137,6 +138,10 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)if (!cpu_online (cpu)) {pr_crit ("CPU%u: failed to come online\n" , cpu); + +if (IS_ENABLED (CONFIG_ARM64_52BIT_VA ) && va52mismatch) +pr_crit ("CPU%u: does not support 52-bit VAs\n" , cpu); + ret = -EIO ; } }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/321 arm64: smp: Handle errors reported by the firmware
In reply to Greg Kroah-HartmanFrom: Suzuki K Poulose <[email protected]>
[ Upstream commit f357b3a7e17af7736d67d8267edc1ed3d1dd9391 ]
The __cpu_up() routine ignores the errors reported by the firmware for a CPU bringup operation and looks for the error status set by the booting CPU. If the CPU never entered the kernel, we could end up in assuming stale error status, which otherwise would have been set/cleared appropriately by the booting CPU.
--- arch/arm64/kernel/smp.c | 1 + 1 file changed, 1 insertion(+)
arch/arm64/kernel/smp.c +1 -0
@@ -146,6 +146,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle) } }else {pr_err ("CPU%u: failed to boot: %d\n" , cpu, ret); +return ret; } secondary_data.task =NULL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/321 ARM: dts: Fix hsi gdd range for omap4
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit e9e685480b74aef3f3d0967dadb52eea3ff625d2 ]
While reviewing the missing mcasp ranges I noticed omap4 hsi range for gdd is wrong so let's fix it.
I'm not aware of any omap4 devices in mainline kernel though that use hsi though.
them with ti-sysc")
--- arch/arm/boot/dts/omap4-l4.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/omap4-l4.dtsi +2 -2
@@ -196,12 +196,12 @@ clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; - ranges = <0x0 0x58000 0x4000>; + ranges = <0x0 0x58000 0x5000>; hsi: hsi@0 { compatible = "ti,omap4-hsi"; reg = <0x0 0x4000>, - <0x4a05c000 0x1000>; + <0x5000 0x1000>; reg-names = "sys", "gdd"; clocks = <&l3_init_clkctrl OMAP4_HSI_CLKCTRL 0>;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 73/321 bus: ti-sysc: Check for no-reset and no-idle flags at the child level
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 4014c08ba39476a18af546186da625a6833a1529 ]
With ti-sysc, we need to now have the device tree properties for ti,no-reset-on-init and ti,no-idle-on-init at the module level instead of the child device level.
Let's check for these properties at the child device level to enable quirks, and warn about moving the properties to the module level.
Otherwise am335x-evm based boards tagging gpio1 with ti,no-reset-on-init will have their DDR power disabled if wired up in such a tricky way.
Note that this should not be an issue for earlier kernels as we don't rely on this until the dts files have been updated to probe with ti-sysc interconnect target driver.
--- drivers/bus/ti-sysc.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-)
drivers/bus/ti-sysc.c +25 -7
@@ -91,6 +91,9 @@ struct sysc {struct delayed_work idle_work; }; +static void sysc_parse_dts_quirks (struct sysc *ddata,struct device_node *np, +bool is_child); +void sysc_write (struct sysc *ddata,int offset,u32 value) {writel_relaxed (value, ddata->module_va + offset);
@@ -374,6 +377,7 @@ static int sysc_check_one_child(struct sysc *ddata,dev_warn (ddata->dev,"really a child ti,hwmods property?" );sysc_check_quirk_stdout (ddata, np); +sysc_parse_dts_quirks (ddata, np, true);return 0 ; }
@@ -1343,23 +1347,37 @@ static const struct sysc_dts_quirk sysc_dts_quirks[] = { .mask = SYSC_QUIRK_NO_RESET_ON_INIT, }, }; -static int sysc_init_dts_quirks (struct sysc *ddata) +static void sysc_parse_dts_quirks (struct sysc *ddata,struct device_node *np, +bool is_child) { -struct device_node *np = ddata->dev->of_node;const struct property *prop; -int i, len, error; -u32 val; - - ddata->legacy_mode =of_get_property (np,"ti,hwmods" ,NULL ); +int i, len;for (i =0 ; i <ARRAY_SIZE (sysc_dts_quirks); i++) { - prop =of_get_property (np, sysc_dts_quirks[i].name, &len); +const char *name = sysc_dts_quirks[i].name; + + prop =of_get_property (np, name, &len);if (!prop)continue ; ddata->cfg.quirks |= sysc_dts_quirks[i].mask; +if (is_child) { +dev_warn (ddata->dev, +"dts flag should be at module level for %s\n" , + name); + } } +} + +static int sysc_init_dts_quirks (struct sysc *ddata) +{ +struct device_node *np = ddata->dev->of_node; +int error; +u32 val; + + ddata->legacy_mode =of_get_property (np,"ti,hwmods" ,NULL ); +sysc_parse_dts_quirks (ddata, np, false); error =of_property_read_u32 (np,"ti,sysc-delay-us" , &val);if (!error) {if (val >255 ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 74/321 platform/x86: mlx-platform: Fix LED configuration
In reply to Greg Kroah-HartmanFrom: Vadim Pasternak <[email protected]>
[ Upstream commit 440f343df1996302d9a3904647ff11b689bf27bc ]
Exchange LED configuration between msn201x and next generation systems types.
Bug was introduced when LED driver activation was added to mlx-platform. LED configuration for the three new system MQMB7, MSN37, MSN34 was assigned to MSN21 and vice versa. This bug affects MSN21 only and likely requires backport to v4.19.
--- drivers/platform/x86/mlx-platform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/platform/x86/mlx-platform.c +2 -2
@@ -1421,7 +1421,7 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi) mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data; mlxplat_hotplug->deferred_nr = mlxplat_default_channels[i -1 ][MLXPLAT_CPLD_GRP_CHNL_NUM -1 ]; - mlxplat_led = &mlxplat_default_ng_led_data; + mlxplat_led = &mlxplat_msn21xx_led_data; mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;return 1 ;
@@ -1439,7 +1439,7 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi) mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; mlxplat_hotplug->deferred_nr = mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM -1 ]; - mlxplat_led = &mlxplat_msn21xx_led_data; + mlxplat_led = &mlxplat_default_ng_led_data; mlxplat_fan = &mlxplat_default_fan_data;return 1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 78/321 RDMA/vmw_pvrdma: Use atomic memory allocation in create AH
In reply to Greg Kroah-HartmanFrom: Gal Pressman <[email protected]>
[ Upstream commit a276a4d93bf1580d737f38d1810e5f4b166f3edd ]
Create address handle callback should not sleep, use GFP_ATOMIC instead of GFP_KERNEL for memory allocation.
--- drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c +1 -1
@@ -555,7 +555,7 @@ struct ib_ah *pvrdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,if (!atomic_add_unless (&dev->num_ahs,1 , dev->dsr->caps.max_ah))return ERR_PTR (-ENOMEM ); - ah =kzalloc (sizeof (*ah),GFP_KERNEL ); + ah =kzalloc (sizeof (*ah),GFP_ATOMIC );if (!ah) {atomic_dec (&dev->num_ahs);return ERR_PTR (-ENOMEM );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/321 PM / AVS: SmartReflex: NULL check before some freeing functions is not needed
In reply to Greg Kroah-HartmanFrom: Thomas Meyer <[email protected]>
[ Upstream commit 14d338a857f05f894ba3badd9e6d3039c68b8180 ]
NULL check before some freeing functions is not needed.
--- drivers/power/avs/smartreflex.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/power/avs/smartreflex.c +1 -2
@@ -1010,8 +1010,7 @@ static int omap_sr_remove(struct platform_device *pdev)if (sr_info->autocomp_active)sr_stop_vddautocomp (sr_info); -if (sr_info->dbg_dir) -debugfs_remove_recursive (sr_info->dbg_dir); +debugfs_remove_recursive (sr_info->dbg_dir);pm_runtime_disable (&pdev->dev);list_del (&sr_info->node);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 44/321 mac80211: fix station inactive_time shortly after boot
In reply to Greg Kroah-HartmanFrom: Ahmed Zaki <[email protected]>
[ Upstream commit 285531f9e6774e3be71da6673d475ff1a088d675 ]
In the first 5 minutes after boot (time of INITIAL_JIFFIES), ieee80211_sta_last_active() returns zero if last_ack is zero. This leads to "inactive time" showing jiffies_to_msecs(jiffies).
# iw wlan0 station get fc:ec:da:64:a6:dd Station fc:ec:da:64:a6:dd (on wlan0) inactive time: 4294894049 ms . . connected time: 70 seconds
Fix by returning last_rx if last_ack == 0.
--- net/mac80211/sta_info.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/mac80211/sta_info.c +2 -1
@@ -2356,7 +2356,8 @@ unsigned long ieee80211_sta_last_active(struct sta_info *sta) {struct ieee80211_sta_rx_stats *stats =sta_get_last_rx_stats (sta); -if (time_after (stats->last_rx, sta->status_stats.last_ack)) +if (!sta->status_stats.last_ack || +time_after (stats->last_rx, sta->status_stats.last_ack))return stats->last_rx;return sta->status_stats.last_ack; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/321 xfs: zero length symlinks are not valid
In reply to Greg Kroah-HartmanFrom: Dave Chinner <[email protected]>
[ Upstream commit 43feeea88c9cb2955b9f7ba8152ec5abeea42810 ]
A log recovery failure has been reproduced where a symlink inode has a zero length in extent form. It was caused by a shutdown during a combined fstress+fsmark workload.
The underlying problem is the issue in xfs_inactive_symlink(): the inode is unlocked between the symlink inactivation/truncation and the inode being freed. This opens a window for the inode to be written to disk before it xfs_ifree() removes it from the unlinked list, marks it free in the inobt and zeros the mode.
For shortform inodes, the fix is simple. xfs_ifree() clears the data fork state, so there's no need to do it in xfs_inactive_symlink(). This means the shortform fork verifier will not see a zero length data fork as it mirrors the inode size through to xfs_ifree()), and hence if the inode gets written back and the fork verifiers are run they will still see a fork that matches the on-disk inode size.
For extent form (remote) symlinks, it is a little more tricky. Here we explicitly set the inode size to zero, so the above race can lead to zero length symlinks on disk. Because the inode is unlinked at this point (i.e. on the unlinked list) and unreferenced, it can never be seen again by a user. Hence when we set the inode size to zeor, also change the type to S_IFREG. xfs_ifree() expects S_IFREG inodes to be of zero length, and so this avoids all the problems of zero length symlinks ever hitting the disk. It also avoids the problem of needing to handle zero length symlink inodes in log recovery to replay the extent free intents and the remaining deferops to free the extents the symlink used.
Also add a couple of asserts to warn us if zero length symlinks end up in either the symlink create or inactivation paths.
--- fs/xfs/libxfs/xfs_symlink_remote.c | 14 +++++++++---- fs/xfs/xfs_symlink.c | 33 +++++++++++++++--------------- 2 files changed, 27 insertions(+), 20 deletions(-)
fs/xfs/libxfs/xfs_symlink_remote.c +10 -4
@@ -199,7 +199,10 @@ xfs_symlink_local_to_remote( ifp->if_bytes - 1); } -/* Verify the consistency of an inline symlink. */ +/* +* Verify the in-memory consistency of an inline symlink data fork. This +* does not do on-disk format checks. +*/ xfs_failaddr_t xfs_symlink_shortform_verify (struct xfs_inode *ip)
@@ -215,9 +218,12 @@ xfs_symlink_shortform_verify( size = ifp->if_bytes; endp = sfp + size; -/* Zero length symlinks can exist while we're deleting a remote one. */ -if (size ==0 ) -return NULL ; +/* +* Zero length symlinks should never occur in memory as they are +* never alllowed to exist on disk. +*/ +if (!size) +return __this_address;/* No negative sizes or overly long symlink targets. */ if (size <0 || size >XFS_SYMLINK_MAXLEN )
fs/xfs/xfs_symlink.c +17 -16
@@ -192,6 +192,7 @@ xfs_symlink( pathlen =strlen (target_path);if (pathlen >=XFS_SYMLINK_MAXLEN )/* total string too long */ return -ENAMETOOLONG ; +ASSERT (pathlen >0 ); udqp = gdqp =NULL ; prid =xfs_get_initial_prid (dp);
@@ -378,6 +379,12 @@ out_release_inode:/* * Free a symlink that has blocks associated with it. +* +* Note: zero length symlinks are not allowed to exist. When we set the size to +* zero, also change it to a regular file so that it does not get written to +* disk as a zero length symlink. The inode is on the unlinked list already, so +* userspace cannot find this inode anymore, so this change is not user visible +* but allows us to catch corrupt zero-length symlinks in the verifiers. */ STATIC int xfs_inactive_symlink_rmt(
@@ -412,13 +419,14 @@ xfs_inactive_symlink_rmt(xfs_trans_ijoin (tp, ip,0 );/* -* Lock the inode, fix the size, and join it to the transaction. -* Hold it so in the normal path, we still have it locked for -* the second transaction. In the error paths we need it +* Lock the inode, fix the size, turn it into a regular file and join it +* to the transaction. Hold it so in the normal path, we still have it +* locked for the second transaction. In the error paths we need it * held so the cancel won't rele it, see below. */ size = (int )ip->i_d.di_size; ip->i_d.di_size =0 ; +VFS_I (ip)->i_mode = (VFS_I (ip)->i_mode & ~S_IFMT ) |S_IFREG ;xfs_trans_log_inode (tp, ip,XFS_ILOG_CORE );/* * Find the block(s) so we can inval and unmap them.
@@ -494,17 +502,10 @@ xfs_inactive_symlink(return -EIO ;xfs_ilock (ip,XFS_ILOCK_EXCL ); - -/* -* Zero length symlinks _can_ exist. -*/ pathlen = (int )ip->i_d.di_size; -if (!pathlen) { -xfs_iunlock (ip,XFS_ILOCK_EXCL ); -return 0 ; - } +ASSERT (pathlen); -if (pathlen <0 || pathlen >XFS_SYMLINK_MAXLEN ) { +if (pathlen <=0 || pathlen >XFS_SYMLINK_MAXLEN ) {xfs_alert (mp,"%s: inode (0x%llx) bad symlink length (%d)" , __func__, (unsigned long long )ip->i_ino, pathlen);xfs_iunlock (ip,XFS_ILOCK_EXCL );
@@ -512,12 +513,12 @@ xfs_inactive_symlink(return -EFSCORRUPTED ; } +/* +* Inline fork state gets removed by xfs_difree() so we have nothing to +* do here in that case. +*/ if (ip->i_df.if_flags &XFS_IFINLINE ) { -if (ip->i_df.if_bytes >0 ) -xfs_idata_realloc (ip, -(ip->i_df.if_bytes), -XFS_DATA_FORK );xfs_iunlock (ip,XFS_ILOCK_EXCL ); -ASSERT (ip->i_df.if_bytes ==0 );return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 81/321 ARM: ks8695: fix section mismatch warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 4aa64677330beeeed721b4b122884dabad845d66 ]
WARNING: vmlinux.o(.text+0x13250): Section mismatch in reference from the function acs5k_i2c_init() to the (unknown reference) .init.data:(unknown) The function acs5k_i2c_init() references
the (unknown reference) __initdata (unknown).
This is often because acs5k_i2c_init lacks a __initdata
annotation or the annotation of (unknown) is wrong.
--- arch/arm/mach-ks8695/board-acs5k.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-ks8695/board-acs5k.c +1 -1
@@ -100,7 +100,7 @@ static struct i2c_board_info acs5k_i2c_devs[] __initdata = { }, }; -static void acs5k_i2c_init (void ) +static void __init acs5k_i2c_init (void ) {/* The gpio interface */ gpiod_add_lookup_table (&acs5k_i2c_gpiod_table);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 45/321 block: drbd: remove a stray unlock in __drbd_send_protocol()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 8e9c523016cf9983b295e4bc659183d1fa6ef8e0 ]
There are two callers of this function and they both unlock the mutex so this ends up being a double unlock.
--- drivers/block/drbd/drbd_main.c | 1 - 1 file changed, 1 deletion(-)
drivers/block/drbd/drbd_main.c +0 -1
@@ -796,7 +796,6 @@ int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_packet cmif (nc->tentative && connection->agreed_pro_version <92 ) {rcu_read_unlock (); -mutex_unlock (&sock->mutex);drbd_err (connection,"--dry-run is not supported by peer" );return -EOPNOTSUPP ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 46/321 pwm: bcm-iproc: Prevent unloading the driver module while in use
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 24906a41eecb73d51974ade0847c21e429beec60 ]
The owner member of struct pwm_ops must be set to THIS_MODULE to increase the reference count of the module such that the module cannot be removed while its code is in use.
--- drivers/pwm/pwm-bcm-iproc.c | 1 + 1 file changed, 1 insertion(+)
drivers/pwm/pwm-bcm-iproc.c +1 -0
@@ -187,6 +187,7 @@ static int iproc_pwmc_apply(struct pwm_chip *chip, struct pwm_device *pwm,static const struct pwm_ops iproc_pwm_ops = { .apply = iproc_pwmc_apply, .get_state = iproc_pwmc_get_state, + .owner =THIS_MODULE , };static int iproc_pwmc_probe (struct platform_device *pdev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 47/321 scsi: target/tcmu: Fix queue_cmd_ring() declaration
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
[ Upstream commit e7f411049f5164ee6db6c3434c07302846f09990 ]
This patch does not change any functionality but avoids that sparse complains about the queue_cmd_ring() function and its callers.
--- drivers/target/target_core_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/target/target_core_user.c +1 -1
@@ -962,7 +962,7 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd)* 0 success * 1 internally queued to wait for ring memory to free. */ -static sense_reason_t queue_cmd_ring (struct tcmu_cmd *tcmu_cmd,int *scsi_err) +static int queue_cmd_ring (struct tcmu_cmd *tcmu_cmd,sense_reason_t *scsi_err) {struct tcmu_dev *udev = tcmu_cmd->tcmu_dev;struct se_cmd *se_cmd = tcmu_cmd->se_cmd;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 84/321 scsi: qla2xxx: Fix NPIV handling for FC-NVMe
In reply to Greg Kroah-HartmanFrom: Himanshu Madhani <[email protected]>
[ Upstream commit 5e6803b409ba3c18434de6693062d98a470bcb1e ]
This patch fixes issues with NPIV port with FC-NVMe. Clean up code for remoteport delete and also call nvme_delete when deleting VPs.
--- drivers/scsi/qla2xxx/qla_nvme.c | 16 +++------------- drivers/scsi/qla2xxx/qla_os.c | 2 ++ 2 files changed, 5 insertions(+), 13 deletions(-)
drivers/scsi/qla2xxx/qla_nvme.c +3 -13
@@ -474,21 +474,10 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,int rval = -ENODEV ;srb_t *sp;struct qla_qpair *qpair = hw_queue_handle; -struct nvme_private *priv; +struct nvme_private *priv = fd->private;struct qla_nvme_rport *qla_rport = rport->private; -if (!fd || !qpair) { -ql_log (ql_log_warn,NULL ,0x2134 , -"NO NVMe request or Queue Handle\n" ); -return rval; - } - - priv = fd->private; fcport = qla_rport->fcport; -if (!fcport) { -ql_log (ql_log_warn,NULL ,0x210e ,"No fcport ptr\n" ); -return rval; - } vha = fcport->vha;
@@ -517,6 +506,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, sp->name ="nvme_cmd" ; sp->done = qla_nvme_sp_done; sp->qpair = qpair; + sp->vha = vha; nvme = &sp->u.iocb_cmd; nvme->u.nvme.desc = fd;
@@ -564,7 +554,7 @@ static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport)schedule_work (&fcport->free_work); } - fcport->nvme_flag &= ~(NVME_FLAG_REGISTERED |NVME_FLAG_DELETING ); + fcport->nvme_flag &= ~NVME_FLAG_DELETING ;ql_log (ql_log_info, fcport->vha,0x2110 ,"remoteport_delete of %p completed.\n" , fcport); }
drivers/scsi/qla2xxx/qla_os.c +2 -0
@@ -3538,6 +3538,8 @@ qla2x00_delete_all_vps(struct qla_hw_data *ha, scsi_qla_host_t *base_vha)spin_unlock_irqrestore (&ha->vport_slock, flags);mutex_unlock (&ha->vport_lock); +qla_nvme_delete (vha); +fc_vport_terminate (vha->fc_vport);scsi_host_put (vha->host);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 93/321 brcmfmac: set SDIO F1 MesBusyCtrl for CYW4373
In reply to Greg Kroah-HartmanFrom: Madhan Mohan R <[email protected]>
[ Upstream commit 58e4bbea0c1d9b5ace11df968c5dc096ce052a73 ]
Along with F2 watermark (existing) configuration, F1 MesBusyCtrl should be enabled & sdio device RX FIFO watermark should be configured to avoid overflow errors.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 +++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +3 -0
@@ -4133,6 +4133,9 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, devctl |=SBSDIO_DEVCTL_F2WM_ENAB ;brcmf_sdiod_writeb (sdiod,SBSDIO_DEVICE_CTL , devctl, &err); +brcmf_sdiod_writeb (sdiod,SBSDIO_FUNC1_MESBUSYCTRL , +CY_4373_F2_WATERMARK | +SBSDIO_MESBUSYCTRL_ENAB , &err);break ;default : brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +8 -1
@@ -77,7 +77,7 @@#define SBSDIO_GPIO_OUT 0x10006/* gpio enable */ #define SBSDIO_GPIO_EN 0x10007 -/* rev < 7, watermark for sdio device */ +/* rev < 7, watermark for sdio device TX path */ #define SBSDIO_WATERMARK 0x10008/* control busy signal generation */ #define SBSDIO_DEVICE_CTL 0x10009
@@ -104,6 +104,13 @@#define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C/* MesBusyCtl (rev 11) */ #define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D +/* Watermark for sdio device RX path */ +#define SBSDIO_MESBUSY_RXFIFO_WM_MASK 0x7F +#define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT 0 +/* Enable busy capability for MES access */ +#define SBSDIO_MESBUSYCTRL_ENAB 0x80 +#define SBSDIO_MESBUSYCTRL_ENAB_SHIFT 7 +/* Sdio Core Rev 12 */ #define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E#define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 95/321 bcache: do not check if debug dentry is ERR or NULL explicitly on remove
In reply to Greg Kroah-HartmanFrom: Shenghui Wang <[email protected]>
[ Upstream commit ae17102316550b4b230a283febe31b2a9ff30084 ]
debugfs_remove and debugfs_remove_recursive will check if the dentry pointer is NULL or ERR, and will do nothing in that case.
Remove the check in cache_set_free and bch_debug_init.
--- drivers/md/bcache/debug.c | 3 +-- drivers/md/bcache/super.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
drivers/md/bcache/debug.c +1 -2
@@ -249,8 +249,7 @@ void bch_debug_init_cache_set(struct cache_set *c)void bch_debug_exit (void ) { -if (!IS_ERR_OR_NULL (bcache_debug)) -debugfs_remove_recursive (bcache_debug); +debugfs_remove_recursive (bcache_debug); }void __init bch_debug_init (struct kobject *kobj)
drivers/md/bcache/super.c +1 -2
@@ -1491,8 +1491,7 @@ static void cache_set_free(struct closure *cl)struct cache *ca;unsigned int i; -if (!IS_ERR_OR_NULL (c->debug)) -debugfs_remove (c->debug); +debugfs_remove (c->debug);bch_open_buckets_free (c);bch_btree_cache_free (c);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 97/321 xfs: require both realtime inodes to mount
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit 64bafd2f1e484e27071e7584642005d56516cb77 ]
Since mkfs always formats the filesystem with the realtime bitmap and summary inodes immediately after the root directory, we should expect that both of them are present and loadable, even if there isn't a realtime volume attached. There's no reason to skip this if rbmino == NULLFSINO; in fact, this causes an immediate crash if the there /is/ a realtime volume and someone writes to it.
--- fs/xfs/xfs_rtalloc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/xfs/xfs_rtalloc.c +1 -3
@@ -1198,13 +1198,11 @@ xfs_rtmount_inodes(xfs_sb_t *sbp; sbp = &mp->m_sb; -if (sbp->sb_rbmino ==NULLFSINO ) -return 0 ; error =xfs_iget (mp,NULL , sbp->sb_rbmino,0 ,0 , &mp->m_rbmip);if (error)return error;ASSERT (mp->m_rbmip !=NULL ); -ASSERT (sbp->sb_rsumino !=NULLFSINO ); + error =xfs_iget (mp,NULL , sbp->sb_rsumino,0 ,0 , &mp->m_rsumip);if (error) {xfs_irele (mp->m_rbmip);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 98/321 nvme: fix kernel paging oops
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 092ff0520070fad8407b196f3bb6156ce77a6f98 ]
free the controller discard_page correctly.
--- drivers/nvme/host/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/core.c +1 -1
@@ -3569,7 +3569,7 @@ static void nvme_free_ctrl(struct device *dev)ida_simple_remove (&nvme_instance_ida, ctrl->instance);kfree (ctrl->effects);nvme_mpath_uninit (ctrl); -kfree (ctrl->discard_page); +__free_page (ctrl->discard_page);if (subsys) {mutex_lock (&subsys->lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/321 ubifs: Fix default compression selection in ubifs
In reply to Greg Kroah-HartmanFrom: Gabor Juhos <[email protected]>
[ Upstream commit d62e98ed1efcaa94caa004f622944afdce5f1c3c ]
When ubifs is build without the LZO compressor and no compressor is given the creation of the default file system will fail. before selection the LZO compressor check if it is present and if not fall back to the zlib or none.
--- fs/ubifs/sb.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
fs/ubifs/sb.c +12 -1
@@ -63,6 +63,17 @@/* Default time granularity in nanoseconds */ #define DEFAULT_TIME_GRAN 1000000000 +static int get_default_compressor (struct ubifs_info *c) +{ +if (ubifs_compr_present (c,UBIFS_COMPR_LZO )) +return UBIFS_COMPR_LZO ; + +if (ubifs_compr_present (c,UBIFS_COMPR_ZLIB )) +return UBIFS_COMPR_ZLIB ; + +return UBIFS_COMPR_NONE ; +} +/** * create_default_filesystem - format empty UBI volume. * @c: UBIFS file-system description object
@@ -186,7 +197,7 @@ static int create_default_filesystem(struct ubifs_info *c)if (c->mount_opts.override_compr) sup->default_compr =cpu_to_le16 (c->mount_opts.compr_type);else - sup->default_compr =cpu_to_le16 (UBIFS_COMPR_LZO ); + sup->default_compr =cpu_to_le16 (get_default_compressor (c));generate_random_uuid (sup->uuid);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 100/321 ubi: Put MTD device after it is not used
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit b95f83ab762dd6211351b9140f99f43644076ca8 ]
The MTD device reference is dropped via put_mtd_device, however its field ->index is read and passed to ubi_msg. To fix this, the patch moves the reference dropping after calling ubi_msg.
--- drivers/mtd/ubi/build.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/build.c +1 -1
@@ -1101,10 +1101,10 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)ubi_wl_close (ubi);ubi_free_internal_volumes (ubi);vfree (ubi->vtbl); -put_mtd_device (ubi->mtd);vfree (ubi->peb_buf);vfree (ubi->fm_buf);ubi_msg (ubi,"mtd%d is detached" , ubi->mtd->index); +put_mtd_device (ubi->mtd);put_device (&ubi->dev);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/321 ubi: Do not drop UBI device reference before using
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit e542087701f09418702673631a908429feb3eae0 ]
The UBI device reference is dropped but then the device is used as a parameter of ubi_err. The bug is introduced in changing ubi_err's behavior. The old ubi_err does not require a UBI device as its first parameter, but the new one does.
--- drivers/mtd/ubi/kapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/kapi.c +1 -1
@@ -227,9 +227,9 @@ out_unlock: out_free:kfree (desc); out_put_ubi: -ubi_put_device (ubi);ubi_err (ubi,"cannot open device %d, volume %d, error %d" , ubi_num, vol_id, err); +ubi_put_device (ubi);return ERR_PTR (err); }EXPORT_SYMBOL_GPL (ubi_open_volume);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 102/321 microblaze: adjust the help to the real behavior
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit bafcc61d998c1ca18f556d92a0e95335ac68c7da ]
"make ARCH=microblaze help" mentions simpleImage.<dt>.unstrip, but it is not a real Make target. It does not work because Makefile assumes "system.unstrip" is the name of DT.
$ make ARCH=microblaze CROSS_COMPILE=microblaze-linux- simpleImage.system.unstrip [ snip ] make[1]: *** No rule to make target 'arch/microblaze/boot/dts/system.unstrip.dtb', needed by 'arch/microblaze/boot/dts/system.dtb'. Stop. make: *** [Makefile;1060: arch/microblaze/boot/dts] Error 2 make: *** Waiting for unfinished jobs....
simpleImage.<dt> works like a phony target that generates multiple images. Reflect the real behavior. I removed the DT directory path information because it is already explained a few lines below.
While I am here, I deleted the redundant *_defconfig explanation.
The top-level Makefile caters to list available defconfig files:
mmu_defconfig - Build for mmu
nommu_defconfig - Build for nommu
--- arch/microblaze/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/microblaze/Makefile +5 -5
@@ -91,11 +91,11 @@ define archhelp echo '* linux.bin - Create raw binary' echo ' linux.bin.gz - Create compressed raw binary' echo ' linux.bin.ub - Create U-Boot wrapped raw binary' - echo ' simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in' - echo ' - stripped elf with fdt blob' - echo ' simpleImage.<dt>.unstrip - full ELF image with fdt blob' - echo ' *_defconfig - Select default config from arch/microblaze/configs' - echo '' + echo ' simpleImage.<dt> - Create the following images with <dt>.dtb linked in' + echo ' simpleImage.<dt> : raw image' + echo ' simpleImage.<dt>.ub : raw image with U-Boot header' + echo ' simpleImage.<dt>.unstrip: ELF (identical to vmlinux)' + echo ' simpleImage.<dt>.strip : stripped ELF' echo ' Targets with <dt> embed a device tree blob inside the image' echo ' These targets support board with firmware that does not' echo ' support passing a device tree directly. Replace <dt> with the'
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 103/321 microblaze: move "... is ready" messages to arch/microblaze/Makefile
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 2e14f94cf4bc2f15ca5362e81ca3a987c79e3062 ]
To prepare for more fixes, move this to arch/microblaze/Makefile. Otherwise, the same "... is ready" would be printed multiple times.
--- arch/microblaze/Makefile | 2 ++ arch/microblaze/boot/Makefile | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-)
arch/microblaze/Makefile +2 -0
@@ -83,9 +83,11 @@ archclean: linux.bin linux.bin.gz linux.bin.ub: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ + @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' simpleImage.%: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ + @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' define archhelp echo '* linux.bin - Create raw binary'
arch/microblaze/boot/Makefile +0 -4
@@ -9,15 +9,12 @@ OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary $(obj)/linux.bin: vmlinux FORCE $(call if_changed,objcopy) - @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' $(obj)/linux.bin.ub: $(obj)/linux.bin FORCE $(call if_changed,uimage) - @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' $(obj)/linux.bin.gz: $(obj)/linux.bin FORCE $(call if_changed,gzip) - @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' quiet_cmd_cp = CP $< $@$2 cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
@@ -35,6 +32,5 @@ $(obj)/simpleImage.%: vmlinux FORCE $(call if_changed,objcopy) $(call if_changed,uimage) $(call if_changed,strip,.strip) - @echo 'Kernel: $(UIMAGE_OUT) is ready' ' (#'`cat .version`')' clean-files += simpleImage.*.unstrip linux.bin.ub
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 104/321 microblaze: fix multiple bugs in arch/microblaze/boot/Makefile
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 4722a3e6b716d9d4594c3cf3856b03bbd24a59a8 ]
This commit fixes some build issues.
The first issue is the breakage of linux.bin.ub target since commit ece97f3a5fb5 ("microblaze: Fix simpleImage format generation") because the addition of UIMAGE_{IN,OUT} affected it.
make ARCH=microblaze CROSS_COMPILE=microblaze-linux- linux.bin.ub
[ snip ]
OBJCOPY arch/microblaze/boot/linux.bin
UIMAGE arch/microblaze/boot/linux.bin.ub.ub/usr/bin/mkimage: Can't open arch/microblaze/boot/linux.bin.ub: No such file or directory make[1]: *** [arch/microblaze/boot/Makefile;14: arch/microblaze/boot/linux.bin.ub] Error 1
make: *** [arch/microblaze/Makefile;83: linux.bin.ub] Error 2
The second issue is the use of the "if_changed" multiple times for the same target.
As commit 92a4728608a8 ("x86/boot: Fix if_changed build flip/flop bug") pointed out, this never works properly. Moreover, generating multiple images as a side-effect is confusing.
Let's split the build recipe for each image.
simpleImage.<dt>*.unstrip is just a copy of vmlinux.
simpleImage.<dt> and simpleImage.<dt>.ub are created in the same way as linux.bin and linux.bin.ub, respectively.
I kept simpleImage.* recipes independent of linux.bin.* ones to not change the behavior.
Lastly, this commit fixes "make ARCH=microblaze clean". Previously, it only cleaned up the unstrip image. Now, all the simpleImage files are cleaned.
--- arch/microblaze/Makefile | 2 +- arch/microblaze/boot/Makefile | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-)
arch/microblaze/Makefile +1 -1
@@ -86,7 +86,7 @@ linux.bin linux.bin.gz linux.bin.ub: vmlinux @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' simpleImage.%: vmlinux - $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ + $(Q)$(MAKE) $(build)=$(boot) $(addprefix $(boot)/$@., ub unstrip strip) @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' define archhelp
arch/microblaze/boot/Makefile +9 -10
@@ -3,7 +3,7 @@ # arch/microblaze/boot/Makefile # -targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.% +targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.* OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary
@@ -16,21 +16,20 @@ $(obj)/linux.bin.ub: $(obj)/linux.bin FORCE $(obj)/linux.bin.gz: $(obj)/linux.bin FORCE $(call if_changed,gzip) -quiet_cmd_cp = CP $< $@$2 - cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) - quiet_cmd_strip = STRIP $< $@$2 cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \ -K _fdt_start $< -o $@$2 UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR) -UIMAGE_IN = $@ -UIMAGE_OUT = [email protected] -$(obj)/simpleImage.%: vmlinux FORCE - $(call if_changed,cp,.unstrip) +$(obj)/simpleImage.$(DTB): vmlinux FORCE $(call if_changed,objcopy) + +$(obj)/simpleImage.$(DTB).ub: $(obj)/simpleImage.$(DTB) FORCE $(call if_changed,uimage) - $(call if_changed,strip,.strip) -clean-files += simpleImage.*.unstrip linux.bin.ub +$(obj)/simpleImage.$(DTB).unstrip: vmlinux FORCE + $(call if_changed,shipped) + +$(obj)/simpleImage.$(DTB).strip: vmlinux FORCE + $(call if_changed,strip)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 106/321 iwlwifi: mvm: force TCM re-evaluation on TCM resume
In reply to Greg Kroah-HartmanFrom: Avraham Stern <[email protected]>
[ Upstream commit 7bc2468277033e05401d5f8fd48a772f407338c2 ]
When traffic load is not low or low latency is active, TCM schedules re-evaluation work so in case traffic stops TCM will detect that traffic load has become low or that low latency is no longer active. However, if TCM is paused when the re-evaluation work runs, it does not re-evaluate and the re-evaluation work is no longer scheduled. As a result, TCM will not indicate that low latency is no longer active or that traffic load is low when traffic stops.
Fix this by forcing TCM re-evaluation when TCM is resumed in case low latency is active or traffic load is not low.
--- drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/net/wireless/intel/iwlwifi/mvm/utils.c +14 -0
@@ -1804,6 +1804,7 @@ void iwl_mvm_pause_tcm(struct iwl_mvm *mvm, bool with_cancel)void iwl_mvm_resume_tcm (struct iwl_mvm *mvm) {int mac; +bool low_latency = false;spin_lock_bh (&mvm->tcm.lock); mvm->tcm.ts = jiffies;
@@ -1815,10 +1816,23 @@ void iwl_mvm_resume_tcm(struct iwl_mvm *mvm)memset (&mdata->tx.pkts,0 ,sizeof (mdata->tx.pkts));memset (&mdata->rx.airtime,0 ,sizeof (mdata->rx.airtime));memset (&mdata->tx.airtime,0 ,sizeof (mdata->tx.airtime)); + +if (mvm->tcm.result.low_latency[mac]) + low_latency = true; }/* The TCM data needs to be reset before "paused" flag changes */ smp_mb (); mvm->tcm.paused = false; + +/* +* if the current load is not low or low latency is active, force +* re-evaluation to cover the case of no traffic. +*/ +if (mvm->tcm.result.global_load >IWL_MVM_TRAFFIC_LOW ) +schedule_delayed_work (&mvm->tcm.work,MVM_TCM_PERIOD ); +else if (low_latency) +schedule_delayed_work (&mvm->tcm.work,MVM_LL_PERIOD ); +spin_unlock_bh (&mvm->tcm.lock); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 107/321 iwlwifi: pcie: fix erroneous print
In reply to Greg Kroah-HartmanFrom: Sara Sharon <[email protected]>
[ Upstream commit 0916224eaa77bff0fbbc747961d550ff8db45457 ]
When removing the driver, the following flow can happen:
1. host command is in progress, for example at index 68.
2. RX interrupt is received with the response.
3. Before it is processed, the remove flow kicks in, and calls iwl_pcie_txq_unmap. The function cleans all DMA, and promotes the read pointer to 69.
4. RX thread proceeds with the processing, and is calling iwl_pcie_cmdq_reclaim, which will print this error:
iwl_pcie_cmdq_reclaim: Read index for DMA queue txq id (0), index 4 is out of range [0-256] 69 69.
Detect this situation, and avoid the print. Change it to warning while at it, to make such issues more noticeable in the future.
--- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/tx.c +5 -5
@@ -1247,11 +1247,11 @@ static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)if (idx >= trans->cfg->base_params->max_tfd_queue_size || (!iwl_queue_used (txq, idx))) { -IWL_ERR (trans, -"%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n" , - __func__, txq_id, idx, - trans->cfg->base_params->max_tfd_queue_size, - txq->write_ptr, txq->read_ptr); +WARN_ONCE (test_bit (txq_id, trans_pcie->queue_used), +"%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n" , + __func__, txq_id, idx, + trans->cfg->base_params->max_tfd_queue_size, + txq->write_ptr, txq->read_ptr);return ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 108/321 iwlwifi: pcie: set cmd_len in the correct place
In reply to Greg Kroah-HartmanFrom: Sara Sharon <[email protected]>
[ Upstream commit 956343a61226e1af3d146386f70a059feb567d0c ]
command len is set too early in the code, since when building AMSDU, the size changes. This causes the byte count table to have the wrong size.
--- .../net/wireless/intel/iwlwifi/pcie/tx-gen2.c | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +12 -12
@@ -560,18 +560,6 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,spin_lock (&txq->lock); -if (trans->cfg->device_family >=IWL_DEVICE_FAMILY_22560 ) { -struct iwl_tx_cmd_gen3 *tx_cmd_gen3 = - (void *)dev_cmd->payload; - - cmd_len =le16_to_cpu (tx_cmd_gen3->len); - }else { -struct iwl_tx_cmd_gen2 *tx_cmd_gen2 = - (void *)dev_cmd->payload; - - cmd_len =le16_to_cpu (tx_cmd_gen2->len); - } -if (iwl_queue_space (trans, txq) < txq->high_mark) {iwl_stop_queue (trans, txq);
@@ -609,6 +597,18 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,return -1 ; } +if (trans->cfg->device_family >=IWL_DEVICE_FAMILY_22560 ) { +struct iwl_tx_cmd_gen3 *tx_cmd_gen3 = + (void *)dev_cmd->payload; + + cmd_len =le16_to_cpu (tx_cmd_gen3->len); + }else { +struct iwl_tx_cmd_gen2 *tx_cmd_gen2 = + (void *)dev_cmd->payload; + + cmd_len =le16_to_cpu (tx_cmd_gen2->len); + } +/* Set up entry for this TFD in Tx byte-count array */ iwl_pcie_gen2_update_byte_tbl (trans_pcie, txq, cmd_len,iwl_pcie_gen2_get_num_tbs (trans, tfd));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 109/321 gpio: pca953x: Fix AI overflow on PCAL6524
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit 92f45ebe68181c2d7f76633ffae55bc9447d62cd ]
The PCAL_PINCTRL_MASK is too large. The extended register block on PCAL6524, which is the largest chip with this block, has the block limited to address range 0x40..0x7f. This is because the bit 7 in the command register is used for the Address Increment functionality.
Trim the mask to 0x60 to match the datasheet and to prevent accidental overwrite of the AI bit.
--- drivers/gpio/gpio-pca953x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +1 -1
@@ -58,7 +58,7 @@#define PCA_GPIO_MASK 0x00FF#define PCAL_GPIO_MASK 0x1f -#define PCAL_PINCTRL_MASK 0xe0 +#define PCAL_PINCTRL_MASK 0x60#define PCA_INT 0x0100#define PCA_PCAL 0x0200
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 110/321 gpiolib: Fix return value of gpio_to_desc() stub if !GPIOLIB
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit c5510b8dafce5f3f5a039c9b262ebcae0092c462 ]
If CONFIG_GPOILIB is not set, the stub of gpio_to_desc() should return the same type of error as regular version: NULL. All the callers compare the return value of gpio_to_desc() against NULL, so returned ERR_PTR would be treated as non-error case leading to dereferencing of error value.
--- include/linux/gpio/consumer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/gpio/consumer.h +1 -1
@@ -475,7 +475,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc,static inline struct gpio_desc *gpio_to_desc (unsigned gpio) { -return ERR_PTR (-EINVAL ); +return NULL ; }static inline int desc_to_gpio (const struct gpio_desc *desc)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 86/321 nvme: provide fallback for discard alloc failure
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
[ Upstream commit cb5b7262b011cfb793519bf97e54dff5282da23c ]
When boxes are run near (or to) OOM, we have a problem with the discard page allocation in nvme. If we fail allocating the special page, we return busy, and it'll get retried. But since ordering is honored for dispatch requests, we can keep retrying this same IO and failing. Behind that IO could be requests that want to free memory, but they never get the chance.
Allocate a fixed discard page per controller for a safe fallback, and use that if the initial allocation fails.
--- drivers/nvme/host/core.c | 41 ++++++++++++++++++++++++++++++++++------ drivers/nvme/host/nvme.h | 3 +++ 2 files changed, 38 insertions(+), 6 deletions(-)
drivers/nvme/host/core.c +35 -6
@@ -551,9 +551,19 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req,struct nvme_dsm_range *range;struct bio *bio; - range =kmalloc_array (segments,sizeof (*range),GFP_ATOMIC ); -if (!range) -return BLK_STS_RESOURCE ; + range =kmalloc_array (segments,sizeof (*range), +GFP_ATOMIC | __GFP_NOWARN); +if (!range) { +/* +* If we fail allocation our range, fallback to the controller +* discard page. If that's also busy, it's safe to return +* busy, as we know we can make progress once that's freed. +*/ +if (test_and_set_bit_lock (0 , &ns->ctrl->discard_page_busy)) +return BLK_STS_RESOURCE ; + + range =page_address (ns->ctrl->discard_page); + }__rq_for_each_bio (bio, req) {u64 slba =nvme_block_nr (ns, bio->bi_iter.bi_sector);
@@ -568,7 +578,10 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, }if (WARN_ON_ONCE (n != segments)) { -kfree (range); +if (virt_to_page (range) == ns->ctrl->discard_page) +clear_bit_unlock (0 , &ns->ctrl->discard_page_busy); +else +kfree (range);return BLK_STS_IOERR ; }
@@ -653,8 +666,13 @@ void nvme_cleanup_cmd(struct request *req) blk_rq_bytes(req) >> ns->lba_shift); }if (req->rq_flags &RQF_SPECIAL_PAYLOAD ) { -kfree (page_address (req->special_vec.bv_page) + - req->special_vec.bv_offset); +struct nvme_ns *ns = req->rq_disk->private_data; +struct page *page = req->special_vec.bv_page; + +if (page == ns->ctrl->discard_page) +clear_bit_unlock (0 , &ns->ctrl->discard_page_busy); +else +kfree (page_address (page) + req->special_vec.bv_offset); } }EXPORT_SYMBOL_GPL (nvme_cleanup_cmd);
@@ -3551,6 +3569,7 @@ static void nvme_free_ctrl(struct device *dev)ida_simple_remove (&nvme_instance_ida, ctrl->instance);kfree (ctrl->effects);nvme_mpath_uninit (ctrl); +kfree (ctrl->discard_page);if (subsys) {mutex_lock (&subsys->lock);
@@ -3592,6 +3611,14 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,memset (&ctrl->ka_cmd,0 ,sizeof (ctrl->ka_cmd)); ctrl->ka_cmd.common.opcode = nvme_admin_keep_alive; +BUILD_BUG_ON (NVME_DSM_MAX_RANGES *sizeof (struct nvme_dsm_range ) > +PAGE_SIZE ); + ctrl->discard_page =alloc_page (GFP_KERNEL ); +if (!ctrl->discard_page) { + ret = -ENOMEM ; + goto out; + } + ret =ida_simple_get (&nvme_instance_ida,0 ,0 ,GFP_KERNEL );if (ret <0 ) goto out;
@@ -3629,6 +3656,8 @@ out_free_name: out_release_instance:ida_simple_remove (&nvme_instance_ida, ctrl->instance); out: +if (ctrl->discard_page) +__free_page (ctrl->discard_page);return ret; }EXPORT_SYMBOL_GPL (nvme_init_ctrl);
drivers/nvme/host/nvme.h +3 -0
@@ -238,6 +238,9 @@ struct nvme_ctrl {u16 maxcmd;int nr_reconnects;struct nvmf_ctrl_options *opts; + +struct page *discard_page; +unsigned long discard_page_busy; };struct nvme_subsystem {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 111/321 kvm: vmx: Set IA32_TSC_AUX for legacy mode guests
In reply to Greg Kroah-HartmanFrom: Jim Mattson <[email protected]>
[ Upstream commit 0023ef39dc35c773c436eaa46ca539a26b308b55 ]
RDTSCP is supported in legacy mode as well as long mode. The IA32_TSC_AUX MSR should be set to the correct guest value before entering any guest that supports RDTSCP.
--- arch/x86/kvm/vmx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/x86/kvm/vmx.c +3 -3
@@ -3404,9 +3404,6 @@ static void setup_msrs(struct vcpu_vmx *vmx) index =__find_msr_index (vmx,MSR_CSTAR );if (index >=0 )move_msr_up (vmx, index, save_nmsrs++); - index =__find_msr_index (vmx,MSR_TSC_AUX ); -if (index >=0 &&guest_cpuid_has (&vmx->vcpu,X86_FEATURE_RDTSCP )) -move_msr_up (vmx, index, save_nmsrs++);/* * MSR_STAR is only needed on long mode guests, and only * if efer.sce is enabled.
@@ -3419,6 +3416,9 @@ static void setup_msrs(struct vcpu_vmx *vmx) index =__find_msr_index (vmx,MSR_EFER );if (index >=0 &&update_transition_efer (vmx, index))move_msr_up (vmx, index, save_nmsrs++); + index =__find_msr_index (vmx,MSR_TSC_AUX ); +if (index >=0 &&guest_cpuid_has (&vmx->vcpu,X86_FEATURE_RDTSCP )) +move_msr_up (vmx, index, save_nmsrs++); vmx->save_nmsrs = save_nmsrs; vmx->guest_msrs_dirty = true;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 113/321 VSOCK: bind to random port for VMADDR_PORT_ANY
In reply to Greg Kroah-HartmanFrom: Lepton Wu <[email protected]>
[ Upstream commit 8236b08cf50f85bbfaf48910a0b3ee68318b7c4b ]
The old code always starts from fixed port for VMADDR_PORT_ANY. Sometimes when VMM crashed, there is still orphaned vsock which is waiting for close timer, then it could cause connection time out for new started VM if they are trying to connect to same port with same guest cid since the new packets could hit that orphaned vsock. We could also fix this by doing more in vhost_vsock_reset_orphans, but any way, it should be better to start from a random local port instead of a fixed one.
--- net/vmw_vsock/af_vsock.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/vmw_vsock/af_vsock.c +6 -1
@@ -107,6 +107,7 @@#include <linux/mutex.h> #include <linux/net.h> #include <linux/poll.h> +#include <linux/random.h> #include <linux/skbuff.h> #include <linux/smp.h> #include <linux/socket.h>
@@ -480,9 +481,13 @@ out:static int __vsock_bind_stream (struct vsock_sock *vsk,struct sockaddr_vm *addr) { -static u32 port =LAST_RESERVED_PORT +1 ; +static u32 port =0 ;struct sockaddr_vm new_addr; +if (!port) + port =LAST_RESERVED_PORT +1 + +prandom_u32_max (U32_MAX -LAST_RESERVED_PORT ); +vsock_addr_init (&new_addr, addr->svm_cid, addr->svm_port);if (addr->svm_port ==VMADDR_PORT_ANY ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 112/321 crypto/chelsio/chtls: listen fails with multiadapt
In reply to Greg Kroah-HartmanFrom: Atul Gupta <[email protected]>
[ Upstream commit 6422ccc5fbefbd219f3fab133f698e58f5aa44eb ]
listen fails when more than one tls capable device is registered. tls_hw_hash is called for each dev which loops again for each cdev_list causing listen failure. Hence call chtls_listen_start/stop for specific device than loop over all devices.
--- drivers/crypto/chelsio/chtls/chtls.h | 5 +++ drivers/crypto/chelsio/chtls/chtls_main.c | 50 ++++++++++++++--------- 2 files changed, 36 insertions(+), 19 deletions(-)
drivers/crypto/chelsio/chtls/chtls.h +5 -0
@@ -153,6 +153,11 @@ struct chtls_dev {unsigned int cdev_state; }; +struct chtls_listen { +struct chtls_dev *cdev; +struct sock *sk; +}; +struct chtls_hws {struct sk_buff_head sk_recv_queue;u8 txqid;
drivers/crypto/chelsio/chtls/chtls_main.c +31 -19
99 lines not on this page · raw message
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 117/321 btrfs: Check for missing device before bio submission in btrfs_map_bio
In reply to Greg Kroah-HartmanFrom: Nikolay Borisov <[email protected]>
[ Upstream commit fc8a168aa9ab1680c2bd52bf9db7c994e0f2524f ]
Before btrfs_map_bio submits all stripe bios it does a number of checks to ensure the device for every stripe is present. However, it doesn't do a DEV_STATE_MISSING check, instead this is relegated to the lower level btrfs_schedule_bio (in the async submission case, sync submission doesn't check DEV_STATE_MISSING at all). Additionally btrfs_schedule_bios does the duplicate device->bdev check which has already been performed in btrfs_map_bio.
This patch moves the DEV_STATE_MISSING check in btrfs_map_bio and removes the duplicate device->bdev check. Doing so ensures that no bio cloning/submission happens for both async/sync requests in the face of missing device. This makes the async io submission path slightly shorter in terms of instruction count. No functional changes.
--- fs/btrfs/volumes.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
fs/btrfs/volumes.c +2 -7
@@ -6106,12 +6106,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device,int should_queue =1 ;struct btrfs_pending_bios *pending_bios; -if (test_bit (BTRFS_DEV_STATE_MISSING , &device->dev_state) || - !device->bdev) { -bio_io_error (bio); -return ; - } -/* don't bother with additional async steps for reads, right now */ if (bio_op (bio) ==REQ_OP_READ ) {btrfsic_submit_bio (bio);
@@ -6240,7 +6234,8 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,for (dev_nr =0 ; dev_nr < total_devs; dev_nr++) { dev = bbio->stripes[dev_nr].dev; -if (!dev || !dev->bdev || +if (!dev || !dev->bdev ||test_bit (BTRFS_DEV_STATE_MISSING , + &dev->dev_state) || (bio_op (first_bio) ==REQ_OP_WRITE && !test_bit (BTRFS_DEV_STATE_WRITEABLE , &dev->dev_state))) {bbio_error (bbio, first_bio, logical);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 119/321 btrfs: dev-replace: set result code of cancel by status of scrub
In reply to Greg Kroah-HartmanFrom: Anand Jain <[email protected]>
[ Upstream commit b47dda2ef6d793b67fd5979032dcd106e3f0a5c9 ]
The device-replace needs to check the result code of the scrub workers in btrfs_dev_replace_cancel and distinguish if successful cancel operation and when the there was no operation running.
If btrfs_scrub_cancel() fails, return BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED so that user can try to cancel the replace again.
--- fs/btrfs/dev-replace.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
fs/btrfs/dev-replace.c +14 -7
@@ -810,16 +810,23 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info)btrfs_dev_replace_write_unlock (dev_replace);break ;case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED : - result =BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR ; tgt_device = dev_replace->tgtdev; src_device = dev_replace->srcdev;btrfs_dev_replace_write_unlock (dev_replace); -btrfs_scrub_cancel (fs_info); -/* btrfs_dev_replace_finishing() will handle the cleanup part */ -btrfs_info_in_rcu (fs_info, -"dev_replace from %s (devid %llu) to %s canceled" , -btrfs_dev_name (src_device), src_device->devid, -btrfs_dev_name (tgt_device)); + ret =btrfs_scrub_cancel (fs_info); +if (ret <0 ) { + result =BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED ; + }else { + result =BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR ; +/* +* btrfs_dev_replace_finishing() will handle the +* cleanup part +*/ +btrfs_info_in_rcu (fs_info, +"dev_replace from %s (devid %llu) to %s canceled" , +btrfs_dev_name (src_device), src_device->devid, +btrfs_dev_name (tgt_device)); + }break ;case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED :/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 121/321 btrfs: only track ref_heads in delayed_ref_updates
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
[ Upstream commit 158ffa364bf723fa1ef128060646d23dc3942994 ]
We use this number to figure out how many delayed refs to run, but __btrfs_run_delayed_refs really only checks every time we need a new delayed ref head, so we always run at least one ref head completely no matter what the number of items on it. Fix the accounting to only be adjusted when we add/remove a ref head.
In addition to using this number to limit the number of delayed refs run, a future patch is also going to use it to calculate the amount of space required for delayed refs space reservation.
--- fs/btrfs/delayed-ref.c | 3 --- 1 file changed, 3 deletions(-)
fs/btrfs/delayed-ref.c +0 -3
@@ -234,8 +234,6 @@ static inline void drop_delayed_ref(struct btrfs_trans_handle *trans, ref->in_tree =0 ;btrfs_put_delayed_ref (ref);atomic_dec (&delayed_refs->num_entries); -if (trans->delayed_ref_updates) - trans->delayed_ref_updates--; } static bool merge_ref(struct btrfs_trans_handle *trans,
@@ -446,7 +444,6 @@ inserted:if (ref->action ==BTRFS_ADD_DELAYED_REF )list_add_tail (&ref->add_list, &href->ref_add_list);atomic_inc (&root->num_entries); - trans->delayed_ref_updates++;spin_unlock (&href->lock);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 122/321 serial: sh-sci: Fix crash in rx_timer_fn() on PIO fallback
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 2e948218b7c1262a3830823d6620eb227e3d4e3a ]
When falling back to PIO, active_rx must be set to a different value than cookie_rx[i], else sci_dma_rx_find_active() will incorrectly find a match, leading to a NULL pointer dereference in rx_timer_fn() later.
Use zero instead, which is the same value as after driver initialization.
--- drivers/tty/serial/sh-sci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/sh-sci.c +1 -1
@@ -1359,7 +1359,7 @@ fail:dmaengine_terminate_async (chan);for (i =0 ; i <2 ; i++) s->cookie_rx[i] = -EINVAL ; - s->active_rx = -EINVAL ; + s->active_rx =0 ; s->chan_rx =NULL ;sci_start_rx (port);if (!port_lock_held)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 87/321 s390/zcrypt: make sysfs reset attribute trigger queue reset
In reply to Greg Kroah-HartmanFrom: Harald Freudenberger <[email protected]>
[ Upstream commit 42a87d4103ae365e18c3be1333592ab583b8ad9d ]
Until now there is no way to reset a AP queue or card. Driving a card or queue offline and online again does only toggle the 'software' online state. The only way to trigger a (hardware) reset is by running hot-unplug/hot-plug for example on the HMC.
This patch makes the queue reset attribute in sysfs writable. Writing into this attribute triggers a reset on the AP queue's state machine. So the AP queue is flushed and state machine runs through the initial states which cause a reset (PQAP(RAPQ)) and a re-registration to interrupts (PQAP(AQIC)) if available.
The reset sysfs attribute is writable by root only. So only an administrator is allowed to initiate a reset of AP queues. Please note that the queue's counter values are left untouched by the reset.
--- drivers/s390/crypto/ap_queue.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
drivers/s390/crypto/ap_queue.c +22 -1
@@ -14,6 +14,9 @@#include <asm/facility.h> #include "ap_bus.h" +#include "ap_debug.h" + +static void __ap_flush_queue (struct ap_queue *aq);/** * ap_queue_enable_interruption(): Enable interruption on an AP queue.
@@ -541,7 +544,25 @@ static ssize_t reset_show(struct device *dev,return rc; } -static DEVICE_ATTR_RO (reset); +static ssize_t reset_store (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ +struct ap_queue *aq =to_ap_queue (dev); + +spin_lock_bh (&aq->lock); +__ap_flush_queue (aq); + aq->state =AP_STATE_RESET_START ; +ap_wait (ap_sm_event (aq,AP_EVENT_POLL )); +spin_unlock_bh (&aq->lock); + +AP_DBF (DBF_INFO ,"reset queue=%02x.%04x triggered by user\n" , +AP_QID_CARD (aq->qid),AP_QID_QUEUE (aq->qid)); + +return count; +} + +static DEVICE_ATTR_RW (reset);static ssize_t interrupt_show (struct device *dev,struct device_attribute *attr,char *buf)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 123/321 HID: intel-ish-hid: fixes incorrect error handling
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit 6e0856d317440a950b17c00a9283114f025e5699 ]
The memory chunk allocated by hid_allocate_device() should be released by hid_destroy_device(), not kfree().
--- drivers/hid/intel-ish-hid/ishtp-hid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/intel-ish-hid/ishtp-hid.c +1 -1
@@ -222,7 +222,7 @@ int ishtp_hid_probe(unsigned int cur_hid_dev, err_hid_device:kfree (hid_data); err_hid_data: -kfree (hid); +hid_destroy_device (hid);return rv; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 124/321 gpio: raspberrypi-exp: decrease refcount on firmware dt node
In reply to Greg Kroah-HartmanFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit 85af74c474b21940e88483fd48f6094145c89d97 ]
We're getting a reference RPi's firmware node in order to be able to communicate with it's driver. We should decrease the reference count on the dt node after being done with it.
--- drivers/gpio/gpio-raspberrypi-exp.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpio/gpio-raspberrypi-exp.c +1 -0
@@ -206,6 +206,7 @@ static int rpi_exp_gpio_probe(struct platform_device *pdev) } fw =rpi_firmware_get (fw_node); +of_node_put (fw_node);if (!fw)return -EPROBE_DEFER ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/321 arm64: dts: renesas: draak: Fix CVBS input
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit 6f61a2c8f1f6163c7e08c77c5f71df0427e4d2f6 ]
A typo in the adv7180 DT node prevents successful probing of the VIN. Fix it.
--- arch/arm64/boot/dts/renesas/r8a77995-draak.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/renesas/r8a77995-draak.dts +1 -1
@@ -188,7 +188,7 @@ compatible = "adi,adv7180cp"; reg = <0x20>; - port { + ports { #address-cells = <1>; #size-cells = <0>;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 90/321 mwifiex: fix potential NULL dereference and use after free
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit 1dcd9429212b98bea87fc6ec92fb50bf5953eb47 ]
There are two defects: (1) passing a NULL bss to mwifiex_save_hidden_ssid_channels will result in NULL dereference,
(2) using bss after dropping the reference to it via cfg80211_put_bss. To fix them, the patch moves the buggy code to the branch that bss is not NULL and puts it before cfg80211_put_bss.
--- drivers/net/wireless/marvell/mwifiex/scan.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/net/wireless/marvell/mwifiex/scan.c +10 -8
@@ -1906,15 +1906,17 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info, ETH_ALEN))mwifiex_update_curr_bss_params (priv ,bss ); -cfg80211_put_bss (priv->wdev.wiphy, bss); - } -if ((chan->flags &IEEE80211_CHAN_RADAR ) || - (chan->flags &IEEE80211_CHAN_NO_IR )) { -mwifiex_dbg (adapter,INFO , -"radar or passive channel %d\n" , - channel); -mwifiex_save_hidden_ssid_channels (priv, bss); +if ((chan->flags &IEEE80211_CHAN_RADAR ) || + (chan->flags &IEEE80211_CHAN_NO_IR )) { +mwifiex_dbg (adapter,INFO , +"radar or passive channel %d\n" , + channel); +mwifiex_save_hidden_ssid_channels (priv, + bss); + } + +cfg80211_put_bss (priv->wdev.wiphy, bss); } } }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 91/321 mwifiex: debugfs: correct histogram spacing, formatting
In reply to Greg Kroah-HartmanFrom: Brian Norris <[email protected]>
[ Upstream commit 4cb777c64e030778c569f605398d7604d8aabc0f ]
Currently, snippets of this file look like:
rx rates (in Mbps): 0=1M 1=2M2=5.5M 3=11M 4=6M 5=9M 6=12M
7=18M 8=24M 9=36M 10=48M 11=54M12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40) 44-53=MCS0-9(VHT:BW20)54-63=MCS0-9(VHT:BW40)64-73=MCS0-9(VHT:BW80)
...
noise_flr[--96dBm] = 22
noise_flr[--95dBm] = 149
noise_flr[--94dBm] = 9
noise_flr[--93dBm] = 2
We're missing some spaces, and we're adding a minus sign ('-') on values that are already negative signed integers.
--- drivers/net/wireless/marvell/mwifiex/debugfs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
drivers/net/wireless/marvell/mwifiex/debugfs.c +6 -8
@@ -273,15 +273,13 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf,"total samples = %d\n" , atomic_read(&phist_data->num_samples)); - p +=sprintf (p,"rx rates (in Mbps): 0=1M 1=2M" ); - p +=sprintf (p,"2=5.5M 3=11M 4=6M 5=9M 6=12M\n" ); - p +=sprintf (p,"7=18M 8=24M 9=36M 10=48M 11=54M" ); - p +=sprintf (p,"12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40)\n" ); + p +=sprintf (p, +"rx rates (in Mbps): 0=1M 1=2M 2=5.5M 3=11M 4=6M 5=9M 6=12M\n" +"7=18M 8=24M 9=36M 10=48M 11=54M 12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40)\n" );if (ISSUPP_11ACENABLED (priv->adapter->fw_cap_info)) { - p +=sprintf (p,"44-53=MCS0-9(VHT:BW20)" ); - p +=sprintf (p,"54-63=MCS0-9(VHT:BW40)" ); - p +=sprintf (p,"64-73=MCS0-9(VHT:BW80)\n\n" ); + p +=sprintf (p, +"44-53=MCS0-9(VHT:BW20) 54-63=MCS0-9(VHT:BW40) 64-73=MCS0-9(VHT:BW80)\n\n" ); }else { p +=sprintf (p,"\n" ); }
@@ -310,7 +308,7 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf,for (i =0 ; i <MWIFIEX_MAX_NOISE_FLR ; i++) { value =atomic_read (&phist_data->noise_flr[i]);if (value) - p +=sprintf (p,"noise_flr[-%02ddBm] = %d\n" , + p +=sprintf (p,"noise_flr[%02ddBm] = %d\n" , (int )(i-128 ), value); }for (i =0 ; i <MWIFIEX_MAX_SIG_STRENGTH ; i++) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 127/321 xen/pciback: Check dev_data before using it
In reply to Greg Kroah-HartmanFrom: Ross Lagerwall <[email protected]>
[ Upstream commit 1669907e3d1abfa3f7586e2d55dbbc117b5adba2 ]
If pcistub_init_device fails, the release function will be called with dev_data set to NULL. Check it before using it to avoid a NULL pointer dereference.
--- drivers/xen/xen-pciback/pci_stub.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/xen/xen-pciback/pci_stub.c +2 -1
@@ -106,7 +106,8 @@ static void pcistub_device_release(struct kref *kref)* is called from "unbind" which takes a device_lock mutex. */ __pci_reset_function_locked (dev); -if (pci_load_and_free_saved_state (dev, &dev_data->pci_saved_state)) +if (dev_data && +pci_load_and_free_saved_state (dev, &dev_data->pci_saved_state))dev_info (&dev->dev,"Could not reload PCI state\n" );else pci_restore_state (dev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 136/321 bnxt_en: Return linux standard errors in bnxt_ethtool.c
In reply to Greg Kroah-HartmanFrom: Vasundhara Volam <[email protected]>
[ Upstream commit 7c675421afef18253a86ffc383f57bc15ef32ea8 ]
Currently firmware specific errors are returned directly in flash_device and reset ethtool hooks. Modify it to return linux standard errors to userspace when flashing operations fail.
--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +39 -17
@@ -1444,14 +1444,22 @@ static int bnxt_flash_nvram(struct net_device *dev, rc =hwrm_send_message (bp, &req,sizeof (req),FLASH_NVRAM_TIMEOUT );dma_free_coherent (&bp->pdev->dev, data_len, kmem, dma_handle); +if (rc ==HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED ) { +netdev_info (dev, +"PF does not have admin privileges to flash the device\n" ); + rc = -EACCES ; + }else if (rc) { + rc = -EIO ; + }return rc; }static int bnxt_firmware_reset (struct net_device *dev,u16 dir_type) { -struct bnxt *bp =netdev_priv (dev);struct hwrm_fw_reset_input req = {0 }; +struct bnxt *bp =netdev_priv (dev); +int rc;bnxt_hwrm_cmd_hdr_init (bp, &req,HWRM_FW_RESET ,-1 ,-1 );
@@ -1491,7 +1499,15 @@ static int bnxt_firmware_reset(struct net_device *dev,return -EINVAL ; } -return hwrm_send_message (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT ); + rc =hwrm_send_message (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT ); +if (rc ==HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED ) { +netdev_info (dev, +"PF does not have admin privileges to reset the device\n" ); + rc = -EACCES ; + }else if (rc) { + rc = -EIO ; + } +return rc; } static int bnxt_flash_firmware(struct net_device *dev,
@@ -1698,9 +1714,9 @@ static int bnxt_flash_package_from_file(struct net_device *dev,struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr;struct hwrm_nvm_install_update_input install = {0 };const struct firmware *fw; +int rc, hwrm_err =0 ;u32 item_len;u16 index; -int rc;bnxt_hwrm_fw_set_time (bp);
@@ -1743,15 +1759,16 @@ static int bnxt_flash_package_from_file(struct net_device *dev,memcpy (kmem, fw->data, fw->size); modify.host_src_addr =cpu_to_le64 (dma_handle); - rc =hwrm_send_message (bp, &modify,sizeof (modify), -FLASH_PACKAGE_TIMEOUT ); + hwrm_err =hwrm_send_message (bp, &modify, +sizeof (modify), +FLASH_PACKAGE_TIMEOUT );dma_free_coherent (&bp->pdev->dev, fw->size, kmem, dma_handle); } }release_firmware (fw); -if (rc) -return rc; +if (rc || hwrm_err) + goto err_exit;if ((install_type &0xffff ) ==0 ) install_type >>=16 ;
@@ -1759,12 +1776,10 @@ static int bnxt_flash_package_from_file(struct net_device *dev, install.install_type =cpu_to_le32 (install_type);mutex_lock (&bp->hwrm_cmd_lock); - rc =_hwrm_send_message (bp, &install,sizeof (install), -INSTALL_PACKAGE_TIMEOUT ); -if (rc) { - rc = -EOPNOTSUPP ; + hwrm_err =_hwrm_send_message (bp, &install,sizeof (install), +INSTALL_PACKAGE_TIMEOUT ); +if (hwrm_err) goto flash_pkg_exit; - }if (resp->error_code) {u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err;
@@ -1772,12 +1787,11 @@ static int bnxt_flash_package_from_file(struct net_device *dev,if (error_code ==NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR ) { install.flags |=cpu_to_le16 (NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG ); - rc =_hwrm_send_message (bp, &install,sizeof (install), -INSTALL_PACKAGE_TIMEOUT ); -if (rc) { - rc = -EOPNOTSUPP ; + hwrm_err =_hwrm_send_message (bp, &install, +sizeof (install), +INSTALL_PACKAGE_TIMEOUT ); +if (hwrm_err) goto flash_pkg_exit; - } } }
@@ -1788,6 +1802,14 @@ static int bnxt_flash_package_from_file(struct net_device *dev, } flash_pkg_exit:mutex_unlock (&bp->hwrm_cmd_lock); +err_exit: +if (hwrm_err ==HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED ) { +netdev_info (dev, +"PF does not have admin privileges to flash the device\n" ); + rc = -EACCES ; + }else if (hwrm_err) { + rc = -EOPNOTSUPP ; + }return rc; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 137/321 bnxt_en: Save ring statistics before reset.
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit b8875ca356f1c0b17ec68be6666269373a62288e ]
With the current driver, the statistics reported by .ndo_get_stats64() are reset when the device goes down. Store a snapshot of the rtnl_link_stats64 before shutdown. This snapshot is added to the current counters in .ndo_get_stats64() so that the counters will not get reset when the device is down.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 57 +++++++++++++++++------ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 44 insertions(+), 14 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +43 -14
@@ -7148,6 +7148,9 @@ static bool bnxt_drv_busy(struct bnxt *bp) test_bit(BNXT_STATE_READ_STATS, &bp->state)); } +static void bnxt_get_ring_stats (struct bnxt *bp, +struct rtnl_link_stats64 *stats); +static void __bnxt_close_nic (struct bnxt *bp,bool irq_re_init,bool link_re_init) {
@@ -7173,6 +7176,9 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,del_timer_sync (&bp->timer);bnxt_free_skbs (bp); +/* Save ring stats before shutdown */ +if (bp->bnapi) +bnxt_get_ring_stats (bp, &bp->net_stats_prev);if (irq_re_init) {bnxt_free_irq (bp);bnxt_del_napi (bp);
@@ -7234,23 +7240,12 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)return -EOPNOTSUPP ; } -static void -bnxt_get_stats64 (struct net_device *dev,struct rtnl_link_stats64 *stats) +static void bnxt_get_ring_stats (struct bnxt *bp, +struct rtnl_link_stats64 *stats) { -u32 i; -struct bnxt *bp =netdev_priv (dev); +int i; -set_bit (BNXT_STATE_READ_STATS , &bp->state); -/* Make sure bnxt_close_nic() sees that we are reading stats before -* we check the BNXT_STATE_OPEN flag. -*/ -smp_mb__after_atomic (); -if (!test_bit (BNXT_STATE_OPEN , &bp->state)) { -clear_bit (BNXT_STATE_READ_STATS , &bp->state); -return ; - } -/* TODO check if we need to synchronize with bnxt_close path */ for (i =0 ; i < bp->cp_nr_rings; i++) {struct bnxt_napi *bnapi = bp->bnapi[i];struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
@@ -7279,6 +7274,40 @@ bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) stats->tx_dropped +=le64_to_cpu (hw_stats->tx_drop_pkts); } +} + +static void bnxt_add_prev_stats (struct bnxt *bp, +struct rtnl_link_stats64 *stats) +{ +struct rtnl_link_stats64 *prev_stats = &bp->net_stats_prev; + + stats->rx_packets += prev_stats->rx_packets; + stats->tx_packets += prev_stats->tx_packets; + stats->rx_bytes += prev_stats->rx_bytes; + stats->tx_bytes += prev_stats->tx_bytes; + stats->rx_missed_errors += prev_stats->rx_missed_errors; + stats->multicast += prev_stats->multicast; + stats->tx_dropped += prev_stats->tx_dropped; +} + +static void +bnxt_get_stats64 (struct net_device *dev,struct rtnl_link_stats64 *stats) +{ +struct bnxt *bp =netdev_priv (dev); + +set_bit (BNXT_STATE_READ_STATS , &bp->state); +/* Make sure bnxt_close_nic() sees that we are reading stats before +* we check the BNXT_STATE_OPEN flag. +*/ +smp_mb__after_atomic (); +if (!test_bit (BNXT_STATE_OPEN , &bp->state)) { +clear_bit (BNXT_STATE_READ_STATS , &bp->state); + *stats = bp->net_stats_prev; +return ; + } + +bnxt_get_ring_stats (bp, stats); +bnxt_add_prev_stats (bp, stats);if (bp->flags &BNXT_FLAG_PORT_STATS ) {struct rx_port_stats *rx = bp->hw_rx_port_stats;
drivers/net/ethernet/broadcom/bnxt/bnxt.h +1 -0
@@ -1302,6 +1302,7 @@ struct bnxt {void *hwrm_cmd_resp_addr;dma_addr_t hwrm_cmd_resp_dma_addr; +struct rtnl_link_stats64 net_stats_prev;struct rx_port_stats *hw_rx_port_stats;struct tx_port_stats *hw_tx_port_stats;struct rx_port_stats_ext *hw_rx_port_stats_ext;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 138/321 bnxt_en: query force speeds before disabling autoneg mode.
In reply to Greg Kroah-HartmanFrom: Vasundhara Volam <[email protected]>
[ Upstream commit 56d374624778652d2a999e18c87a25338b127b41 ]
With autoneg enabled, PHY loopback test fails. To disable autoneg, driver needs to send a valid forced speed to FW. FW is not sending async event for invalid speeds. To fix this, query forced speeds and send the correct speed when disabling autoneg mode.
--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +21 -1
@@ -2390,17 +2390,37 @@ static int bnxt_hwrm_mac_loopback(struct bnxt *bp, bool enable)return hwrm_send_message (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT ); } +static int bnxt_query_force_speeds (struct bnxt *bp,u16 *force_speeds) +{ +struct hwrm_port_phy_qcaps_output *resp = bp->hwrm_cmd_resp_addr; +struct hwrm_port_phy_qcaps_input req = {0 }; +int rc; + +bnxt_hwrm_cmd_hdr_init (bp, &req,HWRM_PORT_PHY_QCAPS ,-1 ,-1 ); +mutex_lock (&bp->hwrm_cmd_lock); + rc =_hwrm_send_message (bp, &req,sizeof (req),HWRM_CMD_TIMEOUT ); +if (!rc) + *force_speeds =le16_to_cpu (resp->supported_speeds_force_mode); + +mutex_unlock (&bp->hwrm_cmd_lock); +return rc; +} +static int bnxt_disable_an_for_lpbk (struct bnxt *bp,struct hwrm_port_phy_cfg_input *req) {struct bnxt_link_info *link_info = &bp->link_info; -u16 fw_advertising = link_info->advertising; +u16 fw_advertising;u16 fw_speed;int rc;if (!link_info->autoneg)return 0 ; + rc =bnxt_query_force_speeds (bp, &fw_advertising); +if (rc) +return rc; + fw_speed =PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB ;if (netif_carrier_ok (bp->dev)) fw_speed = bp->link_info.link_speed;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 139/321 KVM: s390: unregister debug feature on failing arch init
In reply to Greg Kroah-HartmanFrom: Michael Mueller <[email protected]>
[ Upstream commit 308c3e6673b012beecb96ef04cc65f4a0e7cdd99 ]
Make sure the debug feature and its allocated resources get released upon unsuccessful architecture initialization.
A related indication of the issue will be reported as kernel message.
Message-Id: <[email protected]>
--- arch/s390/kvm/kvm-s390.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
arch/s390/kvm/kvm-s390.c +14 -3
@@ -416,19 +416,30 @@ static void kvm_s390_cpu_feat_init(void)int kvm_arch_init (void *opaque) { +int rc; + kvm_s390_dbf =debug_register ("kvm-trace" ,32 ,1 ,7 *sizeof (long ));if (!kvm_s390_dbf)return -ENOMEM ;if (debug_register_view (kvm_s390_dbf, &debug_sprintf_view)) { -debug_unregister (kvm_s390_dbf); -return -ENOMEM ; + rc = -ENOMEM ; + goto out_debug_unreg; }kvm_s390_cpu_feat_init ();/* Register floating interrupt controller interface. */ -return kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); + rc =kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); +if (rc) { +pr_err ("Failed to register FLIC rc=%d\n" , rc); + goto out_debug_unreg; + } +return 0 ; + +out_debug_unreg: +debug_unregister (kvm_s390_dbf); +return rc; }void kvm_arch_exit (void )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 140/321 pinctrl: sh-pfc: r8a77990: Fix MOD_SEL0 SEL_I2C1 field width
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 755a5b805fa7ff22e2934d67501efd92109f41ea ]
The SEL_I2C1 (MOD_SEL0[21:20]) field in Module Select Register 0 has a width of 2 bits, i.e. it allows programming one out of 4 different configurations.
However, the MOD_SEL0_21_20 macro contains 8 values instead of 4, overflowing into the subsequent fields in the register, and thus breaking the configuration of the latter.
Fix this by dropping the bogus last 4 values, including the non-existent SEL_I2C1_4 configuration.
--- drivers/pinctrl/sh-pfc/pfc-r8a77990.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/sh-pfc/pfc-r8a77990.c +1 -1
@@ -395,7 +395,7 @@ FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM#define MOD_SEL0_24 FM(SEL_HSCIF0_0) FM(SEL_HSCIF0_1)#define MOD_SEL0_23 FM(SEL_HSCIF1_0) FM(SEL_HSCIF1_1)#define MOD_SEL0_22 FM(SEL_HSCIF2_0) FM(SEL_HSCIF2_1) -#define MOD_SEL0_21_20 FM(SEL_I2C1_0) FM(SEL_I2C1_1) FM(SEL_I2C1_2) FM(SEL_I2C1_3) FM(SEL_I2C1_4) F_(0, 0) F_(0, 0) F_(0, 0) +#define MOD_SEL0_21_20 FM(SEL_I2C1_0) FM(SEL_I2C1_1) FM(SEL_I2C1_2) FM(SEL_I2C1_3)#define MOD_SEL0_19_18_17 FM(SEL_I2C2_0) FM(SEL_I2C2_1) FM(SEL_I2C2_2) FM(SEL_I2C2_3) FM(SEL_I2C2_4) F_(0, 0) F_(0, 0) F_(0, 0)#define MOD_SEL0_16 FM(SEL_NDFC_0) FM(SEL_NDFC_1)#define MOD_SEL0_15 FM(SEL_PWM0_0) FM(SEL_PWM0_1)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 141/321 pinctrl: sh-pfc: sh7264: Fix PFCR3 and PFCR0 register configuration
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 1b99d0c80bbe1810572c2cb77b90f67886adfa8d ]
The Port F Control Register 3 (PFCR3) contains only a single field. However, counting from left to right, it is the fourth field, not the first field.
Insert the missing dummy configuration values (3 fields of 16 values) to fix this.
The descriptor for the Port F Control Register 0 (PFCR0) lacks the description for the 4th field (PF0 Mode, PF0MD[2:0]). Add the missing configuration values to fix this.
--- drivers/pinctrl/sh-pfc/pfc-sh7264.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/pinctrl/sh-pfc/pfc-sh7264.c +7 -2
@@ -1716,6 +1716,9 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { }, { PINMUX_CFG_REG("PFCR3", 0xfffe38a8, 16, 4) { +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,PF12MD_000 ,PF12MD_001 ,0 ,PF12MD_011 ,PF12MD_100 ,PF12MD_101 ,0 ,0 , 0, 0, 0, 0, 0, 0, 0, 0 }
@@ -1759,8 +1762,10 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,PF1MD_000 ,PF1MD_001 ,PF1MD_010 ,PF1MD_011 ,PF1MD_100 ,PF1MD_101 ,0 ,0 , -0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 - } +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , +PF0MD_000 ,PF0MD_001 ,PF0MD_010 ,PF0MD_011 , +PF0MD_100 ,PF0MD_101 ,0 ,0 , + 0, 0, 0, 0, 0, 0, 0, 0 } }, { PINMUX_CFG_REG("PFIOR0", 0xfffe38b2, 16, 1) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 142/321 pinctrl: sh-pfc: sh7734: Fix shifted values in IPSR10
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 054f2400f706327f96770219c3065b5131f8f154 ]
Some values in the Peripheral Function Select Register 10 descriptor are shifted by one position, which may cause a peripheral function to be programmed incorrectly.
Fixing this makes all HSCIF0 pins use Function 4 (value 3), like was already the case for the HSCK0 pin in field IP10[5:3].
--- drivers/pinctrl/sh-pfc/pfc-sh7734.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/pinctrl/sh-pfc/pfc-sh7734.c +8 -8
@@ -2213,22 +2213,22 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {/* IP10_22 [1] */ FN_CAN_CLK_A ,FN_RX4_D ,/* IP10_21_19 [3] */ -FN_AUDIO_CLKOUT ,FN_TX1_E ,FN_HRTS0_C ,FN_FSE_B , -FN_LCD_M_DISP_B ,0 ,0 ,0 , +FN_AUDIO_CLKOUT ,FN_TX1_E ,0 ,FN_HRTS0_C ,FN_FSE_B , +FN_LCD_M_DISP_B ,0 ,0 ,/* IP10_18_16 [3] */ -FN_AUDIO_CLKC ,FN_SCK1_E ,FN_HCTS0_C ,FN_FRB_B , -FN_LCD_VEPWC_B ,0 ,0 ,0 , +FN_AUDIO_CLKC ,FN_SCK1_E ,0 ,FN_HCTS0_C ,FN_FRB_B , +FN_LCD_VEPWC_B ,0 ,0 ,/* IP10_15 [1] */ FN_AUDIO_CLKB_A ,FN_LCD_CLK_B ,/* IP10_14_12 [3] */ FN_AUDIO_CLKA_A ,FN_VI1_CLK_B ,FN_SCK1_D ,FN_IECLK_B ,FN_LCD_FLM_B ,0 ,0 ,0 ,/* IP10_11_9 [3] */ -FN_SSI_SDATA3 ,FN_VI1_7_B ,FN_HTX0_C ,FN_FWE_B , -FN_LCD_CL2_B ,0 ,0 ,0 , +FN_SSI_SDATA3 ,FN_VI1_7_B ,0 ,FN_HTX0_C ,FN_FWE_B , +FN_LCD_CL2_B ,0 ,0 ,/* IP10_8_6 [3] */ -FN_SSI_SDATA2 ,FN_VI1_6_B ,FN_HRX0_C ,FN_FRE_B , -FN_LCD_CL1_B ,0 ,0 ,0 , +FN_SSI_SDATA2 ,FN_VI1_6_B ,0 ,FN_HRX0_C ,FN_FRE_B , +FN_LCD_CL1_B ,0 ,0 ,/* IP10_5_3 [3] */ FN_SSI_WS23 ,FN_VI1_5_B ,FN_TX1_D ,FN_HSCK0_C ,FN_FALE_B , FN_LCD_DON_B, 0, 0, 0,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 143/321 HID: doc: fix wrong data structure reference for UHID_OUTPUT
In reply to Greg Kroah-HartmanFrom: Peter Hutterer <[email protected]>
[ Upstream commit 46b14eef59a8157138dc02f916a7f97c73b3ec53 ]
--- Documentation/hid/uhid.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/hid/uhid.txt +1 -1
@@ -160,7 +160,7 @@ them but you should handle them according to your needs. UHID_OUTPUT: This is sent if the HID device driver wants to send raw data to the I/O device on the interrupt channel. You should read the payload and forward it to - the device. The payload is of type "struct uhid_data_req". + the device. The payload is of type "struct uhid_output_req". This may be received even though you haven't received UHID_OPEN, yet. UHID_GET_REPORT:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 145/321 gfs2: take jdata unstuff into account in do_grow
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit bc0205612bbd4dd4026d4ba6287f5643c37366ec ]
Before this patch, function do_grow would not reserve enough journal blocks in the transaction to unstuff jdata files while growing them. This patch adds the logic to add one more block if the file to grow is jdata.
--- fs/gfs2/bmap.c | 2 ++ 1 file changed, 2 insertions(+)
fs/gfs2/bmap.c +2 -0
@@ -2122,6 +2122,8 @@ static int do_grow(struct inode *inode, u64 size) } error =gfs2_trans_begin (sdp,RES_DINODE +RES_STATFS +RES_RG_BIT + + (unstuff && +gfs2_is_jdata (ip) ?RES_JDATA :0 ) + (sdp->sd_args.ar_quota ==GFS2_QUOTA_OFF ?0 :RES_QUOTA ),0 );if (error)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 144/321 dm flakey: Properly corrupt multi-page bios.
In reply to Greg Kroah-HartmanFrom: Sweet Tea <[email protected]>
[ Upstream commit a00f5276e26636cbf72f24f79831026d2e2868e7 ]
The flakey target is documented to be able to corrupt the Nth byte in a bio, but does not corrupt byte indices after the first biovec in the bio. Change the corrupting function to actually corrupt the Nth byte no matter in which biovec that index falls.
A test device generating two-page bios, atop a flakey device configured to corrupt a byte index on the second page, verified both the failure to corrupt before this patch and the expected corruption after this change.
--- drivers/md/dm-flakey.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-)
drivers/md/dm-flakey.c +22 -11
@@ -287,20 +287,31 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio)static void corrupt_bio_data (struct bio *bio,struct flakey_c *fc) { -unsigned bio_bytes =bio_cur_bytes (bio); -char *data =bio_data (bio); +unsigned int corrupt_bio_byte = fc->corrupt_bio_byte -1 ; + +struct bvec_iter iter; +struct bio_vec bvec; + +if (!bio_has_data (bio)) +return ;/* -* Overwrite the Nth byte of the data returned. +* Overwrite the Nth byte of the bio's data, on whichever page +* it falls. */ -if (data && bio_bytes >= fc->corrupt_bio_byte) { - data[fc->corrupt_bio_byte -1 ] = fc->corrupt_bio_value; - -DMDEBUG ("Corrupting data bio=%p by writing %u to byte %u " -"(rw=%c bi_opf=%u bi_sector=%llu cur_bytes=%u)\n" , - bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, - (bio_data_dir (bio) ==WRITE ) ?'w' :'r' , bio->bi_opf, - (unsigned long long )bio->bi_iter.bi_sector, bio_bytes); +bio_for_each_segment (bvec, bio, iter) { +if (bio_iter_len (bio, iter) > corrupt_bio_byte) { +char *segment = (page_address (bio_iter_page (bio, iter)) + +bio_iter_offset (bio, iter)); + segment[corrupt_bio_byte] = fc->corrupt_bio_value; +DMDEBUG ("Corrupting data bio=%p by writing %u to byte %u " +"(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n" , + bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, + (bio_data_dir (bio) ==WRITE ) ?'w' :'r' , bio->bi_opf, + (unsigned long long )bio->bi_iter.bi_sector, bio->bi_iter.bi_size); +break ; + } + corrupt_bio_byte -=bio_iter_len (bio, iter); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 128/321 kprobes: Blacklist symbols in arch-defined prohibited area
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit fb1a59fae8baa3f3c69b72a87ff94fc4fa5683ec ]
Blacklist symbols in arch-defined probe-prohibited areas. With this change, user can see all symbols which are prohibited to probe in debugfs.
All archtectures which have custom prohibit areas should define its own arch_populate_kprobe_blacklist() function, but unless that, all symbols marked __kprobes are blacklisted.
--- include/linux/kprobes.h | 3 ++ kernel/kprobes.c | 67 ++++++++++++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 14 deletions(-)
include/linux/kprobes.h +3 -0
@@ -243,10 +243,13 @@ extern int arch_init_kprobes(void);extern void show_registers (struct pt_regs *regs);extern void kprobes_inc_nmissed_count (struct kprobe *p);extern bool arch_within_kprobe_blacklist (unsigned long addr); +extern int arch_populate_kprobe_blacklist (void );extern bool arch_kprobe_on_func_entry (unsigned long offset);extern bool kprobe_on_func_entry (kprobe_opcode_t *addr,const char *sym,unsigned long offset);extern bool within_kprobe_blacklist (unsigned long addr); +extern int kprobe_add_ksym_blacklist (unsigned long entry); +extern int kprobe_add_area_blacklist (unsigned long start,unsigned long end);struct kprobe_insn_cache {struct mutex mutex;
kernel/kprobes.c +53 -14
85 lines not on this page · raw message
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 147/321 xfs: Align compat attrlist_by_handle with native implementation.
In reply to Greg Kroah-HartmanFrom: Nick Bowler <[email protected]>
[ Upstream commit c456d64449efe37da50832b63d91652a85ea1d20 ]
While inspecting the ioctl implementations, I noticed that the compat implementation of XFS_IOC_ATTRLIST_BY_HANDLE does not do exactly the same thing as the native implementation. Specifically, the "cursor" does not appear to be written out to userspace on the compat path, like it is on the native path.
This adjusts the compat implementation to copy out the cursor just like the native implementation does. The attrlist cursor does not require any special compat handling. This fixes xfstests xfs/269 on both IA-32 and x32 userspace, when running on an amd64 kernel.
--- fs/xfs/xfs_ioctl32.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/xfs/xfs_ioctl32.c +6 -0
@@ -336,6 +336,7 @@ xfs_compat_attrlist_by_handle( {int error;attrlist_cursor_kern_t *cursor; +compat_xfs_fsop_attrlist_handlereq_t __user *p = arg;compat_xfs_fsop_attrlist_handlereq_t al_hreq;struct dentry *dentry;char *kbuf;
@@ -370,6 +371,11 @@ xfs_compat_attrlist_by_handle(if (error) goto out_kfree; +if (copy_to_user (&p->pos, cursor,sizeof (attrlist_cursor_kern_t))) { + error = -EFAULT ; + goto out_kfree; + } +if (copy_to_user (compat_ptr (al_hreq.buffer), kbuf, al_hreq.buflen)) error = -EFAULT ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 149/321 IB/qib: Fix an error code in qib_sdma_verbs_send()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 5050ae5fa3d54c8e83e1e447cc7e3591110a7f57 ]
We accidentally return success on this error path.
--- drivers/infiniband/hw/qib/qib_sdma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/hw/qib/qib_sdma.c +3 -1
@@ -576,8 +576,10 @@ retry: dw = (len +3 ) >>2 ; addr =dma_map_single (&ppd->dd->pcidev->dev, sge->vaddr, dw <<2 ,DMA_TO_DEVICE ); -if (dma_mapping_error (&ppd->dd->pcidev->dev, addr)) +if (dma_mapping_error (&ppd->dd->pcidev->dev, addr)) { + ret = -ENOMEM ; goto unmap; + } sdmadesc[0 ] =0 ;make_sdma_desc (ppd, sdmadesc, (u64 ) addr, dw, dwoffset);/* SDmaUseLargeBuf has to be set in every descriptor */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 148/321 xfs: Fix bulkstat compat ioctls on x32 userspace.
In reply to Greg Kroah-HartmanFrom: Nick Bowler <[email protected]>
[ Upstream commit 7ca860e3c1a74ad6bd8949364073ef1044cad758 ]
The bulkstat family of ioctls are problematic on x32, because there is a mixup of native 32-bit and 64-bit conventions. The xfs_fsop_bulkreq struct contains pointers and 32-bit integers so that matches the native 32-bit layout, and that means the ioctl implementation goes into the regular compat path on x32.
However, the 'ubuffer' member of that struct in turn refers to either struct xfs_inogrp or xfs_bstat (or an array of these). On x32, those structures match the native 64-bit layout. The compat implementation writes out the 32-bit version of these structures. This is not the expected format for x32 userspace, causing problems.
Fortunately the functions which actually output these xfs_inogrp and xfs_bstat structures have an easy way to select which output format is required, so we just need a little tweak to select the right format on x32.
--- fs/xfs/xfs_ioctl32.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-)
fs/xfs/xfs_ioctl32.c +30 -4
@@ -241,6 +241,32 @@ xfs_compat_ioc_bulkstat(int done;int error; +/* +* Output structure handling functions. Depending on the command, +* either the xfs_bstat and xfs_inogrp structures are written out +* to userpace memory via bulkreq.ubuffer. Normally the compat +* functions and structure size are the correct ones to use ... +*/ +inumbers_fmt_pf inumbers_func = xfs_inumbers_fmt_compat; +bulkstat_one_pf bs_one_func = xfs_bulkstat_one_compat; +size_t bs_one_size =sizeof (struct compat_xfs_bstat ); + +#ifdef CONFIG_X86_X32 +if (in_x32_syscall ()) { +/* +* ... but on x32 the input xfs_fsop_bulkreq has pointers +* which must be handled in the "compat" (32-bit) way, while +* the xfs_bstat and xfs_inogrp structures follow native 64- +* bit layout convention. So adjust accordingly, otherwise +* the data written out in compat layout will not match what +* x32 userspace expects. +*/ + inumbers_func = xfs_inumbers_fmt; + bs_one_func = xfs_bulkstat_one; + bs_one_size =sizeof (struct xfs_bstat ); + } +#endif +/* done = 1 if there are more stats to get and if bulkstat */ /* should be called again (unused here, but used in dmapi) */
@@ -272,15 +298,15 @@ xfs_compat_ioc_bulkstat(if (cmd ==XFS_IOC_FSINUMBERS_32 ) { error =xfs_inumbers (mp, &inlast, &count, - bulkreq.ubuffer, xfs_inumbers_fmt_compat); + bulkreq.ubuffer, inumbers_func); }else if (cmd ==XFS_IOC_FSBULKSTAT_SINGLE_32 ) {int res; - error =xfs_bulkstat_one_compat (mp, inlast, bulkreq.ubuffer, -sizeof (compat_xfs_bstat_t),NULL , &res); + error =bs_one_func (mp, inlast, bulkreq.ubuffer, + bs_one_size,NULL , &res); }else if (cmd ==XFS_IOC_FSBULKSTAT_32 ) { error =xfs_bulkstat (mp, &inlast, &count, - xfs_bulkstat_one_compat,sizeof (compat_xfs_bstat_t), + bs_one_func, bs_one_size, bulkreq.ubuffer, &done); }else error = -EINVAL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 151/321 vxlan: Fix error path in __vxlan_dev_create()
In reply to Greg Kroah-HartmanFrom: Petr Machata <[email protected]>
[ Upstream commit 6db9246871394b3a136cd52001a0763676563840 ]
When a failure occurs in rtnl_configure_link(), the current code calls unregister_netdevice() to roll back the earlier call to register_netdevice(), and jumps to errout, which calls vxlan_fdb_destroy().
However unregister_netdevice() calls transitively ndo_uninit, which is vxlan_uninit(), and that already takes care of deleting the default FDB entry by calling vxlan_fdb_delete_default(). Since the entry added earlier in __vxlan_dev_create() is exactly the default entry, the cleanup code in the errout block always leads to double free and thus a panic.
Besides, since vxlan_fdb_delete_default() always destroys the FDB entry with notification enabled, the deletion of the default entry is notified even before the addition was notified.
Instead, move the unregister_netdevice() call after the manual destroy, which solves both problems.
--- drivers/net/vxlan.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/net/vxlan.c +10 -3
@@ -3213,6 +3213,7 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev,struct vxlan_net *vn =net_generic (net, vxlan_net_id);struct vxlan_dev *vxlan =netdev_priv (dev);struct vxlan_fdb *f =NULL ; +bool unregister = false;int err; err =vxlan_dev_configure (net, dev, conf, false, extack);
@@ -3238,12 +3239,11 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, err =register_netdevice (dev);if (err) goto errout; + unregister = true; err =rtnl_configure_link (dev,NULL ); -if (err) { -unregister_netdevice (dev); +if (err) goto errout; - }/* notify default fdb entry */ if (f)
@@ -3251,9 +3251,16 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev,list_add (&vxlan->next, &vn->vxlan_list);return 0 ; + errout: +/* unregister_netdevice() destroys the default FDB entry with deletion +* notification. But the addition notification was not sent yet, so +* destroy the entry by hand here. +*/ if (f)vxlan_fdb_destroy (vxlan, f, false); +if (unregister) +unregister_netdevice (dev);return err; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 152/321 powerpc/book3s/32: fix number of bats in p/v_block_mapped()
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit e93ba1b7eb5b188c749052df7af1c90821c5f320 ]
This patch fixes the loop in p_block_mapped() and v_block_mapped() to scan the entire bat_addrs[] array.
--- arch/powerpc/mm/ppc_mmu_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/mm/ppc_mmu_32.c +2 -2
@@ -52,7 +52,7 @@ struct batrange { /* stores address ranges mapped by BATs */phys_addr_t v_block_mapped (unsigned long va) {int b; -for (b =0 ; b <4 ; ++b) +for (b =0 ; b <ARRAY_SIZE (bat_addrs); ++b)if (va >= bat_addrs[b].start && va < bat_addrs[b].limit)return bat_addrs[b].phys + (va - bat_addrs[b].start);return 0 ;
@@ -64,7 +64,7 @@ phys_addr_t v_block_mapped(unsigned long va)unsigned long p_block_mapped (phys_addr_t pa) {int b; -for (b =0 ; b <4 ; ++b) +for (b =0 ; b <ARRAY_SIZE (bat_addrs); ++b)if (pa >= bat_addrs[b].phys && pa < (bat_addrs[b].limit-bat_addrs[b].start) +bat_addrs[b].phys)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 153/321 powerpc/xmon: fix dump_segments()
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit 32c8c4c621897199e690760c2d57054f8b84b6e6 ]
mfsrin() takes segment num from bits 31-28 (IBM bits 0-3).
--- arch/powerpc/xmon/xmon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/xmon/xmon.c +1 -1
@@ -3493,7 +3493,7 @@ void dump_segments(void)printf ("sr0-15 =" );for (i =0 ; i <16 ; ++i) -printf (" %x" ,mfsrin (i)); +printf (" %x" ,mfsrin (i <<28 )); printf("\n"); }#endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 154/321 drivers/regulator: fix a missing check of return value
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit 966e927bf8cc6a44f8b72582a1d6d3ffc73b12ad ]
If palmas_smps_read() fails, we should not use the read data in "reg" which may contain random value. The fix inserts a check for the return value of palmas_smps_read(): If it fails, we return the error code upstream and stop using "reg".
--- drivers/regulator/palmas-regulator.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/regulator/palmas-regulator.c +4 -1
@@ -443,13 +443,16 @@ static int palmas_ldo_write(struct palmas *palmas, unsigned int reg,static int palmas_set_mode_smps (struct regulator_dev *dev,unsigned int mode) {int id =rdev_get_id (dev); +int ret;struct palmas_pmic *pmic =rdev_get_drvdata (dev);struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata;struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];unsigned int reg;bool rail_enable = true; -palmas_smps_read (pmic->palmas, rinfo->ctrl_addr, ®); + ret =palmas_smps_read (pmic->palmas, rinfo->ctrl_addr, ®); +if (ret) +return ret; reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 155/321 Bluetooth: hci_bcm: Handle specific unknown packets after firmware loading
In reply to Greg Kroah-HartmanFrom: Jonathan Bakker <[email protected]>
[ Upstream commit 22bba80500fdf624a7cfbb65fdfa97a038ae224d ]
The Broadcom controller on aries S5PV210 boards sends out a couple of unknown packets after the firmware is loaded. This will cause logging of errors such as:
Bluetooth: hci0: Frame reassembly failed (-84)
This is probably also the case with other boards, as there are related Android userspace patches for custom ROMs such as
https://review.lineageos.org/#/c/LineageOS/android_system_bt/+/142721/
Since this appears to be intended behaviour, treated them as diagnostic packets.
Note that this is another variant of commit 01d5e44ace8a ("Bluetooth: hci_bcm: Handle empty packet after firmware loading")
--- drivers/bluetooth/hci_bcm.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/bluetooth/hci_bcm.c +22 -0
@@ -51,6 +51,12 @@#define BCM_LM_DIAG_PKT 0x07#define BCM_LM_DIAG_SIZE 63 +#define BCM_TYPE49_PKT 0x31 +#define BCM_TYPE49_SIZE 0 + +#define BCM_TYPE52_PKT 0x34 +#define BCM_TYPE52_SIZE 0 +#define BCM_AUTOSUSPEND_DELAY 5000/* default autosleep delay */ /**
@@ -564,12 +570,28 @@ finalize: .lsize = 0, \ .maxlen = BCM_NULL_SIZE +#define BCM_RECV_TYPE49 \ + .type = BCM_TYPE49_PKT, \ + .hlen = BCM_TYPE49_SIZE, \ + .loff = 0, \ + .lsize = 0, \ + .maxlen = BCM_TYPE49_SIZE + +#define BCM_RECV_TYPE52 \ + .type = BCM_TYPE52_PKT, \ + .hlen = BCM_TYPE52_SIZE, \ + .loff = 0, \ + .lsize = 0, \ + .maxlen = BCM_TYPE52_SIZE +static const struct h4_recv_pkt bcm_recv_pkts[] = { {H4_RECV_ACL , .recv = hci_recv_frame }, {H4_RECV_SCO , .recv = hci_recv_frame }, {H4_RECV_EVENT , .recv = hci_recv_frame }, {BCM_RECV_LM_DIAG , .recv = hci_recv_diag }, {BCM_RECV_NULL , .recv = hci_recv_diag }, + {BCM_RECV_TYPE49 , .recv = hci_recv_diag }, + {BCM_RECV_TYPE52 , .recv = hci_recv_diag }, };static int bcm_recv (struct hci_uart *hu,const void *data,int count)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 156/321 serial: max310x: Fix tx_empty() callback
In reply to Greg Kroah-HartmanFrom: Alexander Shiyan <[email protected]>
[ Upstream commit a8da3c7873ea57acb8f9cea58c0af477522965aa ]
Function max310x_tx_empty() accesses the IRQSTS register, which is cleared by IC when reading, so if there is an interrupt status, we will lose it. This patch implement the transmitter check only by the current FIFO level.
--- drivers/tty/serial/max310x.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/tty/serial/max310x.c +2 -5
@@ -844,12 +844,9 @@ static void max310x_wq_proc(struct work_struct *ws)static unsigned int max310x_tx_empty (struct uart_port *port) { -unsigned int lvl, sts; +u8 lvl =max310x_port_read (port,MAX310X_TXFIFOLVL_REG ); - lvl =max310x_port_read (port,MAX310X_TXFIFOLVL_REG ); - sts =max310x_port_read (port,MAX310X_IRQSTS_REG ); - -return ((sts &MAX310X_IRQ_TXEMPTY_BIT ) && !lvl) ?TIOCSER_TEMT :0 ; +return lvl ?0 :TIOCSER_TEMT ; }static unsigned int max310x_get_mctrl (struct uart_port *port)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 157/321 openrisc: Fix broken paths to arch/or32
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 57ce8ba0fd3a95bf29ed741df1c52bd591bf43ff ]
OpenRISC was mainlined as "openrisc", not "or32". vmlinux.lds is generated from vmlinux.lds.S.
--- arch/openrisc/kernel/entry.S | 2 +- arch/openrisc/kernel/head.S | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +1 -1
@@ -240,7 +240,7 @@ handler: ;\ * occured. in fact they never do. if you need them use * values saved on stack (for SPR_EPC, SPR_ESR) or content * of r4 (for SPR_EEAR). for details look at EXCEPTION_HANDLE() - * in 'arch/or32/kernel/head.S' + * in 'arch/openrisc/kernel/head.S' */ /* =====================================================[ exceptions] === */
arch/openrisc/kernel/head.S +1 -1
@@ -1728,7 +1728,7 @@ _string_nl: /* * .data section should be page aligned - * (look into arch/or32/kernel/vmlinux.lds) + * (look into arch/openrisc/kernel/vmlinux.lds.S) */ .section .data,"aw" .align 8192
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 158/321 RDMA/srp: Propagate ib_post_send() failures to the SCSI mid-layer
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
[ Upstream commit 2ee00f6a98c36f7e4ba07cc33f24cc5a69060cc9 ]
This patch avoids that the SCSI mid-layer keeps retrying forever if ib_post_send() fails. This was discovered while testing immediate data support and passing a too large num_sge value to ib_post_send().
--- drivers/infiniband/ulp/srp/ib_srp.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/ulp/srp/ib_srp.c +1 -0
@@ -2357,6 +2357,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)if (srp_post_send (ch, iu, len)) {shost_printk (KERN_ERR , target->scsi_host,PFX "Send failed\n" ); + scmnd->result =DID_ERROR <<16 ; goto err_unmap; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 159/321 scsi: qla2xxx: deadlock by configfs_depend_item
In reply to Greg Kroah-HartmanFrom: Anatoliy Glagolev <[email protected]>
[ Upstream commit 17b18eaa6f59044a5172db7d07149e31ede0f920 ]
The intent of invoking configfs_depend_item in commit 7474f52a82d51 ("tcm_qla2xxx: Perform configfs depend/undepend for base_tpg") was to prevent a physical Fibre Channel port removal when virtual (NPIV) ports announced through that physical port are active. The change does not work as expected: it makes enabled physical port dependent on target configfs subsystem (the port's parent), something the configfs guarantees anyway.
Besides, scheduling work in a worker thread and waiting for the work's completion is not really a valid workaround for the requirement not to call configfs_depend_item from a configfs callback: the call occasionally deadlocks.
Thus, removing configfs_depend_item calls does not break anything and fixes the deadlock problem.
--- drivers/scsi/qla2xxx/tcm_qla2xxx.c | 48 +++++------------------------- drivers/scsi/qla2xxx/tcm_qla2xxx.h | 3 -- 2 files changed, 8 insertions(+), 43 deletions(-)
drivers/scsi/qla2xxx/tcm_qla2xxx.c +8 -40
@@ -926,38 +926,14 @@ static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item, atomic_read(&tpg->lport_tpg_enabled)); } -static void tcm_qla2xxx_depend_tpg (struct work_struct *work) -{ -struct tcm_qla2xxx_tpg *base_tpg =container_of (work, - struct tcm_qla2xxx_tpg, tpg_base_work); -struct se_portal_group *se_tpg = &base_tpg->se_tpg; -struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; - -if (!target_depend_item (&se_tpg->tpg_group.cg_item)) { -atomic_set (&base_tpg->lport_tpg_enabled,1 ); -qlt_enable_vha (base_vha); - } -complete (&base_tpg->tpg_base_comp); -} - -static void tcm_qla2xxx_undepend_tpg (struct work_struct *work) -{ -struct tcm_qla2xxx_tpg *base_tpg =container_of (work, - struct tcm_qla2xxx_tpg, tpg_base_work); -struct se_portal_group *se_tpg = &base_tpg->se_tpg; -struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; - -if (!qlt_stop_phase1 (base_vha->vha_tgt.qla_tgt)) { -atomic_set (&base_tpg->lport_tpg_enabled,0 ); -target_undepend_item (&se_tpg->tpg_group.cg_item); - } -complete (&base_tpg->tpg_base_comp); -} -static ssize_t tcm_qla2xxx_tpg_enable_store (struct config_item *item,const char *page,size_t count) {struct se_portal_group *se_tpg =to_tpg (item); +struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; +struct tcm_qla2xxx_lport *lport =container_of (se_wwn, + struct tcm_qla2xxx_lport, lport_wwn); +struct scsi_qla_host *vha = lport->qla_vha;struct tcm_qla2xxx_tpg *tpg =container_of (se_tpg, struct tcm_qla2xxx_tpg, se_tpg);unsigned long op;
@@ -976,24 +952,16 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,if (atomic_read (&tpg->lport_tpg_enabled))return -EEXIST ; -INIT_WORK (&tpg->tpg_base_work, tcm_qla2xxx_depend_tpg); +atomic_set (&tpg->lport_tpg_enabled,1 ); +qlt_enable_vha (vha); }else {if (!atomic_read (&tpg->lport_tpg_enabled))return count; -INIT_WORK (&tpg->tpg_base_work, tcm_qla2xxx_undepend_tpg); +atomic_set (&tpg->lport_tpg_enabled,0 ); +qlt_stop_phase1 (vha->vha_tgt.qla_tgt); } -init_completion (&tpg->tpg_base_comp); -schedule_work (&tpg->tpg_base_work); -wait_for_completion (&tpg->tpg_base_comp); -if (op) { -if (!atomic_read (&tpg->lport_tpg_enabled)) -return -ENODEV ; - }else { -if (atomic_read (&tpg->lport_tpg_enabled)) -return -EPERM ; - }return count; }
drivers/scsi/qla2xxx/tcm_qla2xxx.h +0 -3
@@ -48,9 +48,6 @@ struct tcm_qla2xxx_tpg {struct tcm_qla2xxx_tpg_attrib tpg_attrib;/* Returned by tcm_qla2xxx_make_tpg() */ struct se_portal_group se_tpg; -/* Items for dealing with configfs_depend_item */ -struct completion tpg_base_comp; -struct work_struct tpg_base_work; };struct tcm_qla2xxx_fc_loopid {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 161/321 brcmfmac: Fix access point mode
In reply to Greg Kroah-HartmanFrom: Stefan Wahren <[email protected]>
[ Upstream commit 861cb5eb467f5e38dce1aabe4e8db379255bd89b ]
Since commit 1204aa17f3b4 ("brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag") the Raspberry Pi 3 A+ (BCM43455) isn't able to operate in AP mode with hostapd (device_ap_sme=1 use_monitor=0):
brcmfmac: brcmf_cfg80211_stop_ap: setting AP mode failed -52
So add the missing mgmt_stypes for AP mode to fix this.
--- .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +10 -0
@@ -6314,6 +6314,16 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = { .tx = 0xffff, .rx =BIT (IEEE80211_STYPE_ACTION >>4 ) |BIT (IEEE80211_STYPE_PROBE_REQ >>4 ) + }, + [NL80211_IFTYPE_AP] = { + .tx = 0xffff, + .rx =BIT (IEEE80211_STYPE_ASSOC_REQ >>4 ) | +BIT (IEEE80211_STYPE_REASSOC_REQ >>4 ) | +BIT (IEEE80211_STYPE_PROBE_REQ >>4 ) | +BIT (IEEE80211_STYPE_DISASSOC >>4 ) | +BIT (IEEE80211_STYPE_AUTH >>4 ) | +BIT (IEEE80211_STYPE_DEAUTH >>4 ) | + BIT(IEEE80211_STYPE_ACTION >> 4) } };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 162/321 ath6kl: Only use match sets when firmware supports it
In reply to Greg Kroah-HartmanFrom: Kyle Roeschley <[email protected]>
[ Upstream commit fb376a495fbdb886f38cfaf5a3805401b9e46f13 ]
Commit dd45b7598f1c ("ath6kl: Include match ssid list in scheduled scan") merged the probed and matched SSID lists before sending them to the firmware. In the process, it assumed match set support is always available in ath6kl_set_probed_ssids, which breaks scans for hidden SSIDs. Now, check that the firmware supports matching SSIDs in scheduled scans before setting MATCH_SSID_FLAG.
--- drivers/net/wireless/ath/ath6kl/cfg80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath6kl/cfg80211.c +1 -1
@@ -939,7 +939,7 @@ static int ath6kl_set_probed_ssids(struct ath6kl *ar,else ssid_list[i].flag =ANY_SSID_FLAG ; -if (n_match_ssid ==0 ) +if (ar->wiphy->max_match_sets !=0 && n_match_ssid ==0 ) ssid_list[i].flag |=MATCH_SSID_FLAG ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 165/321 powerpc/32: Avoid unsupported flags with clang
In reply to Greg Kroah-HartmanFrom: Joel Stanley <[email protected]>
[ Upstream commit 72e7bcc2cdf82bf03caaa5e6c9b0134c2fc2ee7d ]
When building for ppc32 with clang these flags are unsupported:
-ffixed-r2 and -mmultiple
llvm's lib/Target/PowerPC/PPCRegisterInfo.cpp marks r2 as reserved on when building for SVR4ABI and !ppc64:
// The SVR4 ABI reserves r2 and r13
if (Subtarget.isSVR4ABI()) {
// We only reserve r2 if we need to use the TOC pointer. If we have no
// explicit uses of the TOC pointer (meaning we're a leaf function with
// no constant-pool loads, etc.) and we have no potential uses inside an
// inline asm block, then we can treat r2 has an ordinary callee-saved
// register.
const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
if (!TM.isPPC64() || FuncInfo->usesTOCBasePtr() || MF.hasInlineAsm())
markSuperRegs(Reserved, PPC::R2); // System-reserved register
markSuperRegs(Reserved, PPC::R13); // Small Data Area pointer register}
This means we can safely omit -ffixed-r2 when building for 32-bit targets.
The -mmultiple/-mno-multiple flags are not supported by clang, so platforms that might support multiple miss out on using multiple word instructions.
We wrap these flags in cc-option so that when Clang gains support the kernel will be able use these flags.
Clang 8 can then build a ppc44x_defconfig which boots in Qemu:
make CC=clang-8 ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- ppc44x_defconfig ./scripts/config -e CONFIG_DEVTMPFS -d DEVTMPFS_MOUNT
make CC=clang-8 ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu-
qemu-system-ppc -M bamboo \ -kernel arch/powerpc/boot/zImage \ -dtb arch/powerpc/boot/dts/bamboo.dtb \ -initrd ~/ppc32-440-rootfs.cpio \ -nographic -serial stdio -monitor pty -append "console=ttyS0"
--- arch/powerpc/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
arch/powerpc/Makefile +8 -1
@@ -145,7 +145,14 @@ endif CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc)) CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) -CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 $(MULTIPLEWORD) +# Clang unconditionally reserves r2 on ppc32 and does not support the flag +# https://bugs.llvm.org/show_bug.cgi?id=39555 +CFLAGS-$(CONFIG_PPC32) := $(call cc-option, -ffixed-r2) + +# Clang doesn't support -mmultiple / -mno-multiple +# https://bugs.llvm.org/show_bug.cgi?id=39556 +CFLAGS-$(CONFIG_PPC32) += $(call cc-option, $(MULTIPLEWORD)) + CFLAGS-$(CONFIG_PPC32) += $(call cc-option,-mno-readonly-in-sdata) ifdef CONFIG_PPC_BOOK3S_64
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 164/321 powerpc/perf: Fix unit_sel/cache_sel checks
In reply to Greg Kroah-HartmanFrom: Madhavan Srinivasan <[email protected]>
[ Upstream commit 2d46d4877b1afd14059393a48bdb8ce27955174c ]
Raw event code has couple of fields "unit" and "cache" in it, to capture the "unit" to monitor for a given pmcxsel and cache reload qualifier to program in MMCR1.
isa207_get_constraint() refers "unit" field to update the MMCRC (L2/L3) Event bus control fields with "cache" bits of the raw event code. These are power8 specific and not supported by PowerISA v3.0 pmu. So wrap the checks to be power8 specific. Also, "cache" bit field is referred to update MMCR1[16:17] and this check can be power8 specific.
--- arch/powerpc/perf/isa207-common.c | 25 ++++++++++++++++++------- arch/powerpc/perf/isa207-common.h | 4 ++-- 2 files changed, 20 insertions(+), 9 deletions(-)
arch/powerpc/perf/isa207-common.c +18 -7
@@ -148,6 +148,14 @@ static bool is_thresh_cmp_valid(u64 event)return true; } +static unsigned int dc_ic_rld_quad_l1_sel (u64 event) +{ +unsigned int cache; + + cache = (event >>EVENT_CACHE_SEL_SHIFT ) &MMCR1_DC_IC_QUAL_MASK ; +return cache; +} +static inline u64 isa207_find_source (u64 idx,u32 sub_idx) {u64 ret =PERF_MEM_NA ;
@@ -288,10 +296,10 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)* have a cache selector of zero. The bank selector (bit 3) is * irrelevant, as long as the rest of the value is 0. */ -if (cache &0x7 ) +if (!cpu_has_feature (CPU_FTR_ARCH_300 ) && (cache &0x7 ))return -1 ; - }else if (event &EVENT_IS_L1 ) { + }else if (cpu_has_feature (CPU_FTR_ARCH_300 ) || (event &EVENT_IS_L1 )) { mask |=CNST_L1_QUAL_MASK ; value |=CNST_L1_QUAL_VAL (cache); }
@@ -394,11 +402,14 @@ int isa207_compute_mmcr(u64 event[], int n_ev,/* In continuous sampling mode, update SDAR on TLB miss */ mmcra_sdar_mode (event[i], &mmcra); -if (event[i] &EVENT_IS_L1 ) { - cache = event[i] >>EVENT_CACHE_SEL_SHIFT ; - mmcr1 |= (cache &1 ) <<MMCR1_IC_QUAL_SHIFT ; - cache >>=1 ; - mmcr1 |= (cache &1 ) <<MMCR1_DC_QUAL_SHIFT ; +if (cpu_has_feature (CPU_FTR_ARCH_300 )) { + cache =dc_ic_rld_quad_l1_sel (event[i]); + mmcr1 |= (cache) <<MMCR1_DC_IC_QUAL_SHIFT ; + }else { +if (event[i] &EVENT_IS_L1 ) { + cache =dc_ic_rld_quad_l1_sel (event[i]); + mmcr1 |= (cache) <<MMCR1_DC_IC_QUAL_SHIFT ; + } }if (is_event_marked (event[i])) {
arch/powerpc/perf/isa207-common.h +2 -2
@@ -163,8 +163,8 @@#define MMCR1_COMBINE_SHIFT (pmc) (35 - ((pmc) - 1))#define MMCR1_PMCSEL_SHIFT (pmc) (24 - (((pmc) - 1)) * 8)#define MMCR1_FAB_SHIFT 36 -#define MMCR1_DC_QUAL_SHIFT 47 -#define MMCR1_IC_QUAL_SHIFT 46 +#define MMCR1_DC_IC_QUAL_MASK 0x3 +#define MMCR1_DC_IC_QUAL_SHIFT 46/* MMCR1 Combine bits macro for power9 */ #define p9_MMCR1_COMBINE_SHIFT (pmc) (38 - ((pmc - 1) * 2))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 167/321 powerpc/mm: Make NULL pointer deferences explicit on bad page faults.
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit 49a502ea23bf9dec47f8f3c3960909ff409cd1bb ]
As several other arches including x86, this patch makes it explicit that a bad page fault is a NULL pointer dereference when the fault address is lower than PAGE_SIZE
In the mean time, this page makes all bad_page_fault() messages shorter so that they remain on one single line. And it prefixes them by "BUG: " so that they get easily grepped.
--- arch/powerpc/mm/fault.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
arch/powerpc/mm/fault.c +9 -8
@@ -633,21 +633,22 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)switch (TRAP (regs)) {case 0x300 :case 0x380 : -printk (KERN_ALERT "Unable to handle kernel paging request for " -"data at address 0x%08lx\n" , regs->dar); +pr_alert ("BUG: %s at 0x%08lx\n" , + regs->dar <PAGE_SIZE ?"Kernel NULL pointer dereference" : +"Unable to handle kernel data access" , regs->dar);break ;case 0x400 :case 0x480 : -printk (KERN_ALERT "Unable to handle kernel paging request for " -"instruction fetch\n" ); +pr_alert ("BUG: Unable to handle kernel instruction fetch%s" , + regs->nip <PAGE_SIZE ?" (NULL pointer?)\n" :"\n" );break ;case 0x600 : -printk (KERN_ALERT "Unable to handle kernel paging request for " -"unaligned access at address 0x%08lx\n" , regs->dar); +pr_alert ("BUG: Unable to handle kernel unaligned access at 0x%08lx\n" , + regs->dar);break ;default : -printk (KERN_ALERT "Unable to handle kernel paging request for " -"unknown fault\n" ); +pr_alert ("BUG: Unable to handle unknown paging fault at 0x%08lx\n" , + regs->dar);break ; } printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 130/321 vfio-mdev/samples: Use u8 instead of char for handle functions
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 8ba35b3a0046d6573c98f00461d9bd1b86250d35 ]
Clang warns:
samples/vfio-mdev/mtty.c:592:39: warning: implicit conversion from 'int' to 'char' changes value from 162 to -94 [-Wconstant-conversion]
*buf = UART_MSR_DSR | UART_MSR_DDSR | UART_MSR_DCD;
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~1 warning generated.
Turns out that all uses of buf in this function ultimately end up stored or cast to an unsigned type. Just use u8, which has the same number of bits but can store this larger number so Clang no longer warns.
--- samples/vfio-mdev/mtty.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
samples/vfio-mdev/mtty.c +13 -13
@@ -171,7 +171,7 @@ static struct mdev_state *find_mdev_state_by_uuid(uuid_le uuid)return NULL ; } -void dump_buffer (char *buf,uint32_t count) +void dump_buffer (u8 *buf,uint32_t count) {#if defined(DEBUG )int i;
@@ -250,7 +250,7 @@ static void mtty_create_config_space(struct mdev_state *mdev_state) }static void handle_pci_cfg_write (struct mdev_state *mdev_state,u16 offset, -char *buf,u32 count) +u8 *buf,u32 count) {u32 cfg_addr, bar_mask, bar_index =0 ;
@@ -304,7 +304,7 @@ static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset, }static void handle_bar_write (unsigned int index,struct mdev_state *mdev_state, -u16 offset,char *buf,u32 count) +u16 offset,u8 *buf,u32 count) {u8 data = *buf;
@@ -475,7 +475,7 @@ static void handle_bar_write(unsigned int index, struct mdev_state *mdev_state, }static void handle_bar_read (unsigned int index,struct mdev_state *mdev_state, -u16 offset,char *buf,u32 count) +u16 offset,u8 *buf,u32 count) {/* Handle read requests by guest */ switch (offset) {
@@ -650,7 +650,7 @@ static void mdev_read_base(struct mdev_state *mdev_state) } } -static ssize_t mdev_access (struct mdev_device *mdev,char *buf,size_t count, +static ssize_t mdev_access (struct mdev_device *mdev,u8 *buf,size_t count,loff_t pos,bool is_write) {struct mdev_state *mdev_state;
@@ -698,7 +698,7 @@ static ssize_t mdev_access(struct mdev_device *mdev, char *buf, size_t count,#if defined(DEBUG_REGS )pr_info ("%s: BAR%d WR @0x%llx %s val:0x%02x dlab:%d\n" , __func__, index, offset, wr_reg[offset], - (u8)*buf, mdev_state->s[index].dlab); + *buf, mdev_state->s[index].dlab);#endif handle_bar_write (index, mdev_state, offset, buf, count); }else {
@@ -708,7 +708,7 @@ static ssize_t mdev_access(struct mdev_device *mdev, char *buf, size_t count,#if defined(DEBUG_REGS )pr_info ("%s: BAR%d RD @0x%llx %s val:0x%02x dlab:%d\n" , __func__, index, offset, rd_reg[offset], - (u8)*buf, mdev_state->s[index].dlab); + *buf, mdev_state->s[index].dlab);#endif }break ;
@@ -827,7 +827,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count,if (count >=4 && !(*ppos %4 )) {u32 val; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, false);if (ret <=0 ) goto read_err;
@@ -839,7 +839,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count, }else if (count >=2 && !(*ppos %2 )) {u16 val; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, false);if (ret <=0 ) goto read_err;
@@ -851,7 +851,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count, }else {u8 val; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, false);if (ret <=0 ) goto read_err;
@@ -889,7 +889,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf,if (copy_from_user (&val, buf,sizeof (val))) goto write_err; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, true);if (ret <=0 ) goto write_err;
@@ -901,7 +901,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf,if (copy_from_user (&val, buf,sizeof (val))) goto write_err; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, true);if (ret <=0 ) goto write_err;
@@ -913,7 +913,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf,if (copy_from_user (&val, buf,sizeof (val))) goto write_err; - ret =mdev_access (mdev, (char *)&val,sizeof (val), + ret =mdev_access (mdev, (u8 *)&val,sizeof (val), *ppos, true);if (ret <=0 ) goto write_err;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 168/321 powerpc/44x/bamboo: Fix PCI range
In reply to Greg Kroah-HartmanFrom: Benjamin Herrenschmidt <[email protected]>
[ Upstream commit 3cfb9ebe906b51f2942b1e251009bb251efd2ba6 ]
The bamboo dts has a bug: it uses a non-naturally aligned range for PCI memory space. This isnt' supported by the code, thus causing PCI to break on this system.
This is due to the fact that while the chip memory map has 1G reserved for PCI memory, it's only 512M aligned. The code doesn't know how to split that into 2 different PMMs and fails, so limit the region to 512M.
--- arch/powerpc/boot/dts/bamboo.dts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/boot/dts/bamboo.dts +3 -1
@@ -268,8 +268,10 @@ /* Outbound ranges, one memory and one IO, * later cannot be changed. Chip supports a second * IO range but we don't use it for now + * The chip also supports a larger memory range but + * it's not naturally aligned, so our code will break */ - ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x40000000 + ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x20000000 0x02000000 0x00000000 0x00000000 0x00000000 0xe0000000 0x00000000 0x00100000 0x01000000 0x00000000 0x00000000 0x00000000 0xe8000000 0x00000000 0x00010000>;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 133/321 net/mlx5: Continue driver initialization despite debugfs failure
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit 199fa087dc6b503baad06712716fac645a983e8a ]
The failure to create debugfs entry is unpleasant event, but not enough to abort drier initialization. Align the mlx5_core code to debugfs design and continue execution whenever debugfs_create_dir() successes or not.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +3 -5
@@ -859,11 +859,9 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv) priv->numa_node =dev_to_node (&dev->pdev->dev); - priv->dbg_root =debugfs_create_dir (dev_name (&pdev->dev), mlx5_debugfs_root); -if (!priv->dbg_root) { -dev_err (&pdev->dev,"Cannot create debugfs dir, aborting\n" ); -return -ENOMEM ; - } +if (mlx5_debugfs_root) + priv->dbg_root = +debugfs_create_dir (pci_name (pdev), mlx5_debugfs_root); err =mlx5_pci_enable_device (dev);if (err) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 134/321 netfilter: nf_nat_sip: fix RTP/RTCP source port translations
In reply to Greg Kroah-HartmanFrom: Alin Nastac <[email protected]>
[ Upstream commit 8294059931448aa1ca112615bdffa3eab552c382 ]
Each media stream negotiation between 2 SIP peers will trigger creation of 4 different expectations (2 RTP and 2 RTCP):
- INVITE will create expectations for the media packets sent by the called peer
- reply to the INVITE will create expectations for media packets sent by the caller
The dport used by these expectations usually match the ones selected by the SIP peers, but they might get translated due to conflicts with another expectation. When such event occur, it is important to do this translation in both directions, dport translation on the receiving path and sport translation on the sending path.
This commit fixes the sport translation when the peer requiring it is also the one that starts the media stream. In this scenario, first media stream packet is forwarded from LAN to WAN and will rely on nf_nat_sip_expected() to do the necessary sport translation. However, the expectation matched by this packet does not contain the necessary information for doing SNAT, this data being stored in the paired expectation created by the sender's SIP message (INVITE or reply to it).
--- net/netfilter/nf_nat_sip.c | 39 ++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-)
net/netfilter/nf_nat_sip.c +35 -4
@@ -18,6 +18,7 @@#include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_helper.h> +#include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_conntrack_helper.h> #include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_seqadj.h>
@@ -316,6 +317,9 @@ static void nf_nat_sip_seq_adjust(struct sk_buff *skb, unsigned int protoff,static void nf_nat_sip_expected (struct nf_conn *ct,struct nf_conntrack_expect *exp) { +struct nf_conn_help *help =nfct_help (ct->master); +struct nf_conntrack_expect *pair_exp; +int range_set_for_snat =0 ;struct nf_nat_range2 range;/* This must be a fresh one. */
@@ -327,15 +331,42 @@ static void nf_nat_sip_expected(struct nf_conn *ct, range.min_addr = range.max_addr = exp->saved_addr;nf_nat_setup_info (ct, &range,NF_NAT_MANIP_DST ); -/* Change src to where master sends to, but only if the connection -* actually came from the same source. */ -if (nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, +/* Do media streams SRC manip according with the parameters +* found in the paired expectation. +*/ +if (exp->class !=SIP_EXPECT_SIGNALLING ) { +spin_lock_bh (&nf_conntrack_expect_lock); +hlist_for_each_entry (pair_exp, &help->expectations, lnode) { +if (pair_exp->tuple.src.l3num ==nf_ct_l3num (ct) && + pair_exp->tuple.dst.protonum == ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.dst.protonum && +nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, &pair_exp->saved_addr) && + ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u.all == pair_exp->saved_proto.all) { + range.flags = (NF_NAT_RANGE_MAP_IPS |NF_NAT_RANGE_PROTO_SPECIFIED ); + range.min_proto.all = range.max_proto.all = pair_exp->tuple.dst.u.all; + range.min_addr = range.max_addr = pair_exp->tuple.dst.u3; + range_set_for_snat =1 ; +break ; + } + } +spin_unlock_bh (&nf_conntrack_expect_lock); + } + +/* When no paired expectation has been found, change src to +* where master sends to, but only if the connection actually came +* from the same source. +*/ +if (!range_set_for_snat && +nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, &ct->master->tuplehash[exp->dir].tuple.src.u3)) { range.flags =NF_NAT_RANGE_MAP_IPS ; range.min_addr = range.max_addr = ct->master->tuplehash[!exp->dir].tuple.dst.u3; -nf_nat_setup_info (ct, &range,NF_NAT_MANIP_SRC ); + range_set_for_snat =1 ; } + +/* Perform SRC manip. */ +if (range_set_for_snat) +nf_nat_setup_info (ct, &range,NF_NAT_MANIP_SRC ); } static unsigned int nf_nat_sip_expect(struct sk_buff *skb, unsigned int protoff,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 135/321 exofs_mount(): fix leaks on failure exits
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
[ Upstream commit 26cb5a328c6b2bda9e859307ce4cfc60df3a2c28 ]
... and don't abuse mount_nodev(), while we are at it.
--- fs/exofs/super.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)
fs/exofs/super.c +29 -8
@@ -705,21 +705,18 @@ out:/* * Read the superblock from the OSD and fill in the fields */ -static int exofs_fill_super (struct super_block *sb,void *data,int silent) +static int exofs_fill_super (struct super_block *sb, +struct exofs_mountopt *opts, +struct exofs_sb_info *sbi, +int silent) {struct inode *root; -struct exofs_mountopt *opts = data; -struct exofs_sb_info *sbi;/*extended info */ struct osd_dev *od;/* Master device */ struct exofs_fscb fscb;/*on-disk superblock info */ struct ore_comp comp;unsigned table_count;int ret; - sbi =kzalloc (sizeof (*sbi),GFP_KERNEL ); -if (!sbi) -return -ENOMEM ; -/* use mount options to fill superblock */ if (opts->is_osdname) {struct osd_dev_info odi = {.systemid_len =0 };
@@ -863,7 +860,9 @@ static struct dentry *exofs_mount(struct file_system_type *type, int flags, const char *dev_name, void *data) { + struct super_block *s;struct exofs_mountopt opts; +struct exofs_sb_info *sbi;int ret; ret =parse_options (data, &opts);
@@ -872,9 +871,31 @@ static struct dentry *exofs_mount(struct file_system_type *type,return ERR_PTR (ret); } + sbi =kzalloc (sizeof (*sbi),GFP_KERNEL ); +if (!sbi) { +kfree (opts.dev_name); +return ERR_PTR (-ENOMEM ); + } + + s =sget (type,NULL , set_anon_super, flags,NULL ); + +if (IS_ERR (s)) { +kfree (opts.dev_name); +kfree (sbi); +return ERR_CAST (s); + } +if (!opts.dev_name) opts.dev_name = dev_name; -return mount_nodev (type, flags, &opts, exofs_fill_super); + + + ret =exofs_fill_super (s, &opts, sbi, flags &SB_SILENT ?1 :0 ); +if (ret) { +deactivate_locked_super (s); +return ERR_PTR (ret); + } + s->s_flags |=SB_ACTIVE ; +return dget (s->s_root); }/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 170/321 powerpc/powernv/eeh/npu: Fix uninitialized variables in opal_pci_eeh_freeze_status
In reply to Greg Kroah-HartmanFrom: Alexey Kardashevskiy <[email protected]>
[ Upstream commit c20577014f85f36d4e137d3d52a1f61225b4a3d2 ]
The current implementation of the OPAL_PCI_EEH_FREEZE_STATUS call in skiboot's NPU driver does not touch the pci_error_type parameter so it might have garbage but the powernv code analyzes it nevertheless.
This initializes pcierr and fstate to zero in all call sites.
--- arch/powerpc/platforms/powernv/eeh-powernv.c | 8 ++++---- arch/powerpc/platforms/powernv/pci-ioda.c | 4 ++-- arch/powerpc/platforms/powernv/pci.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-)
arch/powerpc/platforms/powernv/eeh-powernv.c +4 -4
@@ -578,8 +578,8 @@ static void pnv_eeh_get_phb_diag(struct eeh_pe *pe)static int pnv_eeh_get_phb_state (struct eeh_pe *pe) {struct pnv_phb *phb = pe->phb->private_data; -u8 fstate; -__be16 pcierr; +u8 fstate =0 ; +__be16 pcierr =0 ;s64 rc;int result =0 ;
@@ -617,8 +617,8 @@ static int pnv_eeh_get_phb_state(struct eeh_pe *pe)static int pnv_eeh_get_pe_state (struct eeh_pe *pe) {struct pnv_phb *phb = pe->phb->private_data; -u8 fstate; -__be16 pcierr; +u8 fstate =0 ; +__be16 pcierr =0 ;s64 rc;int result;
arch/powerpc/platforms/powernv/pci-ioda.c +2 -2
@@ -605,8 +605,8 @@ static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt)static int pnv_ioda_get_pe_state (struct pnv_phb *phb,int pe_no) {struct pnv_ioda_pe *slave, *pe; -u8 fstate, state; -__be16 pcierr; +u8 fstate =0 , state; +__be16 pcierr =0 ;s64 rc;/* Sanity check on PE number */
arch/powerpc/platforms/powernv/pci.c +2 -2
@@ -602,8 +602,8 @@ static void pnv_pci_handle_eeh_config(struct pnv_phb *phb, u32 pe_no)static void pnv_pci_config_check_eeh (struct pci_dn *pdn) {struct pnv_phb *phb = pdn->phb->private_data; -u8 fstate; -__be16 pcierr; +u8 fstate =0 ; +__be16 pcierr =0 ;unsigned int pe_no;s64 rc;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 180/321 powerpc: Fix HMIs on big-endian with CONFIG_RELOCATABLE=y
In reply to Greg Kroah-HartmanFrom: Benjamin Herrenschmidt <[email protected]>
[ Upstream commit 505a314fb28ce122091691c51426fa85c084e115 ]
HMIs will crash the kernel due to
BRANCH_LINK_TO_FAR(hmi_exception_realmode)
Calling into the OPD instead of the actual code.
--- arch/powerpc/kernel/exceptions-64s.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/exceptions-64s.S +1 -1
@@ -1123,7 +1123,7 @@ TRAMP_REAL_BEGIN(hmi_exception_early) EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) EXCEPTION_PROLOG_COMMON_3(0xe60) addi r3,r1,STACK_FRAME_OVERHEAD - BRANCH_LINK_TO_FAR(hmi_exception_realmode) /* Function call ABI */ + BRANCH_LINK_TO_FAR(DOTSYM(hmi_exception_realmode)) /* Function call ABI */ cmpdi cr0,r3,0 /* Windup the stack. */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 179/321 powerpc/pseries: Fix node leak in update_lmb_associativity_index()
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 47918bc68b7427e961035949cc1501a864578a69 ]
In update_lmb_associativity_index() we lookup dr_node using of_find_node_by_path() which takes a reference for us. In the non-error case we forget to drop the reference. Note that find_aa_index() does modify properties of the node, but doesn't need an extra reference held once it's returned.
--- arch/powerpc/platforms/pseries/hotplug-memory.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/platforms/pseries/hotplug-memory.c +1 -0
@@ -202,6 +202,7 @@ static int update_lmb_associativity_index(struct drmem_lmb *lmb) aa_index =find_aa_index (dr_node, ala_prop, lmb_assoc); +of_node_put (dr_node);dlpar_free_cc_nodes (lmb_node);if (aa_index <0 ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 183/321 net/netlink_compat: Fix a missing check of nla_parse_nested
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 89dfd0083751d00d5d7ead36f6d8b045bf89c5e1 ]
In tipc_nl_compat_sk_dump(), if nla_parse_nested() fails, it could return an error. To be consistent with other invocations of the function call, on error, the fix passes the return value upstream.
--- net/tipc/netlink_compat.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/tipc/netlink_compat.c +5 -2
@@ -1030,8 +1030,11 @@ static int tipc_nl_compat_sk_dump(struct tipc_nl_compat_msg *msg,u32 node;struct nlattr *con[TIPC_NLA_CON_MAX +1 ]; -nla_parse_nested (con,TIPC_NLA_CON_MAX , - sock[TIPC_NLA_SOCK_CON ],NULL ,NULL ); + err =nla_parse_nested (con,TIPC_NLA_CON_MAX , + sock[TIPC_NLA_SOCK_CON ],NULL ,NULL ); + +if (err) +return err; node =nla_get_u32 (con[TIPC_NLA_CON_NODE ]); tipc_tlv_sprintf(msg->rep, " connected to <%u.%u.%u:%u>",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 184/321 net/net_namespace: Check the return value of register_pernet_subsys()
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 0eb987c874dc93f9c9d85a6465dbde20fdd3884c ]
In net_ns_init(), register_pernet_subsys() could fail while registering network namespace subsystems. The fix checks the return value and sends a panic() on failure.
--- net/core/net_namespace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/core/net_namespace.c +2 -1
@@ -913,7 +913,8 @@ static int __init net_ns_init(void) init_net_initialized = true;up_write (&pernet_ops_rwsem); -register_pernet_subsys (&net_ns_ops); +if (register_pernet_subsys (&net_ns_ops)) +panic ("Could not register network namespace subsystems" );rtnl_register (PF_UNSPEC ,RTM_NEWNSID , rtnl_net_newid,NULL ,RTNL_FLAG_DOIT_UNLOCKED );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 186/321 f2fs: fix to dirty inode synchronously
In reply to Greg Kroah-HartmanFrom: Chao Yu <[email protected]>
[ Upstream commit b32e019049e959ee10ec359893c9dd5d057dad55 ]
If user change inode's i_flags via ioctl, let's add it into global dirty list, so that checkpoint can guarantee its persistence before fsync, it can make checkpoint keeping strong consistency.
--- fs/f2fs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/file.c +1 -1
@@ -1667,7 +1667,7 @@ static int __f2fs_ioc_setflags(struct inode *inode, unsigned int flags) inode->i_ctime =current_time (inode);f2fs_set_inode_flags (inode); -f2fs_mark_inode_dirty_sync (inode, false); +f2fs_mark_inode_dirty_sync (inode, true);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 185/321 f2fs: fix block address for __check_sit_bitmap
In reply to Greg Kroah-HartmanFrom: Qiuyang Sun <[email protected]>
[ Upstream commit 9249dded7b5cb539a8c8698b25d08a3c15261470 ]
Should use lstart (logical start address) instead of start (in dev) here. This fixes a bug in multi-device scenarios.
--- fs/f2fs/segment.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/segment.c +1 -1
@@ -1103,7 +1103,7 @@ submit:list_move_tail (&dc->list, wait_list);/* sanity check on discard range */ -__check_sit_bitmap (sbi, start, start + len); +__check_sit_bitmap (sbi, lstart, lstart + len); bio->bi_private = dc; bio->bi_end_io = f2fs_submit_discard_endio;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 187/321 um: Include sys/uio.h to have writev()
In reply to Greg Kroah-HartmanFrom: Richard Weinberger <[email protected]>
[ Upstream commit 0053102a869f1b909904b1b85ac282e2744deaab ]
sys/uio.h gives us writev(), otherwise the build might fail on some systems.
--- arch/um/drivers/vector_user.c | 1 + 1 file changed, 1 insertion(+)
arch/um/drivers/vector_user.c +1 -0
@@ -30,6 +30,7 @@#include <stdlib.h> #include <os.h> #include <um_malloc.h> +#include <sys/uio.h> #include "vector_user.h" #define ID_GRE 0
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 188/321 um: Make GCOV depend on !KCOV
In reply to Greg Kroah-HartmanFrom: Richard Weinberger <[email protected]>
[ Upstream commit 550ed0e2036663b35cec12374b835444f9c60454 ]
Both do more or less the same thing and are mutually exclusive. If both are enabled the build will fail.
Sooner or later we can kill UML's GCOV.
--- arch/um/Kconfig.debug | 1 + 1 file changed, 1 insertion(+)
arch/um/Kconfig.debug +1 -0
@@ -16,6 +16,7 @@ config GPROF config GCOV bool "Enable gcov support" depends on DEBUG_INFO + depends on !KCOV help This option allows developers to retrieve coverage data from a UML session.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 189/321 net: (cpts) fix a missing check of clk_prepare
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit 2d822f2dbab7f4c820f72eb8570aacf3f35855bd ]
clk_prepare() could fail, so let's check its status, and if it fails, return its error code upstream.
--- drivers/net/ethernet/ti/cpts.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/ti/cpts.c +3 -1
@@ -572,7 +572,9 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,return ERR_CAST (cpts->refclk); } -clk_prepare (cpts->refclk); + ret =clk_prepare (cpts->refclk); +if (ret) +return ERR_PTR (ret); cpts->cc.read = cpts_systim_read; cpts->cc.mask =CLOCKSOURCE_MASK (32 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 190/321 net: stmicro: fix a missing check of clk_prepare
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit f86a3b83833e7cfe558ca4d70b64ebc48903efec ]
clk_prepare() could fail, so let's check its status, and if it fails, return its error code upstream.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c +3 -1
@@ -59,7 +59,9 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv) gmac->clk_enabled =1 ; }else {clk_set_rate (gmac->tx_clk,SUN7I_GMAC_MII_RATE ); -clk_prepare (gmac->tx_clk); + ret =clk_prepare (gmac->tx_clk); +if (ret) +return ret; }return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 191/321 net: dsa: bcm_sf2: Propagate error value from mdio_write
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit e49505f7255be8ced695919c08a29bf2c3d79616 ]
Both bcm_sf2_sw_indir_rw and mdiobus_write_nested could fail, so let's return their error codes upstream.
--- drivers/net/dsa/bcm_sf2.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/dsa/bcm_sf2.c +3 -4
@@ -309,11 +309,10 @@ static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,* send them to our master MDIO bus controller */ if (addr ==BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask &BIT (addr)) -bcm_sf2_sw_indir_rw (priv,0 , addr, regnum, val); +return bcm_sf2_sw_indir_rw (priv,0 , addr, regnum, val);else -mdiobus_write_nested (priv->master_mii_bus, addr, regnum, val); - -return 0 ; +return mdiobus_write_nested (priv->master_mii_bus, addr, + regnum, val); }static irqreturn_t bcm_sf2_switch_0_isr (int irq,void *dev_id)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 192/321 atl1e: checking the status of atl1e_write_phy_reg
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit ff07d48d7bc0974d4f96a85a4df14564fb09f1ef ]
atl1e_write_phy_reg() could fail. The fix issues an error message when it fails.
--- drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/atheros/atl1e/atl1e_main.c +3 -1
@@ -473,7 +473,9 @@ static void atl1e_mdio_write(struct net_device *netdev, int phy_id, {struct atl1e_adapter *adapter =netdev_priv (netdev); -atl1e_write_phy_reg (&adapter->hw, reg_num &MDIO_REG_ADDR_MASK , val); +if (atl1e_write_phy_reg (&adapter->hw, + reg_num &MDIO_REG_ADDR_MASK , val)) +netdev_err (netdev,"write phy register failed\n" ); } static int atl1e_mii_ioctl(struct net_device *netdev,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 193/321 tipc: fix a missing check of genlmsg_put
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit 46273cf7e009231d2b6bc10a926e82b8928a9fb2 ]
genlmsg_put could fail. The fix inserts a check of its return value, and if it fails, returns -EMSGSIZE.
--- net/tipc/netlink_compat.c | 2 ++ 1 file changed, 2 insertions(+)
net/tipc/netlink_compat.c +2 -0
@@ -983,6 +983,8 @@ static int tipc_nl_compat_publ_dump(struct tipc_nl_compat_msg *msg, u32 sock) hdr =genlmsg_put (args,0 ,0 , &tipc_genl_family,NLM_F_MULTI ,TIPC_NL_PUBL_GET ); +if (!hdr) +return -EMSGSIZE ; nest =nla_nest_start (args,TIPC_NLA_SOCK );if (!nest) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 194/321 net: marvell: fix a missing check of acpi_match_device
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit 92ee77d148bf06d8c52664be4d1b862583fd5c0e ]
When acpi_match_device fails, its return value is NULL. Directly using the return value without a check may result in a NULL-pointer dereference. The fix checks if acpi_match_device fails, and if so, returns -EINVAL.
--- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +2 -0
@@ -5132,6 +5132,8 @@ static int mvpp2_probe(struct platform_device *pdev)if (has_acpi_companion (&pdev->dev)) { acpi_id =acpi_match_device (pdev->dev.driver->acpi_match_table, &pdev->dev); +if (!acpi_id) +return -EINVAL ; priv->hw_version = (unsigned long )acpi_id->driver_data; }else { priv->hw_version =
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 195/321 net/wan/fsl_ucc_hdlc: Avoid double free in ucc_hdlc_probe()
In reply to Greg Kroah-HartmanFrom: Wen Yang <[email protected]>
[ Upstream commit 40752b3eae29f8ca2378e978a02bd6dbeeb06d16 ]
This patch fixes potential double frees if register_hdlc_device() fails.
--- drivers/net/wan/fsl_ucc_hdlc.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wan/fsl_ucc_hdlc.c +0 -1
@@ -1113,7 +1113,6 @@ static int ucc_hdlc_probe(struct platform_device *pdev)if (register_hdlc_device (dev)) { ret = -ENOBUFS ;pr_err ("ucc_hdlc: unable to register hdlc device\n" ); -free_netdev (dev); goto free_dev; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 196/321 ocfs2: clear journal dirty flag after shutdown journal
In reply to Greg Kroah-HartmanFrom: Junxiao Bi <[email protected]>
[ Upstream commit d85400af790dba2aa294f0a77e712f166681f977 ]
Dirty flag of the journal should be cleared at the last stage of umount, if do it before jbd2_journal_destroy(), then some metadata in uncommitted transaction could be lost due to io error, but as dirty flag of journal was already cleared, we can't find that until run a full fsck. This may cause system panic or other corruption.
--- fs/ocfs2/journal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
fs/ocfs2/journal.c +2 -4
@@ -1018,7 +1018,8 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)mlog_errno (status); } -if (status ==0 ) { +/* Shutdown the kernel journal system */ +if (!jbd2_journal_destroy (journal->j_journal) && !status) {/* * Do not toggle if flush was unsuccessful otherwise * will leave dirty metadata in a "clean" journal
@@ -1027,9 +1028,6 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)if (status <0 )mlog_errno (status); } - -/* Shutdown the kernel journal system */ -jbd2_journal_destroy (journal->j_journal); journal->j_journal =NULL ;OCFS2_I (inode)->ip_open_count--;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 197/321 vmscan: return NODE_RECLAIM_NOSCAN in node_reclaim() when CONFIG_NUMA is n
In reply to Greg Kroah-HartmanFrom: Wei Yang <[email protected]>
[ Upstream commit 8b09549c2bfd9f3f8f4cdad74107ef4f4ff9cdd7 ]
Commit fa5e084e43eb ("vmscan: do not unconditionally treat zones that fail zone_reclaim() as full") changed the return value of node_reclaim(). The original return value 0 means NODE_RECLAIM_SOME after this commit.
While the return value of node_reclaim() when CONFIG_NUMA is n is not changed. This will leads to call zone_watermark_ok() again.
This patch fixes the return value by adjusting to NODE_RECLAIM_NOSCAN. Since node_reclaim() is only called in page_alloc.c, move it to mm/internal.h.
--- include/linux/swap.h | 6 ------ mm/internal.h | 10 ++++++++++ 2 files changed, 10 insertions(+), 6 deletions(-)
include/linux/swap.h +0 -6
@@ -371,14 +371,8 @@ extern unsigned long vm_total_pages;extern int node_reclaim_mode;extern int sysctl_min_unmapped_ratio;extern int sysctl_min_slab_ratio; -extern int node_reclaim (struct pglist_data *,gfp_t ,unsigned int );#else #define node_reclaim_mode 0 -static inline int node_reclaim (struct pglist_data *pgdat,gfp_t mask, -unsigned int order) -{ -return 0 ; -}#endif extern int page_evictable (struct page *page);
mm/internal.h +10 -0
@@ -444,6 +444,16 @@ static inline void mminit_validate_memmodel_limits(unsigned long *start_pfn,#define NODE_RECLAIM_SOME 0#define NODE_RECLAIM_SUCCESS 1 +#ifdef CONFIG_NUMA +extern int node_reclaim (struct pglist_data *,gfp_t ,unsigned int ); +#else +static inline int node_reclaim (struct pglist_data *pgdat,gfp_t mask, +unsigned int order) +{ +return NODE_RECLAIM_NOSCAN ; +} +#endif +extern int hwpoison_filter (struct page *p);extern u32 hwpoison_filter_dev_major;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 172/321 drbd: reject attach of unsuitable uuids even if connected
In reply to Greg Kroah-HartmanFrom: Lars Ellenberg <[email protected]>
[ Upstream commit fe43ed97bba3b11521abd934b83ed93143470e4f ]
Multiple failure scenario:
a) all good
Connected Primary/Secondary UpToDate/UpToDate
b) lose disk on Primary,
Connected Primary/Secondary Diskless/UpToDate
c) continue to write to the device,
changes only make it to the Secondary storage.
d) lose disk on Secondary,
Connected Primary/Secondary Diskless/Diskless
e) now try to re-attach on Primary
This would have succeeded before, even though that is clearly the wrong data set to attach to (missing the modifications from c). Because we only compared our "effective" and the "to-be-attached" data generation uuid tags if (device->state.conn < C_CONNECTED).
Fix: change that constraint to (device->state.pdsk != D_UP_TO_DATE) compare the uuids, and reject the attach.
This patch also tries to improve the reverse scenario:
first lose Secondary, then Primary disk,
then try to attach the disk on Secondary.
Before this patch, the attach on the Secondary succeeds, but since commit
drbd: disconnect, if the wrong UUIDs are attached on a connected peer the Primary will notice unsuitable data, and drop the connection hard.
Though unfortunately at a point in time during the handshake where we cannot easily abort the attach on the peer without more refactoring of the handshake.
We now reject any attach to "unsuitable" uuids,
as long as we can see a Primary role,
unless we already have access to "good" data.
--- drivers/block/drbd/drbd_nl.c | 6 +++--- drivers/block/drbd/drbd_receiver.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-)
drivers/block/drbd/drbd_nl.c +3 -3
@@ -1935,9 +1935,9 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) } } -if (device->state.conn <C_CONNECTED && - device->state.role ==R_PRIMARY && device->ed_uuid && - (device->ed_uuid & ~((u64 )1 )) != (nbc->md.uuid[UI_CURRENT ] & ~((u64 )1 ))) { +if (device->state.pdsk !=D_UP_TO_DATE && device->ed_uuid && + (device->state.role ==R_PRIMARY || device->state.peer ==R_PRIMARY ) && + (device->ed_uuid & ~((u64 )1 )) != (nbc->md.uuid[UI_CURRENT ] & ~((u64 )1 ))) {drbd_err (device,"Can only attach to data with current UUID=%016llX\n" , (unsigned long long )device->ed_uuid); retcode =ERR_DATA_NOT_CURRENT ;
drivers/block/drbd/drbd_receiver.c +19 -0
@@ -4395,6 +4395,25 @@ static int receive_state(struct drbd_connection *connection, struct packet_infoif (peer_state.conn ==C_AHEAD ) ns.conn =C_BEHIND ; +/* TODO: +* if (primary and diskless and peer uuid != effective uuid) +* abort attach on peer; +* +* If this node does not have good data, was already connected, but +* the peer did a late attach only now, trying to "negotiate" with me, +* AND I am currently Primary, possibly frozen, with some specific +* "effective" uuid, this should never be reached, really, because +* we first send the uuids, then the current state. +* +* In this scenario, we already dropped the connection hard +* when we received the unsuitable uuids (receive_uuids(). +* +* Should we want to change this, that is: not drop the connection in +* receive_uuids() already, then we would need to add a branch here +* that aborts the attach of "unsuitable uuids" on the peer in case +* this node is currently Diskless Primary. +*/ +if (device->p_uuid && peer_state.disk >=D_NEGOTIATING &&get_ldev_if_state (device,D_NEGOTIATING )) {int cr;/* consider resync */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 199/321 mm/page_alloc.c: use a single function to free page
In reply to Greg Kroah-HartmanFrom: Aaron Lu <[email protected]>
[ Upstream commit 742aa7fb52c56fb3b307e704f93e67b698959cc2 ]
There are multiple places of freeing a page, they all do the same things so a common function can be used to reduce code duplicate.
It also avoids bug fixed in one function but left in another.
--- mm/page_alloc.c | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-)
mm/page_alloc.c +14 -23
@@ -4451,16 +4451,19 @@ unsigned long get_zeroed_page(gfp_t gfp_mask) }EXPORT_SYMBOL (get_zeroed_page); -void __free_pages (struct page *page,unsigned int order) +static inline void free_the_page (struct page *page,unsigned int order) { -if (put_page_testzero (page)) { -if (order ==0 ) -free_unref_page (page); -else -__free_pages_ok (page, order); - } +if (order ==0 )/* Via pcp? */ +free_unref_page (page); +else +__free_pages_ok (page, order); } +void __free_pages (struct page *page,unsigned int order) +{ +if (put_page_testzero (page)) +free_the_page (page, order); +}EXPORT_SYMBOL (__free_pages);void free_pages (unsigned long addr,unsigned int order)
@@ -4509,14 +4512,8 @@ void __page_frag_cache_drain(struct page *page, unsigned int count) {VM_BUG_ON_PAGE (page_ref_count (page) ==0 , page); -if (page_ref_sub_and_test (page, count)) { -unsigned int order =compound_order (page); - -if (order ==0 ) -free_unref_page (page); -else -__free_pages_ok (page, order); - } +if (page_ref_sub_and_test (page, count)) +free_the_page (page,compound_order (page)); }EXPORT_SYMBOL (__page_frag_cache_drain);
@@ -4581,14 +4578,8 @@ void page_frag_free(void *addr) {struct page *page =virt_to_head_page (addr); -if (unlikely (put_page_testzero (page))) { -unsigned int order =compound_order (page); - -if (order ==0 )/* Via pcp? */ -free_unref_page (page); -else -__free_pages_ok (page, order); - } +if (unlikely (put_page_testzero (page))) +free_the_page (page,compound_order (page)); }EXPORT_SYMBOL (page_frag_free);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 200/321 mm/page_alloc.c: deduplicate __memblock_free_early() and memblock_free()
In reply to Greg Kroah-HartmanFrom: Wentao Wang <[email protected]>
[ Upstream commit d31cfe7bff9109476da92c245b56083e9b48d60a ]
--- mm/memblock.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
mm/memblock.c +1 -6
@@ -1537,12 +1537,7 @@ void * __init memblock_virt_alloc_try_nid(*/ void __init __memblock_free_early (phys_addr_t base,phys_addr_t size) { -phys_addr_t end = base + size -1 ; - -memblock_dbg ("%s: [%pa-%pa] %pF\n" , - __func__, &base, &end, (void *)_RET_IP_); -kmemleak_free_part_phys (base, size); -memblock_remove_range (&memblock.reserved, base, size); +memblock_free (base, size); }/**
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 201/321 tools/vm/page-types.c: fix "kpagecount returned fewer pages than expected" failures
In reply to Greg Kroah-HartmanFrom: Anthony Yznaga <[email protected]>
[ Upstream commit b6fb87b8e3ff1ef6bcf68470f24a97c984554d5a ]
Because kpagecount_read() fakes success if map counts are not being collected, clamp the page count passed to it by walk_pfn() to the pages value returned by the preceding call to kpageflags_read().
--- tools/vm/page-types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/vm/page-types.c +1 -1
@@ -701,7 +701,7 @@ static void walk_pfn(unsigned long voffset,if (kpagecgroup_read (cgi, index, pages) != pages)fatal ("kpagecgroup returned fewer pages than expected" ); -if (kpagecount_read (cnt, index, batch) != pages) +if (kpagecount_read (cnt, index, pages) != pages)fatal ("kpagecount returned fewer pages than expected" );for (i =0 ; i < pages; i++)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 202/321 netfilter: nf_tables: fix a missing check of nla_put_failure
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit eb8950861c1bfd3eecc8f6faad213e3bca0dc395 ]
If nla_nest_start() may fail. The fix checks its return value and goes to nla_put_failure if it fails.
--- net/netfilter/nf_tables_api.c | 2 ++ 1 file changed, 2 insertions(+)
net/netfilter/nf_tables_api.c +2 -0
@@ -5737,6 +5737,8 @@ static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net, goto nla_put_failure; nest =nla_nest_start (skb,NFTA_FLOWTABLE_HOOK ); +if (!nest) + goto nla_put_failure;if (nla_put_be32 (skb,NFTA_FLOWTABLE_HOOK_NUM ,htonl (flowtable->hooknum)) ||nla_put_be32 (skb,NFTA_FLOWTABLE_HOOK_PRIORITY ,htonl (flowtable->priority))) goto nla_put_failure;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 204/321 infiniband: bnxt_re: qplib: Check the return value of send_message
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 94edd87a1c59f3efa6fdf4e98d6d492e6cec6173 ]
In bnxt_qplib_map_tc2cos(), bnxt_qplib_rcfw_send_message() can return an error value but it is lost. Propagate this error to the callers.
--- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_sp.c +2 -3
@@ -775,9 +775,8 @@ int bnxt_qplib_map_tc2cos(struct bnxt_qplib_res *res, u16 *cids) req.cos0 =cpu_to_le16 (cids[0 ]); req.cos1 =cpu_to_le16 (cids[1 ]); -bnxt_qplib_rcfw_send_message (rcfw, (void *)&req, (void *)&resp,NULL , -0 ); -return 0 ; +return bnxt_qplib_rcfw_send_message (rcfw, (void *)&req, (void *)&resp, +NULL ,0 ); } int bnxt_qplib_get_roce_stats(struct bnxt_qplib_rcfw *rcfw,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 205/321 infiniband/qedr: Potential null ptr dereference of qp
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 9c6260de505b63638dd86fcc33849b17f6146d94 ]
idr_find() may fail and return a NULL pointer. The fix checks the return value of the function and returns an error in case of NULL.
--- drivers/infiniband/hw/qedr/qedr_iw_cm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/qedr/qedr_iw_cm.c +2 -0
@@ -492,6 +492,8 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)int i; qp =idr_find (&dev->qpidr.idr, conn_param->qpn); +if (unlikely (!qp)) +return -EINVAL ; laddr = (struct sockaddr_in *)&cm_id->m_local_addr; raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 206/321 firmware: arm_sdei: fix wrong of_node_put() in init function
In reply to Greg Kroah-HartmanFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit c3790b3799f8d75d93d26f6fd7bb569fc8c8b0cb ]
After finding a "firmware" dt node arm_sdei tries to match it's compatible string with it. To do so it's calling of_find_matching_node() which already takes care of decreasing the refcount on the "firmware" node. We are then incorrectly decreasing the refcount on that node again.
This patch removes the unwarranted call to of_node_put().
--- drivers/firmware/arm_sdei.c | 1 - 1 file changed, 1 deletion(-)
drivers/firmware/arm_sdei.c +0 -1
@@ -1017,7 +1017,6 @@ static bool __init sdei_present_dt(void)return false; np =of_find_matching_node (fw_np, sdei_of_match); -of_node_put (fw_np);if (!np)return false;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 207/321 firmware: arm_sdei: Fix DT platform device creation
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
[ Upstream commit acafce48b07bf5f9994a38e7fe237193d43d092e ]
It turns out the dt-probing part of this wasn't tested properly after it was merged. commit 3aa0582fdb82 ("of: platform: populate /firmware/ node from of_platform_default_populate_init()") changed the core-code to generate the platform devices, meaning the driver's attempt fails, and it bails out.
Fix this by removing the manual platform-device creation for DT systems, core code has always done this for us.
--- drivers/firmware/arm_sdei.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/firmware/arm_sdei.c +0 -5
@@ -1009,7 +1009,6 @@ static struct platform_driver sdei_driver = {static bool __init sdei_present_dt (void ) { -struct platform_device *pdev;struct device_node *np, *fw_np; fw_np =of_find_node_by_name (NULL ,"firmware" );
@@ -1019,11 +1018,7 @@ static bool __init sdei_present_dt(void) np =of_find_matching_node (fw_np, sdei_of_match);if (!np)return false; - - pdev =of_platform_device_create (np, sdei_driver.driver.name,NULL );of_node_put (np); -if (!pdev) -return false;return true; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 208/321 lib/genalloc.c: fix allocation of aligned buffer from non-aligned chunk
In reply to Greg Kroah-HartmanFrom: Alexey Skidanov <[email protected]>
[ Upstream commit 52fbf1134d479234d7e64ba9dcbaea23405f229e ]
gen_pool_alloc_algo() uses different allocation functions implementing different allocation algorithms. With gen_pool_first_fit_align() allocation function, the returned address should be aligned on the requested boundary.
If chunk start address isn't aligned on the requested boundary, the returned address isn't aligned too. The only way to get properly aligned address is to initialize the pool with chunks aligned on the requested boundary. If want to have an ability to allocate buffers aligned on different boundaries (for example, 4K, 1MB, ...), the chunk start address should be aligned on the max possible alignment.
This happens because gen_pool_first_fit_align() looks for properly aligned memory block without taking into account the chunk start address alignment.
To fix this, we provide chunk start address to gen_pool_first_fit_align() and change its implementation such that it starts looking for properly aligned block with appropriate offset (exactly as is done in CMA).
--- include/linux/genalloc.h | 13 +++++++------ lib/genalloc.c | 20 ++++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-)
include/linux/genalloc.h +7 -6
@@ -51,7 +51,8 @@ typedef unsigned long (*genpool_algo_t)(unsigned long *map,unsigned long size, unsigned long start, unsigned int nr, - void *data, struct gen_pool *pool); + void *data, struct gen_pool *pool, + unsigned long start_addr);/* * General purpose special memory pool descriptor.
@@ -131,24 +132,24 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,extern unsigned long gen_pool_first_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool); +struct gen_pool *pool,unsigned long start_addr);extern unsigned long gen_pool_fixed_alloc (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr, -void *data,struct gen_pool *pool); +void *data,struct gen_pool *pool,unsigned long start_addr);extern unsigned long gen_pool_first_fit_align (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr, -void *data,struct gen_pool *pool); +void *data,struct gen_pool *pool,unsigned long start_addr);extern unsigned long gen_pool_first_fit_order_align (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr, -void *data,struct gen_pool *pool); +void *data,struct gen_pool *pool,unsigned long start_addr);extern unsigned long gen_pool_best_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool); +struct gen_pool *pool,unsigned long start_addr); extern struct gen_pool *devm_gen_pool_create(struct device *dev,
lib/genalloc.c +12 -8
@@ -311,7 +311,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size, end_bit =chunk_size (chunk) >> order; retry: start_bit =algo (chunk->bits, end_bit, start_bit, - nbits, data, pool); + nbits, data, pool, chunk->start_addr);if (start_bit >= end_bit)continue ; remain =bitmap_set_ll (chunk->bits, start_bit, nbits);
@@ -525,7 +525,7 @@ EXPORT_SYMBOL(gen_pool_set_algo);*/ unsigned long gen_pool_first_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool) +struct gen_pool *pool,unsigned long start_addr) {return bitmap_find_next_zero_area (map, size, start, nr,0 ); }
@@ -543,16 +543,19 @@ EXPORT_SYMBOL(gen_pool_first_fit);*/ unsigned long gen_pool_first_fit_align (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool) +struct gen_pool *pool,unsigned long start_addr) {struct genpool_data_align *alignment; -unsigned long align_mask; +unsigned long align_mask, align_off;int order; alignment = data; order = pool->min_alloc_order; align_mask = ((alignment->align + (1UL << order) -1 ) >> order) -1 ; -return bitmap_find_next_zero_area (map, size, start, nr, align_mask); + align_off = (start_addr & (alignment->align -1 )) >> order; + +return bitmap_find_next_zero_area_off (map, size, start, nr, + align_mask, align_off); }EXPORT_SYMBOL (gen_pool_first_fit_align);
@@ -567,7 +570,7 @@ EXPORT_SYMBOL(gen_pool_first_fit_align);*/ unsigned long gen_pool_fixed_alloc (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool) +struct gen_pool *pool,unsigned long start_addr) {struct genpool_data_fixed *fixed_data;int order;
@@ -601,7 +604,8 @@ EXPORT_SYMBOL(gen_pool_fixed_alloc);*/ unsigned long gen_pool_first_fit_order_align (unsigned long *map,unsigned long size,unsigned long start, -unsigned int nr,void *data,struct gen_pool *pool) +unsigned int nr,void *data,struct gen_pool *pool, +unsigned long start_addr) {unsigned long align_mask =roundup_pow_of_two (nr) -1 ;
@@ -624,7 +628,7 @@ EXPORT_SYMBOL(gen_pool_first_fit_order_align);*/ unsigned long gen_pool_best_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, -struct gen_pool *pool) +struct gen_pool *pool,unsigned long start_addr) {unsigned long start_bit = size;unsigned long len = size +1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 173/321 drbd: do not block when adjusting "disk-options" while IO is frozen
In reply to Greg Kroah-HartmanFrom: Lars Ellenberg <[email protected]>
[ Upstream commit f708bd08ecbdc23d03aaedf5b3311ebe44cfdb50 ]
"suspending" IO is overloaded.
It can mean "do not allow new requests" (obviously), but it also may mean "must not complete pending IO", for example while the fencing handlers do their arbitration.
When adjusting disk options, we suspend io (disallow new requests), then wait for the activity-log to become unused (drain all IO completions), and possibly replace it with a new activity log of different size.
If the other "suspend IO" aspect is active, pending IO completions won't happen, and we would block forever (unkillable drbdsetup process).
Fix this by skipping the activity log adjustment if the "al-extents" setting did not change. Also, in case it did change, fail early without blocking if it looks like we would block forever.
--- drivers/block/drbd/drbd_nl.c | 37 ++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)
drivers/block/drbd/drbd_nl.c +29 -8
@@ -1515,6 +1515,30 @@ static void sanitize_disk_conf(struct drbd_device *device, struct disk_conf *dis } } +static int disk_opts_check_al_size (struct drbd_device *device,struct disk_conf *dc) +{ +int err = -EBUSY ; + +if (device->act_log && + device->act_log->nr_elements == dc->al_extents) +return 0 ; + +drbd_suspend_io (device); +/* If IO completion is currently blocked, we would likely wait +* "forever" for the activity log to become unused. So we don't. */ +if (atomic_read (&device->ap_bio_cnt)) + goto out; + +wait_event (device->al_wait,lc_try_lock (device->act_log)); +drbd_al_shrink (device); + err =drbd_check_al_size (device, dc); +lc_unlock (device->act_log); +wake_up (&device->al_wait); +out: +drbd_resume_io (device); +return err; +} +int drbd_adm_disk_opts (struct sk_buff *skb,struct genl_info *info) {struct drbd_config_context adm_ctx;
@@ -1577,15 +1601,12 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) } } -drbd_suspend_io (device); -wait_event (device->al_wait,lc_try_lock (device->act_log)); -drbd_al_shrink (device); - err =drbd_check_al_size (device, new_disk_conf); -lc_unlock (device->act_log); -wake_up (&device->al_wait); -drbd_resume_io (device); - + err =disk_opts_check_al_size (device, new_disk_conf);if (err) { +/* Could be just "busy". Ignore? +* Introduce dedicated error code? */ +drbd_msg_put_info (adm_ctx.reply_skb, +"Try again without changing current al-extents setting" ); retcode =ERR_NOMEM ; goto fail_unlock; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 210/321 fork: fix some -Wmissing-prototypes warnings
In reply to Greg Kroah-HartmanFrom: Yi Wang <[email protected]>
[ Upstream commit fb5bf31722d0805a3f394f7d59f2e8cd07acccb7 ]
We get a warning when building kernel with W=1:
kernel/fork.c:167:13: warning: no previous prototype for arch_release_thread_stack' [-Wmissing-prototypes] kernel/fork.c:779:13: warning: no previous prototype for fork_init' [-Wmissing-prototypes]
Add the missing declaration in head file to fix this.
Also, remove arch_release_thread_stack() completely because no arch seems to implement it since bb9d81264 (arch: remove tile port).
--- include/linux/sched/task.h | 2 ++ init/main.c | 1 - kernel/fork.c | 5 ----- 3 files changed, 2 insertions(+), 6 deletions(-)
include/linux/sched/task.h +2 -0
@@ -39,6 +39,8 @@ void __noreturn do_task_dead(void);extern void proc_caches_init (void ); +extern void fork_init (void ); +extern void release_task (struct task_struct * p);#ifdef CONFIG_HAVE_COPY_THREAD_TLS
init/main.c +0 -1
@@ -105,7 +105,6 @@static int kernel_init (void *);extern void init_IRQ (void ); -extern void fork_init (void );extern void radix_tree_init (void );/*
kernel/fork.c +0 -5
@@ -163,10 +163,6 @@ static inline void free_task_struct(struct task_struct *tsk) }#endif -void __weak arch_release_thread_stack (unsigned long *stack) -{ -} -#ifndef CONFIG_ARCH_THREAD_STACK_ALLOCATOR /*
@@ -376,7 +372,6 @@ static void release_task_stack(struct task_struct *tsk)return ;/* Better to leak the stack than to free prematurely */ account_kernel_stack (tsk,-1 ); -arch_release_thread_stack (tsk->stack);free_thread_stack (tsk); tsk->stack =NULL ;#ifdef CONFIG_VMAP_STACK
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 209/321 lib/genalloc.c: use vzalloc_node() to allocate the bitmap
In reply to Greg Kroah-HartmanFrom: Huang Shijie <[email protected]>
[ Upstream commit 6862d2fc81859f88c1f3f660886427893f2b4f3f ]
Some devices may have big memory on chip, such as over 1G. In some cases, the nbytes maybe bigger then 4M which is the bounday of the memory buddy system (4K default).
So use vzalloc_node() to allocate the bitmap. Also use vfree to free it.
--- lib/genalloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
lib/genalloc.c +2 -2
@@ -187,7 +187,7 @@ int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phyint nbytes =sizeof (struct gen_pool_chunk ) +BITS_TO_LONGS (nbits) *sizeof (long ); - chunk =kzalloc_node (nbytes,GFP_KERNEL , nid); + chunk =vzalloc_node (nbytes, nid);if (unlikely (chunk ==NULL ))return -ENOMEM ;
@@ -251,7 +251,7 @@ void gen_pool_destroy(struct gen_pool *pool) bit =find_next_bit (chunk->bits, end_bit,0 );BUG_ON (bit < end_bit); -kfree (chunk); +vfree (chunk); }kfree_const (pool->name);kfree (pool);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 174/321 drbd: fix print_st_err()s prototype to match the definition
In reply to Greg Kroah-HartmanFrom: Luc Van Oostenryck <[email protected]>
[ Upstream commit 2c38f035117331eb78d0504843c79ea7c7fabf37 ]
print_st_err() is defined with its 4th argument taking an 'enum drbd_state_rv' but its prototype use an int for it.
Fix this by using 'enum drbd_state_rv' in the prototype too.
--- drivers/block/drbd/drbd_state.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/drbd/drbd_state.h +1 -1
@@ -131,7 +131,7 @@ extern enum drbd_state_rv _drbd_set_state(struct drbd_device *, union drbd_state enum chg_state_flags, struct completion *done);extern void print_st_err (struct drbd_device *,union drbd_state , -union drbd_state ,int ); +union drbd_state ,enum drbd_state_rv ); enum drbd_state_rv _conn_request_state(struct drbd_connection *connection, union drbd_state mask, union drbd_state val,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 175/321 IB/rxe: Make counters thread safe
In reply to Greg Kroah-HartmanFrom: Parav Pandit <[email protected]>
[ Upstream commit d5108e69fe013ff47ab815b849caba9cc33ca1e5 ]
Current rxe device counters are not thread safe. When multiple QPs are used, they can be racy. Make them thread safe by making it atomic64.
--- drivers/infiniband/sw/rxe/rxe_hw_counters.c | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/infiniband/sw/rxe/rxe_hw_counters.c +1 -1
@@ -59,7 +59,7 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev,return -EINVAL ;for (cnt =0 ; cnt <ARRAY_SIZE (rxe_counter_name); cnt++) - stats->value[cnt] = dev->stats_counters[cnt]; + stats->value[cnt] =atomic64_read (&dev->stats_counters[cnt]);return ARRAY_SIZE (rxe_counter_name); }
drivers/infiniband/sw/rxe/rxe_verbs.h +3 -3
@@ -409,16 +409,16 @@ struct rxe_dev {spinlock_t mmap_offset_lock;/* guard mmap_offset */ int mmap_offset; -u64 stats_counters[RXE_NUM_OF_COUNTERS ]; +atomic64_t stats_counters[RXE_NUM_OF_COUNTERS ];struct rxe_port port;struct list_head list;struct crypto_shash *tfm; }; -static inline void rxe_counter_inc (struct rxe_dev *rxe,enum rxe_counters cnt) +static inline void rxe_counter_inc (struct rxe_dev *rxe,enum rxe_counters index) { - rxe->stats_counters[cnt]++; +atomic64_inc (&rxe->stats_counters[index]); }static inline struct rxe_dev *to_rdev (struct ib_device *dev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 177/321 regulator: tps65910: fix a missing check of return value
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit cd07e3701fa6a4c68f8493ee1d12caa18d46ec6a ]
tps65910_reg_set_bits() may fail. The fix checks if it fails, and if so, returns with its error code.
--- drivers/regulator/tps65910-regulator.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/regulator/tps65910-regulator.c +3 -1
@@ -1102,8 +1102,10 @@ static int tps65910_probe(struct platform_device *pdev)platform_set_drvdata (pdev, pmic);/* Give control of all register to control port */ -tps65910_reg_set_bits (pmic->mfd,TPS65910_DEVCTRL , + err =tps65910_reg_set_bits (pmic->mfd,TPS65910_DEVCTRL ,DEVCTRL_SR_CTL_I2C_SEL_MASK ); +if (err <0 ) +return err;switch (tps65910_chip_id (tps65910)) {case TPS65910 :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 169/321 vfio/spapr_tce: Get rid of possible infinite loop
In reply to Greg Kroah-HartmanFrom: Alexey Kardashevskiy <[email protected]>
[ Upstream commit 517ad4ae8aa93dccdb9a88c27257ecb421c9e848 ]
As a part of cleanup, the SPAPR TCE IOMMU subdriver releases preregistered memory. If there is a bug in memory release, the loop in tce_iommu_release() becomes infinite; this actually happened to me.
This makes the loop finite and prints a warning on every failure to make the code more bug prone.
--- drivers/vfio/vfio_iommu_spapr_tce.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/vfio/vfio_iommu_spapr_tce.c +3 -7
@@ -371,6 +371,7 @@ static void tce_iommu_release(void *iommu_data) {struct tce_container *container = iommu_data;struct tce_iommu_group *tcegrp; +struct tce_iommu_prereg *tcemem, *tmtmp;long i;while (tce_groups_attached (container)) {
@@ -393,13 +394,8 @@ static void tce_iommu_release(void *iommu_data)tce_iommu_free_table (container, tbl); } -while (!list_empty (&container->prereg_list)) { -struct tce_iommu_prereg *tcemem; - - tcemem =list_first_entry (&container->prereg_list, - struct tce_iommu_prereg, next); -WARN_ON_ONCE (tce_iommu_prereg_free (container, tcemem)); - } +list_for_each_entry_safe (tcemem, tmtmp, &container->prereg_list, next) +WARN_ON (tce_iommu_prereg_free (container, tcemem));tce_iommu_disable (container);if (container->mm)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 178/321 powerpc/83xx: handle machine check caused by watchdog timer
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit 0deae39cec6dab3a66794f3e9e83ca4dc30080f1 ]
When the watchdog timer is set in interrupt mode, it causes a machine check when it times out. The purpose of this mode is to ease debugging, not to crash the kernel and reboot the machine.
This patch implements a special handling for that, in order to not crash the kernel if the watchdog times out while in interrupt or within the idle task.
--- arch/powerpc/include/asm/cputable.h | 1 + arch/powerpc/include/asm/reg.h | 2 ++ arch/powerpc/kernel/cputable.c | 10 ++++++---- arch/powerpc/platforms/83xx/misc.c | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-)
arch/powerpc/include/asm/cputable.h +1 -0
@@ -44,6 +44,7 @@ extern int machine_check_e500(struct pt_regs *regs);extern int machine_check_e200 (struct pt_regs *regs);extern int machine_check_47x (struct pt_regs *regs);int machine_check_8xx (struct pt_regs *regs); +int machine_check_83xx (struct pt_regs *regs);extern void cpu_down_flush_e500v2 (void );extern void cpu_down_flush_e500mc (void );
arch/powerpc/include/asm/reg.h +2 -0
@@ -768,6 +768,8 @@#define SRR1_PROGTRAP 0x00020000/* Trap */ #define SRR1_PROGADDR 0x00010000/* SRR0 contains subsequent addr */ +#define SRR1_MCE_MCP 0x00080000/* Machine check signal caused interrupt */ +#define SPRN_HSRR0 0x13A/* Save/Restore Register 0 */ #define SPRN_HSRR1 0x13B/* Save/Restore Register 1 */ #define HSRR1_DENORM 0x00100000/* Denorm exception */
arch/powerpc/kernel/cputable.c +6 -4
@@ -1141,6 +1141,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .machine_check = machine_check_generic, .platform = "ppc603", }, +#ifdef CONFIG_PPC_83xx {/* e300c1 (a 603e core, plus some) on 83xx */ .pvr_mask = 0x7fff0000, .pvr_value = 0x00830000,
@@ -1151,7 +1152,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .platform = "ppc603", }, {/* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
@@ -1165,7 +1166,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .platform = "ppc603", }, {/* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
@@ -1179,7 +1180,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .num_pmcs = 4, .oprofile_cpu_type = "ppc/e300", .oprofile_type = PPC_OPROFILE_FSL_EMB,
@@ -1196,12 +1197,13 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .num_pmcs = 4, .oprofile_cpu_type = "ppc/e300", .oprofile_type = PPC_OPROFILE_FSL_EMB, .platform = "ppc603", }, +#endif {/* default match, we assume split I/D cache & TB (non-601)... */ .pvr_mask = 0x00000000, .pvr_value = 0x00000000,
arch/powerpc/platforms/83xx/misc.c +17 -0
@@ -14,6 +14,7 @@#include <linux/of_platform.h> #include <linux/pci.h> +#include <asm/debug.h> #include <asm/io.h> #include <asm/hw_irq.h> #include <asm/ipic.h>
@@ -150,3 +151,19 @@ void __init mpc83xx_setup_arch(void)mpc83xx_setup_pci (); } + +int machine_check_83xx (struct pt_regs *regs) +{ +u32 mask =1 << (31 -IPIC_MCP_WDT ); + +if (!(regs->msr &SRR1_MCE_MCP ) || !(ipic_get_mcp_status () & mask)) +return machine_check_generic (regs); +ipic_clear_mcp_status (mask); + +if (debugger_fault_handler (regs)) +return 1 ; + +die ("Watchdog NMI Reset" , regs,0 ); + +return 1 ; +}
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 212/321 lib/genalloc.c: include vmalloc.h
In reply to Greg Kroah-HartmanFrom: Olof Johansson <[email protected]>
[ Upstream commit 35004f2e55807a1a1491db24ab512dd2f770a130 ]
Fixes build break on most ARM/ARM64 defconfigs:
lib/genalloc.c: In function 'gen_pool_add_virt':
lib/genalloc.c:190:10: error: implicit declaration of function 'vzalloc_node'; did you mean 'kzalloc_node'? lib/genalloc.c:190:8: warning: assignment to 'struct gen_pool_chunk *' from 'int' makes pointer from integer without a cast [-Wint-conversion] lib/genalloc.c: In function 'gen_pool_destroy':
lib/genalloc.c:254:3: error: implicit declaration of function 'vfree'; did you mean 'kfree'?
--- lib/genalloc.c | 1 + 1 file changed, 1 insertion(+)
lib/genalloc.c +1 -0
@@ -35,6 +35,7 @@#include <linux/interrupt.h> #include <linux/genalloc.h> #include <linux/of_device.h> +#include <linux/vmalloc.h> static inline size_t chunk_size (const struct gen_pool_chunk *chunk) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 222/321 ip_tunnel: Make none-tunnel-dst tunnel port work with lwtunnel
In reply to Greg Kroah-HartmanFrom: wenxu <[email protected]>
[ Upstream commit d71b57532d70c03f4671dd04e84157ac6bf021b0 ]
ip l add dev tun type gretap key 1000
ip a a dev tun 10.0.0.1/24
Packets with tun-id 1000 can be recived by tun dev. But packet can't be sent through dev tun for non-tunnel-dst
With this patch: tunnel-dst can be get through lwtunnel like beflow:
ip r a 10.0.0.7 encap ip dst 172.168.0.11 dev tun
--- net/ipv4/ip_tunnel.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/ipv4/ip_tunnel.c +7 -1
@@ -644,13 +644,19 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, dst = tnl_params->daddr;if (dst ==0 ) {/* NBMA tunnel */ +struct ip_tunnel_info *tun_info;if (!skb_dst (skb)) { dev->stats.tx_fifo_errors++; goto tx_error; } -if (skb->protocol ==htons (ETH_P_IP )) { + tun_info =skb_tunnel_info (skb); +if (tun_info && (tun_info->mode &IP_TUNNEL_INFO_TX ) && +ip_tunnel_info_af (tun_info) ==AF_INET && + tun_info->key.u.ipv4.dst) + dst = tun_info->key.u.ipv4.dst; +else if (skb->protocol ==htons (ETH_P_IP )) { rt =skb_rtable (skb); dst =rt_nexthop (rt, inner_iph->daddr); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 223/321 decnet: fix DN_IFREQ_SIZE
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit 50c2936634bcb1db78a8ca63249236810c11a80f ]
Digging through the ioctls with Al because of the previous patches, we found that on 64-bit decnet's dn_dev_ioctl() is wrong, because struct ifreq::ifr_ifru is actually 24 bytes (not 16 as expected from struct sockaddr) due to the ifru_map and ifru_settings members.
Clearly, decnet expects the ioctl to be called with a struct like
struct ifreq_dn {
char ifr_name[IFNAMSIZ];
struct sockaddr_dn ifr_addr;};
since it does
struct ifreq *ifr = ...;
struct sockaddr_dn *sdn = (struct sockaddr_dn *)&ifr->ifr_addr;
This means that DN_IFREQ_SIZE is too big for what it wants on 64-bit, as it is
sizeof(struct ifreq) - sizeof(struct sockaddr) + sizeof(struct sockaddr_dn)
This assumes that sizeof(struct sockaddr) is the size of ifr_ifru but that isn't true.
Fix this to use offsetof(struct ifreq, ifr_ifru).
This indeed doesn't really matter much - the result is that we copy in/out 8 bytes more than we should on 64-bit platforms. In case the "struct ifreq_dn" lands just on the end of a page though it might lead to faults.
As far as I can tell, it has been like this forever, so it seems very likely that nobody cares.
--- net/decnet/dn_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/decnet/dn_dev.c +1 -1
@@ -56,7 +56,7 @@#include <net/dn_neigh.h> #include <net/dn_fib.h> -#define DN_IFREQ_SIZE (sizeof(struct ifreq) - sizeof(struct sockaddr) + sizeof(struct sockaddr_dn)) +#define DN_IFREQ_SIZE (offsetof(struct ifreq, ifr_ifru) + sizeof(struct sockaddr_dn))static char dn_rt_all_end_mcast[ETH_ALEN ] = {0xAB ,0x00 ,0x00 ,0x04 ,0x00 ,0x00 };static char dn_rt_all_rt_mcast[ETH_ALEN ] = {0xAB ,0x00 ,0x00 ,0x03 ,0x00 ,0x00 };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 225/321 net/smc: dont wait for send buffer space when data was already sent
In reply to Greg Kroah-HartmanFrom: Karsten Graul <[email protected]>
[ Upstream commit 6889b36da78a21a312d8b462c1fa25a03c2ff192 ]
When there is no more send buffer space and at least 1 byte was already sent then return to user space. The wait is only done when no data was sent by the sendmsg() call.
This fixes smc_tx_sendmsg() which tried to always send all user data and started to wait for free send buffer space when needed. During this wait the user space program was blocked in the sendmsg() call and hence not able to receive incoming data. When both sides were in such a situation then the connection stalled forever.
--- net/smc/smc_tx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/smc/smc_tx.c +3 -4
@@ -163,12 +163,11 @@ int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len) conn->local_tx_ctrl.prod_flags.urg_data_pending =1 ;if (!atomic_read (&conn->sndbuf_space) || conn->urg_tx_pend) { +if (send_done) +return send_done; rc =smc_tx_wait (smc, msg->msg_flags); -if (rc) { -if (send_done) -return send_done; +if (rc) goto out_err; - }continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 227/321 xfs: end sync buffer I/O properly on shutdown error
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
[ Upstream commit 465fa17f4a303d9fdff9eac4d45f91ece92e96ca ]
As of commit e339dd8d8b ("xfs: use sync buffer I/O for sync delwri queue submission"), the delwri submission code uses sync buffer I/O for sync delwri I/O. Instead of waiting on async I/O to unlock the buffer, it uses the underlying sync I/O completion mechanism.
If delwri buffer submission fails due to a shutdown scenario, an error is set on the buffer and buffer completion never occurs. This can cause xfs_buf_delwri_submit() to deadlock waiting on a completion event.
We could check the error state before waiting on such buffers, but that doesn't serialize against the case of an error set via a racing I/O completion. Instead, invoke I/O completion in the shutdown case regardless of buffer I/O type.
--- fs/xfs/xfs_buf.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/xfs/xfs_buf.c +1 -2
@@ -1506,8 +1506,7 @@ __xfs_buf_submit(xfs_buf_ioerror (bp, -EIO ); bp->b_flags &= ~XBF_DONE ;xfs_buf_stale (bp); -if (bp->b_flags &XBF_ASYNC ) -xfs_buf_ioend (bp); +xfs_buf_ioend (bp);return -EIO ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 228/321 net/smc: fix sender_free computation
In reply to Greg Kroah-HartmanFrom: Ursula Braun <[email protected]>
[ Upstream commit b8649efad879c69c7ab1f19ce8814fcabef1f72b ]
In some scenarios a separate consumer cursor update is necessary. The decision is made in smc_tx_consumer_cursor_update(). The sender_free computation could be wrong:
The rx confirmed cursor is always smaller than or equal to the rx producer cursor. The parameters in the smc_curs_diff() call have to be exchanged, otherwise sender_free might even be negative.
And if more data arrives local_rx_ctrl.prod might be updated, enabling a cursor difference between local_rx_ctrl.prod and rx confirmed cursor larger than the RMB size. This case is not covered by smc_curs_diff(). Thus function smc_curs_diff_large() is introduced here.
If a recvmsg() is processed in parallel, local_tx_ctrl.cons might change during smc_cdc_msg_send. Make sure rx_curs_confirmed is updated with the actually sent local_tx_ctrl.cons value.
--- net/smc/smc_cdc.c | 5 +++-- net/smc/smc_cdc.h | 26 +++++++++++++++++++++++++- net/smc/smc_tx.c | 3 ++- 3 files changed, 30 insertions(+), 4 deletions(-)
net/smc/smc_cdc.c +3 -2
@@ -96,6 +96,7 @@ int smc_cdc_msg_send(struct smc_connection *conn,struct smc_wr_buf *wr_buf, struct smc_cdc_tx_pend *pend) { + union smc_host_cursor cfed;struct smc_link *link;int rc;
@@ -107,10 +108,10 @@ int smc_cdc_msg_send(struct smc_connection *conn, conn->local_tx_ctrl.seqno = conn->tx_cdc_seq;smc_host_msg_to_cdc ((struct smc_cdc_msg *)wr_buf, &conn->local_tx_ctrl, conn); +smc_curs_copy (&cfed, &((struct smc_host_cdc_msg *)wr_buf)->cons, conn); rc =smc_wr_tx_send (link, (struct smc_wr_tx_pend_priv *)pend);if (!rc) -smc_curs_copy (&conn->rx_curs_confirmed, - &conn->local_tx_ctrl.cons, conn); +smc_curs_copy (&conn->rx_curs_confirmed, &cfed, conn);return rc; }
net/smc/smc_cdc.h +25 -1
@@ -135,7 +135,9 @@ static inline void smc_curs_copy_net(union smc_cdc_cursor *tgt,#endif } -/* calculate cursor difference between old and new, where old <= new */ +/* calculate cursor difference between old and new, where old <= new and +* difference cannot exceed size +*/ static inline int smc_curs_diff (unsigned int size,union smc_host_cursor *old,union smc_host_cursor *new)
@@ -160,6 +162,28 @@ static inline int smc_curs_comp(unsigned int size,return smc_curs_diff (size, old, new); } +/* calculate cursor difference between old and new, where old <= new and +* difference may exceed size +*/ +static inline int smc_curs_diff_large (unsigned int size, +union smc_host_cursor *old, +union smc_host_cursor *new) +{ +if (old->wrap < new->wrap) +return min_t (int, + (size - old->count) + new->count + + (new->wrap - old->wrap -1 ) * size, + size); + +if (old->wrap > new->wrap)/* wrap has switched from 0xffff to 0x0000 */ +return min_t (int, + (size - old->count) + new->count + + (new->wrap +0xffff - old->wrap) * size, + size); + +return max_t (int,0 , (new->count - old->count)); +} +static inline void smc_host_cursor_to_cdc (union smc_cdc_cursor *peer,union smc_host_cursor *local,struct smc_connection *conn)
net/smc/smc_tx.c +2 -1
@@ -595,7 +595,8 @@ void smc_tx_consumer_update(struct smc_connection *conn, bool force)if (to_confirm > conn->rmbe_update_limit) {smc_curs_copy (&prod, &conn->local_rx_ctrl.prod, conn); sender_free = conn->rmb_desc->len - -smc_curs_diff (conn->rmb_desc->len, &prod, &cfed); +smc_curs_diff_large (conn->rmb_desc->len, + &cfed, &prod); } if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req ||
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 229/321 blktrace: Show requests without sector
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
[ Upstream commit 0803de78049fe1b0baf44bcddc727b036fb9139b ]
Currently, blktrace will not show requests that don't have any data as rq->__sector is initialized to -1 which is out of device range and thus discarded by act_log_check(). This is most notably the case for cache flush requests sent to the device. Fix the problem by making blk_rq_trace_sector() return 0 for requests without initialized sector.
--- include/linux/blktrace_api.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
include/linux/blktrace_api.h +7 -1
@@ -116,7 +116,13 @@ extern void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes);static inline sector_t blk_rq_trace_sector (struct request *rq) { -return blk_rq_is_passthrough (rq) ?0 :blk_rq_pos (rq); +/* +* Tracing should ignore starting sector for passthrough requests and +* requests where starting sector didn't get set. +*/ +if (blk_rq_is_passthrough (rq) ||blk_rq_pos (rq) == (sector_t)-1 ) +return 0 ; +return blk_rq_pos (rq); }static inline unsigned int blk_rq_trace_nr_sectors (struct request *rq)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 213/321 mtd: Check add_mtd_device() ret code
In reply to Greg Kroah-HartmanFrom: Boris Brezillon <[email protected]>
[ Upstream commit 2b6f0090a3335b7bdd03ca520c35591159463041 ]
add_mtd_device() can fail. We should always check its return value and gracefully handle the failure case. Fix the call sites where this not done (in mtdpart.c) and add a __must_check attribute to the prototype to avoid this kind of mistakes.
--- drivers/mtd/mtdcore.h | 2 +- drivers/mtd/mtdpart.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-)
drivers/mtd/mtdcore.h +1 -1
@@ -7,7 +7,7 @@extern struct mutex mtd_table_mutex;struct mtd_info *__mtd_next_device (int i); -int add_mtd_device (struct mtd_info *mtd); +int __must_check add_mtd_device (struct mtd_info *mtd);int del_mtd_device (struct mtd_info *mtd);int add_mtd_partitions (struct mtd_info *,const struct mtd_partition *,int );int del_mtd_partitions (struct mtd_info *);
drivers/mtd/mtdpart.c +31 -5
@@ -612,10 +612,22 @@ int mtd_add_partition(struct mtd_info *parent, const char *name,list_add (&new->list, &mtd_partitions);mutex_unlock (&mtd_partitions_mutex); -add_mtd_device (&new->mtd); + ret =add_mtd_device (&new->mtd); +if (ret) + goto err_remove_part;mtd_add_partition_attrs (new); +return 0 ; + +err_remove_part: +mutex_lock (&mtd_partitions_mutex); +list_del (&new->list); +mutex_unlock (&mtd_partitions_mutex); + +free_partition (new); +pr_info ("%s:%i\n" , __func__, __LINE__); +return ret; }EXPORT_SYMBOL_GPL (mtd_add_partition);
@@ -706,22 +718,31 @@ int add_mtd_partitions(struct mtd_info *master, {struct mtd_part *slave;uint64_t cur_offset =0 ; -int i; +int i, ret;printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n" , nbparts, master->name);for (i =0 ; i < nbparts; i++) { slave =allocate_partition (master, parts + i, i, cur_offset);if (IS_ERR (slave)) { -del_mtd_partitions (master); -return PTR_ERR (slave); + ret =PTR_ERR (slave); + goto err_del_partitions; }mutex_lock (&mtd_partitions_mutex);list_add (&slave->list, &mtd_partitions);mutex_unlock (&mtd_partitions_mutex); -add_mtd_device (&slave->mtd); + ret =add_mtd_device (&slave->mtd); +if (ret) { +mutex_lock (&mtd_partitions_mutex); +list_del (&slave->list); +mutex_unlock (&mtd_partitions_mutex); + +free_partition (slave); + goto err_del_partitions; + } +mtd_add_partition_attrs (slave);/* Look for subpartitions */ parse_mtd_partitions (&slave->mtd, parts[i].types,NULL );
@@ -730,6 +751,11 @@ int add_mtd_partitions(struct mtd_info *master, }return 0 ; + +err_del_partitions: +del_mtd_partitions (master); + +return ret; }static DEFINE_SPINLOCK (part_parser_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 231/321 tipc: fix skb may be leaky in tipc_link_input
In reply to Greg Kroah-HartmanFrom: Hoang Le <[email protected]>
[ Upstream commit 7384b538d3aed2ed49d3575483d17aeee790fb06 ]
When we free skb at tipc_data_input, we return a 'false' boolean. Then, skb passed to subcalling tipc_link_input in tipc_link_rcv,
<snip>
1303 int tipc_link_rcv:
...
1354 if (!tipc_data_input(l, skb, l->inputq))
1355 rc |= tipc_link_input(l, skb, l->inputq);
</snip>
Fix it by simple changing to a 'true' boolean when skb is being free-ed. Then, tipc_link_rcv will bypassed to subcalling tipc_link_input as above condition.
--- net/tipc/link.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/link.c +1 -1
@@ -1114,7 +1114,7 @@ static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb,default :pr_warn ("Dropping received illegal msg type\n" );kfree_skb (skb); -return false; +return true; }; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 232/321 ASoC: samsung: i2s: Fix prescaler setting for the secondary DAI
In reply to Greg Kroah-HartmanFrom: Sylwester Nawrocki <[email protected]>
[ Upstream commit 323fb7b947b265753de34703dbbf8acc8ea3a4de ]
Make sure i2s->rclk_srcrate is properly initialized also during playback through the secondary DAI.
--- sound/soc/samsung/i2s.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/soc/samsung/i2s.c +7 -1
@@ -604,6 +604,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {struct i2s_dai *i2s =to_info (dai); +struct i2s_dai *other =get_other_dai (i2s);int lrp_shift, sdf_shift, sdf_mask, lrp_rlow, mod_slave;u32 mod, tmp =0 ;unsigned long flags;
@@ -661,7 +662,8 @@ static int i2s_set_fmt(struct snd_soc_dai *dai,* CLK_I2S_RCLK_SRC clock is not exposed so we ensure any * clock configuration assigned in DT is not overwritten. */ -if (i2s->rclk_srcrate ==0 && i2s->clk_data.clks ==NULL ) +if (i2s->rclk_srcrate ==0 && i2s->clk_data.clks ==NULL && + other->clk_data.clks ==NULL )i2s_set_sysclk (dai,SAMSUNG_I2S_RCLKSRC_0 ,0 ,SND_SOC_CLOCK_IN );break ;
@@ -699,6 +701,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct i2s_dai *i2s = to_info(dai); +struct i2s_dai *other =get_other_dai (i2s);u32 mod, mask =0 , val =0 ;struct clk *rclksrc;unsigned long flags;
@@ -784,6 +787,9 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, i2s->frmclk =params_rate (params); rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC ]; +if (!rclksrc ||IS_ERR (rclksrc)) + rclksrc = other->clk_table[CLK_I2S_RCLK_SRC ]; +if (rclksrc && !IS_ERR (rclksrc)) i2s->rclk_srcrate =clk_get_rate (rclksrc);
Signature · 1 line
2.20.1