mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-28 09:41:41 +00:00
6193 lines
206 KiB
Diff
6193 lines
206 KiB
Diff
diff --git a/Documentation/arm/kernel_mode_neon.txt b/Documentation/arm/kernel_mode_neon.txt
|
|
index 525452726d31..b9e060c5b61e 100644
|
|
--- a/Documentation/arm/kernel_mode_neon.txt
|
|
+++ b/Documentation/arm/kernel_mode_neon.txt
|
|
@@ -6,7 +6,7 @@ TL;DR summary
|
|
* Use only NEON instructions, or VFP instructions that don't rely on support
|
|
code
|
|
* Isolate your NEON code in a separate compilation unit, and compile it with
|
|
- '-mfpu=neon -mfloat-abi=softfp'
|
|
+ '-march=armv7-a -mfpu=neon -mfloat-abi=softfp'
|
|
* Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your
|
|
NEON code
|
|
* Don't sleep in your NEON code, and be aware that it will be executed with
|
|
@@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken.
|
|
Therefore, the recommended and only supported way of using NEON/VFP in the
|
|
kernel is by adhering to the following rules:
|
|
* isolate the NEON code in a separate compilation unit and compile it with
|
|
- '-mfpu=neon -mfloat-abi=softfp';
|
|
+ '-march=armv7-a -mfpu=neon -mfloat-abi=softfp';
|
|
* issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls
|
|
into the unit containing the NEON code from a compilation unit which is *not*
|
|
built with the GCC flag '-mfpu=neon' set.
|
|
diff --git a/Makefile b/Makefile
|
|
index 8de5fab711d8..8fdfe0af5862 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 4
|
|
PATCHLEVEL = 19
|
|
-SUBLEVEL = 33
|
|
+SUBLEVEL = 34
|
|
EXTRAVERSION =
|
|
NAME = "People's Front"
|
|
|
|
@@ -626,12 +626,15 @@ ifeq ($(may-sync-config),1)
|
|
-include include/config/auto.conf.cmd
|
|
|
|
# To avoid any implicit rule to kick in, define an empty command
|
|
-$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
|
|
+$(KCONFIG_CONFIG): ;
|
|
|
|
# The actual configuration files used during the build are stored in
|
|
# include/generated/ and include/config/. Update them if .config is newer than
|
|
# include/config/auto.conf (which mirrors .config).
|
|
-include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
|
|
+#
|
|
+# This exploits the 'multi-target pattern rule' trick.
|
|
+# The syncconfig should be executed only once to make all the targets.
|
|
+%/auto.conf %/auto.conf.cmd %/tristate.conf: $(KCONFIG_CONFIG)
|
|
$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
|
|
else
|
|
# External modules and some install targets need include/generated/autoconf.h
|
|
diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
|
|
index abff7ef7c9cd..4981741377f3 100644
|
|
--- a/arch/arm/boot/dts/lpc32xx.dtsi
|
|
+++ b/arch/arm/boot/dts/lpc32xx.dtsi
|
|
@@ -230,7 +230,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- i2s1: i2s@2009C000 {
|
|
+ i2s1: i2s@2009c000 {
|
|
compatible = "nxp,lpc3220-i2s";
|
|
reg = <0x2009C000 0x1000>;
|
|
};
|
|
@@ -273,7 +273,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- i2c1: i2c@400A0000 {
|
|
+ i2c1: i2c@400a0000 {
|
|
compatible = "nxp,pnx-i2c";
|
|
reg = <0x400A0000 0x100>;
|
|
interrupt-parent = <&sic1>;
|
|
@@ -284,7 +284,7 @@
|
|
clocks = <&clk LPC32XX_CLK_I2C1>;
|
|
};
|
|
|
|
- i2c2: i2c@400A8000 {
|
|
+ i2c2: i2c@400a8000 {
|
|
compatible = "nxp,pnx-i2c";
|
|
reg = <0x400A8000 0x100>;
|
|
interrupt-parent = <&sic1>;
|
|
@@ -295,7 +295,7 @@
|
|
clocks = <&clk LPC32XX_CLK_I2C2>;
|
|
};
|
|
|
|
- mpwm: mpwm@400E8000 {
|
|
+ mpwm: mpwm@400e8000 {
|
|
compatible = "nxp,lpc3220-motor-pwm";
|
|
reg = <0x400E8000 0x78>;
|
|
status = "disabled";
|
|
@@ -394,7 +394,7 @@
|
|
#gpio-cells = <3>; /* bank, pin, flags */
|
|
};
|
|
|
|
- timer4: timer@4002C000 {
|
|
+ timer4: timer@4002c000 {
|
|
compatible = "nxp,lpc3220-timer";
|
|
reg = <0x4002C000 0x1000>;
|
|
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
|
|
@@ -412,7 +412,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- watchdog: watchdog@4003C000 {
|
|
+ watchdog: watchdog@4003c000 {
|
|
compatible = "nxp,pnx4008-wdt";
|
|
reg = <0x4003C000 0x1000>;
|
|
clocks = <&clk LPC32XX_CLK_WDOG>;
|
|
@@ -451,7 +451,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- timer1: timer@4004C000 {
|
|
+ timer1: timer@4004c000 {
|
|
compatible = "nxp,lpc3220-timer";
|
|
reg = <0x4004C000 0x1000>;
|
|
interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
|
|
@@ -475,7 +475,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- pwm1: pwm@4005C000 {
|
|
+ pwm1: pwm@4005c000 {
|
|
compatible = "nxp,lpc3220-pwm";
|
|
reg = <0x4005C000 0x4>;
|
|
clocks = <&clk LPC32XX_CLK_PWM1>;
|
|
@@ -484,7 +484,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- pwm2: pwm@4005C004 {
|
|
+ pwm2: pwm@4005c004 {
|
|
compatible = "nxp,lpc3220-pwm";
|
|
reg = <0x4005C004 0x4>;
|
|
clocks = <&clk LPC32XX_CLK_PWM2>;
|
|
diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi
|
|
index 08f7f6be7254..5b3e5c50c72f 100644
|
|
--- a/arch/arm/boot/dts/meson8b.dtsi
|
|
+++ b/arch/arm/boot/dts/meson8b.dtsi
|
|
@@ -207,9 +207,7 @@
|
|
groups = "eth_tx_clk",
|
|
"eth_tx_en",
|
|
"eth_txd1_0",
|
|
- "eth_txd1_1",
|
|
"eth_txd0_0",
|
|
- "eth_txd0_1",
|
|
"eth_rx_clk",
|
|
"eth_rx_dv",
|
|
"eth_rxd1",
|
|
@@ -218,7 +216,9 @@
|
|
"eth_mdc",
|
|
"eth_ref_clk",
|
|
"eth_txd2",
|
|
- "eth_txd3";
|
|
+ "eth_txd3",
|
|
+ "eth_rxd3",
|
|
+ "eth_rxd2";
|
|
function = "ethernet";
|
|
};
|
|
};
|
|
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h
|
|
index 69772e742a0a..83ae97c049d9 100644
|
|
--- a/arch/arm/include/asm/barrier.h
|
|
+++ b/arch/arm/include/asm/barrier.h
|
|
@@ -11,6 +11,8 @@
|
|
#define sev() __asm__ __volatile__ ("sev" : : : "memory")
|
|
#define wfe() __asm__ __volatile__ ("wfe" : : : "memory")
|
|
#define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
|
|
+#else
|
|
+#define wfe() do { } while (0)
|
|
#endif
|
|
|
|
#if __LINUX_ARM_ARCH__ >= 7
|
|
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h
|
|
index 1bf65b47808a..cb2a3423b714 100644
|
|
--- a/arch/arm/include/asm/processor.h
|
|
+++ b/arch/arm/include/asm/processor.h
|
|
@@ -95,7 +95,11 @@ extern void release_thread(struct task_struct *);
|
|
unsigned long get_wchan(struct task_struct *p);
|
|
|
|
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
|
|
-#define cpu_relax() smp_mb()
|
|
+#define cpu_relax() \
|
|
+ do { \
|
|
+ smp_mb(); \
|
|
+ __asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \
|
|
+ } while (0)
|
|
#else
|
|
#define cpu_relax() barrier()
|
|
#endif
|
|
diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h
|
|
index 187ccf6496ad..2cb00d15831b 100644
|
|
--- a/arch/arm/include/asm/v7m.h
|
|
+++ b/arch/arm/include/asm/v7m.h
|
|
@@ -49,7 +49,7 @@
|
|
* (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
|
|
*/
|
|
#define EXC_RET_STACK_MASK 0x00000004
|
|
-#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd
|
|
+#define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2)
|
|
|
|
/* Cache related definitions */
|
|
|
|
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
|
|
index 773424843d6e..62db1c9746cb 100644
|
|
--- a/arch/arm/kernel/entry-header.S
|
|
+++ b/arch/arm/kernel/entry-header.S
|
|
@@ -127,7 +127,8 @@
|
|
*/
|
|
.macro v7m_exception_slow_exit ret_r0
|
|
cpsid i
|
|
- ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK
|
|
+ ldr lr, =exc_ret
|
|
+ ldr lr, [lr]
|
|
|
|
@ read original r12, sp, lr, pc and xPSR
|
|
add r12, sp, #S_IP
|
|
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
|
|
index abcf47848525..19d2dcd6530d 100644
|
|
--- a/arch/arm/kernel/entry-v7m.S
|
|
+++ b/arch/arm/kernel/entry-v7m.S
|
|
@@ -146,3 +146,7 @@ ENTRY(vector_table)
|
|
.rept CONFIG_CPU_V7M_NUM_IRQ
|
|
.long __irq_entry @ External Interrupts
|
|
.endr
|
|
+ .align 2
|
|
+ .globl exc_ret
|
|
+exc_ret:
|
|
+ .space 4
|
|
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
|
|
index dd2eb5f76b9f..76300f3813e8 100644
|
|
--- a/arch/arm/kernel/machine_kexec.c
|
|
+++ b/arch/arm/kernel/machine_kexec.c
|
|
@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
|
|
|
|
set_cpu_online(smp_processor_id(), false);
|
|
atomic_dec(&waiting_for_crash_ipi);
|
|
- while (1)
|
|
+
|
|
+ while (1) {
|
|
cpu_relax();
|
|
+ wfe();
|
|
+ }
|
|
}
|
|
|
|
void crash_smp_send_stop(void)
|
|
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
|
|
index 1d6f5ea522f4..a3ce7c5365fa 100644
|
|
--- a/arch/arm/kernel/smp.c
|
|
+++ b/arch/arm/kernel/smp.c
|
|
@@ -604,8 +604,10 @@ static void ipi_cpu_stop(unsigned int cpu)
|
|
local_fiq_disable();
|
|
local_irq_disable();
|
|
|
|
- while (1)
|
|
+ while (1) {
|
|
cpu_relax();
|
|
+ wfe();
|
|
+ }
|
|
}
|
|
|
|
static DEFINE_PER_CPU(struct completion *, cpu_completion);
|
|
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c
|
|
index 0bee233fef9a..314cfb232a63 100644
|
|
--- a/arch/arm/kernel/unwind.c
|
|
+++ b/arch/arm/kernel/unwind.c
|
|
@@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[];
|
|
static const struct unwind_idx *__origin_unwind_idx;
|
|
extern const struct unwind_idx __stop_unwind_idx[];
|
|
|
|
-static DEFINE_SPINLOCK(unwind_lock);
|
|
+static DEFINE_RAW_SPINLOCK(unwind_lock);
|
|
static LIST_HEAD(unwind_tables);
|
|
|
|
/* Convert a prel31 symbol to an absolute address */
|
|
@@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
|
/* module unwind tables */
|
|
struct unwind_table *table;
|
|
|
|
- spin_lock_irqsave(&unwind_lock, flags);
|
|
+ raw_spin_lock_irqsave(&unwind_lock, flags);
|
|
list_for_each_entry(table, &unwind_tables, list) {
|
|
if (addr >= table->begin_addr &&
|
|
addr < table->end_addr) {
|
|
@@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
|
break;
|
|
}
|
|
}
|
|
- spin_unlock_irqrestore(&unwind_lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
|
}
|
|
|
|
pr_debug("%s: idx = %p\n", __func__, idx);
|
|
@@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
|
|
tab->begin_addr = text_addr;
|
|
tab->end_addr = text_addr + text_size;
|
|
|
|
- spin_lock_irqsave(&unwind_lock, flags);
|
|
+ raw_spin_lock_irqsave(&unwind_lock, flags);
|
|
list_add_tail(&tab->list, &unwind_tables);
|
|
- spin_unlock_irqrestore(&unwind_lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
|
|
|
return tab;
|
|
}
|
|
@@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab)
|
|
if (!tab)
|
|
return;
|
|
|
|
- spin_lock_irqsave(&unwind_lock, flags);
|
|
+ raw_spin_lock_irqsave(&unwind_lock, flags);
|
|
list_del(&tab->list);
|
|
- spin_unlock_irqrestore(&unwind_lock, flags);
|
|
+ raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
|
|
|
kfree(tab);
|
|
}
|
|
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
|
|
index ad25fd1872c7..0bff0176db2c 100644
|
|
--- a/arch/arm/lib/Makefile
|
|
+++ b/arch/arm/lib/Makefile
|
|
@@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S
|
|
$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S
|
|
|
|
ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
|
|
- NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon
|
|
+ NEON_FLAGS := -march=armv7-a -mfloat-abi=softfp -mfpu=neon
|
|
CFLAGS_xor-neon.o += $(NEON_FLAGS)
|
|
obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
|
|
endif
|
|
diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c
|
|
index 2c40aeab3eaa..c691b901092f 100644
|
|
--- a/arch/arm/lib/xor-neon.c
|
|
+++ b/arch/arm/lib/xor-neon.c
|
|
@@ -14,7 +14,7 @@
|
|
MODULE_LICENSE("GPL");
|
|
|
|
#ifndef __ARM_NEON__
|
|
-#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon'
|
|
+#error You should compile this file with '-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
|
|
#endif
|
|
|
|
/*
|
|
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c
|
|
index 058a37e6d11c..fd6e0671f957 100644
|
|
--- a/arch/arm/mach-omap2/prm_common.c
|
|
+++ b/arch/arm/mach-omap2/prm_common.c
|
|
@@ -523,8 +523,10 @@ void omap_prm_reset_system(void)
|
|
|
|
prm_ll_data->reset_system();
|
|
|
|
- while (1)
|
|
+ while (1) {
|
|
cpu_relax();
|
|
+ wfe();
|
|
+ }
|
|
}
|
|
|
|
/**
|
|
diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S
|
|
index 47a5acc64433..92e84181933a 100644
|
|
--- a/arch/arm/mm/proc-v7m.S
|
|
+++ b/arch/arm/mm/proc-v7m.S
|
|
@@ -139,6 +139,9 @@ __v7m_setup_cont:
|
|
cpsie i
|
|
svc #0
|
|
1: cpsid i
|
|
+ ldr r0, =exc_ret
|
|
+ orr lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK
|
|
+ str lr, [r0]
|
|
ldmia sp, {r0-r3, r12}
|
|
str r5, [r12, #11 * 4] @ restore the original SVC vector entry
|
|
mov lr, r6 @ restore LR
|
|
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
|
|
index 50b30ff30de4..a4c134677285 100644
|
|
--- a/arch/arm64/mm/fault.c
|
|
+++ b/arch/arm64/mm/fault.c
|
|
@@ -827,11 +827,12 @@ void __init hook_debug_fault_code(int nr,
|
|
debug_fault_info[nr].name = name;
|
|
}
|
|
|
|
-asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
+asmlinkage int __exception do_debug_exception(unsigned long addr_if_watchpoint,
|
|
unsigned int esr,
|
|
struct pt_regs *regs)
|
|
{
|
|
const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr);
|
|
+ unsigned long pc = instruction_pointer(regs);
|
|
int rv;
|
|
|
|
/*
|
|
@@ -841,10 +842,10 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
if (interrupts_enabled(regs))
|
|
trace_hardirqs_off();
|
|
|
|
- if (user_mode(regs) && instruction_pointer(regs) > TASK_SIZE)
|
|
+ if (user_mode(regs) && pc > TASK_SIZE)
|
|
arm64_apply_bp_hardening();
|
|
|
|
- if (!inf->fn(addr, esr, regs)) {
|
|
+ if (!inf->fn(addr_if_watchpoint, esr, regs)) {
|
|
rv = 1;
|
|
} else {
|
|
struct siginfo info;
|
|
@@ -853,7 +854,7 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
info.si_signo = inf->sig;
|
|
info.si_errno = 0;
|
|
info.si_code = inf->code;
|
|
- info.si_addr = (void __user *)addr;
|
|
+ info.si_addr = (void __user *)pc;
|
|
arm64_notify_die(inf->name, regs, &info, esr);
|
|
rv = 0;
|
|
}
|
|
diff --git a/arch/h8300/Makefile b/arch/h8300/Makefile
|
|
index 58634e6bae92..55f251810129 100644
|
|
--- a/arch/h8300/Makefile
|
|
+++ b/arch/h8300/Makefile
|
|
@@ -27,7 +27,7 @@ KBUILD_LDFLAGS += $(ldflags-y)
|
|
CHECKFLAGS += -msize-long
|
|
|
|
ifeq ($(CROSS_COMPILE),)
|
|
-CROSS_COMPILE := h8300-unknown-linux-
|
|
+CROSS_COMPILE := $(call cc-cross-prefix, h8300-unknown-linux- h8300-linux-)
|
|
endif
|
|
|
|
core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/
|
|
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
|
|
index a4a718dbfec6..f85e2b01c3df 100644
|
|
--- a/arch/powerpc/include/asm/topology.h
|
|
+++ b/arch/powerpc/include/asm/topology.h
|
|
@@ -132,6 +132,8 @@ static inline void shared_proc_topology_init(void) {}
|
|
#define topology_sibling_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
|
|
#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
|
|
#define topology_core_id(cpu) (cpu_to_core_id(cpu))
|
|
+
|
|
+int dlpar_cpu_readd(int cpu);
|
|
#endif
|
|
#endif
|
|
|
|
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
|
|
index c806a3c12592..7a46e0e57a36 100644
|
|
--- a/arch/powerpc/kernel/entry_64.S
|
|
+++ b/arch/powerpc/kernel/entry_64.S
|
|
@@ -994,6 +994,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
|
ld r2,_NIP(r1)
|
|
mtspr SPRN_SRR0,r2
|
|
|
|
+ /*
|
|
+ * Leaving a stale exception_marker on the stack can confuse
|
|
+ * the reliable stack unwinder later on. Clear it.
|
|
+ */
|
|
+ li r2,0
|
|
+ std r2,STACK_FRAME_OVERHEAD-16(r1)
|
|
+
|
|
ld r0,GPR0(r1)
|
|
ld r2,GPR2(r1)
|
|
ld r3,GPR3(r1)
|
|
diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c
|
|
index 2486bee0f93e..97c7a39ebc00 100644
|
|
--- a/arch/powerpc/mm/hugetlbpage-radix.c
|
|
+++ b/arch/powerpc/mm/hugetlbpage-radix.c
|
|
@@ -1,6 +1,7 @@
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/mm.h>
|
|
#include <linux/hugetlb.h>
|
|
+#include <linux/security.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/pgalloc.h>
|
|
#include <asm/cacheflush.h>
|
|
@@ -73,7 +74,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
|
if (addr) {
|
|
addr = ALIGN(addr, huge_page_size(h));
|
|
vma = find_vma(mm, addr);
|
|
- if (high_limit - len >= addr &&
|
|
+ if (high_limit - len >= addr && addr >= mmap_min_addr &&
|
|
(!vma || addr + len <= vm_start_gap(vma)))
|
|
return addr;
|
|
}
|
|
@@ -83,7 +84,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
|
*/
|
|
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
|
info.length = len;
|
|
- info.low_limit = PAGE_SIZE;
|
|
+ info.low_limit = max(PAGE_SIZE, mmap_min_addr);
|
|
info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW);
|
|
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
|
|
info.align_offset = 0;
|
|
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
|
|
index 5500e4edabc6..10fb43efef50 100644
|
|
--- a/arch/powerpc/mm/numa.c
|
|
+++ b/arch/powerpc/mm/numa.c
|
|
@@ -1461,13 +1461,6 @@ static void reset_topology_timer(void)
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
-static void stage_topology_update(int core_id)
|
|
-{
|
|
- cpumask_or(&cpu_associativity_changes_mask,
|
|
- &cpu_associativity_changes_mask, cpu_sibling_mask(core_id));
|
|
- reset_topology_timer();
|
|
-}
|
|
-
|
|
static int dt_update_callback(struct notifier_block *nb,
|
|
unsigned long action, void *data)
|
|
{
|
|
@@ -1480,7 +1473,7 @@ static int dt_update_callback(struct notifier_block *nb,
|
|
!of_prop_cmp(update->prop->name, "ibm,associativity")) {
|
|
u32 core_id;
|
|
of_property_read_u32(update->dn, "reg", &core_id);
|
|
- stage_topology_update(core_id);
|
|
+ rc = dlpar_cpu_readd(core_id);
|
|
rc = NOTIFY_OK;
|
|
}
|
|
break;
|
|
diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c
|
|
index 7639b2168755..f5adb6b756f7 100644
|
|
--- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c
|
|
+++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c
|
|
@@ -313,7 +313,6 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset,
|
|
page_shift);
|
|
tbl->it_level_size = 1ULL << (level_shift - 3);
|
|
tbl->it_indirect_levels = levels - 1;
|
|
- tbl->it_allocated_size = total_allocated;
|
|
tbl->it_userspace = uas;
|
|
tbl->it_nid = nid;
|
|
|
|
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
|
|
index cde710297a4e..326ca6288bb1 100644
|
|
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
|
|
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
|
|
@@ -2603,8 +2603,13 @@ static long pnv_pci_ioda2_create_table_userspace(
|
|
int num, __u32 page_shift, __u64 window_size, __u32 levels,
|
|
struct iommu_table **ptbl)
|
|
{
|
|
- return pnv_pci_ioda2_create_table(table_group,
|
|
+ long ret = pnv_pci_ioda2_create_table(table_group,
|
|
num, page_shift, window_size, levels, true, ptbl);
|
|
+
|
|
+ if (!ret)
|
|
+ (*ptbl)->it_allocated_size = pnv_pci_ioda2_get_table_size(
|
|
+ page_shift, window_size, levels);
|
|
+ return ret;
|
|
}
|
|
|
|
static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group)
|
|
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
|
|
index 6ef77caf7bcf..1d3f9313c02f 100644
|
|
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
|
|
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
|
|
@@ -802,6 +802,25 @@ static int dlpar_cpu_add_by_count(u32 cpus_to_add)
|
|
return rc;
|
|
}
|
|
|
|
+int dlpar_cpu_readd(int cpu)
|
|
+{
|
|
+ struct device_node *dn;
|
|
+ struct device *dev;
|
|
+ u32 drc_index;
|
|
+ int rc;
|
|
+
|
|
+ dev = get_cpu_device(cpu);
|
|
+ dn = dev->of_node;
|
|
+
|
|
+ rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
|
|
+
|
|
+ rc = dlpar_cpu_remove_by_index(drc_index);
|
|
+ if (!rc)
|
|
+ rc = dlpar_cpu_add(drc_index);
|
|
+
|
|
+ return rc;
|
|
+}
|
|
+
|
|
int dlpar_cpu(struct pseries_hp_errorlog *hp_elog)
|
|
{
|
|
u32 count, drc_index;
|
|
diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c
|
|
index 9deea5ee13f6..27f1e6415036 100644
|
|
--- a/arch/powerpc/xmon/ppc-dis.c
|
|
+++ b/arch/powerpc/xmon/ppc-dis.c
|
|
@@ -158,7 +158,7 @@ int print_insn_powerpc (unsigned long insn, unsigned long memaddr)
|
|
dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
|
|
| PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM
|
|
| PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2
|
|
- | PPC_OPCODE_VSX | PPC_OPCODE_VSX3),
|
|
+ | PPC_OPCODE_VSX | PPC_OPCODE_VSX3);
|
|
|
|
/* Get the major opcode of the insn. */
|
|
opcode = NULL;
|
|
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
|
|
index 5c53e977be62..44404836e9d1 100644
|
|
--- a/arch/s390/kernel/perf_cpum_sf.c
|
|
+++ b/arch/s390/kernel/perf_cpum_sf.c
|
|
@@ -1600,7 +1600,7 @@ static void aux_sdb_init(unsigned long sdb)
|
|
|
|
/*
|
|
* aux_buffer_setup() - Setup AUX buffer for diagnostic mode sampling
|
|
- * @cpu: On which to allocate, -1 means current
|
|
+ * @event: Event the buffer is setup for, event->cpu == -1 means current
|
|
* @pages: Array of pointers to buffer pages passed from perf core
|
|
* @nr_pages: Total pages
|
|
* @snapshot: Flag for snapshot mode
|
|
@@ -1612,8 +1612,8 @@ static void aux_sdb_init(unsigned long sdb)
|
|
*
|
|
* Return the private AUX buffer structure if success or NULL if fails.
|
|
*/
|
|
-static void *aux_buffer_setup(int cpu, void **pages, int nr_pages,
|
|
- bool snapshot)
|
|
+static void *aux_buffer_setup(struct perf_event *event, void **pages,
|
|
+ int nr_pages, bool snapshot)
|
|
{
|
|
struct sf_buffer *sfb;
|
|
struct aux_buffer *aux;
|
|
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
|
|
index 9b5adae9cc40..e2839b5c246c 100644
|
|
--- a/arch/x86/boot/Makefile
|
|
+++ b/arch/x86/boot/Makefile
|
|
@@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
|
|
AFLAGS_header.o += -I$(objtree)/$(obj)
|
|
$(obj)/header.o: $(obj)/zoffset.h
|
|
|
|
-LDFLAGS_setup.elf := -T
|
|
+LDFLAGS_setup.elf := -m elf_i386 -T
|
|
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
|
|
$(call if_changed,ld)
|
|
|
|
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
|
|
index f95dcb209fdf..617df50a11d9 100644
|
|
--- a/arch/x86/entry/entry_64.S
|
|
+++ b/arch/x86/entry/entry_64.S
|
|
@@ -627,6 +627,7 @@ ENTRY(interrupt_entry)
|
|
|
|
ret
|
|
END(interrupt_entry)
|
|
+_ASM_NOKPROBE(interrupt_entry)
|
|
|
|
|
|
/* Interrupt entry/exit. */
|
|
@@ -826,6 +827,7 @@ native_irq_return_ldt:
|
|
jmp native_irq_return_iret
|
|
#endif
|
|
END(common_interrupt)
|
|
+_ASM_NOKPROBE(common_interrupt)
|
|
|
|
/*
|
|
* APIC interrupts.
|
|
@@ -840,6 +842,7 @@ ENTRY(\sym)
|
|
call \do_sym /* rdi points to pt_regs */
|
|
jmp ret_from_intr
|
|
END(\sym)
|
|
+_ASM_NOKPROBE(\sym)
|
|
.endm
|
|
|
|
/* Make sure APIC interrupt handlers end up in the irqentry section: */
|
|
@@ -984,6 +987,7 @@ ENTRY(\sym)
|
|
|
|
jmp error_exit
|
|
.endif
|
|
+_ASM_NOKPROBE(\sym)
|
|
END(\sym)
|
|
.endm
|
|
|
|
diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c
|
|
index 24ffa1e88cf9..7139f6bf27ad 100644
|
|
--- a/arch/x86/events/intel/bts.c
|
|
+++ b/arch/x86/events/intel/bts.c
|
|
@@ -77,10 +77,12 @@ static size_t buf_size(struct page *page)
|
|
}
|
|
|
|
static void *
|
|
-bts_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool overwrite)
|
|
+bts_buffer_setup_aux(struct perf_event *event, void **pages,
|
|
+ int nr_pages, bool overwrite)
|
|
{
|
|
struct bts_buffer *buf;
|
|
struct page *page;
|
|
+ int cpu = event->cpu;
|
|
int node = (cpu == -1) ? cpu : cpu_to_node(cpu);
|
|
unsigned long offset;
|
|
size_t size = nr_pages << PAGE_SHIFT;
|
|
diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
|
|
index 8d016ce5b80d..8f4c98fdd03c 100644
|
|
--- a/arch/x86/events/intel/pt.c
|
|
+++ b/arch/x86/events/intel/pt.c
|
|
@@ -1104,10 +1104,11 @@ static int pt_buffer_init_topa(struct pt_buffer *buf, unsigned long nr_pages,
|
|
* Return: Our private PT buffer structure.
|
|
*/
|
|
static void *
|
|
-pt_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool snapshot)
|
|
+pt_buffer_setup_aux(struct perf_event *event, void **pages,
|
|
+ int nr_pages, bool snapshot)
|
|
{
|
|
struct pt_buffer *buf;
|
|
- int node, ret;
|
|
+ int node, ret, cpu = event->cpu;
|
|
|
|
if (!nr_pages)
|
|
return NULL;
|
|
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
|
|
index 20c876c7c5bf..87abd5145cc9 100644
|
|
--- a/arch/x86/hyperv/hv_init.c
|
|
+++ b/arch/x86/hyperv/hv_init.c
|
|
@@ -387,6 +387,13 @@ void hyperv_cleanup(void)
|
|
/* Reset our OS id */
|
|
wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0);
|
|
|
|
+ /*
|
|
+ * Reset hypercall page reference before reset the page,
|
|
+ * let hypercall operations fail safely rather than
|
|
+ * panic the kernel for using invalid hypercall page
|
|
+ */
|
|
+ hv_hypercall_pg = NULL;
|
|
+
|
|
/* Reset the hypercall page */
|
|
hypercall_msr.as_uint64 = 0;
|
|
wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
|
|
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
|
|
index 5dd3317d761f..c63bab98780c 100644
|
|
--- a/arch/x86/kernel/vmlinux.lds.S
|
|
+++ b/arch/x86/kernel/vmlinux.lds.S
|
|
@@ -411,7 +411,7 @@ SECTIONS
|
|
* Per-cpu symbols which need to be offset from __per_cpu_load
|
|
* for the boot processor.
|
|
*/
|
|
-#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load
|
|
+#define INIT_PER_CPU(x) init_per_cpu__##x = ABSOLUTE(x) + __per_cpu_load
|
|
INIT_PER_CPU(gdt_page);
|
|
INIT_PER_CPU(irq_stack_union);
|
|
|
|
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
|
|
index 4463fa72db94..96cb20de08af 100644
|
|
--- a/arch/x86/realmode/rm/Makefile
|
|
+++ b/arch/x86/realmode/rm/Makefile
|
|
@@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
|
|
targets += realmode.lds
|
|
$(obj)/realmode.lds: $(obj)/pasyms.h
|
|
|
|
-LDFLAGS_realmode.elf := --emit-relocs -T
|
|
+LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
|
|
CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)
|
|
|
|
targets += realmode.elf
|
|
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
|
index 653100fb719e..c5e2c5a01182 100644
|
|
--- a/block/bfq-iosched.c
|
|
+++ b/block/bfq-iosched.c
|
|
@@ -2215,7 +2215,8 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
|
|
|
if (in_service_bfqq && in_service_bfqq != bfqq &&
|
|
likely(in_service_bfqq != &bfqd->oom_bfqq) &&
|
|
- bfq_rq_close_to_sector(io_struct, request, bfqd->last_position) &&
|
|
+ bfq_rq_close_to_sector(io_struct, request,
|
|
+ bfqd->in_serv_last_pos) &&
|
|
bfqq->entity.parent == in_service_bfqq->entity.parent &&
|
|
bfq_may_be_close_cooperator(bfqq, in_service_bfqq)) {
|
|
new_bfqq = bfq_setup_merge(bfqq, in_service_bfqq);
|
|
@@ -2755,6 +2756,8 @@ update_rate_and_reset:
|
|
bfq_update_rate_reset(bfqd, rq);
|
|
update_last_values:
|
|
bfqd->last_position = blk_rq_pos(rq) + blk_rq_sectors(rq);
|
|
+ if (RQ_BFQQ(rq) == bfqd->in_service_queue)
|
|
+ bfqd->in_serv_last_pos = bfqd->last_position;
|
|
bfqd->last_dispatch = now_ns;
|
|
}
|
|
|
|
diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h
|
|
index a8a2e5aca4d4..d5e9e60cb1a5 100644
|
|
--- a/block/bfq-iosched.h
|
|
+++ b/block/bfq-iosched.h
|
|
@@ -469,6 +469,9 @@ struct bfq_data {
|
|
/* on-disk position of the last served request */
|
|
sector_t last_position;
|
|
|
|
+ /* position of the last served request for the in-service queue */
|
|
+ sector_t in_serv_last_pos;
|
|
+
|
|
/* time of last request completion (ns) */
|
|
u64 last_completion;
|
|
|
|
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
|
|
index f0b52266b3ac..d73afb562ad9 100644
|
|
--- a/drivers/acpi/acpi_video.c
|
|
+++ b/drivers/acpi/acpi_video.c
|
|
@@ -2124,21 +2124,29 @@ static int __init intel_opregion_present(void)
|
|
return opregion;
|
|
}
|
|
|
|
+/* Check if the chassis-type indicates there is no builtin LCD panel */
|
|
static bool dmi_is_desktop(void)
|
|
{
|
|
const char *chassis_type;
|
|
+ unsigned long type;
|
|
|
|
chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
|
|
if (!chassis_type)
|
|
return false;
|
|
|
|
- if (!strcmp(chassis_type, "3") || /* 3: Desktop */
|
|
- !strcmp(chassis_type, "4") || /* 4: Low Profile Desktop */
|
|
- !strcmp(chassis_type, "5") || /* 5: Pizza Box */
|
|
- !strcmp(chassis_type, "6") || /* 6: Mini Tower */
|
|
- !strcmp(chassis_type, "7") || /* 7: Tower */
|
|
- !strcmp(chassis_type, "11")) /* 11: Main Server Chassis */
|
|
+ if (kstrtoul(chassis_type, 10, &type) != 0)
|
|
+ return false;
|
|
+
|
|
+ switch (type) {
|
|
+ case 0x03: /* Desktop */
|
|
+ case 0x04: /* Low Profile Desktop */
|
|
+ case 0x05: /* Pizza Box */
|
|
+ case 0x06: /* Mini Tower */
|
|
+ case 0x07: /* Tower */
|
|
+ case 0x10: /* Lunch Box */
|
|
+ case 0x11: /* Main Server Chassis */
|
|
return true;
|
|
+ }
|
|
|
|
return false;
|
|
}
|
|
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
|
|
index 0c5aeab4d23a..a63da9e07341 100644
|
|
--- a/drivers/block/loop.c
|
|
+++ b/drivers/block/loop.c
|
|
@@ -1090,16 +1090,12 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
|
|
kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
|
|
}
|
|
mapping_set_gfp_mask(filp->f_mapping, gfp);
|
|
- lo->lo_state = Lo_unbound;
|
|
/* This is safe: open() is still holding a reference. */
|
|
module_put(THIS_MODULE);
|
|
blk_mq_unfreeze_queue(lo->lo_queue);
|
|
|
|
partscan = lo->lo_flags & LO_FLAGS_PARTSCAN && bdev;
|
|
lo_number = lo->lo_number;
|
|
- lo->lo_flags = 0;
|
|
- if (!part_shift)
|
|
- lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
|
|
loop_unprepare_queue(lo);
|
|
out_unlock:
|
|
mutex_unlock(&loop_ctl_mutex);
|
|
@@ -1121,6 +1117,23 @@ out_unlock:
|
|
/* Device is gone, no point in returning error */
|
|
err = 0;
|
|
}
|
|
+
|
|
+ /*
|
|
+ * lo->lo_state is set to Lo_unbound here after above partscan has
|
|
+ * finished.
|
|
+ *
|
|
+ * There cannot be anybody else entering __loop_clr_fd() as
|
|
+ * lo->lo_backing_file is already cleared and Lo_rundown state
|
|
+ * protects us from all the other places trying to change the 'lo'
|
|
+ * device.
|
|
+ */
|
|
+ mutex_lock(&loop_ctl_mutex);
|
|
+ lo->lo_flags = 0;
|
|
+ if (!part_shift)
|
|
+ lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
|
|
+ lo->lo_state = Lo_unbound;
|
|
+ mutex_unlock(&loop_ctl_mutex);
|
|
+
|
|
/*
|
|
* Need not hold loop_ctl_mutex to fput backing file.
|
|
* Calling fput holding loop_ctl_mutex triggers a circular
|
|
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
|
|
index 10802d1fc554..27a82a559ab9 100644
|
|
--- a/drivers/cdrom/cdrom.c
|
|
+++ b/drivers/cdrom/cdrom.c
|
|
@@ -265,6 +265,7 @@
|
|
/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */
|
|
/* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */
|
|
|
|
+#include <linux/atomic.h>
|
|
#include <linux/module.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/major.h>
|
|
@@ -3693,9 +3694,9 @@ static struct ctl_table_header *cdrom_sysctl_header;
|
|
|
|
static void cdrom_sysctl_register(void)
|
|
{
|
|
- static int initialized;
|
|
+ static atomic_t initialized = ATOMIC_INIT(0);
|
|
|
|
- if (initialized == 1)
|
|
+ if (!atomic_add_unless(&initialized, 1, 1))
|
|
return;
|
|
|
|
cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
|
|
@@ -3706,8 +3707,6 @@ static void cdrom_sysctl_register(void)
|
|
cdrom_sysctl_settings.debug = debug;
|
|
cdrom_sysctl_settings.lock = lockdoor;
|
|
cdrom_sysctl_settings.check = check_media_type;
|
|
-
|
|
- initialized = 1;
|
|
}
|
|
|
|
static void cdrom_sysctl_unregister(void)
|
|
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
|
|
index 4a22b4b41aef..9bffcd37cc7b 100644
|
|
--- a/drivers/char/hpet.c
|
|
+++ b/drivers/char/hpet.c
|
|
@@ -377,7 +377,7 @@ static __init int hpet_mmap_enable(char *str)
|
|
pr_info("HPET mmap %s\n", hpet_mmap_enabled ? "enabled" : "disabled");
|
|
return 1;
|
|
}
|
|
-__setup("hpet_mmap", hpet_mmap_enable);
|
|
+__setup("hpet_mmap=", hpet_mmap_enable);
|
|
|
|
static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
|
|
{
|
|
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
|
|
index b89df66ea1ae..7abd604e938c 100644
|
|
--- a/drivers/char/hw_random/virtio-rng.c
|
|
+++ b/drivers/char/hw_random/virtio-rng.c
|
|
@@ -73,7 +73,7 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
|
|
|
|
if (!vi->busy) {
|
|
vi->busy = true;
|
|
- init_completion(&vi->have_data);
|
|
+ reinit_completion(&vi->have_data);
|
|
register_buffer(vi, buf, size);
|
|
}
|
|
|
|
diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c
|
|
index fdf625fb10fa..083daa293280 100644
|
|
--- a/drivers/clk/clk-fractional-divider.c
|
|
+++ b/drivers/clk/clk-fractional-divider.c
|
|
@@ -77,7 +77,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long m, n;
|
|
u64 ret;
|
|
|
|
- if (!rate || rate >= *parent_rate)
|
|
+ if (!rate || (!clk_hw_can_set_rate_parent(hw) && rate >= *parent_rate))
|
|
return *parent_rate;
|
|
|
|
if (fd->approximation)
|
|
diff --git a/drivers/clk/meson/meson-aoclk.c b/drivers/clk/meson/meson-aoclk.c
|
|
index f965845917e3..258c8d259ea1 100644
|
|
--- a/drivers/clk/meson/meson-aoclk.c
|
|
+++ b/drivers/clk/meson/meson-aoclk.c
|
|
@@ -65,15 +65,20 @@ int meson_aoclkc_probe(struct platform_device *pdev)
|
|
return ret;
|
|
}
|
|
|
|
- /*
|
|
- * Populate regmap and register all clks
|
|
- */
|
|
- for (clkid = 0; clkid < data->num_clks; clkid++) {
|
|
+ /* Populate regmap */
|
|
+ for (clkid = 0; clkid < data->num_clks; clkid++)
|
|
data->clks[clkid]->map = regmap;
|
|
|
|
+ /* Register all clks */
|
|
+ for (clkid = 0; clkid < data->hw_data->num; clkid++) {
|
|
+ if (!data->hw_data->hws[clkid])
|
|
+ continue;
|
|
+
|
|
ret = devm_clk_hw_register(dev, data->hw_data->hws[clkid]);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ dev_err(dev, "Clock registration failed\n");
|
|
return ret;
|
|
+ }
|
|
}
|
|
|
|
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
|
diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c
|
|
index 2c5426607790..e431661fe874 100644
|
|
--- a/drivers/clk/rockchip/clk-rk3328.c
|
|
+++ b/drivers/clk/rockchip/clk-rk3328.c
|
|
@@ -78,17 +78,17 @@ static struct rockchip_pll_rate_table rk3328_pll_rates[] = {
|
|
|
|
static struct rockchip_pll_rate_table rk3328_pll_frac_rates[] = {
|
|
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
|
|
- RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134217),
|
|
+ RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134218),
|
|
/* vco = 1016064000 */
|
|
- RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671088),
|
|
+ RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671089),
|
|
/* vco = 983040000 */
|
|
- RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671088),
|
|
+ RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671089),
|
|
/* vco = 983040000 */
|
|
- RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671088),
|
|
+ RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671089),
|
|
/* vco = 860156000 */
|
|
- RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797894),
|
|
+ RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797895),
|
|
/* vco = 903168000 */
|
|
- RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066329),
|
|
+ RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066330),
|
|
/* vco = 819200000 */
|
|
{ /* sentinel */ },
|
|
};
|
|
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
|
|
index b61f4ec43e06..aca30f45172e 100644
|
|
--- a/drivers/cpufreq/acpi-cpufreq.c
|
|
+++ b/drivers/cpufreq/acpi-cpufreq.c
|
|
@@ -911,8 +911,10 @@ static void __init acpi_cpufreq_boost_init(void)
|
|
{
|
|
int ret;
|
|
|
|
- if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)))
|
|
+ if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) {
|
|
+ pr_debug("Boost capabilities not present in the processor\n");
|
|
return;
|
|
+ }
|
|
|
|
acpi_cpufreq_driver.set_boost = set_boost;
|
|
acpi_cpufreq_driver.boost_enabled = boost_state(0);
|
|
diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c
|
|
index 5e63742b0d22..53ab1f140a26 100644
|
|
--- a/drivers/crypto/amcc/crypto4xx_trng.c
|
|
+++ b/drivers/crypto/amcc/crypto4xx_trng.c
|
|
@@ -80,8 +80,10 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev)
|
|
|
|
/* Find the TRNG device node and map it */
|
|
trng = of_find_matching_node(NULL, ppc4xx_trng_match);
|
|
- if (!trng || !of_device_is_available(trng))
|
|
+ if (!trng || !of_device_is_available(trng)) {
|
|
+ of_node_put(trng);
|
|
return;
|
|
+ }
|
|
|
|
dev->trng_base = of_iomap(trng, 0);
|
|
of_node_put(trng);
|
|
diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c
|
|
index be055b9547f6..6183f9128a8a 100644
|
|
--- a/drivers/crypto/cavium/zip/zip_main.c
|
|
+++ b/drivers/crypto/cavium/zip/zip_main.c
|
|
@@ -351,6 +351,7 @@ static struct pci_driver zip_driver = {
|
|
|
|
static struct crypto_alg zip_comp_deflate = {
|
|
.cra_name = "deflate",
|
|
+ .cra_driver_name = "deflate-cavium",
|
|
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
|
|
.cra_ctxsize = sizeof(struct zip_kernel_ctx),
|
|
.cra_priority = 300,
|
|
@@ -365,6 +366,7 @@ static struct crypto_alg zip_comp_deflate = {
|
|
|
|
static struct crypto_alg zip_comp_lzs = {
|
|
.cra_name = "lzs",
|
|
+ .cra_driver_name = "lzs-cavium",
|
|
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
|
|
.cra_ctxsize = sizeof(struct zip_kernel_ctx),
|
|
.cra_priority = 300,
|
|
@@ -384,7 +386,7 @@ static struct scomp_alg zip_scomp_deflate = {
|
|
.decompress = zip_scomp_decompress,
|
|
.base = {
|
|
.cra_name = "deflate",
|
|
- .cra_driver_name = "deflate-scomp",
|
|
+ .cra_driver_name = "deflate-scomp-cavium",
|
|
.cra_module = THIS_MODULE,
|
|
.cra_priority = 300,
|
|
}
|
|
@@ -397,7 +399,7 @@ static struct scomp_alg zip_scomp_lzs = {
|
|
.decompress = zip_scomp_decompress,
|
|
.base = {
|
|
.cra_name = "lzs",
|
|
- .cra_driver_name = "lzs-scomp",
|
|
+ .cra_driver_name = "lzs-scomp-cavium",
|
|
.cra_module = THIS_MODULE,
|
|
.cra_priority = 300,
|
|
}
|
|
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
|
|
index 118d371a2a4a..dfee0d895ce3 100644
|
|
--- a/drivers/dma/imx-dma.c
|
|
+++ b/drivers/dma/imx-dma.c
|
|
@@ -284,7 +284,7 @@ static inline int imxdma_sg_next(struct imxdma_desc *d)
|
|
struct scatterlist *sg = d->sg;
|
|
unsigned long now;
|
|
|
|
- now = min(d->len, sg_dma_len(sg));
|
|
+ now = min_t(size_t, d->len, sg_dma_len(sg));
|
|
if (d->len != IMX_DMA_LENGTH_LOOP)
|
|
d->len -= now;
|
|
|
|
diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c
|
|
index 43d4b00b8138..411f91fde734 100644
|
|
--- a/drivers/dma/qcom/hidma.c
|
|
+++ b/drivers/dma/qcom/hidma.c
|
|
@@ -138,24 +138,25 @@ static void hidma_process_completed(struct hidma_chan *mchan)
|
|
desc = &mdesc->desc;
|
|
last_cookie = desc->cookie;
|
|
|
|
+ llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch);
|
|
+
|
|
spin_lock_irqsave(&mchan->lock, irqflags);
|
|
+ if (llstat == DMA_COMPLETE) {
|
|
+ mchan->last_success = last_cookie;
|
|
+ result.result = DMA_TRANS_NOERROR;
|
|
+ } else {
|
|
+ result.result = DMA_TRANS_ABORTED;
|
|
+ }
|
|
+
|
|
dma_cookie_complete(desc);
|
|
spin_unlock_irqrestore(&mchan->lock, irqflags);
|
|
|
|
- llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch);
|
|
dmaengine_desc_get_callback(desc, &cb);
|
|
|
|
dma_run_dependencies(desc);
|
|
|
|
spin_lock_irqsave(&mchan->lock, irqflags);
|
|
list_move(&mdesc->node, &mchan->free);
|
|
-
|
|
- if (llstat == DMA_COMPLETE) {
|
|
- mchan->last_success = last_cookie;
|
|
- result.result = DMA_TRANS_NOERROR;
|
|
- } else
|
|
- result.result = DMA_TRANS_ABORTED;
|
|
-
|
|
spin_unlock_irqrestore(&mchan->lock, irqflags);
|
|
|
|
dmaengine_desc_callback_invoke(&cb, &result);
|
|
@@ -415,6 +416,7 @@ hidma_prep_dma_memcpy(struct dma_chan *dmach, dma_addr_t dest, dma_addr_t src,
|
|
if (!mdesc)
|
|
return NULL;
|
|
|
|
+ mdesc->desc.flags = flags;
|
|
hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
|
|
src, dest, len, flags,
|
|
HIDMA_TRE_MEMCPY);
|
|
@@ -447,6 +449,7 @@ hidma_prep_dma_memset(struct dma_chan *dmach, dma_addr_t dest, int value,
|
|
if (!mdesc)
|
|
return NULL;
|
|
|
|
+ mdesc->desc.flags = flags;
|
|
hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
|
|
value, dest, len, flags,
|
|
HIDMA_TRE_MEMSET);
|
|
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
|
|
index 9a558e30c461..8219ab88a507 100644
|
|
--- a/drivers/dma/tegra20-apb-dma.c
|
|
+++ b/drivers/dma/tegra20-apb-dma.c
|
|
@@ -636,7 +636,10 @@ static void handle_cont_sngl_cycle_dma_done(struct tegra_dma_channel *tdc,
|
|
|
|
sgreq = list_first_entry(&tdc->pending_sg_req, typeof(*sgreq), node);
|
|
dma_desc = sgreq->dma_desc;
|
|
- dma_desc->bytes_transferred += sgreq->req_len;
|
|
+ /* if we dma for long enough the transfer count will wrap */
|
|
+ dma_desc->bytes_transferred =
|
|
+ (dma_desc->bytes_transferred + sgreq->req_len) %
|
|
+ dma_desc->bytes_requested;
|
|
|
|
/* Callback need to be call */
|
|
if (!dma_desc->cb_count)
|
|
diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
|
|
index a7902fccdcfa..6090d25dce85 100644
|
|
--- a/drivers/firmware/efi/cper.c
|
|
+++ b/drivers/firmware/efi/cper.c
|
|
@@ -546,19 +546,24 @@ EXPORT_SYMBOL_GPL(cper_estatus_check_header);
|
|
int cper_estatus_check(const struct acpi_hest_generic_status *estatus)
|
|
{
|
|
struct acpi_hest_generic_data *gdata;
|
|
- unsigned int data_len, gedata_len;
|
|
+ unsigned int data_len, record_size;
|
|
int rc;
|
|
|
|
rc = cper_estatus_check_header(estatus);
|
|
if (rc)
|
|
return rc;
|
|
+
|
|
data_len = estatus->data_length;
|
|
|
|
apei_estatus_for_each_section(estatus, gdata) {
|
|
- gedata_len = acpi_hest_get_error_length(gdata);
|
|
- if (gedata_len > data_len - acpi_hest_get_size(gdata))
|
|
+ if (sizeof(struct acpi_hest_generic_data) > data_len)
|
|
+ return -EINVAL;
|
|
+
|
|
+ record_size = acpi_hest_get_record_size(gdata);
|
|
+ if (record_size > data_len)
|
|
return -EINVAL;
|
|
- data_len -= acpi_hest_get_record_size(gdata);
|
|
+
|
|
+ data_len -= record_size;
|
|
}
|
|
if (data_len)
|
|
return -EINVAL;
|
|
diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c
|
|
index 6920033de6d4..6c09644d620e 100644
|
|
--- a/drivers/firmware/efi/libstub/arm-stub.c
|
|
+++ b/drivers/firmware/efi/libstub/arm-stub.c
|
|
@@ -340,6 +340,11 @@ void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
|
|
paddr = in->phys_addr;
|
|
size = in->num_pages * EFI_PAGE_SIZE;
|
|
|
|
+ if (novamap()) {
|
|
+ in->virt_addr = in->phys_addr;
|
|
+ continue;
|
|
+ }
|
|
+
|
|
/*
|
|
* Make the mapping compatible with 64k pages: this allows
|
|
* a 4k page size kernel to kexec a 64k page size kernel and
|
|
diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c
|
|
index e94975f4655b..442f51c2a53d 100644
|
|
--- a/drivers/firmware/efi/libstub/efi-stub-helper.c
|
|
+++ b/drivers/firmware/efi/libstub/efi-stub-helper.c
|
|
@@ -34,6 +34,7 @@ static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE;
|
|
|
|
static int __section(.data) __nokaslr;
|
|
static int __section(.data) __quiet;
|
|
+static int __section(.data) __novamap;
|
|
|
|
int __pure nokaslr(void)
|
|
{
|
|
@@ -43,6 +44,10 @@ int __pure is_quiet(void)
|
|
{
|
|
return __quiet;
|
|
}
|
|
+int __pure novamap(void)
|
|
+{
|
|
+ return __novamap;
|
|
+}
|
|
|
|
#define EFI_MMAP_NR_SLACK_SLOTS 8
|
|
|
|
@@ -482,6 +487,11 @@ efi_status_t efi_parse_options(char const *cmdline)
|
|
__chunk_size = -1UL;
|
|
}
|
|
|
|
+ if (!strncmp(str, "novamap", 7)) {
|
|
+ str += strlen("novamap");
|
|
+ __novamap = 1;
|
|
+ }
|
|
+
|
|
/* Group words together, delimited by "," */
|
|
while (*str && *str != ' ' && *str != ',')
|
|
str++;
|
|
diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h
|
|
index 32799cf039ef..337b52c4702c 100644
|
|
--- a/drivers/firmware/efi/libstub/efistub.h
|
|
+++ b/drivers/firmware/efi/libstub/efistub.h
|
|
@@ -27,6 +27,7 @@
|
|
|
|
extern int __pure nokaslr(void);
|
|
extern int __pure is_quiet(void);
|
|
+extern int __pure novamap(void);
|
|
|
|
#define pr_efi(sys_table, msg) do { \
|
|
if (!is_quiet()) efi_printk(sys_table, "EFI stub: "msg); \
|
|
diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c
|
|
index 0c0d2312f4a8..dba296a44f4e 100644
|
|
--- a/drivers/firmware/efi/libstub/fdt.c
|
|
+++ b/drivers/firmware/efi/libstub/fdt.c
|
|
@@ -327,6 +327,9 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table,
|
|
if (status == EFI_SUCCESS) {
|
|
efi_set_virtual_address_map_t *svam;
|
|
|
|
+ if (novamap())
|
|
+ return EFI_SUCCESS;
|
|
+
|
|
/* Install the new virtual address map */
|
|
svam = sys_table->runtime->set_virtual_address_map;
|
|
status = svam(runtime_entry_count * desc_size, desc_size,
|
|
diff --git a/drivers/firmware/efi/memattr.c b/drivers/firmware/efi/memattr.c
|
|
index 8986757eafaf..aac972b056d9 100644
|
|
--- a/drivers/firmware/efi/memattr.c
|
|
+++ b/drivers/firmware/efi/memattr.c
|
|
@@ -94,7 +94,7 @@ static bool entry_is_valid(const efi_memory_desc_t *in, efi_memory_desc_t *out)
|
|
|
|
if (!(md->attribute & EFI_MEMORY_RUNTIME))
|
|
continue;
|
|
- if (md->virt_addr == 0) {
|
|
+ if (md->virt_addr == 0 && md->phys_addr != 0) {
|
|
/* no virtual mapping has been installed by the stub */
|
|
break;
|
|
}
|
|
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
|
|
index e81008678a38..6c1acf642c8e 100644
|
|
--- a/drivers/gpio/gpio-omap.c
|
|
+++ b/drivers/gpio/gpio-omap.c
|
|
@@ -888,14 +888,16 @@ static void omap_gpio_unmask_irq(struct irq_data *d)
|
|
if (trigger)
|
|
omap_set_gpio_triggering(bank, offset, trigger);
|
|
|
|
- /* For level-triggered GPIOs, the clearing must be done after
|
|
- * the HW source is cleared, thus after the handler has run */
|
|
- if (bank->level_mask & BIT(offset)) {
|
|
- omap_set_gpio_irqenable(bank, offset, 0);
|
|
+ omap_set_gpio_irqenable(bank, offset, 1);
|
|
+
|
|
+ /*
|
|
+ * For level-triggered GPIOs, clearing must be done after the source
|
|
+ * is cleared, thus after the handler has run. OMAP4 needs this done
|
|
+ * after enabing the interrupt to clear the wakeup status.
|
|
+ */
|
|
+ if (bank->level_mask & BIT(offset))
|
|
omap_clear_gpio_irqstatus(bank, offset);
|
|
- }
|
|
|
|
- omap_set_gpio_irqenable(bank, offset, 1);
|
|
raw_spin_unlock_irqrestore(&bank->lock, flags);
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
index c5ba9128b736..2b8b892eb846 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
@@ -4368,7 +4368,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
|
static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_state,
|
|
struct dc_stream_state *stream_state)
|
|
{
|
|
- stream_state->mode_changed = crtc_state->mode_changed;
|
|
+ stream_state->mode_changed =
|
|
+ crtc_state->mode_changed || crtc_state->active_changed;
|
|
}
|
|
|
|
static int amdgpu_dm_atomic_commit(struct drm_device *dev,
|
|
@@ -4389,10 +4390,22 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev,
|
|
*/
|
|
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
|
struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
|
|
+ struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
|
|
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
|
|
|
- if (drm_atomic_crtc_needs_modeset(new_crtc_state) && dm_old_crtc_state->stream)
|
|
+ if (drm_atomic_crtc_needs_modeset(new_crtc_state)
|
|
+ && dm_old_crtc_state->stream) {
|
|
+ /*
|
|
+ * CRC capture was enabled but not disabled.
|
|
+ * Release the vblank reference.
|
|
+ */
|
|
+ if (dm_new_crtc_state->crc_enabled) {
|
|
+ drm_crtc_vblank_put(crtc);
|
|
+ dm_new_crtc_state->crc_enabled = false;
|
|
+ }
|
|
+
|
|
manage_dm_interrupts(adev, acrtc, false);
|
|
+ }
|
|
}
|
|
/* Add check here for SoC's that support hardware cursor plane, to
|
|
* unset legacy_cursor_update */
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
|
|
index 6a6d977ddd7a..36a0bed9af07 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
|
|
@@ -51,6 +51,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name,
|
|
{
|
|
struct dm_crtc_state *crtc_state = to_dm_crtc_state(crtc->state);
|
|
struct dc_stream_state *stream_state = crtc_state->stream;
|
|
+ bool enable;
|
|
|
|
enum amdgpu_dm_pipe_crc_source source = dm_parse_crc_source(src_name);
|
|
|
|
@@ -65,28 +66,27 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name,
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ enable = (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO);
|
|
+
|
|
+ if (!dc_stream_configure_crc(stream_state->ctx->dc, stream_state,
|
|
+ enable, enable))
|
|
+ return -EINVAL;
|
|
+
|
|
/* When enabling CRC, we should also disable dithering. */
|
|
- if (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO) {
|
|
- if (dc_stream_configure_crc(stream_state->ctx->dc,
|
|
- stream_state,
|
|
- true, true)) {
|
|
- crtc_state->crc_enabled = true;
|
|
- dc_stream_set_dither_option(stream_state,
|
|
- DITHER_OPTION_TRUN8);
|
|
- }
|
|
- else
|
|
- return -EINVAL;
|
|
- } else {
|
|
- if (dc_stream_configure_crc(stream_state->ctx->dc,
|
|
- stream_state,
|
|
- false, false)) {
|
|
- crtc_state->crc_enabled = false;
|
|
- dc_stream_set_dither_option(stream_state,
|
|
- DITHER_OPTION_DEFAULT);
|
|
- }
|
|
- else
|
|
- return -EINVAL;
|
|
- }
|
|
+ dc_stream_set_dither_option(stream_state,
|
|
+ enable ? DITHER_OPTION_TRUN8
|
|
+ : DITHER_OPTION_DEFAULT);
|
|
+
|
|
+ /*
|
|
+ * Reading the CRC requires the vblank interrupt handler to be
|
|
+ * enabled. Keep a reference until CRC capture stops.
|
|
+ */
|
|
+ if (!crtc_state->crc_enabled && enable)
|
|
+ drm_crtc_vblank_get(crtc);
|
|
+ else if (crtc_state->crc_enabled && !enable)
|
|
+ drm_crtc_vblank_put(crtc);
|
|
+
|
|
+ crtc_state->crc_enabled = enable;
|
|
|
|
*values_cnt = 3;
|
|
/* Reset crc_skipped on dm state */
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
index 9045e6fa0780..bb0cda727605 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
@@ -958,6 +958,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
|
|
/* pplib is notified if disp_num changed */
|
|
dc->hwss.set_bandwidth(dc, context, true);
|
|
|
|
+ for (i = 0; i < context->stream_count; i++)
|
|
+ context->streams[i]->mode_changed = false;
|
|
+
|
|
dc_release_state(dc->current_state);
|
|
|
|
dc->current_state = context;
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
|
|
index 4058b59d9bea..a0355709abd1 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
|
|
@@ -2336,9 +2336,10 @@ static void dcn10_apply_ctx_for_surface(
|
|
}
|
|
}
|
|
|
|
- if (!pipe_ctx->plane_state &&
|
|
- old_pipe_ctx->plane_state &&
|
|
- old_pipe_ctx->stream_res.tg == tg) {
|
|
+ if ((!pipe_ctx->plane_state ||
|
|
+ pipe_ctx->stream_res.tg != old_pipe_ctx->stream_res.tg) &&
|
|
+ old_pipe_ctx->plane_state &&
|
|
+ old_pipe_ctx->stream_res.tg == tg) {
|
|
|
|
dc->hwss.plane_atomic_disconnect(dc, old_pipe_ctx);
|
|
removed_pipe[i] = true;
|
|
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
|
|
index d708472d93c4..65f58e23e03d 100644
|
|
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
|
|
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
|
|
@@ -3278,6 +3278,7 @@ static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs
|
|
msg.u.i2c_read.transactions[i].i2c_dev_id = msgs[i].addr;
|
|
msg.u.i2c_read.transactions[i].num_bytes = msgs[i].len;
|
|
msg.u.i2c_read.transactions[i].bytes = msgs[i].buf;
|
|
+ msg.u.i2c_read.transactions[i].no_stop_bit = !(msgs[i].flags & I2C_M_STOP);
|
|
}
|
|
msg.u.i2c_read.read_i2c_device_id = msgs[num - 1].addr;
|
|
msg.u.i2c_read.num_bytes_read = msgs[num - 1].len;
|
|
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
|
|
index e65596617239..a0663f44e218 100644
|
|
--- a/drivers/gpu/drm/drm_fb_helper.c
|
|
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
|
@@ -2877,7 +2877,7 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev,
|
|
return 0;
|
|
|
|
err_drm_fb_helper_fini:
|
|
- drm_fb_helper_fini(fb_helper);
|
|
+ drm_fb_helper_fbdev_teardown(dev);
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
|
|
index 6153cbda239f..d36b1be632d9 100644
|
|
--- a/drivers/gpu/drm/drm_plane.c
|
|
+++ b/drivers/gpu/drm/drm_plane.c
|
|
@@ -211,6 +211,9 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
format_modifier_count++;
|
|
}
|
|
|
|
+ if (format_modifier_count)
|
|
+ config->allow_fb_modifiers = true;
|
|
+
|
|
plane->modifier_count = format_modifier_count;
|
|
plane->modifiers = kmalloc_array(format_modifier_count,
|
|
sizeof(format_modifiers[0]),
|
|
diff --git a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
|
|
index 6a4ca139cf5d..8fd8124d72ba 100644
|
|
--- a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
|
|
+++ b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
|
|
@@ -750,7 +750,9 @@ static int nv17_tv_set_property(struct drm_encoder *encoder,
|
|
/* Disable the crtc to ensure a full modeset is
|
|
* performed whenever it's turned on again. */
|
|
if (crtc)
|
|
- drm_crtc_force_disable(crtc);
|
|
+ drm_crtc_helper_set_mode(crtc, &crtc->mode,
|
|
+ crtc->x, crtc->y,
|
|
+ crtc->primary->fb);
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
|
|
index fb46df56f0c4..0386b454e221 100644
|
|
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
|
|
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
|
|
@@ -300,6 +300,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
|
|
dev_dbg(rcdu->dev,
|
|
"connected entity %pOF is disabled, skipping\n",
|
|
entity);
|
|
+ of_node_put(entity);
|
|
return -ENODEV;
|
|
}
|
|
|
|
@@ -335,6 +336,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
|
|
dev_warn(rcdu->dev,
|
|
"no encoder found for endpoint %pOF, skipping\n",
|
|
ep->local_node);
|
|
+ of_node_put(entity);
|
|
return -ENODEV;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
|
|
index 1ea2dd35bca9..0a271f762a0a 100644
|
|
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
|
|
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
|
|
@@ -55,6 +55,9 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
|
|
|
*vblank_time = output->vblank_hrtimer.node.expires;
|
|
|
|
+ if (!in_vblank_irq)
|
|
+ *vblank_time -= output->period_ns;
|
|
+
|
|
return true;
|
|
}
|
|
|
|
diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-ish-hid/ipc/ipc.c
|
|
index bfbca7ec54ce..e00b9dbe220f 100644
|
|
--- a/drivers/hid/intel-ish-hid/ipc/ipc.c
|
|
+++ b/drivers/hid/intel-ish-hid/ipc/ipc.c
|
|
@@ -91,7 +91,10 @@ static bool check_generated_interrupt(struct ishtp_device *dev)
|
|
IPC_INT_FROM_ISH_TO_HOST_CHV_AB(pisr_val);
|
|
} else {
|
|
pisr_val = ish_reg_read(dev, IPC_REG_PISR_BXT);
|
|
- interrupt_generated = IPC_INT_FROM_ISH_TO_HOST_BXT(pisr_val);
|
|
+ interrupt_generated = !!pisr_val;
|
|
+ /* only busy-clear bit is RW, others are RO */
|
|
+ if (pisr_val)
|
|
+ ish_reg_write(dev, IPC_REG_PISR_BXT, pisr_val);
|
|
}
|
|
|
|
return interrupt_generated;
|
|
@@ -843,11 +846,11 @@ int ish_hw_start(struct ishtp_device *dev)
|
|
{
|
|
ish_set_host_rdy(dev);
|
|
|
|
+ set_host_ready(dev);
|
|
+
|
|
/* After that we can enable ISH DMA operation and wakeup ISHFW */
|
|
ish_wakeup(dev);
|
|
|
|
- set_host_ready(dev);
|
|
-
|
|
/* wait for FW-initiated reset flow */
|
|
if (!dev->recvd_hw_ready)
|
|
wait_event_interruptible_timeout(dev->wait_hw_ready,
|
|
diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c b/drivers/hid/intel-ish-hid/ishtp/bus.c
|
|
index 2623a567ffba..f546635e9ac9 100644
|
|
--- a/drivers/hid/intel-ish-hid/ishtp/bus.c
|
|
+++ b/drivers/hid/intel-ish-hid/ishtp/bus.c
|
|
@@ -623,7 +623,8 @@ int ishtp_cl_device_bind(struct ishtp_cl *cl)
|
|
spin_lock_irqsave(&cl->dev->device_list_lock, flags);
|
|
list_for_each_entry(cl_device, &cl->dev->device_list,
|
|
device_link) {
|
|
- if (cl_device->fw_client->client_id == cl->fw_client_id) {
|
|
+ if (cl_device->fw_client &&
|
|
+ cl_device->fw_client->client_id == cl->fw_client_id) {
|
|
cl->device = cl_device;
|
|
rv = 0;
|
|
break;
|
|
@@ -683,6 +684,7 @@ void ishtp_bus_remove_all_clients(struct ishtp_device *ishtp_dev,
|
|
spin_lock_irqsave(&ishtp_dev->device_list_lock, flags);
|
|
list_for_each_entry_safe(cl_device, n, &ishtp_dev->device_list,
|
|
device_link) {
|
|
+ cl_device->fw_client = NULL;
|
|
if (warm_reset && cl_device->reference_count)
|
|
continue;
|
|
|
|
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
|
|
index 677695635211..0f5e03e4df22 100644
|
|
--- a/drivers/hwtracing/coresight/coresight-etm-perf.c
|
|
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
|
|
@@ -181,15 +181,15 @@ static void etm_free_aux(void *data)
|
|
schedule_work(&event_data->work);
|
|
}
|
|
|
|
-static void *etm_setup_aux(int event_cpu, void **pages,
|
|
+static void *etm_setup_aux(struct perf_event *event, void **pages,
|
|
int nr_pages, bool overwrite)
|
|
{
|
|
- int cpu;
|
|
+ int cpu = event->cpu;
|
|
cpumask_t *mask;
|
|
struct coresight_device *sink;
|
|
struct etm_event_data *event_data = NULL;
|
|
|
|
- event_data = alloc_event_data(event_cpu);
|
|
+ event_data = alloc_event_data(cpu);
|
|
if (!event_data)
|
|
return NULL;
|
|
INIT_WORK(&event_data->work, free_event_data);
|
|
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c
|
|
index 1d94ebec027b..2bce7cf0b0af 100644
|
|
--- a/drivers/hwtracing/coresight/coresight-etm4x.c
|
|
+++ b/drivers/hwtracing/coresight/coresight-etm4x.c
|
|
@@ -54,7 +54,8 @@ static void etm4_os_unlock(struct etmv4_drvdata *drvdata)
|
|
|
|
static bool etm4_arch_supported(u8 arch)
|
|
{
|
|
- switch (arch) {
|
|
+ /* Mask out the minor version number */
|
|
+ switch (arch & 0xf0) {
|
|
case ETM_ARCH_V4:
|
|
break;
|
|
default:
|
|
diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c
|
|
index 6cb7ad608bcd..0f01cdba9d2c 100644
|
|
--- a/drivers/i2c/i2c-core-of.c
|
|
+++ b/drivers/i2c/i2c-core-of.c
|
|
@@ -121,6 +121,17 @@ static int of_dev_node_match(struct device *dev, void *data)
|
|
return dev->of_node == data;
|
|
}
|
|
|
|
+static int of_dev_or_parent_node_match(struct device *dev, void *data)
|
|
+{
|
|
+ if (dev->of_node == data)
|
|
+ return 1;
|
|
+
|
|
+ if (dev->parent)
|
|
+ return dev->parent->of_node == data;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
/* must call put_device() when done with returned i2c_client device */
|
|
struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
|
|
{
|
|
@@ -145,7 +156,8 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node)
|
|
struct device *dev;
|
|
struct i2c_adapter *adapter;
|
|
|
|
- dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match);
|
|
+ dev = bus_find_device(&i2c_bus_type, NULL, node,
|
|
+ of_dev_or_parent_node_match);
|
|
if (!dev)
|
|
return NULL;
|
|
|
|
diff --git a/drivers/iio/adc/qcom-pm8xxx-xoadc.c b/drivers/iio/adc/qcom-pm8xxx-xoadc.c
|
|
index b093ecddf1a8..54db848f0bcd 100644
|
|
--- a/drivers/iio/adc/qcom-pm8xxx-xoadc.c
|
|
+++ b/drivers/iio/adc/qcom-pm8xxx-xoadc.c
|
|
@@ -423,18 +423,14 @@ static irqreturn_t pm8xxx_eoc_irq(int irq, void *d)
|
|
static struct pm8xxx_chan_info *
|
|
pm8xxx_get_channel(struct pm8xxx_xoadc *adc, u8 chan)
|
|
{
|
|
- struct pm8xxx_chan_info *ch;
|
|
int i;
|
|
|
|
for (i = 0; i < adc->nchans; i++) {
|
|
- ch = &adc->chans[i];
|
|
+ struct pm8xxx_chan_info *ch = &adc->chans[i];
|
|
if (ch->hwchan->amux_channel == chan)
|
|
- break;
|
|
+ return ch;
|
|
}
|
|
- if (i == adc->nchans)
|
|
- return NULL;
|
|
-
|
|
- return ch;
|
|
+ return NULL;
|
|
}
|
|
|
|
static int pm8xxx_read_channel_rsv(struct pm8xxx_xoadc *adc,
|
|
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
|
|
index 0f83cbec33f3..a68569ec86bf 100644
|
|
--- a/drivers/infiniband/hw/cxgb4/cm.c
|
|
+++ b/drivers/infiniband/hw/cxgb4/cm.c
|
|
@@ -1904,8 +1904,10 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
}
|
|
mutex_unlock(&ep->com.mutex);
|
|
|
|
- if (release)
|
|
+ if (release) {
|
|
+ close_complete_upcall(ep, -ECONNRESET);
|
|
release_ep_resources(ep);
|
|
+ }
|
|
c4iw_put_ep(&ep->com);
|
|
return 0;
|
|
}
|
|
@@ -3608,7 +3610,6 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp)
|
|
if (close) {
|
|
if (abrupt) {
|
|
set_bit(EP_DISC_ABORT, &ep->com.history);
|
|
- close_complete_upcall(ep, -ECONNRESET);
|
|
ret = send_abort(ep);
|
|
} else {
|
|
set_bit(EP_DISC_CLOSE, &ep->com.history);
|
|
diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c
|
|
index fedaf8260105..8c79a480f2b7 100644
|
|
--- a/drivers/infiniband/hw/mlx4/cm.c
|
|
+++ b/drivers/infiniband/hw/mlx4/cm.c
|
|
@@ -39,7 +39,7 @@
|
|
|
|
#include "mlx4_ib.h"
|
|
|
|
-#define CM_CLEANUP_CACHE_TIMEOUT (5 * HZ)
|
|
+#define CM_CLEANUP_CACHE_TIMEOUT (30 * HZ)
|
|
|
|
struct id_map_entry {
|
|
struct rb_node node;
|
|
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
|
|
index 23520df7650f..55cd6e0b409c 100644
|
|
--- a/drivers/input/misc/soc_button_array.c
|
|
+++ b/drivers/input/misc/soc_button_array.c
|
|
@@ -373,7 +373,7 @@ static struct soc_button_info soc_button_PNP0C40[] = {
|
|
{ "home", 1, EV_KEY, KEY_LEFTMETA, false, true },
|
|
{ "volume_up", 2, EV_KEY, KEY_VOLUMEUP, true, false },
|
|
{ "volume_down", 3, EV_KEY, KEY_VOLUMEDOWN, true, false },
|
|
- { "rotation_lock", 4, EV_SW, SW_ROTATE_LOCK, false, false },
|
|
+ { "rotation_lock", 4, EV_KEY, KEY_ROTATE_LOCK_TOGGLE, false, false },
|
|
{ }
|
|
};
|
|
|
|
diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c
|
|
index fde728ea2900..48d4709a8e93 100644
|
|
--- a/drivers/iommu/io-pgtable-arm-v7s.c
|
|
+++ b/drivers/iommu/io-pgtable-arm-v7s.c
|
|
@@ -228,7 +228,8 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp,
|
|
if (dma != phys)
|
|
goto out_unmap;
|
|
}
|
|
- kmemleak_ignore(table);
|
|
+ if (lvl == 2)
|
|
+ kmemleak_ignore(table);
|
|
return table;
|
|
|
|
out_unmap:
|
|
diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c
|
|
index 3d79a6380761..723f2f17497a 100644
|
|
--- a/drivers/leds/leds-lp55xx-common.c
|
|
+++ b/drivers/leds/leds-lp55xx-common.c
|
|
@@ -201,7 +201,7 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context)
|
|
|
|
if (!fw) {
|
|
dev_err(dev, "firmware request failed\n");
|
|
- goto out;
|
|
+ return;
|
|
}
|
|
|
|
/* handling firmware data is chip dependent */
|
|
@@ -214,9 +214,9 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context)
|
|
|
|
mutex_unlock(&chip->lock);
|
|
|
|
-out:
|
|
/* firmware should be released for other channel use */
|
|
release_firmware(chip->fw);
|
|
+ chip->fw = NULL;
|
|
}
|
|
|
|
static int lp55xx_request_firmware(struct lp55xx_chip *chip)
|
|
diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
|
|
index 26f035a0c5b9..d9481640b3e1 100644
|
|
--- a/drivers/md/bcache/sysfs.c
|
|
+++ b/drivers/md/bcache/sysfs.c
|
|
@@ -283,8 +283,12 @@ STORE(__cached_dev)
|
|
sysfs_strtoul_clamp(writeback_rate_update_seconds,
|
|
dc->writeback_rate_update_seconds,
|
|
1, WRITEBACK_RATE_UPDATE_SECS_MAX);
|
|
- d_strtoul(writeback_rate_i_term_inverse);
|
|
- d_strtoul_nonzero(writeback_rate_p_term_inverse);
|
|
+ sysfs_strtoul_clamp(writeback_rate_i_term_inverse,
|
|
+ dc->writeback_rate_i_term_inverse,
|
|
+ 1, UINT_MAX);
|
|
+ sysfs_strtoul_clamp(writeback_rate_p_term_inverse,
|
|
+ dc->writeback_rate_p_term_inverse,
|
|
+ 1, UINT_MAX);
|
|
d_strtoul_nonzero(writeback_rate_minimum);
|
|
|
|
sysfs_strtoul_clamp(io_error_limit, dc->error_limit, 0, INT_MAX);
|
|
@@ -295,7 +299,9 @@ STORE(__cached_dev)
|
|
dc->io_disable = v ? 1 : 0;
|
|
}
|
|
|
|
- d_strtoi_h(sequential_cutoff);
|
|
+ sysfs_strtoul_clamp(sequential_cutoff,
|
|
+ dc->sequential_cutoff,
|
|
+ 0, UINT_MAX);
|
|
d_strtoi_h(readahead);
|
|
|
|
if (attr == &sysfs_clear_stats)
|
|
@@ -766,8 +772,17 @@ STORE(__bch_cache_set)
|
|
c->error_limit = strtoul_or_return(buf);
|
|
|
|
/* See count_io_errors() for why 88 */
|
|
- if (attr == &sysfs_io_error_halflife)
|
|
- c->error_decay = strtoul_or_return(buf) / 88;
|
|
+ if (attr == &sysfs_io_error_halflife) {
|
|
+ unsigned long v = 0;
|
|
+ ssize_t ret;
|
|
+
|
|
+ ret = strtoul_safe_clamp(buf, v, 0, UINT_MAX);
|
|
+ if (!ret) {
|
|
+ c->error_decay = v / 88;
|
|
+ return size;
|
|
+ }
|
|
+ return ret;
|
|
+ }
|
|
|
|
if (attr == &sysfs_io_disable) {
|
|
v = strtoul_or_return(buf);
|
|
diff --git a/drivers/md/bcache/sysfs.h b/drivers/md/bcache/sysfs.h
|
|
index 3fe82425859c..0ad2715a884e 100644
|
|
--- a/drivers/md/bcache/sysfs.h
|
|
+++ b/drivers/md/bcache/sysfs.h
|
|
@@ -81,9 +81,16 @@ do { \
|
|
|
|
#define sysfs_strtoul_clamp(file, var, min, max) \
|
|
do { \
|
|
- if (attr == &sysfs_ ## file) \
|
|
- return strtoul_safe_clamp(buf, var, min, max) \
|
|
- ?: (ssize_t) size; \
|
|
+ if (attr == &sysfs_ ## file) { \
|
|
+ unsigned long v = 0; \
|
|
+ ssize_t ret; \
|
|
+ ret = strtoul_safe_clamp(buf, v, min, max); \
|
|
+ if (!ret) { \
|
|
+ var = v; \
|
|
+ return size; \
|
|
+ } \
|
|
+ return ret; \
|
|
+ } \
|
|
} while (0)
|
|
|
|
#define strtoul_or_return(cp) \
|
|
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
|
|
index cd4220ee7004..435a2ee4a392 100644
|
|
--- a/drivers/md/dm-thin.c
|
|
+++ b/drivers/md/dm-thin.c
|
|
@@ -3283,6 +3283,13 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|
as.argc = argc;
|
|
as.argv = argv;
|
|
|
|
+ /* make sure metadata and data are different devices */
|
|
+ if (!strcmp(argv[0], argv[1])) {
|
|
+ ti->error = "Error setting metadata or data device";
|
|
+ r = -EINVAL;
|
|
+ goto out_unlock;
|
|
+ }
|
|
+
|
|
/*
|
|
* Set default pool features.
|
|
*/
|
|
@@ -4167,6 +4174,12 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|
tc->sort_bio_list = RB_ROOT;
|
|
|
|
if (argc == 3) {
|
|
+ if (!strcmp(argv[0], argv[2])) {
|
|
+ ti->error = "Error setting origin device";
|
|
+ r = -EINVAL;
|
|
+ goto bad_origin_dev;
|
|
+ }
|
|
+
|
|
r = dm_get_device(ti, argv[2], FMODE_READ, &origin_dev);
|
|
if (r) {
|
|
ti->error = "Error opening origin device";
|
|
diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
|
|
index efda1aa95ca0..7a7d3969af20 100644
|
|
--- a/drivers/media/i2c/mt9m111.c
|
|
+++ b/drivers/media/i2c/mt9m111.c
|
|
@@ -1014,6 +1014,8 @@ static int mt9m111_probe(struct i2c_client *client,
|
|
mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
|
|
mt9m111->rect.width = MT9M111_MAX_WIDTH;
|
|
mt9m111->rect.height = MT9M111_MAX_HEIGHT;
|
|
+ mt9m111->width = mt9m111->rect.width;
|
|
+ mt9m111->height = mt9m111->rect.height;
|
|
mt9m111->fmt = &mt9m111_colour_fmts[0];
|
|
mt9m111->lastpage = -1;
|
|
mutex_init(&mt9m111->power_lock);
|
|
diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c
|
|
index 605f3e25ad82..f5a1ee90a6c5 100644
|
|
--- a/drivers/media/i2c/ov7740.c
|
|
+++ b/drivers/media/i2c/ov7740.c
|
|
@@ -1101,6 +1101,9 @@ static int ov7740_probe(struct i2c_client *client,
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ pm_runtime_set_active(&client->dev);
|
|
+ pm_runtime_enable(&client->dev);
|
|
+
|
|
ret = ov7740_detect(ov7740);
|
|
if (ret)
|
|
goto error_detect;
|
|
@@ -1123,8 +1126,6 @@ static int ov7740_probe(struct i2c_client *client,
|
|
if (ret)
|
|
goto error_async_register;
|
|
|
|
- pm_runtime_set_active(&client->dev);
|
|
- pm_runtime_enable(&client->dev);
|
|
pm_runtime_idle(&client->dev);
|
|
|
|
return 0;
|
|
@@ -1134,6 +1135,8 @@ error_async_register:
|
|
error_init_controls:
|
|
ov7740_free_controls(ov7740);
|
|
error_detect:
|
|
+ pm_runtime_disable(&client->dev);
|
|
+ pm_runtime_set_suspended(&client->dev);
|
|
ov7740_set_power(ov7740, 0);
|
|
media_entity_cleanup(&ov7740->subdev.entity);
|
|
|
|
diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
index 4f24da8afecc..11429633b2fb 100644
|
|
--- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
+++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
@@ -702,7 +702,7 @@ end:
|
|
v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, to_vb2_v4l2_buffer(vb));
|
|
}
|
|
|
|
-static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx,
|
|
+static struct vb2_v4l2_buffer *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx,
|
|
enum v4l2_buf_type type)
|
|
{
|
|
if (V4L2_TYPE_IS_OUTPUT(type))
|
|
@@ -714,7 +714,7 @@ static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx,
|
|
static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
{
|
|
struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q);
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
int ret = 0;
|
|
|
|
ret = pm_runtime_get_sync(ctx->jpeg->dev);
|
|
@@ -724,14 +724,14 @@ static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
return 0;
|
|
err:
|
|
while ((vb = mtk_jpeg_buf_remove(ctx, q->type)))
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_QUEUED);
|
|
+ v4l2_m2m_buf_done(vb, VB2_BUF_STATE_QUEUED);
|
|
return ret;
|
|
}
|
|
|
|
static void mtk_jpeg_stop_streaming(struct vb2_queue *q)
|
|
{
|
|
struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q);
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
|
|
/*
|
|
* STREAMOFF is an acknowledgment for source change event.
|
|
@@ -743,7 +743,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q)
|
|
struct mtk_jpeg_src_buf *src_buf;
|
|
|
|
vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
- src_buf = mtk_jpeg_vb2_to_srcbuf(vb);
|
|
+ src_buf = mtk_jpeg_vb2_to_srcbuf(&vb->vb2_buf);
|
|
mtk_jpeg_set_queue_data(ctx, &src_buf->dec_param);
|
|
ctx->state = MTK_JPEG_RUNNING;
|
|
} else if (V4L2_TYPE_IS_OUTPUT(q->type)) {
|
|
@@ -751,7 +751,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q)
|
|
}
|
|
|
|
while ((vb = mtk_jpeg_buf_remove(ctx, q->type)))
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_ERROR);
|
|
+ v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR);
|
|
|
|
pm_runtime_put_sync(ctx->jpeg->dev);
|
|
}
|
|
@@ -807,7 +807,7 @@ static void mtk_jpeg_device_run(void *priv)
|
|
{
|
|
struct mtk_jpeg_ctx *ctx = priv;
|
|
struct mtk_jpeg_dev *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *src_buf, *dst_buf;
|
|
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR;
|
|
unsigned long flags;
|
|
struct mtk_jpeg_src_buf *jpeg_src_buf;
|
|
@@ -817,11 +817,11 @@ static void mtk_jpeg_device_run(void *priv)
|
|
|
|
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
|
- jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf);
|
|
+ jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf);
|
|
|
|
if (jpeg_src_buf->flags & MTK_JPEG_BUF_FLAGS_LAST_FRAME) {
|
|
- for (i = 0; i < dst_buf->num_planes; i++)
|
|
- vb2_set_plane_payload(dst_buf, i, 0);
|
|
+ for (i = 0; i < dst_buf->vb2_buf.num_planes; i++)
|
|
+ vb2_set_plane_payload(&dst_buf->vb2_buf, i, 0);
|
|
buf_state = VB2_BUF_STATE_DONE;
|
|
goto dec_end;
|
|
}
|
|
@@ -833,8 +833,8 @@ static void mtk_jpeg_device_run(void *priv)
|
|
return;
|
|
}
|
|
|
|
- mtk_jpeg_set_dec_src(ctx, src_buf, &bs);
|
|
- if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, dst_buf, &fb))
|
|
+ mtk_jpeg_set_dec_src(ctx, &src_buf->vb2_buf, &bs);
|
|
+ if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, &dst_buf->vb2_buf, &fb))
|
|
goto dec_end;
|
|
|
|
spin_lock_irqsave(&jpeg->hw_lock, flags);
|
|
@@ -849,8 +849,8 @@ static void mtk_jpeg_device_run(void *priv)
|
|
dec_end:
|
|
v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
|
|
v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state);
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state);
|
|
+ v4l2_m2m_buf_done(src_buf, buf_state);
|
|
+ v4l2_m2m_buf_done(dst_buf, buf_state);
|
|
v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
|
|
}
|
|
|
|
@@ -921,7 +921,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv)
|
|
{
|
|
struct mtk_jpeg_dev *jpeg = priv;
|
|
struct mtk_jpeg_ctx *ctx;
|
|
- struct vb2_buffer *src_buf, *dst_buf;
|
|
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
struct mtk_jpeg_src_buf *jpeg_src_buf;
|
|
enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR;
|
|
u32 dec_irq_ret;
|
|
@@ -938,7 +938,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv)
|
|
|
|
src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
|
|
dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
|
|
- jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf);
|
|
+ jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf);
|
|
|
|
if (dec_irq_ret >= MTK_JPEG_DEC_RESULT_UNDERFLOW)
|
|
mtk_jpeg_dec_reset(jpeg->dec_reg_base);
|
|
@@ -948,15 +948,15 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv)
|
|
goto dec_end;
|
|
}
|
|
|
|
- for (i = 0; i < dst_buf->num_planes; i++)
|
|
- vb2_set_plane_payload(dst_buf, i,
|
|
+ for (i = 0; i < dst_buf->vb2_buf.num_planes; i++)
|
|
+ vb2_set_plane_payload(&dst_buf->vb2_buf, i,
|
|
jpeg_src_buf->dec_param.comp_size[i]);
|
|
|
|
buf_state = VB2_BUF_STATE_DONE;
|
|
|
|
dec_end:
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state);
|
|
- v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state);
|
|
+ v4l2_m2m_buf_done(src_buf, buf_state);
|
|
+ v4l2_m2m_buf_done(dst_buf, buf_state);
|
|
v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c
|
|
index 64195c4ddeaf..419e1cb10dc6 100644
|
|
--- a/drivers/media/platform/mx2_emmaprp.c
|
|
+++ b/drivers/media/platform/mx2_emmaprp.c
|
|
@@ -274,7 +274,7 @@ static void emmaprp_device_run(void *priv)
|
|
{
|
|
struct emmaprp_ctx *ctx = priv;
|
|
struct emmaprp_q_data *s_q_data, *d_q_data;
|
|
- struct vb2_buffer *src_buf, *dst_buf;
|
|
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
struct emmaprp_dev *pcdev = ctx->dev;
|
|
unsigned int s_width, s_height;
|
|
unsigned int d_width, d_height;
|
|
@@ -294,8 +294,8 @@ static void emmaprp_device_run(void *priv)
|
|
d_height = d_q_data->height;
|
|
d_size = d_width * d_height;
|
|
|
|
- p_in = vb2_dma_contig_plane_dma_addr(src_buf, 0);
|
|
- p_out = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
|
|
+ p_in = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
|
+ p_out = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
|
if (!p_in || !p_out) {
|
|
v4l2_err(&pcdev->v4l2_dev,
|
|
"Acquiring kernel pointers to buffers failed\n");
|
|
diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c
|
|
index ce09799976ef..e1085e3ab3cc 100644
|
|
--- a/drivers/media/platform/rcar-vin/rcar-core.c
|
|
+++ b/drivers/media/platform/rcar-vin/rcar-core.c
|
|
@@ -131,9 +131,13 @@ static int rvin_group_link_notify(struct media_link *link, u32 flags,
|
|
!is_media_entity_v4l2_video_device(link->sink->entity))
|
|
return 0;
|
|
|
|
- /* If any entity is in use don't allow link changes. */
|
|
+ /*
|
|
+ * Don't allow link changes if any entity in the graph is
|
|
+ * streaming, modifying the CHSEL register fields can disrupt
|
|
+ * running streams.
|
|
+ */
|
|
media_device_for_each_entity(entity, &group->mdev)
|
|
- if (entity->use_count)
|
|
+ if (entity->stream_count)
|
|
return -EBUSY;
|
|
|
|
mutex_lock(&group->lock);
|
|
diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
|
|
index ab5a6f95044a..86a76f35a9a1 100644
|
|
--- a/drivers/media/platform/rockchip/rga/rga.c
|
|
+++ b/drivers/media/platform/rockchip/rga/rga.c
|
|
@@ -43,7 +43,7 @@ static void device_run(void *prv)
|
|
{
|
|
struct rga_ctx *ctx = prv;
|
|
struct rockchip_rga *rga = ctx->rga;
|
|
- struct vb2_buffer *src, *dst;
|
|
+ struct vb2_v4l2_buffer *src, *dst;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&rga->ctrl_lock, flags);
|
|
@@ -53,8 +53,8 @@ static void device_run(void *prv)
|
|
src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
|
|
|
- rga_buf_map(src);
|
|
- rga_buf_map(dst);
|
|
+ rga_buf_map(&src->vb2_buf);
|
|
+ rga_buf_map(&dst->vb2_buf);
|
|
|
|
rga_hw_start(rga);
|
|
|
|
diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
|
|
index e901201b6fcc..1f58574d0b96 100644
|
|
--- a/drivers/media/platform/s5p-g2d/g2d.c
|
|
+++ b/drivers/media/platform/s5p-g2d/g2d.c
|
|
@@ -487,7 +487,7 @@ static void device_run(void *prv)
|
|
{
|
|
struct g2d_ctx *ctx = prv;
|
|
struct g2d_dev *dev = ctx->dev;
|
|
- struct vb2_buffer *src, *dst;
|
|
+ struct vb2_v4l2_buffer *src, *dst;
|
|
unsigned long flags;
|
|
u32 cmd = 0;
|
|
|
|
@@ -502,10 +502,10 @@ static void device_run(void *prv)
|
|
spin_lock_irqsave(&dev->ctrl_lock, flags);
|
|
|
|
g2d_set_src_size(dev, &ctx->in);
|
|
- g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(src, 0));
|
|
+ g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0));
|
|
|
|
g2d_set_dst_size(dev, &ctx->out);
|
|
- g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0));
|
|
+ g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0));
|
|
|
|
g2d_set_rop4(dev, ctx->rop);
|
|
g2d_set_flip(dev, ctx->flip);
|
|
diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
index 04fd2e0493c0..350afaa29a62 100644
|
|
--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
+++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
@@ -793,14 +793,14 @@ static void skip(struct s5p_jpeg_buffer *buf, long len);
|
|
static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
+ struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
struct s5p_jpeg_buffer jpeg_buffer;
|
|
unsigned int word;
|
|
int c, x, components;
|
|
|
|
jpeg_buffer.size = 2; /* Ls */
|
|
jpeg_buffer.data =
|
|
- (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sos + 2;
|
|
+ (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2;
|
|
jpeg_buffer.curr = 0;
|
|
|
|
word = 0;
|
|
@@ -830,14 +830,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx)
|
|
static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
+ struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
struct s5p_jpeg_buffer jpeg_buffer;
|
|
unsigned int word;
|
|
int c, i, n, j;
|
|
|
|
for (j = 0; j < ctx->out_q.dht.n; ++j) {
|
|
jpeg_buffer.size = ctx->out_q.dht.len[j];
|
|
- jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) +
|
|
+ jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) +
|
|
ctx->out_q.dht.marker[j];
|
|
jpeg_buffer.curr = 0;
|
|
|
|
@@ -889,13 +889,13 @@ static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx)
|
|
static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
+ struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
struct s5p_jpeg_buffer jpeg_buffer;
|
|
int c, x, components;
|
|
|
|
jpeg_buffer.size = ctx->out_q.sof_len;
|
|
jpeg_buffer.data =
|
|
- (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sof;
|
|
+ (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sof;
|
|
jpeg_buffer.curr = 0;
|
|
|
|
skip(&jpeg_buffer, 5); /* P, Y, X */
|
|
@@ -920,14 +920,14 @@ static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx)
|
|
static void exynos4_jpeg_parse_q_tbl(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
+ struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
struct s5p_jpeg_buffer jpeg_buffer;
|
|
unsigned int word;
|
|
int c, i, j;
|
|
|
|
for (j = 0; j < ctx->out_q.dqt.n; ++j) {
|
|
jpeg_buffer.size = ctx->out_q.dqt.len[j];
|
|
- jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) +
|
|
+ jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) +
|
|
ctx->out_q.dqt.marker[j];
|
|
jpeg_buffer.curr = 0;
|
|
|
|
@@ -1293,13 +1293,16 @@ static int s5p_jpeg_querycap(struct file *file, void *priv,
|
|
return 0;
|
|
}
|
|
|
|
-static int enum_fmt(struct s5p_jpeg_fmt *sjpeg_formats, int n,
|
|
+static int enum_fmt(struct s5p_jpeg_ctx *ctx,
|
|
+ struct s5p_jpeg_fmt *sjpeg_formats, int n,
|
|
struct v4l2_fmtdesc *f, u32 type)
|
|
{
|
|
int i, num = 0;
|
|
+ unsigned int fmt_ver_flag = ctx->jpeg->variant->fmt_ver_flag;
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
- if (sjpeg_formats[i].flags & type) {
|
|
+ if (sjpeg_formats[i].flags & type &&
|
|
+ sjpeg_formats[i].flags & fmt_ver_flag) {
|
|
/* index-th format of type type found ? */
|
|
if (num == f->index)
|
|
break;
|
|
@@ -1326,11 +1329,11 @@ static int s5p_jpeg_enum_fmt_vid_cap(struct file *file, void *priv,
|
|
struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
|
|
|
|
if (ctx->mode == S5P_JPEG_ENCODE)
|
|
- return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
+ return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
SJPEG_FMT_FLAG_ENC_CAPTURE);
|
|
|
|
- return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
- SJPEG_FMT_FLAG_DEC_CAPTURE);
|
|
+ return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
+ SJPEG_FMT_FLAG_DEC_CAPTURE);
|
|
}
|
|
|
|
static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv,
|
|
@@ -1339,11 +1342,11 @@ static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv,
|
|
struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
|
|
|
|
if (ctx->mode == S5P_JPEG_ENCODE)
|
|
- return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
+ return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
SJPEG_FMT_FLAG_ENC_OUTPUT);
|
|
|
|
- return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
- SJPEG_FMT_FLAG_DEC_OUTPUT);
|
|
+ return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f,
|
|
+ SJPEG_FMT_FLAG_DEC_OUTPUT);
|
|
}
|
|
|
|
static struct s5p_jpeg_q_data *get_q_data(struct s5p_jpeg_ctx *ctx,
|
|
@@ -2072,15 +2075,15 @@ static void s5p_jpeg_device_run(void *priv)
|
|
{
|
|
struct s5p_jpeg_ctx *ctx = priv;
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *src_buf, *dst_buf;
|
|
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
unsigned long src_addr, dst_addr, flags;
|
|
|
|
spin_lock_irqsave(&ctx->jpeg->slock, flags);
|
|
|
|
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
|
- src_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0);
|
|
- dst_addr = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
|
|
+ src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
|
+ dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
|
|
|
s5p_jpeg_reset(jpeg->regs);
|
|
s5p_jpeg_poweron(jpeg->regs);
|
|
@@ -2153,7 +2156,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
struct s5p_jpeg_fmt *fmt;
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
struct s5p_jpeg_addr jpeg_addr = {};
|
|
u32 pix_size, padding_bytes = 0;
|
|
|
|
@@ -2172,7 +2175,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
|
}
|
|
|
|
- jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0);
|
|
+ jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0);
|
|
|
|
if (fmt->colplanes == 2) {
|
|
jpeg_addr.cb = jpeg_addr.y + pix_size - padding_bytes;
|
|
@@ -2190,7 +2193,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
unsigned int jpeg_addr = 0;
|
|
|
|
if (ctx->mode == S5P_JPEG_ENCODE)
|
|
@@ -2198,7 +2201,7 @@ static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
|
|
else
|
|
vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
|
|
- jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
|
+ jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0);
|
|
if (jpeg->variant->version == SJPEG_EXYNOS5433 &&
|
|
ctx->mode == S5P_JPEG_DECODE)
|
|
jpeg_addr += ctx->out_q.sos;
|
|
@@ -2314,7 +2317,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
struct s5p_jpeg_fmt *fmt;
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
struct s5p_jpeg_addr jpeg_addr = {};
|
|
u32 pix_size;
|
|
|
|
@@ -2328,7 +2331,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
fmt = ctx->cap_q.fmt;
|
|
}
|
|
|
|
- jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0);
|
|
+ jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0);
|
|
|
|
if (fmt->colplanes == 2) {
|
|
jpeg_addr.cb = jpeg_addr.y + pix_size;
|
|
@@ -2346,7 +2349,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
|
|
static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
|
|
{
|
|
struct s5p_jpeg *jpeg = ctx->jpeg;
|
|
- struct vb2_buffer *vb;
|
|
+ struct vb2_v4l2_buffer *vb;
|
|
unsigned int jpeg_addr = 0;
|
|
|
|
if (ctx->mode == S5P_JPEG_ENCODE)
|
|
@@ -2354,7 +2357,7 @@ static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
|
|
else
|
|
vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
|
|
- jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
|
+ jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0);
|
|
exynos3250_jpeg_jpgadr(jpeg->regs, jpeg_addr);
|
|
}
|
|
|
|
diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c
|
|
index 1d274c64de09..03ee9839a03e 100644
|
|
--- a/drivers/media/platform/sh_veu.c
|
|
+++ b/drivers/media/platform/sh_veu.c
|
|
@@ -273,13 +273,13 @@ static void sh_veu_process(struct sh_veu_dev *veu,
|
|
static void sh_veu_device_run(void *priv)
|
|
{
|
|
struct sh_veu_dev *veu = priv;
|
|
- struct vb2_buffer *src_buf, *dst_buf;
|
|
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
|
|
|
src_buf = v4l2_m2m_next_src_buf(veu->m2m_ctx);
|
|
dst_buf = v4l2_m2m_next_dst_buf(veu->m2m_ctx);
|
|
|
|
if (src_buf && dst_buf)
|
|
- sh_veu_process(veu, src_buf, dst_buf);
|
|
+ sh_veu_process(veu, &src_buf->vb2_buf, &dst_buf->vb2_buf);
|
|
}
|
|
|
|
/* ========== video ioctls ========== */
|
|
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
|
|
index c60a7625b1fa..b2873a2432b6 100644
|
|
--- a/drivers/mmc/host/omap.c
|
|
+++ b/drivers/mmc/host/omap.c
|
|
@@ -920,7 +920,7 @@ static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_reques
|
|
reg &= ~(1 << 5);
|
|
OMAP_MMC_WRITE(host, SDIO, reg);
|
|
/* Set maximum timeout */
|
|
- OMAP_MMC_WRITE(host, CTO, 0xff);
|
|
+ OMAP_MMC_WRITE(host, CTO, 0xfd);
|
|
}
|
|
|
|
static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req)
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
|
index c078c791f481..dabe89968a78 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
|
@@ -442,12 +442,20 @@ out_mapping:
|
|
|
|
static int mv88e6xxx_g1_irq_setup(struct mv88e6xxx_chip *chip)
|
|
{
|
|
+ static struct lock_class_key lock_key;
|
|
+ static struct lock_class_key request_key;
|
|
int err;
|
|
|
|
err = mv88e6xxx_g1_irq_setup_common(chip);
|
|
if (err)
|
|
return err;
|
|
|
|
+ /* These lock classes tells lockdep that global 1 irqs are in
|
|
+ * a different category than their parent GPIO, so it won't
|
|
+ * report false recursion.
|
|
+ */
|
|
+ irq_set_lockdep_class(chip->irq, &lock_key, &request_key);
|
|
+
|
|
err = request_threaded_irq(chip->irq, NULL,
|
|
mv88e6xxx_g1_irq_thread_fn,
|
|
IRQF_ONESHOT,
|
|
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
index 9a7f70db20c7..733d9172425b 100644
|
|
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
@@ -119,7 +119,7 @@ static void enic_init_affinity_hint(struct enic *enic)
|
|
|
|
for (i = 0; i < enic->intr_count; i++) {
|
|
if (enic_is_err_intr(enic, i) || enic_is_notify_intr(enic, i) ||
|
|
- (enic->msix[i].affinity_mask &&
|
|
+ (cpumask_available(enic->msix[i].affinity_mask) &&
|
|
!cpumask_empty(enic->msix[i].affinity_mask)))
|
|
continue;
|
|
if (zalloc_cpumask_var(&enic->msix[i].affinity_mask,
|
|
@@ -148,7 +148,7 @@ static void enic_set_affinity_hint(struct enic *enic)
|
|
for (i = 0; i < enic->intr_count; i++) {
|
|
if (enic_is_err_intr(enic, i) ||
|
|
enic_is_notify_intr(enic, i) ||
|
|
- !enic->msix[i].affinity_mask ||
|
|
+ !cpumask_available(enic->msix[i].affinity_mask) ||
|
|
cpumask_empty(enic->msix[i].affinity_mask))
|
|
continue;
|
|
err = irq_set_affinity_hint(enic->msix_entry[i].vector,
|
|
@@ -161,7 +161,7 @@ static void enic_set_affinity_hint(struct enic *enic)
|
|
for (i = 0; i < enic->wq_count; i++) {
|
|
int wq_intr = enic_msix_wq_intr(enic, i);
|
|
|
|
- if (enic->msix[wq_intr].affinity_mask &&
|
|
+ if (cpumask_available(enic->msix[wq_intr].affinity_mask) &&
|
|
!cpumask_empty(enic->msix[wq_intr].affinity_mask))
|
|
netif_set_xps_queue(enic->netdev,
|
|
enic->msix[wq_intr].affinity_mask,
|
|
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
index 3ba0c90e7055..8b11682ebba2 100644
|
|
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
@@ -2106,7 +2106,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
|
|
if (strlen(netdev->name) < (IFNAMSIZ - 5))
|
|
snprintf(adapter->rx_ring->name,
|
|
sizeof(adapter->rx_ring->name) - 1,
|
|
- "%s-rx-0", netdev->name);
|
|
+ "%.14s-rx-0", netdev->name);
|
|
else
|
|
memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
|
|
err = request_irq(adapter->msix_entries[vector].vector,
|
|
@@ -2122,7 +2122,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
|
|
if (strlen(netdev->name) < (IFNAMSIZ - 5))
|
|
snprintf(adapter->tx_ring->name,
|
|
sizeof(adapter->tx_ring->name) - 1,
|
|
- "%s-tx-0", netdev->name);
|
|
+ "%.14s-tx-0", netdev->name);
|
|
else
|
|
memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
|
|
err = request_irq(adapter->msix_entries[vector].vector,
|
|
@@ -5286,8 +5286,13 @@ static void e1000_watchdog_task(struct work_struct *work)
|
|
/* 8000ES2LAN requires a Rx packet buffer work-around
|
|
* on link down event; reset the controller to flush
|
|
* the Rx packet buffer.
|
|
+ *
|
|
+ * If the link is lost the controller stops DMA, but
|
|
+ * if there is queued Tx work it cannot be done. So
|
|
+ * reset the controller to flush the Tx packet buffers.
|
|
*/
|
|
- if (adapter->flags & FLAG_RX_NEEDS_RESTART)
|
|
+ if ((adapter->flags & FLAG_RX_NEEDS_RESTART) ||
|
|
+ e1000_desc_unused(tx_ring) + 1 < tx_ring->count)
|
|
adapter->flags |= FLAG_RESTART_NOW;
|
|
else
|
|
pm_schedule_suspend(netdev->dev.parent,
|
|
@@ -5310,14 +5315,6 @@ link_up:
|
|
adapter->gotc_old = adapter->stats.gotc;
|
|
spin_unlock(&adapter->stats64_lock);
|
|
|
|
- /* If the link is lost the controller stops DMA, but
|
|
- * if there is queued Tx work it cannot be done. So
|
|
- * reset the controller to flush the Tx packet buffers.
|
|
- */
|
|
- if (!netif_carrier_ok(netdev) &&
|
|
- (e1000_desc_unused(tx_ring) + 1 < tx_ring->count))
|
|
- adapter->flags |= FLAG_RESTART_NOW;
|
|
-
|
|
/* If reset is necessary, do it outside of interrupt context. */
|
|
if (adapter->flags & FLAG_RESTART_NOW) {
|
|
schedule_work(&adapter->reset_task);
|
|
@@ -7330,6 +7327,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
e1000_print_device_info(adapter);
|
|
|
|
+ dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP);
|
|
+
|
|
if (pci_dev_run_wake(pdev))
|
|
pm_runtime_put_noidle(&pdev->dev);
|
|
|
|
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
index f8e4808a8317..9988c89ed9fd 100644
|
|
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
@@ -1372,13 +1372,9 @@ static void mvpp2_port_reset(struct mvpp2_port *port)
|
|
for (i = 0; i < ARRAY_SIZE(mvpp2_ethtool_regs); i++)
|
|
mvpp2_read_count(port, &mvpp2_ethtool_regs[i]);
|
|
|
|
- val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) &
|
|
- ~MVPP2_GMAC_PORT_RESET_MASK;
|
|
+ val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) |
|
|
+ MVPP2_GMAC_PORT_RESET_MASK;
|
|
writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
|
|
-
|
|
- while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) &
|
|
- MVPP2_GMAC_PORT_RESET_MASK)
|
|
- continue;
|
|
}
|
|
|
|
/* Change maximum receive size of the port */
|
|
@@ -4445,12 +4441,15 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
|
|
const struct phylink_link_state *state)
|
|
{
|
|
u32 an, ctrl0, ctrl2, ctrl4;
|
|
+ u32 old_ctrl2;
|
|
|
|
an = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
|
|
ctrl0 = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
|
|
ctrl2 = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
|
|
ctrl4 = readl(port->base + MVPP22_GMAC_CTRL_4_REG);
|
|
|
|
+ old_ctrl2 = ctrl2;
|
|
+
|
|
/* Force link down */
|
|
an &= ~MVPP2_GMAC_FORCE_LINK_PASS;
|
|
an |= MVPP2_GMAC_FORCE_LINK_DOWN;
|
|
@@ -4523,6 +4522,12 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
|
|
writel(ctrl2, port->base + MVPP2_GMAC_CTRL_2_REG);
|
|
writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG);
|
|
writel(an, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
|
|
+
|
|
+ if (old_ctrl2 & MVPP2_GMAC_PORT_RESET_MASK) {
|
|
+ while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) &
|
|
+ MVPP2_GMAC_PORT_RESET_MASK)
|
|
+ continue;
|
|
+ }
|
|
}
|
|
|
|
static void mvpp2_mac_config(struct net_device *dev, unsigned int mode,
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
index d6706475a3ba..26c9f9421901 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
|
@@ -1797,7 +1797,7 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
|
u64 node_guid;
|
|
int err = 0;
|
|
|
|
- if (!MLX5_CAP_GEN(esw->dev, vport_group_manager))
|
|
+ if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager))
|
|
return -EPERM;
|
|
if (!LEGAL_VPORT(esw, vport) || is_multicast_ether_addr(mac))
|
|
return -EINVAL;
|
|
@@ -1871,7 +1871,7 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
|
{
|
|
struct mlx5_vport *evport;
|
|
|
|
- if (!MLX5_CAP_GEN(esw->dev, vport_group_manager))
|
|
+ if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager))
|
|
return -EPERM;
|
|
if (!LEGAL_VPORT(esw, vport))
|
|
return -EINVAL;
|
|
@@ -2044,19 +2044,24 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
|
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport,
|
|
u32 max_rate, u32 min_rate)
|
|
{
|
|
- u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
|
|
- bool min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) &&
|
|
- fw_max_bw_share >= MLX5_MIN_BW_SHARE;
|
|
- bool max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit);
|
|
struct mlx5_vport *evport;
|
|
+ u32 fw_max_bw_share;
|
|
u32 previous_min_rate;
|
|
u32 divider;
|
|
+ bool min_rate_supported;
|
|
+ bool max_rate_supported;
|
|
int err = 0;
|
|
|
|
if (!ESW_ALLOWED(esw))
|
|
return -EPERM;
|
|
if (!LEGAL_VPORT(esw, vport))
|
|
return -EINVAL;
|
|
+
|
|
+ fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
|
|
+ min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) &&
|
|
+ fw_max_bw_share >= MLX5_MIN_BW_SHARE;
|
|
+ max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit);
|
|
+
|
|
if ((min_rate && !min_rate_supported) || (max_rate && !max_rate_supported))
|
|
return -EOPNOTSUPP;
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
index a12b5710891e..f9bef030ee05 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
@@ -1988,7 +1988,7 @@ static void mlxsw_sp_port_get_prio_strings(u8 **p, int prio)
|
|
int i;
|
|
|
|
for (i = 0; i < MLXSW_SP_PORT_HW_PRIO_STATS_LEN; i++) {
|
|
- snprintf(*p, ETH_GSTRING_LEN, "%s_%d",
|
|
+ snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d",
|
|
mlxsw_sp_port_hw_prio_stats[i].str, prio);
|
|
*p += ETH_GSTRING_LEN;
|
|
}
|
|
@@ -1999,7 +1999,7 @@ static void mlxsw_sp_port_get_tc_strings(u8 **p, int tc)
|
|
int i;
|
|
|
|
for (i = 0; i < MLXSW_SP_PORT_HW_TC_STATS_LEN; i++) {
|
|
- snprintf(*p, ETH_GSTRING_LEN, "%s_%d",
|
|
+ snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d",
|
|
mlxsw_sp_port_hw_tc_stats[i].str, tc);
|
|
*p += ETH_GSTRING_LEN;
|
|
}
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
index 43ab9e905bed..886176be818e 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
@@ -474,7 +474,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
|
|
struct dma_desc *p, struct sk_buff *skb)
|
|
{
|
|
struct skb_shared_hwtstamps shhwtstamp;
|
|
- u64 ns;
|
|
+ u64 ns = 0;
|
|
|
|
if (!priv->hwts_tx_en)
|
|
return;
|
|
@@ -513,7 +513,7 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
|
|
{
|
|
struct skb_shared_hwtstamps *shhwtstamp = NULL;
|
|
struct dma_desc *desc = p;
|
|
- u64 ns;
|
|
+ u64 ns = 0;
|
|
|
|
if (!priv->hwts_rx_en)
|
|
return;
|
|
@@ -558,8 +558,8 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
|
|
u32 snap_type_sel = 0;
|
|
u32 ts_master_en = 0;
|
|
u32 ts_event_en = 0;
|
|
+ u32 sec_inc = 0;
|
|
u32 value = 0;
|
|
- u32 sec_inc;
|
|
bool xmac;
|
|
|
|
xmac = priv->plat->has_gmac4 || priv->plat->has_xgmac;
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
|
|
index 2293e21f789f..cc60b3fb0892 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
|
|
@@ -105,7 +105,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts)
|
|
struct stmmac_priv *priv =
|
|
container_of(ptp, struct stmmac_priv, ptp_clock_ops);
|
|
unsigned long flags;
|
|
- u64 ns;
|
|
+ u64 ns = 0;
|
|
|
|
spin_lock_irqsave(&priv->ptp_lock, flags);
|
|
stmmac_get_systime(priv, priv->ptpaddr, &ns);
|
|
diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c
|
|
index e1225545362d..0ba3607585bd 100644
|
|
--- a/drivers/net/phy/phy-c45.c
|
|
+++ b/drivers/net/phy/phy-c45.c
|
|
@@ -147,9 +147,15 @@ int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask)
|
|
mmd_mask &= ~BIT(devad);
|
|
|
|
/* The link state is latched low so that momentary link
|
|
- * drops can be detected. Do not double-read the status
|
|
- * register if the link is down.
|
|
+ * drops can be detected. Do not double-read the status
|
|
+ * in polling mode to detect such short link drops.
|
|
*/
|
|
+ if (!phy_polling_mode(phydev)) {
|
|
+ val = phy_read_mmd(phydev, devad, MDIO_STAT1);
|
|
+ if (val < 0)
|
|
+ return val;
|
|
+ }
|
|
+
|
|
val = phy_read_mmd(phydev, devad, MDIO_STAT1);
|
|
if (val < 0)
|
|
return val;
|
|
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
|
|
index 2c32c795f5dd..8a96d985a52f 100644
|
|
--- a/drivers/net/phy/phy_device.c
|
|
+++ b/drivers/net/phy/phy_device.c
|
|
@@ -1503,10 +1503,15 @@ int genphy_update_link(struct phy_device *phydev)
|
|
{
|
|
int status;
|
|
|
|
- /* Do a fake read */
|
|
- status = phy_read(phydev, MII_BMSR);
|
|
- if (status < 0)
|
|
- return status;
|
|
+ /* The link state is latched low so that momentary link
|
|
+ * drops can be detected. Do not double-read the status
|
|
+ * in polling mode to detect such short link drops.
|
|
+ */
|
|
+ if (!phy_polling_mode(phydev)) {
|
|
+ status = phy_read(phydev, MII_BMSR);
|
|
+ if (status < 0)
|
|
+ return status;
|
|
+ }
|
|
|
|
/* Read link and autonegotiation status */
|
|
status = phy_read(phydev, MII_BMSR);
|
|
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c
|
|
index 18c709c484e7..f761d651c16e 100644
|
|
--- a/drivers/net/wireless/ath/ath10k/ce.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/ce.c
|
|
@@ -500,14 +500,8 @@ static int _ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
|
|
write_index = CE_RING_IDX_INCR(nentries_mask, write_index);
|
|
|
|
/* WORKAROUND */
|
|
- if (!(flags & CE_SEND_FLAG_GATHER)) {
|
|
- if (ar->hw_params.shadow_reg_support)
|
|
- ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state,
|
|
- write_index);
|
|
- else
|
|
- ath10k_ce_src_ring_write_index_set(ar, ctrl_addr,
|
|
- write_index);
|
|
- }
|
|
+ if (!(flags & CE_SEND_FLAG_GATHER))
|
|
+ ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index);
|
|
|
|
src_ring->write_index = write_index;
|
|
exit:
|
|
@@ -581,8 +575,14 @@ static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state,
|
|
/* Update Source Ring Write Index */
|
|
write_index = CE_RING_IDX_INCR(nentries_mask, write_index);
|
|
|
|
- if (!(flags & CE_SEND_FLAG_GATHER))
|
|
- ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index);
|
|
+ if (!(flags & CE_SEND_FLAG_GATHER)) {
|
|
+ if (ar->hw_params.shadow_reg_support)
|
|
+ ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state,
|
|
+ write_index);
|
|
+ else
|
|
+ ath10k_ce_src_ring_write_index_set(ar, ctrl_addr,
|
|
+ write_index);
|
|
+ }
|
|
|
|
src_ring->write_index = write_index;
|
|
exit:
|
|
@@ -1394,12 +1394,12 @@ static int ath10k_ce_alloc_shadow_base(struct ath10k *ar,
|
|
u32 nentries)
|
|
{
|
|
src_ring->shadow_base_unaligned = kcalloc(nentries,
|
|
- sizeof(struct ce_desc),
|
|
+ sizeof(struct ce_desc_64),
|
|
GFP_KERNEL);
|
|
if (!src_ring->shadow_base_unaligned)
|
|
return -ENOMEM;
|
|
|
|
- src_ring->shadow_base = (struct ce_desc *)
|
|
+ src_ring->shadow_base = (struct ce_desc_64 *)
|
|
PTR_ALIGN(src_ring->shadow_base_unaligned,
|
|
CE_DESC_RING_ALIGN);
|
|
return 0;
|
|
@@ -1453,7 +1453,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id,
|
|
ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries);
|
|
if (ret) {
|
|
dma_free_coherent(ar->dev,
|
|
- (nentries * sizeof(struct ce_desc) +
|
|
+ (nentries * sizeof(struct ce_desc_64) +
|
|
CE_DESC_RING_ALIGN),
|
|
src_ring->base_addr_owner_space_unaligned,
|
|
base_addr);
|
|
diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h
|
|
index b8fb5382dede..8088f7a66426 100644
|
|
--- a/drivers/net/wireless/ath/ath10k/ce.h
|
|
+++ b/drivers/net/wireless/ath/ath10k/ce.h
|
|
@@ -118,7 +118,7 @@ struct ath10k_ce_ring {
|
|
u32 base_addr_ce_space;
|
|
|
|
char *shadow_base_unaligned;
|
|
- struct ce_desc *shadow_base;
|
|
+ struct ce_desc_64 *shadow_base;
|
|
|
|
/* keep last */
|
|
void *per_transfer_context[0];
|
|
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
|
|
index f79c337105cb..2daf33342b23 100644
|
|
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
|
|
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
|
|
@@ -1420,6 +1420,12 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len,
|
|
u8 *buf, *dpos;
|
|
const u8 *spos;
|
|
|
|
+ if (!ies1)
|
|
+ ies1_len = 0;
|
|
+
|
|
+ if (!ies2)
|
|
+ ies2_len = 0;
|
|
+
|
|
if (ies1_len == 0 && ies2_len == 0) {
|
|
*merged_ies = NULL;
|
|
*merged_len = 0;
|
|
@@ -1429,17 +1435,19 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len,
|
|
buf = kmalloc(ies1_len + ies2_len, GFP_KERNEL);
|
|
if (!buf)
|
|
return -ENOMEM;
|
|
- memcpy(buf, ies1, ies1_len);
|
|
+ if (ies1)
|
|
+ memcpy(buf, ies1, ies1_len);
|
|
dpos = buf + ies1_len;
|
|
spos = ies2;
|
|
- while (spos + 1 < ies2 + ies2_len) {
|
|
+ while (spos && (spos + 1 < ies2 + ies2_len)) {
|
|
/* IE tag at offset 0, length at offset 1 */
|
|
u16 ielen = 2 + spos[1];
|
|
|
|
if (spos + ielen > ies2 + ies2_len)
|
|
break;
|
|
if (spos[0] == WLAN_EID_VENDOR_SPECIFIC &&
|
|
- !_wil_cfg80211_find_ie(ies1, ies1_len, spos, ielen)) {
|
|
+ (!ies1 || !_wil_cfg80211_find_ie(ies1, ies1_len,
|
|
+ spos, ielen))) {
|
|
memcpy(dpos, spos, ielen);
|
|
dpos += ielen;
|
|
}
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
index cd3651069d0c..27893af63ebc 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
@@ -149,7 +149,7 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
|
|
return err;
|
|
}
|
|
|
|
- err = request_firmware(&clm, clm_name, bus->dev);
|
|
+ err = firmware_request_nowarn(&clm, clm_name, bus->dev);
|
|
if (err) {
|
|
brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n",
|
|
err);
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
index 16c6c7f921a8..8b7d70e3a379 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
@@ -132,13 +132,17 @@ static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm)
|
|
|
|
static int iwl_configure_rxq(struct iwl_mvm *mvm)
|
|
{
|
|
- int i, num_queues, size;
|
|
+ int i, num_queues, size, ret;
|
|
struct iwl_rfh_queue_config *cmd;
|
|
+ struct iwl_host_cmd hcmd = {
|
|
+ .id = WIDE_ID(DATA_PATH_GROUP, RFH_QUEUE_CONFIG_CMD),
|
|
+ .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
|
+ };
|
|
|
|
/* Do not configure default queue, it is configured via context info */
|
|
num_queues = mvm->trans->num_rx_queues - 1;
|
|
|
|
- size = sizeof(*cmd) + num_queues * sizeof(struct iwl_rfh_queue_data);
|
|
+ size = struct_size(cmd, data, num_queues);
|
|
|
|
cmd = kzalloc(size, GFP_KERNEL);
|
|
if (!cmd)
|
|
@@ -159,10 +163,14 @@ static int iwl_configure_rxq(struct iwl_mvm *mvm)
|
|
cmd->data[i].fr_bd_wid = cpu_to_le32(data.fr_bd_wid);
|
|
}
|
|
|
|
- return iwl_mvm_send_cmd_pdu(mvm,
|
|
- WIDE_ID(DATA_PATH_GROUP,
|
|
- RFH_QUEUE_CONFIG_CMD),
|
|
- 0, size, cmd);
|
|
+ hcmd.data[0] = cmd;
|
|
+ hcmd.len[0] = size;
|
|
+
|
|
+ ret = iwl_mvm_send_cmd(mvm, &hcmd);
|
|
+
|
|
+ kfree(cmd);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int iwl_mvm_send_dqa_cmd(struct iwl_mvm *mvm)
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
|
|
index d4a31e014c82..b2905f01b7df 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
|
|
@@ -502,7 +502,7 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans)
|
|
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
|
struct iwl_rb_allocator *rba = &trans_pcie->rba;
|
|
struct list_head local_empty;
|
|
- int pending = atomic_xchg(&rba->req_pending, 0);
|
|
+ int pending = atomic_read(&rba->req_pending);
|
|
|
|
IWL_DEBUG_RX(trans, "Pending allocation requests = %d\n", pending);
|
|
|
|
@@ -557,11 +557,13 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans)
|
|
i++;
|
|
}
|
|
|
|
+ atomic_dec(&rba->req_pending);
|
|
pending--;
|
|
+
|
|
if (!pending) {
|
|
- pending = atomic_xchg(&rba->req_pending, 0);
|
|
+ pending = atomic_read(&rba->req_pending);
|
|
IWL_DEBUG_RX(trans,
|
|
- "Pending allocation requests = %d\n",
|
|
+ "Got more pending allocation requests = %d\n",
|
|
pending);
|
|
}
|
|
|
|
@@ -573,12 +575,15 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans)
|
|
spin_unlock(&rba->lock);
|
|
|
|
atomic_inc(&rba->req_ready);
|
|
+
|
|
}
|
|
|
|
spin_lock(&rba->lock);
|
|
/* return unused rbds to the allocator empty list */
|
|
list_splice_tail(&local_empty, &rba->rbd_empty);
|
|
spin_unlock(&rba->lock);
|
|
+
|
|
+ IWL_DEBUG_RX(trans, "%s, exit.\n", __func__);
|
|
}
|
|
|
|
/*
|
|
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
index adc88433faa8..2d87ebbfa4da 100644
|
|
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
@@ -4282,11 +4282,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
|
|
wiphy->mgmt_stypes = mwifiex_mgmt_stypes;
|
|
wiphy->max_remain_on_channel_duration = 5000;
|
|
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
- BIT(NL80211_IFTYPE_ADHOC) |
|
|
BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
|
BIT(NL80211_IFTYPE_P2P_GO) |
|
|
BIT(NL80211_IFTYPE_AP);
|
|
|
|
+ if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info))
|
|
+ wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
|
|
+
|
|
wiphy->bands[NL80211_BAND_2GHZ] = &mwifiex_band_2ghz;
|
|
if (adapter->config_bands & BAND_A)
|
|
wiphy->bands[NL80211_BAND_5GHZ] = &mwifiex_band_5ghz;
|
|
@@ -4346,11 +4348,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
|
|
wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1;
|
|
wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1;
|
|
|
|
- wiphy->features |= NL80211_FEATURE_HT_IBSS |
|
|
- NL80211_FEATURE_INACTIVITY_TIMER |
|
|
+ wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER |
|
|
NL80211_FEATURE_LOW_PRIORITY_SCAN |
|
|
NL80211_FEATURE_NEED_OBSS_SCAN;
|
|
|
|
+ if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info))
|
|
+ wiphy->features |= NL80211_FEATURE_HT_IBSS;
|
|
+
|
|
if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info))
|
|
wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR |
|
|
NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c
|
|
index 530e5593765c..a1529920d877 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
|
|
@@ -54,22 +54,30 @@ mt76_get_of_eeprom(struct mt76_dev *dev, int len)
|
|
part = np->name;
|
|
|
|
mtd = get_mtd_device_nm(part);
|
|
- if (IS_ERR(mtd))
|
|
- return PTR_ERR(mtd);
|
|
+ if (IS_ERR(mtd)) {
|
|
+ ret = PTR_ERR(mtd);
|
|
+ goto out_put_node;
|
|
+ }
|
|
|
|
- if (size <= sizeof(*list))
|
|
- return -EINVAL;
|
|
+ if (size <= sizeof(*list)) {
|
|
+ ret = -EINVAL;
|
|
+ goto out_put_node;
|
|
+ }
|
|
|
|
offset = be32_to_cpup(list);
|
|
ret = mtd_read(mtd, offset, len, &retlen, dev->eeprom.data);
|
|
put_mtd_device(mtd);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto out_put_node;
|
|
|
|
- if (retlen < len)
|
|
- return -EINVAL;
|
|
+ if (retlen < len) {
|
|
+ ret = -EINVAL;
|
|
+ goto out_put_node;
|
|
+ }
|
|
|
|
- return 0;
|
|
+out_put_node:
|
|
+ of_node_put(np);
|
|
+ return ret;
|
|
#else
|
|
return -ENOENT;
|
|
#endif
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
|
|
index 79e59f2379a2..8d40e92fb6f2 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/usb.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
|
|
@@ -796,16 +796,9 @@ int mt76u_alloc_queues(struct mt76_dev *dev)
|
|
|
|
err = mt76u_alloc_rx(dev);
|
|
if (err < 0)
|
|
- goto err;
|
|
-
|
|
- err = mt76u_alloc_tx(dev);
|
|
- if (err < 0)
|
|
- goto err;
|
|
+ return err;
|
|
|
|
- return 0;
|
|
-err:
|
|
- mt76u_queues_deinit(dev);
|
|
- return err;
|
|
+ return mt76u_alloc_tx(dev);
|
|
}
|
|
EXPORT_SYMBOL_GPL(mt76u_alloc_queues);
|
|
|
|
diff --git a/drivers/net/wireless/mediatek/mt7601u/eeprom.h b/drivers/net/wireless/mediatek/mt7601u/eeprom.h
|
|
index 662d12703b69..57b503ae63f1 100644
|
|
--- a/drivers/net/wireless/mediatek/mt7601u/eeprom.h
|
|
+++ b/drivers/net/wireless/mediatek/mt7601u/eeprom.h
|
|
@@ -17,7 +17,7 @@
|
|
|
|
struct mt7601u_dev;
|
|
|
|
-#define MT7601U_EE_MAX_VER 0x0c
|
|
+#define MT7601U_EE_MAX_VER 0x0d
|
|
#define MT7601U_EEPROM_SIZE 256
|
|
|
|
#define MT7601U_DEFAULT_TX_POWER 6
|
|
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
|
|
index 19e3c5a0b715..2ca5658bbc2a 100644
|
|
--- a/drivers/net/wireless/ti/wlcore/main.c
|
|
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
|
@@ -1084,8 +1084,11 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
|
|
goto out;
|
|
|
|
ret = wl12xx_fetch_firmware(wl, plt);
|
|
- if (ret < 0)
|
|
- goto out;
|
|
+ if (ret < 0) {
|
|
+ kfree(wl->fw_status);
|
|
+ kfree(wl->raw_fw_status);
|
|
+ kfree(wl->tx_res_if);
|
|
+ }
|
|
|
|
out:
|
|
return ret;
|
|
diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c
|
|
index 3ed67676ea2a..e85c5a8206c4 100644
|
|
--- a/drivers/pci/pcie/pme.c
|
|
+++ b/drivers/pci/pcie/pme.c
|
|
@@ -363,6 +363,16 @@ static bool pcie_pme_check_wakeup(struct pci_bus *bus)
|
|
return false;
|
|
}
|
|
|
|
+static void pcie_pme_disable_interrupt(struct pci_dev *port,
|
|
+ struct pcie_pme_service_data *data)
|
|
+{
|
|
+ spin_lock_irq(&data->lock);
|
|
+ pcie_pme_interrupt_enable(port, false);
|
|
+ pcie_clear_root_pme_status(port);
|
|
+ data->noirq = true;
|
|
+ spin_unlock_irq(&data->lock);
|
|
+}
|
|
+
|
|
/**
|
|
* pcie_pme_suspend - Suspend PCIe PME service device.
|
|
* @srv: PCIe service device to suspend.
|
|
@@ -387,11 +397,7 @@ static int pcie_pme_suspend(struct pcie_device *srv)
|
|
return 0;
|
|
}
|
|
|
|
- spin_lock_irq(&data->lock);
|
|
- pcie_pme_interrupt_enable(port, false);
|
|
- pcie_clear_root_pme_status(port);
|
|
- data->noirq = true;
|
|
- spin_unlock_irq(&data->lock);
|
|
+ pcie_pme_disable_interrupt(port, data);
|
|
|
|
synchronize_irq(srv->irq);
|
|
|
|
@@ -427,9 +433,11 @@ static int pcie_pme_resume(struct pcie_device *srv)
|
|
*/
|
|
static void pcie_pme_remove(struct pcie_device *srv)
|
|
{
|
|
- pcie_pme_suspend(srv);
|
|
+ struct pcie_pme_service_data *data = get_service_data(srv);
|
|
+
|
|
+ pcie_pme_disable_interrupt(srv->port, data);
|
|
free_irq(srv->irq, srv);
|
|
- kfree(get_service_data(srv));
|
|
+ kfree(data);
|
|
}
|
|
|
|
static struct pcie_port_service_driver pcie_pme_driver = {
|
|
diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c
|
|
index e1a77b2de78a..3623f6489f49 100644
|
|
--- a/drivers/perf/arm_spe_pmu.c
|
|
+++ b/drivers/perf/arm_spe_pmu.c
|
|
@@ -824,10 +824,10 @@ static void arm_spe_pmu_read(struct perf_event *event)
|
|
{
|
|
}
|
|
|
|
-static void *arm_spe_pmu_setup_aux(int cpu, void **pages, int nr_pages,
|
|
- bool snapshot)
|
|
+static void *arm_spe_pmu_setup_aux(struct perf_event *event, void **pages,
|
|
+ int nr_pages, bool snapshot)
|
|
{
|
|
- int i;
|
|
+ int i, cpu = event->cpu;
|
|
struct page **pglist;
|
|
struct arm_spe_pmu_buf *buf;
|
|
|
|
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
|
|
index ead4beb5f55f..036124fd363c 100644
|
|
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
|
|
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
|
|
@@ -346,6 +346,8 @@ static const unsigned int eth_rx_dv_pins[] = { DIF_1_P };
|
|
static const unsigned int eth_rx_clk_pins[] = { DIF_1_N };
|
|
static const unsigned int eth_txd0_1_pins[] = { DIF_2_P };
|
|
static const unsigned int eth_txd1_1_pins[] = { DIF_2_N };
|
|
+static const unsigned int eth_rxd3_pins[] = { DIF_2_P };
|
|
+static const unsigned int eth_rxd2_pins[] = { DIF_2_N };
|
|
static const unsigned int eth_tx_en_pins[] = { DIF_3_P };
|
|
static const unsigned int eth_ref_clk_pins[] = { DIF_3_N };
|
|
static const unsigned int eth_mdc_pins[] = { DIF_4_P };
|
|
@@ -571,6 +573,8 @@ static struct meson_pmx_group meson8b_cbus_groups[] = {
|
|
GROUP(eth_ref_clk, 6, 8),
|
|
GROUP(eth_mdc, 6, 9),
|
|
GROUP(eth_mdio_en, 6, 10),
|
|
+ GROUP(eth_rxd3, 7, 22),
|
|
+ GROUP(eth_rxd2, 7, 23),
|
|
};
|
|
|
|
static struct meson_pmx_group meson8b_aobus_groups[] = {
|
|
@@ -720,7 +724,7 @@ static const char * const ethernet_groups[] = {
|
|
"eth_tx_clk", "eth_tx_en", "eth_txd1_0", "eth_txd1_1",
|
|
"eth_txd0_0", "eth_txd0_1", "eth_rx_clk", "eth_rx_dv",
|
|
"eth_rxd1", "eth_rxd0", "eth_mdio_en", "eth_mdc", "eth_ref_clk",
|
|
- "eth_txd2", "eth_txd3"
|
|
+ "eth_txd2", "eth_txd3", "eth_rxd3", "eth_rxd2"
|
|
};
|
|
|
|
static const char * const i2c_a_groups[] = {
|
|
diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c
|
|
index b6d44550d98c..eca16d00e310 100644
|
|
--- a/drivers/platform/mellanox/mlxreg-hotplug.c
|
|
+++ b/drivers/platform/mellanox/mlxreg-hotplug.c
|
|
@@ -248,7 +248,8 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv,
|
|
struct mlxreg_core_item *item)
|
|
{
|
|
struct mlxreg_core_data *data;
|
|
- u32 asserted, regval, bit;
|
|
+ unsigned long asserted;
|
|
+ u32 regval, bit;
|
|
int ret;
|
|
|
|
/*
|
|
@@ -281,7 +282,7 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv,
|
|
asserted = item->cache ^ regval;
|
|
item->cache = regval;
|
|
|
|
- for_each_set_bit(bit, (unsigned long *)&asserted, 8) {
|
|
+ for_each_set_bit(bit, &asserted, 8) {
|
|
data = item->data + bit;
|
|
if (regval & BIT(bit)) {
|
|
if (item->inversed)
|
|
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
|
|
index d4f1259ff5a2..62d4b94e2531 100644
|
|
--- a/drivers/platform/x86/ideapad-laptop.c
|
|
+++ b/drivers/platform/x86/ideapad-laptop.c
|
|
@@ -989,7 +989,7 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
|
|
.ident = "Lenovo RESCUER R720-15IKBN",
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
- DMI_MATCH(DMI_BOARD_NAME, "80WW"),
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo R720-15IKBN"),
|
|
},
|
|
},
|
|
{
|
|
diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c
|
|
index 6cf9b7fa5bf0..3201a83073b5 100644
|
|
--- a/drivers/platform/x86/intel-hid.c
|
|
+++ b/drivers/platform/x86/intel-hid.c
|
|
@@ -373,7 +373,7 @@ wakeup:
|
|
* the 5-button array, but still send notifies with power button
|
|
* event code to this device object on power button actions.
|
|
*
|
|
- * Report the power button press; catch and ignore the button release.
|
|
+ * Report the power button press and release.
|
|
*/
|
|
if (!priv->array) {
|
|
if (event == 0xce) {
|
|
@@ -382,8 +382,11 @@ wakeup:
|
|
return;
|
|
}
|
|
|
|
- if (event == 0xcf)
|
|
+ if (event == 0xcf) {
|
|
+ input_report_key(priv->input_dev, KEY_POWER, 0);
|
|
+ input_sync(priv->input_dev);
|
|
return;
|
|
+ }
|
|
}
|
|
|
|
/* 0xC0 is for HID events, other values are for 5 button array */
|
|
diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c
|
|
index 2d272a3e0176..e0dcdb3cc070 100644
|
|
--- a/drivers/platform/x86/intel_pmc_core.c
|
|
+++ b/drivers/platform/x86/intel_pmc_core.c
|
|
@@ -333,7 +333,8 @@ static int pmc_core_ppfear_sts_show(struct seq_file *s, void *unused)
|
|
index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++)
|
|
pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter);
|
|
|
|
- for (index = 0; map[index].name; index++)
|
|
+ for (index = 0; map[index].name &&
|
|
+ index < pmcdev->map->ppfear_buckets * 8; index++)
|
|
pmc_core_display_map(s, index, pf_regs[index / 8], map);
|
|
|
|
return 0;
|
|
diff --git a/drivers/platform/x86/intel_pmc_core.h b/drivers/platform/x86/intel_pmc_core.h
|
|
index 93a7e99e1f8b..3f9711b03cb4 100644
|
|
--- a/drivers/platform/x86/intel_pmc_core.h
|
|
+++ b/drivers/platform/x86/intel_pmc_core.h
|
|
@@ -39,7 +39,7 @@
|
|
#define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64
|
|
#define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1)
|
|
#define MTPMC_MASK 0xffff0000
|
|
-#define PPFEAR_MAX_NUM_ENTRIES 5
|
|
+#define PPFEAR_MAX_NUM_ENTRIES 12
|
|
#define SPT_PPFEAR_NUM_ENTRIES 5
|
|
#define SPT_PMC_READ_DISABLE_BIT 0x16
|
|
#define SPT_PMC_MSG_FULL_STS_BIT 0x18
|
|
diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c
|
|
index 21e20483bd91..e0239cf3f56d 100644
|
|
--- a/drivers/regulator/act8865-regulator.c
|
|
+++ b/drivers/regulator/act8865-regulator.c
|
|
@@ -131,7 +131,7 @@
|
|
* ACT8865 voltage number
|
|
*/
|
|
#define ACT8865_VOLTAGE_NUM 64
|
|
-#define ACT8600_SUDCDC_VOLTAGE_NUM 255
|
|
+#define ACT8600_SUDCDC_VOLTAGE_NUM 256
|
|
|
|
struct act8865 {
|
|
struct regmap *regmap;
|
|
@@ -222,7 +222,8 @@ static const struct regulator_linear_range act8600_sudcdc_voltage_ranges[] = {
|
|
REGULATOR_LINEAR_RANGE(3000000, 0, 63, 0),
|
|
REGULATOR_LINEAR_RANGE(3000000, 64, 159, 100000),
|
|
REGULATOR_LINEAR_RANGE(12600000, 160, 191, 200000),
|
|
- REGULATOR_LINEAR_RANGE(19000000, 191, 255, 400000),
|
|
+ REGULATOR_LINEAR_RANGE(19000000, 192, 247, 400000),
|
|
+ REGULATOR_LINEAR_RANGE(41400000, 248, 255, 0),
|
|
};
|
|
|
|
static struct regulator_ops act8865_ops = {
|
|
diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c
|
|
index 8684bcec8ff4..00cc96341411 100644
|
|
--- a/drivers/s390/net/ism_drv.c
|
|
+++ b/drivers/s390/net/ism_drv.c
|
|
@@ -141,10 +141,13 @@ static int register_ieq(struct ism_dev *ism)
|
|
|
|
static int unregister_sba(struct ism_dev *ism)
|
|
{
|
|
+ int ret;
|
|
+
|
|
if (!ism->sba)
|
|
return 0;
|
|
|
|
- if (ism_cmd_simple(ism, ISM_UNREG_SBA))
|
|
+ ret = ism_cmd_simple(ism, ISM_UNREG_SBA);
|
|
+ if (ret && ret != ISM_ERROR)
|
|
return -EIO;
|
|
|
|
dma_free_coherent(&ism->pdev->dev, PAGE_SIZE,
|
|
@@ -158,10 +161,13 @@ static int unregister_sba(struct ism_dev *ism)
|
|
|
|
static int unregister_ieq(struct ism_dev *ism)
|
|
{
|
|
+ int ret;
|
|
+
|
|
if (!ism->ieq)
|
|
return 0;
|
|
|
|
- if (ism_cmd_simple(ism, ISM_UNREG_IEQ))
|
|
+ ret = ism_cmd_simple(ism, ISM_UNREG_IEQ);
|
|
+ if (ret && ret != ISM_ERROR)
|
|
return -EIO;
|
|
|
|
dma_free_coherent(&ism->pdev->dev, PAGE_SIZE,
|
|
@@ -288,7 +294,7 @@ static int ism_unregister_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb)
|
|
cmd.request.dmb_tok = dmb->dmb_tok;
|
|
|
|
ret = ism_cmd(ism, &cmd);
|
|
- if (ret)
|
|
+ if (ret && ret != ISM_ERROR)
|
|
goto out;
|
|
|
|
ism_free_dmb(ism, dmb);
|
|
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
|
|
index 3f97ec4aac4b..780651c4fc0c 100644
|
|
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
|
|
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
|
|
@@ -1445,7 +1445,7 @@ bind_err:
|
|
static struct bnx2fc_interface *
|
|
bnx2fc_interface_create(struct bnx2fc_hba *hba,
|
|
struct net_device *netdev,
|
|
- enum fip_state fip_mode)
|
|
+ enum fip_mode fip_mode)
|
|
{
|
|
struct fcoe_ctlr_device *ctlr_dev;
|
|
struct bnx2fc_interface *interface;
|
|
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
|
|
index f46b312d04bc..6768b2e8148a 100644
|
|
--- a/drivers/scsi/fcoe/fcoe.c
|
|
+++ b/drivers/scsi/fcoe/fcoe.c
|
|
@@ -390,7 +390,7 @@ static int fcoe_interface_setup(struct fcoe_interface *fcoe,
|
|
* Returns: pointer to a struct fcoe_interface or NULL on error
|
|
*/
|
|
static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev,
|
|
- enum fip_state fip_mode)
|
|
+ enum fip_mode fip_mode)
|
|
{
|
|
struct fcoe_ctlr_device *ctlr_dev;
|
|
struct fcoe_ctlr *ctlr;
|
|
diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c
|
|
index 54da3166da8d..7dc4ffa24430 100644
|
|
--- a/drivers/scsi/fcoe/fcoe_ctlr.c
|
|
+++ b/drivers/scsi/fcoe/fcoe_ctlr.c
|
|
@@ -147,7 +147,7 @@ static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip)
|
|
* fcoe_ctlr_init() - Initialize the FCoE Controller instance
|
|
* @fip: The FCoE controller to initialize
|
|
*/
|
|
-void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_state mode)
|
|
+void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_mode mode)
|
|
{
|
|
fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT);
|
|
fip->mode = mode;
|
|
@@ -454,7 +454,10 @@ void fcoe_ctlr_link_up(struct fcoe_ctlr *fip)
|
|
mutex_unlock(&fip->ctlr_mutex);
|
|
fc_linkup(fip->lp);
|
|
} else if (fip->state == FIP_ST_LINK_WAIT) {
|
|
- fcoe_ctlr_set_state(fip, fip->mode);
|
|
+ if (fip->mode == FIP_MODE_NON_FIP)
|
|
+ fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP);
|
|
+ else
|
|
+ fcoe_ctlr_set_state(fip, FIP_ST_AUTO);
|
|
switch (fip->mode) {
|
|
default:
|
|
LIBFCOE_FIP_DBG(fip, "invalid mode %d\n", fip->mode);
|
|
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
|
|
index f4909cd206d3..f15d5e1d56b1 100644
|
|
--- a/drivers/scsi/fcoe/fcoe_transport.c
|
|
+++ b/drivers/scsi/fcoe/fcoe_transport.c
|
|
@@ -873,7 +873,7 @@ static int fcoe_transport_create(const char *buffer,
|
|
int rc = -ENODEV;
|
|
struct net_device *netdev = NULL;
|
|
struct fcoe_transport *ft = NULL;
|
|
- enum fip_state fip_mode = (enum fip_state)(long)kp->arg;
|
|
+ enum fip_mode fip_mode = (enum fip_mode)kp->arg;
|
|
|
|
mutex_lock(&ft_mutex);
|
|
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
index a4e2e6aa9a6b..fd9d82c9033d 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
@@ -10,6 +10,7 @@
|
|
*/
|
|
|
|
#include "hisi_sas.h"
|
|
+#include "../libsas/sas_internal.h"
|
|
#define DRV_NAME "hisi_sas"
|
|
|
|
#define DEV_IS_GONE(dev) \
|
|
@@ -809,7 +810,8 @@ static void hisi_sas_do_release_task(struct hisi_hba *hisi_hba, struct sas_task
|
|
spin_lock_irqsave(&task->task_state_lock, flags);
|
|
task->task_state_flags &=
|
|
~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
|
|
- task->task_state_flags |= SAS_TASK_STATE_DONE;
|
|
+ if (!slot->is_internal && task->task_proto != SAS_PROTOCOL_SMP)
|
|
+ task->task_state_flags |= SAS_TASK_STATE_DONE;
|
|
spin_unlock_irqrestore(&task->task_state_lock, flags);
|
|
}
|
|
|
|
@@ -1879,9 +1881,18 @@ static int hisi_sas_write_gpio(struct sas_ha_struct *sha, u8 reg_type,
|
|
|
|
static void hisi_sas_phy_disconnected(struct hisi_sas_phy *phy)
|
|
{
|
|
+ struct asd_sas_phy *sas_phy = &phy->sas_phy;
|
|
+ struct sas_phy *sphy = sas_phy->phy;
|
|
+ struct sas_phy_data *d = sphy->hostdata;
|
|
+
|
|
phy->phy_attached = 0;
|
|
phy->phy_type = 0;
|
|
phy->port = NULL;
|
|
+
|
|
+ if (d->enable)
|
|
+ sphy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
|
|
+ else
|
|
+ sphy->negotiated_linkrate = SAS_PHY_DISABLED;
|
|
}
|
|
|
|
void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy)
|
|
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
|
|
index f6de7526ded5..acb503ea8f0c 100644
|
|
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
|
|
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
|
|
@@ -4155,6 +4155,7 @@ int megasas_alloc_cmds(struct megasas_instance *instance)
|
|
if (megasas_create_frame_pool(instance)) {
|
|
dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error creating frame DMA pool\n");
|
|
megasas_free_cmds(instance);
|
|
+ return -ENOMEM;
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c
|
|
index 0a5dd5595dd3..cd61905ca2f5 100644
|
|
--- a/drivers/scsi/qedf/qedf_main.c
|
|
+++ b/drivers/scsi/qedf/qedf_main.c
|
|
@@ -1418,7 +1418,7 @@ static struct libfc_function_template qedf_lport_template = {
|
|
|
|
static void qedf_fcoe_ctlr_setup(struct qedf_ctx *qedf)
|
|
{
|
|
- fcoe_ctlr_init(&qedf->ctlr, FIP_ST_AUTO);
|
|
+ fcoe_ctlr_init(&qedf->ctlr, FIP_MODE_AUTO);
|
|
|
|
qedf->ctlr.send = qedf_fip_send;
|
|
qedf->ctlr.get_src_addr = qedf_get_src_mac;
|
|
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
|
|
index 78ca63dfba4a..9a7e3a3bd5ce 100644
|
|
--- a/drivers/scsi/scsi_scan.c
|
|
+++ b/drivers/scsi/scsi_scan.c
|
|
@@ -220,7 +220,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
|
|
struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
|
|
|
|
sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size,
|
|
- GFP_ATOMIC);
|
|
+ GFP_KERNEL);
|
|
if (!sdev)
|
|
goto out;
|
|
|
|
@@ -796,7 +796,7 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
|
|
*/
|
|
sdev->inquiry = kmemdup(inq_result,
|
|
max_t(size_t, sdev->inquiry_len, 36),
|
|
- GFP_ATOMIC);
|
|
+ GFP_KERNEL);
|
|
if (sdev->inquiry == NULL)
|
|
return SCSI_SCAN_NO_RESPONSE;
|
|
|
|
@@ -1087,7 +1087,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget,
|
|
if (!sdev)
|
|
goto out;
|
|
|
|
- result = kmalloc(result_len, GFP_ATOMIC |
|
|
+ result = kmalloc(result_len, GFP_KERNEL |
|
|
((shost->unchecked_isa_dma) ? __GFP_DMA : 0));
|
|
if (!result)
|
|
goto out_free_sdev;
|
|
diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c
|
|
index 09c669e70d63..038abc377fdb 100644
|
|
--- a/drivers/soc/qcom/qcom_gsbi.c
|
|
+++ b/drivers/soc/qcom/qcom_gsbi.c
|
|
@@ -138,7 +138,7 @@ static int gsbi_probe(struct platform_device *pdev)
|
|
struct resource *res;
|
|
void __iomem *base;
|
|
struct gsbi_info *gsbi;
|
|
- int i;
|
|
+ int i, ret;
|
|
u32 mask, gsbi_num;
|
|
const struct crci_config *config = NULL;
|
|
|
|
@@ -221,7 +221,10 @@ static int gsbi_probe(struct platform_device *pdev)
|
|
|
|
platform_set_drvdata(pdev, gsbi);
|
|
|
|
- return of_platform_populate(node, NULL, NULL, &pdev->dev);
|
|
+ ret = of_platform_populate(node, NULL, NULL, &pdev->dev);
|
|
+ if (ret)
|
|
+ clk_disable_unprepare(gsbi->hclk);
|
|
+ return ret;
|
|
}
|
|
|
|
static int gsbi_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
|
|
index a33ee8ef8b6b..51625703399e 100644
|
|
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
|
|
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
|
|
@@ -137,13 +137,17 @@ static int tegra_fuse_probe(struct platform_device *pdev)
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
fuse->phys = res->start;
|
|
fuse->base = devm_ioremap_resource(&pdev->dev, res);
|
|
- if (IS_ERR(fuse->base))
|
|
- return PTR_ERR(fuse->base);
|
|
+ if (IS_ERR(fuse->base)) {
|
|
+ err = PTR_ERR(fuse->base);
|
|
+ fuse->base = base;
|
|
+ return err;
|
|
+ }
|
|
|
|
fuse->clk = devm_clk_get(&pdev->dev, "fuse");
|
|
if (IS_ERR(fuse->clk)) {
|
|
dev_err(&pdev->dev, "failed to get FUSE clock: %ld",
|
|
PTR_ERR(fuse->clk));
|
|
+ fuse->base = base;
|
|
return PTR_ERR(fuse->clk);
|
|
}
|
|
|
|
@@ -152,8 +156,10 @@ static int tegra_fuse_probe(struct platform_device *pdev)
|
|
|
|
if (fuse->soc->probe) {
|
|
err = fuse->soc->probe(fuse);
|
|
- if (err < 0)
|
|
+ if (err < 0) {
|
|
+ fuse->base = base;
|
|
return err;
|
|
+ }
|
|
}
|
|
|
|
if (tegra_fuse_create_sysfs(&pdev->dev, fuse->soc->info->size,
|
|
diff --git a/drivers/staging/mt7621-spi/spi-mt7621.c b/drivers/staging/mt7621-spi/spi-mt7621.c
|
|
index d045b5568e0f..578aa6824ad3 100644
|
|
--- a/drivers/staging/mt7621-spi/spi-mt7621.c
|
|
+++ b/drivers/staging/mt7621-spi/spi-mt7621.c
|
|
@@ -429,6 +429,7 @@ static int mt7621_spi_probe(struct platform_device *pdev)
|
|
int status = 0;
|
|
struct clk *clk;
|
|
struct mt7621_spi_ops *ops;
|
|
+ int ret;
|
|
|
|
match = of_match_device(mt7621_spi_match, &pdev->dev);
|
|
if (!match)
|
|
@@ -476,7 +477,11 @@ static int mt7621_spi_probe(struct platform_device *pdev)
|
|
rs->pending_write = 0;
|
|
dev_info(&pdev->dev, "sys_freq: %u\n", rs->sys_freq);
|
|
|
|
- device_reset(&pdev->dev);
|
|
+ ret = device_reset(&pdev->dev);
|
|
+ if (ret) {
|
|
+ dev_err(&pdev->dev, "SPI reset failed!\n");
|
|
+ return ret;
|
|
+ }
|
|
|
|
mt7621_spi_reset(rs, 0);
|
|
|
|
diff --git a/drivers/tty/serial/8250/8250_pxa.c b/drivers/tty/serial/8250/8250_pxa.c
|
|
index b9bcbe20a2be..c47188860e32 100644
|
|
--- a/drivers/tty/serial/8250/8250_pxa.c
|
|
+++ b/drivers/tty/serial/8250/8250_pxa.c
|
|
@@ -113,6 +113,10 @@ static int serial_pxa_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ ret = of_alias_get_id(pdev->dev.of_node, "serial");
|
|
+ if (ret >= 0)
|
|
+ uart.port.line = ret;
|
|
+
|
|
uart.port.type = PORT_XSCALE;
|
|
uart.port.iotype = UPIO_MEM32;
|
|
uart.port.mapbase = mmres->start;
|
|
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
|
|
index bfdd5ad4116f..1cb80fe5f95c 100644
|
|
--- a/drivers/tty/serial/atmel_serial.c
|
|
+++ b/drivers/tty/serial/atmel_serial.c
|
|
@@ -163,6 +163,8 @@ struct atmel_uart_port {
|
|
unsigned int pending_status;
|
|
spinlock_t lock_suspended;
|
|
|
|
+ bool hd_start_rx; /* can start RX during half-duplex operation */
|
|
+
|
|
#ifdef CONFIG_PM
|
|
struct {
|
|
u32 cr;
|
|
@@ -225,6 +227,12 @@ static inline void atmel_uart_write_char(struct uart_port *port, u8 value)
|
|
__raw_writeb(value, port->membase + ATMEL_US_THR);
|
|
}
|
|
|
|
+static inline int atmel_uart_is_half_duplex(struct uart_port *port)
|
|
+{
|
|
+ return (port->rs485.flags & SER_RS485_ENABLED) &&
|
|
+ !(port->rs485.flags & SER_RS485_RX_DURING_TX);
|
|
+}
|
|
+
|
|
#ifdef CONFIG_SERIAL_ATMEL_PDC
|
|
static bool atmel_use_pdc_rx(struct uart_port *port)
|
|
{
|
|
@@ -481,9 +489,9 @@ static void atmel_stop_tx(struct uart_port *port)
|
|
/* Disable interrupts */
|
|
atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask);
|
|
|
|
- if ((port->rs485.flags & SER_RS485_ENABLED) &&
|
|
- !(port->rs485.flags & SER_RS485_RX_DURING_TX))
|
|
+ if (atmel_uart_is_half_duplex(port))
|
|
atmel_start_rx(port);
|
|
+
|
|
}
|
|
|
|
/*
|
|
@@ -500,8 +508,7 @@ static void atmel_start_tx(struct uart_port *port)
|
|
return;
|
|
|
|
if (atmel_use_pdc_tx(port) || atmel_use_dma_tx(port))
|
|
- if ((port->rs485.flags & SER_RS485_ENABLED) &&
|
|
- !(port->rs485.flags & SER_RS485_RX_DURING_TX))
|
|
+ if (atmel_uart_is_half_duplex(port))
|
|
atmel_stop_rx(port);
|
|
|
|
if (atmel_use_pdc_tx(port))
|
|
@@ -799,10 +806,14 @@ static void atmel_complete_tx_dma(void *arg)
|
|
*/
|
|
if (!uart_circ_empty(xmit))
|
|
atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx);
|
|
- else if ((port->rs485.flags & SER_RS485_ENABLED) &&
|
|
- !(port->rs485.flags & SER_RS485_RX_DURING_TX)) {
|
|
- /* DMA done, stop TX, start RX for RS485 */
|
|
- atmel_start_rx(port);
|
|
+ else if (atmel_uart_is_half_duplex(port)) {
|
|
+ /*
|
|
+ * DMA done, re-enable TXEMPTY and signal that we can stop
|
|
+ * TX and start RX for RS485
|
|
+ */
|
|
+ atmel_port->hd_start_rx = true;
|
|
+ atmel_uart_writel(port, ATMEL_US_IER,
|
|
+ atmel_port->tx_done_mask);
|
|
}
|
|
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
@@ -1248,9 +1259,20 @@ atmel_handle_transmit(struct uart_port *port, unsigned int pending)
|
|
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
|
|
|
if (pending & atmel_port->tx_done_mask) {
|
|
- /* Either PDC or interrupt transmission */
|
|
atmel_uart_writel(port, ATMEL_US_IDR,
|
|
atmel_port->tx_done_mask);
|
|
+
|
|
+ /* Start RX if flag was set and FIFO is empty */
|
|
+ if (atmel_port->hd_start_rx) {
|
|
+ if (!(atmel_uart_readl(port, ATMEL_US_CSR)
|
|
+ & ATMEL_US_TXEMPTY))
|
|
+ dev_warn(port->dev, "Should start RX, but TX fifo is not empty\n");
|
|
+
|
|
+ atmel_port->hd_start_rx = false;
|
|
+ atmel_start_rx(port);
|
|
+ return;
|
|
+ }
|
|
+
|
|
atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx);
|
|
}
|
|
}
|
|
@@ -1377,8 +1399,7 @@ static void atmel_tx_pdc(struct uart_port *port)
|
|
atmel_uart_writel(port, ATMEL_US_IER,
|
|
atmel_port->tx_done_mask);
|
|
} else {
|
|
- if ((port->rs485.flags & SER_RS485_ENABLED) &&
|
|
- !(port->rs485.flags & SER_RS485_RX_DURING_TX)) {
|
|
+ if (atmel_uart_is_half_duplex(port)) {
|
|
/* DMA done, stop TX, start RX for RS485 */
|
|
atmel_start_rx(port);
|
|
}
|
|
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
|
|
index ae3ce330200e..ee3aa57bc0e7 100644
|
|
--- a/drivers/tty/tty_buffer.c
|
|
+++ b/drivers/tty/tty_buffer.c
|
|
@@ -26,7 +26,7 @@
|
|
* Byte threshold to limit memory consumption for flip buffers.
|
|
* The actual memory limit is > 2x this amount.
|
|
*/
|
|
-#define TTYB_DEFAULT_MEM_LIMIT 65536
|
|
+#define TTYB_DEFAULT_MEM_LIMIT (640 * 1024UL)
|
|
|
|
/*
|
|
* We default to dicing tty buffer allocations to this many characters
|
|
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
|
|
index 85fc6db48e44..159b897c5e80 100644
|
|
--- a/drivers/usb/chipidea/core.c
|
|
+++ b/drivers/usb/chipidea/core.c
|
|
@@ -935,8 +935,15 @@ static int ci_hdrc_probe(struct platform_device *pdev)
|
|
} else if (ci->platdata->usb_phy) {
|
|
ci->usb_phy = ci->platdata->usb_phy;
|
|
} else {
|
|
+ ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys",
|
|
+ 0);
|
|
ci->phy = devm_phy_get(dev->parent, "usb-phy");
|
|
- ci->usb_phy = devm_usb_get_phy(dev->parent, USB_PHY_TYPE_USB2);
|
|
+
|
|
+ /* Fallback to grabbing any registered USB2 PHY */
|
|
+ if (IS_ERR(ci->usb_phy) &&
|
|
+ PTR_ERR(ci->usb_phy) != -EPROBE_DEFER)
|
|
+ ci->usb_phy = devm_usb_get_phy(dev->parent,
|
|
+ USB_PHY_TYPE_USB2);
|
|
|
|
/* if both generic PHY and USB PHY layers aren't enabled */
|
|
if (PTR_ERR(ci->phy) == -ENOSYS &&
|
|
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
|
index 700fb626ad03..524104eed8a7 100644
|
|
--- a/drivers/usb/dwc3/gadget.c
|
|
+++ b/drivers/usb/dwc3/gadget.c
|
|
@@ -3233,6 +3233,8 @@ int dwc3_gadget_init(struct dwc3 *dwc)
|
|
goto err4;
|
|
}
|
|
|
|
+ dwc3_gadget_set_speed(&dwc->gadget, dwc->maximum_speed);
|
|
+
|
|
return 0;
|
|
|
|
err4:
|
|
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
|
|
index 31e8bf3578c8..aa15593a3ac4 100644
|
|
--- a/drivers/usb/gadget/function/f_fs.c
|
|
+++ b/drivers/usb/gadget/function/f_fs.c
|
|
@@ -1008,6 +1008,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
|
|
* condition with req->complete callback.
|
|
*/
|
|
usb_ep_dequeue(ep->ep, req);
|
|
+ wait_for_completion(&done);
|
|
interrupted = ep->status < 0;
|
|
}
|
|
|
|
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
|
|
index 6bde543452f2..7ddc0930e98c 100644
|
|
--- a/drivers/video/backlight/pwm_bl.c
|
|
+++ b/drivers/video/backlight/pwm_bl.c
|
|
@@ -425,7 +425,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
|
|
*/
|
|
|
|
/* if the enable GPIO is disabled, do not enable the backlight */
|
|
- if (pb->enable_gpio && gpiod_get_value(pb->enable_gpio) == 0)
|
|
+ if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0)
|
|
return FB_BLANK_POWERDOWN;
|
|
|
|
/* The regulator is disabled, do not enable the backlight */
|
|
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
|
|
index 77cee99fc36c..c48f083d522a 100644
|
|
--- a/drivers/video/fbdev/core/fbmem.c
|
|
+++ b/drivers/video/fbdev/core/fbmem.c
|
|
@@ -427,6 +427,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,
|
|
{
|
|
unsigned int x;
|
|
|
|
+ if (image->width > info->var.xres || image->height > info->var.yres)
|
|
+ return;
|
|
+
|
|
if (rotate == FB_ROTATE_UR) {
|
|
for (x = 0;
|
|
x < num && image->dx + image->width <= info->var.xres;
|
|
diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c
|
|
index cba6b586bfbd..d97fcfc5e558 100644
|
|
--- a/drivers/xen/gntdev-dmabuf.c
|
|
+++ b/drivers/xen/gntdev-dmabuf.c
|
|
@@ -80,6 +80,12 @@ struct gntdev_dmabuf_priv {
|
|
struct list_head imp_list;
|
|
/* This is the lock which protects dma_buf_xxx lists. */
|
|
struct mutex lock;
|
|
+ /*
|
|
+ * We reference this file while exporting dma-bufs, so
|
|
+ * the grant device context is not destroyed while there are
|
|
+ * external users alive.
|
|
+ */
|
|
+ struct file *filp;
|
|
};
|
|
|
|
/* DMA buffer export support. */
|
|
@@ -311,6 +317,7 @@ static void dmabuf_exp_release(struct kref *kref)
|
|
|
|
dmabuf_exp_wait_obj_signal(gntdev_dmabuf->priv, gntdev_dmabuf);
|
|
list_del(&gntdev_dmabuf->next);
|
|
+ fput(gntdev_dmabuf->priv->filp);
|
|
kfree(gntdev_dmabuf);
|
|
}
|
|
|
|
@@ -423,6 +430,7 @@ static int dmabuf_exp_from_pages(struct gntdev_dmabuf_export_args *args)
|
|
mutex_lock(&args->dmabuf_priv->lock);
|
|
list_add(&gntdev_dmabuf->next, &args->dmabuf_priv->exp_list);
|
|
mutex_unlock(&args->dmabuf_priv->lock);
|
|
+ get_file(gntdev_dmabuf->priv->filp);
|
|
return 0;
|
|
|
|
fail:
|
|
@@ -834,7 +842,7 @@ long gntdev_ioctl_dmabuf_imp_release(struct gntdev_priv *priv,
|
|
return dmabuf_imp_release(priv->dmabuf_priv, op.fd);
|
|
}
|
|
|
|
-struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void)
|
|
+struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp)
|
|
{
|
|
struct gntdev_dmabuf_priv *priv;
|
|
|
|
@@ -847,6 +855,8 @@ struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void)
|
|
INIT_LIST_HEAD(&priv->exp_wait_list);
|
|
INIT_LIST_HEAD(&priv->imp_list);
|
|
|
|
+ priv->filp = filp;
|
|
+
|
|
return priv;
|
|
}
|
|
|
|
diff --git a/drivers/xen/gntdev-dmabuf.h b/drivers/xen/gntdev-dmabuf.h
|
|
index 7220a53d0fc5..3d9b9cf9d5a1 100644
|
|
--- a/drivers/xen/gntdev-dmabuf.h
|
|
+++ b/drivers/xen/gntdev-dmabuf.h
|
|
@@ -14,7 +14,7 @@
|
|
struct gntdev_dmabuf_priv;
|
|
struct gntdev_priv;
|
|
|
|
-struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void);
|
|
+struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp);
|
|
|
|
void gntdev_dmabuf_fini(struct gntdev_dmabuf_priv *priv);
|
|
|
|
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
|
|
index b0b02a501167..9d8e02cfd480 100644
|
|
--- a/drivers/xen/gntdev.c
|
|
+++ b/drivers/xen/gntdev.c
|
|
@@ -600,7 +600,7 @@ static int gntdev_open(struct inode *inode, struct file *flip)
|
|
mutex_init(&priv->lock);
|
|
|
|
#ifdef CONFIG_XEN_GNTDEV_DMABUF
|
|
- priv->dmabuf_priv = gntdev_dmabuf_init();
|
|
+ priv->dmabuf_priv = gntdev_dmabuf_init(flip);
|
|
if (IS_ERR(priv->dmabuf_priv)) {
|
|
ret = PTR_ERR(priv->dmabuf_priv);
|
|
kfree(priv);
|
|
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
|
|
index e1fcb28ad4cc..e46e83e87600 100644
|
|
--- a/fs/btrfs/qgroup.c
|
|
+++ b/fs/btrfs/qgroup.c
|
|
@@ -2427,16 +2427,15 @@ out:
|
|
/*
|
|
* Two limits to commit transaction in advance.
|
|
*
|
|
- * For RATIO, it will be 1/RATIO of the remaining limit
|
|
- * (excluding data and prealloc meta) as threshold.
|
|
+ * For RATIO, it will be 1/RATIO of the remaining limit as threshold.
|
|
* For SIZE, it will be in byte unit as threshold.
|
|
*/
|
|
-#define QGROUP_PERTRANS_RATIO 32
|
|
-#define QGROUP_PERTRANS_SIZE SZ_32M
|
|
+#define QGROUP_FREE_RATIO 32
|
|
+#define QGROUP_FREE_SIZE SZ_32M
|
|
static bool qgroup_check_limits(struct btrfs_fs_info *fs_info,
|
|
const struct btrfs_qgroup *qg, u64 num_bytes)
|
|
{
|
|
- u64 limit;
|
|
+ u64 free;
|
|
u64 threshold;
|
|
|
|
if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) &&
|
|
@@ -2455,20 +2454,21 @@ static bool qgroup_check_limits(struct btrfs_fs_info *fs_info,
|
|
*/
|
|
if ((qg->lim_flags & (BTRFS_QGROUP_LIMIT_MAX_RFER |
|
|
BTRFS_QGROUP_LIMIT_MAX_EXCL))) {
|
|
- if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL)
|
|
- limit = qg->max_excl;
|
|
- else
|
|
- limit = qg->max_rfer;
|
|
- threshold = (limit - qg->rsv.values[BTRFS_QGROUP_RSV_DATA] -
|
|
- qg->rsv.values[BTRFS_QGROUP_RSV_META_PREALLOC]) /
|
|
- QGROUP_PERTRANS_RATIO;
|
|
- threshold = min_t(u64, threshold, QGROUP_PERTRANS_SIZE);
|
|
+ if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) {
|
|
+ free = qg->max_excl - qgroup_rsv_total(qg) - qg->excl;
|
|
+ threshold = min_t(u64, qg->max_excl / QGROUP_FREE_RATIO,
|
|
+ QGROUP_FREE_SIZE);
|
|
+ } else {
|
|
+ free = qg->max_rfer - qgroup_rsv_total(qg) - qg->rfer;
|
|
+ threshold = min_t(u64, qg->max_rfer / QGROUP_FREE_RATIO,
|
|
+ QGROUP_FREE_SIZE);
|
|
+ }
|
|
|
|
/*
|
|
* Use transaction_kthread to commit transaction, so we no
|
|
* longer need to bother nested transaction nor lock context.
|
|
*/
|
|
- if (qg->rsv.values[BTRFS_QGROUP_RSV_META_PERTRANS] > threshold)
|
|
+ if (free < threshold)
|
|
btrfs_commit_transaction_locksafe(fs_info);
|
|
}
|
|
|
|
diff --git a/fs/buffer.c b/fs/buffer.c
|
|
index c083c4b3c1e7..a550e0d8e965 100644
|
|
--- a/fs/buffer.c
|
|
+++ b/fs/buffer.c
|
|
@@ -3027,6 +3027,13 @@ void guard_bio_eod(int op, struct bio *bio)
|
|
/* Uhhuh. We've got a bio that straddles the device size! */
|
|
truncated_bytes = bio->bi_iter.bi_size - (maxsector << 9);
|
|
|
|
+ /*
|
|
+ * The bio contains more than one segment which spans EOD, just return
|
|
+ * and let IO layer turn it into an EIO
|
|
+ */
|
|
+ if (truncated_bytes > bvec->bv_len)
|
|
+ return;
|
|
+
|
|
/* Truncate the bio.. */
|
|
bio->bi_iter.bi_size -= truncated_bytes;
|
|
bvec->bv_len -= truncated_bytes;
|
|
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
|
|
index 6b61df117fd4..563e2f6268c3 100644
|
|
--- a/fs/cifs/cifs_dfs_ref.c
|
|
+++ b/fs/cifs/cifs_dfs_ref.c
|
|
@@ -271,9 +271,9 @@ static void dump_referral(const struct dfs_info3_param *ref)
|
|
{
|
|
cifs_dbg(FYI, "DFS: ref path: %s\n", ref->path_name);
|
|
cifs_dbg(FYI, "DFS: node path: %s\n", ref->node_name);
|
|
- cifs_dbg(FYI, "DFS: fl: %hd, srv_type: %hd\n",
|
|
+ cifs_dbg(FYI, "DFS: fl: %d, srv_type: %d\n",
|
|
ref->flags, ref->server_type);
|
|
- cifs_dbg(FYI, "DFS: ref_flags: %hd, path_consumed: %hd\n",
|
|
+ cifs_dbg(FYI, "DFS: ref_flags: %d, path_consumed: %d\n",
|
|
ref->ref_flag, ref->path_consumed);
|
|
}
|
|
|
|
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
|
|
index a5ea742654aa..f31339db45fd 100644
|
|
--- a/fs/cifs/connect.c
|
|
+++ b/fs/cifs/connect.c
|
|
@@ -1347,6 +1347,11 @@ cifs_parse_devname(const char *devname, struct smb_vol *vol)
|
|
const char *delims = "/\\";
|
|
size_t len;
|
|
|
|
+ if (unlikely(!devname || !*devname)) {
|
|
+ cifs_dbg(VFS, "Device name not specified.\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
/* make sure we have a valid UNC double delimiter prefix */
|
|
len = strspn(devname, delims);
|
|
if (len != 2)
|
|
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
|
|
index 08761a6a039d..d847132ab027 100644
|
|
--- a/fs/cifs/file.c
|
|
+++ b/fs/cifs/file.c
|
|
@@ -1631,8 +1631,20 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
|
|
rc = server->ops->mand_unlock_range(cfile, flock, xid);
|
|
|
|
out:
|
|
- if (flock->fl_flags & FL_POSIX && !rc)
|
|
+ if (flock->fl_flags & FL_POSIX) {
|
|
+ /*
|
|
+ * If this is a request to remove all locks because we
|
|
+ * are closing the file, it doesn't matter if the
|
|
+ * unlocking failed as both cifs.ko and the SMB server
|
|
+ * remove the lock on file close
|
|
+ */
|
|
+ if (rc) {
|
|
+ cifs_dbg(VFS, "%s failed rc=%d\n", __func__, rc);
|
|
+ if (!(flock->fl_flags & FL_CLOSE))
|
|
+ return rc;
|
|
+ }
|
|
rc = locks_lock_file_wait(file, flock);
|
|
+ }
|
|
return rc;
|
|
}
|
|
|
|
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
|
|
index 378151e09e91..47db8eb6cbcf 100644
|
|
--- a/fs/cifs/smb1ops.c
|
|
+++ b/fs/cifs/smb1ops.c
|
|
@@ -308,7 +308,7 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)
|
|
remaining = tgt_total_cnt - total_in_tgt;
|
|
|
|
if (remaining < 0) {
|
|
- cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%hu\n",
|
|
+ cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%u\n",
|
|
tgt_total_cnt, total_in_tgt);
|
|
return -EPROTO;
|
|
}
|
|
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
|
|
index 3d0db37d64ad..71f32d983384 100644
|
|
--- a/fs/cifs/smb2pdu.c
|
|
+++ b/fs/cifs/smb2pdu.c
|
|
@@ -881,8 +881,14 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
|
|
rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
|
|
FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */,
|
|
(char *)pneg_inbuf, inbuflen, (char **)&pneg_rsp, &rsplen);
|
|
-
|
|
- if (rc != 0) {
|
|
+ if (rc == -EOPNOTSUPP) {
|
|
+ /*
|
|
+ * Old Windows versions or Netapp SMB server can return
|
|
+ * not supported error. Client should accept it.
|
|
+ */
|
|
+ cifs_dbg(VFS, "Server does not support validate negotiate\n");
|
|
+ return 0;
|
|
+ } else if (rc != 0) {
|
|
cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc);
|
|
rc = -EIO;
|
|
goto out_free_inbuf;
|
|
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
|
|
index 9e96a0bd08d9..e1801b288847 100644
|
|
--- a/fs/ext4/indirect.c
|
|
+++ b/fs/ext4/indirect.c
|
|
@@ -1219,6 +1219,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
|
|
ext4_lblk_t offsets[4], offsets2[4];
|
|
Indirect chain[4], chain2[4];
|
|
Indirect *partial, *partial2;
|
|
+ Indirect *p = NULL, *p2 = NULL;
|
|
ext4_lblk_t max_block;
|
|
__le32 nr = 0, nr2 = 0;
|
|
int n = 0, n2 = 0;
|
|
@@ -1260,7 +1261,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
|
|
}
|
|
|
|
|
|
- partial = ext4_find_shared(inode, n, offsets, chain, &nr);
|
|
+ partial = p = ext4_find_shared(inode, n, offsets, chain, &nr);
|
|
if (nr) {
|
|
if (partial == chain) {
|
|
/* Shared branch grows from the inode */
|
|
@@ -1285,13 +1286,11 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
|
|
partial->p + 1,
|
|
(__le32 *)partial->bh->b_data+addr_per_block,
|
|
(chain+n-1) - partial);
|
|
- BUFFER_TRACE(partial->bh, "call brelse");
|
|
- brelse(partial->bh);
|
|
partial--;
|
|
}
|
|
|
|
end_range:
|
|
- partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2);
|
|
+ partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2);
|
|
if (nr2) {
|
|
if (partial2 == chain2) {
|
|
/*
|
|
@@ -1321,16 +1320,14 @@ end_range:
|
|
(__le32 *)partial2->bh->b_data,
|
|
partial2->p,
|
|
(chain2+n2-1) - partial2);
|
|
- BUFFER_TRACE(partial2->bh, "call brelse");
|
|
- brelse(partial2->bh);
|
|
partial2--;
|
|
}
|
|
goto do_indirects;
|
|
}
|
|
|
|
/* Punch happened within the same level (n == n2) */
|
|
- partial = ext4_find_shared(inode, n, offsets, chain, &nr);
|
|
- partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2);
|
|
+ partial = p = ext4_find_shared(inode, n, offsets, chain, &nr);
|
|
+ partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2);
|
|
|
|
/* Free top, but only if partial2 isn't its subtree. */
|
|
if (nr) {
|
|
@@ -1387,15 +1384,7 @@ end_range:
|
|
partial->p + 1,
|
|
partial2->p,
|
|
(chain+n-1) - partial);
|
|
- while (partial > chain) {
|
|
- BUFFER_TRACE(partial->bh, "call brelse");
|
|
- brelse(partial->bh);
|
|
- }
|
|
- while (partial2 > chain2) {
|
|
- BUFFER_TRACE(partial2->bh, "call brelse");
|
|
- brelse(partial2->bh);
|
|
- }
|
|
- return 0;
|
|
+ goto cleanup;
|
|
}
|
|
|
|
/*
|
|
@@ -1410,8 +1399,6 @@ end_range:
|
|
partial->p + 1,
|
|
(__le32 *)partial->bh->b_data+addr_per_block,
|
|
(chain+n-1) - partial);
|
|
- BUFFER_TRACE(partial->bh, "call brelse");
|
|
- brelse(partial->bh);
|
|
partial--;
|
|
}
|
|
if (partial2 > chain2 && depth2 <= depth) {
|
|
@@ -1419,11 +1406,21 @@ end_range:
|
|
(__le32 *)partial2->bh->b_data,
|
|
partial2->p,
|
|
(chain2+n2-1) - partial2);
|
|
- BUFFER_TRACE(partial2->bh, "call brelse");
|
|
- brelse(partial2->bh);
|
|
partial2--;
|
|
}
|
|
}
|
|
+
|
|
+cleanup:
|
|
+ while (p && p > chain) {
|
|
+ BUFFER_TRACE(p->bh, "call brelse");
|
|
+ brelse(p->bh);
|
|
+ p--;
|
|
+ }
|
|
+ while (p2 && p2 > chain2) {
|
|
+ BUFFER_TRACE(p2->bh, "call brelse");
|
|
+ brelse(p2->bh);
|
|
+ p2--;
|
|
+ }
|
|
return 0;
|
|
|
|
do_indirects:
|
|
@@ -1431,7 +1428,7 @@ do_indirects:
|
|
switch (offsets[0]) {
|
|
default:
|
|
if (++n >= n2)
|
|
- return 0;
|
|
+ break;
|
|
nr = i_data[EXT4_IND_BLOCK];
|
|
if (nr) {
|
|
ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
|
|
@@ -1439,7 +1436,7 @@ do_indirects:
|
|
}
|
|
case EXT4_IND_BLOCK:
|
|
if (++n >= n2)
|
|
- return 0;
|
|
+ break;
|
|
nr = i_data[EXT4_DIND_BLOCK];
|
|
if (nr) {
|
|
ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
|
|
@@ -1447,7 +1444,7 @@ do_indirects:
|
|
}
|
|
case EXT4_DIND_BLOCK:
|
|
if (++n >= n2)
|
|
- return 0;
|
|
+ break;
|
|
nr = i_data[EXT4_TIND_BLOCK];
|
|
if (nr) {
|
|
ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
|
|
@@ -1456,5 +1453,5 @@ do_indirects:
|
|
case EXT4_TIND_BLOCK:
|
|
;
|
|
}
|
|
- return 0;
|
|
+ goto cleanup;
|
|
}
|
|
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
|
|
index 42aef5c94927..a3ba20e5946f 100644
|
|
--- a/fs/f2fs/f2fs.h
|
|
+++ b/fs/f2fs/f2fs.h
|
|
@@ -450,7 +450,6 @@ struct f2fs_flush_device {
|
|
|
|
/* for inline stuff */
|
|
#define DEF_INLINE_RESERVED_SIZE 1
|
|
-#define DEF_MIN_INLINE_SIZE 1
|
|
static inline int get_extra_isize(struct inode *inode);
|
|
static inline int get_inline_xattr_addrs(struct inode *inode);
|
|
#define MAX_INLINE_DATA(inode) (sizeof(__le32) * \
|
|
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
|
|
index 115dc219344b..92703efde36e 100644
|
|
--- a/fs/f2fs/inline.c
|
|
+++ b/fs/f2fs/inline.c
|
|
@@ -661,6 +661,12 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
|
|
if (IS_ERR(ipage))
|
|
return PTR_ERR(ipage);
|
|
|
|
+ /*
|
|
+ * f2fs_readdir was protected by inode.i_rwsem, it is safe to access
|
|
+ * ipage without page's lock held.
|
|
+ */
|
|
+ unlock_page(ipage);
|
|
+
|
|
inline_dentry = inline_data_addr(inode, ipage);
|
|
|
|
make_dentry_ptr_inline(inode, &d, inline_dentry);
|
|
@@ -669,7 +675,7 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
|
|
if (!err)
|
|
ctx->pos = d.max;
|
|
|
|
- f2fs_put_page(ipage, 1);
|
|
+ f2fs_put_page(ipage, 0);
|
|
return err < 0 ? err : 0;
|
|
}
|
|
|
|
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
|
|
index c9639ef0e8d5..79370b7fa9d2 100644
|
|
--- a/fs/f2fs/super.c
|
|
+++ b/fs/f2fs/super.c
|
|
@@ -822,12 +822,13 @@ static int parse_options(struct super_block *sb, char *options)
|
|
"set with inline_xattr option");
|
|
return -EINVAL;
|
|
}
|
|
- if (!F2FS_OPTION(sbi).inline_xattr_size ||
|
|
- F2FS_OPTION(sbi).inline_xattr_size >=
|
|
- DEF_ADDRS_PER_INODE -
|
|
- F2FS_TOTAL_EXTRA_ATTR_SIZE -
|
|
- DEF_INLINE_RESERVED_SIZE -
|
|
- DEF_MIN_INLINE_SIZE) {
|
|
+ if (F2FS_OPTION(sbi).inline_xattr_size <
|
|
+ sizeof(struct f2fs_xattr_header) / sizeof(__le32) ||
|
|
+ F2FS_OPTION(sbi).inline_xattr_size >
|
|
+ DEF_ADDRS_PER_INODE -
|
|
+ F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) -
|
|
+ DEF_INLINE_RESERVED_SIZE -
|
|
+ MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) {
|
|
f2fs_msg(sb, KERN_ERR,
|
|
"inline xattr size is out of range");
|
|
return -EINVAL;
|
|
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
|
|
index 81c0e5337443..98887187af4c 100644
|
|
--- a/fs/f2fs/sysfs.c
|
|
+++ b/fs/f2fs/sysfs.c
|
|
@@ -273,10 +273,16 @@ out:
|
|
return count;
|
|
}
|
|
|
|
- *ui = t;
|
|
|
|
- if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0)
|
|
- f2fs_reset_iostat(sbi);
|
|
+ if (!strcmp(a->attr.name, "iostat_enable")) {
|
|
+ sbi->iostat_enable = !!t;
|
|
+ if (!sbi->iostat_enable)
|
|
+ f2fs_reset_iostat(sbi);
|
|
+ return count;
|
|
+ }
|
|
+
|
|
+ *ui = (unsigned int)t;
|
|
+
|
|
return count;
|
|
}
|
|
|
|
diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c
|
|
index a1fcd00bbb2b..8ac1851a21c0 100644
|
|
--- a/fs/f2fs/trace.c
|
|
+++ b/fs/f2fs/trace.c
|
|
@@ -17,7 +17,7 @@
|
|
#include "trace.h"
|
|
|
|
static RADIX_TREE(pids, GFP_ATOMIC);
|
|
-static struct mutex pids_lock;
|
|
+static spinlock_t pids_lock;
|
|
static struct last_io_info last_io;
|
|
|
|
static inline void __print_last_io(void)
|
|
@@ -61,23 +61,29 @@ void f2fs_trace_pid(struct page *page)
|
|
|
|
set_page_private(page, (unsigned long)pid);
|
|
|
|
+retry:
|
|
if (radix_tree_preload(GFP_NOFS))
|
|
return;
|
|
|
|
- mutex_lock(&pids_lock);
|
|
+ spin_lock(&pids_lock);
|
|
p = radix_tree_lookup(&pids, pid);
|
|
if (p == current)
|
|
goto out;
|
|
if (p)
|
|
radix_tree_delete(&pids, pid);
|
|
|
|
- f2fs_radix_tree_insert(&pids, pid, current);
|
|
+ if (radix_tree_insert(&pids, pid, current)) {
|
|
+ spin_unlock(&pids_lock);
|
|
+ radix_tree_preload_end();
|
|
+ cond_resched();
|
|
+ goto retry;
|
|
+ }
|
|
|
|
trace_printk("%3x:%3x %4x %-16s\n",
|
|
MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),
|
|
pid, current->comm);
|
|
out:
|
|
- mutex_unlock(&pids_lock);
|
|
+ spin_unlock(&pids_lock);
|
|
radix_tree_preload_end();
|
|
}
|
|
|
|
@@ -122,7 +128,7 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush)
|
|
|
|
void f2fs_build_trace_ios(void)
|
|
{
|
|
- mutex_init(&pids_lock);
|
|
+ spin_lock_init(&pids_lock);
|
|
}
|
|
|
|
#define PIDVEC_SIZE 128
|
|
@@ -150,7 +156,7 @@ void f2fs_destroy_trace_ios(void)
|
|
pid_t next_pid = 0;
|
|
unsigned int found;
|
|
|
|
- mutex_lock(&pids_lock);
|
|
+ spin_lock(&pids_lock);
|
|
while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) {
|
|
unsigned idx;
|
|
|
|
@@ -158,5 +164,5 @@ void f2fs_destroy_trace_ios(void)
|
|
for (idx = 0; idx < found; idx++)
|
|
radix_tree_delete(&pids, pid[idx]);
|
|
}
|
|
- mutex_unlock(&pids_lock);
|
|
+ spin_unlock(&pids_lock);
|
|
}
|
|
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c
|
|
index 087e53a2d96c..409a637f7a92 100644
|
|
--- a/fs/f2fs/xattr.c
|
|
+++ b/fs/f2fs/xattr.c
|
|
@@ -227,11 +227,11 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
|
|
{
|
|
struct f2fs_xattr_entry *entry;
|
|
unsigned int inline_size = inline_xattr_size(inode);
|
|
+ void *max_addr = base_addr + inline_size;
|
|
|
|
list_for_each_xattr(entry, base_addr) {
|
|
- if ((void *)entry + sizeof(__u32) > base_addr + inline_size ||
|
|
- (void *)XATTR_NEXT_ENTRY(entry) + sizeof(__u32) >
|
|
- base_addr + inline_size) {
|
|
+ if ((void *)entry + sizeof(__u32) > max_addr ||
|
|
+ (void *)XATTR_NEXT_ENTRY(entry) > max_addr) {
|
|
*last_addr = entry;
|
|
return NULL;
|
|
}
|
|
@@ -242,6 +242,13 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
|
|
if (!memcmp(entry->e_name, name, len))
|
|
break;
|
|
}
|
|
+
|
|
+ /* inline xattr header or entry across max inline xattr size */
|
|
+ if (IS_XATTR_LAST_ENTRY(entry) &&
|
|
+ (void *)entry + sizeof(__u32) > max_addr) {
|
|
+ *last_addr = entry;
|
|
+ return NULL;
|
|
+ }
|
|
return entry;
|
|
}
|
|
|
|
diff --git a/fs/file.c b/fs/file.c
|
|
index 7ffd6e9d103d..780d29e58847 100644
|
|
--- a/fs/file.c
|
|
+++ b/fs/file.c
|
|
@@ -457,6 +457,7 @@ struct files_struct init_files = {
|
|
.full_fds_bits = init_files.full_fds_bits_init,
|
|
},
|
|
.file_lock = __SPIN_LOCK_UNLOCKED(init_files.file_lock),
|
|
+ .resize_wait = __WAIT_QUEUE_HEAD_INITIALIZER(init_files.resize_wait),
|
|
};
|
|
|
|
static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start)
|
|
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
|
|
index 150cc030b4d7..65ea0355a4f6 100644
|
|
--- a/fs/jbd2/commit.c
|
|
+++ b/fs/jbd2/commit.c
|
|
@@ -691,9 +691,11 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
|
the last tag we set up. */
|
|
|
|
tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
|
|
-
|
|
- jbd2_descriptor_block_csum_set(journal, descriptor);
|
|
start_journal_io:
|
|
+ if (descriptor)
|
|
+ jbd2_descriptor_block_csum_set(journal,
|
|
+ descriptor);
|
|
+
|
|
for (i = 0; i < bufs; i++) {
|
|
struct buffer_head *bh = wbuf[i];
|
|
/*
|
|
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
|
|
index 8ef6b6daaa7a..88f2a49338a1 100644
|
|
--- a/fs/jbd2/journal.c
|
|
+++ b/fs/jbd2/journal.c
|
|
@@ -1356,6 +1356,10 @@ static int journal_reset(journal_t *journal)
|
|
return jbd2_journal_start_thread(journal);
|
|
}
|
|
|
|
+/*
|
|
+ * This function expects that the caller will have locked the journal
|
|
+ * buffer head, and will return with it unlocked
|
|
+ */
|
|
static int jbd2_write_superblock(journal_t *journal, int write_flags)
|
|
{
|
|
struct buffer_head *bh = journal->j_sb_buffer;
|
|
@@ -1365,7 +1369,6 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags)
|
|
trace_jbd2_write_superblock(journal, write_flags);
|
|
if (!(journal->j_flags & JBD2_BARRIER))
|
|
write_flags &= ~(REQ_FUA | REQ_PREFLUSH);
|
|
- lock_buffer(bh);
|
|
if (buffer_write_io_error(bh)) {
|
|
/*
|
|
* Oh, dear. A previous attempt to write the journal
|
|
@@ -1424,6 +1427,7 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid,
|
|
jbd_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n",
|
|
tail_block, tail_tid);
|
|
|
|
+ lock_buffer(journal->j_sb_buffer);
|
|
sb->s_sequence = cpu_to_be32(tail_tid);
|
|
sb->s_start = cpu_to_be32(tail_block);
|
|
|
|
@@ -1454,18 +1458,17 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
|
|
journal_superblock_t *sb = journal->j_superblock;
|
|
|
|
BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
|
|
- read_lock(&journal->j_state_lock);
|
|
- /* Is it already empty? */
|
|
- if (sb->s_start == 0) {
|
|
- read_unlock(&journal->j_state_lock);
|
|
+ lock_buffer(journal->j_sb_buffer);
|
|
+ if (sb->s_start == 0) { /* Is it already empty? */
|
|
+ unlock_buffer(journal->j_sb_buffer);
|
|
return;
|
|
}
|
|
+
|
|
jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n",
|
|
journal->j_tail_sequence);
|
|
|
|
sb->s_sequence = cpu_to_be32(journal->j_tail_sequence);
|
|
sb->s_start = cpu_to_be32(0);
|
|
- read_unlock(&journal->j_state_lock);
|
|
|
|
jbd2_write_superblock(journal, write_op);
|
|
|
|
@@ -1488,9 +1491,8 @@ void jbd2_journal_update_sb_errno(journal_t *journal)
|
|
journal_superblock_t *sb = journal->j_superblock;
|
|
int errcode;
|
|
|
|
- read_lock(&journal->j_state_lock);
|
|
+ lock_buffer(journal->j_sb_buffer);
|
|
errcode = journal->j_errno;
|
|
- read_unlock(&journal->j_state_lock);
|
|
if (errcode == -ESHUTDOWN)
|
|
errcode = 0;
|
|
jbd_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode);
|
|
@@ -1894,28 +1896,27 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat,
|
|
|
|
sb = journal->j_superblock;
|
|
|
|
+ /* Load the checksum driver if necessary */
|
|
+ if ((journal->j_chksum_driver == NULL) &&
|
|
+ INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) {
|
|
+ journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0);
|
|
+ if (IS_ERR(journal->j_chksum_driver)) {
|
|
+ printk(KERN_ERR "JBD2: Cannot load crc32c driver.\n");
|
|
+ journal->j_chksum_driver = NULL;
|
|
+ return 0;
|
|
+ }
|
|
+ /* Precompute checksum seed for all metadata */
|
|
+ journal->j_csum_seed = jbd2_chksum(journal, ~0, sb->s_uuid,
|
|
+ sizeof(sb->s_uuid));
|
|
+ }
|
|
+
|
|
+ lock_buffer(journal->j_sb_buffer);
|
|
+
|
|
/* If enabling v3 checksums, update superblock */
|
|
if (INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) {
|
|
sb->s_checksum_type = JBD2_CRC32C_CHKSUM;
|
|
sb->s_feature_compat &=
|
|
~cpu_to_be32(JBD2_FEATURE_COMPAT_CHECKSUM);
|
|
-
|
|
- /* Load the checksum driver */
|
|
- if (journal->j_chksum_driver == NULL) {
|
|
- journal->j_chksum_driver = crypto_alloc_shash("crc32c",
|
|
- 0, 0);
|
|
- if (IS_ERR(journal->j_chksum_driver)) {
|
|
- printk(KERN_ERR "JBD2: Cannot load crc32c "
|
|
- "driver.\n");
|
|
- journal->j_chksum_driver = NULL;
|
|
- return 0;
|
|
- }
|
|
-
|
|
- /* Precompute checksum seed for all metadata */
|
|
- journal->j_csum_seed = jbd2_chksum(journal, ~0,
|
|
- sb->s_uuid,
|
|
- sizeof(sb->s_uuid));
|
|
- }
|
|
}
|
|
|
|
/* If enabling v1 checksums, downgrade superblock */
|
|
@@ -1927,6 +1928,7 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat,
|
|
sb->s_feature_compat |= cpu_to_be32(compat);
|
|
sb->s_feature_ro_compat |= cpu_to_be32(ro);
|
|
sb->s_feature_incompat |= cpu_to_be32(incompat);
|
|
+ unlock_buffer(journal->j_sb_buffer);
|
|
|
|
return 1;
|
|
#undef COMPAT_FEATURE_ON
|
|
diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c
|
|
index 0e4166cc23a0..4ac775e32240 100644
|
|
--- a/fs/ocfs2/cluster/nodemanager.c
|
|
+++ b/fs/ocfs2/cluster/nodemanager.c
|
|
@@ -621,13 +621,15 @@ static void o2nm_node_group_drop_item(struct config_group *group,
|
|
struct o2nm_node *node = to_o2nm_node(item);
|
|
struct o2nm_cluster *cluster = to_o2nm_cluster(group->cg_item.ci_parent);
|
|
|
|
- o2net_disconnect_node(node);
|
|
+ if (cluster->cl_nodes[node->nd_num] == node) {
|
|
+ o2net_disconnect_node(node);
|
|
|
|
- if (cluster->cl_has_local &&
|
|
- (cluster->cl_local_node == node->nd_num)) {
|
|
- cluster->cl_has_local = 0;
|
|
- cluster->cl_local_node = O2NM_INVALID_NODE_NUM;
|
|
- o2net_stop_listening(node);
|
|
+ if (cluster->cl_has_local &&
|
|
+ (cluster->cl_local_node == node->nd_num)) {
|
|
+ cluster->cl_has_local = 0;
|
|
+ cluster->cl_local_node = O2NM_INVALID_NODE_NUM;
|
|
+ o2net_stop_listening(node);
|
|
+ }
|
|
}
|
|
|
|
/* XXX call into net to stop this node from trading messages */
|
|
diff --git a/fs/read_write.c b/fs/read_write.c
|
|
index 8a2737f0d61d..562974a0616c 100644
|
|
--- a/fs/read_write.c
|
|
+++ b/fs/read_write.c
|
|
@@ -1241,6 +1241,9 @@ COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd,
|
|
const struct compat_iovec __user *,vec,
|
|
unsigned long, vlen, loff_t, pos, rwf_t, flags)
|
|
{
|
|
+ if (pos == -1)
|
|
+ return do_compat_readv(fd, vec, vlen, flags);
|
|
+
|
|
return do_compat_preadv64(fd, vec, vlen, pos, flags);
|
|
}
|
|
#endif
|
|
@@ -1347,6 +1350,9 @@ COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd,
|
|
const struct compat_iovec __user *,vec,
|
|
unsigned long, vlen, loff_t, pos, rwf_t, flags)
|
|
{
|
|
+ if (pos == -1)
|
|
+ return do_compat_writev(fd, vec, vlen, flags);
|
|
+
|
|
return do_compat_pwritev64(fd, vec, vlen, pos, flags);
|
|
}
|
|
#endif
|
|
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
|
|
index 22254c1fe1c5..6002275937f5 100644
|
|
--- a/include/linux/cgroup-defs.h
|
|
+++ b/include/linux/cgroup-defs.h
|
|
@@ -597,7 +597,7 @@ struct cgroup_subsys {
|
|
void (*cancel_fork)(struct task_struct *task);
|
|
void (*fork)(struct task_struct *task);
|
|
void (*exit)(struct task_struct *task);
|
|
- void (*free)(struct task_struct *task);
|
|
+ void (*release)(struct task_struct *task);
|
|
void (*bind)(struct cgroup_subsys_state *root_css);
|
|
|
|
bool early_init:1;
|
|
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
|
|
index 32c553556bbd..ca51b2c15bcc 100644
|
|
--- a/include/linux/cgroup.h
|
|
+++ b/include/linux/cgroup.h
|
|
@@ -119,6 +119,7 @@ extern int cgroup_can_fork(struct task_struct *p);
|
|
extern void cgroup_cancel_fork(struct task_struct *p);
|
|
extern void cgroup_post_fork(struct task_struct *p);
|
|
void cgroup_exit(struct task_struct *p);
|
|
+void cgroup_release(struct task_struct *p);
|
|
void cgroup_free(struct task_struct *p);
|
|
|
|
int cgroup_init_early(void);
|
|
@@ -699,6 +700,7 @@ static inline int cgroup_can_fork(struct task_struct *p) { return 0; }
|
|
static inline void cgroup_cancel_fork(struct task_struct *p) {}
|
|
static inline void cgroup_post_fork(struct task_struct *p) {}
|
|
static inline void cgroup_exit(struct task_struct *p) {}
|
|
+static inline void cgroup_release(struct task_struct *p) {}
|
|
static inline void cgroup_free(struct task_struct *p) {}
|
|
|
|
static inline int cgroup_init_early(void) { return 0; }
|
|
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
|
|
index 08b1aa70a38d..d1b6d2c3ada6 100644
|
|
--- a/include/linux/clk-provider.h
|
|
+++ b/include/linux/clk-provider.h
|
|
@@ -782,6 +782,9 @@ unsigned int __clk_get_enable_count(struct clk *clk);
|
|
unsigned long clk_hw_get_rate(const struct clk_hw *hw);
|
|
unsigned long __clk_get_flags(struct clk *clk);
|
|
unsigned long clk_hw_get_flags(const struct clk_hw *hw);
|
|
+#define clk_hw_can_set_rate_parent(hw) \
|
|
+ (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT)
|
|
+
|
|
bool clk_hw_is_prepared(const struct clk_hw *hw);
|
|
bool clk_hw_rate_is_protected(const struct clk_hw *hw);
|
|
bool clk_hw_is_enabled(const struct clk_hw *hw);
|
|
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
|
|
index f70f8ac9c4f4..40fec5f94949 100644
|
|
--- a/include/linux/f2fs_fs.h
|
|
+++ b/include/linux/f2fs_fs.h
|
|
@@ -489,12 +489,12 @@ typedef __le32 f2fs_hash_t;
|
|
|
|
/*
|
|
* space utilization of regular dentry and inline dentry (w/o extra reservation)
|
|
- * regular dentry inline dentry
|
|
- * bitmap 1 * 27 = 27 1 * 23 = 23
|
|
- * reserved 1 * 3 = 3 1 * 7 = 7
|
|
- * dentry 11 * 214 = 2354 11 * 182 = 2002
|
|
- * filename 8 * 214 = 1712 8 * 182 = 1456
|
|
- * total 4096 3488
|
|
+ * regular dentry inline dentry (def) inline dentry (min)
|
|
+ * bitmap 1 * 27 = 27 1 * 23 = 23 1 * 1 = 1
|
|
+ * reserved 1 * 3 = 3 1 * 7 = 7 1 * 1 = 1
|
|
+ * dentry 11 * 214 = 2354 11 * 182 = 2002 11 * 2 = 22
|
|
+ * filename 8 * 214 = 1712 8 * 182 = 1456 8 * 2 = 16
|
|
+ * total 4096 3488 40
|
|
*
|
|
* Note: there are more reserved space in inline dentry than in regular
|
|
* dentry, when converting inline dentry we should handle this carefully.
|
|
@@ -506,6 +506,7 @@ typedef __le32 f2fs_hash_t;
|
|
#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \
|
|
F2FS_SLOT_LEN) * \
|
|
NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
|
|
+#define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */
|
|
|
|
/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */
|
|
struct f2fs_dir_entry {
|
|
diff --git a/include/linux/filter.h b/include/linux/filter.h
|
|
index 1a39d57eb88f..037610845892 100644
|
|
--- a/include/linux/filter.h
|
|
+++ b/include/linux/filter.h
|
|
@@ -844,7 +844,9 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr,
|
|
unsigned int alignment,
|
|
bpf_jit_fill_hole_t bpf_fill_ill_insns);
|
|
void bpf_jit_binary_free(struct bpf_binary_header *hdr);
|
|
-
|
|
+u64 bpf_jit_alloc_exec_limit(void);
|
|
+void *bpf_jit_alloc_exec(unsigned long size);
|
|
+void bpf_jit_free_exec(void *addr);
|
|
void bpf_jit_free(struct bpf_prog *fp);
|
|
|
|
struct bpf_prog *bpf_jit_blind_constants(struct bpf_prog *fp);
|
|
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
|
|
index dd1e40ddac7d..875c41b23f20 100644
|
|
--- a/include/linux/irqdesc.h
|
|
+++ b/include/linux/irqdesc.h
|
|
@@ -65,6 +65,7 @@ struct irq_desc {
|
|
unsigned int core_internal_state__do_not_mess_with_it;
|
|
unsigned int depth; /* nested irq disables */
|
|
unsigned int wake_depth; /* nested wake enables */
|
|
+ unsigned int tot_count;
|
|
unsigned int irq_count; /* For detecting broken IRQs */
|
|
unsigned long last_unhandled; /* Aging timer for unhandled count */
|
|
unsigned int irqs_unhandled;
|
|
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
|
|
index c2876e740514..42fc852bf512 100644
|
|
--- a/include/linux/perf_event.h
|
|
+++ b/include/linux/perf_event.h
|
|
@@ -409,7 +409,7 @@ struct pmu {
|
|
/*
|
|
* Set up pmu-private data structures for an AUX area
|
|
*/
|
|
- void *(*setup_aux) (int cpu, void **pages,
|
|
+ void *(*setup_aux) (struct perf_event *event, void **pages,
|
|
int nr_pages, bool overwrite);
|
|
/* optional */
|
|
|
|
diff --git a/include/linux/relay.h b/include/linux/relay.h
|
|
index e1bdf01a86e2..c759f96e39c1 100644
|
|
--- a/include/linux/relay.h
|
|
+++ b/include/linux/relay.h
|
|
@@ -66,7 +66,7 @@ struct rchan
|
|
struct kref kref; /* channel refcount */
|
|
void *private_data; /* for user-defined data */
|
|
size_t last_toobig; /* tried to log event > subbuf size */
|
|
- struct rchan_buf ** __percpu buf; /* per-cpu channel buffers */
|
|
+ struct rchan_buf * __percpu *buf; /* per-cpu channel buffers */
|
|
int is_global; /* One global buffer ? */
|
|
struct list_head list; /* for channel list */
|
|
struct dentry *parent; /* parent dentry passed to open */
|
|
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h
|
|
index 0940fda59872..941bfd9b3c89 100644
|
|
--- a/include/linux/ring_buffer.h
|
|
+++ b/include/linux/ring_buffer.h
|
|
@@ -128,7 +128,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts,
|
|
unsigned long *lost_events);
|
|
|
|
struct ring_buffer_iter *
|
|
-ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu);
|
|
+ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags);
|
|
void ring_buffer_read_prepare_sync(void);
|
|
void ring_buffer_read_start(struct ring_buffer_iter *iter);
|
|
void ring_buffer_read_finish(struct ring_buffer_iter *iter);
|
|
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
|
index 4abb5bd74b04..5dc024e28397 100644
|
|
--- a/include/linux/sched.h
|
|
+++ b/include/linux/sched.h
|
|
@@ -1737,9 +1737,9 @@ static __always_inline bool need_resched(void)
|
|
static inline unsigned int task_cpu(const struct task_struct *p)
|
|
{
|
|
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
|
- return p->cpu;
|
|
+ return READ_ONCE(p->cpu);
|
|
#else
|
|
- return task_thread_info(p)->cpu;
|
|
+ return READ_ONCE(task_thread_info(p)->cpu);
|
|
#endif
|
|
}
|
|
|
|
diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h
|
|
index 26347741ba50..15f3f61f7e3b 100644
|
|
--- a/include/linux/sched/topology.h
|
|
+++ b/include/linux/sched/topology.h
|
|
@@ -177,10 +177,10 @@ typedef int (*sched_domain_flags_f)(void);
|
|
#define SDTL_OVERLAP 0x01
|
|
|
|
struct sd_data {
|
|
- struct sched_domain **__percpu sd;
|
|
- struct sched_domain_shared **__percpu sds;
|
|
- struct sched_group **__percpu sg;
|
|
- struct sched_group_capacity **__percpu sgc;
|
|
+ struct sched_domain *__percpu *sd;
|
|
+ struct sched_domain_shared *__percpu *sds;
|
|
+ struct sched_group *__percpu *sg;
|
|
+ struct sched_group_capacity *__percpu *sgc;
|
|
};
|
|
|
|
struct sched_domain_topology_level {
|
|
diff --git a/include/net/netfilter/br_netfilter.h b/include/net/netfilter/br_netfilter.h
|
|
index 74af19c3a8f7..a4ba601b5d04 100644
|
|
--- a/include/net/netfilter/br_netfilter.h
|
|
+++ b/include/net/netfilter/br_netfilter.h
|
|
@@ -49,7 +49,6 @@ static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
|
|
}
|
|
|
|
struct net_device *setup_pre_routing(struct sk_buff *skb);
|
|
-void br_netfilter_enable(void);
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
int br_validate_ipv6(struct net *net, struct sk_buff *skb);
|
|
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
|
|
index cb8a273732cf..bb8092fa1e36 100644
|
|
--- a/include/scsi/libfcoe.h
|
|
+++ b/include/scsi/libfcoe.h
|
|
@@ -79,7 +79,7 @@ enum fip_state {
|
|
* It must not change after fcoe_ctlr_init() sets it.
|
|
*/
|
|
enum fip_mode {
|
|
- FIP_MODE_AUTO = FIP_ST_AUTO,
|
|
+ FIP_MODE_AUTO,
|
|
FIP_MODE_NON_FIP,
|
|
FIP_MODE_FABRIC,
|
|
FIP_MODE_VN2VN,
|
|
@@ -250,7 +250,7 @@ struct fcoe_rport {
|
|
};
|
|
|
|
/* FIP API functions */
|
|
-void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state);
|
|
+void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_mode);
|
|
void fcoe_ctlr_destroy(struct fcoe_ctlr *);
|
|
void fcoe_ctlr_link_up(struct fcoe_ctlr *);
|
|
int fcoe_ctlr_link_down(struct fcoe_ctlr *);
|
|
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
|
|
index e710ac7fbbbf..63dae7e0ccae 100644
|
|
--- a/kernel/cgroup/cgroup.c
|
|
+++ b/kernel/cgroup/cgroup.c
|
|
@@ -195,7 +195,7 @@ static u64 css_serial_nr_next = 1;
|
|
*/
|
|
static u16 have_fork_callback __read_mostly;
|
|
static u16 have_exit_callback __read_mostly;
|
|
-static u16 have_free_callback __read_mostly;
|
|
+static u16 have_release_callback __read_mostly;
|
|
static u16 have_canfork_callback __read_mostly;
|
|
|
|
/* cgroup namespace for init task */
|
|
@@ -5240,7 +5240,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early)
|
|
|
|
have_fork_callback |= (bool)ss->fork << ss->id;
|
|
have_exit_callback |= (bool)ss->exit << ss->id;
|
|
- have_free_callback |= (bool)ss->free << ss->id;
|
|
+ have_release_callback |= (bool)ss->release << ss->id;
|
|
have_canfork_callback |= (bool)ss->can_fork << ss->id;
|
|
|
|
/* At system boot, before all subsystems have been
|
|
@@ -5676,16 +5676,19 @@ void cgroup_exit(struct task_struct *tsk)
|
|
} while_each_subsys_mask();
|
|
}
|
|
|
|
-void cgroup_free(struct task_struct *task)
|
|
+void cgroup_release(struct task_struct *task)
|
|
{
|
|
- struct css_set *cset = task_css_set(task);
|
|
struct cgroup_subsys *ss;
|
|
int ssid;
|
|
|
|
- do_each_subsys_mask(ss, ssid, have_free_callback) {
|
|
- ss->free(task);
|
|
+ do_each_subsys_mask(ss, ssid, have_release_callback) {
|
|
+ ss->release(task);
|
|
} while_each_subsys_mask();
|
|
+}
|
|
|
|
+void cgroup_free(struct task_struct *task)
|
|
+{
|
|
+ struct css_set *cset = task_css_set(task);
|
|
put_css_set(cset);
|
|
}
|
|
|
|
diff --git a/kernel/cgroup/pids.c b/kernel/cgroup/pids.c
|
|
index 9829c67ebc0a..c9960baaa14f 100644
|
|
--- a/kernel/cgroup/pids.c
|
|
+++ b/kernel/cgroup/pids.c
|
|
@@ -247,7 +247,7 @@ static void pids_cancel_fork(struct task_struct *task)
|
|
pids_uncharge(pids, 1);
|
|
}
|
|
|
|
-static void pids_free(struct task_struct *task)
|
|
+static void pids_release(struct task_struct *task)
|
|
{
|
|
struct pids_cgroup *pids = css_pids(task_css(task, pids_cgrp_id));
|
|
|
|
@@ -342,7 +342,7 @@ struct cgroup_subsys pids_cgrp_subsys = {
|
|
.cancel_attach = pids_cancel_attach,
|
|
.can_fork = pids_can_fork,
|
|
.cancel_fork = pids_cancel_fork,
|
|
- .free = pids_free,
|
|
+ .release = pids_release,
|
|
.legacy_cftypes = pids_files,
|
|
.dfl_cftypes = pids_files,
|
|
.threaded = true,
|
|
diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c
|
|
index d503d1a9007c..bb95a35e8c2d 100644
|
|
--- a/kernel/cgroup/rstat.c
|
|
+++ b/kernel/cgroup/rstat.c
|
|
@@ -87,7 +87,6 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos,
|
|
struct cgroup *root, int cpu)
|
|
{
|
|
struct cgroup_rstat_cpu *rstatc;
|
|
- struct cgroup *parent;
|
|
|
|
if (pos == root)
|
|
return NULL;
|
|
@@ -115,8 +114,8 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos,
|
|
* However, due to the way we traverse, @pos will be the first
|
|
* child in most cases. The only exception is @root.
|
|
*/
|
|
- parent = cgroup_parent(pos);
|
|
- if (parent && rstatc->updated_next) {
|
|
+ if (rstatc->updated_next) {
|
|
+ struct cgroup *parent = cgroup_parent(pos);
|
|
struct cgroup_rstat_cpu *prstatc = cgroup_rstat_cpu(parent, cpu);
|
|
struct cgroup_rstat_cpu *nrstatc;
|
|
struct cgroup **nextp;
|
|
@@ -140,9 +139,12 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos,
|
|
* updated stat.
|
|
*/
|
|
smp_mb();
|
|
+
|
|
+ return pos;
|
|
}
|
|
|
|
- return pos;
|
|
+ /* only happens for @root */
|
|
+ return NULL;
|
|
}
|
|
|
|
/* see cgroup_rstat_flush() */
|
|
diff --git a/kernel/cpu.c b/kernel/cpu.c
|
|
index 9d0ecc4a0e79..dc250ec2c096 100644
|
|
--- a/kernel/cpu.c
|
|
+++ b/kernel/cpu.c
|
|
@@ -313,6 +313,15 @@ void cpus_write_unlock(void)
|
|
|
|
void lockdep_assert_cpus_held(void)
|
|
{
|
|
+ /*
|
|
+ * We can't have hotplug operations before userspace starts running,
|
|
+ * and some init codepaths will knowingly not take the hotplug lock.
|
|
+ * This is all valid, so mute lockdep until it makes sense to report
|
|
+ * unheld locks.
|
|
+ */
|
|
+ if (system_state < SYSTEM_RUNNING)
|
|
+ return;
|
|
+
|
|
percpu_rwsem_assert_held(&cpu_hotplug_lock);
|
|
}
|
|
|
|
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
|
|
index 5631af940316..474b2ccdbe69 100644
|
|
--- a/kernel/events/ring_buffer.c
|
|
+++ b/kernel/events/ring_buffer.c
|
|
@@ -648,7 +648,7 @@ int rb_alloc_aux(struct ring_buffer *rb, struct perf_event *event,
|
|
goto out;
|
|
}
|
|
|
|
- rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages,
|
|
+ rb->aux_priv = event->pmu->setup_aux(event, rb->aux_pages, nr_pages,
|
|
overwrite);
|
|
if (!rb->aux_priv)
|
|
goto out;
|
|
diff --git a/kernel/exit.c b/kernel/exit.c
|
|
index d607e23fd0c3..5c0964dc805a 100644
|
|
--- a/kernel/exit.c
|
|
+++ b/kernel/exit.c
|
|
@@ -219,6 +219,7 @@ repeat:
|
|
}
|
|
|
|
write_unlock_irq(&tasklist_lock);
|
|
+ cgroup_release(p);
|
|
release_thread(p);
|
|
call_rcu(&p->rcu, delayed_put_task_struct);
|
|
|
|
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
|
|
index a2b3d9de999c..811009ebacd4 100644
|
|
--- a/kernel/irq/chip.c
|
|
+++ b/kernel/irq/chip.c
|
|
@@ -855,7 +855,11 @@ void handle_percpu_irq(struct irq_desc *desc)
|
|
{
|
|
struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
|
- kstat_incr_irqs_this_cpu(desc);
|
|
+ /*
|
|
+ * PER CPU interrupts are not serialized. Do not touch
|
|
+ * desc->tot_count.
|
|
+ */
|
|
+ __kstat_incr_irqs_this_cpu(desc);
|
|
|
|
if (chip->irq_ack)
|
|
chip->irq_ack(&desc->irq_data);
|
|
@@ -884,7 +888,11 @@ void handle_percpu_devid_irq(struct irq_desc *desc)
|
|
unsigned int irq = irq_desc_get_irq(desc);
|
|
irqreturn_t res;
|
|
|
|
- kstat_incr_irqs_this_cpu(desc);
|
|
+ /*
|
|
+ * PER CPU interrupts are not serialized. Do not touch
|
|
+ * desc->tot_count.
|
|
+ */
|
|
+ __kstat_incr_irqs_this_cpu(desc);
|
|
|
|
if (chip->irq_ack)
|
|
chip->irq_ack(&desc->irq_data);
|
|
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
|
|
index ca6afa267070..e74e7eea76cf 100644
|
|
--- a/kernel/irq/internals.h
|
|
+++ b/kernel/irq/internals.h
|
|
@@ -242,12 +242,18 @@ static inline void irq_state_set_masked(struct irq_desc *desc)
|
|
|
|
#undef __irqd_to_state
|
|
|
|
-static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
|
|
+static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc)
|
|
{
|
|
__this_cpu_inc(*desc->kstat_irqs);
|
|
__this_cpu_inc(kstat.irqs_sum);
|
|
}
|
|
|
|
+static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
|
|
+{
|
|
+ __kstat_incr_irqs_this_cpu(desc);
|
|
+ desc->tot_count++;
|
|
+}
|
|
+
|
|
static inline int irq_desc_get_node(struct irq_desc *desc)
|
|
{
|
|
return irq_common_data_get_node(&desc->irq_common_data);
|
|
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
|
|
index 578d0e5f1b5b..ba454cba4069 100644
|
|
--- a/kernel/irq/irqdesc.c
|
|
+++ b/kernel/irq/irqdesc.c
|
|
@@ -119,6 +119,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
|
|
desc->depth = 1;
|
|
desc->irq_count = 0;
|
|
desc->irqs_unhandled = 0;
|
|
+ desc->tot_count = 0;
|
|
desc->name = NULL;
|
|
desc->owner = owner;
|
|
for_each_possible_cpu(cpu)
|
|
@@ -915,11 +916,15 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
|
|
unsigned int kstat_irqs(unsigned int irq)
|
|
{
|
|
struct irq_desc *desc = irq_to_desc(irq);
|
|
- int cpu;
|
|
unsigned int sum = 0;
|
|
+ int cpu;
|
|
|
|
if (!desc || !desc->kstat_irqs)
|
|
return 0;
|
|
+ if (!irq_settings_is_per_cpu_devid(desc) &&
|
|
+ !irq_settings_is_per_cpu(desc))
|
|
+ return desc->tot_count;
|
|
+
|
|
for_each_possible_cpu(cpu)
|
|
sum += *per_cpu_ptr(desc->kstat_irqs, cpu);
|
|
return sum;
|
|
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
|
|
index 39cb23d22109..81688a133552 100644
|
|
--- a/kernel/rcu/update.c
|
|
+++ b/kernel/rcu/update.c
|
|
@@ -52,6 +52,7 @@
|
|
#include <linux/tick.h>
|
|
#include <linux/rcupdate_wait.h>
|
|
#include <linux/sched/isolation.h>
|
|
+#include <linux/kprobes.h>
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
|
@@ -253,6 +254,7 @@ int notrace debug_lockdep_rcu_enabled(void)
|
|
current->lockdep_recursion == 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled);
|
|
+NOKPROBE_SYMBOL(debug_lockdep_rcu_enabled);
|
|
|
|
/**
|
|
* rcu_read_lock_held() - might we be in RCU read-side critical section?
|
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
|
index 152a0b0c91bb..9a4f57d7e931 100644
|
|
--- a/kernel/sched/core.c
|
|
+++ b/kernel/sched/core.c
|
|
@@ -107,11 +107,12 @@ struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf)
|
|
* [L] ->on_rq
|
|
* RELEASE (rq->lock)
|
|
*
|
|
- * If we observe the old CPU in task_rq_lock, the acquire of
|
|
+ * If we observe the old CPU in task_rq_lock(), the acquire of
|
|
* the old rq->lock will fully serialize against the stores.
|
|
*
|
|
- * If we observe the new CPU in task_rq_lock, the acquire will
|
|
- * pair with the WMB to ensure we must then also see migrating.
|
|
+ * If we observe the new CPU in task_rq_lock(), the address
|
|
+ * dependency headed by '[L] rq = task_rq()' and the acquire
|
|
+ * will pair with the WMB to ensure we then also see migrating.
|
|
*/
|
|
if (likely(rq == task_rq(p) && !task_on_rq_migrating(p))) {
|
|
rq_pin_lock(rq, rf);
|
|
@@ -910,7 +911,7 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf,
|
|
{
|
|
lockdep_assert_held(&rq->lock);
|
|
|
|
- p->on_rq = TASK_ON_RQ_MIGRATING;
|
|
+ WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING);
|
|
dequeue_task(rq, p, DEQUEUE_NOCLOCK);
|
|
set_task_cpu(p, new_cpu);
|
|
rq_unlock(rq, rf);
|
|
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
|
|
index 6383aa6a60ca..141ea9ff210e 100644
|
|
--- a/kernel/sched/debug.c
|
|
+++ b/kernel/sched/debug.c
|
|
@@ -315,6 +315,7 @@ void register_sched_domain_sysctl(void)
|
|
{
|
|
static struct ctl_table *cpu_entries;
|
|
static struct ctl_table **cpu_idx;
|
|
+ static bool init_done = false;
|
|
char buf[32];
|
|
int i;
|
|
|
|
@@ -344,7 +345,10 @@ void register_sched_domain_sysctl(void)
|
|
if (!cpumask_available(sd_sysctl_cpus)) {
|
|
if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL))
|
|
return;
|
|
+ }
|
|
|
|
+ if (!init_done) {
|
|
+ init_done = true;
|
|
/* init to possible to not have holes in @cpu_entries */
|
|
cpumask_copy(sd_sysctl_cpus, cpu_possible_mask);
|
|
}
|
|
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
|
index b63172288f7b..4c7a837d7c14 100644
|
|
--- a/kernel/sched/sched.h
|
|
+++ b/kernel/sched/sched.h
|
|
@@ -1331,9 +1331,9 @@ static inline void __set_task_cpu(struct task_struct *p, unsigned int cpu)
|
|
*/
|
|
smp_wmb();
|
|
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
|
- p->cpu = cpu;
|
|
+ WRITE_ONCE(p->cpu, cpu);
|
|
#else
|
|
- task_thread_info(p)->cpu = cpu;
|
|
+ WRITE_ONCE(task_thread_info(p)->cpu, cpu);
|
|
#endif
|
|
p->wake_cpu = cpu;
|
|
#endif
|
|
@@ -1434,7 +1434,7 @@ static inline int task_on_rq_queued(struct task_struct *p)
|
|
|
|
static inline int task_on_rq_migrating(struct task_struct *p)
|
|
{
|
|
- return p->on_rq == TASK_ON_RQ_MIGRATING;
|
|
+ return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING;
|
|
}
|
|
|
|
/*
|
|
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
|
|
index 505a41c42b96..c0a751464971 100644
|
|
--- a/kernel/sched/topology.c
|
|
+++ b/kernel/sched/topology.c
|
|
@@ -477,7 +477,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
|
|
}
|
|
|
|
struct s_data {
|
|
- struct sched_domain ** __percpu sd;
|
|
+ struct sched_domain * __percpu *sd;
|
|
struct root_domain *rd;
|
|
};
|
|
|
|
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
|
index 3b86acd5de4e..9e22660153ff 100644
|
|
--- a/kernel/sysctl.c
|
|
+++ b/kernel/sysctl.c
|
|
@@ -126,6 +126,7 @@ static int __maybe_unused one = 1;
|
|
static int __maybe_unused two = 2;
|
|
static int __maybe_unused four = 4;
|
|
static unsigned long one_ul = 1;
|
|
+static unsigned long long_max = LONG_MAX;
|
|
static int one_hundred = 100;
|
|
static int one_thousand = 1000;
|
|
#ifdef CONFIG_PRINTK
|
|
@@ -1695,6 +1696,8 @@ static struct ctl_table fs_table[] = {
|
|
.maxlen = sizeof(files_stat.max_files),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
+ .extra1 = &zero,
|
|
+ .extra2 = &long_max,
|
|
},
|
|
{
|
|
.procname = "nr_open",
|
|
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
|
|
index 65bd4616220d..34b4c32b0692 100644
|
|
--- a/kernel/trace/ring_buffer.c
|
|
+++ b/kernel/trace/ring_buffer.c
|
|
@@ -4141,6 +4141,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume);
|
|
* ring_buffer_read_prepare - Prepare for a non consuming read of the buffer
|
|
* @buffer: The ring buffer to read from
|
|
* @cpu: The cpu buffer to iterate over
|
|
+ * @flags: gfp flags to use for memory allocation
|
|
*
|
|
* This performs the initial preparations necessary to iterate
|
|
* through the buffer. Memory is allocated, buffer recording
|
|
@@ -4158,7 +4159,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume);
|
|
* This overall must be paired with ring_buffer_read_finish.
|
|
*/
|
|
struct ring_buffer_iter *
|
|
-ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu)
|
|
+ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags)
|
|
{
|
|
struct ring_buffer_per_cpu *cpu_buffer;
|
|
struct ring_buffer_iter *iter;
|
|
@@ -4166,7 +4167,7 @@ ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu)
|
|
if (!cpumask_test_cpu(cpu, buffer->cpumask))
|
|
return NULL;
|
|
|
|
- iter = kmalloc(sizeof(*iter), GFP_KERNEL);
|
|
+ iter = kmalloc(sizeof(*iter), flags);
|
|
if (!iter)
|
|
return NULL;
|
|
|
|
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
index 1f96b292df31..c65cea71d1ee 100644
|
|
--- a/kernel/trace/trace.c
|
|
+++ b/kernel/trace/trace.c
|
|
@@ -3903,7 +3903,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
|
|
if (iter->cpu_file == RING_BUFFER_ALL_CPUS) {
|
|
for_each_tracing_cpu(cpu) {
|
|
iter->buffer_iter[cpu] =
|
|
- ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu);
|
|
+ ring_buffer_read_prepare(iter->trace_buffer->buffer,
|
|
+ cpu, GFP_KERNEL);
|
|
}
|
|
ring_buffer_read_prepare_sync();
|
|
for_each_tracing_cpu(cpu) {
|
|
@@ -3913,7 +3914,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
|
|
} else {
|
|
cpu = iter->cpu_file;
|
|
iter->buffer_iter[cpu] =
|
|
- ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu);
|
|
+ ring_buffer_read_prepare(iter->trace_buffer->buffer,
|
|
+ cpu, GFP_KERNEL);
|
|
ring_buffer_read_prepare_sync();
|
|
ring_buffer_read_start(iter->buffer_iter[cpu]);
|
|
tracing_iter_reset(iter, cpu);
|
|
diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c
|
|
index d953c163a079..810d78a8d14c 100644
|
|
--- a/kernel/trace/trace_kdb.c
|
|
+++ b/kernel/trace/trace_kdb.c
|
|
@@ -51,14 +51,16 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file)
|
|
if (cpu_file == RING_BUFFER_ALL_CPUS) {
|
|
for_each_tracing_cpu(cpu) {
|
|
iter.buffer_iter[cpu] =
|
|
- ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu);
|
|
+ ring_buffer_read_prepare(iter.trace_buffer->buffer,
|
|
+ cpu, GFP_ATOMIC);
|
|
ring_buffer_read_start(iter.buffer_iter[cpu]);
|
|
tracing_iter_reset(&iter, cpu);
|
|
}
|
|
} else {
|
|
iter.cpu_file = cpu_file;
|
|
iter.buffer_iter[cpu_file] =
|
|
- ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu_file);
|
|
+ ring_buffer_read_prepare(iter.trace_buffer->buffer,
|
|
+ cpu_file, GFP_ATOMIC);
|
|
ring_buffer_read_start(iter.buffer_iter[cpu_file]);
|
|
tracing_iter_reset(&iter, cpu_file);
|
|
}
|
|
diff --git a/lib/bsearch.c b/lib/bsearch.c
|
|
index 18b445b010c3..82512fe7b33c 100644
|
|
--- a/lib/bsearch.c
|
|
+++ b/lib/bsearch.c
|
|
@@ -11,6 +11,7 @@
|
|
|
|
#include <linux/export.h>
|
|
#include <linux/bsearch.h>
|
|
+#include <linux/kprobes.h>
|
|
|
|
/*
|
|
* bsearch - binary search an array of elements
|
|
@@ -53,3 +54,4 @@ void *bsearch(const void *key, const void *base, size_t num, size_t size,
|
|
return NULL;
|
|
}
|
|
EXPORT_SYMBOL(bsearch);
|
|
+NOKPROBE_SYMBOL(bsearch);
|
|
diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile
|
|
index 7ed43eaa02ef..5e0d55c54100 100644
|
|
--- a/lib/raid6/Makefile
|
|
+++ b/lib/raid6/Makefile
|
|
@@ -40,7 +40,7 @@ endif
|
|
ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
|
|
NEON_FLAGS := -ffreestanding
|
|
ifeq ($(ARCH),arm)
|
|
-NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon
|
|
+NEON_FLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon
|
|
endif
|
|
CFLAGS_recov_neon_inner.o += $(NEON_FLAGS)
|
|
ifeq ($(ARCH),arm64)
|
|
diff --git a/mm/cma.c b/mm/cma.c
|
|
index 4cb76121a3ab..bfe9f5397165 100644
|
|
--- a/mm/cma.c
|
|
+++ b/mm/cma.c
|
|
@@ -353,12 +353,14 @@ int __init cma_declare_contiguous(phys_addr_t base,
|
|
|
|
ret = cma_init_reserved_mem(base, size, order_per_bit, name, res_cma);
|
|
if (ret)
|
|
- goto err;
|
|
+ goto free_mem;
|
|
|
|
pr_info("Reserved %ld MiB at %pa\n", (unsigned long)size / SZ_1M,
|
|
&base);
|
|
return 0;
|
|
|
|
+free_mem:
|
|
+ memblock_free(base, size);
|
|
err:
|
|
pr_err("Failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M);
|
|
return ret;
|
|
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
|
|
index 9518aefd8cbb..7c712c4565e6 100644
|
|
--- a/mm/memcontrol.c
|
|
+++ b/mm/memcontrol.c
|
|
@@ -248,6 +248,12 @@ enum res_type {
|
|
iter != NULL; \
|
|
iter = mem_cgroup_iter(NULL, iter, NULL))
|
|
|
|
+static inline bool should_force_charge(void)
|
|
+{
|
|
+ return tsk_is_oom_victim(current) || fatal_signal_pending(current) ||
|
|
+ (current->flags & PF_EXITING);
|
|
+}
|
|
+
|
|
/* Some nice accessors for the vmpressure. */
|
|
struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg)
|
|
{
|
|
@@ -1382,8 +1388,13 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
|
|
};
|
|
bool ret;
|
|
|
|
- mutex_lock(&oom_lock);
|
|
- ret = out_of_memory(&oc);
|
|
+ if (mutex_lock_killable(&oom_lock))
|
|
+ return true;
|
|
+ /*
|
|
+ * A few threads which were not waiting at mutex_lock_killable() can
|
|
+ * fail to bail out. Therefore, check again after holding oom_lock.
|
|
+ */
|
|
+ ret = should_force_charge() || out_of_memory(&oc);
|
|
mutex_unlock(&oom_lock);
|
|
return ret;
|
|
}
|
|
@@ -2200,9 +2211,7 @@ retry:
|
|
* bypass the last charges so that they can exit quickly and
|
|
* free their memory.
|
|
*/
|
|
- if (unlikely(tsk_is_oom_victim(current) ||
|
|
- fatal_signal_pending(current) ||
|
|
- current->flags & PF_EXITING))
|
|
+ if (unlikely(should_force_charge()))
|
|
goto force;
|
|
|
|
/*
|
|
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
|
|
index f32d0a5be4fb..360b24bc69e5 100644
|
|
--- a/mm/mempolicy.c
|
|
+++ b/mm/mempolicy.c
|
|
@@ -350,7 +350,7 @@ static void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *newmask)
|
|
{
|
|
if (!pol)
|
|
return;
|
|
- if (!mpol_store_user_nodemask(pol) &&
|
|
+ if (!mpol_store_user_nodemask(pol) && !(pol->flags & MPOL_F_LOCAL) &&
|
|
nodes_equal(pol->w.cpuset_mems_allowed, *newmask))
|
|
return;
|
|
|
|
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
|
|
index e66ac8a47dd6..dbddb7a409dd 100644
|
|
--- a/mm/oom_kill.c
|
|
+++ b/mm/oom_kill.c
|
|
@@ -915,7 +915,8 @@ static void __oom_kill_process(struct task_struct *victim)
|
|
*/
|
|
static int oom_kill_memcg_member(struct task_struct *task, void *unused)
|
|
{
|
|
- if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN) {
|
|
+ if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN &&
|
|
+ !is_global_init(task)) {
|
|
get_task_struct(task);
|
|
__oom_kill_process(task);
|
|
}
|
|
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
|
index ef99971c13dd..8e6932a140b8 100644
|
|
--- a/mm/page_alloc.c
|
|
+++ b/mm/page_alloc.c
|
|
@@ -1922,8 +1922,8 @@ inline void post_alloc_hook(struct page *page, unsigned int order,
|
|
|
|
arch_alloc_page(page, order);
|
|
kernel_map_pages(page, 1 << order, 1);
|
|
- kernel_poison_pages(page, 1 << order, 1);
|
|
kasan_alloc_pages(page, order);
|
|
+ kernel_poison_pages(page, 1 << order, 1);
|
|
set_page_owner(page, order, gfp_flags);
|
|
}
|
|
|
|
diff --git a/mm/page_ext.c b/mm/page_ext.c
|
|
index 4961f13b6ec1..aad120123688 100644
|
|
--- a/mm/page_ext.c
|
|
+++ b/mm/page_ext.c
|
|
@@ -273,6 +273,7 @@ static void free_page_ext(void *addr)
|
|
table_size = get_entry_size() * PAGES_PER_SECTION;
|
|
|
|
BUG_ON(PageReserved(page));
|
|
+ kmemleak_free(addr);
|
|
free_pages_exact(addr, table_size);
|
|
}
|
|
}
|
|
diff --git a/mm/page_poison.c b/mm/page_poison.c
|
|
index aa2b3d34e8ea..6cfa8e7d7213 100644
|
|
--- a/mm/page_poison.c
|
|
+++ b/mm/page_poison.c
|
|
@@ -6,6 +6,7 @@
|
|
#include <linux/page_ext.h>
|
|
#include <linux/poison.h>
|
|
#include <linux/ratelimit.h>
|
|
+#include <linux/kasan.h>
|
|
|
|
static bool want_page_poisoning __read_mostly;
|
|
|
|
@@ -34,7 +35,10 @@ static void poison_page(struct page *page)
|
|
{
|
|
void *addr = kmap_atomic(page);
|
|
|
|
+ /* KASAN still think the page is in-use, so skip it. */
|
|
+ kasan_disable_current();
|
|
memset(addr, PAGE_POISON, PAGE_SIZE);
|
|
+ kasan_enable_current();
|
|
kunmap_atomic(addr);
|
|
}
|
|
|
|
diff --git a/mm/slab.c b/mm/slab.c
|
|
index 364e42d5a399..b8e0ec74330f 100644
|
|
--- a/mm/slab.c
|
|
+++ b/mm/slab.c
|
|
@@ -563,14 +563,6 @@ static void start_cpu_timer(int cpu)
|
|
|
|
static void init_arraycache(struct array_cache *ac, int limit, int batch)
|
|
{
|
|
- /*
|
|
- * The array_cache structures contain pointers to free object.
|
|
- * However, when such objects are allocated or transferred to another
|
|
- * cache the pointers are not cleared and they could be counted as
|
|
- * valid references during a kmemleak scan. Therefore, kmemleak must
|
|
- * not scan such objects.
|
|
- */
|
|
- kmemleak_no_scan(ac);
|
|
if (ac) {
|
|
ac->avail = 0;
|
|
ac->limit = limit;
|
|
@@ -586,6 +578,14 @@ static struct array_cache *alloc_arraycache(int node, int entries,
|
|
struct array_cache *ac = NULL;
|
|
|
|
ac = kmalloc_node(memsize, gfp, node);
|
|
+ /*
|
|
+ * The array_cache structures contain pointers to free object.
|
|
+ * However, when such objects are allocated or transferred to another
|
|
+ * cache the pointers are not cleared and they could be counted as
|
|
+ * valid references during a kmemleak scan. Therefore, kmemleak must
|
|
+ * not scan such objects.
|
|
+ */
|
|
+ kmemleak_no_scan(ac);
|
|
init_arraycache(ac, entries, batchcount);
|
|
return ac;
|
|
}
|
|
@@ -680,6 +680,7 @@ static struct alien_cache *__alloc_alien_cache(int node, int entries,
|
|
|
|
alc = kmalloc_node(memsize, gfp, node);
|
|
if (alc) {
|
|
+ kmemleak_no_scan(alc);
|
|
init_arraycache(&alc->ac, entries, batch);
|
|
spin_lock_init(&alc->lock);
|
|
}
|
|
diff --git a/mm/sparse.c b/mm/sparse.c
|
|
index 10b07eea9a6e..45950a074bdb 100644
|
|
--- a/mm/sparse.c
|
|
+++ b/mm/sparse.c
|
|
@@ -196,7 +196,7 @@ static inline int next_present_section_nr(int section_nr)
|
|
}
|
|
#define for_each_present_section_nr(start, section_nr) \
|
|
for (section_nr = next_present_section_nr(start-1); \
|
|
- ((section_nr >= 0) && \
|
|
+ ((section_nr != -1) && \
|
|
(section_nr <= __highest_present_section_nr)); \
|
|
section_nr = next_present_section_nr(section_nr))
|
|
|
|
diff --git a/mm/swapfile.c b/mm/swapfile.c
|
|
index 340ef3177686..0047dcaf9369 100644
|
|
--- a/mm/swapfile.c
|
|
+++ b/mm/swapfile.c
|
|
@@ -98,6 +98,15 @@ static atomic_t proc_poll_event = ATOMIC_INIT(0);
|
|
|
|
atomic_t nr_rotate_swap = ATOMIC_INIT(0);
|
|
|
|
+static struct swap_info_struct *swap_type_to_swap_info(int type)
|
|
+{
|
|
+ if (type >= READ_ONCE(nr_swapfiles))
|
|
+ return NULL;
|
|
+
|
|
+ smp_rmb(); /* Pairs with smp_wmb in alloc_swap_info. */
|
|
+ return READ_ONCE(swap_info[type]);
|
|
+}
|
|
+
|
|
static inline unsigned char swap_count(unsigned char ent)
|
|
{
|
|
return ent & ~SWAP_HAS_CACHE; /* may include COUNT_CONTINUED flag */
|
|
@@ -1030,12 +1039,14 @@ noswap:
|
|
/* The only caller of this function is now suspend routine */
|
|
swp_entry_t get_swap_page_of_type(int type)
|
|
{
|
|
- struct swap_info_struct *si;
|
|
+ struct swap_info_struct *si = swap_type_to_swap_info(type);
|
|
pgoff_t offset;
|
|
|
|
- si = swap_info[type];
|
|
+ if (!si)
|
|
+ goto fail;
|
|
+
|
|
spin_lock(&si->lock);
|
|
- if (si && (si->flags & SWP_WRITEOK)) {
|
|
+ if (si->flags & SWP_WRITEOK) {
|
|
atomic_long_dec(&nr_swap_pages);
|
|
/* This is called for allocating swap entry, not cache */
|
|
offset = scan_swap_map(si, 1);
|
|
@@ -1046,6 +1057,7 @@ swp_entry_t get_swap_page_of_type(int type)
|
|
atomic_long_inc(&nr_swap_pages);
|
|
}
|
|
spin_unlock(&si->lock);
|
|
+fail:
|
|
return (swp_entry_t) {0};
|
|
}
|
|
|
|
@@ -1057,9 +1069,9 @@ static struct swap_info_struct *__swap_info_get(swp_entry_t entry)
|
|
if (!entry.val)
|
|
goto out;
|
|
type = swp_type(entry);
|
|
- if (type >= nr_swapfiles)
|
|
+ p = swap_type_to_swap_info(type);
|
|
+ if (!p)
|
|
goto bad_nofile;
|
|
- p = swap_info[type];
|
|
if (!(p->flags & SWP_USED))
|
|
goto bad_device;
|
|
offset = swp_offset(entry);
|
|
@@ -1708,10 +1720,9 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p)
|
|
sector_t swapdev_block(int type, pgoff_t offset)
|
|
{
|
|
struct block_device *bdev;
|
|
+ struct swap_info_struct *si = swap_type_to_swap_info(type);
|
|
|
|
- if ((unsigned int)type >= nr_swapfiles)
|
|
- return 0;
|
|
- if (!(swap_info[type]->flags & SWP_WRITEOK))
|
|
+ if (!si || !(si->flags & SWP_WRITEOK))
|
|
return 0;
|
|
return map_swap_entry(swp_entry(type, offset), &bdev);
|
|
}
|
|
@@ -2269,7 +2280,7 @@ static sector_t map_swap_entry(swp_entry_t entry, struct block_device **bdev)
|
|
struct swap_extent *se;
|
|
pgoff_t offset;
|
|
|
|
- sis = swap_info[swp_type(entry)];
|
|
+ sis = swp_swap_info(entry);
|
|
*bdev = sis->bdev;
|
|
|
|
offset = swp_offset(entry);
|
|
@@ -2707,9 +2718,7 @@ static void *swap_start(struct seq_file *swap, loff_t *pos)
|
|
if (!l)
|
|
return SEQ_START_TOKEN;
|
|
|
|
- for (type = 0; type < nr_swapfiles; type++) {
|
|
- smp_rmb(); /* read nr_swapfiles before swap_info[type] */
|
|
- si = swap_info[type];
|
|
+ for (type = 0; (si = swap_type_to_swap_info(type)); type++) {
|
|
if (!(si->flags & SWP_USED) || !si->swap_map)
|
|
continue;
|
|
if (!--l)
|
|
@@ -2729,9 +2738,7 @@ static void *swap_next(struct seq_file *swap, void *v, loff_t *pos)
|
|
else
|
|
type = si->type + 1;
|
|
|
|
- for (; type < nr_swapfiles; type++) {
|
|
- smp_rmb(); /* read nr_swapfiles before swap_info[type] */
|
|
- si = swap_info[type];
|
|
+ for (; (si = swap_type_to_swap_info(type)); type++) {
|
|
if (!(si->flags & SWP_USED) || !si->swap_map)
|
|
continue;
|
|
++*pos;
|
|
@@ -2838,14 +2845,14 @@ static struct swap_info_struct *alloc_swap_info(void)
|
|
}
|
|
if (type >= nr_swapfiles) {
|
|
p->type = type;
|
|
- swap_info[type] = p;
|
|
+ WRITE_ONCE(swap_info[type], p);
|
|
/*
|
|
* Write swap_info[type] before nr_swapfiles, in case a
|
|
* racing procfs swap_start() or swap_next() is reading them.
|
|
* (We never shrink nr_swapfiles, we never free this entry.)
|
|
*/
|
|
smp_wmb();
|
|
- nr_swapfiles++;
|
|
+ WRITE_ONCE(nr_swapfiles, nr_swapfiles + 1);
|
|
} else {
|
|
kvfree(p);
|
|
p = swap_info[type];
|
|
@@ -3365,7 +3372,7 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage)
|
|
{
|
|
struct swap_info_struct *p;
|
|
struct swap_cluster_info *ci;
|
|
- unsigned long offset, type;
|
|
+ unsigned long offset;
|
|
unsigned char count;
|
|
unsigned char has_cache;
|
|
int err = -EINVAL;
|
|
@@ -3373,10 +3380,10 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage)
|
|
if (non_swap_entry(entry))
|
|
goto out;
|
|
|
|
- type = swp_type(entry);
|
|
- if (type >= nr_swapfiles)
|
|
+ p = swp_swap_info(entry);
|
|
+ if (!p)
|
|
goto bad_file;
|
|
- p = swap_info[type];
|
|
+
|
|
offset = swp_offset(entry);
|
|
if (unlikely(offset >= p->max))
|
|
goto out;
|
|
@@ -3473,7 +3480,7 @@ int swapcache_prepare(swp_entry_t entry)
|
|
|
|
struct swap_info_struct *swp_swap_info(swp_entry_t entry)
|
|
{
|
|
- return swap_info[swp_type(entry)];
|
|
+ return swap_type_to_swap_info(swp_type(entry));
|
|
}
|
|
|
|
struct swap_info_struct *page_swap_info(struct page *page)
|
|
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
|
|
index 91a789a46b12..a46ec261a44e 100644
|
|
--- a/mm/vmalloc.c
|
|
+++ b/mm/vmalloc.c
|
|
@@ -498,7 +498,11 @@ nocache:
|
|
}
|
|
|
|
found:
|
|
- if (addr + size > vend)
|
|
+ /*
|
|
+ * Check also calculated address against the vstart,
|
|
+ * because it can be 0 because of big align request.
|
|
+ */
|
|
+ if (addr + size > vend || addr < vstart)
|
|
goto overflow;
|
|
|
|
va->va_start = addr;
|
|
diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c
|
|
index e07a7e62c705..3b0a03b92080 100644
|
|
--- a/net/bridge/br_netfilter_hooks.c
|
|
+++ b/net/bridge/br_netfilter_hooks.c
|
|
@@ -884,11 +884,6 @@ static const struct nf_br_ops br_ops = {
|
|
.br_dev_xmit_hook = br_nf_dev_xmit,
|
|
};
|
|
|
|
-void br_netfilter_enable(void)
|
|
-{
|
|
-}
|
|
-EXPORT_SYMBOL_GPL(br_netfilter_enable);
|
|
-
|
|
/* For br_nf_post_routing, we need (prio = NF_BR_PRI_LAST), because
|
|
* br_dev_queue_push_xmit is called afterwards */
|
|
static const struct nf_hook_ops br_nf_ops[] = {
|
|
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
|
|
index 895171a2e1f1..9a249478abf2 100644
|
|
--- a/net/netfilter/nf_conntrack_core.c
|
|
+++ b/net/netfilter/nf_conntrack_core.c
|
|
@@ -901,10 +901,18 @@ __nf_conntrack_confirm(struct sk_buff *skb)
|
|
* REJECT will give spurious warnings here.
|
|
*/
|
|
|
|
- /* No external references means no one else could have
|
|
- * confirmed us.
|
|
+ /* Another skb with the same unconfirmed conntrack may
|
|
+ * win the race. This may happen for bridge(br_flood)
|
|
+ * or broadcast/multicast packets do skb_clone with
|
|
+ * unconfirmed conntrack.
|
|
*/
|
|
- WARN_ON(nf_ct_is_confirmed(ct));
|
|
+ if (unlikely(nf_ct_is_confirmed(ct))) {
|
|
+ WARN_ON_ONCE(1);
|
|
+ nf_conntrack_double_unlock(hash, reply_hash);
|
|
+ local_bh_enable();
|
|
+ return NF_DROP;
|
|
+ }
|
|
+
|
|
pr_debug("Confirming conntrack %p\n", ct);
|
|
/* We have to check the DYING flag after unlink to prevent
|
|
* a race against nf_ct_get_next_corpse() possibly called from
|
|
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
|
|
index 247b89784a6f..842f3f86fb2e 100644
|
|
--- a/net/netfilter/nf_conntrack_proto_tcp.c
|
|
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
|
|
@@ -769,6 +769,12 @@ static int tcp_error(struct net *net, struct nf_conn *tmpl,
|
|
return NF_ACCEPT;
|
|
}
|
|
|
|
+static bool nf_conntrack_tcp_established(const struct nf_conn *ct)
|
|
+{
|
|
+ return ct->proto.tcp.state == TCP_CONNTRACK_ESTABLISHED &&
|
|
+ test_bit(IPS_ASSURED_BIT, &ct->status);
|
|
+}
|
|
+
|
|
/* Returns verdict for packet, or -1 for invalid. */
|
|
static int tcp_packet(struct nf_conn *ct,
|
|
const struct sk_buff *skb,
|
|
@@ -963,16 +969,38 @@ static int tcp_packet(struct nf_conn *ct,
|
|
new_state = TCP_CONNTRACK_ESTABLISHED;
|
|
break;
|
|
case TCP_CONNTRACK_CLOSE:
|
|
- if (index == TCP_RST_SET
|
|
- && (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET)
|
|
- && before(ntohl(th->seq), ct->proto.tcp.seen[!dir].td_maxack)) {
|
|
- /* Invalid RST */
|
|
- spin_unlock_bh(&ct->lock);
|
|
- nf_ct_l4proto_log_invalid(skb, ct, "invalid rst");
|
|
- return -NF_ACCEPT;
|
|
+ if (index != TCP_RST_SET)
|
|
+ break;
|
|
+
|
|
+ if (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) {
|
|
+ u32 seq = ntohl(th->seq);
|
|
+
|
|
+ if (before(seq, ct->proto.tcp.seen[!dir].td_maxack)) {
|
|
+ /* Invalid RST */
|
|
+ spin_unlock_bh(&ct->lock);
|
|
+ nf_ct_l4proto_log_invalid(skb, ct, "invalid rst");
|
|
+ return -NF_ACCEPT;
|
|
+ }
|
|
+
|
|
+ if (!nf_conntrack_tcp_established(ct) ||
|
|
+ seq == ct->proto.tcp.seen[!dir].td_maxack)
|
|
+ break;
|
|
+
|
|
+ /* Check if rst is part of train, such as
|
|
+ * foo:80 > bar:4379: P, 235946583:235946602(19) ack 42
|
|
+ * foo:80 > bar:4379: R, 235946602:235946602(0) ack 42
|
|
+ */
|
|
+ if (ct->proto.tcp.last_index == TCP_ACK_SET &&
|
|
+ ct->proto.tcp.last_dir == dir &&
|
|
+ seq == ct->proto.tcp.last_end)
|
|
+ break;
|
|
+
|
|
+ /* ... RST sequence number doesn't match exactly, keep
|
|
+ * established state to allow a possible challenge ACK.
|
|
+ */
|
|
+ new_state = old_state;
|
|
}
|
|
- if (index == TCP_RST_SET
|
|
- && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status)
|
|
+ if (((test_bit(IPS_SEEN_REPLY_BIT, &ct->status)
|
|
&& ct->proto.tcp.last_index == TCP_SYN_SET)
|
|
|| (!test_bit(IPS_ASSURED_BIT, &ct->status)
|
|
&& ct->proto.tcp.last_index == TCP_ACK_SET))
|
|
@@ -988,7 +1016,7 @@ static int tcp_packet(struct nf_conn *ct,
|
|
* segments we ignored. */
|
|
goto in_window;
|
|
}
|
|
- /* Just fall through */
|
|
+ break;
|
|
default:
|
|
/* Keep compilers happy. */
|
|
break;
|
|
@@ -1023,6 +1051,8 @@ static int tcp_packet(struct nf_conn *ct,
|
|
if (ct->proto.tcp.retrans >= tn->tcp_max_retrans &&
|
|
timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS])
|
|
timeout = timeouts[TCP_CONNTRACK_RETRANS];
|
|
+ else if (unlikely(index == TCP_RST_SET))
|
|
+ timeout = timeouts[TCP_CONNTRACK_CLOSE];
|
|
else if ((ct->proto.tcp.seen[0].flags | ct->proto.tcp.seen[1].flags) &
|
|
IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED &&
|
|
timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK])
|
|
diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c
|
|
index 60f258f2c707..a3850414dba2 100644
|
|
--- a/net/netfilter/nf_tables_core.c
|
|
+++ b/net/netfilter/nf_tables_core.c
|
|
@@ -98,21 +98,23 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain,
|
|
const struct nft_pktinfo *pkt)
|
|
{
|
|
struct nft_base_chain *base_chain;
|
|
+ struct nft_stats __percpu *pstats;
|
|
struct nft_stats *stats;
|
|
|
|
base_chain = nft_base_chain(chain);
|
|
- if (!rcu_access_pointer(base_chain->stats))
|
|
- return;
|
|
|
|
- local_bh_disable();
|
|
- stats = this_cpu_ptr(rcu_dereference(base_chain->stats));
|
|
- if (stats) {
|
|
+ rcu_read_lock();
|
|
+ pstats = READ_ONCE(base_chain->stats);
|
|
+ if (pstats) {
|
|
+ local_bh_disable();
|
|
+ stats = this_cpu_ptr(pstats);
|
|
u64_stats_update_begin(&stats->syncp);
|
|
stats->pkts++;
|
|
stats->bytes += pkt->skb->len;
|
|
u64_stats_update_end(&stats->syncp);
|
|
+ local_bh_enable();
|
|
}
|
|
- local_bh_enable();
|
|
+ rcu_read_unlock();
|
|
}
|
|
|
|
struct nft_jumpstack {
|
|
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c
|
|
index 9d6d67b953ac..05f00fb20b04 100644
|
|
--- a/net/netfilter/xt_physdev.c
|
|
+++ b/net/netfilter/xt_physdev.c
|
|
@@ -96,8 +96,7 @@ match_outdev:
|
|
static int physdev_mt_check(const struct xt_mtchk_param *par)
|
|
{
|
|
const struct xt_physdev_info *info = par->matchinfo;
|
|
-
|
|
- br_netfilter_enable();
|
|
+ static bool brnf_probed __read_mostly;
|
|
|
|
if (!(info->bitmask & XT_PHYSDEV_OP_MASK) ||
|
|
info->bitmask & ~XT_PHYSDEV_OP_MASK)
|
|
@@ -111,6 +110,12 @@ static int physdev_mt_check(const struct xt_mtchk_param *par)
|
|
if (par->hook_mask & (1 << NF_INET_LOCAL_OUT))
|
|
return -EINVAL;
|
|
}
|
|
+
|
|
+ if (!brnf_probed) {
|
|
+ brnf_probed = true;
|
|
+ request_module("br_netfilter");
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
|
index 6ea3d3aa1a1e..4337b6d9369e 100644
|
|
--- a/security/selinux/hooks.c
|
|
+++ b/security/selinux/hooks.c
|
|
@@ -3458,12 +3458,16 @@ static int selinux_inode_setsecurity(struct inode *inode, const char *name,
|
|
const void *value, size_t size, int flags)
|
|
{
|
|
struct inode_security_struct *isec = inode_security_novalidate(inode);
|
|
+ struct superblock_security_struct *sbsec = inode->i_sb->s_security;
|
|
u32 newsid;
|
|
int rc;
|
|
|
|
if (strcmp(name, XATTR_SELINUX_SUFFIX))
|
|
return -EOPNOTSUPP;
|
|
|
|
+ if (!(sbsec->flags & SBLABEL_MNT))
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
if (!value || !size)
|
|
return -EACCES;
|
|
|
|
@@ -6612,7 +6616,10 @@ static void selinux_inode_invalidate_secctx(struct inode *inode)
|
|
*/
|
|
static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
|
|
{
|
|
- return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
|
|
+ int rc = selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX,
|
|
+ ctx, ctxlen, 0);
|
|
+ /* Do not return error when suppressing label (SBLABEL_MNT not set). */
|
|
+ return rc == -EOPNOTSUPP ? 0 : rc;
|
|
}
|
|
|
|
/*
|
|
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
|
|
index b67f6fe08a1b..e08c6c6ca029 100644
|
|
--- a/sound/core/pcm_native.c
|
|
+++ b/sound/core/pcm_native.c
|
|
@@ -1513,6 +1513,14 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm)
|
|
/* FIXME: the open/close code should lock this as well */
|
|
if (substream->runtime == NULL)
|
|
continue;
|
|
+
|
|
+ /*
|
|
+ * Skip BE dai link PCM's that are internal and may
|
|
+ * not have their substream ops set.
|
|
+ */
|
|
+ if (!substream->ops)
|
|
+ continue;
|
|
+
|
|
err = snd_pcm_suspend(substream);
|
|
if (err < 0 && err != -EBUSY)
|
|
return err;
|
|
diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c
|
|
index 774eb2205668..3d600f498914 100644
|
|
--- a/sound/firewire/dice/dice.c
|
|
+++ b/sound/firewire/dice/dice.c
|
|
@@ -18,6 +18,7 @@ MODULE_LICENSE("GPL v2");
|
|
#define OUI_ALESIS 0x000595
|
|
#define OUI_MAUDIO 0x000d6c
|
|
#define OUI_MYTEK 0x001ee8
|
|
+#define OUI_SSL 0x0050c2 // Actually ID reserved by IEEE.
|
|
|
|
#define DICE_CATEGORY_ID 0x04
|
|
#define WEISS_CATEGORY_ID 0x00
|
|
@@ -216,7 +217,7 @@ static int dice_probe(struct fw_unit *unit,
|
|
struct snd_dice *dice;
|
|
int err;
|
|
|
|
- if (!entry->driver_data) {
|
|
+ if (!entry->driver_data && entry->vendor_id != OUI_SSL) {
|
|
err = check_dice_category(unit);
|
|
if (err < 0)
|
|
return -ENODEV;
|
|
@@ -382,6 +383,15 @@ static const struct ieee1394_device_id dice_id_table[] = {
|
|
.model_id = 0x000002,
|
|
.driver_data = (kernel_ulong_t)snd_dice_detect_mytek_formats,
|
|
},
|
|
+ // Solid State Logic, Duende Classic and Mini.
|
|
+ // NOTE: each field of GUID in config ROM is not compliant to standard
|
|
+ // DICE scheme.
|
|
+ {
|
|
+ .match_flags = IEEE1394_MATCH_VENDOR_ID |
|
|
+ IEEE1394_MATCH_MODEL_ID,
|
|
+ .vendor_id = OUI_SSL,
|
|
+ .model_id = 0x000070,
|
|
+ },
|
|
{
|
|
.match_flags = IEEE1394_MATCH_VERSION,
|
|
.version = DICE_INTERFACE,
|
|
diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c
|
|
index 44433b20435c..600d9be9706e 100644
|
|
--- a/sound/soc/fsl/fsl-asoc-card.c
|
|
+++ b/sound/soc/fsl/fsl-asoc-card.c
|
|
@@ -689,6 +689,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|
asrc_fail:
|
|
of_node_put(asrc_np);
|
|
of_node_put(codec_np);
|
|
+ put_device(&cpu_pdev->dev);
|
|
fail:
|
|
of_node_put(cpu_np);
|
|
|
|
diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c
|
|
index c29200cf755a..9b9a7ec52905 100644
|
|
--- a/sound/soc/fsl/imx-sgtl5000.c
|
|
+++ b/sound/soc/fsl/imx-sgtl5000.c
|
|
@@ -108,6 +108,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
|
|
ret = -EPROBE_DEFER;
|
|
goto fail;
|
|
}
|
|
+ put_device(&ssi_pdev->dev);
|
|
codec_dev = of_find_i2c_device_by_node(codec_np);
|
|
if (!codec_dev) {
|
|
dev_err(&pdev->dev, "failed to find codec platform device\n");
|
|
diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c
|
|
index 4715527054e5..5661025e8cec 100644
|
|
--- a/sound/soc/qcom/common.c
|
|
+++ b/sound/soc/qcom/common.c
|
|
@@ -42,6 +42,9 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
|
|
link = card->dai_link;
|
|
for_each_child_of_node(dev->of_node, np) {
|
|
cpu = of_get_child_by_name(np, "cpu");
|
|
+ platform = of_get_child_by_name(np, "platform");
|
|
+ codec = of_get_child_by_name(np, "codec");
|
|
+
|
|
if (!cpu) {
|
|
dev_err(dev, "Can't find cpu DT node\n");
|
|
ret = -EINVAL;
|
|
@@ -63,8 +66,6 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
|
|
goto err;
|
|
}
|
|
|
|
- platform = of_get_child_by_name(np, "platform");
|
|
- codec = of_get_child_by_name(np, "codec");
|
|
if (codec && platform) {
|
|
link->platform_of_node = of_parse_phandle(platform,
|
|
"sound-dai",
|
|
@@ -100,10 +101,15 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
|
|
link->dpcm_capture = 1;
|
|
link->stream_name = link->name;
|
|
link++;
|
|
+
|
|
+ of_node_put(cpu);
|
|
+ of_node_put(codec);
|
|
+ of_node_put(platform);
|
|
}
|
|
|
|
return 0;
|
|
err:
|
|
+ of_node_put(np);
|
|
of_node_put(cpu);
|
|
of_node_put(codec);
|
|
of_node_put(platform);
|
|
diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile
|
|
index d49902e818b5..3624557550a1 100644
|
|
--- a/tools/lib/bpf/Makefile
|
|
+++ b/tools/lib/bpf/Makefile
|
|
@@ -149,7 +149,8 @@ CMD_TARGETS = $(LIB_FILE)
|
|
|
|
TARGETS = $(CMD_TARGETS)
|
|
|
|
-all: fixdep all_cmd
|
|
+all: fixdep
|
|
+ $(Q)$(MAKE) all_cmd
|
|
|
|
all_cmd: $(CMD_TARGETS)
|
|
|
|
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
|
|
index 75de355a63d6..10985d991ed2 100644
|
|
--- a/tools/lib/traceevent/event-parse.c
|
|
+++ b/tools/lib/traceevent/event-parse.c
|
|
@@ -2416,7 +2416,7 @@ static int arg_num_eval(struct print_arg *arg, long long *val)
|
|
static char *arg_eval (struct print_arg *arg)
|
|
{
|
|
long long val;
|
|
- static char buf[20];
|
|
+ static char buf[24];
|
|
|
|
switch (arg->type) {
|
|
case PRINT_ATOM:
|
|
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
|
|
index f3aa9d02a5ab..763c2edf52e7 100644
|
|
--- a/tools/perf/builtin-c2c.c
|
|
+++ b/tools/perf/builtin-c2c.c
|
|
@@ -2055,6 +2055,12 @@ static int setup_nodes(struct perf_session *session)
|
|
if (!set)
|
|
return -ENOMEM;
|
|
|
|
+ nodes[node] = set;
|
|
+
|
|
+ /* empty node, skip */
|
|
+ if (cpu_map__empty(map))
|
|
+ continue;
|
|
+
|
|
for (cpu = 0; cpu < map->nr; cpu++) {
|
|
set_bit(map->map[cpu], set);
|
|
|
|
@@ -2063,8 +2069,6 @@ static int setup_nodes(struct perf_session *session)
|
|
|
|
cpu2node[map->map[cpu]] = node;
|
|
}
|
|
-
|
|
- nodes[node] = set;
|
|
}
|
|
|
|
setup_nodes_header();
|
|
diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c
|
|
index 67bcbf876776..d0406116c905 100644
|
|
--- a/tools/perf/tests/evsel-tp-sched.c
|
|
+++ b/tools/perf/tests/evsel-tp-sched.c
|
|
@@ -43,7 +43,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes
|
|
return -1;
|
|
}
|
|
|
|
- if (perf_evsel__test_field(evsel, "prev_comm", 16, true))
|
|
+ if (perf_evsel__test_field(evsel, "prev_comm", 16, false))
|
|
ret = -1;
|
|
|
|
if (perf_evsel__test_field(evsel, "prev_pid", 4, true))
|
|
@@ -55,7 +55,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes
|
|
if (perf_evsel__test_field(evsel, "prev_state", sizeof(long), true))
|
|
ret = -1;
|
|
|
|
- if (perf_evsel__test_field(evsel, "next_comm", 16, true))
|
|
+ if (perf_evsel__test_field(evsel, "next_comm", 16, false))
|
|
ret = -1;
|
|
|
|
if (perf_evsel__test_field(evsel, "next_pid", 4, true))
|
|
@@ -73,7 +73,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes
|
|
return -1;
|
|
}
|
|
|
|
- if (perf_evsel__test_field(evsel, "comm", 16, true))
|
|
+ if (perf_evsel__test_field(evsel, "comm", 16, false))
|
|
ret = -1;
|
|
|
|
if (perf_evsel__test_field(evsel, "pid", 4, true))
|
|
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
|
|
index 28cd6a17491b..dfee110b3a58 100644
|
|
--- a/tools/perf/util/annotate.c
|
|
+++ b/tools/perf/util/annotate.c
|
|
@@ -1862,6 +1862,7 @@ int symbol__annotate(struct symbol *sym, struct map *map,
|
|
struct annotation_options *options,
|
|
struct arch **parch)
|
|
{
|
|
+ struct annotation *notes = symbol__annotation(sym);
|
|
struct annotate_args args = {
|
|
.privsize = privsize,
|
|
.evsel = evsel,
|
|
@@ -1892,6 +1893,7 @@ int symbol__annotate(struct symbol *sym, struct map *map,
|
|
|
|
args.ms.map = map;
|
|
args.ms.sym = sym;
|
|
+ notes->start = map__rip_2objdump(map, sym->start);
|
|
|
|
return symbol__disassemble(sym, &args);
|
|
}
|
|
@@ -2746,8 +2748,6 @@ int symbol__annotate2(struct symbol *sym, struct map *map, struct perf_evsel *ev
|
|
|
|
symbol__calc_percent(sym, evsel);
|
|
|
|
- notes->start = map__rip_2objdump(map, sym->start);
|
|
-
|
|
annotation__set_offsets(notes, size);
|
|
annotation__mark_jump_targets(notes, sym);
|
|
annotation__compute_ipc(notes, size);
|
|
diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c
|
|
index aa7f8c11fbb7..910f2621d211 100644
|
|
--- a/tools/perf/util/s390-cpumsf.c
|
|
+++ b/tools/perf/util/s390-cpumsf.c
|
|
@@ -294,6 +294,11 @@ static bool s390_cpumsf_validate(int machine_type,
|
|
*dsdes = 85;
|
|
*bsdes = 32;
|
|
break;
|
|
+ case 2964:
|
|
+ case 2965:
|
|
+ *dsdes = 112;
|
|
+ *bsdes = 32;
|
|
+ break;
|
|
default:
|
|
/* Illegal trailer entry */
|
|
return false;
|
|
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
|
|
index 05d95de14e20..9569cc06e0a7 100644
|
|
--- a/tools/perf/util/scripting-engines/trace-event-python.c
|
|
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
|
|
@@ -733,8 +733,7 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
|
|
Py_FatalError("couldn't create Python dictionary");
|
|
|
|
pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel)));
|
|
- pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize(
|
|
- (const char *)&evsel->attr, sizeof(evsel->attr)));
|
|
+ pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->attr, sizeof(evsel->attr)));
|
|
|
|
pydict_set_item_string_decref(dict_sample, "pid",
|
|
_PyLong_FromLong(sample->pid));
|
|
@@ -1494,34 +1493,40 @@ static void _free_command_line(wchar_t **command_line, int num)
|
|
static int python_start_script(const char *script, int argc, const char **argv)
|
|
{
|
|
struct tables *tables = &tables_global;
|
|
+ PyMODINIT_FUNC (*initfunc)(void);
|
|
#if PY_MAJOR_VERSION < 3
|
|
const char **command_line;
|
|
#else
|
|
wchar_t **command_line;
|
|
#endif
|
|
- char buf[PATH_MAX];
|
|
+ /*
|
|
+ * Use a non-const name variable to cope with python 2.6's
|
|
+ * PyImport_AppendInittab prototype
|
|
+ */
|
|
+ char buf[PATH_MAX], name[19] = "perf_trace_context";
|
|
int i, err = 0;
|
|
FILE *fp;
|
|
|
|
#if PY_MAJOR_VERSION < 3
|
|
+ initfunc = initperf_trace_context;
|
|
command_line = malloc((argc + 1) * sizeof(const char *));
|
|
command_line[0] = script;
|
|
for (i = 1; i < argc + 1; i++)
|
|
command_line[i] = argv[i - 1];
|
|
#else
|
|
+ initfunc = PyInit_perf_trace_context;
|
|
command_line = malloc((argc + 1) * sizeof(wchar_t *));
|
|
command_line[0] = Py_DecodeLocale(script, NULL);
|
|
for (i = 1; i < argc + 1; i++)
|
|
command_line[i] = Py_DecodeLocale(argv[i - 1], NULL);
|
|
#endif
|
|
|
|
+ PyImport_AppendInittab(name, initfunc);
|
|
Py_Initialize();
|
|
|
|
#if PY_MAJOR_VERSION < 3
|
|
- initperf_trace_context();
|
|
PySys_SetArgv(argc + 1, (char **)command_line);
|
|
#else
|
|
- PyInit_perf_trace_context();
|
|
PySys_SetArgv(argc + 1, command_line);
|
|
#endif
|
|
|
|
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
|
|
index b284276ec963..46daa22b86e3 100644
|
|
--- a/tools/perf/util/sort.c
|
|
+++ b/tools/perf/util/sort.c
|
|
@@ -229,8 +229,14 @@ static int64_t _sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r)
|
|
if (sym_l == sym_r)
|
|
return 0;
|
|
|
|
- if (sym_l->inlined || sym_r->inlined)
|
|
- return strcmp(sym_l->name, sym_r->name);
|
|
+ if (sym_l->inlined || sym_r->inlined) {
|
|
+ int ret = strcmp(sym_l->name, sym_r->name);
|
|
+
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ if ((sym_l->start <= sym_r->end) && (sym_l->end >= sym_r->start))
|
|
+ return 0;
|
|
+ }
|
|
|
|
if (sym_l->start != sym_r->start)
|
|
return (int64_t)(sym_r->start - sym_l->start);
|
|
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
|
|
index e767c4a9d4d2..af3f9b9f1e8b 100644
|
|
--- a/tools/perf/util/srcline.c
|
|
+++ b/tools/perf/util/srcline.c
|
|
@@ -104,7 +104,7 @@ static struct symbol *new_inline_sym(struct dso *dso,
|
|
} else {
|
|
/* create a fake symbol for the inline frame */
|
|
inline_sym = symbol__new(base_sym ? base_sym->start : 0,
|
|
- base_sym ? base_sym->end : 0,
|
|
+ base_sym ? (base_sym->end - base_sym->start) : 0,
|
|
base_sym ? base_sym->binding : 0,
|
|
base_sym ? base_sym->type : 0,
|
|
funcname);
|
|
diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
|
|
index 9db5a7378f40..294fc18aba2a 100644
|
|
--- a/tools/testing/selftests/bpf/test_verifier.c
|
|
+++ b/tools/testing/selftests/bpf/test_verifier.c
|
|
@@ -32,6 +32,7 @@
|
|
#include <linux/if_ether.h>
|
|
|
|
#include <bpf/bpf.h>
|
|
+#include <bpf/libbpf.h>
|
|
|
|
#ifdef HAVE_GENHDR
|
|
# include "autoconf.h"
|
|
@@ -56,6 +57,7 @@
|
|
|
|
#define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled"
|
|
static bool unpriv_disabled = false;
|
|
+static int skips;
|
|
|
|
struct bpf_test {
|
|
const char *descr;
|
|
@@ -12770,6 +12772,11 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
|
|
fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
|
|
prog, prog_len, test->flags & F_LOAD_WITH_STRICT_ALIGNMENT,
|
|
"GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1);
|
|
+ if (fd_prog < 0 && !bpf_probe_prog_type(prog_type, 0)) {
|
|
+ printf("SKIP (unsupported program type %d)\n", prog_type);
|
|
+ skips++;
|
|
+ goto close_fds;
|
|
+ }
|
|
|
|
expected_ret = unpriv && test->result_unpriv != UNDEF ?
|
|
test->result_unpriv : test->result;
|
|
@@ -12905,7 +12912,7 @@ static void get_unpriv_disabled()
|
|
|
|
static int do_test(bool unpriv, unsigned int from, unsigned int to)
|
|
{
|
|
- int i, passes = 0, errors = 0, skips = 0;
|
|
+ int i, passes = 0, errors = 0;
|
|
|
|
for (i = from; i < to; i++) {
|
|
struct bpf_test *test = &tests[i];
|
|
diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
|
|
index 83057fa9d391..14cad657bc6a 100644
|
|
--- a/tools/testing/selftests/seccomp/seccomp_bpf.c
|
|
+++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
|
|
@@ -2920,6 +2920,12 @@ TEST(get_metadata)
|
|
struct seccomp_metadata md;
|
|
long ret;
|
|
|
|
+ /* Only real root can get metadata. */
|
|
+ if (geteuid()) {
|
|
+ XFAIL(return, "get_metadata requires real root");
|
|
+ return;
|
|
+ }
|
|
+
|
|
ASSERT_EQ(0, pipe(pipefd));
|
|
|
|
pid = fork();
|