ARM: dts: imx53-qsb: disable 1.2GHz OPP
Sasha Levin
maintainerPATCH 1/27 ARM: dts: imx53-qsb: disable 1.2GHz OPP
From: Sascha Hauer <[email protected]>
[ Upstream commit eea96566c189c77e5272585984eb2729881a2f1d ]
The maximum CPU frequency for the i.MX53 QSB is 1GHz, so disable the 1.2GHz OPP. This makes the board work again with configs that have cpufreq enabled like imx_v6_v7_defconfig on which the board stopped working with the addition of cpufreq-dt support.
--- arch/arm/boot/dts/imx53-qsb-common.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/arm/boot/dts/imx53-qsb-common.dtsi +11 -0
@@ -123,6 +123,17 @@ }; }; +&cpu0 { + /* CPU rated to 1GHz, not 1.2GHz as per the default settings */ + operating-points = < + /* kHz uV */ + 166666 850000 + 400000 900000 + 800000 1050000 + 1000000 1200000 + >; +}; + &esdhc1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_esdhc1>;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 2/27 s390/hibernate: fix error handling when suspend cpu != resume cpu
From: Gerald Schaefer <[email protected]>
[ Upstream commit 55a5542a546238354d1f209f794414168cf8c71d ]
The resume code checks if the resume cpu is the same as the suspend cpu. If not, and if it is also not possible to switch to the suspend cpu, an error message should be printed and the resume process should be stopped by loading a disabled wait psw.
The current logic is broken in multiple ways, the message is never printed, and the disabled wait psw never loaded because the kernel panics before that:
- sam31 and SIGP_SET_ARCHITECTURE to ESA mode is wrong, this will break on the first 64bit instruction in sclp_early_printk().
- The init stack should be used, but the stack pointer is not set up correctly (missing aghi %r15,-STACK_FRAME_OVERHEAD).
- __sclp_early_printk() checks the sclp_init_state. If it is not sclp_init_state_uninitialized, it simply returns w/o printing anything. In the resumed kernel however, sclp_init_state will never be uninitialized.
This patch fixes those issues by removing the sam31/ESA logic, adding a correct init stack pointer, and also introducing sclp_early_printk_force() to allow using sclp_early_printk() even when sclp_init_state is not uninitialized.
--- arch/s390/include/asm/sclp.h | 3 ++- arch/s390/kernel/early_printk.c | 2 +- arch/s390/kernel/swsusp.S | 8 +++----- drivers/s390/char/sclp_early_core.c | 11 ++++++++--- 4 files changed, 14 insertions(+), 10 deletions(-)
arch/s390/include/asm/sclp.h +2 -1
@@ -108,7 +108,8 @@ int sclp_early_get_core_info(struct sclp_core_info *info);void sclp_early_get_ipl_info (struct sclp_ipl_info *info);void sclp_early_detect (void );void sclp_early_printk (const char *s); -void __sclp_early_printk (const char *s,unsigned int len); +void sclp_early_printk_force (const char *s); +void __sclp_early_printk (const char *s,unsigned int len,unsigned int force);int _sclp_get_core_info (struct sclp_core_info *info);int sclp_core_configure (u8 core);
arch/s390/kernel/early_printk.c +1 -1
@@ -10,7 +10,7 @@static void sclp_early_write (struct console *con,const char *s,unsigned int len) { -__sclp_early_printk (s, len); +__sclp_early_printk (s, len,0 ); }static struct console sclp_early_console = {
arch/s390/kernel/swsusp.S +3 -5
@@ -198,12 +198,10 @@ pgm_check_entry: /* Suspend CPU not available -> panic */ larl %r15,init_thread_union - ahi %r15,1<<(PAGE_SHIFT+THREAD_SIZE_ORDER) + aghi %r15,1<<(PAGE_SHIFT+THREAD_SIZE_ORDER) + aghi %r15,-STACK_FRAME_OVERHEAD larl %r2,.Lpanic_string - lghi %r1,0 - sam31 - sigp %r1,%r0,SIGP_SET_ARCHITECTURE - brasl %r14,sclp_early_printk + brasl %r14,sclp_early_printk_force larl %r3,.Ldisabled_wait_31 lpsw 0(%r3) 4:
drivers/s390/char/sclp_early_core.c +8 -3
@@ -210,11 +210,11 @@ static int sclp_early_setup(int disable, int *have_linemode, int *have_vt220)* Output one or more lines of text on the SCLP console (VT220 and / * or line-mode). */ -void __sclp_early_printk (const char *str,unsigned int len) +void __sclp_early_printk (const char *str,unsigned int len,unsigned int force) {int have_linemode, have_vt220; -if (sclp_init_state != sclp_init_state_uninitialized) +if (!force && sclp_init_state != sclp_init_state_uninitialized)return ;if (sclp_early_setup (0 , &have_linemode, &have_vt220) !=0 )return ;
@@ -227,5 +227,10 @@ void __sclp_early_printk(const char *str, unsigned int len)void sclp_early_printk (const char *str) { -__sclp_early_printk (str,strlen (str)); +__sclp_early_printk (str,strlen (str),0 ); +} + +void sclp_early_printk_force (const char *str) +{ +__sclp_early_printk (str,strlen (str),1 ); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 3/27 perf report: Don't try to map ip to invalid map
In reply to Sasha LevinFrom: Milian Wolff <[email protected]>
[ Upstream commit ff4ce2885af8f9e8e99864d78dbeb4673f089c76 ]
Fixes a crash when the report encounters an address that could not be associated with an mmaped region:
#0 0x00005555557bdc4a in callchain_srcline (ip=<error reading variable: Cannot access memory at address 0x38>, sym=0x0, map=0x0) at util/machine.c:2329 #1 unwind_entry (entry=entry@entry=0x7fffffff9180, arg=arg@entry=0x7ffff5642498) at util/machine.c:2329 #2 0x00005555558370af in entry (arg=0x7ffff5642498, cb=0x5555557bdb50 <unwind_entry>, thread=<optimized out>, ip=18446744073709551615) at util/unwind-libunwind-local.c:586 #3 get_entries (ui=ui@entry=0x7fffffff9620, cb=0x5555557bdb50 <unwind_entry>, arg=0x7ffff5642498, max_stack=<optimized out>) at util/unwind-libunwind-local.c:703 #4 0x0000555555837192 in _unwind__get_entries (cb=<optimized out>, arg=<optimized out>, thread=<optimized out>, data=<optimized out>, max_stack=<optimized out>) at util/unwind-libunwind-local.c:725 #5 0x00005555557c310f in thread__resolve_callchain_unwind (max_stack=127, sample=0x7fffffff9830, evsel=0x555555c7b3b0, cursor=0x7ffff5642498, thread=0x555555c7f6f0) at util/machine.c:2351 #6 thread__resolve_callchain (thread=0x555555c7f6f0, cursor=0x7ffff5642498, evsel=0x555555c7b3b0, sample=0x7fffffff9830, parent=0x7fffffff97b8, root_al=0x7fffffff9750, max_stack=127) at util/machine.c:2378 #7 0x00005555557ba4ee in sample__resolve_callchain (sample=<optimized out>, cursor=<optimized out>, parent=parent@entry=0x7fffffff97b8, evsel=<optimized out>, al=al@entry=0x7fffffff9750,
max_stack=<optimized out>) at util/callchain.c:1085
--- tools/perf/util/machine.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/util/machine.c +3 -2
@@ -2272,7 +2272,7 @@ static int unwind_entry(struct unwind_entry *entry, void *arg) {struct callchain_cursor *cursor = arg;const char *srcline =NULL ; -u64 addr; +u64 addr = entry->ip;if (symbol_conf.hide_unresolved && entry->sym ==NULL )return 0 ;
@@ -2284,7 +2284,8 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)* Convert entry->ip from a virtual address to an offset in * its corresponding binary. */ - addr =map__map_ip (entry->map, entry->ip); +if (entry->map) + addr =map__map_ip (entry->map, entry->ip); srcline =callchain_srcline (entry->map, entry->sym, addr); return callchain_cursor_append(cursor, entry->ip,
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 4/27 Input: i8042 - enable keyboard wakeups by default when s2idle is used
In reply to Sasha LevinFrom: Daniel Drake <[email protected]>
[ Upstream commit 684bec1092b6991ff2a7751e8a763898576eb5c2 ]
Previously, on typical consumer laptops, pressing a key on the keyboard when the system is in suspend would cause it to wake up (default or unconditional behaviour). This happens because the EC generates a SCI interrupt in this scenario.
That is no longer true on modern laptops based on Intel WhiskeyLake, including Acer Swift SF314-55G, Asus UX333FA, Asus UX433FN and Asus UX533FD. We confirmed with Asus EC engineers that the "Modern Standby" design has been modified so that the EC no longer generates a SCI in this case; the keyboard controller itself should be used for wakeup.
In order to retain the standard behaviour of being able to use the keyboard to wake up the system, enable serio wakeups by default on platforms that are using s2idle.
--- drivers/input/serio/i8042.c | 29 ++++++++++++++++++++--------- include/linux/suspend.h | 2 ++ kernel/power/suspend.c | 6 ++++++ 3 files changed, 28 insertions(+), 9 deletions(-)
drivers/input/serio/i8042.c +20 -9
@@ -1392,15 +1392,26 @@ static void __init i8042_register_ports(void)for (i =0 ; i <I8042_NUM_PORTS ; i++) {struct serio *serio = i8042_ports[i].serio; -if (serio) { -printk (KERN_INFO "serio: %s at %#lx,%#lx irq %d\n" , - serio->name, - (unsigned long )I8042_DATA_REG , - (unsigned long )I8042_COMMAND_REG , - i8042_ports[i].irq); -serio_register_port (serio); -device_set_wakeup_capable (&serio->dev, true); - } +if (!serio) +continue ; + +printk (KERN_INFO "serio: %s at %#lx,%#lx irq %d\n" , + serio->name, + (unsigned long )I8042_DATA_REG , + (unsigned long )I8042_COMMAND_REG , + i8042_ports[i].irq); +serio_register_port (serio); +device_set_wakeup_capable (&serio->dev, true); + +/* +* On platforms using suspend-to-idle, allow the keyboard to +* wake up the system from sleep by enabling keyboard wakeups +* by default. This is consistent with keyboard wakeup +* behavior on many platforms using suspend-to-RAM (ACPI S3) +* by default. +*/ +if (pm_suspend_via_s2idle () && i ==I8042_KBD_PORT_NO ) +device_set_wakeup_enable (&serio->dev, true); } }
include/linux/suspend.h +2 -0
@@ -251,6 +251,7 @@ static inline bool idle_should_enter_s2idle(void)return unlikely (s2idle_state ==S2IDLE_STATE_ENTER ); } +extern bool pm_suspend_via_s2idle (void );extern void __init pm_states_init (void );extern void s2idle_set_ops (const struct platform_s2idle_ops *ops);extern void s2idle_wake (void );
@@ -282,6 +283,7 @@ static inline void pm_set_suspend_via_firmware(void) {}static inline void pm_set_resume_via_firmware (void ) {}static inline bool pm_suspend_via_firmware (void ) {return false; }static inline bool pm_resume_via_firmware (void ) {return false; } +static inline bool pm_suspend_via_s2idle (void ) {return false; }static inline void suspend_set_ops (const struct platform_suspend_ops *ops) {}static inline int pm_suspend (suspend_state_t state) {return -ENOSYS ; }
kernel/power/suspend.c +6 -0
@@ -63,6 +63,12 @@ static DECLARE_SWAIT_QUEUE_HEAD(s2idle_wait_head);enum s2idle_states __read_mostly s2idle_state;static DEFINE_RAW_SPINLOCK (s2idle_lock); +bool pm_suspend_via_s2idle (void ) +{ +return mem_sleep_current ==PM_SUSPEND_TO_IDLE ; +} +EXPORT_SYMBOL_GPL (pm_suspend_via_s2idle); +void s2idle_set_ops (const struct platform_s2idle_ops *ops) {lock_system_sleep ();
Signature · 1 line
2.17.1
Re: [PATCH AUTOSEL 4.18 04/27] Input: i8042 - enable keyboard wakeups by default when s2idle is used
Hi Sasha,
Quoted 15 lines · Sasha Levin
From: Daniel Drake <[email protected]>
[ Upstream commit
684bec1092b6991ff2a7751e8a763898576eb5c2]Previously, on typical consumer laptops, pressing a key on the keyboard when the system is in suspend would cause it to wake up (default or unconditional behaviour). This happens because the EC generates a SCI interrupt in this scenario.
That is no longer true on modern laptops based on Intel WhiskeyLake, including Acer Swift SF314-55G, Asus UX333FA, Asus UX433FN and Asus UX533FD. We confirmed with Asus EC engineers that the "Modern Standby" design has been modified so that the EC no longer generates a SCI in this case; the keyboard controller itself should be used for wakeup.
Quoted 3 lines
In order to retain the standard behaviour of being able to use the keyboard to wake up the system, enable serio wakeups by default on platforms that are using s2idle.
I disagree that this should be included in stable as it does not fix a regression on the aforementioned platforms and has a potential to alter the behavior. The fact that the system does not wake up on keyboard is not a showstopper, wakeup usually happens on lid open anyway.
It is hitting 4.19 LTS train and that should be enough. Please do not pick up for earlier stables.
Thanks.
Quoted 92 lines
Link https://lkml.kernel.org/r/CAB4CAwfQ0mPMqCLp95TVjw4J0r5zKPWkSvvkK4cpZUGE--w8bQ@mail.gmail.com open hereReviewed-by Rafael J. Wysocki <[email protected]>Signed-off-by Daniel Drake <[email protected]>Signed-off-by Dmitry Torokhov <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/input/serio/i8042.c | 29 ++++++++++++++++++++--------- include/linux/suspend.h | 2 ++ kernel/power/suspend.c | 6 ++++++ 3 files changed, 28 insertions(+), 9 deletions(-)drivers/input/serio/i8042.c +20
-9@@ -1392,15 +1392,26 @@ static void __init i8042_register_ports(void)for (i =0 ; i <I8042_NUM_PORTS ; i++) {struct serio *serio = i8042_ports[i].serio; -if (serio) { -printk (KERN_INFO "serio: %s at %#lx,%#lx irq %d\n" , - serio->name, - (unsigned long )I8042_DATA_REG , - (unsigned long )I8042_COMMAND_REG , - i8042_ports[i].irq); -serio_register_port (serio); -device_set_wakeup_capable (&serio->dev, true); - } +if (!serio) +continue ; + +printk (KERN_INFO "serio: %s at %#lx,%#lx irq %d\n" , + serio->name, + (unsigned long )I8042_DATA_REG , + (unsigned long )I8042_COMMAND_REG , + i8042_ports[i].irq); +serio_register_port (serio); +device_set_wakeup_capable (&serio->dev, true); + +/* +* On platforms using suspend-to-idle, allow the keyboard to +* wake up the system from sleep by enabling keyboard wakeups +* by default. This is consistent with keyboard wakeup +* behavior on many platforms using suspend-to-RAM (ACPI S3) +* by default. +*/ +if (pm_suspend_via_s2idle () && i ==I8042_KBD_PORT_NO ) +device_set_wakeup_enable (&serio->dev, true); } }include/linux/suspend.h +2
-0@@ -251,6 +251,7 @@ static inline bool idle_should_enter_s2idle(void)return unlikely (s2idle_state ==S2IDLE_STATE_ENTER ); } +extern bool pm_suspend_via_s2idle (void );extern void __init pm_states_init (void );extern void s2idle_set_ops (const struct platform_s2idle_ops *ops);extern void s2idle_wake (void );@@ -282,6 +283,7 @@ static inline void pm_set_suspend_via_firmware(void) {}static inline void pm_set_resume_via_firmware (void ) {}static inline bool pm_suspend_via_firmware (void ) {return false; }static inline bool pm_resume_via_firmware (void ) {return false; } +static inline bool pm_suspend_via_s2idle (void ) {return false; }static inline void suspend_set_ops (const struct platform_suspend_ops *ops) {}static inline int pm_suspend (suspend_state_t state) {return -ENOSYS ; }kernel/power/suspend.c +6
-0@@ -63,6 +63,12 @@ static DECLARE_SWAIT_QUEUE_HEAD(s2idle_wait_head);enum s2idle_states __read_mostly s2idle_state;static DEFINE_RAW_SPINLOCK (s2idle_lock); +bool pm_suspend_via_s2idle (void ) +{ +return mem_sleep_current ==PM_SUSPEND_TO_IDLE ; +} +EXPORT_SYMBOL_GPL (pm_suspend_via_s2idle); +void s2idle_set_ops (const struct platform_s2idle_ops *ops) {lock_system_sleep ();Signature · 1 line
2.17.1
Signature · 1 line
Dmitry
Sasha Levin
maintainerRe: [PATCH AUTOSEL 4.18 04/27] Input: i8042 - enable keyboard wakeups by default when s2idle is used
Quoted 22 lines · Dmitry Torokhov
Hi Sasha,
Quoted 15 lines · Sasha Levin
From: Daniel Drake <[email protected]>
[ Upstream commit
684bec1092b6991ff2a7751e8a763898576eb5c2]Previously, on typical consumer laptops, pressing a key on the keyboard when the system is in suspend would cause it to wake up (default or unconditional behaviour). This happens because the EC generates a SCI interrupt in this scenario.
That is no longer true on modern laptops based on Intel WhiskeyLake, including Acer Swift SF314-55G, Asus UX333FA, Asus UX433FN and Asus UX533FD. We confirmed with Asus EC engineers that the "Modern Standby" design has been modified so that the EC no longer generates a SCI in this case; the keyboard controller itself should be used for wakeup.
Quoted 3 lines
In order to retain the standard behaviour of being able to use the keyboard to wake up the system, enable serio wakeups by default on platforms that are using s2idle.
Quoted 7 lines
I disagree that this should be included in stable as it does not fix a regression on the aforementioned platforms and has a potential to alter the behavior. The fact that the system does not wake up on keyboard is not a showstopper, wakeup usually happens on lid open anyway.
It is hitting 4.19 LTS train and that should be enough. Please do not pick up for earlier stables.
Dropped, thanks!
Sasha Levin
maintainerPATCH 5/27 Input: mousedev - add a schedule point in mousedev_write()
In reply to Sasha LevinFrom: Eric Dumazet <[email protected]>
[ Upstream commit f74c371fe72a4f820d287db8067683fb533e4ede ]
syzbot was able to trigger rcu stalls by calling write() with large number of bytes.
Add a cond_resched() in the loop to avoid this.
--- drivers/input/mousedev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mousedev.c +1 -0
@@ -707,6 +707,7 @@ static ssize_t mousedev_write(struct file *file, const char __user *buffer,mousedev_generate_response (client, c);spin_unlock_irq (&client->packet_lock); +cond_resched (); }kill_fasync (&client->fasync,SIGIO ,POLL_IN );
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 6/27 perf python: Use -Wno-redundant-decls to build with PYTHON=python3
In reply to Sasha LevinFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 05a2f54679861deb188750ba2a70187000b2c71f ]
When building in ClearLinux using 'make PYTHON=python3' with gcc 8.2.1 it fails with:
GEN /tmp/build/perf/python/perf.so
In file included from /usr/include/python3.7m/Python.h:126,
from /git/linux/tools/perf/util/python.c:2:
/usr/include/python3.7m/import.h:58:24: error: redundant redeclaration of ‘_PyImport_AddModuleObject’ [-Werror=redundant-decls]
PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *, PyObject *);
^~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/python3.7m/import.h:47:24: note: previous declaration of ‘_PyImport_AddModuleObject’ was here
PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name,
^~~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors
error: command 'gcc' failed with exit status 1
And indeed there is a redundant declaration in that Python.h file, one with parameter names and the other without, so just add -Wno-error=redundant-decls to the python setup instructions.
Now perf builds with gcc in ClearLinux with the following Dockerfile:
# docker.io/acmel/linux-perf-tools-build-clearlinux:latest FROM docker.io/clearlinux:latest MAINTAINER Arnaldo Carvalho de Melo <[email protected]> RUN swupd update && \ swupd bundle-add sysadmin-basic-dev RUN mkdir -m 777 -p /git /tmp/build/perf /tmp/build/objtool /tmp/build/linux && \ groupadd -r perfbuilder && \ useradd -m -r -g perfbuilder perfbuilder && \ chown -R perfbuilder.perfbuilder /tmp/build/ /git/ USER perfbuilder COPY rx_and_build.sh / ENV EXTRA_MAKE_ARGS=PYTHON=python3 ENTRYPOINT ["/rx_and_build.sh"]
Now to figure out why the build fails with clang, that is present in the above container as detected by the rx_and_build.sh script:
clang version 6.0.1 (tags/RELEASE_601/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/sbin
make: Entering directory '/git/linux/tools/perf'
BUILD: Doing 'make -j4' parallel build
HOSTCC /tmp/build/perf/fixdep.o
HOSTLD /tmp/build/perf/fixdep-in.o
LINK /tmp/build/perf/fixdep Auto-detecting system features:
... dwarf: [ OFF ]
... dwarf_getlocations: [ OFF ]
... glibc: [ OFF ]
... gtk2: [ OFF ]
... libaudit: [ OFF ]
... libbfd: [ OFF ]
... libelf: [ OFF ]
... libnuma: [ OFF ]
... numa_num_possible_cpus: [ OFF ]
... libperl: [ OFF ]
... libpython: [ OFF ]
... libslang: [ OFF ]
... libcrypto: [ OFF ]
... libunwind: [ OFF ]
... libdw-dwarf-unwind: [ OFF ]
... zlib: [ OFF ]
... lzma: [ OFF ]
... get_cpuid: [ OFF ]
... bpf: [ OFF ]
Makefile.config:331: *** No gnu/libc-version.h found, please install glibc-dev[el]. Stop. make[1]: *** [Makefile.perf:206: sub-make] Error 2
make: *** [Makefile:70: all] Error 2
make: Leaving directory '/git/linux/tools/perf'
--- tools/perf/util/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/setup.py +1 -1
@@ -27,7 +27,7 @@ class install_lib(_install_lib): cflags = getenv('CFLAGS', '').split() # switch off several checks (need to be at the end of cflags list) -cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' ] +cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ] if cc != "clang": cflags += ['-Wno-cast-function-type' ]
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 7/27 perf record: Use unmapped IP for inline callchain cursors
In reply to Sasha LevinFrom: Milian Wolff <[email protected]>
[ Upstream commit 7a8a8fcf7b860e4b2d4edc787c844d41cad9dfcf ]
Only use the mapped IP to find inline frames, but keep using the unmapped IP for the callchain cursor. This ensures we properly show the unmapped IP when displaying a frame we received via the dso__parse_addr_inlines API for a module which does not contain sufficient debug symbols to show the srcline.
This is another follow-up to commit 19610184693c ("perf script: Show virtual addresses instead of offsets").
--- tools/perf/util/machine.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/machine.c +2 -1
@@ -2246,7 +2246,8 @@ static int append_inlines(struct callchain_cursor *cursor,if (!symbol_conf.inline_name || !map || !sym)return ret; - addr =map__rip_2objdump (map, ip); + addr =map__map_ip (map, ip); + addr =map__rip_2objdump (map, addr); inline_node =inlines__tree_find (&map->dso->inlined_nodes, addr);if (!inline_node) {
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 8/27 Input: evdev - add a schedule point in evdev_write()
In reply to Sasha LevinFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit 36d2582ff235b4e01ad64a734c877a52dc762d9c ]
Large writes to evdev interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/evdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/evdev.c +1 -0
@@ -564,6 +564,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,input_inject_event (&evdev->handle, event.type, event.code, event.value); +cond_resched (); } out:
Signature · 1 line
2.17.1
Re: [PATCH AUTOSEL 4.18 08/27] Input: evdev - add a schedule point in evdev_write()
Hi Sasha,
Quoted 6 lines · Sasha Levin
From: Dmitry Torokhov <[email protected]>
[ Upstream commit
36d2582ff235b4e01ad64a734c877a52dc762d9c]Large writes to evdev interface may cause rcu stalls. Let's add
cond_resched()to the loop to avoid this.
This is not needed in stable:
- the interfaces are not accessible for unprivileged users so there is no DOS concerns
- the issue can only happen on non-preemptible kernels
- the issue only showed up with synthetic test and not real life use cases
- this is not a regression
The same goes to similar patches to mousedev, joydev and uinput that you autoselected.
Thanks.
Quoted 23 lines
Reviewed-by Paul E. McKenney <[email protected]>Signed-off-by Dmitry Torokhov <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/input/evdev.c | 1 + 1 file changed, 1 insertion(+)drivers/input/evdev.c +1
-0@@ -564,6 +564,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,input_inject_event (&evdev->handle, event.type, event.code, event.value); +cond_resched (); } out:Signature · 1 line
2.17.1
Signature · 1 line
Dmitry
Sasha Levin
maintainerRe: [PATCH AUTOSEL 4.18 08/27] Input: evdev - add a schedule point in evdev_write()
Quoted 19 lines · Dmitry Torokhov
Hi Sasha,
Quoted 6 lines · Sasha Levin
From: Dmitry Torokhov <[email protected]>
[ Upstream commit
36d2582ff235b4e01ad64a734c877a52dc762d9c]Large writes to evdev interface may cause rcu stalls. Let's add
cond_resched()to the loop to avoid this.This is not needed in stable:
- the interfaces are not accessible for unprivileged users so there is no DOS concerns
- the issue can only happen on non-preemptible kernels
- the issue only showed up with synthetic test and not real life use cases
- this is not a regression
Quoted 2 lines
The same goes to similar patches to mousedev, joydev and uinput that you autoselected.
Dropped, thanks!
--
Thanks,
Sasha
Sasha Levin
maintainerPATCH 9/27 Input: uinput - add a schedule point in uinput_inject_events()
In reply to Sasha LevinFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit cecf10704899467a787975e3d94a1f0129b9688e ]
Large writes to uinput interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/misc/uinput.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/misc/uinput.c +1 -0
@@ -598,6 +598,7 @@ static ssize_t uinput_inject_events(struct uinput_device *udev,input_event (udev->dev, ev.type, ev.code, ev.value); bytes +=input_event_size (); +cond_resched (); }return bytes;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 10/27 rxrpc: Don't check RXRPC_CALL_TX_LAST after calling rxrpc_rotate_tx_window()
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit c479d5f2c2e1ce609da08c075054440d97ddff52 ]
We should only call the function to end a call's Tx phase if we rotated the marked-last packet out of the transmission buffer.
Make rxrpc_rotate_tx_window() return an indication of whether it just rotated the packet marked as the last out of the transmit buffer, carrying the information out of the locked section in that function.
We can then check the return value instead of examining RXRPC_CALL_TX_LAST.
--- net/rxrpc/input.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
net/rxrpc/input.c +19 -16
@@ -216,10 +216,11 @@ static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb,/* * Apply a hard ACK by advancing the Tx window. */ -static void rxrpc_rotate_tx_window (struct rxrpc_call *call,rxrpc_seq_t to, +static bool rxrpc_rotate_tx_window (struct rxrpc_call *call,rxrpc_seq_t to,struct rxrpc_ack_summary *summary) {struct sk_buff *skb, *list =NULL ; +bool rot_last = false;int ix;u8 annotation;
@@ -243,15 +244,17 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, skb->next = list; list = skb; -if (annotation &RXRPC_TX_ANNO_LAST ) +if (annotation &RXRPC_TX_ANNO_LAST ) {set_bit (RXRPC_CALL_TX_LAST , &call->flags); + rot_last = true; + }if ((annotation &RXRPC_TX_ANNO_MASK ) !=RXRPC_TX_ANNO_ACK ) summary->nr_rot_new_acks++; }spin_unlock (&call->lock); -trace_rxrpc_transmit (call, (test_bit (RXRPC_CALL_TX_LAST , &call->flags) ? +trace_rxrpc_transmit (call, (rot_last ? rxrpc_transmit_rotate_last : rxrpc_transmit_rotate));wake_up (&call->waitq);
@@ -262,6 +265,8 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, skb->next =NULL ;rxrpc_free_skb (skb, rxrpc_skb_tx_freed); } + +return rot_last; }/*
@@ -332,11 +337,11 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call)trace_rxrpc_timer (call, rxrpc_timer_init_for_reply, now); } -if (!test_bit (RXRPC_CALL_TX_LAST , &call->flags)) -rxrpc_rotate_tx_window (call, top, &summary);if (!test_bit (RXRPC_CALL_TX_LAST , &call->flags)) { -rxrpc_proto_abort ("TXL" , call, top); -return false; +if (!rxrpc_rotate_tx_window (call, top, &summary)) { +rxrpc_proto_abort ("TXL" , call, top); +return false; + } }if (!rxrpc_end_tx_phase (call, true,"ETD" ))return false;
@@ -890,8 +895,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,if (nr_acks > call->tx_top - hard_ack)return rxrpc_proto_abort ("AKN" , call,0 ); -if (after (hard_ack, call->tx_hard_ack)) -rxrpc_rotate_tx_window (call, hard_ack, &summary); +if (after (hard_ack, call->tx_hard_ack)) { +if (rxrpc_rotate_tx_window (call, hard_ack, &summary)) { +rxrpc_end_tx_phase (call, false,"ETA" ); +return ; + } + }if (nr_acks >0 ) {if (skb_copy_bits (skb, offset, buf.acks, nr_acks) <0 )
@@ -900,11 +909,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, &summary); } -if (test_bit (RXRPC_CALL_TX_LAST , &call->flags)) { -rxrpc_end_tx_phase (call, false,"ETA" ); -return ; - } - if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & RXRPC_TX_ANNO_LAST && summary.nr_acks == call->tx_top - hard_ack &&
@@ -926,8 +930,7 @@ static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb)_proto ("Rx ACKALL %%%u" , sp->hdr.serial); -rxrpc_rotate_tx_window (call, call->tx_top, &summary); -if (test_bit (RXRPC_CALL_TX_LAST , &call->flags)) +if (rxrpc_rotate_tx_window (call, call->tx_top, &summary))rxrpc_end_tx_phase (call, false,"ETL" ); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 11/27 rxrpc: Carry call state out of locked section in rxrpc_rotate_tx_window()
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit dfe995224693798e554ab4770f6d8a096afc60cd ]
Carry the call state out of the locked section in rxrpc_rotate_tx_window() rather than sampling it afterwards. This is only used to select tracepoint data, but could have changed by the time we do the tracepoint.
--- net/rxrpc/input.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
net/rxrpc/input.c +8 -6
@@ -278,23 +278,26 @@ static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,static bool rxrpc_end_tx_phase (struct rxrpc_call *call,bool reply_begun,const char *abort_why) { +unsigned int state;ASSERT (test_bit (RXRPC_CALL_TX_LAST , &call->flags));write_lock (&call->state_lock); -switch (call->state) { + state = call->state; +switch (state) {case RXRPC_CALL_CLIENT_SEND_REQUEST :case RXRPC_CALL_CLIENT_AWAIT_REPLY :if (reply_begun) - call->state =RXRPC_CALL_CLIENT_RECV_REPLY ; + call->state = state =RXRPC_CALL_CLIENT_RECV_REPLY ;else - call->state =RXRPC_CALL_CLIENT_AWAIT_REPLY ; + call->state = state =RXRPC_CALL_CLIENT_AWAIT_REPLY ;break ;case RXRPC_CALL_SERVER_AWAIT_ACK :__rxrpc_call_completed (call);rxrpc_notify_socket (call); + state = call->state;break ;default :
@@ -302,11 +305,10 @@ static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun, }write_unlock (&call->state_lock); -if (call->state ==RXRPC_CALL_CLIENT_AWAIT_REPLY ) { +if (state ==RXRPC_CALL_CLIENT_AWAIT_REPLY )trace_rxrpc_transmit (call, rxrpc_transmit_await_reply); - }else { +else trace_rxrpc_transmit (call, rxrpc_transmit_end); - }_leave (" = ok" );return true;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 12/27 rxrpc: Only take the rwind and mtu values from latest ACK
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit 298bc15b2079c324e82d0a6fda39c3d762af7282 ]
Move the out-of-order and duplicate ACK packet check to before the call to rxrpc_input_ackinfo() so that the receive window size and MTU size are only checked in the latest ACK packet and don't regress.
--- net/rxrpc/input.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
net/rxrpc/input.c +10 -9
@@ -861,6 +861,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, rxrpc_propose_ack_respond_to_ack); } +/* Discard any out-of-order or duplicate ACKs. */ +if (before_eq (sp->hdr.serial, call->acks_latest)) { +_debug ("discard ACK %d <= %d" , + sp->hdr.serial, call->acks_latest); +return ; + } + call->acks_latest_ts = skb->tstamp; + call->acks_latest = sp->hdr.serial; + +/* Parse rwind and mtu sizes if provided. */ ioffset = offset + nr_acks +3 ;if (skb->len >= ioffset +sizeof (buf.info)) {if (skb_copy_bits (skb, ioffset, &buf.info,sizeof (buf.info)) <0 )
@@ -882,15 +892,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,return ; } -/* Discard any out-of-order or duplicate ACKs. */ -if (before_eq (sp->hdr.serial, call->acks_latest)) { -_debug ("discard ACK %d <= %d" , - sp->hdr.serial, call->acks_latest); -return ; - } - call->acks_latest_ts = skb->tstamp; - call->acks_latest = sp->hdr.serial; -if (before (hard_ack, call->tx_hard_ack) ||after (hard_ack, call->tx_top))return rxrpc_proto_abort ("AKW" , call,0 );
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 13/27 rxrpc: Fix connection-level abort handling
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit 647530924f47c93db472ee3cf43b7ef1425581b6 ]
Fix connection-level abort handling to cache the abort and error codes properly so that a new incoming call can be properly aborted if it races with the parent connection being aborted by another CPU.
The abort_code and error parameters can then be dropped from rxrpc_abort_calls().
--- net/rxrpc/ar-internal.h | 4 ++-- net/rxrpc/call_accept.c | 4 ++-- net/rxrpc/conn_event.c | 26 +++++++++++++++----------- 3 files changed, 19 insertions(+), 15 deletions(-)
net/rxrpc/ar-internal.h +2 -2
@@ -449,8 +449,7 @@ struct rxrpc_connection {spinlock_t state_lock;/* state-change lock */ enum rxrpc_conn_cache_state cache_state;enum rxrpc_conn_proto_state state;/* current state of connection */ -u32 local_abort;/* local abort code */ -u32 remote_abort;/* remote abort code */ +u32 abort_code;/* Abort code of connection abort */ int debug_id;/* debug ID for printks */ atomic_t serial;/* packet serial number counter */ unsigned int hi_serial;/* highest serial number received */
@@ -460,6 +459,7 @@ struct rxrpc_connection {u8 security_size;/* security header size */ u8 security_ix;/* security type */ u8 out_clientflag;/* RXRPC_CLIENT_INITIATED if we are client */ +short error;/* Local error code */ };/*
net/rxrpc/call_accept.c +2 -2
@@ -422,11 +422,11 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,case RXRPC_CONN_REMOTELY_ABORTED :rxrpc_set_call_completion (call,RXRPC_CALL_REMOTELY_ABORTED , - conn->remote_abort, -ECONNABORTED ); + conn->abort_code, conn->error);break ;case RXRPC_CONN_LOCALLY_ABORTED :rxrpc_abort_call ("CON" , call, sp->hdr.seq, - conn->local_abort, -ECONNABORTED ); + conn->abort_code, conn->error);break ;default :BUG ();
net/rxrpc/conn_event.c +15 -11
@@ -126,7 +126,7 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,switch (chan->last_type) {case RXRPC_PACKET_TYPE_ABORT : -_proto ("Tx ABORT %%%u { %d } [re]" , serial, conn->local_abort); +_proto ("Tx ABORT %%%u { %d } [re]" , serial, conn->abort_code);break ;case RXRPC_PACKET_TYPE_ACK : trace_rxrpc_tx_ack(NULL, serial, chan->last_seq, 0,
@@ -148,13 +148,12 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,* pass a connection-level abort onto all calls on that connection */ static void rxrpc_abort_calls (struct rxrpc_connection *conn, -enum rxrpc_call_completion compl, -u32 abort_code,int error) +enum rxrpc_call_completion compl) {struct rxrpc_call *call;int i; -_enter ("{%d},%x" , conn->debug_id, abort_code); +_enter ("{%d},%x" , conn->debug_id, conn->abort_code);spin_lock (&conn->channel_lock);
@@ -167,9 +166,11 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn,trace_rxrpc_abort (call->debug_id,"CON" , call->cid, call->call_id,0 , - abort_code, error); + conn->abort_code, + conn->error);if (rxrpc_set_call_completion (call, compl, - abort_code, error)) + conn->abort_code, + conn->error))rxrpc_notify_socket (call); } }
@@ -202,10 +203,12 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,return 0 ; } + conn->error = error; + conn->abort_code = abort_code; conn->state =RXRPC_CONN_LOCALLY_ABORTED ;spin_unlock_bh (&conn->state_lock); -rxrpc_abort_calls (conn,RXRPC_CALL_LOCALLY_ABORTED , abort_code, error); +rxrpc_abort_calls (conn,RXRPC_CALL_LOCALLY_ABORTED ); msg.msg_name = &conn->params.peer->srx.transport; msg.msg_namelen = conn->params.peer->srx.transport_len;
@@ -224,7 +227,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn, whdr._rsvd =0 ; whdr.serviceId =htons (conn->service_id); - word =htonl (conn->local_abort); + word =htonl (conn->abort_code); iov[0 ].iov_base = &whdr; iov[0 ].iov_len =sizeof (whdr);
@@ -235,7 +238,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn, serial =atomic_inc_return (&conn->serial); whdr.serial =htonl (serial); -_proto ("Tx CONN ABORT %%%u { %d }" , serial, conn->local_abort); +_proto ("Tx CONN ABORT %%%u { %d }" , serial, conn->abort_code); ret =kernel_sendmsg (conn->params.local->socket, &msg, iov,2 , len);if (ret <0 ) {
@@ -308,9 +311,10 @@ static int rxrpc_process_event(struct rxrpc_connection *conn, abort_code =ntohl (wtmp);_proto ("Rx ABORT %%%u { ac=%d }" , sp->hdr.serial, abort_code); + conn->error = -ECONNABORTED ; + conn->abort_code = abort_code; conn->state =RXRPC_CONN_REMOTELY_ABORTED ; -rxrpc_abort_calls (conn,RXRPC_CALL_REMOTELY_ABORTED , - abort_code, -ECONNABORTED ); +rxrpc_abort_calls (conn,RXRPC_CALL_REMOTELY_ABORTED );return -ECONNABORTED ;case RXRPC_PACKET_TYPE_CHALLENGE :
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 14/27 KVM: x86: support CONFIG_KVM_AMD=y with CONFIG_CRYPTO_DEV_CCP_DD=m
In reply to Sasha LevinFrom: Paolo Bonzini <[email protected]>
[ Upstream commit 853c110982eaff0d99dace3f66f1ba58b5bfd9d5 ]
SEV requires access to the AMD cryptographic device APIs, and this does not work when KVM is builtin and the crypto driver is a module. Actually the Kconfig conditions for CONFIG_KVM_AMD_SEV try to disable SEV in that case, but it does not work because the actual crypto calls are not culled, only sev_hardware_setup() is.
This patch adds two CONFIG_KVM_AMD_SEV checks that gate all the remaining SEV code; it fixes this particular configuration, and drops 5 KiB of code when CONFIG_KVM_AMD_SEV=n.
--- arch/x86/kvm/svm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/x86/kvm/svm.c +5 -1
@@ -436,14 +436,18 @@ static inline struct kvm_svm *to_kvm_svm(struct kvm *kvm)static inline bool svm_sev_enabled (void ) { -return max_sev_asid; +return IS_ENABLED (CONFIG_KVM_AMD_SEV ) ? max_sev_asid :0 ; }static inline bool sev_guest (struct kvm *kvm) { +#ifdef CONFIG_KVM_AMD_SEV struct kvm_sev_info *sev = &to_kvm_svm (kvm)->sev_info;return sev->active; +#else +return false; +#endif }static inline int sev_get_asid (struct kvm *kvm)
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 15/27 net: ena: fix warning in rmmod caused by double iounmap
In reply to Sasha LevinFrom: Arthur Kiyanovski <[email protected]>
[ Upstream commit d79c3888bde6581da7ff9f9d6f581900ecb5e632 ]
Memory mapped with devm_ioremap is automatically freed when the driver is disconnected from the device. Therefore there is no need to explicitly call devm_iounmap.
--- drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/net/ethernet/amazon/ena/ena_netdev.c +1 -8
@@ -3128,15 +3128,8 @@ static int ena_rss_init_default(struct ena_adapter *adapter)static void ena_release_bars (struct ena_com_dev *ena_dev,struct pci_dev *pdev) { -int release_bars; +int release_bars =pci_select_bars (pdev,IORESOURCE_MEM ) &ENA_BAR_MASK ; -if (ena_dev->mem_bar) -devm_iounmap (&pdev->dev, ena_dev->mem_bar); - -if (ena_dev->reg_bar) -devm_iounmap (&pdev->dev, ena_dev->reg_bar); - - release_bars =pci_select_bars (pdev,IORESOURCE_MEM ) &ENA_BAR_MASK ;pci_release_selected_regions (pdev, release_bars); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 16/27 net: ena: fix rare bug when failed restart/resume is followed by driver removal
In reply to Sasha LevinFrom: Arthur Kiyanovski <[email protected]>
[ Upstream commit d7703ddbd7c9cb1ab7c08e1b85b314ff8cea38e9 ]
In a rare scenario when ena_device_restore() fails, followed by device remove, an FLR will not be issued. In this case, the device will keep sending asynchronous AENQ keep-alive events, even after driver removal, leading to memory corruption.
--- drivers/net/ethernet/amazon/ena/ena_netdev.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/amazon/ena/ena_netdev.c +4 -0
@@ -2648,7 +2648,11 @@ static int ena_restore_device(struct ena_adapter *adapter)ena_free_mgmnt_irq (adapter);ena_disable_msix (adapter); err_device_destroy: +ena_com_abort_admin_commands (ena_dev); +ena_com_wait_for_abort_completion (ena_dev);ena_com_admin_destroy (ena_dev); +ena_com_mmio_reg_read_request_destroy (ena_dev); +ena_com_dev_reset (ena_dev,ENA_REGS_RESET_DRIVER_INVALID_STATE ); err:clear_bit (ENA_FLAG_DEVICE_RUNNING , &adapter->flags);clear_bit (ENA_FLAG_ONGOING_RESET , &adapter->flags);
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 17/27 net: ena: fix NULL dereference due to untimely napi initialization
In reply to Sasha LevinFrom: Arthur Kiyanovski <[email protected]>
[ Upstream commit 78a55d05def95144ca5fa9a64c49b2a0636a9866 ]
napi poll functions should be initialized before running request_irq(), to handle a rare condition where there is a pending interrupt, causing the ISR to fire immediately while the poll function wasn't set yet, causing a NULL dereference.
--- drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/amazon/ena/ena_netdev.c +7 -2
@@ -1580,8 +1580,6 @@ static int ena_up_complete(struct ena_adapter *adapter)if (rc)return rc; -ena_init_napi (adapter); -ena_change_mtu (adapter->netdev, adapter->netdev->mtu);ena_refill_all_rx_bufs (adapter);
@@ -1735,6 +1733,13 @@ static int ena_up(struct ena_adapter *adapter)ena_setup_io_intr (adapter); +/* napi poll functions should be initialized before running +* request_irq(), to handle a rare condition where there is a pending +* interrupt, causing the ISR to fire immediately while the poll +* function wasn't set yet, causing a null dereference +*/ +ena_init_napi (adapter); + rc =ena_request_io_irq (adapter);if (rc) goto err_req_irq;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 18/27 libertas: call into generic suspend code before turning off power
In reply to Sasha LevinFrom: Daniel Mack <[email protected]>
[ Upstream commit 4f666675cdff0b986195413215eb062b7da6586f ]
When powering down a SDIO connected card during suspend, make sure to call into the generic lbs_suspend() function before pulling the plug. This will make sure the card is successfully deregistered from the system to avoid communication to the card starving out.
--- drivers/net/wireless/marvell/libertas/if_sdio.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/marvell/libertas/if_sdio.c +4 -0
@@ -1317,6 +1317,10 @@ static int if_sdio_suspend(struct device *dev)if (priv->wol_criteria ==EHS_REMOVE_WAKEUP ) {dev_info (dev,"Suspend without wake params -- powering down card\n" );if (priv->fw_ready) { + ret =lbs_suspend (priv); +if (ret) +return ret; + priv->power_up_on_resume = true;if_sdio_power_off (card); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 19/27 gpio: Assign gpio_irq_chip::parents to non-stack pointer
In reply to Sasha LevinFrom: Stephen Boyd <[email protected]>
[ Upstream commit 3e779a2e7f909015f21428b66834127496110b6d ]
gpiochip_set_cascaded_irqchip() is passed 'parent_irq' as an argument and then the address of that argument is assigned to the gpio chips gpio_irq_chip 'parents' pointer shortly thereafter. This can't ever work, because we've just assigned some stack address to a pointer that we plan to dereference later in gpiochip_irq_map(). I ran into this issue with the KASAN report below when gpiochip_irq_map() tried to setup the parent irq with a total junk pointer for the 'parents' array.
BUG: KASAN: stack-out-of-bounds in gpiochip_irq_map+0x228/0x248
Read of size 4 at addr ffffffc0dde472e0 by task swapper/0/1
CPU: 7 PID: 1 Comm: swapper/0 Not tainted 4.14.72 #34
Call trace:
[<ffffff9008093638>] dump_backtrace+0x0/0x718
[<ffffff9008093da4>] show_stack+0x20/0x2c
[<ffffff90096b9224>] __dump_stack+0x20/0x28
[<ffffff90096b91c8>] dump_stack+0x80/0xbc
[<ffffff900845a350>] print_address_description+0x70/0x238
[<ffffff900845a8e4>] kasan_report+0x1cc/0x260
[<ffffff900845aa14>] __asan_report_load4_noabort+0x2c/0x38
[<ffffff900897e098>] gpiochip_irq_map+0x228/0x248
[<ffffff900820cc08>] irq_domain_associate+0x114/0x2ec
[<ffffff900820d13c>] irq_create_mapping+0x120/0x234
[<ffffff900820da78>] irq_create_fwspec_mapping+0x4c8/0x88c
[<ffffff900820e2d8>] irq_create_of_mapping+0x180/0x210
[<ffffff900917114c>] of_irq_get+0x138/0x198
[<ffffff9008dc70ac>] spi_drv_probe+0x94/0x178
[<ffffff9008ca5168>] driver_probe_device+0x51c/0x824
[<ffffff9008ca6538>] __device_attach_driver+0x148/0x20c
[<ffffff9008ca14cc>] bus_for_each_drv+0x120/0x188
[<ffffff9008ca570c>] __device_attach+0x19c/0x2dc
[<ffffff9008ca586c>] device_initial_probe+0x20/0x2c
[<ffffff9008ca18bc>] bus_probe_device+0x80/0x154
[<ffffff9008c9b9b4>] device_add+0x9b8/0xbdc
[<ffffff9008dc7640>] spi_add_device+0x1b8/0x380
[<ffffff9008dcbaf0>] spi_register_controller+0x111c/0x1378
[<ffffff9008dd6b10>] spi_geni_probe+0x4dc/0x6f8
[<ffffff9008cab058>] platform_drv_probe+0xdc/0x130
[<ffffff9008ca5168>] driver_probe_device+0x51c/0x824
[<ffffff9008ca59cc>] __driver_attach+0x100/0x194
[<ffffff9008ca0ea8>] bus_for_each_dev+0x104/0x16c
[<ffffff9008ca58c0>] driver_attach+0x48/0x54
[<ffffff9008ca1edc>] bus_add_driver+0x274/0x498
[<ffffff9008ca8448>] driver_register+0x1ac/0x230
[<ffffff9008caaf6c>] __platform_driver_register+0xcc/0xdc
[<ffffff9009c4b33c>] spi_geni_driver_init+0x1c/0x24
[<ffffff9008084cb8>] do_one_initcall+0x240/0x3dc
[<ffffff9009c017d0>] kernel_init_freeable+0x378/0x468
[<ffffff90096e8240>] kernel_init+0x14/0x110
[<ffffff9008086fcc>] ret_from_fork+0x10/0x18
The buggy address belongs to the page:
page:ffffffbf037791c0 count:0 mapcount:0 mapping: (null) index:0x0
flags: 0x4000000000000000()
raw: 4000000000000000 0000000000000000 0000000000000000 00000000ffffffff
raw: ffffffbf037791e0 ffffffbf037791e0 0000000000000000 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffffffc0dde47180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffffffc0dde47200: f1 f1 f1 f1 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f2 f2
>ffffffc0dde47280: f2 f2 00 00 00 00 00 00 00 00 00 00 f3 f3 f3 f3
^
ffffffc0dde47300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffffffc0dde47380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Let's leave around one unsigned int in the gpio_irq_chip struct for the single parent irq case and repoint the 'parents' array at it. This way code is left mostly intact to setup parents and we waste an extra few bytes per structure of which there should be only a handful in a system.
--- drivers/gpio/gpiolib.c | 3 ++- include/linux/gpio/driver.h | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
drivers/gpio/gpiolib.c +2 -1
@@ -1675,7 +1675,8 @@ static void gpiochip_set_cascaded_irqchip(struct gpio_chip *gpiochip,irq_set_chained_handler_and_data (parent_irq, parent_handler, gpiochip); - gpiochip->irq.parents = &parent_irq; + gpiochip->irq.parent_irq = parent_irq; + gpiochip->irq.parents = &gpiochip->irq.parent_irq; gpiochip->irq.num_parents =1 ; }
include/linux/gpio/driver.h +7 -0
@@ -94,6 +94,13 @@ struct gpio_irq_chip {*/ unsigned int num_parents; +/** +* @parent_irq: +* +* For use by gpiochip_set_cascaded_irqchip() +*/ +unsigned int parent_irq; +/** * @parents: *
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 20/27 IB/mlx5: Unmap DMA addr from HCA before IOMMU
In reply to Sasha LevinFrom: Valentine Fatiev <[email protected]>
[ Upstream commit dd9a403495704fc80fb9f399003013ef2be2ee23 ]
The function that puts back the MR in cache also removes the DMA address from the HCA. Therefore we need to call this function before we remove the DMA mapping from MMU. Otherwise the HCA may access a memory that is no longer DMA mapped.
Call trace: NMI: IOCK error (debug interrupt?) for reason 71 on CPU 0. CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.19.0-rc6+ #4 Hardware name: HP ProLiant DL360p Gen8, BIOS P71 08/20/2012 RIP: 0010:intel_idle+0x73/0x120 Code: 80 5c 01 00 0f ae 38 0f ae f0 31 d2 65 48 8b 04 25 80 5c 01 00 48 89 d1 0f 60 02 RSP: 0018:ffffffff9a403e38 EFLAGS: 00000046 RAX: 0000000000000030 RBX: 0000000000000005 RCX: 0000000000000001 RDX: 0000000000000000 RSI: ffffffff9a5790c0 RDI: 0000000000000000 RBP: 0000000000000030 R08: 0000000000000000 R09: 0000000000007cf9 R10: 000000000000030a R11: 0000000000000018 R12: 0000000000000000 R13: ffffffff9a5792b8 R14: ffffffff9a5790c0 R15: 0000002b48471e4d FS: 0000000000000000(0000) GS:ffff9c6caf400000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f5737185000 CR3: 0000000590c0a002 CR4: 00000000000606f0 Call Trace: cpuidle_enter_state+0x7e/0x2e0 do_idle+0x1ed/0x290 cpu_startup_entry+0x6f/0x80 start_kernel+0x524/0x544 ? set_init_arg+0x55/0x55 secondary_startup_64+0xa4/0xb0
DMAR: DRHD: handling fault status reg 2
DMAR: [DMA Read] Request device [04:00.0] fault addr b34d2000 [fault reason 06] PTE Read access is not set
DMAR: [DMA Read] Request device [01:00.2] fault addr bff8b000 [fault reason 06] PTE Read access is not set
--- drivers/infiniband/hw/mlx5/mr.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/infiniband/hw/mlx5/mr.c +8 -4
@@ -544,6 +544,9 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)int shrink =0 ;int c; +if (!mr->allocated_from_cache) +return ; + c =order2idx (dev, mr->order);if (c <0 || c >=MAX_MR_CACHE_ENTRIES ) {mlx5_ib_warn (dev,"order %d, cache index %d\n" , mr->order, c);
@@ -1647,18 +1650,19 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) umem = NULL; }#endif -clean_mr (dev, mr); +/* +* We should unregister the DMA address from the HCA before +* remove the DMA mapping. +*/ +mlx5_mr_cache_free (dev, mr);if (umem) {ib_umem_release (umem);atomic_sub (npages, &dev->mdev->priv.reg_pages); } -if (!mr->allocated_from_cache)kfree (mr); -else -mlx5_mr_cache_free (dev, mr); }int mlx5_ib_dereg_mr (struct ib_mr *ibmr)
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 21/27 rds: RDS (tcp) hangs on sendto() to unresponding address
In reply to Sasha LevinFrom: Ka-Cheong Poon <[email protected]>
[ Upstream commit 9a4890bd6d6325a1c88564a20ab310b2d56f6094 ]
In rds_send_mprds_hash(), if the calculated hash value is non-zero and the MPRDS connections are not yet up, it will wait. But it should not wait if the send is non-blocking. In this case, it should just use the base c_path for sending the message.
--- net/rds/send.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
net/rds/send.c +10 -3
@@ -1006,7 +1006,8 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm,return ret; } -static int rds_send_mprds_hash (struct rds_sock *rs,struct rds_connection *conn) +static int rds_send_mprds_hash (struct rds_sock *rs, +struct rds_connection *conn,int nonblock) {int hash;
@@ -1022,10 +1023,16 @@ static int rds_send_mprds_hash(struct rds_sock *rs, struct rds_connection *conn)* used. But if we are interrupted, we have to use the zero * c_path in case the connection ends up being non-MP capable. */ -if (conn->c_npaths ==0 ) +if (conn->c_npaths ==0 ) { +/* Cannot wait for the connection be made, so just use +* the base c_path. +*/ +if (nonblock) +return 0 ;if (wait_event_interruptible (conn->c_hs_waitq, conn->c_npaths !=0 )) hash =0 ; + }if (conn->c_npaths ==1 ) hash =0 ; }
@@ -1170,7 +1177,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len) }if (conn->c_trans->t_mp_capable) - cpath = &conn->c_path[rds_send_mprds_hash (rs, conn)]; + cpath = &conn->c_path[rds_send_mprds_hash (rs, conn, nonblock)];else cpath = &conn->c_path[0 ];
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 22/27 selftests: rtnetlink.sh explicitly requires bash.
In reply to Sasha LevinFrom: Paolo Abeni <[email protected]>
[ Upstream commit 3c718e677c2b35b449992adc36ecce883c467e98 ]
the script rtnetlink.sh requires a bash-only features (sleep with sub-second precision). This may cause random test failure if the default shell is not bash.
Address the above explicitly requiring bash as the script interpreter.
--- tools/testing/selftests/net/rtnetlink.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/rtnetlink.sh +1 -1
@@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # This test is for checking rtnetlink callpaths, and get as much coverage as possible. #
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 23/27 selftests: udpgso_bench.sh explicitly requires bash
In reply to Sasha LevinFrom: Paolo Abeni <[email protected]>
[ Upstream commit 12a2ea962c06efb30764c47b140d2ec9d3cd7cb0 ]
The udpgso_bench.sh script requires several bash-only features. This may cause random failures if the default shell is not bash. Address the above explicitly requiring bash as the script interpreter
--- tools/testing/selftests/net/udpgso_bench.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/udpgso_bench.sh +1 -1
@@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Run a series of udpgso benchmarks
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 24/27 vmlinux.lds.h: Fix incomplete .text.exit discards
In reply to Sasha LevinFrom: Peter Oberparleiter <[email protected]>
[ Upstream commit 8dcf86caa1e3daf4a6ccf38e97f4f752b411f829 ]
Enabling CONFIG_GCOV_PROFILE_ALL=y causes linker errors on ARM:
.text.exit' referenced in section .ARM.exidx.text.exit':
defined in discarded section `.text.exit'
.text.exit' referenced in section .fini_array.00100':
defined in discarded section `.text.exit'
And related errors on NDS32:
.text.exit' referenced in section .dtors.65435':
defined in discarded section `.text.exit'
The gcov compiler flags cause certain compiler versions to generate additional destructor-related sections that are not yet handled by the linker script, resulting in references between discarded and non-discarded sections.
Since destructors are not used in the Linux kernel, fix this by discarding these additional sections.
--- arch/arm/kernel/vmlinux.lds.h | 2 ++ include/asm-generic/vmlinux.lds.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-)
arch/arm/kernel/vmlinux.lds.h +2 -0
@@ -49,6 +49,8 @@#define ARM_DISCARD \ *(.ARM.exidx.exit.text) \ *(.ARM.extab.exit.text) \ + *(.ARM.exidx.text.exit) \ + *(.ARM.extab.text.exit) \ ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \ ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \ ARM_EXIT_DISCARD(EXIT_TEXT) \
include/asm-generic/vmlinux.lds.h +2 -2
@@ -617,8 +617,8 @@#define EXIT_DATA \ *(.exit.data .exit.data.*) \ - *(.fini_array) \ - *(.dtors) \ + *(.fini_array .fini_array.*) \ + *(.dtors .dtors.*) \ MEM_DISCARD(exit.data*) \ MEM_DISCARD(exit.rodata*)
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 25/27 vmlinux.lds.h: Fix linker warnings about orphan .LPBX sections
In reply to Sasha LevinFrom: Peter Oberparleiter <[email protected]>
[ Upstream commit 52c8ee5bad8f33d02c567f6609f43d69303fc48d ]
Enabling both CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y and CONFIG_GCOV_PROFILE_ALL=y results in linker warnings:
warning: orphan section .data..LPBX1' being placed in section .data..LPBX1'.
LD_DEAD_CODE_DATA_ELIMINATION adds compiler flag -fdata-sections. This option causes GCC to create separate data sections for data objects, including those generated by GCC internally for gcov profiling. The names of these objects start with a dot (.LPBX0, .LPBX1), resulting in section names starting with 'data..'.
As section names starting with 'data..' are used for specific purposes in the Linux kernel, the linker script does not automatically include them in the output data section, resulting in the "orphan section" linker warnings.
Fix this by specifically including sections named "data..LPBX*" in the data section.
--- include/asm-generic/vmlinux.lds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -70,7 +70,7 @@*/ #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* -#define DATA_MAIN .data .data.[0-9a-zA-Z_]* +#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX*#define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*#define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]*#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 26/27 afs: Fix cell proc list
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit 6b3944e42e2e554aa5a4be681ecd70dccd459114 ]
Access to the list of cells by /proc/net/afs/cells has a couple of problems:
(1) It should be checking against SEQ_START_TOKEN for the keying the header line.
(2) It's only holding the RCU read lock, so it can't just walk over the list without following the proper RCU methods.
Fix these by using an hlist instead of an ordinary list and using the appropriate accessor functions to follow it with RCU.
Since the code that adds a cell to the list must also necessarily change, sort the list on insertion whilst we're at it.
--- fs/afs/cell.c | 17 +++++++++++++++-- fs/afs/dynroot.c | 2 +- fs/afs/internal.h | 4 ++-- fs/afs/main.c | 2 +- fs/afs/proc.c | 7 +++---- 5 files changed, 22 insertions(+), 10 deletions(-)
fs/afs/cell.c +15 -2
@@ -514,6 +514,8 @@ static int afs_alloc_anon_key(struct afs_cell *cell)*/ static int afs_activate_cell (struct afs_net *net,struct afs_cell *cell) { +struct hlist_node **p; +struct afs_cell *pcell;int ret;if (!cell->anonymous_key) {
@@ -534,7 +536,18 @@ static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell)return ret;mutex_lock (&net->proc_cells_lock); -list_add_tail (&cell->proc_link, &net->proc_cells); +for (p = &net->proc_cells.first; *p; p = &(*p)->next) { + pcell = hlist_entry(*p, struct afs_cell, proc_link); +if (strcmp (cell->name, pcell->name) <0 ) +break ; + } + + cell->proc_link.pprev = p; + cell->proc_link.next = *p; +rcu_assign_pointer (*p, &cell->proc_link.next); +if (cell->proc_link.next) + cell->proc_link.next->pprev = &cell->proc_link.next; +afs_dynroot_mkdir (net, cell);mutex_unlock (&net->proc_cells_lock);return 0 ;
@@ -550,7 +563,7 @@ static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell)afs_proc_cell_remove (cell);mutex_lock (&net->proc_cells_lock); -list_del_init (&cell->proc_link); +hlist_del_rcu (&cell->proc_link);afs_dynroot_rmdir (net, cell);mutex_unlock (&net->proc_cells_lock);
fs/afs/dynroot.c +1 -1
@@ -286,7 +286,7 @@ int afs_dynroot_populate(struct super_block *sb)return -ERESTARTSYS ; net->dynroot_sb = sb; -list_for_each_entry (cell, &net->proc_cells, proc_link) { +hlist_for_each_entry (cell, &net->proc_cells, proc_link) { ret =afs_dynroot_mkdir (net, cell);if (ret <0 ) goto error;
fs/afs/internal.h +2 -2
@@ -241,7 +241,7 @@ struct afs_net {seqlock_t cells_lock;struct mutex proc_cells_lock; -struct list_head proc_cells; +struct hlist_head proc_cells;/* Known servers. Theoretically each fileserver can only be in one * cell, but in practice, people create aliases and subsets and there's
@@ -319,7 +319,7 @@ struct afs_cell {struct afs_net *net;struct key *anonymous_key;/* anonymous user key for this cell */ struct work_struct manager;/* Manager for init/deinit/dns */ -struct list_head proc_link;/* /proc cell list link */ +struct hlist_node proc_link;/* /proc cell list link */ #ifdef CONFIG_AFS_FSCACHE struct fscache_cookie *cache;/* caching cookie */ #endif
fs/afs/main.c +1 -1
@@ -87,7 +87,7 @@ static int __net_init afs_net_init(struct net *net_ns)timer_setup (&net->cells_timer, afs_cells_timer,0 );mutex_init (&net->proc_cells_lock); -INIT_LIST_HEAD (&net->proc_cells); +INIT_HLIST_HEAD (&net->proc_cells);seqlock_init (&net->fs_lock); net->fs_servers =RB_ROOT ;
fs/afs/proc.c +3 -4
@@ -33,9 +33,8 @@ static inline struct afs_net *afs_seq2net_single(struct seq_file *m)static int afs_proc_cells_show (struct seq_file *m,void *v) { struct afs_cell *cell = list_entry(v, struct afs_cell, proc_link); -struct afs_net *net =afs_seq2net (m); -if (v == &net->proc_cells) { +if (v ==SEQ_START_TOKEN ) {/* display header on line 1 */ seq_puts (m,"USE NAME\n" );return 0 ;
@@ -50,12 +49,12 @@ static void *afs_proc_cells_start(struct seq_file *m, loff_t *_pos)__acquires (rcu) {rcu_read_lock (); -return seq_list_start_head (&afs_seq2net (m)->proc_cells, *_pos); +return seq_hlist_start_head_rcu (&afs_seq2net (m)->proc_cells, *_pos); }static void *afs_proc_cells_next (struct seq_file *m,void *v,loff_t *pos) { -return seq_list_next (v, &afs_seq2net (m)->proc_cells, pos); +return seq_hlist_next_rcu (v, &afs_seq2net (m)->proc_cells, pos); }static void afs_proc_cells_stop (struct seq_file *m,void *v)
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 27/27 fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
In reply to Sasha LevinFrom: Khazhismel Kumykov <[email protected]>
[ Upstream commit ac081c3be3fae6d0cc3e1862507fca3862d30b67 ]
On non-preempt kernels this loop can take a long time (more than 50 ticks) processing through entries.
--- fs/fat/fatent.c | 1 + 1 file changed, 1 insertion(+)
fs/fat/fatent.c +1 -0
@@ -681,6 +681,7 @@ int fat_count_free_clusters(struct super_block *sb)if (ops->ent_get (&fatent) ==FAT_ENT_FREE ) free++; }while (fat_ent_next (sbi, &fatent)); +cond_resched (); } sbi->free_clusters = free; sbi->free_clus_valid =1 ;
Signature · 1 line
2.17.1