5419 lines
167 KiB
Diff
5419 lines
167 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index cfae9b823d2b..db13b13cdcc2 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 9
|
|
-SUBLEVEL = 83
|
|
+SUBLEVEL = 84
|
|
EXTRAVERSION =
|
|
NAME = Roaring Lionus
|
|
|
|
@@ -87,10 +87,12 @@ endif
|
|
ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
|
|
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
|
|
quiet=silent_
|
|
+ tools_silent=s
|
|
endif
|
|
else # make-3.8x
|
|
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
|
|
quiet=silent_
|
|
+ tools_silent=-s
|
|
endif
|
|
endif
|
|
|
|
@@ -1614,11 +1616,11 @@ image_name:
|
|
# Clear a bunch of variables before executing the submake
|
|
tools/: FORCE
|
|
$(Q)mkdir -p $(objtree)/tools
|
|
- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/
|
|
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/
|
|
|
|
tools/%: FORCE
|
|
$(Q)mkdir -p $(objtree)/tools
|
|
- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/ $*
|
|
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/ $*
|
|
|
|
# Single targets
|
|
# ---------------------------------------------------------------------------
|
|
diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi
|
|
index a20a71d9d22e..c9c9a47446e8 100644
|
|
--- a/arch/arm/boot/dts/am4372.dtsi
|
|
+++ b/arch/arm/boot/dts/am4372.dtsi
|
|
@@ -926,7 +926,8 @@
|
|
reg = <0x48038000 0x2000>,
|
|
<0x46000000 0x400000>;
|
|
reg-names = "mpu", "dat";
|
|
- interrupts = <80>, <81>;
|
|
+ interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>,
|
|
+ <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
|
|
interrupt-names = "tx", "rx";
|
|
status = "disabled";
|
|
dmas = <&edma 8 2>,
|
|
@@ -940,7 +941,8 @@
|
|
reg = <0x4803C000 0x2000>,
|
|
<0x46400000 0x400000>;
|
|
reg-names = "mpu", "dat";
|
|
- interrupts = <82>, <83>;
|
|
+ interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>,
|
|
+ <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
|
interrupt-names = "tx", "rx";
|
|
status = "disabled";
|
|
dmas = <&edma 10 2>,
|
|
diff --git a/arch/arm/boot/dts/am437x-cm-t43.dts b/arch/arm/boot/dts/am437x-cm-t43.dts
|
|
index 9e92d480576b..3b9a94c274a7 100644
|
|
--- a/arch/arm/boot/dts/am437x-cm-t43.dts
|
|
+++ b/arch/arm/boot/dts/am437x-cm-t43.dts
|
|
@@ -301,8 +301,8 @@
|
|
status = "okay";
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&spi0_pins>;
|
|
- dmas = <&edma 16
|
|
- &edma 17>;
|
|
+ dmas = <&edma 16 0
|
|
+ &edma 17 0>;
|
|
dma-names = "tx0", "rx0";
|
|
|
|
flash: w25q64cvzpig@0 {
|
|
diff --git a/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts b/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts
|
|
index 38faa90007d7..2fa5eb4bd402 100644
|
|
--- a/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts
|
|
+++ b/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts
|
|
@@ -72,7 +72,8 @@
|
|
};
|
|
|
|
&gpmc {
|
|
- ranges = <1 0 0x08000000 0x1000000>; /* CS1: 16MB for LAN9221 */
|
|
+ ranges = <0 0 0x30000000 0x1000000 /* CS0: 16MB for NAND */
|
|
+ 1 0 0x2c000000 0x1000000>; /* CS1: 16MB for LAN9221 */
|
|
|
|
ethernet@gpmc {
|
|
pinctrl-names = "default";
|
|
diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi
|
|
index 26cce4d18405..4f2c5ec75714 100644
|
|
--- a/arch/arm/boot/dts/logicpd-som-lv.dtsi
|
|
+++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi
|
|
@@ -37,7 +37,7 @@
|
|
};
|
|
|
|
&gpmc {
|
|
- ranges = <0 0 0x00000000 0x1000000>; /* CS0: 16MB for NAND */
|
|
+ ranges = <0 0 0x30000000 0x1000000>; /* CS0: 16MB for NAND */
|
|
|
|
nand@0,0 {
|
|
compatible = "ti,omap2-nand";
|
|
@@ -121,7 +121,7 @@
|
|
|
|
&mmc3 {
|
|
interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>;
|
|
- pinctrl-0 = <&mmc3_pins>;
|
|
+ pinctrl-0 = <&mmc3_pins &wl127x_gpio>;
|
|
pinctrl-names = "default";
|
|
vmmc-supply = <&wl12xx_vmmc>;
|
|
non-removable;
|
|
@@ -132,8 +132,8 @@
|
|
wlcore: wlcore@2 {
|
|
compatible = "ti,wl1273";
|
|
reg = <2>;
|
|
- interrupt-parent = <&gpio5>;
|
|
- interrupts = <24 IRQ_TYPE_LEVEL_HIGH>; /* gpio 152 */
|
|
+ interrupt-parent = <&gpio1>;
|
|
+ interrupts = <2 IRQ_TYPE_LEVEL_HIGH>; /* gpio 2 */
|
|
ref-clock-frequency = <26000000>;
|
|
};
|
|
};
|
|
@@ -157,8 +157,6 @@
|
|
OMAP3_CORE1_IOPAD(0x2166, PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc2_dat5.sdmmc3_dat1 */
|
|
OMAP3_CORE1_IOPAD(0x2168, PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc2_dat6.sdmmc3_dat2 */
|
|
OMAP3_CORE1_IOPAD(0x216a, PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc2_dat6.sdmmc3_dat3 */
|
|
- OMAP3_CORE1_IOPAD(0x2184, PIN_INPUT_PULLUP | MUX_MODE4) /* mcbsp4_clkx.gpio_152 */
|
|
- OMAP3_CORE1_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */
|
|
OMAP3_CORE1_IOPAD(0x21d0, PIN_INPUT_PULLUP | MUX_MODE3) /* mcspi1_cs1.sdmmc3_cmd */
|
|
OMAP3_CORE1_IOPAD(0x21d2, PIN_INPUT_PULLUP | MUX_MODE3) /* mcspi1_cs2.sdmmc_clk */
|
|
>;
|
|
@@ -228,6 +226,12 @@
|
|
OMAP3_WKUP_IOPAD(0x2a0e, PIN_OUTPUT | MUX_MODE4) /* sys_boot2.gpio_4 */
|
|
>;
|
|
};
|
|
+ wl127x_gpio: pinmux_wl127x_gpio_pin {
|
|
+ pinctrl-single,pins = <
|
|
+ OMAP3_WKUP_IOPAD(0x2a0c, PIN_INPUT | MUX_MODE4) /* sys_boot0.gpio_2 */
|
|
+ OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */
|
|
+ >;
|
|
+ };
|
|
};
|
|
|
|
&omap3_pmx_core2 {
|
|
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi
|
|
index 9c289ddab3df..4d6584f15b17 100644
|
|
--- a/arch/arm/boot/dts/omap4.dtsi
|
|
+++ b/arch/arm/boot/dts/omap4.dtsi
|
|
@@ -352,7 +352,7 @@
|
|
elm: elm@48078000 {
|
|
compatible = "ti,am3352-elm";
|
|
reg = <0x48078000 0x2000>;
|
|
- interrupts = <4>;
|
|
+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
|
ti,hwmods = "elm";
|
|
status = "disabled";
|
|
};
|
|
@@ -859,14 +859,12 @@
|
|
usbhsohci: ohci@4a064800 {
|
|
compatible = "ti,ohci-omap3";
|
|
reg = <0x4a064800 0x400>;
|
|
- interrupt-parent = <&gic>;
|
|
interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
|
|
};
|
|
|
|
usbhsehci: ehci@4a064c00 {
|
|
compatible = "ti,ehci-omap";
|
|
reg = <0x4a064c00 0x400>;
|
|
- interrupt-parent = <&gic>;
|
|
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
|
|
};
|
|
};
|
|
diff --git a/arch/arm/common/bL_switcher_dummy_if.c b/arch/arm/common/bL_switcher_dummy_if.c
|
|
index 6053f64c3752..94133e33943c 100644
|
|
--- a/arch/arm/common/bL_switcher_dummy_if.c
|
|
+++ b/arch/arm/common/bL_switcher_dummy_if.c
|
|
@@ -57,3 +57,7 @@ static struct miscdevice bL_switcher_device = {
|
|
&bL_switcher_fops
|
|
};
|
|
module_misc_device(bL_switcher_device);
|
|
+
|
|
+MODULE_AUTHOR("Nicolas Pitre <nico@linaro.org>");
|
|
+MODULE_LICENSE("GPL v2");
|
|
+MODULE_DESCRIPTION("big.LITTLE switcher dummy user interface");
|
|
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
|
|
index 5ac122e88f67..9ff92050053c 100644
|
|
--- a/arch/arm/mach-omap2/omap-secure.c
|
|
+++ b/arch/arm/mach-omap2/omap-secure.c
|
|
@@ -73,6 +73,25 @@ phys_addr_t omap_secure_ram_mempool_base(void)
|
|
return omap_secure_memblock_base;
|
|
}
|
|
|
|
+u32 omap3_save_secure_ram(void __iomem *addr, int size)
|
|
+{
|
|
+ u32 ret;
|
|
+ u32 param[5];
|
|
+
|
|
+ if (size != OMAP3_SAVE_SECURE_RAM_SZ)
|
|
+ return OMAP3_SAVE_SECURE_RAM_SZ;
|
|
+
|
|
+ param[0] = 4; /* Number of arguments */
|
|
+ param[1] = __pa(addr); /* Physical address for saving */
|
|
+ param[2] = 0;
|
|
+ param[3] = 1;
|
|
+ param[4] = 1;
|
|
+
|
|
+ ret = save_secure_ram_context(__pa(param));
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
/**
|
|
* rx51_secure_dispatcher: Routine to dispatch secure PPA API calls
|
|
* @idx: The PPA API index
|
|
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h
|
|
index bae263fba640..c509cde71f93 100644
|
|
--- a/arch/arm/mach-omap2/omap-secure.h
|
|
+++ b/arch/arm/mach-omap2/omap-secure.h
|
|
@@ -31,6 +31,8 @@
|
|
/* Maximum Secure memory storage size */
|
|
#define OMAP_SECURE_RAM_STORAGE (88 * SZ_1K)
|
|
|
|
+#define OMAP3_SAVE_SECURE_RAM_SZ 0x803F
|
|
+
|
|
/* Secure low power HAL API index */
|
|
#define OMAP4_HAL_SAVESECURERAM_INDEX 0x1a
|
|
#define OMAP4_HAL_SAVEHW_INDEX 0x1b
|
|
@@ -65,6 +67,8 @@ extern u32 omap_smc2(u32 id, u32 falg, u32 pargs);
|
|
extern u32 omap_smc3(u32 id, u32 process, u32 flag, u32 pargs);
|
|
extern phys_addr_t omap_secure_ram_mempool_base(void);
|
|
extern int omap_secure_ram_reserve_memblock(void);
|
|
+extern u32 save_secure_ram_context(u32 args_pa);
|
|
+extern u32 omap3_save_secure_ram(void __iomem *save_regs, int size);
|
|
|
|
extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
|
|
u32 arg1, u32 arg2, u32 arg3, u32 arg4);
|
|
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
|
|
index b668719b9b25..8e30772cfe32 100644
|
|
--- a/arch/arm/mach-omap2/pm.h
|
|
+++ b/arch/arm/mach-omap2/pm.h
|
|
@@ -81,10 +81,6 @@ extern unsigned int omap3_do_wfi_sz;
|
|
/* ... and its pointer from SRAM after copy */
|
|
extern void (*omap3_do_wfi_sram)(void);
|
|
|
|
-/* save_secure_ram_context function pointer and size, for copy to SRAM */
|
|
-extern int save_secure_ram_context(u32 *addr);
|
|
-extern unsigned int save_secure_ram_context_sz;
|
|
-
|
|
extern void omap3_save_scratchpad_contents(void);
|
|
|
|
#define PM_RTA_ERRATUM_i608 (1 << 0)
|
|
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
|
|
index d44e0e2f1106..3836958074ac 100644
|
|
--- a/arch/arm/mach-omap2/pm34xx.c
|
|
+++ b/arch/arm/mach-omap2/pm34xx.c
|
|
@@ -48,6 +48,7 @@
|
|
#include "prm3xxx.h"
|
|
#include "pm.h"
|
|
#include "sdrc.h"
|
|
+#include "omap-secure.h"
|
|
#include "sram.h"
|
|
#include "control.h"
|
|
#include "vc.h"
|
|
@@ -66,7 +67,6 @@ struct power_state {
|
|
|
|
static LIST_HEAD(pwrst_list);
|
|
|
|
-static int (*_omap_save_secure_sram)(u32 *addr);
|
|
void (*omap3_do_wfi_sram)(void);
|
|
|
|
static struct powerdomain *mpu_pwrdm, *neon_pwrdm;
|
|
@@ -121,8 +121,8 @@ static void omap3_save_secure_ram_context(void)
|
|
* will hang the system.
|
|
*/
|
|
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
|
|
- ret = _omap_save_secure_sram((u32 *)(unsigned long)
|
|
- __pa(omap3_secure_ram_storage));
|
|
+ ret = omap3_save_secure_ram(omap3_secure_ram_storage,
|
|
+ OMAP3_SAVE_SECURE_RAM_SZ);
|
|
pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
|
|
/* Following is for error tracking, it should not happen */
|
|
if (ret) {
|
|
@@ -434,15 +434,10 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
|
*
|
|
* The minimum set of functions is pushed to SRAM for execution:
|
|
* - omap3_do_wfi for erratum i581 WA,
|
|
- * - save_secure_ram_context for security extensions.
|
|
*/
|
|
void omap_push_sram_idle(void)
|
|
{
|
|
omap3_do_wfi_sram = omap_sram_push(omap3_do_wfi, omap3_do_wfi_sz);
|
|
-
|
|
- if (omap_type() != OMAP2_DEVICE_TYPE_GP)
|
|
- _omap_save_secure_sram = omap_sram_push(save_secure_ram_context,
|
|
- save_secure_ram_context_sz);
|
|
}
|
|
|
|
static void __init pm_errata_configure(void)
|
|
@@ -554,7 +549,7 @@ int __init omap3_pm_init(void)
|
|
clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
|
|
if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
|
|
omap3_secure_ram_storage =
|
|
- kmalloc(0x803F, GFP_KERNEL);
|
|
+ kmalloc(OMAP3_SAVE_SECURE_RAM_SZ, GFP_KERNEL);
|
|
if (!omap3_secure_ram_storage)
|
|
pr_err("Memory allocation failed when allocating for secure sram context\n");
|
|
|
|
diff --git a/arch/arm/mach-omap2/prm33xx.c b/arch/arm/mach-omap2/prm33xx.c
|
|
index dcb5001d77da..973bcd754e1c 100644
|
|
--- a/arch/arm/mach-omap2/prm33xx.c
|
|
+++ b/arch/arm/mach-omap2/prm33xx.c
|
|
@@ -176,17 +176,6 @@ static int am33xx_pwrdm_read_pwrst(struct powerdomain *pwrdm)
|
|
return v;
|
|
}
|
|
|
|
-static int am33xx_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
|
|
-{
|
|
- u32 v;
|
|
-
|
|
- v = am33xx_prm_read_reg(pwrdm->prcm_offs, pwrdm->pwrstst_offs);
|
|
- v &= AM33XX_LASTPOWERSTATEENTERED_MASK;
|
|
- v >>= AM33XX_LASTPOWERSTATEENTERED_SHIFT;
|
|
-
|
|
- return v;
|
|
-}
|
|
-
|
|
static int am33xx_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
|
|
{
|
|
am33xx_prm_rmw_reg_bits(AM33XX_LOWPOWERSTATECHANGE_MASK,
|
|
@@ -357,7 +346,6 @@ struct pwrdm_ops am33xx_pwrdm_operations = {
|
|
.pwrdm_set_next_pwrst = am33xx_pwrdm_set_next_pwrst,
|
|
.pwrdm_read_next_pwrst = am33xx_pwrdm_read_next_pwrst,
|
|
.pwrdm_read_pwrst = am33xx_pwrdm_read_pwrst,
|
|
- .pwrdm_read_prev_pwrst = am33xx_pwrdm_read_prev_pwrst,
|
|
.pwrdm_set_logic_retst = am33xx_pwrdm_set_logic_retst,
|
|
.pwrdm_read_logic_pwrst = am33xx_pwrdm_read_logic_pwrst,
|
|
.pwrdm_read_logic_retst = am33xx_pwrdm_read_logic_retst,
|
|
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
|
|
index 1b9f0520dea9..3e0d802c59da 100644
|
|
--- a/arch/arm/mach-omap2/sleep34xx.S
|
|
+++ b/arch/arm/mach-omap2/sleep34xx.S
|
|
@@ -93,20 +93,13 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)
|
|
ENDPROC(enable_omap3630_toggle_l2_on_restore)
|
|
|
|
/*
|
|
- * Function to call rom code to save secure ram context. This gets
|
|
- * relocated to SRAM, so it can be all in .data section. Otherwise
|
|
- * we need to initialize api_params separately.
|
|
+ * Function to call rom code to save secure ram context.
|
|
+ *
|
|
+ * r0 = physical address of the parameters
|
|
*/
|
|
- .data
|
|
- .align 3
|
|
ENTRY(save_secure_ram_context)
|
|
stmfd sp!, {r4 - r11, lr} @ save registers on stack
|
|
- adr r3, api_params @ r3 points to parameters
|
|
- str r0, [r3,#0x4] @ r0 has sdram address
|
|
- ldr r12, high_mask
|
|
- and r3, r3, r12
|
|
- ldr r12, sram_phy_addr_mask
|
|
- orr r3, r3, r12
|
|
+ mov r3, r0 @ physical address of parameters
|
|
mov r0, #25 @ set service ID for PPA
|
|
mov r12, r0 @ copy secure service ID in r12
|
|
mov r1, #0 @ set task id for ROM code in r1
|
|
@@ -120,18 +113,7 @@ ENTRY(save_secure_ram_context)
|
|
nop
|
|
nop
|
|
ldmfd sp!, {r4 - r11, pc}
|
|
- .align
|
|
-sram_phy_addr_mask:
|
|
- .word SRAM_BASE_P
|
|
-high_mask:
|
|
- .word 0xffff
|
|
-api_params:
|
|
- .word 0x4, 0x0, 0x0, 0x1, 0x1
|
|
ENDPROC(save_secure_ram_context)
|
|
-ENTRY(save_secure_ram_context_sz)
|
|
- .word . - save_secure_ram_context
|
|
-
|
|
- .text
|
|
|
|
/*
|
|
* ======================
|
|
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
|
index cf57a7799a0f..7769c2e27788 100644
|
|
--- a/arch/arm64/Kconfig
|
|
+++ b/arch/arm64/Kconfig
|
|
@@ -1007,7 +1007,7 @@ source "fs/Kconfig.binfmt"
|
|
config COMPAT
|
|
bool "Kernel support for 32-bit EL0"
|
|
depends on ARM64_4K_PAGES || EXPERT
|
|
- select COMPAT_BINFMT_ELF
|
|
+ select COMPAT_BINFMT_ELF if BINFMT_ELF
|
|
select HAVE_UID16
|
|
select OLD_SIGSUSPEND3
|
|
select COMPAT_OLD_SIGACTION
|
|
diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
|
|
index 101794f5ce10..08a4497f70a6 100644
|
|
--- a/arch/arm64/Kconfig.platforms
|
|
+++ b/arch/arm64/Kconfig.platforms
|
|
@@ -2,9 +2,11 @@ menu "Platform selection"
|
|
|
|
config ARCH_SUNXI
|
|
bool "Allwinner sunxi 64-bit SoC Family"
|
|
+ select ARCH_HAS_RESET_CONTROLLER
|
|
select GENERIC_IRQ_CHIP
|
|
select PINCTRL
|
|
select PINCTRL_SUN50I_A64
|
|
+ select RESET_CONTROLLER
|
|
help
|
|
This enables support for Allwinner sunxi based SoCs like the A64.
|
|
|
|
diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
index 6c03c1702bb3..b307d6b6357e 100644
|
|
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
@@ -73,6 +73,7 @@
|
|
reg = <0x000>;
|
|
enable-method = "psci";
|
|
cpu-idle-states = <&CPU_SLEEP_0>;
|
|
+ #cooling-cells = <2>;
|
|
};
|
|
|
|
cpu1: cpu@1 {
|
|
@@ -89,6 +90,7 @@
|
|
reg = <0x100>;
|
|
enable-method = "psci";
|
|
cpu-idle-states = <&CPU_SLEEP_0>;
|
|
+ #cooling-cells = <2>;
|
|
};
|
|
|
|
cpu3: cpu@101 {
|
|
diff --git a/arch/arm64/crypto/crc32-arm64.c b/arch/arm64/crypto/crc32-arm64.c
|
|
index 6a37c3c6b11d..3ec568afd1d3 100644
|
|
--- a/arch/arm64/crypto/crc32-arm64.c
|
|
+++ b/arch/arm64/crypto/crc32-arm64.c
|
|
@@ -232,6 +232,7 @@ static struct shash_alg crc32_alg = {
|
|
.cra_name = "crc32",
|
|
.cra_driver_name = "crc32-arm64-hw",
|
|
.cra_priority = 300,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_alignmask = 0,
|
|
.cra_ctxsize = sizeof(struct chksum_ctx),
|
|
@@ -253,6 +254,7 @@ static struct shash_alg crc32c_alg = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-arm64-hw",
|
|
.cra_priority = 300,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_alignmask = 0,
|
|
.cra_ctxsize = sizeof(struct chksum_ctx),
|
|
diff --git a/arch/arm64/include/asm/bug.h b/arch/arm64/include/asm/bug.h
|
|
index 561190d15881..0bfe1df12b19 100644
|
|
--- a/arch/arm64/include/asm/bug.h
|
|
+++ b/arch/arm64/include/asm/bug.h
|
|
@@ -20,9 +20,6 @@
|
|
|
|
#include <asm/brk-imm.h>
|
|
|
|
-#ifdef CONFIG_GENERIC_BUG
|
|
-#define HAVE_ARCH_BUG
|
|
-
|
|
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
|
#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
|
|
#define __BUGVERBOSE_LOCATION(file, line) \
|
|
@@ -36,28 +33,36 @@
|
|
#define _BUGVERBOSE_LOCATION(file, line)
|
|
#endif
|
|
|
|
-#define _BUG_FLAGS(flags) __BUG_FLAGS(flags)
|
|
+#ifdef CONFIG_GENERIC_BUG
|
|
|
|
-#define __BUG_FLAGS(flags) asm volatile ( \
|
|
+#define __BUG_ENTRY(flags) \
|
|
".pushsection __bug_table,\"a\"\n\t" \
|
|
".align 2\n\t" \
|
|
"0: .long 1f - 0b\n\t" \
|
|
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
|
".short " #flags "\n\t" \
|
|
".popsection\n" \
|
|
- \
|
|
- "1: brk %[imm]" \
|
|
- :: [imm] "i" (BUG_BRK_IMM) \
|
|
-)
|
|
+ "1: "
|
|
+#else
|
|
+#define __BUG_ENTRY(flags) ""
|
|
+#endif
|
|
+
|
|
+#define __BUG_FLAGS(flags) \
|
|
+ asm volatile ( \
|
|
+ __BUG_ENTRY(flags) \
|
|
+ "brk %[imm]" :: [imm] "i" (BUG_BRK_IMM) \
|
|
+ );
|
|
|
|
-#define BUG() do { \
|
|
- _BUG_FLAGS(0); \
|
|
- unreachable(); \
|
|
+
|
|
+#define BUG() do { \
|
|
+ __BUG_FLAGS(0); \
|
|
+ unreachable(); \
|
|
} while (0)
|
|
|
|
-#define __WARN_TAINT(taint) _BUG_FLAGS(BUGFLAG_TAINT(taint))
|
|
+#define __WARN_TAINT(taint) \
|
|
+ __BUG_FLAGS(BUGFLAG_TAINT(taint))
|
|
|
|
-#endif /* ! CONFIG_GENERIC_BUG */
|
|
+#define HAVE_ARCH_BUG
|
|
|
|
#include <asm-generic/bug.h>
|
|
|
|
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
|
|
index 05615a3fdc6f..d5cc6d73c2c4 100644
|
|
--- a/arch/arm64/mm/mmu.c
|
|
+++ b/arch/arm64/mm/mmu.c
|
|
@@ -479,7 +479,7 @@ void __init paging_init(void)
|
|
* To do this we need to go via a temporary pgd.
|
|
*/
|
|
cpu_replace_ttbr1(__va(pgd_phys));
|
|
- memcpy(swapper_pg_dir, pgd, PAGE_SIZE);
|
|
+ memcpy(swapper_pg_dir, pgd, PGD_SIZE);
|
|
cpu_replace_ttbr1(swapper_pg_dir);
|
|
|
|
pgd_clear_fixmap();
|
|
diff --git a/arch/m68k/kernel/vmlinux-nommu.lds b/arch/m68k/kernel/vmlinux-nommu.lds
|
|
index d2c8abf1c8c4..e958abe0f51e 100644
|
|
--- a/arch/m68k/kernel/vmlinux-nommu.lds
|
|
+++ b/arch/m68k/kernel/vmlinux-nommu.lds
|
|
@@ -44,6 +44,8 @@ SECTIONS {
|
|
.text : {
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
+ IRQENTRY_TEXT
|
|
+ SOFTIRQENTRY_TEXT
|
|
SCHED_TEXT
|
|
CPUIDLE_TEXT
|
|
LOCK_TEXT
|
|
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds
|
|
index 5b5ce1e4d1ed..1656ae8a145d 100644
|
|
--- a/arch/m68k/kernel/vmlinux-std.lds
|
|
+++ b/arch/m68k/kernel/vmlinux-std.lds
|
|
@@ -15,6 +15,8 @@ SECTIONS
|
|
.text : {
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
+ IRQENTRY_TEXT
|
|
+ SOFTIRQENTRY_TEXT
|
|
SCHED_TEXT
|
|
CPUIDLE_TEXT
|
|
LOCK_TEXT
|
|
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds
|
|
index fe5ea1974b16..07b9818b3176 100644
|
|
--- a/arch/m68k/kernel/vmlinux-sun3.lds
|
|
+++ b/arch/m68k/kernel/vmlinux-sun3.lds
|
|
@@ -15,6 +15,8 @@ SECTIONS
|
|
.text : {
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
+ IRQENTRY_TEXT
|
|
+ SOFTIRQENTRY_TEXT
|
|
SCHED_TEXT
|
|
CPUIDLE_TEXT
|
|
LOCK_TEXT
|
|
diff --git a/arch/powerpc/crypto/crc32c-vpmsum_glue.c b/arch/powerpc/crypto/crc32c-vpmsum_glue.c
|
|
index f058e0c3e4d4..fd1d6c83f0c0 100644
|
|
--- a/arch/powerpc/crypto/crc32c-vpmsum_glue.c
|
|
+++ b/arch/powerpc/crypto/crc32c-vpmsum_glue.c
|
|
@@ -141,6 +141,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-vpmsum",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
|
|
index cab6d2a46c41..903e76a9f158 100644
|
|
--- a/arch/powerpc/include/asm/exception-64s.h
|
|
+++ b/arch/powerpc/include/asm/exception-64s.h
|
|
@@ -242,7 +242,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
|
mtspr SPRN_##h##SRR0,r12; \
|
|
mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \
|
|
mtspr SPRN_##h##SRR1,r10; \
|
|
- h##rfid; \
|
|
+ h##RFI_TO_KERNEL; \
|
|
b . /* prevent speculative execution */
|
|
#define EXCEPTION_PROLOG_PSERIES_1(label, h) \
|
|
__EXCEPTION_PROLOG_PSERIES_1(label, h)
|
|
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
|
|
index ea43897183fd..c75ee2d886fc 100644
|
|
--- a/arch/powerpc/include/asm/paca.h
|
|
+++ b/arch/powerpc/include/asm/paca.h
|
|
@@ -212,8 +212,7 @@ struct paca_struct {
|
|
*/
|
|
u64 exrfi[13] __aligned(0x80);
|
|
void *rfi_flush_fallback_area;
|
|
- u64 l1d_flush_congruence;
|
|
- u64 l1d_flush_sets;
|
|
+ u64 l1d_flush_size;
|
|
#endif
|
|
};
|
|
|
|
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
|
|
index 64bcbd580495..14fbbd9035ca 100644
|
|
--- a/arch/powerpc/kernel/asm-offsets.c
|
|
+++ b/arch/powerpc/kernel/asm-offsets.c
|
|
@@ -242,8 +242,7 @@ int main(void)
|
|
DEFINE(PACA_IN_MCE, offsetof(struct paca_struct, in_mce));
|
|
DEFINE(PACA_RFI_FLUSH_FALLBACK_AREA, offsetof(struct paca_struct, rfi_flush_fallback_area));
|
|
DEFINE(PACA_EXRFI, offsetof(struct paca_struct, exrfi));
|
|
- DEFINE(PACA_L1D_FLUSH_CONGRUENCE, offsetof(struct paca_struct, l1d_flush_congruence));
|
|
- DEFINE(PACA_L1D_FLUSH_SETS, offsetof(struct paca_struct, l1d_flush_sets));
|
|
+ DEFINE(PACA_L1D_FLUSH_SIZE, offsetof(struct paca_struct, l1d_flush_size));
|
|
#endif
|
|
DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
|
|
DEFINE(PACAKEXECSTATE, offsetof(struct paca_struct, kexec_state));
|
|
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
|
|
index 9121b9a35c8a..2dc52e6d2af4 100644
|
|
--- a/arch/powerpc/kernel/entry_64.S
|
|
+++ b/arch/powerpc/kernel/entry_64.S
|
|
@@ -401,8 +401,7 @@ tabort_syscall:
|
|
mtmsrd r10, 1
|
|
mtspr SPRN_SRR0, r11
|
|
mtspr SPRN_SRR1, r12
|
|
-
|
|
- rfid
|
|
+ RFI_TO_USER
|
|
b . /* prevent speculative execution */
|
|
#endif
|
|
|
|
@@ -1078,7 +1077,7 @@ _GLOBAL(enter_rtas)
|
|
|
|
mtspr SPRN_SRR0,r5
|
|
mtspr SPRN_SRR1,r6
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b . /* prevent speculative execution */
|
|
|
|
rtas_return_loc:
|
|
@@ -1103,7 +1102,7 @@ rtas_return_loc:
|
|
|
|
mtspr SPRN_SRR0,r3
|
|
mtspr SPRN_SRR1,r4
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b . /* prevent speculative execution */
|
|
|
|
.align 3
|
|
@@ -1174,7 +1173,7 @@ _GLOBAL(enter_prom)
|
|
LOAD_REG_IMMEDIATE(r12, MSR_SF | MSR_ISF | MSR_LE)
|
|
andc r11,r11,r12
|
|
mtsrr1 r11
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
#endif /* CONFIG_PPC_BOOK3E */
|
|
|
|
1: /* Return from OF */
|
|
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
|
|
index 96db6c3adebe..7614d1dd2c0b 100644
|
|
--- a/arch/powerpc/kernel/exceptions-64s.S
|
|
+++ b/arch/powerpc/kernel/exceptions-64s.S
|
|
@@ -244,7 +244,7 @@ BEGIN_FTR_SECTION
|
|
LOAD_HANDLER(r12, machine_check_handle_early)
|
|
1: mtspr SPRN_SRR0,r12
|
|
mtspr SPRN_SRR1,r11
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b . /* prevent speculative execution */
|
|
2:
|
|
/* Stack overflow. Stay on emergency stack and panic.
|
|
@@ -280,7 +280,7 @@ machine_check_pSeries_0:
|
|
mtspr SPRN_SRR0,r12
|
|
mfspr r12,SPRN_SRR1
|
|
mtspr SPRN_SRR1,r10
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b . /* prevent speculative execution */
|
|
|
|
TRAMP_KVM_SKIP(PACA_EXMC, 0x200)
|
|
@@ -446,7 +446,7 @@ EXC_COMMON_BEGIN(machine_check_handle_early)
|
|
li r3,MSR_ME
|
|
andc r10,r10,r3 /* Turn off MSR_ME */
|
|
mtspr SPRN_SRR1,r10
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b .
|
|
2:
|
|
/*
|
|
@@ -464,7 +464,7 @@ EXC_COMMON_BEGIN(machine_check_handle_early)
|
|
*/
|
|
bl machine_check_queue_event
|
|
MACHINE_CHECK_HANDLER_WINDUP
|
|
- rfid
|
|
+ RFI_TO_USER_OR_KERNEL
|
|
9:
|
|
/* Deliver the machine check to host kernel in V mode. */
|
|
MACHINE_CHECK_HANDLER_WINDUP
|
|
@@ -680,6 +680,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
|
|
.machine push
|
|
.machine "power4"
|
|
mtcrf 0x80,r9
|
|
+ mtcrf 0x02,r9 /* I/D indication is in cr6 */
|
|
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
|
|
.machine pop
|
|
|
|
@@ -705,7 +706,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
|
|
mtspr SPRN_SRR0,r10
|
|
ld r10,PACAKMSR(r13)
|
|
mtspr SPRN_SRR1,r10
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b .
|
|
|
|
EXC_COMMON_BEGIN(unrecov_slb)
|
|
@@ -892,7 +893,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \
|
|
mtspr SPRN_SRR0,r10 ; \
|
|
ld r10,PACAKMSR(r13) ; \
|
|
mtspr SPRN_SRR1,r10 ; \
|
|
- rfid ; \
|
|
+ RFI_TO_KERNEL ; \
|
|
b . ; /* prevent speculative execution */
|
|
|
|
#define SYSCALL_PSERIES_3 \
|
|
@@ -900,7 +901,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \
|
|
1: mfspr r12,SPRN_SRR1 ; \
|
|
xori r12,r12,MSR_LE ; \
|
|
mtspr SPRN_SRR1,r12 ; \
|
|
- rfid ; /* return to userspace */ \
|
|
+ RFI_TO_USER ; /* return to userspace */ \
|
|
b . ; /* prevent speculative execution */
|
|
|
|
#if defined(CONFIG_RELOCATABLE)
|
|
@@ -1275,7 +1276,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
|
|
ld r11,PACA_EXGEN+EX_R11(r13)
|
|
ld r12,PACA_EXGEN+EX_R12(r13)
|
|
ld r13,PACA_EXGEN+EX_R13(r13)
|
|
- HRFID
|
|
+ HRFI_TO_UNKNOWN
|
|
b .
|
|
#endif
|
|
|
|
@@ -1349,7 +1350,7 @@ masked_##_H##interrupt: \
|
|
ld r10,PACA_EXGEN+EX_R10(r13); \
|
|
ld r11,PACA_EXGEN+EX_R11(r13); \
|
|
GET_SCRATCH0(r13); \
|
|
- ##_H##rfid; \
|
|
+ ##_H##RFI_TO_KERNEL; \
|
|
b .
|
|
|
|
/*
|
|
@@ -1371,7 +1372,7 @@ TRAMP_REAL_BEGIN(kvmppc_skip_interrupt)
|
|
addi r13, r13, 4
|
|
mtspr SPRN_SRR0, r13
|
|
GET_SCRATCH0(r13)
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
b .
|
|
|
|
TRAMP_REAL_BEGIN(kvmppc_skip_Hinterrupt)
|
|
@@ -1383,7 +1384,7 @@ TRAMP_REAL_BEGIN(kvmppc_skip_Hinterrupt)
|
|
addi r13, r13, 4
|
|
mtspr SPRN_HSRR0, r13
|
|
GET_SCRATCH0(r13)
|
|
- hrfid
|
|
+ HRFI_TO_KERNEL
|
|
b .
|
|
#endif
|
|
|
|
@@ -1601,39 +1602,37 @@ rfi_flush_fallback:
|
|
std r9,PACA_EXRFI+EX_R9(r13)
|
|
std r10,PACA_EXRFI+EX_R10(r13)
|
|
std r11,PACA_EXRFI+EX_R11(r13)
|
|
- std r12,PACA_EXRFI+EX_R12(r13)
|
|
- std r8,PACA_EXRFI+EX_R13(r13)
|
|
mfctr r9
|
|
ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
|
|
- ld r11,PACA_L1D_FLUSH_SETS(r13)
|
|
- ld r12,PACA_L1D_FLUSH_CONGRUENCE(r13)
|
|
- /*
|
|
- * The load adresses are at staggered offsets within cachelines,
|
|
- * which suits some pipelines better (on others it should not
|
|
- * hurt).
|
|
- */
|
|
- addi r12,r12,8
|
|
+ ld r11,PACA_L1D_FLUSH_SIZE(r13)
|
|
+ srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
|
|
mtctr r11
|
|
DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
|
|
|
|
/* order ld/st prior to dcbt stop all streams with flushing */
|
|
sync
|
|
-1: li r8,0
|
|
- .rept 8 /* 8-way set associative */
|
|
- ldx r11,r10,r8
|
|
- add r8,r8,r12
|
|
- xor r11,r11,r11 // Ensure r11 is 0 even if fallback area is not
|
|
- add r8,r8,r11 // Add 0, this creates a dependency on the ldx
|
|
- .endr
|
|
- addi r10,r10,128 /* 128 byte cache line */
|
|
+
|
|
+ /*
|
|
+ * The load adresses are at staggered offsets within cachelines,
|
|
+ * which suits some pipelines better (on others it should not
|
|
+ * hurt).
|
|
+ */
|
|
+1:
|
|
+ ld r11,(0x80 + 8)*0(r10)
|
|
+ ld r11,(0x80 + 8)*1(r10)
|
|
+ ld r11,(0x80 + 8)*2(r10)
|
|
+ ld r11,(0x80 + 8)*3(r10)
|
|
+ ld r11,(0x80 + 8)*4(r10)
|
|
+ ld r11,(0x80 + 8)*5(r10)
|
|
+ ld r11,(0x80 + 8)*6(r10)
|
|
+ ld r11,(0x80 + 8)*7(r10)
|
|
+ addi r10,r10,0x80*8
|
|
bdnz 1b
|
|
|
|
mtctr r9
|
|
ld r9,PACA_EXRFI+EX_R9(r13)
|
|
ld r10,PACA_EXRFI+EX_R10(r13)
|
|
ld r11,PACA_EXRFI+EX_R11(r13)
|
|
- ld r12,PACA_EXRFI+EX_R12(r13)
|
|
- ld r8,PACA_EXRFI+EX_R13(r13)
|
|
GET_SCRATCH0(r13);
|
|
rfid
|
|
|
|
@@ -1644,39 +1643,37 @@ hrfi_flush_fallback:
|
|
std r9,PACA_EXRFI+EX_R9(r13)
|
|
std r10,PACA_EXRFI+EX_R10(r13)
|
|
std r11,PACA_EXRFI+EX_R11(r13)
|
|
- std r12,PACA_EXRFI+EX_R12(r13)
|
|
- std r8,PACA_EXRFI+EX_R13(r13)
|
|
mfctr r9
|
|
ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
|
|
- ld r11,PACA_L1D_FLUSH_SETS(r13)
|
|
- ld r12,PACA_L1D_FLUSH_CONGRUENCE(r13)
|
|
- /*
|
|
- * The load adresses are at staggered offsets within cachelines,
|
|
- * which suits some pipelines better (on others it should not
|
|
- * hurt).
|
|
- */
|
|
- addi r12,r12,8
|
|
+ ld r11,PACA_L1D_FLUSH_SIZE(r13)
|
|
+ srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
|
|
mtctr r11
|
|
DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
|
|
|
|
/* order ld/st prior to dcbt stop all streams with flushing */
|
|
sync
|
|
-1: li r8,0
|
|
- .rept 8 /* 8-way set associative */
|
|
- ldx r11,r10,r8
|
|
- add r8,r8,r12
|
|
- xor r11,r11,r11 // Ensure r11 is 0 even if fallback area is not
|
|
- add r8,r8,r11 // Add 0, this creates a dependency on the ldx
|
|
- .endr
|
|
- addi r10,r10,128 /* 128 byte cache line */
|
|
+
|
|
+ /*
|
|
+ * The load adresses are at staggered offsets within cachelines,
|
|
+ * which suits some pipelines better (on others it should not
|
|
+ * hurt).
|
|
+ */
|
|
+1:
|
|
+ ld r11,(0x80 + 8)*0(r10)
|
|
+ ld r11,(0x80 + 8)*1(r10)
|
|
+ ld r11,(0x80 + 8)*2(r10)
|
|
+ ld r11,(0x80 + 8)*3(r10)
|
|
+ ld r11,(0x80 + 8)*4(r10)
|
|
+ ld r11,(0x80 + 8)*5(r10)
|
|
+ ld r11,(0x80 + 8)*6(r10)
|
|
+ ld r11,(0x80 + 8)*7(r10)
|
|
+ addi r10,r10,0x80*8
|
|
bdnz 1b
|
|
|
|
mtctr r9
|
|
ld r9,PACA_EXRFI+EX_R9(r13)
|
|
ld r10,PACA_EXRFI+EX_R10(r13)
|
|
ld r11,PACA_EXRFI+EX_R11(r13)
|
|
- ld r12,PACA_EXRFI+EX_R12(r13)
|
|
- ld r8,PACA_EXRFI+EX_R13(r13)
|
|
GET_SCRATCH0(r13);
|
|
hrfid
|
|
|
|
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
|
|
index b350ac5e3111..d92c95333435 100644
|
|
--- a/arch/powerpc/kernel/idle_book3s.S
|
|
+++ b/arch/powerpc/kernel/idle_book3s.S
|
|
@@ -9,6 +9,7 @@
|
|
*/
|
|
|
|
#include <linux/threads.h>
|
|
+#include <asm/exception-64s.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/page.h>
|
|
#include <asm/cputable.h>
|
|
@@ -178,7 +179,7 @@ _GLOBAL(pnv_powersave_common)
|
|
mtmsrd r6, 1 /* clear RI before setting SRR0/1 */
|
|
mtspr SPRN_SRR0, r5
|
|
mtspr SPRN_SRR1, r7
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
|
|
.globl pnv_enter_arch207_idle_mode
|
|
pnv_enter_arch207_idle_mode:
|
|
@@ -668,7 +669,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
|
mtcr r6
|
|
mtspr SPRN_SRR1,r4
|
|
mtspr SPRN_SRR0,r5
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
|
|
/*
|
|
* R3 here contains the value that will be returned to the caller
|
|
@@ -689,4 +690,4 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
|
mtcr r6
|
|
mtspr SPRN_SRR1,r4
|
|
mtspr SPRN_SRR0,r5
|
|
- rfid
|
|
+ RFI_TO_KERNEL
|
|
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
|
|
index 7c30a91c1f86..5243501d95ef 100644
|
|
--- a/arch/powerpc/kernel/setup_64.c
|
|
+++ b/arch/powerpc/kernel/setup_64.c
|
|
@@ -745,19 +745,8 @@ static void init_fallback_flush(void)
|
|
memset(l1d_flush_fallback_area, 0, l1d_size * 2);
|
|
|
|
for_each_possible_cpu(cpu) {
|
|
- /*
|
|
- * The fallback flush is currently coded for 8-way
|
|
- * associativity. Different associativity is possible, but it
|
|
- * will be treated as 8-way and may not evict the lines as
|
|
- * effectively.
|
|
- *
|
|
- * 128 byte lines are mandatory.
|
|
- */
|
|
- u64 c = l1d_size / 8;
|
|
-
|
|
paca[cpu].rfi_flush_fallback_area = l1d_flush_fallback_area;
|
|
- paca[cpu].l1d_flush_congruence = c;
|
|
- paca[cpu].l1d_flush_sets = c / 128;
|
|
+ paca[cpu].l1d_flush_size = l1d_size;
|
|
}
|
|
}
|
|
|
|
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
|
|
index 0447a22a4df6..55fbc0c78721 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
|
|
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
|
|
@@ -65,7 +65,7 @@ _GLOBAL_TOC(kvmppc_hv_entry_trampoline)
|
|
mtmsrd r0,1 /* clear RI in MSR */
|
|
mtsrr0 r5
|
|
mtsrr1 r6
|
|
- RFI
|
|
+ RFI_TO_KERNEL
|
|
|
|
kvmppc_call_hv_entry:
|
|
ld r4, HSTATE_KVM_VCPU(r13)
|
|
@@ -171,7 +171,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|
mtsrr0 r8
|
|
mtsrr1 r7
|
|
beq cr1, 13f /* machine check */
|
|
- RFI
|
|
+ RFI_TO_KERNEL
|
|
|
|
/* On POWER7, we have external interrupts set to use HSRR0/1 */
|
|
11: mtspr SPRN_HSRR0, r8
|
|
@@ -1018,8 +1018,7 @@ BEGIN_FTR_SECTION
|
|
END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
|
ld r0, VCPU_GPR(R0)(r4)
|
|
ld r4, VCPU_GPR(R4)(r4)
|
|
-
|
|
- hrfid
|
|
+ HRFI_TO_GUEST
|
|
b .
|
|
|
|
secondary_too_late:
|
|
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S
|
|
index 42a4b237df5f..34a5adeff084 100644
|
|
--- a/arch/powerpc/kvm/book3s_rmhandlers.S
|
|
+++ b/arch/powerpc/kvm/book3s_rmhandlers.S
|
|
@@ -46,6 +46,9 @@
|
|
|
|
#define FUNC(name) name
|
|
|
|
+#define RFI_TO_KERNEL RFI
|
|
+#define RFI_TO_GUEST RFI
|
|
+
|
|
.macro INTERRUPT_TRAMPOLINE intno
|
|
|
|
.global kvmppc_trampoline_\intno
|
|
@@ -141,7 +144,7 @@ kvmppc_handler_skip_ins:
|
|
GET_SCRATCH0(r13)
|
|
|
|
/* And get back into the code */
|
|
- RFI
|
|
+ RFI_TO_KERNEL
|
|
#endif
|
|
|
|
/*
|
|
@@ -164,6 +167,6 @@ _GLOBAL_TOC(kvmppc_entry_trampoline)
|
|
ori r5, r5, MSR_EE
|
|
mtsrr0 r7
|
|
mtsrr1 r6
|
|
- RFI
|
|
+ RFI_TO_KERNEL
|
|
|
|
#include "book3s_segment.S"
|
|
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S
|
|
index ca8f174289bb..7c982956d709 100644
|
|
--- a/arch/powerpc/kvm/book3s_segment.S
|
|
+++ b/arch/powerpc/kvm/book3s_segment.S
|
|
@@ -156,7 +156,7 @@ no_dcbz32_on:
|
|
PPC_LL r9, SVCPU_R9(r3)
|
|
PPC_LL r3, (SVCPU_R3)(r3)
|
|
|
|
- RFI
|
|
+ RFI_TO_GUEST
|
|
kvmppc_handler_trampoline_enter_end:
|
|
|
|
|
|
@@ -389,5 +389,5 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
|
cmpwi r12, BOOK3S_INTERRUPT_DOORBELL
|
|
beqa BOOK3S_INTERRUPT_DOORBELL
|
|
|
|
- RFI
|
|
+ RFI_TO_KERNEL
|
|
kvmppc_handler_trampoline_exit_end:
|
|
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
|
|
index 083f92746951..bf949623de90 100644
|
|
--- a/arch/powerpc/perf/core-book3s.c
|
|
+++ b/arch/powerpc/perf/core-book3s.c
|
|
@@ -1381,7 +1381,7 @@ static int collect_events(struct perf_event *group, int max_count,
|
|
int n = 0;
|
|
struct perf_event *event;
|
|
|
|
- if (!is_software_event(group)) {
|
|
+ if (group->pmu->task_ctx_nr == perf_hw_context) {
|
|
if (n >= max_count)
|
|
return -1;
|
|
ctrs[n] = group;
|
|
@@ -1389,7 +1389,7 @@ static int collect_events(struct perf_event *group, int max_count,
|
|
events[n++] = group->hw.config;
|
|
}
|
|
list_for_each_entry(event, &group->sibling_list, group_entry) {
|
|
- if (!is_software_event(event) &&
|
|
+ if (event->pmu->task_ctx_nr == perf_hw_context &&
|
|
event->state != PERF_EVENT_STATE_OFF) {
|
|
if (n >= max_count)
|
|
return -1;
|
|
diff --git a/arch/s390/crypto/crc32-vx.c b/arch/s390/crypto/crc32-vx.c
|
|
index 992e630c227b..6f4985f357c6 100644
|
|
--- a/arch/s390/crypto/crc32-vx.c
|
|
+++ b/arch/s390/crypto/crc32-vx.c
|
|
@@ -238,6 +238,7 @@ static struct shash_alg crc32_vx_algs[] = {
|
|
.cra_name = "crc32",
|
|
.cra_driver_name = "crc32-vx",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CRC32_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct crc_ctx),
|
|
.cra_module = THIS_MODULE,
|
|
@@ -258,6 +259,7 @@ static struct shash_alg crc32_vx_algs[] = {
|
|
.cra_name = "crc32be",
|
|
.cra_driver_name = "crc32be-vx",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CRC32_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct crc_ctx),
|
|
.cra_module = THIS_MODULE,
|
|
@@ -278,6 +280,7 @@ static struct shash_alg crc32_vx_algs[] = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-vx",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CRC32_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct crc_ctx),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/arch/sparc/crypto/crc32c_glue.c b/arch/sparc/crypto/crc32c_glue.c
|
|
index d1064e46efe8..8aa664638c3c 100644
|
|
--- a/arch/sparc/crypto/crc32c_glue.c
|
|
+++ b/arch/sparc/crypto/crc32c_glue.c
|
|
@@ -133,6 +133,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-sparc64",
|
|
.cra_priority = SPARC_CR_OPCODE_PRIORITY,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_alignmask = 7,
|
|
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
|
index 0ca4d12ce95c..a4ac7bab15f7 100644
|
|
--- a/arch/x86/Kconfig
|
|
+++ b/arch/x86/Kconfig
|
|
@@ -1057,7 +1057,7 @@ config X86_MCE_THRESHOLD
|
|
def_bool y
|
|
|
|
config X86_MCE_INJECT
|
|
- depends on X86_MCE
|
|
+ depends on X86_MCE && X86_LOCAL_APIC
|
|
tristate "Machine check injector support"
|
|
---help---
|
|
Provide support for injecting machine checks for testing purposes.
|
|
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
|
|
index 67eec55093a5..4386440fe463 100644
|
|
--- a/arch/x86/Kconfig.debug
|
|
+++ b/arch/x86/Kconfig.debug
|
|
@@ -352,6 +352,7 @@ config X86_DEBUG_FPU
|
|
|
|
config PUNIT_ATOM_DEBUG
|
|
tristate "ATOM Punit debug driver"
|
|
+ depends on PCI
|
|
select DEBUG_FS
|
|
select IOSF_MBI
|
|
---help---
|
|
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
|
|
index 12ea8f8384f4..3b7156f46bc1 100644
|
|
--- a/arch/x86/boot/Makefile
|
|
+++ b/arch/x86/boot/Makefile
|
|
@@ -73,12 +73,13 @@ UBSAN_SANITIZE := n
|
|
$(obj)/bzImage: asflags-y := $(SVGA_MODE)
|
|
|
|
quiet_cmd_image = BUILD $@
|
|
+silent_redirect_image = >/dev/null
|
|
cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin \
|
|
- $(obj)/zoffset.h $@
|
|
+ $(obj)/zoffset.h $@ $($(quiet)redirect_image)
|
|
|
|
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
|
$(call if_changed,image)
|
|
- @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
|
+ @$(kecho) 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
|
|
|
OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note -R .comment -S
|
|
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
|
diff --git a/arch/x86/crypto/crc32-pclmul_glue.c b/arch/x86/crypto/crc32-pclmul_glue.c
|
|
index 27226df3f7d8..c8d9cdacbf10 100644
|
|
--- a/arch/x86/crypto/crc32-pclmul_glue.c
|
|
+++ b/arch/x86/crypto/crc32-pclmul_glue.c
|
|
@@ -162,6 +162,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32",
|
|
.cra_driver_name = "crc32-pclmul",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/arch/x86/crypto/crc32c-intel_glue.c b/arch/x86/crypto/crc32c-intel_glue.c
|
|
index 0857b1a1de3b..60a391b8c4a2 100644
|
|
--- a/arch/x86/crypto/crc32c-intel_glue.c
|
|
+++ b/arch/x86/crypto/crc32c-intel_glue.c
|
|
@@ -239,6 +239,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-intel",
|
|
.cra_priority = 200,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/arch/x86/crypto/twofish-x86_64-asm_64-3way.S b/arch/x86/crypto/twofish-x86_64-asm_64-3way.S
|
|
index 1c3b7ceb36d2..e7273a606a07 100644
|
|
--- a/arch/x86/crypto/twofish-x86_64-asm_64-3way.S
|
|
+++ b/arch/x86/crypto/twofish-x86_64-asm_64-3way.S
|
|
@@ -55,29 +55,31 @@
|
|
#define RAB1bl %bl
|
|
#define RAB2bl %cl
|
|
|
|
+#define CD0 0x0(%rsp)
|
|
+#define CD1 0x8(%rsp)
|
|
+#define CD2 0x10(%rsp)
|
|
+
|
|
+# used only before/after all rounds
|
|
#define RCD0 %r8
|
|
#define RCD1 %r9
|
|
#define RCD2 %r10
|
|
|
|
-#define RCD0d %r8d
|
|
-#define RCD1d %r9d
|
|
-#define RCD2d %r10d
|
|
-
|
|
-#define RX0 %rbp
|
|
-#define RX1 %r11
|
|
-#define RX2 %r12
|
|
+# used only during rounds
|
|
+#define RX0 %r8
|
|
+#define RX1 %r9
|
|
+#define RX2 %r10
|
|
|
|
-#define RX0d %ebp
|
|
-#define RX1d %r11d
|
|
-#define RX2d %r12d
|
|
+#define RX0d %r8d
|
|
+#define RX1d %r9d
|
|
+#define RX2d %r10d
|
|
|
|
-#define RY0 %r13
|
|
-#define RY1 %r14
|
|
-#define RY2 %r15
|
|
+#define RY0 %r11
|
|
+#define RY1 %r12
|
|
+#define RY2 %r13
|
|
|
|
-#define RY0d %r13d
|
|
-#define RY1d %r14d
|
|
-#define RY2d %r15d
|
|
+#define RY0d %r11d
|
|
+#define RY1d %r12d
|
|
+#define RY2d %r13d
|
|
|
|
#define RT0 %rdx
|
|
#define RT1 %rsi
|
|
@@ -85,6 +87,8 @@
|
|
#define RT0d %edx
|
|
#define RT1d %esi
|
|
|
|
+#define RT1bl %sil
|
|
+
|
|
#define do16bit_ror(rot, op1, op2, T0, T1, tmp1, tmp2, ab, dst) \
|
|
movzbl ab ## bl, tmp2 ## d; \
|
|
movzbl ab ## bh, tmp1 ## d; \
|
|
@@ -92,6 +96,11 @@
|
|
op1##l T0(CTX, tmp2, 4), dst ## d; \
|
|
op2##l T1(CTX, tmp1, 4), dst ## d;
|
|
|
|
+#define swap_ab_with_cd(ab, cd, tmp) \
|
|
+ movq cd, tmp; \
|
|
+ movq ab, cd; \
|
|
+ movq tmp, ab;
|
|
+
|
|
/*
|
|
* Combined G1 & G2 function. Reordered with help of rotates to have moves
|
|
* at begining.
|
|
@@ -110,15 +119,15 @@
|
|
/* G1,2 && G2,2 */ \
|
|
do16bit_ror(32, xor, xor, Tx2, Tx3, RT0, RT1, ab ## 0, x ## 0); \
|
|
do16bit_ror(16, xor, xor, Ty3, Ty0, RT0, RT1, ab ## 0, y ## 0); \
|
|
- xchgq cd ## 0, ab ## 0; \
|
|
+ swap_ab_with_cd(ab ## 0, cd ## 0, RT0); \
|
|
\
|
|
do16bit_ror(32, xor, xor, Tx2, Tx3, RT0, RT1, ab ## 1, x ## 1); \
|
|
do16bit_ror(16, xor, xor, Ty3, Ty0, RT0, RT1, ab ## 1, y ## 1); \
|
|
- xchgq cd ## 1, ab ## 1; \
|
|
+ swap_ab_with_cd(ab ## 1, cd ## 1, RT0); \
|
|
\
|
|
do16bit_ror(32, xor, xor, Tx2, Tx3, RT0, RT1, ab ## 2, x ## 2); \
|
|
do16bit_ror(16, xor, xor, Ty3, Ty0, RT0, RT1, ab ## 2, y ## 2); \
|
|
- xchgq cd ## 2, ab ## 2;
|
|
+ swap_ab_with_cd(ab ## 2, cd ## 2, RT0);
|
|
|
|
#define enc_round_end(ab, x, y, n) \
|
|
addl y ## d, x ## d; \
|
|
@@ -168,6 +177,16 @@
|
|
decrypt_round3(ba, dc, (n*2)+1); \
|
|
decrypt_round3(ba, dc, (n*2));
|
|
|
|
+#define push_cd() \
|
|
+ pushq RCD2; \
|
|
+ pushq RCD1; \
|
|
+ pushq RCD0;
|
|
+
|
|
+#define pop_cd() \
|
|
+ popq RCD0; \
|
|
+ popq RCD1; \
|
|
+ popq RCD2;
|
|
+
|
|
#define inpack3(in, n, xy, m) \
|
|
movq 4*(n)(in), xy ## 0; \
|
|
xorq w+4*m(CTX), xy ## 0; \
|
|
@@ -223,11 +242,8 @@ ENTRY(__twofish_enc_blk_3way)
|
|
* %rdx: src, RIO
|
|
* %rcx: bool, if true: xor output
|
|
*/
|
|
- pushq %r15;
|
|
- pushq %r14;
|
|
pushq %r13;
|
|
pushq %r12;
|
|
- pushq %rbp;
|
|
pushq %rbx;
|
|
|
|
pushq %rcx; /* bool xor */
|
|
@@ -235,40 +251,36 @@ ENTRY(__twofish_enc_blk_3way)
|
|
|
|
inpack_enc3();
|
|
|
|
- encrypt_cycle3(RAB, RCD, 0);
|
|
- encrypt_cycle3(RAB, RCD, 1);
|
|
- encrypt_cycle3(RAB, RCD, 2);
|
|
- encrypt_cycle3(RAB, RCD, 3);
|
|
- encrypt_cycle3(RAB, RCD, 4);
|
|
- encrypt_cycle3(RAB, RCD, 5);
|
|
- encrypt_cycle3(RAB, RCD, 6);
|
|
- encrypt_cycle3(RAB, RCD, 7);
|
|
+ push_cd();
|
|
+ encrypt_cycle3(RAB, CD, 0);
|
|
+ encrypt_cycle3(RAB, CD, 1);
|
|
+ encrypt_cycle3(RAB, CD, 2);
|
|
+ encrypt_cycle3(RAB, CD, 3);
|
|
+ encrypt_cycle3(RAB, CD, 4);
|
|
+ encrypt_cycle3(RAB, CD, 5);
|
|
+ encrypt_cycle3(RAB, CD, 6);
|
|
+ encrypt_cycle3(RAB, CD, 7);
|
|
+ pop_cd();
|
|
|
|
popq RIO; /* dst */
|
|
- popq %rbp; /* bool xor */
|
|
+ popq RT1; /* bool xor */
|
|
|
|
- testb %bpl, %bpl;
|
|
+ testb RT1bl, RT1bl;
|
|
jnz .L__enc_xor3;
|
|
|
|
outunpack_enc3(mov);
|
|
|
|
popq %rbx;
|
|
- popq %rbp;
|
|
popq %r12;
|
|
popq %r13;
|
|
- popq %r14;
|
|
- popq %r15;
|
|
ret;
|
|
|
|
.L__enc_xor3:
|
|
outunpack_enc3(xor);
|
|
|
|
popq %rbx;
|
|
- popq %rbp;
|
|
popq %r12;
|
|
popq %r13;
|
|
- popq %r14;
|
|
- popq %r15;
|
|
ret;
|
|
ENDPROC(__twofish_enc_blk_3way)
|
|
|
|
@@ -278,35 +290,31 @@ ENTRY(twofish_dec_blk_3way)
|
|
* %rsi: dst
|
|
* %rdx: src, RIO
|
|
*/
|
|
- pushq %r15;
|
|
- pushq %r14;
|
|
pushq %r13;
|
|
pushq %r12;
|
|
- pushq %rbp;
|
|
pushq %rbx;
|
|
|
|
pushq %rsi; /* dst */
|
|
|
|
inpack_dec3();
|
|
|
|
- decrypt_cycle3(RAB, RCD, 7);
|
|
- decrypt_cycle3(RAB, RCD, 6);
|
|
- decrypt_cycle3(RAB, RCD, 5);
|
|
- decrypt_cycle3(RAB, RCD, 4);
|
|
- decrypt_cycle3(RAB, RCD, 3);
|
|
- decrypt_cycle3(RAB, RCD, 2);
|
|
- decrypt_cycle3(RAB, RCD, 1);
|
|
- decrypt_cycle3(RAB, RCD, 0);
|
|
+ push_cd();
|
|
+ decrypt_cycle3(RAB, CD, 7);
|
|
+ decrypt_cycle3(RAB, CD, 6);
|
|
+ decrypt_cycle3(RAB, CD, 5);
|
|
+ decrypt_cycle3(RAB, CD, 4);
|
|
+ decrypt_cycle3(RAB, CD, 3);
|
|
+ decrypt_cycle3(RAB, CD, 2);
|
|
+ decrypt_cycle3(RAB, CD, 1);
|
|
+ decrypt_cycle3(RAB, CD, 0);
|
|
+ pop_cd();
|
|
|
|
popq RIO; /* dst */
|
|
|
|
outunpack_dec3();
|
|
|
|
popq %rbx;
|
|
- popq %rbp;
|
|
popq %r12;
|
|
popq %r13;
|
|
- popq %r14;
|
|
- popq %r15;
|
|
ret;
|
|
ENDPROC(twofish_dec_blk_3way)
|
|
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
|
|
index 9604b2574d6c..f73796db8758 100644
|
|
--- a/arch/x86/events/core.c
|
|
+++ b/arch/x86/events/core.c
|
|
@@ -190,8 +190,8 @@ static void release_pmc_hardware(void) {}
|
|
|
|
static bool check_hw_exists(void)
|
|
{
|
|
- u64 val, val_fail, val_new= ~0;
|
|
- int i, reg, reg_fail, ret = 0;
|
|
+ u64 val, val_fail = -1, val_new= ~0;
|
|
+ int i, reg, reg_fail = -1, ret = 0;
|
|
int bios_fail = 0;
|
|
int reg_safe = -1;
|
|
|
|
diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h
|
|
index 15eb75484cc0..98ccbd1dbb01 100644
|
|
--- a/arch/x86/include/asm/microcode_amd.h
|
|
+++ b/arch/x86/include/asm/microcode_amd.h
|
|
@@ -59,7 +59,6 @@ static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table,
|
|
|
|
extern int __apply_microcode_amd(struct microcode_amd *mc_amd);
|
|
extern int apply_microcode_amd(int cpu);
|
|
-extern enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size);
|
|
|
|
#define PATCH_MAX_SIZE PAGE_SIZE
|
|
|
|
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
|
|
index a002b07a7099..6899cf187ba2 100644
|
|
--- a/arch/x86/include/asm/vmx.h
|
|
+++ b/arch/x86/include/asm/vmx.h
|
|
@@ -399,10 +399,11 @@ enum vmcs_field {
|
|
#define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT (KVM_USER_MEM_SLOTS + 2)
|
|
|
|
#define VMX_NR_VPIDS (1 << 16)
|
|
+#define VMX_VPID_EXTENT_INDIVIDUAL_ADDR 0
|
|
#define VMX_VPID_EXTENT_SINGLE_CONTEXT 1
|
|
#define VMX_VPID_EXTENT_ALL_CONTEXT 2
|
|
+#define VMX_VPID_EXTENT_SINGLE_NON_GLOBAL 3
|
|
|
|
-#define VMX_EPT_EXTENT_INDIVIDUAL_ADDR 0
|
|
#define VMX_EPT_EXTENT_CONTEXT 1
|
|
#define VMX_EPT_EXTENT_GLOBAL 2
|
|
#define VMX_EPT_EXTENT_SHIFT 24
|
|
@@ -419,8 +420,10 @@ enum vmcs_field {
|
|
#define VMX_EPT_EXTENT_GLOBAL_BIT (1ull << 26)
|
|
|
|
#define VMX_VPID_INVVPID_BIT (1ull << 0) /* (32 - 32) */
|
|
+#define VMX_VPID_EXTENT_INDIVIDUAL_ADDR_BIT (1ull << 8) /* (40 - 32) */
|
|
#define VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT (1ull << 9) /* (41 - 32) */
|
|
#define VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT (1ull << 10) /* (42 - 32) */
|
|
+#define VMX_VPID_EXTENT_SINGLE_NON_GLOBAL_BIT (1ull << 11) /* (43 - 32) */
|
|
|
|
#define VMX_EPT_DEFAULT_GAW 3
|
|
#define VMX_EPT_MAX_GAW 0x4
|
|
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c
|
|
index 517619ea6498..99165b206df3 100644
|
|
--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c
|
|
+++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c
|
|
@@ -152,7 +152,6 @@ static void raise_mce(struct mce *m)
|
|
if (context == MCJ_CTX_RANDOM)
|
|
return;
|
|
|
|
-#ifdef CONFIG_X86_LOCAL_APIC
|
|
if (m->inject_flags & (MCJ_IRQ_BROADCAST | MCJ_NMI_BROADCAST)) {
|
|
unsigned long start;
|
|
int cpu;
|
|
@@ -192,9 +191,7 @@ static void raise_mce(struct mce *m)
|
|
raise_local();
|
|
put_cpu();
|
|
put_online_cpus();
|
|
- } else
|
|
-#endif
|
|
- {
|
|
+ } else {
|
|
preempt_disable();
|
|
raise_local();
|
|
preempt_enable();
|
|
diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c
|
|
index b74bb29db6b9..732bb03fcf91 100644
|
|
--- a/arch/x86/kernel/cpu/microcode/amd.c
|
|
+++ b/arch/x86/kernel/cpu/microcode/amd.c
|
|
@@ -135,6 +135,9 @@ static size_t compute_container_size(u8 *data, u32 total_size)
|
|
return size;
|
|
}
|
|
|
|
+static enum ucode_state
|
|
+load_microcode_amd(bool save, u8 family, const u8 *data, size_t size);
|
|
+
|
|
/*
|
|
* Early load occurs before we can vmalloc(). So we look for the microcode
|
|
* patch container file in initrd, traverse equivalent cpu table, look for a
|
|
@@ -451,7 +454,7 @@ int __init save_microcode_in_initrd_amd(void)
|
|
eax = cpuid_eax(0x00000001);
|
|
eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
|
|
|
|
- ret = load_microcode_amd(smp_processor_id(), eax, container, container_size);
|
|
+ ret = load_microcode_amd(true, eax, container, container_size);
|
|
if (ret != UCODE_OK)
|
|
retval = -EINVAL;
|
|
|
|
@@ -864,7 +867,8 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
|
|
return UCODE_OK;
|
|
}
|
|
|
|
-enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size)
|
|
+static enum ucode_state
|
|
+load_microcode_amd(bool save, u8 family, const u8 *data, size_t size)
|
|
{
|
|
enum ucode_state ret;
|
|
|
|
@@ -878,8 +882,8 @@ enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t s
|
|
|
|
#ifdef CONFIG_X86_32
|
|
/* save BSP's matching patch for early load */
|
|
- if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) {
|
|
- struct ucode_patch *p = find_patch(cpu);
|
|
+ if (save) {
|
|
+ struct ucode_patch *p = find_patch(0);
|
|
if (p) {
|
|
memset(amd_ucode_patch, 0, PATCH_MAX_SIZE);
|
|
memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data),
|
|
@@ -911,11 +915,12 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
|
|
{
|
|
char fw_name[36] = "amd-ucode/microcode_amd.bin";
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
+ bool bsp = c->cpu_index == boot_cpu_data.cpu_index;
|
|
enum ucode_state ret = UCODE_NFOUND;
|
|
const struct firmware *fw;
|
|
|
|
/* reload ucode container only on the boot cpu */
|
|
- if (!refresh_fw || c->cpu_index != boot_cpu_data.cpu_index)
|
|
+ if (!refresh_fw || !bsp)
|
|
return UCODE_OK;
|
|
|
|
if (c->x86 >= 0x15)
|
|
@@ -932,7 +937,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
|
|
goto fw_release;
|
|
}
|
|
|
|
- ret = load_microcode_amd(cpu, c->x86, fw->data, fw->size);
|
|
+ ret = load_microcode_amd(bsp, c->x86, fw->data, fw->size);
|
|
|
|
fw_release:
|
|
release_firmware(fw);
|
|
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
|
|
index 4b3012888ada..8a1d63591399 100644
|
|
--- a/arch/x86/kernel/vm86_32.c
|
|
+++ b/arch/x86/kernel/vm86_32.c
|
|
@@ -160,11 +160,12 @@ void save_v86_state(struct kernel_vm86_regs *regs, int retval)
|
|
|
|
static void mark_screen_rdonly(struct mm_struct *mm)
|
|
{
|
|
+ struct vm_area_struct *vma;
|
|
+ spinlock_t *ptl;
|
|
pgd_t *pgd;
|
|
pud_t *pud;
|
|
pmd_t *pmd;
|
|
pte_t *pte;
|
|
- spinlock_t *ptl;
|
|
int i;
|
|
|
|
down_write(&mm->mmap_sem);
|
|
@@ -177,7 +178,7 @@ static void mark_screen_rdonly(struct mm_struct *mm)
|
|
pmd = pmd_offset(pud, 0xA0000);
|
|
|
|
if (pmd_trans_huge(*pmd)) {
|
|
- struct vm_area_struct *vma = find_vma(mm, 0xA0000);
|
|
+ vma = find_vma(mm, 0xA0000);
|
|
split_huge_pmd(vma, pmd, 0xA0000);
|
|
}
|
|
if (pmd_none_or_clear_bad(pmd))
|
|
diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig
|
|
index ab8e32f7b9a8..9150e09773cb 100644
|
|
--- a/arch/x86/kvm/Kconfig
|
|
+++ b/arch/x86/kvm/Kconfig
|
|
@@ -22,7 +22,8 @@ config KVM
|
|
depends on HAVE_KVM
|
|
depends on HIGH_RES_TIMERS
|
|
# for TASKSTATS/TASK_DELAY_ACCT:
|
|
- depends on NET
|
|
+ depends on NET && MULTIUSER
|
|
+ depends on X86_LOCAL_APIC
|
|
select PREEMPT_NOTIFIERS
|
|
select MMU_NOTIFIER
|
|
select ANON_INODES
|
|
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
|
index 1e16821c1378..c51aaac953b4 100644
|
|
--- a/arch/x86/kvm/vmx.c
|
|
+++ b/arch/x86/kvm/vmx.c
|
|
@@ -142,6 +142,12 @@ module_param_named(preemption_timer, enable_preemption_timer, bool, S_IRUGO);
|
|
|
|
#define VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE 5
|
|
|
|
+#define VMX_VPID_EXTENT_SUPPORTED_MASK \
|
|
+ (VMX_VPID_EXTENT_INDIVIDUAL_ADDR_BIT | \
|
|
+ VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT | \
|
|
+ VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT | \
|
|
+ VMX_VPID_EXTENT_SINGLE_NON_GLOBAL_BIT)
|
|
+
|
|
/*
|
|
* These 2 parameters are used to config the controls for Pause-Loop Exiting:
|
|
* ple_gap: upper bound on the amount of time between two successive
|
|
@@ -2839,8 +2845,7 @@ static void nested_vmx_setup_ctls_msrs(struct vcpu_vmx *vmx)
|
|
*/
|
|
if (enable_vpid)
|
|
vmx->nested.nested_vmx_vpid_caps = VMX_VPID_INVVPID_BIT |
|
|
- VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT |
|
|
- VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT;
|
|
+ VMX_VPID_EXTENT_SUPPORTED_MASK;
|
|
else
|
|
vmx->nested.nested_vmx_vpid_caps = 0;
|
|
|
|
@@ -7685,7 +7690,8 @@ static int handle_invvpid(struct kvm_vcpu *vcpu)
|
|
vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO);
|
|
type = kvm_register_readl(vcpu, (vmx_instruction_info >> 28) & 0xf);
|
|
|
|
- types = (vmx->nested.nested_vmx_vpid_caps >> 8) & 0x7;
|
|
+ types = (vmx->nested.nested_vmx_vpid_caps &
|
|
+ VMX_VPID_EXTENT_SUPPORTED_MASK) >> 8;
|
|
|
|
if (type >= 32 || !(types & (1 << type))) {
|
|
nested_vmx_failValid(vcpu,
|
|
@@ -7707,21 +7713,27 @@ static int handle_invvpid(struct kvm_vcpu *vcpu)
|
|
}
|
|
|
|
switch (type) {
|
|
+ case VMX_VPID_EXTENT_INDIVIDUAL_ADDR:
|
|
case VMX_VPID_EXTENT_SINGLE_CONTEXT:
|
|
- /*
|
|
- * Old versions of KVM use the single-context version so we
|
|
- * have to support it; just treat it the same as all-context.
|
|
- */
|
|
+ case VMX_VPID_EXTENT_SINGLE_NON_GLOBAL:
|
|
+ if (!vpid) {
|
|
+ nested_vmx_failValid(vcpu,
|
|
+ VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
|
|
+ skip_emulated_instruction(vcpu);
|
|
+ return 1;
|
|
+ }
|
|
+ break;
|
|
case VMX_VPID_EXTENT_ALL_CONTEXT:
|
|
- __vmx_flush_tlb(vcpu, to_vmx(vcpu)->nested.vpid02);
|
|
- nested_vmx_succeed(vcpu);
|
|
break;
|
|
default:
|
|
- /* Trap individual address invalidation invvpid calls */
|
|
- BUG_ON(1);
|
|
- break;
|
|
+ WARN_ON_ONCE(1);
|
|
+ skip_emulated_instruction(vcpu);
|
|
+ return 1;
|
|
}
|
|
|
|
+ __vmx_flush_tlb(vcpu, vmx->nested.vpid02);
|
|
+ nested_vmx_succeed(vcpu);
|
|
+
|
|
skip_emulated_instruction(vcpu);
|
|
return 1;
|
|
}
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 75f756eac979..4b19ec1da22d 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -2847,6 +2847,12 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
|
kvm_x86_ops->vcpu_put(vcpu);
|
|
kvm_put_guest_fpu(vcpu);
|
|
vcpu->arch.last_host_tsc = rdtsc();
|
|
+ /*
|
|
+ * If userspace has set any breakpoints or watchpoints, dr6 is restored
|
|
+ * on every vmexit, but if not, we might have a stale dr6 from the
|
|
+ * guest. do_debug expects dr6 to be cleared after it runs, do the same.
|
|
+ */
|
|
+ set_debugreg(0, 6);
|
|
}
|
|
|
|
static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu,
|
|
@@ -8421,6 +8427,13 @@ static int apf_put_user(struct kvm_vcpu *vcpu, u32 val)
|
|
sizeof(val));
|
|
}
|
|
|
|
+static int apf_get_user(struct kvm_vcpu *vcpu, u32 *val)
|
|
+{
|
|
+
|
|
+ return kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apf.data, val,
|
|
+ sizeof(u32));
|
|
+}
|
|
+
|
|
void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
|
|
struct kvm_async_pf *work)
|
|
{
|
|
@@ -8447,6 +8460,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
|
|
struct kvm_async_pf *work)
|
|
{
|
|
struct x86_exception fault;
|
|
+ u32 val;
|
|
|
|
if (work->wakeup_all)
|
|
work->arch.token = ~0; /* broadcast wakeup */
|
|
@@ -8454,14 +8468,24 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
|
|
kvm_del_async_pf_gfn(vcpu, work->arch.gfn);
|
|
trace_kvm_async_pf_ready(work->arch.token, work->gva);
|
|
|
|
- if ((vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) &&
|
|
- !apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
|
|
- fault.vector = PF_VECTOR;
|
|
- fault.error_code_valid = true;
|
|
- fault.error_code = 0;
|
|
- fault.nested_page_fault = false;
|
|
- fault.address = work->arch.token;
|
|
- kvm_inject_page_fault(vcpu, &fault);
|
|
+ if (vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED &&
|
|
+ !apf_get_user(vcpu, &val)) {
|
|
+ if (val == KVM_PV_REASON_PAGE_NOT_PRESENT &&
|
|
+ vcpu->arch.exception.pending &&
|
|
+ vcpu->arch.exception.nr == PF_VECTOR &&
|
|
+ !apf_put_user(vcpu, 0)) {
|
|
+ vcpu->arch.exception.pending = false;
|
|
+ vcpu->arch.exception.nr = 0;
|
|
+ vcpu->arch.exception.has_error_code = false;
|
|
+ vcpu->arch.exception.error_code = 0;
|
|
+ } else if (!apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
|
|
+ fault.vector = PF_VECTOR;
|
|
+ fault.error_code_valid = true;
|
|
+ fault.error_code = 0;
|
|
+ fault.nested_page_fault = false;
|
|
+ fault.address = work->arch.token;
|
|
+ kvm_inject_page_fault(vcpu, &fault);
|
|
+ }
|
|
}
|
|
vcpu->arch.apf.halted = false;
|
|
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
|
diff --git a/arch/x86/math-emu/Makefile b/arch/x86/math-emu/Makefile
|
|
index 9b0c63b60302..1b2dac174321 100644
|
|
--- a/arch/x86/math-emu/Makefile
|
|
+++ b/arch/x86/math-emu/Makefile
|
|
@@ -5,8 +5,8 @@
|
|
#DEBUG = -DDEBUGGING
|
|
DEBUG =
|
|
PARANOID = -DPARANOID
|
|
-EXTRA_CFLAGS := $(PARANOID) $(DEBUG) -fno-builtin $(MATH_EMULATION)
|
|
-EXTRA_AFLAGS := $(PARANOID)
|
|
+ccflags-y += $(PARANOID) $(DEBUG) -fno-builtin $(MATH_EMULATION)
|
|
+asflags-y += $(PARANOID)
|
|
|
|
# From 'C' language sources:
|
|
C_OBJS =fpu_entry.o errors.o \
|
|
diff --git a/arch/x86/math-emu/reg_compare.c b/arch/x86/math-emu/reg_compare.c
|
|
index b77360fdbf4a..19b33b50adfa 100644
|
|
--- a/arch/x86/math-emu/reg_compare.c
|
|
+++ b/arch/x86/math-emu/reg_compare.c
|
|
@@ -168,7 +168,7 @@ static int compare(FPU_REG const *b, int tagb)
|
|
/* This function requires that st(0) is not empty */
|
|
int FPU_compare_st_data(FPU_REG const *loaded_data, u_char loaded_tag)
|
|
{
|
|
- int f = 0, c;
|
|
+ int f, c;
|
|
|
|
c = compare(loaded_data, loaded_tag);
|
|
|
|
@@ -189,12 +189,12 @@ int FPU_compare_st_data(FPU_REG const *loaded_data, u_char loaded_tag)
|
|
case COMP_No_Comp:
|
|
f = SW_C3 | SW_C2 | SW_C0;
|
|
break;
|
|
-#ifdef PARANOID
|
|
default:
|
|
+#ifdef PARANOID
|
|
EXCEPTION(EX_INTERNAL | 0x121);
|
|
+#endif /* PARANOID */
|
|
f = SW_C3 | SW_C2 | SW_C0;
|
|
break;
|
|
-#endif /* PARANOID */
|
|
}
|
|
setcc(f);
|
|
if (c & COMP_Denormal) {
|
|
@@ -205,7 +205,7 @@ int FPU_compare_st_data(FPU_REG const *loaded_data, u_char loaded_tag)
|
|
|
|
static int compare_st_st(int nr)
|
|
{
|
|
- int f = 0, c;
|
|
+ int f, c;
|
|
FPU_REG *st_ptr;
|
|
|
|
if (!NOT_EMPTY(0) || !NOT_EMPTY(nr)) {
|
|
@@ -235,12 +235,12 @@ static int compare_st_st(int nr)
|
|
case COMP_No_Comp:
|
|
f = SW_C3 | SW_C2 | SW_C0;
|
|
break;
|
|
-#ifdef PARANOID
|
|
default:
|
|
+#ifdef PARANOID
|
|
EXCEPTION(EX_INTERNAL | 0x122);
|
|
+#endif /* PARANOID */
|
|
f = SW_C3 | SW_C2 | SW_C0;
|
|
break;
|
|
-#endif /* PARANOID */
|
|
}
|
|
setcc(f);
|
|
if (c & COMP_Denormal) {
|
|
@@ -283,12 +283,12 @@ static int compare_i_st_st(int nr)
|
|
case COMP_No_Comp:
|
|
f = X86_EFLAGS_ZF | X86_EFLAGS_PF | X86_EFLAGS_CF;
|
|
break;
|
|
-#ifdef PARANOID
|
|
default:
|
|
+#ifdef PARANOID
|
|
EXCEPTION(EX_INTERNAL | 0x122);
|
|
+#endif /* PARANOID */
|
|
f = 0;
|
|
break;
|
|
-#endif /* PARANOID */
|
|
}
|
|
FPU_EFLAGS = (FPU_EFLAGS & ~(X86_EFLAGS_ZF | X86_EFLAGS_PF | X86_EFLAGS_CF)) | f;
|
|
if (c & COMP_Denormal) {
|
|
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
|
|
index 7aaa2635862d..ecae9ac216fa 100644
|
|
--- a/arch/x86/mm/ioremap.c
|
|
+++ b/arch/x86/mm/ioremap.c
|
|
@@ -347,11 +347,11 @@ void iounmap(volatile void __iomem *addr)
|
|
(void __force *)addr < phys_to_virt(ISA_END_ADDRESS))
|
|
return;
|
|
|
|
+ mmiotrace_iounmap(addr);
|
|
+
|
|
addr = (volatile void __iomem *)
|
|
(PAGE_MASK & (unsigned long __force)addr);
|
|
|
|
- mmiotrace_iounmap(addr);
|
|
-
|
|
/* Use the vm area unlocked, assuming the caller
|
|
ensures there isn't another iounmap for the same address
|
|
in parallel. Reuse of the virtual address is prevented by
|
|
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c
|
|
index afc47f5c9531..cadb82be5f36 100644
|
|
--- a/arch/x86/mm/kmmio.c
|
|
+++ b/arch/x86/mm/kmmio.c
|
|
@@ -434,17 +434,18 @@ int register_kmmio_probe(struct kmmio_probe *p)
|
|
unsigned long flags;
|
|
int ret = 0;
|
|
unsigned long size = 0;
|
|
+ unsigned long addr = p->addr & PAGE_MASK;
|
|
const unsigned long size_lim = p->len + (p->addr & ~PAGE_MASK);
|
|
unsigned int l;
|
|
pte_t *pte;
|
|
|
|
spin_lock_irqsave(&kmmio_lock, flags);
|
|
- if (get_kmmio_probe(p->addr)) {
|
|
+ if (get_kmmio_probe(addr)) {
|
|
ret = -EEXIST;
|
|
goto out;
|
|
}
|
|
|
|
- pte = lookup_address(p->addr, &l);
|
|
+ pte = lookup_address(addr, &l);
|
|
if (!pte) {
|
|
ret = -EINVAL;
|
|
goto out;
|
|
@@ -453,7 +454,7 @@ int register_kmmio_probe(struct kmmio_probe *p)
|
|
kmmio_count++;
|
|
list_add_rcu(&p->list, &kmmio_probes);
|
|
while (size < size_lim) {
|
|
- if (add_kmmio_fault_page(p->addr + size))
|
|
+ if (add_kmmio_fault_page(addr + size))
|
|
pr_err("Unable to set page fault.\n");
|
|
size += page_level_size(l);
|
|
}
|
|
@@ -527,19 +528,20 @@ void unregister_kmmio_probe(struct kmmio_probe *p)
|
|
{
|
|
unsigned long flags;
|
|
unsigned long size = 0;
|
|
+ unsigned long addr = p->addr & PAGE_MASK;
|
|
const unsigned long size_lim = p->len + (p->addr & ~PAGE_MASK);
|
|
struct kmmio_fault_page *release_list = NULL;
|
|
struct kmmio_delayed_release *drelease;
|
|
unsigned int l;
|
|
pte_t *pte;
|
|
|
|
- pte = lookup_address(p->addr, &l);
|
|
+ pte = lookup_address(addr, &l);
|
|
if (!pte)
|
|
return;
|
|
|
|
spin_lock_irqsave(&kmmio_lock, flags);
|
|
while (size < size_lim) {
|
|
- release_kmmio_fault_page(p->addr + size, &release_list);
|
|
+ release_kmmio_fault_page(addr + size, &release_list);
|
|
size += page_level_size(l);
|
|
}
|
|
list_del_rcu(&p->list);
|
|
diff --git a/block/blk-map.c b/block/blk-map.c
|
|
index 27fd8d92892d..a8b4f526d8bb 100644
|
|
--- a/block/blk-map.c
|
|
+++ b/block/blk-map.c
|
|
@@ -116,7 +116,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
|
unsigned long align = q->dma_pad_mask | queue_dma_alignment(q);
|
|
struct bio *bio = NULL;
|
|
struct iov_iter i;
|
|
- int ret;
|
|
+ int ret = -EINVAL;
|
|
|
|
if (!iter_is_iovec(iter))
|
|
goto fail;
|
|
@@ -145,7 +145,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
|
__blk_rq_unmap_user(bio);
|
|
fail:
|
|
rq->bio = NULL;
|
|
- return -EINVAL;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(blk_rq_map_user_iov);
|
|
|
|
diff --git a/crypto/ahash.c b/crypto/ahash.c
|
|
index f3fa104de479..14402ef6d826 100644
|
|
--- a/crypto/ahash.c
|
|
+++ b/crypto/ahash.c
|
|
@@ -192,11 +192,18 @@ int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|
unsigned int keylen)
|
|
{
|
|
unsigned long alignmask = crypto_ahash_alignmask(tfm);
|
|
+ int err;
|
|
|
|
if ((unsigned long)key & alignmask)
|
|
- return ahash_setkey_unaligned(tfm, key, keylen);
|
|
+ err = ahash_setkey_unaligned(tfm, key, keylen);
|
|
+ else
|
|
+ err = tfm->setkey(tfm, key, keylen);
|
|
+
|
|
+ if (err)
|
|
+ return err;
|
|
|
|
- return tfm->setkey(tfm, key, keylen);
|
|
+ crypto_ahash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
|
|
+ return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(crypto_ahash_setkey);
|
|
|
|
@@ -369,7 +376,12 @@ EXPORT_SYMBOL_GPL(crypto_ahash_finup);
|
|
|
|
int crypto_ahash_digest(struct ahash_request *req)
|
|
{
|
|
- return crypto_ahash_op(req, crypto_ahash_reqtfm(req)->digest);
|
|
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
|
+
|
|
+ if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
+ return crypto_ahash_op(req, tfm->digest);
|
|
}
|
|
EXPORT_SYMBOL_GPL(crypto_ahash_digest);
|
|
|
|
@@ -455,7 +467,6 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
|
|
struct ahash_alg *alg = crypto_ahash_alg(hash);
|
|
|
|
hash->setkey = ahash_nosetkey;
|
|
- hash->has_setkey = false;
|
|
hash->export = ahash_no_export;
|
|
hash->import = ahash_no_import;
|
|
|
|
@@ -470,7 +481,8 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
|
|
|
|
if (alg->setkey) {
|
|
hash->setkey = alg->setkey;
|
|
- hash->has_setkey = true;
|
|
+ if (!(alg->halg.base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
|
|
+ crypto_ahash_set_flags(hash, CRYPTO_TFM_NEED_KEY);
|
|
}
|
|
if (alg->export)
|
|
hash->export = alg->export;
|
|
diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
|
|
index 54fc90e8339c..731b5fb8567b 100644
|
|
--- a/crypto/algif_hash.c
|
|
+++ b/crypto/algif_hash.c
|
|
@@ -34,11 +34,6 @@ struct hash_ctx {
|
|
struct ahash_request req;
|
|
};
|
|
|
|
-struct algif_hash_tfm {
|
|
- struct crypto_ahash *hash;
|
|
- bool has_key;
|
|
-};
|
|
-
|
|
static int hash_alloc_result(struct sock *sk, struct hash_ctx *ctx)
|
|
{
|
|
unsigned ds;
|
|
@@ -308,7 +303,7 @@ static int hash_check_key(struct socket *sock)
|
|
int err = 0;
|
|
struct sock *psk;
|
|
struct alg_sock *pask;
|
|
- struct algif_hash_tfm *tfm;
|
|
+ struct crypto_ahash *tfm;
|
|
struct sock *sk = sock->sk;
|
|
struct alg_sock *ask = alg_sk(sk);
|
|
|
|
@@ -322,7 +317,7 @@ static int hash_check_key(struct socket *sock)
|
|
|
|
err = -ENOKEY;
|
|
lock_sock_nested(psk, SINGLE_DEPTH_NESTING);
|
|
- if (!tfm->has_key)
|
|
+ if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
goto unlock;
|
|
|
|
if (!pask->refcnt++)
|
|
@@ -413,41 +408,17 @@ static struct proto_ops algif_hash_ops_nokey = {
|
|
|
|
static void *hash_bind(const char *name, u32 type, u32 mask)
|
|
{
|
|
- struct algif_hash_tfm *tfm;
|
|
- struct crypto_ahash *hash;
|
|
-
|
|
- tfm = kzalloc(sizeof(*tfm), GFP_KERNEL);
|
|
- if (!tfm)
|
|
- return ERR_PTR(-ENOMEM);
|
|
-
|
|
- hash = crypto_alloc_ahash(name, type, mask);
|
|
- if (IS_ERR(hash)) {
|
|
- kfree(tfm);
|
|
- return ERR_CAST(hash);
|
|
- }
|
|
-
|
|
- tfm->hash = hash;
|
|
-
|
|
- return tfm;
|
|
+ return crypto_alloc_ahash(name, type, mask);
|
|
}
|
|
|
|
static void hash_release(void *private)
|
|
{
|
|
- struct algif_hash_tfm *tfm = private;
|
|
-
|
|
- crypto_free_ahash(tfm->hash);
|
|
- kfree(tfm);
|
|
+ crypto_free_ahash(private);
|
|
}
|
|
|
|
static int hash_setkey(void *private, const u8 *key, unsigned int keylen)
|
|
{
|
|
- struct algif_hash_tfm *tfm = private;
|
|
- int err;
|
|
-
|
|
- err = crypto_ahash_setkey(tfm->hash, key, keylen);
|
|
- tfm->has_key = !err;
|
|
-
|
|
- return err;
|
|
+ return crypto_ahash_setkey(private, key, keylen);
|
|
}
|
|
|
|
static void hash_sock_destruct(struct sock *sk)
|
|
@@ -462,11 +433,10 @@ static void hash_sock_destruct(struct sock *sk)
|
|
|
|
static int hash_accept_parent_nokey(void *private, struct sock *sk)
|
|
{
|
|
- struct hash_ctx *ctx;
|
|
+ struct crypto_ahash *tfm = private;
|
|
struct alg_sock *ask = alg_sk(sk);
|
|
- struct algif_hash_tfm *tfm = private;
|
|
- struct crypto_ahash *hash = tfm->hash;
|
|
- unsigned len = sizeof(*ctx) + crypto_ahash_reqsize(hash);
|
|
+ struct hash_ctx *ctx;
|
|
+ unsigned int len = sizeof(*ctx) + crypto_ahash_reqsize(tfm);
|
|
|
|
ctx = sock_kmalloc(sk, len, GFP_KERNEL);
|
|
if (!ctx)
|
|
@@ -479,7 +449,7 @@ static int hash_accept_parent_nokey(void *private, struct sock *sk)
|
|
|
|
ask->private = ctx;
|
|
|
|
- ahash_request_set_tfm(&ctx->req, hash);
|
|
+ ahash_request_set_tfm(&ctx->req, tfm);
|
|
ahash_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
|
af_alg_complete, &ctx->completion);
|
|
|
|
@@ -490,9 +460,9 @@ static int hash_accept_parent_nokey(void *private, struct sock *sk)
|
|
|
|
static int hash_accept_parent(void *private, struct sock *sk)
|
|
{
|
|
- struct algif_hash_tfm *tfm = private;
|
|
+ struct crypto_ahash *tfm = private;
|
|
|
|
- if (!tfm->has_key && crypto_ahash_has_setkey(tfm->hash))
|
|
+ if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
return -ENOKEY;
|
|
|
|
return hash_accept_parent_nokey(private, sk);
|
|
diff --git a/crypto/crc32_generic.c b/crypto/crc32_generic.c
|
|
index aa2a25fc7482..718cbce8d169 100644
|
|
--- a/crypto/crc32_generic.c
|
|
+++ b/crypto/crc32_generic.c
|
|
@@ -133,6 +133,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32",
|
|
.cra_driver_name = "crc32-generic",
|
|
.cra_priority = 100,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/crypto/crc32c_generic.c b/crypto/crc32c_generic.c
|
|
index 4c0a0e271876..372320399622 100644
|
|
--- a/crypto/crc32c_generic.c
|
|
+++ b/crypto/crc32c_generic.c
|
|
@@ -146,6 +146,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "crc32c",
|
|
.cra_driver_name = "crc32c-generic",
|
|
.cra_priority = 100,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_alignmask = 3,
|
|
.cra_ctxsize = sizeof(struct chksum_ctx),
|
|
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
|
|
index af9ad45d1909..9b66ce7e728d 100644
|
|
--- a/crypto/cryptd.c
|
|
+++ b/crypto/cryptd.c
|
|
@@ -673,10 +673,9 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|
if (err)
|
|
goto out_free_inst;
|
|
|
|
- type = CRYPTO_ALG_ASYNC;
|
|
- if (alg->cra_flags & CRYPTO_ALG_INTERNAL)
|
|
- type |= CRYPTO_ALG_INTERNAL;
|
|
- inst->alg.halg.base.cra_flags = type;
|
|
+ inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC |
|
|
+ (alg->cra_flags & (CRYPTO_ALG_INTERNAL |
|
|
+ CRYPTO_ALG_OPTIONAL_KEY));
|
|
|
|
inst->alg.halg.digestsize = salg->digestsize;
|
|
inst->alg.halg.statesize = salg->statesize;
|
|
diff --git a/crypto/mcryptd.c b/crypto/mcryptd.c
|
|
index 6e9389c8bfbd..7406ed0745be 100644
|
|
--- a/crypto/mcryptd.c
|
|
+++ b/crypto/mcryptd.c
|
|
@@ -516,10 +516,9 @@ static int mcryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|
if (err)
|
|
goto out_free_inst;
|
|
|
|
- type = CRYPTO_ALG_ASYNC;
|
|
- if (alg->cra_flags & CRYPTO_ALG_INTERNAL)
|
|
- type |= CRYPTO_ALG_INTERNAL;
|
|
- inst->alg.halg.base.cra_flags = type;
|
|
+ inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC |
|
|
+ (alg->cra_flags & (CRYPTO_ALG_INTERNAL |
|
|
+ CRYPTO_ALG_OPTIONAL_KEY));
|
|
|
|
inst->alg.halg.digestsize = halg->digestsize;
|
|
inst->alg.halg.statesize = halg->statesize;
|
|
diff --git a/crypto/shash.c b/crypto/shash.c
|
|
index 9bd5044d467b..d5bd2f05d036 100644
|
|
--- a/crypto/shash.c
|
|
+++ b/crypto/shash.c
|
|
@@ -57,11 +57,18 @@ int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
{
|
|
struct shash_alg *shash = crypto_shash_alg(tfm);
|
|
unsigned long alignmask = crypto_shash_alignmask(tfm);
|
|
+ int err;
|
|
|
|
if ((unsigned long)key & alignmask)
|
|
- return shash_setkey_unaligned(tfm, key, keylen);
|
|
+ err = shash_setkey_unaligned(tfm, key, keylen);
|
|
+ else
|
|
+ err = shash->setkey(tfm, key, keylen);
|
|
+
|
|
+ if (err)
|
|
+ return err;
|
|
|
|
- return shash->setkey(tfm, key, keylen);
|
|
+ crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
|
|
+ return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(crypto_shash_setkey);
|
|
|
|
@@ -180,6 +187,9 @@ int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
|
|
struct shash_alg *shash = crypto_shash_alg(tfm);
|
|
unsigned long alignmask = crypto_shash_alignmask(tfm);
|
|
|
|
+ if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
if (((unsigned long)data | (unsigned long)out) & alignmask)
|
|
return shash_digest_unaligned(desc, data, len, out);
|
|
|
|
@@ -359,7 +369,8 @@ int crypto_init_shash_ops_async(struct crypto_tfm *tfm)
|
|
crt->digest = shash_async_digest;
|
|
crt->setkey = shash_async_setkey;
|
|
|
|
- crt->has_setkey = alg->setkey != shash_no_setkey;
|
|
+ crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) &
|
|
+ CRYPTO_TFM_NEED_KEY);
|
|
|
|
if (alg->export)
|
|
crt->export = shash_async_export;
|
|
@@ -374,8 +385,14 @@ int crypto_init_shash_ops_async(struct crypto_tfm *tfm)
|
|
static int crypto_shash_init_tfm(struct crypto_tfm *tfm)
|
|
{
|
|
struct crypto_shash *hash = __crypto_shash_cast(tfm);
|
|
+ struct shash_alg *alg = crypto_shash_alg(hash);
|
|
+
|
|
+ hash->descsize = alg->descsize;
|
|
+
|
|
+ if (crypto_shash_alg_has_setkey(alg) &&
|
|
+ !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
|
|
+ crypto_shash_set_flags(hash, CRYPTO_TFM_NEED_KEY);
|
|
|
|
- hash->descsize = crypto_shash_alg(hash)->descsize;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/Makefile b/drivers/Makefile
|
|
index 733bf0b2613f..7c3d58dcf6b3 100644
|
|
--- a/drivers/Makefile
|
|
+++ b/drivers/Makefile
|
|
@@ -99,6 +99,7 @@ obj-$(CONFIG_TC) += tc/
|
|
obj-$(CONFIG_UWB) += uwb/
|
|
obj-$(CONFIG_USB_PHY) += usb/
|
|
obj-$(CONFIG_USB) += usb/
|
|
+obj-$(CONFIG_USB_SUPPORT) += usb/
|
|
obj-$(CONFIG_PCI) += usb/
|
|
obj-$(CONFIG_USB_GADGET) += usb/
|
|
obj-$(CONFIG_OF) += usb/
|
|
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
|
|
index 15009b2b33c7..3b6ac80b2127 100644
|
|
--- a/drivers/android/binder.c
|
|
+++ b/drivers/android/binder.c
|
|
@@ -2628,6 +2628,8 @@ static unsigned int binder_poll(struct file *filp,
|
|
binder_lock(__func__);
|
|
|
|
thread = binder_get_thread(proc);
|
|
+ if (!thread)
|
|
+ return POLLERR;
|
|
|
|
wait_for_proc_work = thread->transaction_stack == NULL &&
|
|
list_empty(&thread->todo) && thread->return_error == BR_OK;
|
|
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
|
|
index e32badd26c8a..343cad9bf7e7 100644
|
|
--- a/drivers/block/rbd.c
|
|
+++ b/drivers/block/rbd.c
|
|
@@ -3756,7 +3756,7 @@ static void rbd_watch_cb(void *arg, u64 notify_id, u64 cookie,
|
|
struct rbd_device *rbd_dev = arg;
|
|
void *p = data;
|
|
void *const end = p + data_len;
|
|
- u8 struct_v;
|
|
+ u8 struct_v = 0;
|
|
u32 len;
|
|
u32 notify_op;
|
|
int ret;
|
|
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
|
|
index 19480bcc7046..2f29ee1a4d00 100644
|
|
--- a/drivers/clk/meson/Kconfig
|
|
+++ b/drivers/clk/meson/Kconfig
|
|
@@ -14,6 +14,7 @@ config COMMON_CLK_MESON8B
|
|
config COMMON_CLK_GXBB
|
|
bool
|
|
depends on COMMON_CLK_AMLOGIC
|
|
+ select RESET_CONTROLLER
|
|
help
|
|
Support for the clock controller on AmLogic S905 devices, aka gxbb.
|
|
Say Y if you want peripherals and CPU frequency scaling to work.
|
|
diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig
|
|
index 254d9526c018..4e8e9bc8f3e5 100644
|
|
--- a/drivers/clk/sunxi-ng/Kconfig
|
|
+++ b/drivers/clk/sunxi-ng/Kconfig
|
|
@@ -1,6 +1,7 @@
|
|
config SUNXI_CCU
|
|
bool "Clock support for Allwinner SoCs"
|
|
depends on ARCH_SUNXI || COMPILE_TEST
|
|
+ select RESET_CONTROLLER
|
|
default ARCH_SUNXI
|
|
|
|
if SUNXI_CCU
|
|
diff --git a/drivers/crypto/bfin_crc.c b/drivers/crypto/bfin_crc.c
|
|
index 10db7df366c8..2ee11802992f 100644
|
|
--- a/drivers/crypto/bfin_crc.c
|
|
+++ b/drivers/crypto/bfin_crc.c
|
|
@@ -494,7 +494,8 @@ static struct ahash_alg algs = {
|
|
.cra_driver_name = DRIVER_NAME,
|
|
.cra_priority = 100,
|
|
.cra_flags = CRYPTO_ALG_TYPE_AHASH |
|
|
- CRYPTO_ALG_ASYNC,
|
|
+ CRYPTO_ALG_ASYNC |
|
|
+ CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct bfin_crypto_crc_ctx),
|
|
.cra_alignmask = 3,
|
|
diff --git a/drivers/crypto/s5p-sss.c b/drivers/crypto/s5p-sss.c
|
|
index a668286d62cb..500e4090e2fd 100644
|
|
--- a/drivers/crypto/s5p-sss.c
|
|
+++ b/drivers/crypto/s5p-sss.c
|
|
@@ -542,15 +542,21 @@ static void s5p_aes_crypt_start(struct s5p_aes_dev *dev, unsigned long mode)
|
|
uint32_t aes_control;
|
|
unsigned long flags;
|
|
int err;
|
|
+ u8 *iv;
|
|
|
|
aes_control = SSS_AES_KEY_CHANGE_MODE;
|
|
if (mode & FLAGS_AES_DECRYPT)
|
|
aes_control |= SSS_AES_MODE_DECRYPT;
|
|
|
|
- if ((mode & FLAGS_AES_MODE_MASK) == FLAGS_AES_CBC)
|
|
+ if ((mode & FLAGS_AES_MODE_MASK) == FLAGS_AES_CBC) {
|
|
aes_control |= SSS_AES_CHAIN_MODE_CBC;
|
|
- else if ((mode & FLAGS_AES_MODE_MASK) == FLAGS_AES_CTR)
|
|
+ iv = req->info;
|
|
+ } else if ((mode & FLAGS_AES_MODE_MASK) == FLAGS_AES_CTR) {
|
|
aes_control |= SSS_AES_CHAIN_MODE_CTR;
|
|
+ iv = req->info;
|
|
+ } else {
|
|
+ iv = NULL; /* AES_ECB */
|
|
+ }
|
|
|
|
if (dev->ctx->keylen == AES_KEYSIZE_192)
|
|
aes_control |= SSS_AES_KEY_SIZE_192;
|
|
@@ -581,7 +587,7 @@ static void s5p_aes_crypt_start(struct s5p_aes_dev *dev, unsigned long mode)
|
|
goto outdata_error;
|
|
|
|
SSS_AES_WRITE(dev, AES_CONTROL, aes_control);
|
|
- s5p_set_aes(dev, dev->ctx->aes_key, req->info, dev->ctx->keylen);
|
|
+ s5p_set_aes(dev, dev->ctx->aes_key, iv, dev->ctx->keylen);
|
|
|
|
s5p_set_dma_indata(dev, dev->sg_src);
|
|
s5p_set_dma_outdata(dev, dev->sg_dst);
|
|
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
|
|
index 1c8d79d93098..42c060c7ae15 100644
|
|
--- a/drivers/crypto/talitos.c
|
|
+++ b/drivers/crypto/talitos.c
|
|
@@ -1124,6 +1124,11 @@ int talitos_sg_map(struct device *dev, struct scatterlist *src,
|
|
struct talitos_private *priv = dev_get_drvdata(dev);
|
|
bool is_sec1 = has_ftr_sec1(priv);
|
|
|
|
+ if (!src) {
|
|
+ *ptr = zero_entry;
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
to_talitos_ptr_len(ptr, len, is_sec1);
|
|
to_talitos_ptr_ext_set(ptr, 0, is_sec1);
|
|
|
|
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
|
|
index a4c8f80db29d..e2cec5b357fd 100644
|
|
--- a/drivers/dma/at_hdmac.c
|
|
+++ b/drivers/dma/at_hdmac.c
|
|
@@ -709,7 +709,7 @@ atc_prep_dma_interleaved(struct dma_chan *chan,
|
|
unsigned long flags)
|
|
{
|
|
struct at_dma_chan *atchan = to_at_dma_chan(chan);
|
|
- struct data_chunk *first = xt->sgl;
|
|
+ struct data_chunk *first;
|
|
struct at_desc *desc = NULL;
|
|
size_t xfer_count;
|
|
unsigned int dwidth;
|
|
@@ -721,6 +721,8 @@ atc_prep_dma_interleaved(struct dma_chan *chan,
|
|
if (unlikely(!xt || xt->numf != 1 || !xt->frame_size))
|
|
return NULL;
|
|
|
|
+ first = xt->sgl;
|
|
+
|
|
dev_info(chan2dev(chan),
|
|
"%s: src=%pad, dest=%pad, numf=%d, frame_size=%d, flags=0x%lx\n",
|
|
__func__, &xt->src_start, &xt->dst_start, xt->numf,
|
|
diff --git a/drivers/dma/dma-jz4740.c b/drivers/dma/dma-jz4740.c
|
|
index d50273fed715..afd5e10f8927 100644
|
|
--- a/drivers/dma/dma-jz4740.c
|
|
+++ b/drivers/dma/dma-jz4740.c
|
|
@@ -555,7 +555,7 @@ static int jz4740_dma_probe(struct platform_device *pdev)
|
|
|
|
ret = dma_async_device_register(dd);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err_clk;
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
ret = request_irq(irq, jz4740_dma_irq, 0, dev_name(&pdev->dev), dmadev);
|
|
@@ -568,6 +568,8 @@ static int jz4740_dma_probe(struct platform_device *pdev)
|
|
|
|
err_unregister:
|
|
dma_async_device_unregister(dd);
|
|
+err_clk:
|
|
+ clk_disable_unprepare(dmadev->clk);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/dma/ioat/init.c b/drivers/dma/ioat/init.c
|
|
index 0dea6d55f0ff..84eb83eb2efe 100644
|
|
--- a/drivers/dma/ioat/init.c
|
|
+++ b/drivers/dma/ioat/init.c
|
|
@@ -388,7 +388,7 @@ static int ioat_dma_self_test(struct ioatdma_device *ioat_dma)
|
|
if (memcmp(src, dest, IOAT_TEST_SIZE)) {
|
|
dev_err(dev, "Self-test copy failed compare, disabling\n");
|
|
err = -ENODEV;
|
|
- goto free_resources;
|
|
+ goto unmap_dma;
|
|
}
|
|
|
|
unmap_dma:
|
|
diff --git a/drivers/dma/zx296702_dma.c b/drivers/dma/zx296702_dma.c
|
|
index 6059d81e701a..8e55403847b2 100644
|
|
--- a/drivers/dma/zx296702_dma.c
|
|
+++ b/drivers/dma/zx296702_dma.c
|
|
@@ -26,7 +26,7 @@
|
|
|
|
#define DRIVER_NAME "zx-dma"
|
|
#define DMA_ALIGN 4
|
|
-#define DMA_MAX_SIZE (0x10000 - PAGE_SIZE)
|
|
+#define DMA_MAX_SIZE (0x10000 - 512)
|
|
#define LLI_BLOCK_SIZE (4 * PAGE_SIZE)
|
|
|
|
#define REG_ZX_SRC_ADDR 0x00
|
|
diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c
|
|
index 164de64b11fc..9d46af0c4084 100644
|
|
--- a/drivers/gpio/gpio-intel-mid.c
|
|
+++ b/drivers/gpio/gpio-intel-mid.c
|
|
@@ -321,7 +321,7 @@ static void intel_mid_irq_init_hw(struct intel_mid_gpio *priv)
|
|
}
|
|
}
|
|
|
|
-static int intel_gpio_runtime_idle(struct device *dev)
|
|
+static int __maybe_unused intel_gpio_runtime_idle(struct device *dev)
|
|
{
|
|
int err = pm_schedule_suspend(dev, 500);
|
|
return err ?: -EBUSY;
|
|
diff --git a/drivers/gpio/gpio-xgene.c b/drivers/gpio/gpio-xgene.c
|
|
index 40a8881c2ce8..f1c6ec17b90a 100644
|
|
--- a/drivers/gpio/gpio-xgene.c
|
|
+++ b/drivers/gpio/gpio-xgene.c
|
|
@@ -42,9 +42,7 @@ struct xgene_gpio {
|
|
struct gpio_chip chip;
|
|
void __iomem *base;
|
|
spinlock_t lock;
|
|
-#ifdef CONFIG_PM
|
|
u32 set_dr_val[XGENE_MAX_GPIO_BANKS];
|
|
-#endif
|
|
};
|
|
|
|
static int xgene_gpio_get(struct gpio_chip *gc, unsigned int offset)
|
|
@@ -138,8 +136,7 @@ static int xgene_gpio_dir_out(struct gpio_chip *gc,
|
|
return 0;
|
|
}
|
|
|
|
-#ifdef CONFIG_PM
|
|
-static int xgene_gpio_suspend(struct device *dev)
|
|
+static __maybe_unused int xgene_gpio_suspend(struct device *dev)
|
|
{
|
|
struct xgene_gpio *gpio = dev_get_drvdata(dev);
|
|
unsigned long bank_offset;
|
|
@@ -152,7 +149,7 @@ static int xgene_gpio_suspend(struct device *dev)
|
|
return 0;
|
|
}
|
|
|
|
-static int xgene_gpio_resume(struct device *dev)
|
|
+static __maybe_unused int xgene_gpio_resume(struct device *dev)
|
|
{
|
|
struct xgene_gpio *gpio = dev_get_drvdata(dev);
|
|
unsigned long bank_offset;
|
|
@@ -166,10 +163,6 @@ static int xgene_gpio_resume(struct device *dev)
|
|
}
|
|
|
|
static SIMPLE_DEV_PM_OPS(xgene_gpio_pm, xgene_gpio_suspend, xgene_gpio_resume);
|
|
-#define XGENE_GPIO_PM_OPS (&xgene_gpio_pm)
|
|
-#else
|
|
-#define XGENE_GPIO_PM_OPS NULL
|
|
-#endif
|
|
|
|
static int xgene_gpio_probe(struct platform_device *pdev)
|
|
{
|
|
@@ -241,7 +234,7 @@ static struct platform_driver xgene_gpio_driver = {
|
|
.name = "xgene-gpio",
|
|
.of_match_table = xgene_gpio_of_match,
|
|
.acpi_match_table = ACPI_PTR(xgene_gpio_acpi_match),
|
|
- .pm = XGENE_GPIO_PM_OPS,
|
|
+ .pm = &xgene_gpio_pm,
|
|
},
|
|
.probe = xgene_gpio_probe,
|
|
};
|
|
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
|
|
index a51f8cbcfe26..3137adf7b0af 100644
|
|
--- a/drivers/gpu/drm/armada/armada_crtc.c
|
|
+++ b/drivers/gpu/drm/armada/armada_crtc.c
|
|
@@ -1178,17 +1178,13 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
|
|
|
|
ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc",
|
|
dcrtc);
|
|
- if (ret < 0) {
|
|
- kfree(dcrtc);
|
|
- return ret;
|
|
- }
|
|
+ if (ret < 0)
|
|
+ goto err_crtc;
|
|
|
|
if (dcrtc->variant->init) {
|
|
ret = dcrtc->variant->init(dcrtc, dev);
|
|
- if (ret) {
|
|
- kfree(dcrtc);
|
|
- return ret;
|
|
- }
|
|
+ if (ret)
|
|
+ goto err_crtc;
|
|
}
|
|
|
|
/* Ensure AXI pipeline is enabled */
|
|
@@ -1199,13 +1195,15 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
|
|
dcrtc->crtc.port = port;
|
|
|
|
primary = kzalloc(sizeof(*primary), GFP_KERNEL);
|
|
- if (!primary)
|
|
- return -ENOMEM;
|
|
+ if (!primary) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_crtc;
|
|
+ }
|
|
|
|
ret = armada_drm_plane_init(primary);
|
|
if (ret) {
|
|
kfree(primary);
|
|
- return ret;
|
|
+ goto err_crtc;
|
|
}
|
|
|
|
ret = drm_universal_plane_init(drm, &primary->base, 0,
|
|
@@ -1215,7 +1213,7 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
|
|
DRM_PLANE_TYPE_PRIMARY, NULL);
|
|
if (ret) {
|
|
kfree(primary);
|
|
- return ret;
|
|
+ goto err_crtc;
|
|
}
|
|
|
|
ret = drm_crtc_init_with_planes(drm, &dcrtc->crtc, &primary->base, NULL,
|
|
@@ -1234,6 +1232,9 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
|
|
|
|
err_crtc_init:
|
|
primary->base.funcs->destroy(&primary->base);
|
|
+err_crtc:
|
|
+ kfree(dcrtc);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c
|
|
index 61146f5b4f56..0a6bf815640e 100644
|
|
--- a/drivers/gpu/drm/drm_modeset_lock.c
|
|
+++ b/drivers/gpu/drm/drm_modeset_lock.c
|
|
@@ -81,7 +81,7 @@ void drm_modeset_lock_all(struct drm_device *dev)
|
|
struct drm_modeset_acquire_ctx *ctx;
|
|
int ret;
|
|
|
|
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
+ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL | __GFP_NOFAIL);
|
|
if (WARN_ON(!ctx))
|
|
return;
|
|
|
|
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
index 38eaa63afb31..4198e50fa27b 100644
|
|
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
@@ -1939,8 +1939,7 @@ static int hdmi_remove(struct platform_device *pdev)
|
|
return 0;
|
|
}
|
|
|
|
-#ifdef CONFIG_PM
|
|
-static int exynos_hdmi_suspend(struct device *dev)
|
|
+static int __maybe_unused exynos_hdmi_suspend(struct device *dev)
|
|
{
|
|
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
|
|
|
@@ -1949,7 +1948,7 @@ static int exynos_hdmi_suspend(struct device *dev)
|
|
return 0;
|
|
}
|
|
|
|
-static int exynos_hdmi_resume(struct device *dev)
|
|
+static int __maybe_unused exynos_hdmi_resume(struct device *dev)
|
|
{
|
|
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
|
int ret;
|
|
@@ -1960,7 +1959,6 @@ static int exynos_hdmi_resume(struct device *dev)
|
|
|
|
return 0;
|
|
}
|
|
-#endif
|
|
|
|
static const struct dev_pm_ops exynos_hdmi_pm_ops = {
|
|
SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL)
|
|
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
|
index a19ec06f9e42..6a9860df208f 100644
|
|
--- a/drivers/gpu/drm/i915/intel_drv.h
|
|
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
|
@@ -1581,7 +1581,7 @@ extern struct drm_display_mode *intel_find_panel_downclock(
|
|
int intel_backlight_device_register(struct intel_connector *connector);
|
|
void intel_backlight_device_unregister(struct intel_connector *connector);
|
|
#else /* CONFIG_BACKLIGHT_CLASS_DEVICE */
|
|
-static int intel_backlight_device_register(struct intel_connector *connector)
|
|
+static inline int intel_backlight_device_register(struct intel_connector *connector)
|
|
{
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
|
|
index be4b4d546fd9..1cb1b01e4471 100644
|
|
--- a/drivers/gpu/drm/i915/intel_panel.c
|
|
+++ b/drivers/gpu/drm/i915/intel_panel.c
|
|
@@ -544,25 +544,6 @@ static u32 pwm_get_backlight(struct intel_connector *connector)
|
|
return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
|
|
}
|
|
|
|
-static u32 intel_panel_get_backlight(struct intel_connector *connector)
|
|
-{
|
|
- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
- struct intel_panel *panel = &connector->panel;
|
|
- u32 val = 0;
|
|
-
|
|
- mutex_lock(&dev_priv->backlight_lock);
|
|
-
|
|
- if (panel->backlight.enabled) {
|
|
- val = panel->backlight.get(connector);
|
|
- val = intel_panel_compute_brightness(connector, val);
|
|
- }
|
|
-
|
|
- mutex_unlock(&dev_priv->backlight_lock);
|
|
-
|
|
- DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
|
|
- return val;
|
|
-}
|
|
-
|
|
static void lpt_set_backlight(struct intel_connector *connector, u32 level)
|
|
{
|
|
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
@@ -646,30 +627,6 @@ intel_panel_actually_set_backlight(struct intel_connector *connector, u32 level)
|
|
panel->backlight.set(connector, level);
|
|
}
|
|
|
|
-/* set backlight brightness to level in range [0..max], scaling wrt hw min */
|
|
-static void intel_panel_set_backlight(struct intel_connector *connector,
|
|
- u32 user_level, u32 user_max)
|
|
-{
|
|
- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
- struct intel_panel *panel = &connector->panel;
|
|
- u32 hw_level;
|
|
-
|
|
- if (!panel->backlight.present)
|
|
- return;
|
|
-
|
|
- mutex_lock(&dev_priv->backlight_lock);
|
|
-
|
|
- WARN_ON(panel->backlight.max == 0);
|
|
-
|
|
- hw_level = scale_user_to_hw(connector, user_level, user_max);
|
|
- panel->backlight.level = hw_level;
|
|
-
|
|
- if (panel->backlight.enabled)
|
|
- intel_panel_actually_set_backlight(connector, hw_level);
|
|
-
|
|
- mutex_unlock(&dev_priv->backlight_lock);
|
|
-}
|
|
-
|
|
/* set backlight brightness to level in range [0..max], assuming hw min is
|
|
* respected.
|
|
*/
|
|
@@ -1122,6 +1079,49 @@ void intel_panel_enable_backlight(struct intel_connector *connector)
|
|
}
|
|
|
|
#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
|
|
+static u32 intel_panel_get_backlight(struct intel_connector *connector)
|
|
+{
|
|
+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
+ struct intel_panel *panel = &connector->panel;
|
|
+ u32 val = 0;
|
|
+
|
|
+ mutex_lock(&dev_priv->backlight_lock);
|
|
+
|
|
+ if (panel->backlight.enabled) {
|
|
+ val = panel->backlight.get(connector);
|
|
+ val = intel_panel_compute_brightness(connector, val);
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&dev_priv->backlight_lock);
|
|
+
|
|
+ DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
|
|
+ return val;
|
|
+}
|
|
+
|
|
+/* set backlight brightness to level in range [0..max], scaling wrt hw min */
|
|
+static void intel_panel_set_backlight(struct intel_connector *connector,
|
|
+ u32 user_level, u32 user_max)
|
|
+{
|
|
+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
+ struct intel_panel *panel = &connector->panel;
|
|
+ u32 hw_level;
|
|
+
|
|
+ if (!panel->backlight.present)
|
|
+ return;
|
|
+
|
|
+ mutex_lock(&dev_priv->backlight_lock);
|
|
+
|
|
+ WARN_ON(panel->backlight.max == 0);
|
|
+
|
|
+ hw_level = scale_user_to_hw(connector, user_level, user_max);
|
|
+ panel->backlight.level = hw_level;
|
|
+
|
|
+ if (panel->backlight.enabled)
|
|
+ intel_panel_actually_set_backlight(connector, hw_level);
|
|
+
|
|
+ mutex_unlock(&dev_priv->backlight_lock);
|
|
+}
|
|
+
|
|
static int intel_backlight_device_update_status(struct backlight_device *bd)
|
|
{
|
|
struct intel_connector *connector = bl_get_data(bd);
|
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
|
index 72e2399bce39..909f69a302ee 100644
|
|
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
|
|
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
|
@@ -369,7 +369,7 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
|
|
{
|
|
struct nouveau_cli *cli = nouveau_cli(file_priv);
|
|
int trycnt = 0;
|
|
- int ret, i;
|
|
+ int ret = -EINVAL, i;
|
|
struct nouveau_bo *res_bo = NULL;
|
|
LIST_HEAD(gart_list);
|
|
LIST_HEAD(vram_list);
|
|
diff --git a/drivers/idle/Kconfig b/drivers/idle/Kconfig
|
|
index 4732dfc15447..331adc509f3a 100644
|
|
--- a/drivers/idle/Kconfig
|
|
+++ b/drivers/idle/Kconfig
|
|
@@ -17,6 +17,7 @@ config I7300_IDLE_IOAT_CHANNEL
|
|
|
|
config I7300_IDLE
|
|
tristate "Intel chipset idle memory power saving driver"
|
|
+ depends on PCI
|
|
select I7300_IDLE_IOAT_CHANNEL
|
|
help
|
|
Enable memory power savings when idle with certain Intel server
|
|
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
|
|
index a09d6eed3b88..30f01613b518 100644
|
|
--- a/drivers/infiniband/core/cma.c
|
|
+++ b/drivers/infiniband/core/cma.c
|
|
@@ -744,6 +744,7 @@ struct rdma_cm_id *rdma_create_id(struct net *net,
|
|
INIT_LIST_HEAD(&id_priv->mc_list);
|
|
get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
|
|
id_priv->id.route.addr.dev_addr.net = get_net(net);
|
|
+ id_priv->seq_num &= 0x00ffffff;
|
|
|
|
return &id_priv->id;
|
|
}
|
|
diff --git a/drivers/infiniband/hw/i40iw/i40iw_d.h b/drivers/infiniband/hw/i40iw/i40iw_d.h
|
|
index 2fac1db0e0a0..d1328a697750 100644
|
|
--- a/drivers/infiniband/hw/i40iw/i40iw_d.h
|
|
+++ b/drivers/infiniband/hw/i40iw/i40iw_d.h
|
|
@@ -1102,7 +1102,7 @@
|
|
#define I40IWQPC_VLANTAG_MASK (0xffffULL << I40IWQPC_VLANTAG_SHIFT)
|
|
|
|
#define I40IWQPC_ARPIDX_SHIFT 48
|
|
-#define I40IWQPC_ARPIDX_MASK (0xfffULL << I40IWQPC_ARPIDX_SHIFT)
|
|
+#define I40IWQPC_ARPIDX_MASK (0xffffULL << I40IWQPC_ARPIDX_SHIFT)
|
|
|
|
#define I40IWQPC_FLOWLABEL_SHIFT 0
|
|
#define I40IWQPC_FLOWLABEL_MASK (0xfffffUL << I40IWQPC_FLOWLABEL_SHIFT)
|
|
diff --git a/drivers/input/keyboard/tca8418_keypad.c b/drivers/input/keyboard/tca8418_keypad.c
|
|
index 9002298698fc..3048ef3e3e16 100644
|
|
--- a/drivers/input/keyboard/tca8418_keypad.c
|
|
+++ b/drivers/input/keyboard/tca8418_keypad.c
|
|
@@ -164,11 +164,18 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
|
|
int error, col, row;
|
|
u8 reg, state, code;
|
|
|
|
- /* Initial read of the key event FIFO */
|
|
- error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®);
|
|
+ do {
|
|
+ error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®);
|
|
+ if (error < 0) {
|
|
+ dev_err(&keypad_data->client->dev,
|
|
+ "unable to read REG_KEY_EVENT_A\n");
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Assume that key code 0 signifies empty FIFO */
|
|
+ if (reg <= 0)
|
|
+ break;
|
|
|
|
- /* Assume that key code 0 signifies empty FIFO */
|
|
- while (error >= 0 && reg > 0) {
|
|
state = reg & KEY_EVENT_VALUE;
|
|
code = reg & KEY_EVENT_CODE;
|
|
|
|
@@ -184,11 +191,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)
|
|
|
|
/* Read for next loop */
|
|
error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®);
|
|
- }
|
|
-
|
|
- if (error < 0)
|
|
- dev_err(&keypad_data->client->dev,
|
|
- "unable to read REG_KEY_EVENT_A\n");
|
|
+ } while (1);
|
|
|
|
input_sync(input);
|
|
}
|
|
diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c
|
|
index 296f1411fe84..3b11422b1cce 100644
|
|
--- a/drivers/isdn/hardware/eicon/message.c
|
|
+++ b/drivers/isdn/hardware/eicon/message.c
|
|
@@ -147,7 +147,7 @@ static word plci_remove_check(PLCI *);
|
|
static void listen_check(DIVA_CAPI_ADAPTER *);
|
|
static byte AddInfo(byte **, byte **, byte *, byte *);
|
|
static byte getChannel(API_PARSE *);
|
|
-static void IndParse(PLCI *, word *, byte **, byte);
|
|
+static void IndParse(PLCI *, const word *, byte **, byte);
|
|
static byte ie_compare(byte *, byte *);
|
|
static word find_cip(DIVA_CAPI_ADAPTER *, byte *, byte *);
|
|
static word CPN_filter_ok(byte *cpn, DIVA_CAPI_ADAPTER *, word);
|
|
@@ -4858,7 +4858,7 @@ static void sig_ind(PLCI *plci)
|
|
/* included before the ESC_MSGTYPE and MAXPARMSIDS has to be incremented */
|
|
/* SMSG is situated at the end because its 0 (for compatibility reasons */
|
|
/* (see Info_Mask Bit 4, first IE. then the message type) */
|
|
- word parms_id[] =
|
|
+ static const word parms_id[] =
|
|
{MAXPARMSIDS, CPN, 0xff, DSA, OSA, BC, LLC, HLC, ESC_CAUSE, DSP, DT, CHA,
|
|
UUI, CONG_RR, CONG_RNR, ESC_CHI, KEY, CHI, CAU, ESC_LAW,
|
|
RDN, RDX, CONN_NR, RIN, NI, CAI, ESC_CR,
|
|
@@ -4866,12 +4866,12 @@ static void sig_ind(PLCI *plci)
|
|
/* 14 FTY repl by ESC_CHI */
|
|
/* 18 PI repl by ESC_LAW */
|
|
/* removed OAD changed to 0xff for future use, OAD is multiIE now */
|
|
- word multi_fac_id[] = {1, FTY};
|
|
- word multi_pi_id[] = {1, PI};
|
|
- word multi_CiPN_id[] = {1, OAD};
|
|
- word multi_ssext_id[] = {1, ESC_SSEXT};
|
|
+ static const word multi_fac_id[] = {1, FTY};
|
|
+ static const word multi_pi_id[] = {1, PI};
|
|
+ static const word multi_CiPN_id[] = {1, OAD};
|
|
+ static const word multi_ssext_id[] = {1, ESC_SSEXT};
|
|
|
|
- word multi_vswitch_id[] = {1, ESC_VSWITCH};
|
|
+ static const word multi_vswitch_id[] = {1, ESC_VSWITCH};
|
|
|
|
byte *cau;
|
|
word ncci;
|
|
@@ -8924,7 +8924,7 @@ static void listen_check(DIVA_CAPI_ADAPTER *a)
|
|
/* functions for all parameters sent in INDs */
|
|
/*------------------------------------------------------------------*/
|
|
|
|
-static void IndParse(PLCI *plci, word *parms_id, byte **parms, byte multiIEsize)
|
|
+static void IndParse(PLCI *plci, const word *parms_id, byte **parms, byte multiIEsize)
|
|
{
|
|
word ploc; /* points to current location within packet */
|
|
byte w;
|
|
diff --git a/drivers/media/i2c/s5k6aa.c b/drivers/media/i2c/s5k6aa.c
|
|
index faee11383cb7..4b615b4b0463 100644
|
|
--- a/drivers/media/i2c/s5k6aa.c
|
|
+++ b/drivers/media/i2c/s5k6aa.c
|
|
@@ -421,6 +421,7 @@ static int s5k6aa_set_ahb_address(struct i2c_client *client)
|
|
|
|
/**
|
|
* s5k6aa_configure_pixel_clock - apply ISP main clock/PLL configuration
|
|
+ * @s5k6aa: pointer to &struct s5k6aa describing the device
|
|
*
|
|
* Configure the internal ISP PLL for the required output frequency.
|
|
* Locking: called with s5k6aa.lock mutex held.
|
|
@@ -669,6 +670,7 @@ static int s5k6aa_set_input_params(struct s5k6aa *s5k6aa)
|
|
|
|
/**
|
|
* s5k6aa_configure_video_bus - configure the video output interface
|
|
+ * @s5k6aa: pointer to &struct s5k6aa describing the device
|
|
* @bus_type: video bus type: parallel or MIPI-CSI
|
|
* @nlanes: number of MIPI lanes to be used (MIPI-CSI only)
|
|
*
|
|
@@ -724,6 +726,8 @@ static int s5k6aa_new_config_sync(struct i2c_client *client, int timeout,
|
|
|
|
/**
|
|
* s5k6aa_set_prev_config - write user preview register set
|
|
+ * @s5k6aa: pointer to &struct s5k6aa describing the device
|
|
+ * @preset: s5kaa preset to be applied
|
|
*
|
|
* Configure output resolution and color fromat, pixel clock
|
|
* frequency range, device frame rate type and frame period range.
|
|
@@ -777,6 +781,7 @@ static int s5k6aa_set_prev_config(struct s5k6aa *s5k6aa,
|
|
|
|
/**
|
|
* s5k6aa_initialize_isp - basic ISP MCU initialization
|
|
+ * @sd: pointer to V4L2 sub-device descriptor
|
|
*
|
|
* Configure AHB addresses for registers read/write; configure PLLs for
|
|
* required output pixel clock. The ISP power supply needs to be already
|
|
diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
|
|
index 1e3a0dd2238c..26d999c812c9 100644
|
|
--- a/drivers/media/i2c/tc358743.c
|
|
+++ b/drivers/media/i2c/tc358743.c
|
|
@@ -193,57 +193,61 @@ static void i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
|
|
}
|
|
}
|
|
|
|
-static u8 i2c_rd8(struct v4l2_subdev *sd, u16 reg)
|
|
+static noinline u32 i2c_rdreg(struct v4l2_subdev *sd, u16 reg, u32 n)
|
|
{
|
|
- u8 val;
|
|
+ __le32 val = 0;
|
|
|
|
- i2c_rd(sd, reg, &val, 1);
|
|
+ i2c_rd(sd, reg, (u8 __force *)&val, n);
|
|
|
|
- return val;
|
|
+ return le32_to_cpu(val);
|
|
+}
|
|
+
|
|
+static noinline void i2c_wrreg(struct v4l2_subdev *sd, u16 reg, u32 val, u32 n)
|
|
+{
|
|
+ __le32 raw = cpu_to_le32(val);
|
|
+
|
|
+ i2c_wr(sd, reg, (u8 __force *)&raw, n);
|
|
+}
|
|
+
|
|
+static u8 i2c_rd8(struct v4l2_subdev *sd, u16 reg)
|
|
+{
|
|
+ return i2c_rdreg(sd, reg, 1);
|
|
}
|
|
|
|
static void i2c_wr8(struct v4l2_subdev *sd, u16 reg, u8 val)
|
|
{
|
|
- i2c_wr(sd, reg, &val, 1);
|
|
+ i2c_wrreg(sd, reg, val, 1);
|
|
}
|
|
|
|
static void i2c_wr8_and_or(struct v4l2_subdev *sd, u16 reg,
|
|
u8 mask, u8 val)
|
|
{
|
|
- i2c_wr8(sd, reg, (i2c_rd8(sd, reg) & mask) | val);
|
|
+ i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 2) & mask) | val, 2);
|
|
}
|
|
|
|
static u16 i2c_rd16(struct v4l2_subdev *sd, u16 reg)
|
|
{
|
|
- u16 val;
|
|
-
|
|
- i2c_rd(sd, reg, (u8 *)&val, 2);
|
|
-
|
|
- return val;
|
|
+ return i2c_rdreg(sd, reg, 2);
|
|
}
|
|
|
|
static void i2c_wr16(struct v4l2_subdev *sd, u16 reg, u16 val)
|
|
{
|
|
- i2c_wr(sd, reg, (u8 *)&val, 2);
|
|
+ i2c_wrreg(sd, reg, val, 2);
|
|
}
|
|
|
|
static void i2c_wr16_and_or(struct v4l2_subdev *sd, u16 reg, u16 mask, u16 val)
|
|
{
|
|
- i2c_wr16(sd, reg, (i2c_rd16(sd, reg) & mask) | val);
|
|
+ i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 2) & mask) | val, 2);
|
|
}
|
|
|
|
static u32 i2c_rd32(struct v4l2_subdev *sd, u16 reg)
|
|
{
|
|
- u32 val;
|
|
-
|
|
- i2c_rd(sd, reg, (u8 *)&val, 4);
|
|
-
|
|
- return val;
|
|
+ return i2c_rdreg(sd, reg, 4);
|
|
}
|
|
|
|
static void i2c_wr32(struct v4l2_subdev *sd, u16 reg, u32 val)
|
|
{
|
|
- i2c_wr(sd, reg, (u8 *)&val, 4);
|
|
+ i2c_wrreg(sd, reg, val, 4);
|
|
}
|
|
|
|
/* --------------- STATUS --------------- */
|
|
@@ -1236,7 +1240,7 @@ static int tc358743_g_register(struct v4l2_subdev *sd,
|
|
|
|
reg->size = tc358743_get_reg_size(reg->reg);
|
|
|
|
- i2c_rd(sd, reg->reg, (u8 *)®->val, reg->size);
|
|
+ reg->val = i2c_rdreg(sd, reg->reg, reg->size);
|
|
|
|
return 0;
|
|
}
|
|
@@ -1262,7 +1266,7 @@ static int tc358743_s_register(struct v4l2_subdev *sd,
|
|
reg->reg == BCAPS)
|
|
return 0;
|
|
|
|
- i2c_wr(sd, (u16)reg->reg, (u8 *)®->val,
|
|
+ i2c_wrreg(sd, (u16)reg->reg, reg->val,
|
|
tc358743_get_reg_size(reg->reg));
|
|
|
|
return 0;
|
|
diff --git a/drivers/media/pci/tw5864/tw5864-video.c b/drivers/media/pci/tw5864/tw5864-video.c
|
|
index 652a059b2e0a..1ddf80f85c24 100644
|
|
--- a/drivers/media/pci/tw5864/tw5864-video.c
|
|
+++ b/drivers/media/pci/tw5864/tw5864-video.c
|
|
@@ -708,6 +708,8 @@ static void tw5864_frame_interval_set(struct tw5864_input *input)
|
|
static int tw5864_frameinterval_get(struct tw5864_input *input,
|
|
struct v4l2_fract *frameinterval)
|
|
{
|
|
+ struct tw5864_dev *dev = input->root;
|
|
+
|
|
switch (input->std) {
|
|
case STD_NTSC:
|
|
frameinterval->numerator = 1001;
|
|
@@ -719,8 +721,8 @@ static int tw5864_frameinterval_get(struct tw5864_input *input,
|
|
frameinterval->denominator = 25;
|
|
break;
|
|
default:
|
|
- WARN(1, "tw5864_frameinterval_get requested for unknown std %d\n",
|
|
- input->std);
|
|
+ dev_warn(&dev->pci->dev, "tw5864_frameinterval_get requested for unknown std %d\n",
|
|
+ input->std);
|
|
return -EINVAL;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/em28xx/Kconfig b/drivers/media/usb/em28xx/Kconfig
|
|
index d917b0a2beb1..aa131cf9989b 100644
|
|
--- a/drivers/media/usb/em28xx/Kconfig
|
|
+++ b/drivers/media/usb/em28xx/Kconfig
|
|
@@ -11,7 +11,7 @@ config VIDEO_EM28XX_V4L2
|
|
select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
|
|
select VIDEO_TVP5150 if MEDIA_SUBDRV_AUTOSELECT
|
|
select VIDEO_MSP3400 if MEDIA_SUBDRV_AUTOSELECT
|
|
- select VIDEO_MT9V011 if MEDIA_SUBDRV_AUTOSELECT
|
|
+ select VIDEO_MT9V011 if MEDIA_SUBDRV_AUTOSELECT && MEDIA_CAMERA_SUPPORT
|
|
|
|
---help---
|
|
This is a video4linux driver for Empia 28xx based TV cards.
|
|
diff --git a/drivers/media/usb/go7007/Kconfig b/drivers/media/usb/go7007/Kconfig
|
|
index 95a3af644a92..af1d02430931 100644
|
|
--- a/drivers/media/usb/go7007/Kconfig
|
|
+++ b/drivers/media/usb/go7007/Kconfig
|
|
@@ -11,7 +11,7 @@ config VIDEO_GO7007
|
|
select VIDEO_TW2804 if MEDIA_SUBDRV_AUTOSELECT
|
|
select VIDEO_TW9903 if MEDIA_SUBDRV_AUTOSELECT
|
|
select VIDEO_TW9906 if MEDIA_SUBDRV_AUTOSELECT
|
|
- select VIDEO_OV7640 if MEDIA_SUBDRV_AUTOSELECT
|
|
+ select VIDEO_OV7640 if MEDIA_SUBDRV_AUTOSELECT && MEDIA_CAMERA_SUPPORT
|
|
select VIDEO_UDA1342 if MEDIA_SUBDRV_AUTOSELECT
|
|
---help---
|
|
This is a video4linux driver for the WIS GO7007 MPEG
|
|
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
|
|
index 95c32f2d7601..db28e22edbf9 100644
|
|
--- a/drivers/net/Kconfig
|
|
+++ b/drivers/net/Kconfig
|
|
@@ -437,6 +437,9 @@ config XEN_NETDEV_BACKEND
|
|
config VMXNET3
|
|
tristate "VMware VMXNET3 ethernet driver"
|
|
depends on PCI && INET
|
|
+ depends on !(PAGE_SIZE_64KB || ARM64_64K_PAGES || \
|
|
+ IA64_PAGE_SIZE_64KB || MICROBLAZE_64K_PAGES || \
|
|
+ PARISC_PAGE_SIZE_64KB || PPC_64K_PAGES)
|
|
help
|
|
This driver supports VMware's vmxnet3 virtual ethernet NIC.
|
|
To compile this driver as a module, choose M here: the
|
|
diff --git a/drivers/net/ethernet/arc/emac_rockchip.c b/drivers/net/ethernet/arc/emac_rockchip.c
|
|
index e278e3d96ee0..c6163874e4e7 100644
|
|
--- a/drivers/net/ethernet/arc/emac_rockchip.c
|
|
+++ b/drivers/net/ethernet/arc/emac_rockchip.c
|
|
@@ -220,9 +220,11 @@ static int emac_rockchip_probe(struct platform_device *pdev)
|
|
|
|
/* RMII TX/RX needs always a rate of 25MHz */
|
|
err = clk_set_rate(priv->macclk, 25000000);
|
|
- if (err)
|
|
+ if (err) {
|
|
dev_err(dev,
|
|
"failed to change mac clock rate (%d)\n", err);
|
|
+ goto out_clk_disable_macclk;
|
|
+ }
|
|
}
|
|
|
|
err = arc_emac_probe(ndev, interface);
|
|
@@ -232,7 +234,8 @@ static int emac_rockchip_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
return 0;
|
|
-
|
|
+out_clk_disable_macclk:
|
|
+ clk_disable_unprepare(priv->macclk);
|
|
out_regulator_disable:
|
|
if (priv->regulator)
|
|
regulator_disable(priv->regulator);
|
|
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
|
|
index fd206889a433..e3b41ba95168 100644
|
|
--- a/drivers/net/ethernet/freescale/gianfar.c
|
|
+++ b/drivers/net/ethernet/freescale/gianfar.c
|
|
@@ -1375,9 +1375,11 @@ static int gfar_probe(struct platform_device *ofdev)
|
|
|
|
gfar_init_addr_hash_table(priv);
|
|
|
|
- /* Insert receive time stamps into padding alignment bytes */
|
|
+ /* Insert receive time stamps into padding alignment bytes, and
|
|
+ * plus 2 bytes padding to ensure the cpu alignment.
|
|
+ */
|
|
if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)
|
|
- priv->padding = 8;
|
|
+ priv->padding = 8 + DEFAULT_PADDING;
|
|
|
|
if (dev->features & NETIF_F_IP_CSUM ||
|
|
priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)
|
|
@@ -1787,6 +1789,7 @@ static int init_phy(struct net_device *dev)
|
|
GFAR_SUPPORTED_GBIT : 0;
|
|
phy_interface_t interface;
|
|
struct phy_device *phydev;
|
|
+ struct ethtool_eee edata;
|
|
|
|
priv->oldlink = 0;
|
|
priv->oldspeed = 0;
|
|
@@ -1811,6 +1814,10 @@ static int init_phy(struct net_device *dev)
|
|
/* Add support for flow control, but don't advertise it by default */
|
|
phydev->supported |= (SUPPORTED_Pause | SUPPORTED_Asym_Pause);
|
|
|
|
+ /* disable EEE autoneg, EEE not supported by eTSEC */
|
|
+ memset(&edata, 0, sizeof(struct ethtool_eee));
|
|
+ phy_ethtool_set_eee(phydev, &edata);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c
|
|
index 95c0b45a68fb..313e006f74fe 100644
|
|
--- a/drivers/net/hippi/rrunner.c
|
|
+++ b/drivers/net/hippi/rrunner.c
|
|
@@ -1381,8 +1381,8 @@ static int rr_close(struct net_device *dev)
|
|
rrpriv->info_dma);
|
|
rrpriv->info = NULL;
|
|
|
|
- free_irq(pdev->irq, dev);
|
|
spin_unlock_irqrestore(&rrpriv->lock, flags);
|
|
+ free_irq(pdev->irq, dev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c
|
|
index 980e38524418..627eb825eb74 100644
|
|
--- a/drivers/net/ipvlan/ipvlan_core.c
|
|
+++ b/drivers/net/ipvlan/ipvlan_core.c
|
|
@@ -370,6 +370,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
|
|
.flowi4_oif = dev->ifindex,
|
|
.flowi4_tos = RT_TOS(ip4h->tos),
|
|
.flowi4_flags = FLOWI_FLAG_ANYSRC,
|
|
+ .flowi4_mark = skb->mark,
|
|
.daddr = ip4h->daddr,
|
|
.saddr = ip4h->saddr,
|
|
};
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
index edffe5aeeeb1..d46f086e6360 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
@@ -2049,7 +2049,7 @@ static int brcmf_sdio_txpkt_hdalign(struct brcmf_sdio *bus, struct sk_buff *pkt)
|
|
return head_pad;
|
|
}
|
|
|
|
-/**
|
|
+/*
|
|
* struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
|
|
* bus layer usage.
|
|
*/
|
|
diff --git a/drivers/net/wireless/st/cw1200/wsm.c b/drivers/net/wireless/st/cw1200/wsm.c
|
|
index 680d60eabc75..ed93bf3474ec 100644
|
|
--- a/drivers/net/wireless/st/cw1200/wsm.c
|
|
+++ b/drivers/net/wireless/st/cw1200/wsm.c
|
|
@@ -379,7 +379,6 @@ static int wsm_multi_tx_confirm(struct cw1200_common *priv,
|
|
{
|
|
int ret;
|
|
int count;
|
|
- int i;
|
|
|
|
count = WSM_GET32(buf);
|
|
if (WARN_ON(count <= 0))
|
|
@@ -395,11 +394,10 @@ static int wsm_multi_tx_confirm(struct cw1200_common *priv,
|
|
}
|
|
|
|
cw1200_debug_txed_multi(priv, count);
|
|
- for (i = 0; i < count; ++i) {
|
|
+ do {
|
|
ret = wsm_tx_confirm(priv, buf, link_id);
|
|
- if (ret)
|
|
- return ret;
|
|
- }
|
|
+ } while (!ret && --count);
|
|
+
|
|
return ret;
|
|
|
|
underflow:
|
|
diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
|
|
index 37e29b580be3..0e7f8f319fe3 100644
|
|
--- a/drivers/pci/host/vmd.c
|
|
+++ b/drivers/pci/host/vmd.c
|
|
@@ -727,7 +727,7 @@ static void vmd_remove(struct pci_dev *dev)
|
|
irq_domain_remove(vmd->irq_domain);
|
|
}
|
|
|
|
-#ifdef CONFIG_PM
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
static int vmd_suspend(struct device *dev)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
diff --git a/drivers/perf/xgene_pmu.c b/drivers/perf/xgene_pmu.c
|
|
index a8ac4bcef2c0..35b5289bc5da 100644
|
|
--- a/drivers/perf/xgene_pmu.c
|
|
+++ b/drivers/perf/xgene_pmu.c
|
|
@@ -25,6 +25,7 @@
|
|
#include <linux/interrupt.h>
|
|
#include <linux/io.h>
|
|
#include <linux/mfd/syscon.h>
|
|
+#include <linux/module.h>
|
|
#include <linux/of_address.h>
|
|
#include <linux/of_fdt.h>
|
|
#include <linux/of_irq.h>
|
|
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c
|
|
index 4f2a726bbaeb..f5f77432ce6f 100644
|
|
--- a/drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c
|
|
+++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c
|
|
@@ -428,7 +428,7 @@ static const struct sunxi_desc_pin a64_pins[] = {
|
|
SUNXI_FUNCTION(0x0, "gpio_in"),
|
|
SUNXI_FUNCTION(0x1, "gpio_out"),
|
|
SUNXI_FUNCTION(0x2, "mmc0"), /* D3 */
|
|
- SUNXI_FUNCTION(0x4, "uart0")), /* RX */
|
|
+ SUNXI_FUNCTION(0x3, "uart0")), /* RX */
|
|
SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5),
|
|
SUNXI_FUNCTION(0x0, "gpio_in"),
|
|
SUNXI_FUNCTION(0x1, "gpio_out"),
|
|
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c
|
|
index 1b580ba76453..907d7db3fcee 100644
|
|
--- a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c
|
|
+++ b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c
|
|
@@ -145,19 +145,19 @@ static const struct sunxi_desc_pin sun9i_a80_pins[] = {
|
|
SUNXI_FUNCTION(0x0, "gpio_in"),
|
|
SUNXI_FUNCTION(0x1, "gpio_out"),
|
|
SUNXI_FUNCTION(0x3, "mcsi"), /* MCLK */
|
|
- SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 14)), /* PB_EINT14 */
|
|
+ SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 14)), /* PB_EINT14 */
|
|
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 15),
|
|
SUNXI_FUNCTION(0x0, "gpio_in"),
|
|
SUNXI_FUNCTION(0x1, "gpio_out"),
|
|
SUNXI_FUNCTION(0x3, "mcsi"), /* SCK */
|
|
SUNXI_FUNCTION(0x4, "i2c4"), /* SCK */
|
|
- SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 15)), /* PB_EINT15 */
|
|
+ SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 15)), /* PB_EINT15 */
|
|
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 16),
|
|
SUNXI_FUNCTION(0x0, "gpio_in"),
|
|
SUNXI_FUNCTION(0x1, "gpio_out"),
|
|
SUNXI_FUNCTION(0x3, "mcsi"), /* SDA */
|
|
SUNXI_FUNCTION(0x4, "i2c4"), /* SDA */
|
|
- SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 16)), /* PB_EINT16 */
|
|
+ SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 16)), /* PB_EINT16 */
|
|
|
|
/* Hole */
|
|
SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
|
|
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
|
|
index 2c2f02b2e08a..167d5042a629 100644
|
|
--- a/drivers/platform/x86/dell-laptop.c
|
|
+++ b/drivers/platform/x86/dell-laptop.c
|
|
@@ -45,6 +45,7 @@
|
|
|
|
struct quirk_entry {
|
|
u8 touchpad_led;
|
|
+ u8 kbd_led_levels_off_1;
|
|
|
|
int needs_kbd_timeouts;
|
|
/*
|
|
@@ -75,6 +76,10 @@ static struct quirk_entry quirk_dell_xps13_9333 = {
|
|
.kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 },
|
|
};
|
|
|
|
+static struct quirk_entry quirk_dell_latitude_e6410 = {
|
|
+ .kbd_led_levels_off_1 = 1,
|
|
+};
|
|
+
|
|
static struct platform_driver platform_driver = {
|
|
.driver = {
|
|
.name = "dell-laptop",
|
|
@@ -270,6 +275,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = {
|
|
},
|
|
.driver_data = &quirk_dell_xps13_9333,
|
|
},
|
|
+ {
|
|
+ .callback = dmi_matched,
|
|
+ .ident = "Dell Latitude E6410",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6410"),
|
|
+ },
|
|
+ .driver_data = &quirk_dell_latitude_e6410,
|
|
+ },
|
|
{ }
|
|
};
|
|
|
|
@@ -1170,6 +1184,9 @@ static int kbd_get_info(struct kbd_info *info)
|
|
units = (buffer->output[2] >> 8) & 0xFF;
|
|
info->levels = (buffer->output[2] >> 16) & 0xFF;
|
|
|
|
+ if (quirks && quirks->kbd_led_levels_off_1 && info->levels)
|
|
+ info->levels--;
|
|
+
|
|
if (units & BIT(0))
|
|
info->seconds = (buffer->output[3] >> 0) & 0xFF;
|
|
if (units & BIT(1))
|
|
diff --git a/drivers/platform/x86/intel_mid_thermal.c b/drivers/platform/x86/intel_mid_thermal.c
|
|
index 5c768c4627d3..78e1bfee698a 100644
|
|
--- a/drivers/platform/x86/intel_mid_thermal.c
|
|
+++ b/drivers/platform/x86/intel_mid_thermal.c
|
|
@@ -415,6 +415,7 @@ static struct thermal_device_info *initialize_sensor(int index)
|
|
return td_info;
|
|
}
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
/**
|
|
* mid_thermal_resume - resume routine
|
|
* @dev: device structure
|
|
@@ -442,6 +443,7 @@ static int mid_thermal_suspend(struct device *dev)
|
|
*/
|
|
return configure_adc(0);
|
|
}
|
|
+#endif
|
|
|
|
static SIMPLE_DEV_PM_OPS(mid_thermal_pm,
|
|
mid_thermal_suspend, mid_thermal_resume);
|
|
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
|
|
index a7a88476e215..0f5bc2f8382b 100644
|
|
--- a/drivers/s390/block/dasd_eckd.c
|
|
+++ b/drivers/s390/block/dasd_eckd.c
|
|
@@ -521,10 +521,12 @@ static int prefix_LRE(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata,
|
|
pfxdata->validity.define_extent = 1;
|
|
|
|
/* private uid is kept up to date, conf_data may be outdated */
|
|
- if (startpriv->uid.type != UA_BASE_DEVICE) {
|
|
+ if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
|
|
pfxdata->validity.verify_base = 1;
|
|
- if (startpriv->uid.type == UA_HYPER_PAV_ALIAS)
|
|
- pfxdata->validity.hyper_pav = 1;
|
|
+
|
|
+ if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
|
|
+ pfxdata->validity.verify_base = 1;
|
|
+ pfxdata->validity.hyper_pav = 1;
|
|
}
|
|
|
|
/* define extend data (mostly)*/
|
|
@@ -3471,10 +3473,12 @@ static int prepare_itcw(struct itcw *itcw,
|
|
pfxdata.validity.define_extent = 1;
|
|
|
|
/* private uid is kept up to date, conf_data may be outdated */
|
|
- if (startpriv->uid.type != UA_BASE_DEVICE) {
|
|
+ if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
|
|
+ pfxdata.validity.verify_base = 1;
|
|
+
|
|
+ if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
|
|
pfxdata.validity.verify_base = 1;
|
|
- if (startpriv->uid.type == UA_HYPER_PAV_ALIAS)
|
|
- pfxdata.validity.hyper_pav = 1;
|
|
+ pfxdata.validity.hyper_pav = 1;
|
|
}
|
|
|
|
switch (cmd) {
|
|
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
|
|
index febbd83e2ecd..24e57e770432 100644
|
|
--- a/drivers/scsi/advansys.c
|
|
+++ b/drivers/scsi/advansys.c
|
|
@@ -6291,18 +6291,17 @@ static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
|
|
static uchar
|
|
AscMsgOutSDTR(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar sdtr_offset)
|
|
{
|
|
- EXT_MSG sdtr_buf;
|
|
- uchar sdtr_period_index;
|
|
- PortAddr iop_base;
|
|
-
|
|
- iop_base = asc_dvc->iop_base;
|
|
- sdtr_buf.msg_type = EXTENDED_MESSAGE;
|
|
- sdtr_buf.msg_len = MS_SDTR_LEN;
|
|
- sdtr_buf.msg_req = EXTENDED_SDTR;
|
|
- sdtr_buf.xfer_period = sdtr_period;
|
|
+ PortAddr iop_base = asc_dvc->iop_base;
|
|
+ uchar sdtr_period_index = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
|
|
+ EXT_MSG sdtr_buf = {
|
|
+ .msg_type = EXTENDED_MESSAGE,
|
|
+ .msg_len = MS_SDTR_LEN,
|
|
+ .msg_req = EXTENDED_SDTR,
|
|
+ .xfer_period = sdtr_period,
|
|
+ .req_ack_offset = sdtr_offset,
|
|
+ };
|
|
sdtr_offset &= ASC_SYN_MAX_OFFSET;
|
|
- sdtr_buf.req_ack_offset = sdtr_offset;
|
|
- sdtr_period_index = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
|
|
+
|
|
if (sdtr_period_index <= asc_dvc->max_sdtr_index) {
|
|
AscMemWordCopyPtrToLram(iop_base, ASCV_MSGOUT_BEG,
|
|
(uchar *)&sdtr_buf,
|
|
@@ -11030,6 +11029,9 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
|
|
ASC_DBG(2, "AdvInitGetConfig()\n");
|
|
|
|
ret = AdvInitGetConfig(pdev, shost) ? -ENODEV : 0;
|
|
+#else
|
|
+ share_irq = 0;
|
|
+ ret = -ENODEV;
|
|
#endif /* CONFIG_PCI */
|
|
}
|
|
|
|
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
|
|
index b7995474148c..0e7415f6d093 100644
|
|
--- a/drivers/spi/Kconfig
|
|
+++ b/drivers/spi/Kconfig
|
|
@@ -156,6 +156,7 @@ config SPI_BCM63XX_HSSPI
|
|
config SPI_BCM_QSPI
|
|
tristate "Broadcom BSPI and MSPI controller support"
|
|
depends on ARCH_BRCMSTB || ARCH_BCM || ARCH_BCM_IPROC || COMPILE_TEST
|
|
+ depends on MTD_NORFLASH
|
|
default ARCH_BCM_IPROC
|
|
help
|
|
Enables support for the Broadcom SPI flash and MSPI controller.
|
|
diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c
|
|
index 4969dc10684a..d8995b6c5a7e 100644
|
|
--- a/drivers/spi/spi-sun4i.c
|
|
+++ b/drivers/spi/spi-sun4i.c
|
|
@@ -466,7 +466,7 @@ static int sun4i_spi_probe(struct platform_device *pdev)
|
|
|
|
static int sun4i_spi_remove(struct platform_device *pdev)
|
|
{
|
|
- pm_runtime_disable(&pdev->dev);
|
|
+ pm_runtime_force_suspend(&pdev->dev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
|
|
index 558a66b459fa..d08324998933 100644
|
|
--- a/drivers/staging/android/ashmem.c
|
|
+++ b/drivers/staging/android/ashmem.c
|
|
@@ -719,30 +719,32 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
|
|
size_t pgstart, pgend;
|
|
int ret = -EINVAL;
|
|
|
|
+ mutex_lock(&ashmem_mutex);
|
|
+
|
|
if (unlikely(!asma->file))
|
|
- return -EINVAL;
|
|
+ goto out_unlock;
|
|
|
|
- if (unlikely(copy_from_user(&pin, p, sizeof(pin))))
|
|
- return -EFAULT;
|
|
+ if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) {
|
|
+ ret = -EFAULT;
|
|
+ goto out_unlock;
|
|
+ }
|
|
|
|
/* per custom, you can pass zero for len to mean "everything onward" */
|
|
if (!pin.len)
|
|
pin.len = PAGE_ALIGN(asma->size) - pin.offset;
|
|
|
|
if (unlikely((pin.offset | pin.len) & ~PAGE_MASK))
|
|
- return -EINVAL;
|
|
+ goto out_unlock;
|
|
|
|
if (unlikely(((__u32)-1) - pin.offset < pin.len))
|
|
- return -EINVAL;
|
|
+ goto out_unlock;
|
|
|
|
if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len))
|
|
- return -EINVAL;
|
|
+ goto out_unlock;
|
|
|
|
pgstart = pin.offset / PAGE_SIZE;
|
|
pgend = pgstart + (pin.len / PAGE_SIZE) - 1;
|
|
|
|
- mutex_lock(&ashmem_mutex);
|
|
-
|
|
switch (cmd) {
|
|
case ASHMEM_PIN:
|
|
ret = ashmem_pin(asma, pgstart, pgend);
|
|
@@ -755,6 +757,7 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
|
|
break;
|
|
}
|
|
|
|
+out_unlock:
|
|
mutex_unlock(&ashmem_mutex);
|
|
|
|
return ret;
|
|
diff --git a/drivers/staging/android/ion/ion-ioctl.c b/drivers/staging/android/ion/ion-ioctl.c
|
|
index 7e7431d8d49f..2b700e8455c6 100644
|
|
--- a/drivers/staging/android/ion/ion-ioctl.c
|
|
+++ b/drivers/staging/android/ion/ion-ioctl.c
|
|
@@ -83,8 +83,10 @@ long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
return -EFAULT;
|
|
|
|
ret = validate_ioctl_arg(cmd, &data);
|
|
- if (WARN_ON_ONCE(ret))
|
|
+ if (ret) {
|
|
+ pr_warn_once("%s: ioctl validate failed\n", __func__);
|
|
return ret;
|
|
+ }
|
|
|
|
if (!(dir & _IOC_WRITE))
|
|
memset(&data, 0, sizeof(data));
|
|
diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c
|
|
index 7e023d505af8..d270a424ecac 100644
|
|
--- a/drivers/staging/android/ion/ion_system_heap.c
|
|
+++ b/drivers/staging/android/ion/ion_system_heap.c
|
|
@@ -384,7 +384,7 @@ static int ion_system_contig_heap_allocate(struct ion_heap *heap,
|
|
if (align > (PAGE_SIZE << order))
|
|
return -EINVAL;
|
|
|
|
- page = alloc_pages(low_order_gfp_flags, order);
|
|
+ page = alloc_pages(low_order_gfp_flags | __GFP_NOWARN, order);
|
|
if (!page)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
|
|
index eeacb0e55db7..4dc9ca3a11b4 100644
|
|
--- a/drivers/staging/iio/adc/ad7192.c
|
|
+++ b/drivers/staging/iio/adc/ad7192.c
|
|
@@ -141,6 +141,8 @@
|
|
#define AD7192_GPOCON_P1DAT BIT(1) /* P1 state */
|
|
#define AD7192_GPOCON_P0DAT BIT(0) /* P0 state */
|
|
|
|
+#define AD7192_EXT_FREQ_MHZ_MIN 2457600
|
|
+#define AD7192_EXT_FREQ_MHZ_MAX 5120000
|
|
#define AD7192_INT_FREQ_MHZ 4915200
|
|
|
|
/* NOTE:
|
|
@@ -216,6 +218,12 @@ static int ad7192_calibrate_all(struct ad7192_state *st)
|
|
ARRAY_SIZE(ad7192_calib_arr));
|
|
}
|
|
|
|
+static inline bool ad7192_valid_external_frequency(u32 freq)
|
|
+{
|
|
+ return (freq >= AD7192_EXT_FREQ_MHZ_MIN &&
|
|
+ freq <= AD7192_EXT_FREQ_MHZ_MAX);
|
|
+}
|
|
+
|
|
static int ad7192_setup(struct ad7192_state *st,
|
|
const struct ad7192_platform_data *pdata)
|
|
{
|
|
@@ -241,17 +249,20 @@ static int ad7192_setup(struct ad7192_state *st,
|
|
id);
|
|
|
|
switch (pdata->clock_source_sel) {
|
|
- case AD7192_CLK_EXT_MCLK1_2:
|
|
- case AD7192_CLK_EXT_MCLK2:
|
|
- st->mclk = AD7192_INT_FREQ_MHZ;
|
|
- break;
|
|
case AD7192_CLK_INT:
|
|
case AD7192_CLK_INT_CO:
|
|
- if (pdata->ext_clk_hz)
|
|
- st->mclk = pdata->ext_clk_hz;
|
|
- else
|
|
- st->mclk = AD7192_INT_FREQ_MHZ;
|
|
+ st->mclk = AD7192_INT_FREQ_MHZ;
|
|
break;
|
|
+ case AD7192_CLK_EXT_MCLK1_2:
|
|
+ case AD7192_CLK_EXT_MCLK2:
|
|
+ if (ad7192_valid_external_frequency(pdata->ext_clk_hz)) {
|
|
+ st->mclk = pdata->ext_clk_hz;
|
|
+ break;
|
|
+ }
|
|
+ dev_err(&st->sd.spi->dev, "Invalid frequency setting %u\n",
|
|
+ pdata->ext_clk_hz);
|
|
+ ret = -EINVAL;
|
|
+ goto out;
|
|
default:
|
|
ret = -EINVAL;
|
|
goto out;
|
|
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c
|
|
index 3892a7470410..4c7465c2d91c 100644
|
|
--- a/drivers/staging/iio/impedance-analyzer/ad5933.c
|
|
+++ b/drivers/staging/iio/impedance-analyzer/ad5933.c
|
|
@@ -642,8 +642,6 @@ static int ad5933_register_ring_funcs_and_init(struct iio_dev *indio_dev)
|
|
/* Ring buffer functions - here trigger setup related */
|
|
indio_dev->setup_ops = &ad5933_ring_setup_ops;
|
|
|
|
- indio_dev->modes |= INDIO_BUFFER_HARDWARE;
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -754,7 +752,7 @@ static int ad5933_probe(struct i2c_client *client,
|
|
indio_dev->dev.parent = &client->dev;
|
|
indio_dev->info = &ad5933_info;
|
|
indio_dev->name = id->name;
|
|
- indio_dev->modes = INDIO_DIRECT_MODE;
|
|
+ indio_dev->modes = (INDIO_BUFFER_SOFTWARE | INDIO_DIRECT_MODE);
|
|
indio_dev->channels = ad5933_channels;
|
|
indio_dev->num_channels = ARRAY_SIZE(ad5933_channels);
|
|
|
|
diff --git a/drivers/staging/lustre/lnet/libcfs/linux/linux-crypto-adler.c b/drivers/staging/lustre/lnet/libcfs/linux/linux-crypto-adler.c
|
|
index db0572733712..ab30a0f5129c 100644
|
|
--- a/drivers/staging/lustre/lnet/libcfs/linux/linux-crypto-adler.c
|
|
+++ b/drivers/staging/lustre/lnet/libcfs/linux/linux-crypto-adler.c
|
|
@@ -119,6 +119,7 @@ static struct shash_alg alg = {
|
|
.cra_name = "adler32",
|
|
.cra_driver_name = "adler32-zlib",
|
|
.cra_priority = 100,
|
|
+ .cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
|
|
.cra_blocksize = CHKSUM_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(u32),
|
|
.cra_module = THIS_MODULE,
|
|
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
|
|
index a13541bdc726..6356295672cb 100644
|
|
--- a/drivers/thermal/Kconfig
|
|
+++ b/drivers/thermal/Kconfig
|
|
@@ -316,7 +316,7 @@ config X86_PKG_TEMP_THERMAL
|
|
|
|
config INTEL_SOC_DTS_IOSF_CORE
|
|
tristate
|
|
- depends on X86
|
|
+ depends on X86 && PCI
|
|
select IOSF_MBI
|
|
help
|
|
This is becoming a common feature for Intel SoCs to expose the additional
|
|
@@ -326,7 +326,7 @@ config INTEL_SOC_DTS_IOSF_CORE
|
|
|
|
config INTEL_SOC_DTS_THERMAL
|
|
tristate "Intel SoCs DTS thermal driver"
|
|
- depends on X86
|
|
+ depends on X86 && PCI
|
|
select INTEL_SOC_DTS_IOSF_CORE
|
|
select THERMAL_WRITABLE_TRIPS
|
|
help
|
|
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c
|
|
index fe414e7a9c78..a3e2200f5b5f 100644
|
|
--- a/drivers/usb/dwc3/dwc3-of-simple.c
|
|
+++ b/drivers/usb/dwc3/dwc3-of-simple.c
|
|
@@ -58,8 +58,10 @@ static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count)
|
|
|
|
clk = of_clk_get(np, i);
|
|
if (IS_ERR(clk)) {
|
|
- while (--i >= 0)
|
|
+ while (--i >= 0) {
|
|
+ clk_disable_unprepare(simple->clks[i]);
|
|
clk_put(simple->clks[i]);
|
|
+ }
|
|
return PTR_ERR(clk);
|
|
}
|
|
|
|
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
|
index 16c67120d72b..f483c3b1e971 100644
|
|
--- a/drivers/usb/dwc3/gadget.c
|
|
+++ b/drivers/usb/dwc3/gadget.c
|
|
@@ -247,7 +247,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
|
|
struct dwc3_gadget_ep_cmd_params *params)
|
|
{
|
|
struct dwc3 *dwc = dep->dwc;
|
|
- u32 timeout = 500;
|
|
+ u32 timeout = 1000;
|
|
u32 reg;
|
|
|
|
int cmd_status = 0;
|
|
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
|
|
index aac28d998073..2d9a8067eaca 100644
|
|
--- a/drivers/usb/musb/musb_core.c
|
|
+++ b/drivers/usb/musb/musb_core.c
|
|
@@ -2043,6 +2043,7 @@ struct musb_pending_work {
|
|
struct list_head node;
|
|
};
|
|
|
|
+#ifdef CONFIG_PM
|
|
/*
|
|
* Called from musb_runtime_resume(), musb_resume(), and
|
|
* musb_queue_resume_work(). Callers must take musb->lock.
|
|
@@ -2070,6 +2071,7 @@ static int musb_run_resume_work(struct musb *musb)
|
|
|
|
return error;
|
|
}
|
|
+#endif
|
|
|
|
/*
|
|
* Called to run work if device is active or else queue the work to happen
|
|
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
|
|
index b9c409a18faa..125cea1c3c8d 100644
|
|
--- a/drivers/usb/phy/Kconfig
|
|
+++ b/drivers/usb/phy/Kconfig
|
|
@@ -147,6 +147,7 @@ config USB_MSM_OTG
|
|
depends on (USB || USB_GADGET) && (ARCH_QCOM || COMPILE_TEST)
|
|
depends on USB_GADGET || !USB_GADGET # if USB_GADGET=m, this can't be 'y'
|
|
depends on RESET_CONTROLLER
|
|
+ depends on REGULATOR
|
|
depends on EXTCON
|
|
select USB_PHY
|
|
help
|
|
diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c
|
|
index 1886d8e4f14e..3550224f4d69 100644
|
|
--- a/drivers/usb/usbip/stub_dev.c
|
|
+++ b/drivers/usb/usbip/stub_dev.c
|
|
@@ -87,6 +87,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr,
|
|
goto err;
|
|
|
|
sdev->ud.tcp_socket = socket;
|
|
+ sdev->ud.sockfd = sockfd;
|
|
|
|
spin_unlock_irq(&sdev->ud.lock);
|
|
|
|
@@ -186,6 +187,7 @@ static void stub_shutdown_connection(struct usbip_device *ud)
|
|
if (ud->tcp_socket) {
|
|
sockfd_put(ud->tcp_socket);
|
|
ud->tcp_socket = NULL;
|
|
+ ud->sockfd = -1;
|
|
}
|
|
|
|
/* 3. free used data */
|
|
@@ -280,6 +282,7 @@ static struct stub_device *stub_device_alloc(struct usb_device *udev)
|
|
sdev->ud.status = SDEV_ST_AVAILABLE;
|
|
spin_lock_init(&sdev->ud.lock);
|
|
sdev->ud.tcp_socket = NULL;
|
|
+ sdev->ud.sockfd = -1;
|
|
|
|
INIT_LIST_HEAD(&sdev->priv_init);
|
|
INIT_LIST_HEAD(&sdev->priv_tx);
|
|
diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
|
|
index dbe615ba07c9..9936a2f199b1 100644
|
|
--- a/drivers/usb/usbip/vhci_hcd.c
|
|
+++ b/drivers/usb/usbip/vhci_hcd.c
|
|
@@ -832,6 +832,7 @@ static void vhci_shutdown_connection(struct usbip_device *ud)
|
|
if (vdev->ud.tcp_socket) {
|
|
sockfd_put(vdev->ud.tcp_socket);
|
|
vdev->ud.tcp_socket = NULL;
|
|
+ vdev->ud.sockfd = -1;
|
|
}
|
|
pr_info("release socket\n");
|
|
|
|
@@ -879,6 +880,7 @@ static void vhci_device_reset(struct usbip_device *ud)
|
|
if (ud->tcp_socket) {
|
|
sockfd_put(ud->tcp_socket);
|
|
ud->tcp_socket = NULL;
|
|
+ ud->sockfd = -1;
|
|
}
|
|
ud->status = VDEV_ST_NULL;
|
|
|
|
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
|
|
index 64613fbf5cf8..cd38f5add254 100644
|
|
--- a/drivers/vhost/vhost.c
|
|
+++ b/drivers/vhost/vhost.c
|
|
@@ -849,7 +849,7 @@ static void vhost_dev_lock_vqs(struct vhost_dev *d)
|
|
{
|
|
int i = 0;
|
|
for (i = 0; i < d->nvqs; ++i)
|
|
- mutex_lock(&d->vqs[i]->mutex);
|
|
+ mutex_lock_nested(&d->vqs[i]->mutex, i);
|
|
}
|
|
|
|
static void vhost_dev_unlock_vqs(struct vhost_dev *d)
|
|
diff --git a/drivers/video/fbdev/mmp/core.c b/drivers/video/fbdev/mmp/core.c
|
|
index a0f496049db7..3a6bb6561ba0 100644
|
|
--- a/drivers/video/fbdev/mmp/core.c
|
|
+++ b/drivers/video/fbdev/mmp/core.c
|
|
@@ -23,6 +23,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/export.h>
|
|
+#include <linux/module.h>
|
|
#include <video/mmp_disp.h>
|
|
|
|
static struct mmp_overlay *path_get_overlay(struct mmp_path *path,
|
|
@@ -249,3 +250,7 @@ void mmp_unregister_path(struct mmp_path *path)
|
|
mutex_unlock(&disp_lock);
|
|
}
|
|
EXPORT_SYMBOL_GPL(mmp_unregister_path);
|
|
+
|
|
+MODULE_AUTHOR("Zhou Zhu <zzhu3@marvell.com>");
|
|
+MODULE_DESCRIPTION("Marvell MMP display framework");
|
|
+MODULE_LICENSE("GPL");
|
|
diff --git a/drivers/video/fbdev/via/viafbdev.c b/drivers/video/fbdev/via/viafbdev.c
|
|
index f9718f012aae..badee04ef496 100644
|
|
--- a/drivers/video/fbdev/via/viafbdev.c
|
|
+++ b/drivers/video/fbdev/via/viafbdev.c
|
|
@@ -1630,16 +1630,14 @@ static void viafb_init_proc(struct viafb_shared *shared)
|
|
}
|
|
static void viafb_remove_proc(struct viafb_shared *shared)
|
|
{
|
|
- struct proc_dir_entry *viafb_entry = shared->proc_entry,
|
|
- *iga1_entry = shared->iga1_proc_entry,
|
|
- *iga2_entry = shared->iga2_proc_entry;
|
|
+ struct proc_dir_entry *viafb_entry = shared->proc_entry;
|
|
|
|
if (!viafb_entry)
|
|
return;
|
|
|
|
- remove_proc_entry("output_devices", iga2_entry);
|
|
+ remove_proc_entry("output_devices", shared->iga2_proc_entry);
|
|
remove_proc_entry("iga2", viafb_entry);
|
|
- remove_proc_entry("output_devices", iga1_entry);
|
|
+ remove_proc_entry("output_devices", shared->iga1_proc_entry);
|
|
remove_proc_entry("iga1", viafb_entry);
|
|
remove_proc_entry("supported_output_devices", viafb_entry);
|
|
|
|
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
|
|
index f15bb3b789d5..98b8f3205322 100644
|
|
--- a/drivers/xen/Kconfig
|
|
+++ b/drivers/xen/Kconfig
|
|
@@ -246,7 +246,7 @@ config XEN_ACPI_HOTPLUG_CPU
|
|
|
|
config XEN_ACPI_PROCESSOR
|
|
tristate "Xen ACPI processor"
|
|
- depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ
|
|
+ depends on XEN && XEN_DOM0 && X86 && ACPI_PROCESSOR && CPU_FREQ
|
|
default m
|
|
help
|
|
This ACPI processor uploads Power Management information to the Xen
|
|
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
|
|
index 0fe346c4bd28..d3dd631432eb 100644
|
|
--- a/fs/btrfs/ioctl.c
|
|
+++ b/fs/btrfs/ioctl.c
|
|
@@ -2244,7 +2244,7 @@ static noinline int btrfs_search_path_in_tree(struct btrfs_fs_info *info,
|
|
if (!path)
|
|
return -ENOMEM;
|
|
|
|
- ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX];
|
|
+ ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX - 1];
|
|
|
|
key.objectid = tree_id;
|
|
key.type = BTRFS_ROOT_ITEM_KEY;
|
|
diff --git a/fs/compat_binfmt_elf.c b/fs/compat_binfmt_elf.c
|
|
index 4d24d17bcfc1..943be5ecfcd9 100644
|
|
--- a/fs/compat_binfmt_elf.c
|
|
+++ b/fs/compat_binfmt_elf.c
|
|
@@ -51,6 +51,7 @@
|
|
#define elf_prstatus compat_elf_prstatus
|
|
#define elf_prpsinfo compat_elf_prpsinfo
|
|
|
|
+#ifdef CONFIG_ELF_CORE
|
|
/*
|
|
* Compat version of cputime_to_compat_timeval, perhaps this
|
|
* should be an inline in <linux/compat.h>.
|
|
@@ -63,6 +64,7 @@ static void cputime_to_compat_timeval(const cputime_t cputime,
|
|
value->tv_sec = tv.tv_sec;
|
|
value->tv_usec = tv.tv_usec;
|
|
}
|
|
+#endif
|
|
|
|
#undef cputime_to_timeval
|
|
#define cputime_to_timeval cputime_to_compat_timeval
|
|
diff --git a/fs/reiserfs/lbalance.c b/fs/reiserfs/lbalance.c
|
|
index 249594a821e0..f5cebd70d903 100644
|
|
--- a/fs/reiserfs/lbalance.c
|
|
+++ b/fs/reiserfs/lbalance.c
|
|
@@ -475,7 +475,7 @@ static void leaf_item_bottle(struct buffer_info *dest_bi,
|
|
* 'cpy_bytes'; create new item header;
|
|
* n_ih = new item_header;
|
|
*/
|
|
- memcpy(&n_ih, ih, SHORT_KEY_SIZE);
|
|
+ memcpy(&n_ih.ih_key, &ih->ih_key, KEY_SIZE);
|
|
|
|
/* Endian safe, both le */
|
|
n_ih.ih_version = ih->ih_version;
|
|
diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h
|
|
index 2adcde137c3f..5dcf3ab83886 100644
|
|
--- a/fs/reiserfs/reiserfs.h
|
|
+++ b/fs/reiserfs/reiserfs.h
|
|
@@ -1326,7 +1326,6 @@ struct cpu_key {
|
|
#define KEY_NOT_FOUND 0
|
|
|
|
#define KEY_SIZE (sizeof(struct reiserfs_key))
|
|
-#define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32))
|
|
|
|
/* return values for search_by_key and clones */
|
|
#define ITEM_FOUND 1
|
|
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
|
|
index 26605888a199..d3de3b819ec0 100644
|
|
--- a/include/crypto/hash.h
|
|
+++ b/include/crypto/hash.h
|
|
@@ -205,7 +205,6 @@ struct crypto_ahash {
|
|
unsigned int keylen);
|
|
|
|
unsigned int reqsize;
|
|
- bool has_setkey;
|
|
struct crypto_tfm base;
|
|
};
|
|
|
|
@@ -399,11 +398,6 @@ static inline void *ahash_request_ctx(struct ahash_request *req)
|
|
int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|
unsigned int keylen);
|
|
|
|
-static inline bool crypto_ahash_has_setkey(struct crypto_ahash *tfm)
|
|
-{
|
|
- return tfm->has_setkey;
|
|
-}
|
|
-
|
|
/**
|
|
* crypto_ahash_finup() - update and finalize message digest
|
|
* @req: reference to the ahash_request handle that holds all information
|
|
@@ -475,7 +469,12 @@ static inline int crypto_ahash_export(struct ahash_request *req, void *out)
|
|
*/
|
|
static inline int crypto_ahash_import(struct ahash_request *req, const void *in)
|
|
{
|
|
- return crypto_ahash_reqtfm(req)->import(req, in);
|
|
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
|
+
|
|
+ if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
+ return tfm->import(req, in);
|
|
}
|
|
|
|
/**
|
|
@@ -492,7 +491,12 @@ static inline int crypto_ahash_import(struct ahash_request *req, const void *in)
|
|
*/
|
|
static inline int crypto_ahash_init(struct ahash_request *req)
|
|
{
|
|
- return crypto_ahash_reqtfm(req)->init(req);
|
|
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
|
+
|
|
+ if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
+ return tfm->init(req);
|
|
}
|
|
|
|
/**
|
|
@@ -845,7 +849,12 @@ static inline int crypto_shash_export(struct shash_desc *desc, void *out)
|
|
*/
|
|
static inline int crypto_shash_import(struct shash_desc *desc, const void *in)
|
|
{
|
|
- return crypto_shash_alg(desc->tfm)->import(desc, in);
|
|
+ struct crypto_shash *tfm = desc->tfm;
|
|
+
|
|
+ if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
+ return crypto_shash_alg(tfm)->import(desc, in);
|
|
}
|
|
|
|
/**
|
|
@@ -861,7 +870,12 @@ static inline int crypto_shash_import(struct shash_desc *desc, const void *in)
|
|
*/
|
|
static inline int crypto_shash_init(struct shash_desc *desc)
|
|
{
|
|
- return crypto_shash_alg(desc->tfm)->init(desc);
|
|
+ struct crypto_shash *tfm = desc->tfm;
|
|
+
|
|
+ if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
|
+ return -ENOKEY;
|
|
+
|
|
+ return crypto_shash_alg(tfm)->init(desc);
|
|
}
|
|
|
|
/**
|
|
diff --git a/include/linux/crypto.h b/include/linux/crypto.h
|
|
index 7cee5551625b..8edb3ba6f640 100644
|
|
--- a/include/linux/crypto.h
|
|
+++ b/include/linux/crypto.h
|
|
@@ -102,9 +102,17 @@
|
|
*/
|
|
#define CRYPTO_ALG_INTERNAL 0x00002000
|
|
|
|
+/*
|
|
+ * Set if the algorithm has a ->setkey() method but can be used without
|
|
+ * calling it first, i.e. there is a default key.
|
|
+ */
|
|
+#define CRYPTO_ALG_OPTIONAL_KEY 0x00004000
|
|
+
|
|
/*
|
|
* Transform masks and values (for crt_flags).
|
|
*/
|
|
+#define CRYPTO_TFM_NEED_KEY 0x00000001
|
|
+
|
|
#define CRYPTO_TFM_REQ_MASK 0x000fff00
|
|
#define CRYPTO_TFM_RES_MASK 0xfff00000
|
|
|
|
diff --git a/include/linux/pci-ecam.h b/include/linux/pci-ecam.h
|
|
index 7adad206b1f4..e19efac11d13 100644
|
|
--- a/include/linux/pci-ecam.h
|
|
+++ b/include/linux/pci-ecam.h
|
|
@@ -59,7 +59,7 @@ void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
|
|
/* default ECAM ops */
|
|
extern struct pci_ecam_ops pci_generic_ecam_ops;
|
|
|
|
-#ifdef CONFIG_PCI_HOST_GENERIC
|
|
+#ifdef CONFIG_PCI_HOST_COMMON
|
|
/* for DT-based PCI controllers that support ECAM */
|
|
int pci_host_common_probe(struct platform_device *pdev,
|
|
struct pci_ecam_ops *ops);
|
|
diff --git a/include/linux/ptr_ring.h b/include/linux/ptr_ring.h
|
|
index e38f471a5402..05c6d20c2a7a 100644
|
|
--- a/include/linux/ptr_ring.h
|
|
+++ b/include/linux/ptr_ring.h
|
|
@@ -351,6 +351,8 @@ static inline void *ptr_ring_consume_bh(struct ptr_ring *r)
|
|
|
|
static inline void **__ptr_ring_init_queue_alloc(unsigned int size, gfp_t gfp)
|
|
{
|
|
+ if (size * sizeof(void *) > KMALLOC_MAX_SIZE)
|
|
+ return NULL;
|
|
return kcalloc(size, sizeof(void *), gfp);
|
|
}
|
|
|
|
diff --git a/include/linux/string.h b/include/linux/string.h
|
|
index 26b6f6a66f83..0c88c0a1a72b 100644
|
|
--- a/include/linux/string.h
|
|
+++ b/include/linux/string.h
|
|
@@ -123,6 +123,7 @@ extern char *kstrdup(const char *s, gfp_t gfp) __malloc;
|
|
extern const char *kstrdup_const(const char *s, gfp_t gfp);
|
|
extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
|
|
extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
|
|
+extern char *kmemdup_nul(const char *s, size_t len, gfp_t gfp);
|
|
|
|
extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
|
|
extern void argv_free(char **argv);
|
|
diff --git a/include/net/red.h b/include/net/red.h
|
|
index 76e0b5f922c6..3618cdfec884 100644
|
|
--- a/include/net/red.h
|
|
+++ b/include/net/red.h
|
|
@@ -167,6 +167,17 @@ static inline void red_set_vars(struct red_vars *v)
|
|
v->qcount = -1;
|
|
}
|
|
|
|
+static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog)
|
|
+{
|
|
+ if (fls(qth_min) + Wlog > 32)
|
|
+ return false;
|
|
+ if (fls(qth_max) + Wlog > 32)
|
|
+ return false;
|
|
+ if (qth_max < qth_min)
|
|
+ return false;
|
|
+ return true;
|
|
+}
|
|
+
|
|
static inline void red_set_parms(struct red_parms *p,
|
|
u32 qth_min, u32 qth_max, u8 Wlog, u8 Plog,
|
|
u8 Scell_log, u8 *stab, u32 max_P)
|
|
@@ -178,7 +189,7 @@ static inline void red_set_parms(struct red_parms *p,
|
|
p->qth_max = qth_max << Wlog;
|
|
p->Wlog = Wlog;
|
|
p->Plog = Plog;
|
|
- if (delta < 0)
|
|
+ if (delta <= 0)
|
|
delta = 1;
|
|
p->qth_delta = delta;
|
|
if (!max_P) {
|
|
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
|
|
index 61d9ce89d10d..579ded2c6ef1 100644
|
|
--- a/include/net/sctp/sctp.h
|
|
+++ b/include/net/sctp/sctp.h
|
|
@@ -433,7 +433,8 @@ static inline int sctp_frag_point(const struct sctp_association *asoc, int pmtu)
|
|
if (asoc->user_frag)
|
|
frag = min_t(int, frag, asoc->user_frag);
|
|
|
|
- frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN));
|
|
+ frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN -
|
|
+ sizeof(struct sctp_data_chunk)));
|
|
|
|
return frag;
|
|
}
|
|
diff --git a/include/trace/events/clk.h b/include/trace/events/clk.h
|
|
index 758607226bfd..2cd449328aee 100644
|
|
--- a/include/trace/events/clk.h
|
|
+++ b/include/trace/events/clk.h
|
|
@@ -134,12 +134,12 @@ DECLARE_EVENT_CLASS(clk_parent,
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, core->name )
|
|
- __string( pname, parent->name )
|
|
+ __string( pname, parent ? parent->name : "none" )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, core->name);
|
|
- __assign_str(pname, parent->name);
|
|
+ __assign_str(pname, parent ? parent->name : "none");
|
|
),
|
|
|
|
TP_printk("%s %s", __get_str(name), __get_str(pname))
|
|
diff --git a/kernel/kcov.c b/kernel/kcov.c
|
|
index 3cbb0c879705..3883df58aa12 100644
|
|
--- a/kernel/kcov.c
|
|
+++ b/kernel/kcov.c
|
|
@@ -220,9 +220,9 @@ static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd,
|
|
if (unused != 0 || kcov->mode == KCOV_MODE_DISABLED ||
|
|
kcov->area == NULL)
|
|
return -EINVAL;
|
|
- if (kcov->t != NULL)
|
|
- return -EBUSY;
|
|
t = current;
|
|
+ if (kcov->t != NULL || t->kcov != NULL)
|
|
+ return -EBUSY;
|
|
/* Cache in task struct for performance. */
|
|
t->kcov_size = kcov->size;
|
|
t->kcov_area = kcov->area;
|
|
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
|
|
index dbafc5df03f3..4e17d55ba127 100644
|
|
--- a/kernel/trace/blktrace.c
|
|
+++ b/kernel/trace/blktrace.c
|
|
@@ -57,7 +57,8 @@ static struct tracer_flags blk_tracer_flags = {
|
|
};
|
|
|
|
/* Global reference count of probes */
|
|
-static atomic_t blk_probes_ref = ATOMIC_INIT(0);
|
|
+static DEFINE_MUTEX(blk_probe_mutex);
|
|
+static int blk_probes_ref;
|
|
|
|
static void blk_register_tracepoints(void);
|
|
static void blk_unregister_tracepoints(void);
|
|
@@ -306,11 +307,26 @@ static void blk_trace_free(struct blk_trace *bt)
|
|
kfree(bt);
|
|
}
|
|
|
|
+static void get_probe_ref(void)
|
|
+{
|
|
+ mutex_lock(&blk_probe_mutex);
|
|
+ if (++blk_probes_ref == 1)
|
|
+ blk_register_tracepoints();
|
|
+ mutex_unlock(&blk_probe_mutex);
|
|
+}
|
|
+
|
|
+static void put_probe_ref(void)
|
|
+{
|
|
+ mutex_lock(&blk_probe_mutex);
|
|
+ if (!--blk_probes_ref)
|
|
+ blk_unregister_tracepoints();
|
|
+ mutex_unlock(&blk_probe_mutex);
|
|
+}
|
|
+
|
|
static void blk_trace_cleanup(struct blk_trace *bt)
|
|
{
|
|
blk_trace_free(bt);
|
|
- if (atomic_dec_and_test(&blk_probes_ref))
|
|
- blk_unregister_tracepoints();
|
|
+ put_probe_ref();
|
|
}
|
|
|
|
int blk_trace_remove(struct request_queue *q)
|
|
@@ -522,8 +538,7 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
|
if (cmpxchg(&q->blk_trace, NULL, bt))
|
|
goto err;
|
|
|
|
- if (atomic_inc_return(&blk_probes_ref) == 1)
|
|
- blk_register_tracepoints();
|
|
+ get_probe_ref();
|
|
|
|
return 0;
|
|
err:
|
|
@@ -1469,9 +1484,7 @@ static int blk_trace_remove_queue(struct request_queue *q)
|
|
if (bt == NULL)
|
|
return -EINVAL;
|
|
|
|
- if (atomic_dec_and_test(&blk_probes_ref))
|
|
- blk_unregister_tracepoints();
|
|
-
|
|
+ put_probe_ref();
|
|
blk_trace_free(bt);
|
|
return 0;
|
|
}
|
|
@@ -1502,8 +1515,7 @@ static int blk_trace_setup_queue(struct request_queue *q,
|
|
if (cmpxchg(&q->blk_trace, NULL, bt))
|
|
goto free_bt;
|
|
|
|
- if (atomic_inc_return(&blk_probes_ref) == 1)
|
|
- blk_register_tracepoints();
|
|
+ get_probe_ref();
|
|
return 0;
|
|
|
|
free_bt:
|
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
|
index f60e67217f18..58a22ca10f33 100644
|
|
--- a/lib/Kconfig.debug
|
|
+++ b/lib/Kconfig.debug
|
|
@@ -197,7 +197,6 @@ config ENABLE_MUST_CHECK
|
|
config FRAME_WARN
|
|
int "Warn for stack frames larger than (needs gcc 4.4)"
|
|
range 0 8192
|
|
- default 0 if KASAN
|
|
default 2048 if GCC_PLUGIN_LATENT_ENTROPY
|
|
default 1024 if !64BIT
|
|
default 2048 if 64BIT
|
|
diff --git a/lib/oid_registry.c b/lib/oid_registry.c
|
|
index 318f382a010d..150e04d70303 100644
|
|
--- a/lib/oid_registry.c
|
|
+++ b/lib/oid_registry.c
|
|
@@ -116,7 +116,7 @@ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize)
|
|
int count;
|
|
|
|
if (v >= end)
|
|
- return -EBADMSG;
|
|
+ goto bad;
|
|
|
|
n = *v++;
|
|
ret = count = snprintf(buffer, bufsize, "%u.%u", n / 40, n % 40);
|
|
@@ -134,7 +134,7 @@ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize)
|
|
num = n & 0x7f;
|
|
do {
|
|
if (v >= end)
|
|
- return -EBADMSG;
|
|
+ goto bad;
|
|
n = *v++;
|
|
num <<= 7;
|
|
num |= n & 0x7f;
|
|
@@ -148,6 +148,10 @@ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize)
|
|
}
|
|
|
|
return ret;
|
|
+
|
|
+bad:
|
|
+ snprintf(buffer, bufsize, "(bad)");
|
|
+ return -EBADMSG;
|
|
}
|
|
EXPORT_SYMBOL_GPL(sprint_oid);
|
|
|
|
diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c
|
|
index 6d5717bd7197..57540de2b44c 100644
|
|
--- a/mm/early_ioremap.c
|
|
+++ b/mm/early_ioremap.c
|
|
@@ -103,7 +103,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
|
|
enum fixed_addresses idx;
|
|
int i, slot;
|
|
|
|
- WARN_ON(system_state != SYSTEM_BOOTING);
|
|
+ WARN_ON(system_state >= SYSTEM_RUNNING);
|
|
|
|
slot = -1;
|
|
for (i = 0; i < FIX_BTMAPS_SLOTS; i++) {
|
|
diff --git a/mm/shmem.c b/mm/shmem.c
|
|
index 004e0f87e8a8..2123bfc39ef2 100644
|
|
--- a/mm/shmem.c
|
|
+++ b/mm/shmem.c
|
|
@@ -370,6 +370,7 @@ static bool shmem_confirm_swap(struct address_space *mapping,
|
|
|
|
int shmem_huge __read_mostly;
|
|
|
|
+#if defined(CONFIG_SYSFS) || defined(CONFIG_TMPFS)
|
|
static int shmem_parse_huge(const char *str)
|
|
{
|
|
if (!strcmp(str, "never"))
|
|
@@ -407,6 +408,7 @@ static const char *shmem_format_huge(int huge)
|
|
return "bad_val";
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo,
|
|
struct shrink_control *sc, unsigned long nr_to_split)
|
|
@@ -1550,7 +1552,7 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
|
|
struct mm_struct *fault_mm, int *fault_type)
|
|
{
|
|
struct address_space *mapping = inode->i_mapping;
|
|
- struct shmem_inode_info *info;
|
|
+ struct shmem_inode_info *info = SHMEM_I(inode);
|
|
struct shmem_sb_info *sbinfo;
|
|
struct mm_struct *charge_mm;
|
|
struct mem_cgroup *memcg;
|
|
@@ -1600,7 +1602,6 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
|
|
* Fast cache lookup did not find it:
|
|
* bring it back from swap or allocate.
|
|
*/
|
|
- info = SHMEM_I(inode);
|
|
sbinfo = SHMEM_SB(inode->i_sb);
|
|
charge_mm = fault_mm ? : current->mm;
|
|
|
|
@@ -1852,7 +1853,6 @@ alloc_nohuge: page = shmem_alloc_and_acct_page(gfp, info, sbinfo,
|
|
put_page(page);
|
|
}
|
|
if (error == -ENOSPC && !once++) {
|
|
- info = SHMEM_I(inode);
|
|
spin_lock_irq(&info->lock);
|
|
shmem_recalc_inode(inode);
|
|
spin_unlock_irq(&info->lock);
|
|
diff --git a/mm/util.c b/mm/util.c
|
|
index 1a41553db866..8c755d05d4e6 100644
|
|
--- a/mm/util.c
|
|
+++ b/mm/util.c
|
|
@@ -80,6 +80,8 @@ EXPORT_SYMBOL(kstrdup_const);
|
|
* @s: the string to duplicate
|
|
* @max: read at most @max chars from @s
|
|
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
|
|
+ *
|
|
+ * Note: Use kmemdup_nul() instead if the size is known exactly.
|
|
*/
|
|
char *kstrndup(const char *s, size_t max, gfp_t gfp)
|
|
{
|
|
@@ -117,6 +119,28 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)
|
|
}
|
|
EXPORT_SYMBOL(kmemdup);
|
|
|
|
+/**
|
|
+ * kmemdup_nul - Create a NUL-terminated string from unterminated data
|
|
+ * @s: The data to stringify
|
|
+ * @len: The size of the data
|
|
+ * @gfp: the GFP mask used in the kmalloc() call when allocating memory
|
|
+ */
|
|
+char *kmemdup_nul(const char *s, size_t len, gfp_t gfp)
|
|
+{
|
|
+ char *buf;
|
|
+
|
|
+ if (!s)
|
|
+ return NULL;
|
|
+
|
|
+ buf = kmalloc_track_caller(len + 1, gfp);
|
|
+ if (buf) {
|
|
+ memcpy(buf, s, len);
|
|
+ buf[len] = '\0';
|
|
+ }
|
|
+ return buf;
|
|
+}
|
|
+EXPORT_SYMBOL(kmemdup_nul);
|
|
+
|
|
/**
|
|
* memdup_user - duplicate memory region from user space
|
|
*
|
|
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
|
index f118dc23f662..4365de74bdb0 100644
|
|
--- a/mm/vmscan.c
|
|
+++ b/mm/vmscan.c
|
|
@@ -295,10 +295,13 @@ EXPORT_SYMBOL(register_shrinker);
|
|
*/
|
|
void unregister_shrinker(struct shrinker *shrinker)
|
|
{
|
|
+ if (!shrinker->nr_deferred)
|
|
+ return;
|
|
down_write(&shrinker_rwsem);
|
|
list_del(&shrinker->list);
|
|
up_write(&shrinker_rwsem);
|
|
kfree(shrinker->nr_deferred);
|
|
+ shrinker->nr_deferred = NULL;
|
|
}
|
|
EXPORT_SYMBOL(unregister_shrinker);
|
|
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 67b5d4d8acb1..8898618bf341 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -2763,7 +2763,7 @@ struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
|
|
|
|
segs = skb_mac_gso_segment(skb, features);
|
|
|
|
- if (unlikely(skb_needs_check(skb, tx_path)))
|
|
+ if (unlikely(skb_needs_check(skb, tx_path) && !IS_ERR(segs)))
|
|
skb_warn_bad_offload(skb);
|
|
|
|
return segs;
|
|
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
|
|
index 13d6b1a6e0fc..9d8fcdefefc0 100644
|
|
--- a/net/decnet/af_decnet.c
|
|
+++ b/net/decnet/af_decnet.c
|
|
@@ -1337,6 +1337,12 @@ static int dn_setsockopt(struct socket *sock, int level, int optname, char __use
|
|
lock_sock(sk);
|
|
err = __dn_setsockopt(sock, level, optname, optval, optlen, 0);
|
|
release_sock(sk);
|
|
+#ifdef CONFIG_NETFILTER
|
|
+ /* we need to exclude all possible ENOPROTOOPTs except default case */
|
|
+ if (err == -ENOPROTOOPT && optname != DSO_LINKINFO &&
|
|
+ optname != DSO_STREAM && optname != DSO_SEQPACKET)
|
|
+ err = nf_setsockopt(sk, PF_DECnet, optname, optval, optlen);
|
|
+#endif
|
|
|
|
return err;
|
|
}
|
|
@@ -1444,15 +1450,6 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us
|
|
dn_nsp_send_disc(sk, 0x38, 0, sk->sk_allocation);
|
|
break;
|
|
|
|
- default:
|
|
-#ifdef CONFIG_NETFILTER
|
|
- return nf_setsockopt(sk, PF_DECnet, optname, optval, optlen);
|
|
-#endif
|
|
- case DSO_LINKINFO:
|
|
- case DSO_STREAM:
|
|
- case DSO_SEQPACKET:
|
|
- return -ENOPROTOOPT;
|
|
-
|
|
case DSO_MAXWINDOW:
|
|
if (optlen != sizeof(unsigned long))
|
|
return -EINVAL;
|
|
@@ -1500,6 +1497,12 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us
|
|
return -EINVAL;
|
|
scp->info_loc = u.info;
|
|
break;
|
|
+
|
|
+ case DSO_LINKINFO:
|
|
+ case DSO_STREAM:
|
|
+ case DSO_SEQPACKET:
|
|
+ default:
|
|
+ return -ENOPROTOOPT;
|
|
}
|
|
|
|
return 0;
|
|
@@ -1513,6 +1516,20 @@ static int dn_getsockopt(struct socket *sock, int level, int optname, char __use
|
|
lock_sock(sk);
|
|
err = __dn_getsockopt(sock, level, optname, optval, optlen, 0);
|
|
release_sock(sk);
|
|
+#ifdef CONFIG_NETFILTER
|
|
+ if (err == -ENOPROTOOPT && optname != DSO_STREAM &&
|
|
+ optname != DSO_SEQPACKET && optname != DSO_CONACCEPT &&
|
|
+ optname != DSO_CONREJECT) {
|
|
+ int len;
|
|
+
|
|
+ if (get_user(len, optlen))
|
|
+ return -EFAULT;
|
|
+
|
|
+ err = nf_getsockopt(sk, PF_DECnet, optname, optval, &len);
|
|
+ if (err >= 0)
|
|
+ err = put_user(len, optlen);
|
|
+ }
|
|
+#endif
|
|
|
|
return err;
|
|
}
|
|
@@ -1578,26 +1595,6 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
|
|
r_data = &link;
|
|
break;
|
|
|
|
- default:
|
|
-#ifdef CONFIG_NETFILTER
|
|
- {
|
|
- int ret, len;
|
|
-
|
|
- if (get_user(len, optlen))
|
|
- return -EFAULT;
|
|
-
|
|
- ret = nf_getsockopt(sk, PF_DECnet, optname, optval, &len);
|
|
- if (ret >= 0)
|
|
- ret = put_user(len, optlen);
|
|
- return ret;
|
|
- }
|
|
-#endif
|
|
- case DSO_STREAM:
|
|
- case DSO_SEQPACKET:
|
|
- case DSO_CONACCEPT:
|
|
- case DSO_CONREJECT:
|
|
- return -ENOPROTOOPT;
|
|
-
|
|
case DSO_MAXWINDOW:
|
|
if (r_len > sizeof(unsigned long))
|
|
r_len = sizeof(unsigned long);
|
|
@@ -1629,6 +1626,13 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
|
|
r_len = sizeof(unsigned char);
|
|
r_data = &scp->info_rem;
|
|
break;
|
|
+
|
|
+ case DSO_STREAM:
|
|
+ case DSO_SEQPACKET:
|
|
+ case DSO_CONACCEPT:
|
|
+ case DSO_CONREJECT:
|
|
+ default:
|
|
+ return -ENOPROTOOPT;
|
|
}
|
|
|
|
if (r_data) {
|
|
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
|
|
index 551dd393ceec..bf62fa487262 100644
|
|
--- a/net/ipv4/ip_sockglue.c
|
|
+++ b/net/ipv4/ip_sockglue.c
|
|
@@ -1243,11 +1243,8 @@ int ip_setsockopt(struct sock *sk, int level,
|
|
if (err == -ENOPROTOOPT && optname != IP_HDRINCL &&
|
|
optname != IP_IPSEC_POLICY &&
|
|
optname != IP_XFRM_POLICY &&
|
|
- !ip_mroute_opt(optname)) {
|
|
- lock_sock(sk);
|
|
+ !ip_mroute_opt(optname))
|
|
err = nf_setsockopt(sk, PF_INET, optname, optval, optlen);
|
|
- release_sock(sk);
|
|
- }
|
|
#endif
|
|
return err;
|
|
}
|
|
@@ -1272,12 +1269,9 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname,
|
|
if (err == -ENOPROTOOPT && optname != IP_HDRINCL &&
|
|
optname != IP_IPSEC_POLICY &&
|
|
optname != IP_XFRM_POLICY &&
|
|
- !ip_mroute_opt(optname)) {
|
|
- lock_sock(sk);
|
|
- err = compat_nf_setsockopt(sk, PF_INET, optname,
|
|
- optval, optlen);
|
|
- release_sock(sk);
|
|
- }
|
|
+ !ip_mroute_opt(optname))
|
|
+ err = compat_nf_setsockopt(sk, PF_INET, optname, optval,
|
|
+ optlen);
|
|
#endif
|
|
return err;
|
|
}
|
|
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c
|
|
index 4a9e6db9df8d..16599bae11dd 100644
|
|
--- a/net/ipv4/netfilter/ipt_CLUSTERIP.c
|
|
+++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c
|
|
@@ -365,7 +365,7 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par)
|
|
struct ipt_clusterip_tgt_info *cipinfo = par->targinfo;
|
|
const struct ipt_entry *e = par->entryinfo;
|
|
struct clusterip_config *config;
|
|
- int ret;
|
|
+ int ret, i;
|
|
|
|
if (par->nft_compat) {
|
|
pr_err("cannot use CLUSTERIP target from nftables compat\n");
|
|
@@ -384,8 +384,18 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par)
|
|
pr_info("Please specify destination IP\n");
|
|
return -EINVAL;
|
|
}
|
|
-
|
|
- /* FIXME: further sanity checks */
|
|
+ if (cipinfo->num_local_nodes > ARRAY_SIZE(cipinfo->local_nodes)) {
|
|
+ pr_info("bad num_local_nodes %u\n", cipinfo->num_local_nodes);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ for (i = 0; i < cipinfo->num_local_nodes; i++) {
|
|
+ if (cipinfo->local_nodes[i] - 1 >=
|
|
+ sizeof(config->local_nodes) * 8) {
|
|
+ pr_info("bad local_nodes[%d] %u\n",
|
|
+ i, cipinfo->local_nodes[i]);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ }
|
|
|
|
config = clusterip_config_find_get(par->net, e->ip.dst.s_addr, 1);
|
|
if (!config) {
|
|
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
|
|
index 0c9ded247ebb..6dc8eab0fabc 100644
|
|
--- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
|
|
+++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
|
|
@@ -218,15 +218,19 @@ getorigdst(struct sock *sk, int optval, void __user *user, int *len)
|
|
struct nf_conntrack_tuple tuple;
|
|
|
|
memset(&tuple, 0, sizeof(tuple));
|
|
+
|
|
+ lock_sock(sk);
|
|
tuple.src.u3.ip = inet->inet_rcv_saddr;
|
|
tuple.src.u.tcp.port = inet->inet_sport;
|
|
tuple.dst.u3.ip = inet->inet_daddr;
|
|
tuple.dst.u.tcp.port = inet->inet_dport;
|
|
tuple.src.l3num = PF_INET;
|
|
tuple.dst.protonum = sk->sk_protocol;
|
|
+ release_sock(sk);
|
|
|
|
/* We only do TCP and SCTP at the moment: is there a better way? */
|
|
- if (sk->sk_protocol != IPPROTO_TCP && sk->sk_protocol != IPPROTO_SCTP) {
|
|
+ if (tuple.dst.protonum != IPPROTO_TCP &&
|
|
+ tuple.dst.protonum != IPPROTO_SCTP) {
|
|
pr_debug("SO_ORIGINAL_DST: Not a TCP/SCTP socket\n");
|
|
return -ENOPROTOOPT;
|
|
}
|
|
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
|
|
index bcea985dd76b..493a32f6a5f2 100644
|
|
--- a/net/ipv6/ipv6_sockglue.c
|
|
+++ b/net/ipv6/ipv6_sockglue.c
|
|
@@ -907,12 +907,8 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|
#ifdef CONFIG_NETFILTER
|
|
/* we need to exclude all possible ENOPROTOOPTs except default case */
|
|
if (err == -ENOPROTOOPT && optname != IPV6_IPSEC_POLICY &&
|
|
- optname != IPV6_XFRM_POLICY) {
|
|
- lock_sock(sk);
|
|
- err = nf_setsockopt(sk, PF_INET6, optname, optval,
|
|
- optlen);
|
|
- release_sock(sk);
|
|
- }
|
|
+ optname != IPV6_XFRM_POLICY)
|
|
+ err = nf_setsockopt(sk, PF_INET6, optname, optval, optlen);
|
|
#endif
|
|
return err;
|
|
}
|
|
@@ -942,12 +938,9 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|
#ifdef CONFIG_NETFILTER
|
|
/* we need to exclude all possible ENOPROTOOPTs except default case */
|
|
if (err == -ENOPROTOOPT && optname != IPV6_IPSEC_POLICY &&
|
|
- optname != IPV6_XFRM_POLICY) {
|
|
- lock_sock(sk);
|
|
- err = compat_nf_setsockopt(sk, PF_INET6, optname,
|
|
- optval, optlen);
|
|
- release_sock(sk);
|
|
- }
|
|
+ optname != IPV6_XFRM_POLICY)
|
|
+ err = compat_nf_setsockopt(sk, PF_INET6, optname, optval,
|
|
+ optlen);
|
|
#endif
|
|
return err;
|
|
}
|
|
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
index 963ee3848675..af80e97f59b5 100644
|
|
--- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
@@ -226,20 +226,27 @@ static struct nf_hook_ops ipv6_conntrack_ops[] __read_mostly = {
|
|
static int
|
|
ipv6_getorigdst(struct sock *sk, int optval, void __user *user, int *len)
|
|
{
|
|
- const struct inet_sock *inet = inet_sk(sk);
|
|
+ struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 };
|
|
const struct ipv6_pinfo *inet6 = inet6_sk(sk);
|
|
+ const struct inet_sock *inet = inet_sk(sk);
|
|
const struct nf_conntrack_tuple_hash *h;
|
|
struct sockaddr_in6 sin6;
|
|
- struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 };
|
|
struct nf_conn *ct;
|
|
+ __be32 flow_label;
|
|
+ int bound_dev_if;
|
|
|
|
+ lock_sock(sk);
|
|
tuple.src.u3.in6 = sk->sk_v6_rcv_saddr;
|
|
tuple.src.u.tcp.port = inet->inet_sport;
|
|
tuple.dst.u3.in6 = sk->sk_v6_daddr;
|
|
tuple.dst.u.tcp.port = inet->inet_dport;
|
|
tuple.dst.protonum = sk->sk_protocol;
|
|
+ bound_dev_if = sk->sk_bound_dev_if;
|
|
+ flow_label = inet6->flow_label;
|
|
+ release_sock(sk);
|
|
|
|
- if (sk->sk_protocol != IPPROTO_TCP && sk->sk_protocol != IPPROTO_SCTP)
|
|
+ if (tuple.dst.protonum != IPPROTO_TCP &&
|
|
+ tuple.dst.protonum != IPPROTO_SCTP)
|
|
return -ENOPROTOOPT;
|
|
|
|
if (*len < 0 || (unsigned int) *len < sizeof(sin6))
|
|
@@ -257,14 +264,13 @@ ipv6_getorigdst(struct sock *sk, int optval, void __user *user, int *len)
|
|
|
|
sin6.sin6_family = AF_INET6;
|
|
sin6.sin6_port = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u.tcp.port;
|
|
- sin6.sin6_flowinfo = inet6->flow_label & IPV6_FLOWINFO_MASK;
|
|
+ sin6.sin6_flowinfo = flow_label & IPV6_FLOWINFO_MASK;
|
|
memcpy(&sin6.sin6_addr,
|
|
&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.in6,
|
|
sizeof(sin6.sin6_addr));
|
|
|
|
nf_ct_put(ct);
|
|
- sin6.sin6_scope_id = ipv6_iface_scope_id(&sin6.sin6_addr,
|
|
- sk->sk_bound_dev_if);
|
|
+ sin6.sin6_scope_id = ipv6_iface_scope_id(&sin6.sin6_addr, bound_dev_if);
|
|
return copy_to_user(user, &sin6, sizeof(sin6)) ? -EFAULT : 0;
|
|
}
|
|
|
|
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
|
|
index 22785dc03051..179cd9b1b1f4 100644
|
|
--- a/net/kcm/kcmsock.c
|
|
+++ b/net/kcm/kcmsock.c
|
|
@@ -1381,8 +1381,13 @@ static int kcm_attach(struct socket *sock, struct socket *csock,
|
|
if (!csk)
|
|
return -EINVAL;
|
|
|
|
- /* We must prevent loops or risk deadlock ! */
|
|
- if (csk->sk_family == PF_KCM)
|
|
+ /* Only allow TCP sockets to be attached for now */
|
|
+ if ((csk->sk_family != AF_INET && csk->sk_family != AF_INET6) ||
|
|
+ csk->sk_protocol != IPPROTO_TCP)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ /* Don't allow listeners or closed sockets */
|
|
+ if (csk->sk_state == TCP_LISTEN || csk->sk_state == TCP_CLOSE)
|
|
return -EOPNOTSUPP;
|
|
|
|
psock = kmem_cache_zalloc(kcm_psockp, GFP_KERNEL);
|
|
@@ -1404,9 +1409,18 @@ static int kcm_attach(struct socket *sock, struct socket *csock,
|
|
return err;
|
|
}
|
|
|
|
- sock_hold(csk);
|
|
-
|
|
write_lock_bh(&csk->sk_callback_lock);
|
|
+
|
|
+ /* Check if sk_user_data is aready by KCM or someone else.
|
|
+ * Must be done under lock to prevent race conditions.
|
|
+ */
|
|
+ if (csk->sk_user_data) {
|
|
+ write_unlock_bh(&csk->sk_callback_lock);
|
|
+ strp_done(&psock->strp);
|
|
+ kmem_cache_free(kcm_psockp, psock);
|
|
+ return -EALREADY;
|
|
+ }
|
|
+
|
|
psock->save_data_ready = csk->sk_data_ready;
|
|
psock->save_write_space = csk->sk_write_space;
|
|
psock->save_state_change = csk->sk_state_change;
|
|
@@ -1414,8 +1428,11 @@ static int kcm_attach(struct socket *sock, struct socket *csock,
|
|
csk->sk_data_ready = psock_data_ready;
|
|
csk->sk_write_space = psock_write_space;
|
|
csk->sk_state_change = psock_state_change;
|
|
+
|
|
write_unlock_bh(&csk->sk_callback_lock);
|
|
|
|
+ sock_hold(csk);
|
|
+
|
|
/* Finished initialization, now add the psock to the MUX. */
|
|
spin_lock_bh(&mux->lock);
|
|
head = &mux->psocks;
|
|
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
|
|
index fc4977456c30..e47ade305a46 100644
|
|
--- a/net/netfilter/x_tables.c
|
|
+++ b/net/netfilter/x_tables.c
|
|
@@ -39,8 +39,6 @@ MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
|
|
MODULE_DESCRIPTION("{ip,ip6,arp,eb}_tables backend module");
|
|
|
|
-#define SMP_ALIGN(x) (((x) + SMP_CACHE_BYTES-1) & ~(SMP_CACHE_BYTES-1))
|
|
-
|
|
struct compat_delta {
|
|
unsigned int offset; /* offset in kernel */
|
|
int delta; /* delta in 32bit user land */
|
|
@@ -209,6 +207,9 @@ xt_request_find_match(uint8_t nfproto, const char *name, uint8_t revision)
|
|
{
|
|
struct xt_match *match;
|
|
|
|
+ if (strnlen(name, XT_EXTENSION_MAXNAMELEN) == XT_EXTENSION_MAXNAMELEN)
|
|
+ return ERR_PTR(-EINVAL);
|
|
+
|
|
match = xt_find_match(nfproto, name, revision);
|
|
if (IS_ERR(match)) {
|
|
request_module("%st_%s", xt_prefix[nfproto], name);
|
|
@@ -251,6 +252,9 @@ struct xt_target *xt_request_find_target(u8 af, const char *name, u8 revision)
|
|
{
|
|
struct xt_target *target;
|
|
|
|
+ if (strnlen(name, XT_EXTENSION_MAXNAMELEN) == XT_EXTENSION_MAXNAMELEN)
|
|
+ return ERR_PTR(-EINVAL);
|
|
+
|
|
target = xt_find_target(af, name, revision);
|
|
if (IS_ERR(target)) {
|
|
request_module("%st_%s", xt_prefix[af], name);
|
|
@@ -952,7 +956,7 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
|
|
return NULL;
|
|
|
|
/* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
|
|
- if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
|
|
+ if ((size >> PAGE_SHIFT) + 2 > totalram_pages)
|
|
return NULL;
|
|
|
|
if (sz <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
|
|
diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c
|
|
index dbd6c4a12b97..92cfae66743b 100644
|
|
--- a/net/netfilter/xt_RATEEST.c
|
|
+++ b/net/netfilter/xt_RATEEST.c
|
|
@@ -39,23 +39,31 @@ static void xt_rateest_hash_insert(struct xt_rateest *est)
|
|
hlist_add_head(&est->list, &rateest_hash[h]);
|
|
}
|
|
|
|
-struct xt_rateest *xt_rateest_lookup(const char *name)
|
|
+static struct xt_rateest *__xt_rateest_lookup(const char *name)
|
|
{
|
|
struct xt_rateest *est;
|
|
unsigned int h;
|
|
|
|
h = xt_rateest_hash(name);
|
|
- mutex_lock(&xt_rateest_mutex);
|
|
hlist_for_each_entry(est, &rateest_hash[h], list) {
|
|
if (strcmp(est->name, name) == 0) {
|
|
est->refcnt++;
|
|
- mutex_unlock(&xt_rateest_mutex);
|
|
return est;
|
|
}
|
|
}
|
|
- mutex_unlock(&xt_rateest_mutex);
|
|
+
|
|
return NULL;
|
|
}
|
|
+
|
|
+struct xt_rateest *xt_rateest_lookup(const char *name)
|
|
+{
|
|
+ struct xt_rateest *est;
|
|
+
|
|
+ mutex_lock(&xt_rateest_mutex);
|
|
+ est = __xt_rateest_lookup(name);
|
|
+ mutex_unlock(&xt_rateest_mutex);
|
|
+ return est;
|
|
+}
|
|
EXPORT_SYMBOL_GPL(xt_rateest_lookup);
|
|
|
|
void xt_rateest_put(struct xt_rateest *est)
|
|
@@ -100,8 +108,10 @@ static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
|
|
|
|
net_get_random_once(&jhash_rnd, sizeof(jhash_rnd));
|
|
|
|
- est = xt_rateest_lookup(info->name);
|
|
+ mutex_lock(&xt_rateest_mutex);
|
|
+ est = __xt_rateest_lookup(info->name);
|
|
if (est) {
|
|
+ mutex_unlock(&xt_rateest_mutex);
|
|
/*
|
|
* If estimator parameters are specified, they must match the
|
|
* existing estimator.
|
|
@@ -139,11 +149,13 @@ static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
|
|
|
|
info->est = est;
|
|
xt_rateest_hash_insert(est);
|
|
+ mutex_unlock(&xt_rateest_mutex);
|
|
return 0;
|
|
|
|
err2:
|
|
kfree(est);
|
|
err1:
|
|
+ mutex_unlock(&xt_rateest_mutex);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/net/netfilter/xt_cgroup.c b/net/netfilter/xt_cgroup.c
|
|
index a086a914865f..0eddbd5328af 100644
|
|
--- a/net/netfilter/xt_cgroup.c
|
|
+++ b/net/netfilter/xt_cgroup.c
|
|
@@ -52,6 +52,7 @@ static int cgroup_mt_check_v1(const struct xt_mtchk_param *par)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ info->priv = NULL;
|
|
if (info->has_path) {
|
|
cgrp = cgroup_get_from_path(info->path);
|
|
if (IS_ERR(cgrp)) {
|
|
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
|
|
index 78f976d32018..d36effbf7614 100644
|
|
--- a/net/rds/tcp.c
|
|
+++ b/net/rds/tcp.c
|
|
@@ -303,7 +303,8 @@ static void rds_tcp_conn_free(void *arg)
|
|
rdsdebug("freeing tc %p\n", tc);
|
|
|
|
spin_lock_irqsave(&rds_tcp_conn_lock, flags);
|
|
- list_del(&tc->t_tcp_node);
|
|
+ if (!tc->t_tcp_node_detached)
|
|
+ list_del(&tc->t_tcp_node);
|
|
spin_unlock_irqrestore(&rds_tcp_conn_lock, flags);
|
|
|
|
kmem_cache_free(rds_tcp_conn_slab, tc);
|
|
@@ -528,8 +529,12 @@ static void rds_tcp_kill_sock(struct net *net)
|
|
|
|
if (net != c_net || !tc->t_sock)
|
|
continue;
|
|
- if (!list_has_conn(&tmp_list, tc->t_cpath->cp_conn))
|
|
+ if (!list_has_conn(&tmp_list, tc->t_cpath->cp_conn)) {
|
|
list_move_tail(&tc->t_tcp_node, &tmp_list);
|
|
+ } else {
|
|
+ list_del(&tc->t_tcp_node);
|
|
+ tc->t_tcp_node_detached = true;
|
|
+ }
|
|
}
|
|
spin_unlock_irq(&rds_tcp_conn_lock);
|
|
list_for_each_entry_safe(tc, _tc, &tmp_list, t_tcp_node) {
|
|
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
|
|
index 56ea6620fcf9..800e847d2e00 100644
|
|
--- a/net/rds/tcp.h
|
|
+++ b/net/rds/tcp.h
|
|
@@ -11,6 +11,7 @@ struct rds_tcp_incoming {
|
|
struct rds_tcp_connection {
|
|
|
|
struct list_head t_tcp_node;
|
|
+ bool t_tcp_node_detached;
|
|
struct rds_conn_path *t_cpath;
|
|
/* t_conn_path_lock synchronizes the connection establishment between
|
|
* rds_tcp_accept_one and rds_tcp_conn_path_connect
|
|
diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c
|
|
index 3b6d5bd69101..6125c17cffaf 100644
|
|
--- a/net/sched/sch_choke.c
|
|
+++ b/net/sched/sch_choke.c
|
|
@@ -424,6 +424,9 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
|
ctl = nla_data(tb[TCA_CHOKE_PARMS]);
|
|
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ return -EINVAL;
|
|
+
|
|
if (ctl->limit > CHOKE_MAX_QUEUE)
|
|
return -EINVAL;
|
|
|
|
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
|
|
index c78a093c551a..44941e25f3ad 100644
|
|
--- a/net/sched/sch_gred.c
|
|
+++ b/net/sched/sch_gred.c
|
|
@@ -356,6 +356,9 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
|
|
struct gred_sched *table = qdisc_priv(sch);
|
|
struct gred_sched_data *q = table->tab[dp];
|
|
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ return -EINVAL;
|
|
+
|
|
if (!q) {
|
|
table->tab[dp] = q = *prealloc;
|
|
*prealloc = NULL;
|
|
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
|
|
index 249b2a18acbd..4610d44f58d3 100644
|
|
--- a/net/sched/sch_red.c
|
|
+++ b/net/sched/sch_red.c
|
|
@@ -184,6 +184,8 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt)
|
|
max_P = tb[TCA_RED_MAX_P] ? nla_get_u32(tb[TCA_RED_MAX_P]) : 0;
|
|
|
|
ctl = nla_data(tb[TCA_RED_PARMS]);
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ return -EINVAL;
|
|
|
|
if (ctl->limit > 0) {
|
|
child = fifo_create_dflt(sch, &bfifo_qdisc_ops, ctl->limit);
|
|
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
|
|
index ea8a56f76b32..d8c2b6baaad2 100644
|
|
--- a/net/sched/sch_sfq.c
|
|
+++ b/net/sched/sch_sfq.c
|
|
@@ -633,6 +633,9 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt)
|
|
if (ctl->divisor &&
|
|
(!is_power_of_2(ctl->divisor) || ctl->divisor > 65536))
|
|
return -EINVAL;
|
|
+ if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max,
|
|
+ ctl_v1->Wlog))
|
|
+ return -EINVAL;
|
|
if (ctl_v1 && ctl_v1->qth_min) {
|
|
p = kmalloc(sizeof(*p), GFP_KERNEL);
|
|
if (!p)
|
|
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
|
|
index 0994ce491e7c..0188d9e8272d 100644
|
|
--- a/net/sctp/outqueue.c
|
|
+++ b/net/sctp/outqueue.c
|
|
@@ -364,7 +364,8 @@ static int sctp_prsctp_prune_sent(struct sctp_association *asoc,
|
|
asoc->sent_cnt_removable--;
|
|
asoc->abandoned_sent[SCTP_PR_INDEX(PRIO)]++;
|
|
|
|
- if (!chk->tsn_gap_acked) {
|
|
+ if (queue != &asoc->outqueue.retransmit &&
|
|
+ !chk->tsn_gap_acked) {
|
|
if (chk->transport)
|
|
chk->transport->flight_size -=
|
|
sctp_data_size(chk);
|
|
@@ -1409,7 +1410,8 @@ static void sctp_check_transmitted(struct sctp_outq *q,
|
|
/* If this chunk has not been acked, stop
|
|
* considering it as 'outstanding'.
|
|
*/
|
|
- if (!tchunk->tsn_gap_acked) {
|
|
+ if (transmitted_queue != &q->retransmit &&
|
|
+ !tchunk->tsn_gap_acked) {
|
|
if (tchunk->transport)
|
|
tchunk->transport->flight_size -=
|
|
sctp_data_size(tchunk);
|
|
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
|
|
index c472b8391dde..fd5b9d573b38 100644
|
|
--- a/net/sctp/socket.c
|
|
+++ b/net/sctp/socket.c
|
|
@@ -3125,9 +3125,9 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsign
|
|
*/
|
|
static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
|
|
{
|
|
+ struct sctp_sock *sp = sctp_sk(sk);
|
|
struct sctp_assoc_value params;
|
|
struct sctp_association *asoc;
|
|
- struct sctp_sock *sp = sctp_sk(sk);
|
|
int val;
|
|
|
|
if (optlen == sizeof(int)) {
|
|
@@ -3143,26 +3143,35 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
|
|
if (copy_from_user(¶ms, optval, optlen))
|
|
return -EFAULT;
|
|
val = params.assoc_value;
|
|
- } else
|
|
+ } else {
|
|
return -EINVAL;
|
|
+ }
|
|
|
|
- if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN)))
|
|
- return -EINVAL;
|
|
+ if (val) {
|
|
+ int min_len, max_len;
|
|
|
|
- asoc = sctp_id2assoc(sk, params.assoc_id);
|
|
- if (!asoc && params.assoc_id && sctp_style(sk, UDP))
|
|
- return -EINVAL;
|
|
+ min_len = SCTP_DEFAULT_MINSEGMENT - sp->pf->af->net_header_len;
|
|
+ min_len -= sizeof(struct sctphdr) +
|
|
+ sizeof(struct sctp_data_chunk);
|
|
+
|
|
+ max_len = SCTP_MAX_CHUNK_LEN - sizeof(struct sctp_data_chunk);
|
|
|
|
+ if (val < min_len || val > max_len)
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ asoc = sctp_id2assoc(sk, params.assoc_id);
|
|
if (asoc) {
|
|
if (val == 0) {
|
|
- val = asoc->pathmtu;
|
|
- val -= sp->pf->af->net_header_len;
|
|
+ val = asoc->pathmtu - sp->pf->af->net_header_len;
|
|
val -= sizeof(struct sctphdr) +
|
|
- sizeof(struct sctp_data_chunk);
|
|
+ sizeof(struct sctp_data_chunk);
|
|
}
|
|
asoc->user_frag = val;
|
|
asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
|
|
} else {
|
|
+ if (params.assoc_id && sctp_style(sk, UDP))
|
|
+ return -EINVAL;
|
|
sp->user_frag = val;
|
|
}
|
|
|
|
diff --git a/net/wireless/core.c b/net/wireless/core.c
|
|
index 8201e6d7449e..ce16da2905dc 100644
|
|
--- a/net/wireless/core.c
|
|
+++ b/net/wireless/core.c
|
|
@@ -421,6 +421,8 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
|
|
if (rv)
|
|
goto use_default_name;
|
|
} else {
|
|
+ int rv;
|
|
+
|
|
use_default_name:
|
|
/* NOTE: This is *probably* safe w/out holding rtnl because of
|
|
* the restrictions on phy names. Probably this call could
|
|
@@ -428,7 +430,11 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
|
|
* phyX. But, might should add some locking and check return
|
|
* value, and use a different name if this one exists?
|
|
*/
|
|
- dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);
|
|
+ rv = dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);
|
|
+ if (rv < 0) {
|
|
+ kfree(rdev);
|
|
+ return NULL;
|
|
+ }
|
|
}
|
|
|
|
INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
|
|
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
|
|
index f19e6a57e118..5e89b7461f99 100644
|
|
--- a/net/xfrm/xfrm_policy.c
|
|
+++ b/net/xfrm/xfrm_policy.c
|
|
@@ -643,7 +643,8 @@ static void xfrm_hash_rebuild(struct work_struct *work)
|
|
|
|
/* re-insert all policies by order of creation */
|
|
list_for_each_entry_reverse(policy, &net->xfrm.policy_all, walk.all) {
|
|
- if (xfrm_policy_id2dir(policy->index) >= XFRM_POLICY_MAX) {
|
|
+ if (policy->walk.dead ||
|
|
+ xfrm_policy_id2dir(policy->index) >= XFRM_POLICY_MAX) {
|
|
/* skip socket policies */
|
|
continue;
|
|
}
|
|
@@ -1256,9 +1257,15 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
|
|
again:
|
|
pol = rcu_dereference(sk->sk_policy[dir]);
|
|
if (pol != NULL) {
|
|
- bool match = xfrm_selector_match(&pol->selector, fl, family);
|
|
+ bool match;
|
|
int err = 0;
|
|
|
|
+ if (pol->family != family) {
|
|
+ pol = NULL;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ match = xfrm_selector_match(&pol->selector, fl, family);
|
|
if (match) {
|
|
if ((sk->sk_mark & pol->mark.m) != pol->mark.v) {
|
|
pol = NULL;
|
|
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
|
|
index 22934885bd3f..5d33967d9aa1 100644
|
|
--- a/net/xfrm/xfrm_user.c
|
|
+++ b/net/xfrm/xfrm_user.c
|
|
@@ -1380,11 +1380,14 @@ static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
|
|
|
|
static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|
{
|
|
+ u16 prev_family;
|
|
int i;
|
|
|
|
if (nr > XFRM_MAX_DEPTH)
|
|
return -EINVAL;
|
|
|
|
+ prev_family = family;
|
|
+
|
|
for (i = 0; i < nr; i++) {
|
|
/* We never validated the ut->family value, so many
|
|
* applications simply leave it at zero. The check was
|
|
@@ -1396,6 +1399,12 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|
if (!ut[i].family)
|
|
ut[i].family = family;
|
|
|
|
+ if ((ut[i].mode == XFRM_MODE_TRANSPORT) &&
|
|
+ (ut[i].family != prev_family))
|
|
+ return -EINVAL;
|
|
+
|
|
+ prev_family = ut[i].family;
|
|
+
|
|
switch (ut[i].family) {
|
|
case AF_INET:
|
|
break;
|
|
@@ -1406,6 +1415,21 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
+
|
|
+ switch (ut[i].id.proto) {
|
|
+ case IPPROTO_AH:
|
|
+ case IPPROTO_ESP:
|
|
+ case IPPROTO_COMP:
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
+ case IPPROTO_ROUTING:
|
|
+ case IPPROTO_DSTOPTS:
|
|
+#endif
|
|
+ case IPSEC_PROTO_ANY:
|
|
+ break;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/scripts/kernel-doc b/scripts/kernel-doc
|
|
index 93721f3c91bf..7b163f99624c 100755
|
|
--- a/scripts/kernel-doc
|
|
+++ b/scripts/kernel-doc
|
|
@@ -3139,4 +3139,4 @@ if ($verbose && $warnings) {
|
|
print STDERR "$warnings warnings\n";
|
|
}
|
|
|
|
-exit($errors);
|
|
+exit($output_mode eq "none" ? 0 : $errors);
|
|
diff --git a/security/keys/Kconfig b/security/keys/Kconfig
|
|
index 0832f6368955..f2980084a38f 100644
|
|
--- a/security/keys/Kconfig
|
|
+++ b/security/keys/Kconfig
|
|
@@ -45,6 +45,7 @@ config BIG_KEYS
|
|
bool "Large payload keys"
|
|
depends on KEYS
|
|
depends on TMPFS
|
|
+ select CRYPTO
|
|
select CRYPTO_AES
|
|
select CRYPTO_GCM
|
|
help
|
|
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
|
|
index 082b20c78363..73275a92f2e2 100644
|
|
--- a/security/selinux/ss/services.c
|
|
+++ b/security/selinux/ss/services.c
|
|
@@ -854,6 +854,9 @@ int security_bounded_transition(u32 old_sid, u32 new_sid)
|
|
int index;
|
|
int rc;
|
|
|
|
+ if (!ss_initialized)
|
|
+ return 0;
|
|
+
|
|
read_lock(&policy_rwlock);
|
|
|
|
rc = -EINVAL;
|
|
@@ -1400,27 +1403,25 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len,
|
|
if (!scontext_len)
|
|
return -EINVAL;
|
|
|
|
+ /* Copy the string to allow changes and ensure a NUL terminator */
|
|
+ scontext2 = kmemdup_nul(scontext, scontext_len, gfp_flags);
|
|
+ if (!scontext2)
|
|
+ return -ENOMEM;
|
|
+
|
|
if (!ss_initialized) {
|
|
int i;
|
|
|
|
for (i = 1; i < SECINITSID_NUM; i++) {
|
|
- if (!strcmp(initial_sid_to_string[i], scontext)) {
|
|
+ if (!strcmp(initial_sid_to_string[i], scontext2)) {
|
|
*sid = i;
|
|
- return 0;
|
|
+ goto out;
|
|
}
|
|
}
|
|
*sid = SECINITSID_KERNEL;
|
|
- return 0;
|
|
+ goto out;
|
|
}
|
|
*sid = SECSID_NULL;
|
|
|
|
- /* Copy the string so that we can modify the copy as we parse it. */
|
|
- scontext2 = kmalloc(scontext_len + 1, gfp_flags);
|
|
- if (!scontext2)
|
|
- return -ENOMEM;
|
|
- memcpy(scontext2, scontext, scontext_len);
|
|
- scontext2[scontext_len] = 0;
|
|
-
|
|
if (force) {
|
|
/* Save another copy for storing in uninterpreted form */
|
|
rc = -ENOMEM;
|
|
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c
|
|
index 11b9b2f17a2e..9ec4dba8a793 100644
|
|
--- a/sound/pci/hda/patch_ca0132.c
|
|
+++ b/sound/pci/hda/patch_ca0132.c
|
|
@@ -1482,6 +1482,9 @@ static int dspio_scp(struct hda_codec *codec,
|
|
} else if (ret_size != reply_data_size) {
|
|
codec_dbg(codec, "RetLen and HdrLen .NE.\n");
|
|
return -EINVAL;
|
|
+ } else if (!reply) {
|
|
+ codec_dbg(codec, "NULL reply\n");
|
|
+ return -EINVAL;
|
|
} else {
|
|
*reply_len = ret_size*sizeof(unsigned int);
|
|
memcpy(reply, scp_reply.data, *reply_len);
|
|
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
|
|
index fa8101d1e16f..f387d7bae3d4 100644
|
|
--- a/sound/soc/rockchip/rockchip_spdif.c
|
|
+++ b/sound/soc/rockchip/rockchip_spdif.c
|
|
@@ -318,26 +318,30 @@ static int rk_spdif_probe(struct platform_device *pdev)
|
|
spdif->mclk = devm_clk_get(&pdev->dev, "mclk");
|
|
if (IS_ERR(spdif->mclk)) {
|
|
dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n");
|
|
- return PTR_ERR(spdif->mclk);
|
|
+ ret = PTR_ERR(spdif->mclk);
|
|
+ goto err_disable_hclk;
|
|
}
|
|
|
|
ret = clk_prepare_enable(spdif->mclk);
|
|
if (ret) {
|
|
dev_err(spdif->dev, "clock enable failed %d\n", ret);
|
|
- return ret;
|
|
+ goto err_disable_clocks;
|
|
}
|
|
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
regs = devm_ioremap_resource(&pdev->dev, res);
|
|
- if (IS_ERR(regs))
|
|
- return PTR_ERR(regs);
|
|
+ if (IS_ERR(regs)) {
|
|
+ ret = PTR_ERR(regs);
|
|
+ goto err_disable_clocks;
|
|
+ }
|
|
|
|
spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs,
|
|
&rk_spdif_regmap_config);
|
|
if (IS_ERR(spdif->regmap)) {
|
|
dev_err(&pdev->dev,
|
|
"Failed to initialise managed register map\n");
|
|
- return PTR_ERR(spdif->regmap);
|
|
+ ret = PTR_ERR(spdif->regmap);
|
|
+ goto err_disable_clocks;
|
|
}
|
|
|
|
spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR;
|
|
@@ -369,6 +373,10 @@ static int rk_spdif_probe(struct platform_device *pdev)
|
|
|
|
err_pm_runtime:
|
|
pm_runtime_disable(&pdev->dev);
|
|
+err_disable_clocks:
|
|
+ clk_disable_unprepare(spdif->mclk);
|
|
+err_disable_hclk:
|
|
+ clk_disable_unprepare(spdif->hclk);
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c
|
|
index ba9fc099cf67..503aef8fcde2 100644
|
|
--- a/sound/soc/ux500/mop500.c
|
|
+++ b/sound/soc/ux500/mop500.c
|
|
@@ -164,3 +164,7 @@ static struct platform_driver snd_soc_mop500_driver = {
|
|
};
|
|
|
|
module_platform_driver(snd_soc_mop500_driver);
|
|
+
|
|
+MODULE_LICENSE("GPL v2");
|
|
+MODULE_DESCRIPTION("ASoC MOP500 board driver");
|
|
+MODULE_AUTHOR("Ola Lilja");
|
|
diff --git a/sound/soc/ux500/ux500_pcm.c b/sound/soc/ux500/ux500_pcm.c
|
|
index f12c01dddc8d..d35ba7700f46 100644
|
|
--- a/sound/soc/ux500/ux500_pcm.c
|
|
+++ b/sound/soc/ux500/ux500_pcm.c
|
|
@@ -165,3 +165,8 @@ int ux500_pcm_unregister_platform(struct platform_device *pdev)
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(ux500_pcm_unregister_platform);
|
|
+
|
|
+MODULE_AUTHOR("Ola Lilja");
|
|
+MODULE_AUTHOR("Roger Nilsson");
|
|
+MODULE_DESCRIPTION("ASoC UX500 driver");
|
|
+MODULE_LICENSE("GPL v2");
|
|
diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build
|
|
index 99c0ccd2f176..e279a71c650d 100644
|
|
--- a/tools/build/Makefile.build
|
|
+++ b/tools/build/Makefile.build
|
|
@@ -19,6 +19,16 @@ else
|
|
Q=@
|
|
endif
|
|
|
|
+ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
|
|
+ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
|
|
+ quiet=silent_
|
|
+endif
|
|
+else # make-3.8x
|
|
+ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
|
|
+ quiet=silent_
|
|
+endif
|
|
+endif
|
|
+
|
|
build-dir := $(srctree)/tools/build
|
|
|
|
# Define $(fixdep) for dep-cmd function
|
|
diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c
|
|
index 9e5a02d6b9a9..23cce5e5197a 100644
|
|
--- a/tools/perf/bench/numa.c
|
|
+++ b/tools/perf/bench/numa.c
|
|
@@ -211,6 +211,47 @@ static const char * const numa_usage[] = {
|
|
NULL
|
|
};
|
|
|
|
+/*
|
|
+ * To get number of numa nodes present.
|
|
+ */
|
|
+static int nr_numa_nodes(void)
|
|
+{
|
|
+ int i, nr_nodes = 0;
|
|
+
|
|
+ for (i = 0; i < g->p.nr_nodes; i++) {
|
|
+ if (numa_bitmask_isbitset(numa_nodes_ptr, i))
|
|
+ nr_nodes++;
|
|
+ }
|
|
+
|
|
+ return nr_nodes;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * To check if given numa node is present.
|
|
+ */
|
|
+static int is_node_present(int node)
|
|
+{
|
|
+ return numa_bitmask_isbitset(numa_nodes_ptr, node);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * To check given numa node has cpus.
|
|
+ */
|
|
+static bool node_has_cpus(int node)
|
|
+{
|
|
+ struct bitmask *cpu = numa_allocate_cpumask();
|
|
+ unsigned int i;
|
|
+
|
|
+ if (cpu && !numa_node_to_cpus(node, cpu)) {
|
|
+ for (i = 0; i < cpu->size; i++) {
|
|
+ if (numa_bitmask_isbitset(cpu, i))
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return false; /* lets fall back to nocpus safely */
|
|
+}
|
|
+
|
|
static cpu_set_t bind_to_cpu(int target_cpu)
|
|
{
|
|
cpu_set_t orig_mask, mask;
|
|
@@ -239,12 +280,12 @@ static cpu_set_t bind_to_cpu(int target_cpu)
|
|
|
|
static cpu_set_t bind_to_node(int target_node)
|
|
{
|
|
- int cpus_per_node = g->p.nr_cpus/g->p.nr_nodes;
|
|
+ int cpus_per_node = g->p.nr_cpus / nr_numa_nodes();
|
|
cpu_set_t orig_mask, mask;
|
|
int cpu;
|
|
int ret;
|
|
|
|
- BUG_ON(cpus_per_node*g->p.nr_nodes != g->p.nr_cpus);
|
|
+ BUG_ON(cpus_per_node * nr_numa_nodes() != g->p.nr_cpus);
|
|
BUG_ON(!cpus_per_node);
|
|
|
|
ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask);
|
|
@@ -644,7 +685,7 @@ static int parse_setup_node_list(void)
|
|
int i;
|
|
|
|
for (i = 0; i < mul; i++) {
|
|
- if (t >= g->p.nr_tasks) {
|
|
+ if (t >= g->p.nr_tasks || !node_has_cpus(bind_node)) {
|
|
printf("\n# NOTE: ignoring bind NODEs starting at NODE#%d\n", bind_node);
|
|
goto out;
|
|
}
|
|
@@ -959,6 +1000,8 @@ static void calc_convergence(double runtime_ns_max, double *convergence)
|
|
sum = 0;
|
|
|
|
for (node = 0; node < g->p.nr_nodes; node++) {
|
|
+ if (!is_node_present(node))
|
|
+ continue;
|
|
nr = nodes[node];
|
|
nr_min = min(nr, nr_min);
|
|
nr_max = max(nr, nr_max);
|
|
@@ -979,8 +1022,11 @@ static void calc_convergence(double runtime_ns_max, double *convergence)
|
|
process_groups = 0;
|
|
|
|
for (node = 0; node < g->p.nr_nodes; node++) {
|
|
- int processes = count_node_processes(node);
|
|
+ int processes;
|
|
|
|
+ if (!is_node_present(node))
|
|
+ continue;
|
|
+ processes = count_node_processes(node);
|
|
nr = nodes[node];
|
|
tprintf(" %2d/%-2d", nr, processes);
|
|
|
|
@@ -1286,7 +1332,7 @@ static void print_summary(void)
|
|
|
|
printf("\n ###\n");
|
|
printf(" # %d %s will execute (on %d nodes, %d CPUs):\n",
|
|
- g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", g->p.nr_nodes, g->p.nr_cpus);
|
|
+ g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", nr_numa_nodes(), g->p.nr_cpus);
|
|
printf(" # %5dx %5ldMB global shared mem operations\n",
|
|
g->p.nr_loops, g->p.bytes_global/1024/1024);
|
|
printf(" # %5dx %5ldMB process shared mem operations\n",
|
|
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
|
|
index 0b613e701736..c61e012e9771 100644
|
|
--- a/tools/perf/builtin-top.c
|
|
+++ b/tools/perf/builtin-top.c
|
|
@@ -73,6 +73,7 @@
|
|
#include <linux/types.h>
|
|
|
|
static volatile int done;
|
|
+static volatile int resize;
|
|
|
|
#define HEADER_LINE_NR 5
|
|
|
|
@@ -82,10 +83,13 @@ static void perf_top__update_print_entries(struct perf_top *top)
|
|
}
|
|
|
|
static void perf_top__sig_winch(int sig __maybe_unused,
|
|
- siginfo_t *info __maybe_unused, void *arg)
|
|
+ siginfo_t *info __maybe_unused, void *arg __maybe_unused)
|
|
{
|
|
- struct perf_top *top = arg;
|
|
+ resize = 1;
|
|
+}
|
|
|
|
+static void perf_top__resize(struct perf_top *top)
|
|
+{
|
|
get_term_dimensions(&top->winsize);
|
|
perf_top__update_print_entries(top);
|
|
}
|
|
@@ -472,7 +476,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
|
.sa_sigaction = perf_top__sig_winch,
|
|
.sa_flags = SA_SIGINFO,
|
|
};
|
|
- perf_top__sig_winch(SIGWINCH, NULL, top);
|
|
+ perf_top__resize(top);
|
|
sigaction(SIGWINCH, &act, NULL);
|
|
} else {
|
|
signal(SIGWINCH, SIG_DFL);
|
|
@@ -1003,6 +1007,11 @@ static int __cmd_top(struct perf_top *top)
|
|
|
|
if (hits == top->samples)
|
|
ret = perf_evlist__poll(top->evlist, 100);
|
|
+
|
|
+ if (resize) {
|
|
+ perf_top__resize(top);
|
|
+ resize = 0;
|
|
+ }
|
|
}
|
|
|
|
ret = 0;
|
|
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
|
|
index 8abbef164b4e..19edc1a7a232 100644
|
|
--- a/tools/scripts/Makefile.include
|
|
+++ b/tools/scripts/Makefile.include
|
|
@@ -46,6 +46,16 @@ else
|
|
NO_SUBDIR = :
|
|
endif
|
|
|
|
+ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
|
|
+ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
|
|
+ silent=1
|
|
+endif
|
|
+else # make-3.8x
|
|
+ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
|
|
+ silent=1
|
|
+endif
|
|
+endif
|
|
+
|
|
#
|
|
# Define a callable command for descending to a new directory
|
|
#
|
|
@@ -58,7 +68,7 @@ descend = \
|
|
QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir
|
|
QUIET_SUBDIR1 =
|
|
|
|
-ifneq ($(findstring $(MAKEFLAGS),s),s)
|
|
+ifneq ($(silent),1)
|
|
ifneq ($(V),1)
|
|
QUIET_CC = @echo ' CC '$@;
|
|
QUIET_CC_FPIC = @echo ' CC FPIC '$@;
|