5.4.196-rc1 review
Greg Kroah-Hartman
maintainercover 5.4.196-rc1 review
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.196-rc1
David Howells <[email protected]>
afs: Fix afs_getattr() to refetch file status if callback break occurred
Yang Yingliang <[email protected]>
i2c: mt7621: fix missing clk_disable_unprepare() on error in mtk_i2c_probe()
Peter Zijlstra <[email protected]>
x86/xen: Mark cpu_bringup_and_idle() as dead_end_function
Juergen Gross <[email protected]>
x86/xen: fix booting 32-bit pv guest
Linus Torvalds <[email protected]>
Reinstate some of "swiotlb: rework "fix info leak with DMA_FROM_DEVICE""
Abel Vesa <[email protected]>
ARM: dts: imx7: Use audio_mclk_post_div instead audio_mclk_root_clk
Thiébaud Weksteen <[email protected]>
firmware_loader: use kernel credentials when reading firmware
Tan Tee Min <[email protected]>
net: stmmac: disable Split Header (SPH) for Intel platforms
Ming Lei <[email protected]>
block: return ELEVATOR_DISCARD_MERGE if possible
Marek Vasut <[email protected]>
Input: ili210x - fix reset timing
Grant Grundler <[email protected]>
net: atlantic: verify hw_head_ lies within TX buffer ring
Yang Yingliang <[email protected]>
net: stmmac: fix missing pci_disable_device() on error in stmmac_pci_probe()
Yang Yingliang <[email protected]>
ethernet: tulip: fix missing pci_disable_device() on error in tulip_init_one()
Nicolas Dichtel <[email protected]>
selftests: add ping test with ping_group_range tuned
Felix Fietkau <[email protected]>
mac80211: fix rx reordering with non explicit / psmp ack policy
Gleb Chesnokov <[email protected]>
scsi: qla2xxx: Fix missed DMA unmap for aborted commands
Thomas Richter <[email protected]>
perf bench numa: Address compiler error on s390
Uwe Kleine-König <[email protected]>
gpio: mvebu/pwm: Refuse requests with inverted polarity
Haibo Chen <[email protected]>
gpio: gpio-vf610: do not touch other bits when set the target bit
Andrew Lunn <[email protected]>
net: bridge: Clear offload_fwd_mark when passing frame up bridge interface.
Kevin Mitchell <[email protected]>
igb: skip phy status check where unavailable
Ard Biesheuvel <[email protected]>
ARM: 9197/1: spectre-bhb: fix loop8 sequence for Thumb2
Ard Biesheuvel <[email protected]>
ARM: 9196/1: spectre-bhb: enable for Cortex-A15
Jiasheng Jiang <[email protected]>
net: af_key: add check for pfkey_broadcast in function pfkey_process
Maxim Mikityanskiy <[email protected]>
net/mlx5e: Properly block LRO when XDP is enabled
Duoming Zhou <[email protected]>
NFC: nci: fix sleep in atomic context bugs caused by nci_skb_alloc
Christophe JAILLET <[email protected]>
net/qla3xxx: Fix a test in ql_reset_work()
Codrin Ciubotariu <[email protected]>
clk: at91: generated: consider range when calculating best rate
Paul Greenwalt <[email protected]>
ice: fix possible under reporting of ethtool Tx and Rx statistics
Zixuan Fu <[email protected]>
net: vmxnet3: fix possible NULL pointer dereference in vmxnet3_rq_cleanup()
Zixuan Fu <[email protected]>
net: vmxnet3: fix possible use-after-free bugs in vmxnet3_rq_alloc_rx_buf()
Paolo Abeni <[email protected]>
net/sched: act_pedit: sanitize shift argument before usage
Harini Katakam <[email protected]>
net: macb: Increment rx bd head after allocating skb and buffer
Jae Hyun Yoo <[email protected]>
ARM: dts: aspeed-g6: fix SPI1/SPI2 quad pin group
Jae Hyun Yoo <[email protected]>
ARM: dts: aspeed-g6: remove FWQSPID group in pinctrl dtsi
Jérôme Pouiller <[email protected]>
dma-buf: fix use of DMA_BUF_SET_NAME_{A,B} in userspace
Hangyu Hua <[email protected]>
drm/dp/mst: fix a possible memory leak in fetch_monitor_name()
Ondrej Mosnacek <[email protected]>
crypto: qcom-rng - fix infinite loop on requests not multiple of WORD_SZ
Sean Christopherson <[email protected]>
KVM: x86/mmu: Update number of zapped pages even if page list is stable
Rafael J. Wysocki <[email protected]>
PCI/PM: Avoid putting Elo i2 PCIe Ports in D3cold
Al Viro <[email protected]>
Fix double fget() in vhost_net_set_backend()
Peter Zijlstra <[email protected]>
perf: Fix sys_perf_event_open() race against self
Takashi Iwai <[email protected]>
ALSA: wavefront: Proper check of get_user() error
Meena Shanmugam <[email protected]>
SUNRPC: Ensure we flush any closed sockets before xs_xprt_free()
Meena Shanmugam <[email protected]>
SUNRPC: Don't call connect() more than once on a TCP socket
Meena Shanmugam <[email protected]>
SUNRPC: Prevent immediate close+reconnect
Meena Shanmugam <[email protected]>
SUNRPC: Clean up scheduling of autoclose
Ulf Hansson <[email protected]>
mmc: core: Default to generic_cmd6_time as timeout in __mmc_switch()
Ulf Hansson <[email protected]>
mmc: block: Use generic_cmd6_time when modifying INAND_CMD38_ARG_EXT_CSD
Ulf Hansson <[email protected]>
mmc: core: Specify timeouts for BKOPS and CACHE_FLUSH for eMMC
Ryusuke Konishi <[email protected]>
nilfs2: fix lockdep warnings during disk space reclamation
Ryusuke Konishi <[email protected]>
nilfs2: fix lockdep warnings in page operations for btree nodes
linyujun <[email protected]>
ARM: 9191/1: arm/stacktrace, kasan: Silence KASAN warnings in unwind_frame()
Tzung-Bi Shih <[email protected]>
platform/chrome: cros_ec_debugfs: detach log reader wq from devm
Jakob Koschel <[email protected]>
drbd: remove usage of list iterator variable after loop
Xiaoke Wang <[email protected]>
MIPS: lantiq: check the return value of kzalloc()
Mario Limonciello <[email protected]>
rtc: mc146818-lib: Fix the AltCentury for AMD platforms
Anton Eidelman <[email protected]>
nvme-multipath: fix hang when disk goes live over reconnect
Kai-Heng Feng <[email protected]>
ALSA: hda/realtek: Enable headset mic on Lenovo P360
Peter Zijlstra <[email protected]>
crypto: x86/chacha20 - Avoid spurious jumps to other functions
Zheng Yongjun <[email protected]>
crypto: stm32 - fix reference leak in stm32_crc_remove
Zheng Yongjun <[email protected]>
Input: stmfts - fix reference leak in stmfts_input_open
Jeff LaBundy <[email protected]>
Input: add bounds checking to input_set_capability()
David Gow <[email protected]>
um: Cleanup syscall_handler_t definition/cast, fix warning
Vincent Whitchurch <[email protected]>
rtc: fix use-after-free on device removal
Miroslav Benes <[email protected]>
x86/xen: Make the secondary CPU idle tasks reliable
Miroslav Benes <[email protected]>
x86/xen: Make the boot CPU idle task reliable
Willy Tarreau <[email protected]>
floppy: use a statically allocated error counter
-------------
Diffstat:
Documentation/DMA-attributes.txt | 10 -- Makefile | 4 +- arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi | 9 +- arch/arm/boot/dts/imx7-colibri.dtsi | 4 +- arch/arm/boot/dts/imx7-mba7.dtsi | 2 +- arch/arm/boot/dts/imx7d-nitrogen7.dts | 2 +- arch/arm/boot/dts/imx7d-pico-hobbit.dts | 4 +- arch/arm/boot/dts/imx7d-pico-pi.dts | 4 +- arch/arm/boot/dts/imx7d-sdb.dts | 2 +- arch/arm/boot/dts/imx7s-warp.dts | 4 +- arch/arm/kernel/entry-armv.S | 2 +- arch/arm/kernel/stacktrace.c | 10 +- arch/arm/mm/proc-v7-bugs.c | 1 + arch/mips/lantiq/falcon/sysctrl.c | 2 + arch/mips/lantiq/xway/gptu.c | 2 + arch/mips/lantiq/xway/sysctrl.c | 46 +++--- arch/x86/crypto/chacha-avx512vl-x86_64.S | 4 +- arch/x86/kvm/mmu.c | 10 +- arch/x86/um/shared/sysdep/syscalls_64.h | 5 +- arch/x86/xen/smp_pv.c | 3 +- arch/x86/xen/xen-head.S | 18 ++- block/bfq-iosched.c | 3 + block/blk-merge.c | 15 -- block/elevator.c | 3 + block/mq-deadline.c | 2 + drivers/base/firmware_loader/main.c | 17 +++ drivers/block/drbd/drbd_main.c | 7 +- drivers/block/floppy.c | 20 ++- drivers/clk/at91/clk-generated.c | 4 + drivers/crypto/qcom-rng.c | 1 + drivers/crypto/stm32/stm32-crc32.c | 4 +- drivers/gpio/gpio-mvebu.c | 3 + drivers/gpio/gpio-vf610.c | 8 +- drivers/gpu/drm/drm_dp_mst_topology.c | 1 + drivers/i2c/busses/i2c-mt7621.c | 10 +- drivers/input/input.c | 19 +++ drivers/input/touchscreen/ili210x.c | 4 +- drivers/input/touchscreen/stmfts.c | 8 +- drivers/mmc/core/block.c | 6 +- drivers/mmc/core/mmc_ops.c | 25 ++-- .../ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 7 + drivers/net/ethernet/cadence/macb_main.c | 2 +- drivers/net/ethernet/dec/tulip/tulip_core.c | 5 +- drivers/net/ethernet/intel/ice/ice_main.c | 7 +- drivers/net/ethernet/intel/igb/igb_main.c | 3 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 7 + drivers/net/ethernet/qlogic/qla3xxx.c | 3 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +- drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 5 +- drivers/net/vmxnet3/vmxnet3_drv.c | 6 + drivers/nvme/host/core.c | 1 + drivers/nvme/host/multipath.c | 25 +++- drivers/nvme/host/nvme.h | 4 + drivers/pci/pci.c | 10 ++ drivers/platform/chrome/cros_ec_debugfs.c | 12 +- drivers/rtc/class.c | 9 ++ drivers/rtc/rtc-mc146818-lib.c | 16 ++- drivers/scsi/qla2xxx/qla_target.c | 3 + drivers/vhost/net.c | 15 +- fs/afs/inode.c | 14 +- fs/file_table.c | 1 + fs/nilfs2/btnode.c | 23 ++- fs/nilfs2/btnode.h | 1 + fs/nilfs2/btree.c | 27 ++-- fs/nilfs2/dat.c | 4 +- fs/nilfs2/gcinode.c | 7 +- fs/nilfs2/inode.c | 159 +++++++++++++++++++-- fs/nilfs2/mdt.c | 43 ++++-- fs/nilfs2/mdt.h | 6 +- fs/nilfs2/nilfs.h | 16 +-- fs/nilfs2/page.c | 7 +- fs/nilfs2/segment.c | 9 +- fs/nilfs2/super.c | 5 +- include/linux/blkdev.h | 16 +++ include/linux/dma-mapping.h | 8 -- include/linux/mc146818rtc.h | 2 + include/linux/stmmac.h | 1 + include/linux/sunrpc/xprtsock.h | 1 + include/uapi/linux/dma-buf.h | 4 +- kernel/dma/swiotlb.c | 13 +- kernel/events/core.c | 14 ++ net/bridge/br_input.c | 7 + net/key/af_key.c | 6 +- net/mac80211/rx.c | 3 +- net/nfc/nci/data.c | 2 +- net/nfc/nci/hci.c | 4 +- net/sched/act_pedit.c | 4 + net/sunrpc/xprt.c | 34 ++--- net/sunrpc/xprtsock.c | 36 +++-- sound/isa/wavefront/wavefront_synth.c | 3 +- sound/pci/hda/patch_realtek.c | 1 + tools/objtool/check.c | 1 + tools/perf/bench/numa.c | 2 +- tools/testing/selftests/net/fcnal-test.sh | 12 ++ 94 files changed, 682 insertions(+), 264 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/68 floppy: use a statically allocated error counter
From: Willy Tarreau <[email protected]>
commit f71f01394f742fc4558b3f9f4c7ef4c4cf3b07c8 upstream.
Interrupt handler bad_flp_intr() may cause a UAF on the recently freed request just to increment the error count. There's no point keeping that one in the request anyway, and since the interrupt handler uses a static pointer to the error which cannot be kept in sync with the pending request, better make it use a static error counter that's reset for each new request. This reset now happens when entering redo_fd_request() for a new request via set_next_request().
One initial concern about a single error counter was that errors on one floppy drive could be reported on another one, but this problem is not real given that the driver uses a single drive at a time, as that PC-compatible controllers also have this limitation by using shared signals. As such the error count is always for the "current" drive.
--- drivers/block/floppy.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/block/floppy.c +9 -11
@@ -521,8 +521,8 @@ static unsigned long fdc_busy;static DECLARE_WAIT_QUEUE_HEAD (fdc_wait);static DECLARE_WAIT_QUEUE_HEAD (command_done); -/* Errors during formatting are counted here. */ -static int format_errors; +/* errors encountered on the current (or last) request */ +static int floppy_errors;/* Format request descriptor. */ static struct format_descr format_req;
@@ -542,7 +542,6 @@ static struct format_descr format_req;static char *floppy_track_buffer;static int max_buffer_sectors; -static int *errors;typedef void (*done_f )(int ); static const struct cont_t { void (*interrupt)(void);
@@ -1435,7 +1434,7 @@ static int interpret_errors(void)if (DP ->flags &FTD_MSG )DPRINT ("Over/Underrun - retrying\n" ); bad =0 ; - }else if (*errors >=DP ->max_errors.reporting) { + }else if (floppy_errors >=DP ->max_errors.reporting) {print_errors (); }if (ST2 &ST2_WC ||ST2 &ST2_BC )
@@ -2055,7 +2054,7 @@ static void bad_flp_intr(void)if (!next_valid_format ())return ; } - err_count = ++(*errors); + err_count = ++floppy_errors;INFBOUND (DRWE ->badness, err_count);if (err_count >DP ->max_errors.abort) cont->done (0 );
@@ -2200,9 +2199,8 @@ static int do_format(int drive, struct freturn -EINVAL ; } format_req = *tmp_format_req; - format_errors =0 ; cont = &format_cont; - errors = &format_errors; + floppy_errors =0 ; ret =wait_til_done (redo_format, true);if (ret == -EINTR )return -EINTR ;
@@ -2677,7 +2675,7 @@ static int make_raw_rw_request(void)*/ if (!direct || (indirect *2 > direct *3 && - *errors <DP ->max_errors.read_track && + floppy_errors <DP ->max_errors.read_track && ((!probing || (DP ->read_track & (1 <<DRS ->probed_format)))))) { max_size =blk_rq_sectors (current_req);
@@ -2801,10 +2799,11 @@ static int set_next_request(void) current_req = list_first_entry_or_null(&floppy_reqs, struct request, queuelist);if (current_req) { - current_req->error_count =0 ; + floppy_errors =0 ;list_del_init (¤t_req->queuelist); +return 1 ; } -return current_req !=NULL ; +return 0 ; }static void redo_fd_request (void )
@@ -2860,7 +2859,6 @@ do_request: _floppy = floppy_type +DP ->autodetect[DRS ->probed_format]; }else probing =0 ; - errors = &(current_req->error_count); tmp =make_raw_rw_request ();if (tmp <2 ) {request_done (tmp);
Greg Kroah-Hartman
maintainerPATCH 2/68 x86/xen: Make the boot CPU idle task reliable
In reply to Greg Kroah-HartmanFrom: Miroslav Benes <[email protected]>
commit 2f62f36e62daec43aa7b9633ef7f18e042a80bed upstream.
The unwinder reports the boot CPU idle task's stack on XEN PV as unreliable, which affects at least live patching. There are two reasons for this. First, the task does not follow the x86 convention that its stack starts at the offset right below saved pt_regs. It allows the unwinder to easily detect the end of the stack and verify it. Second, startup_xen() function does not store the return address before jumping to xen_start_kernel() which confuses the unwinder.
Amend both issues by moving the starting point of initial stack in startup_xen() and storing the return address before the jump, which is exactly what call instruction does.
--- arch/x86/xen/xen-head.S | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/x86/xen/xen-head.S +6 -2
@@ -35,7 +35,11 @@ ENTRY(startup_xen) rep __ASM_SIZE(stos) mov %_ASM_SI, xen_start_info - mov $init_thread_union+THREAD_SIZE, %_ASM_SP +#ifdef CONFIG_X86_64 + mov initial_stack(%rip), %rsp +#else + mov pa(initial_stack), %esp +#endif #ifdef CONFIG_X86_64 /* Set up %gs.
@@ -51,7 +55,7 @@ ENTRY(startup_xen) wrmsr #endif - jmp xen_start_kernel + call xen_start_kernel END(startup_xen) __FINIT #endif
Greg Kroah-Hartman
maintainerPATCH 3/68 x86/xen: Make the secondary CPU idle tasks reliable
In reply to Greg Kroah-HartmanFrom: Miroslav Benes <[email protected]>
commit c3881eb58d56116c79ac4ee4f40fd15ead124c4b upstream.
The unwinder reports the secondary CPU idle tasks' stack on XEN PV as unreliable, which affects at least live patching. cpu_initialize_context() sets up the context of the CPU through VCPUOP_initialise hypercall. After it is woken up, the idle task starts in cpu_bringup_and_idle() function and its stack starts at the offset right below pt_regs. The unwinder correctly detects the end of stack there but it is confused by NULL return address in the last frame.
Introduce a wrapper in assembly, which just calls cpu_bringup_and_idle(). The return address is thus pushed on the stack and the wrapper contains the annotation hint for the unwinder regarding the stack state.
--- arch/x86/xen/smp_pv.c | 3 ++- arch/x86/xen/xen-head.S | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-)
arch/x86/xen/smp_pv.c +2 -1
@@ -53,6 +53,7 @@ static DEFINE_PER_CPU(struct xen_common_ static DEFINE_PER_CPU(struct xen_common_irq, xen_pmu_irq) = { .irq = -1 };static irqreturn_t xen_irq_work_interrupt (int irq,void *dev_id); +void asm_cpu_bringup_and_idle (void );static void cpu_bringup (void ) {
@@ -310,7 +311,7 @@ cpu_initialize_context(unsigned int cpu,* pointing just below where pt_regs would be if it were a normal * kernel entry. */ - ctxt->user_regs.eip = (unsigned long )cpu_bringup_and_idle; + ctxt->user_regs.eip = (unsigned long )asm_cpu_bringup_and_idle; ctxt->flags =VGCF_IN_KERNEL ; ctxt->user_regs.eflags =0x1000 ;/* IOPL_RING1 */ ctxt->user_regs.ds = __USER_DS;
arch/x86/xen/xen-head.S +10 -0
@@ -58,6 +58,16 @@ ENTRY(startup_xen) call xen_start_kernel END(startup_xen) __FINIT + +#ifdef CONFIG_XEN_PV_SMP +.pushsection .text +SYM_CODE_START(asm_cpu_bringup_and_idle) + UNWIND_HINT_EMPTY + + call cpu_bringup_and_idle +SYM_CODE_END(asm_cpu_bringup_and_idle) +.popsection +#endif #endif .pushsection .text
Greg Kroah-Hartman
maintainerPATCH 4/68 rtc: fix use-after-free on device removal
In reply to Greg Kroah-HartmanFrom: Vincent Whitchurch <[email protected]>
[ Upstream commit c8fa17d9f08a448184f03d352145099b5beb618e ]
If the irqwork is still scheduled or running while the RTC device is removed, a use-after-free occurs in rtc_timer_do_work(). Cleanup the timerqueue and ensure the work is stopped to fix this.
BUG: KASAN: use-after-free in mutex_lock+0x94/0x110 Write of size 8 at addr ffffff801d846338 by task kworker/3:1/41 Workqueue: events rtc_timer_do_work Call trace: mutex_lock+0x94/0x110 rtc_timer_do_work+0xec/0x630 process_one_work+0x5fc/0x1344 ... Allocated by task 551: kmem_cache_alloc_trace+0x384/0x6e0 devm_rtc_allocate_device+0xf0/0x574 devm_rtc_device_register+0x2c/0x12c ... Freed by task 572: kfree+0x114/0x4d0 rtc_device_release+0x64/0x80 device_release+0x8c/0x1f4 kobject_put+0x1c4/0x4b0 put_device+0x20/0x30 devm_rtc_release_device+0x1c/0x30 devm_action_release+0x54/0x90 release_nodes+0x124/0x310 devres_release_group+0x170/0x240 i2c_device_remove+0xd8/0x314 ... Last potentially related work creation: insert_work+0x5c/0x330 queue_work_on+0xcc/0x154 rtc_set_time+0x188/0x5bc rtc_dev_ioctl+0x2ac/0xbd0 ...
--- drivers/rtc/class.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/rtc/class.c +9 -0
@@ -26,6 +26,15 @@ struct class *rtc_class;static void rtc_device_release (struct device *dev) {struct rtc_device *rtc =to_rtc_device (dev); +struct timerqueue_head *head = &rtc->timerqueue; +struct timerqueue_node *node; + +mutex_lock (&rtc->ops_lock); +while ((node =timerqueue_getnext (head))) +timerqueue_del (head, node); +mutex_unlock (&rtc->ops_lock); + +cancel_work_sync (&rtc->irqwork);ida_simple_remove (&rtc_ida, rtc->id);kfree (rtc);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 5/68 um: Cleanup syscall_handler_t definition/cast, fix warning
In reply to Greg Kroah-HartmanFrom: David Gow <[email protected]>
[ Upstream commit f4f03f299a56ce4d73c5431e0327b3b6cb55ebb9 ]
The syscall_handler_t type for x86_64 was defined as 'long (*)(void)', but always cast to 'long (*)(long, long, long, long, long, long)' before use. This now triggers a warning (see below).
Define syscall_handler_t as the latter instead, and remove the cast. This simplifies the code, and fixes the warning.
Warning:
In file included from ../arch/um/include/asm/processor-generic.h:13
from ../arch/x86/um/asm/processor.h:41
from ../include/linux/rcupdate.h:30
from ../include/linux/rculist.h:11
from ../include/linux/pid.h:5
from ../include/linux/sched.h:14
from ../include/linux/ptrace.h:6
from ../arch/um/kernel/skas/syscall.c:7:../arch/um/kernel/skas/syscall.c: In function ‘handle_syscall’:../arch/x86/um/shared/sysdep/syscalls_64.h:18:11: warning: cast between incompatible function types from ‘long int (*)(void)’ to ‘long int (*)(long int, long int, long int, long int, long int, long int)’ [ -Wcast-function-type]
18 | (((long (*)(long, long, long, long, long, long)) \
| ^../arch/x86/um/asm/ptrace.h:36:62: note: in definition of macro ‘PT_REGS_SET_SYSCALL_RETURN’
36 | #define PT_REGS_SET_SYSCALL_RETURN(r, res) (PT_REGS_AX(r) = (res))
| ^~~../arch/um/kernel/skas/syscall.c:46:33: note: in expansion of macro ‘EXECUTE_SYSCALL’
46 | EXECUTE_SYSCALL(syscall, regs));
| ^~~~~~~~~~~~~~~--- arch/x86/um/shared/sysdep/syscalls_64.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/x86/um/shared/sysdep/syscalls_64.h +2 -3
@@ -10,13 +10,12 @@#include <linux/msg.h> #include <linux/shm.h> -typedef long syscall_handler_t (void ); +typedef long syscall_handler_t (long ,long ,long ,long ,long ,long );extern syscall_handler_t *sys_call_table[];#define EXECUTE_SYSCALL (syscall, regs) \ - (((long (*)(long, long, long, long, long, long)) \ - (*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(®s->regs), \ + (((*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(®s->regs), \ UPT_SYSCALL_ARG2(®s->regs), \ UPT_SYSCALL_ARG3(®s->regs), \ UPT_SYSCALL_ARG4(®s->regs), \
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 6/68 Input: add bounds checking to input_set_capability()
In reply to Greg Kroah-HartmanFrom: Jeff LaBundy <[email protected]>
[ Upstream commit 409353cbe9fe48f6bc196114c442b1cff05a39bc ]
Update input_set_capability() to prevent kernel panic in case the event code exceeds the bitmap for the given event type.
--- drivers/input/input.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/input/input.c +19 -0
@@ -47,6 +47,17 @@ static DEFINE_MUTEX(input_mutex);static const struct input_value input_value_sync = {EV_SYN ,SYN_REPORT ,1 }; +static const unsigned int input_max_code[EV_CNT ] = { + [EV_KEY ] =KEY_MAX , + [EV_REL ] =REL_MAX , + [EV_ABS ] =ABS_MAX , + [EV_MSC ] =MSC_MAX , + [EV_SW ] =SW_MAX , + [EV_LED ] =LED_MAX , + [EV_SND ] =SND_MAX , + [EV_FF ] =FF_MAX , +}; +static inline int is_event_supported (unsigned int code,unsigned long *bm,unsigned int max) {
@@ -1978,6 +1989,14 @@ EXPORT_SYMBOL(input_get_timestamp);*/ void input_set_capability (struct input_dev *dev,unsigned int type,unsigned int code) { +if (type <EV_CNT && input_max_code[type] && + code > input_max_code[type]) { +pr_err ("%s: invalid code %u for type %u\n" , __func__, code, + type); +dump_stack (); +return ; + } +switch (type) {case EV_KEY :__set_bit (code, dev->keybit);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 7/68 Input: stmfts - fix reference leak in stmfts_input_open
In reply to Greg Kroah-HartmanFrom: Zheng Yongjun <[email protected]>
[ Upstream commit 26623eea0da3476446909af96c980768df07bbd9 ]
pm_runtime_get_sync() will increment pm usage counter even it failed. Forgetting to call pm_runtime_put_noidle will result in reference leak in stmfts_input_open, so we should fix it.
--- drivers/input/touchscreen/stmfts.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/input/touchscreen/stmfts.c +5 -3
@@ -339,11 +339,11 @@ static int stmfts_input_open(struct input_dev *dev) err =pm_runtime_get_sync (&sdata->client->dev);if (err <0 ) -return err; + goto out; err =i2c_smbus_write_byte (sdata->client,STMFTS_MS_MT_SENSE_ON );if (err) -return err; + goto out;mutex_lock (&sdata->mutex); sdata->running = true;
@@ -366,7 +366,9 @@ static int stmfts_input_open(struct input_dev *dev) "failed to enable touchkey\n"); } -return 0 ; +out: +pm_runtime_put_noidle (&sdata->client->dev); +return err; }static void stmfts_input_close (struct input_dev *dev)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 8/68 crypto: stm32 - fix reference leak in stm32_crc_remove
In reply to Greg Kroah-HartmanFrom: Zheng Yongjun <[email protected]>
[ Upstream commit e9a36feecee0ee5845f2e0656f50f9942dd0bed3 ]
pm_runtime_get_sync() will increment pm usage counter even it failed. Forgetting to call pm_runtime_put_noidle will result in reference leak in stm32_crc_remove, so we should fix it.
--- drivers/crypto/stm32/stm32-crc32.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/crypto/stm32/stm32-crc32.c +3 -1
@@ -332,8 +332,10 @@ static int stm32_crc_remove(struct platform_device *pdev)struct stm32_crc *crc =platform_get_drvdata (pdev);int ret =pm_runtime_get_sync (crc->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_noidle (crc->dev);return ret; + }spin_lock (&crc_list.lock);list_del (&crc->list);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 9/68 crypto: x86/chacha20 - Avoid spurious jumps to other functions
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit 4327d168515fd8b5b92fa1efdf1d219fb6514460 ]
The chacha_Nblock_xor_avx512vl() functions all have their own, identical, .LdoneN label, however in one particular spot {2,4} jump to the 8 version instead of their own. Resulting in:
arch/x86/crypto/chacha-x86_64.o: warning: objtool: chacha_2block_xor_avx512vl() falls through to next function chacha_8block_xor_avx512vl() arch/x86/crypto/chacha-x86_64.o: warning: objtool: chacha_4block_xor_avx512vl() falls through to next function chacha_8block_xor_avx512vl()
Make each function consistently use its own done label.
--- arch/x86/crypto/chacha-avx512vl-x86_64.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/crypto/chacha-avx512vl-x86_64.S +2 -2
@@ -172,7 +172,7 @@ ENTRY(chacha_2block_xor_avx512vl) # xor remaining bytes from partial register into output mov %rcx,%rax and $0xf,%rcx - jz .Ldone8 + jz .Ldone2 mov %rax,%r9 and $~0xf,%r9
@@ -438,7 +438,7 @@ ENTRY(chacha_4block_xor_avx512vl) # xor remaining bytes from partial register into output mov %rcx,%rax and $0xf,%rcx - jz .Ldone8 + jz .Ldone4 mov %rax,%r9 and $~0xf,%r9
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 10/68 ALSA: hda/realtek: Enable headset mic on Lenovo P360
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 5a8738571747c1e275a40b69a608657603867b7e ]
Lenovo P360 is another platform equipped with ALC897, and it needs ALC897_FIXUP_HEADSET_MIC_PIN quirk to make its headset mic work.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10233,6 +10233,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {SND_PCI_QUIRK (0x144d ,0xc051 ,"Samsung R720" ,ALC662_FIXUP_IDEAPAD ),SND_PCI_QUIRK (0x14cd ,0x5003 ,"USI" ,ALC662_FIXUP_USI_HEADSET_MODE ),SND_PCI_QUIRK (0x17aa ,0x1036 ,"Lenovo P520" ,ALC662_FIXUP_LENOVO_MULTI_CODECS ), +SND_PCI_QUIRK (0x17aa ,0x1057 ,"Lenovo P360" ,ALC897_FIXUP_HEADSET_MIC_PIN ),SND_PCI_QUIRK (0x17aa ,0x32ca ,"Lenovo ThinkCentre M80" ,ALC897_FIXUP_HEADSET_MIC_PIN ),SND_PCI_QUIRK (0x17aa ,0x32cb ,"Lenovo ThinkCentre M70" ,ALC897_FIXUP_HEADSET_MIC_PIN ), SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/68 nvme-multipath: fix hang when disk goes live over reconnect
In reply to Greg Kroah-HartmanFrom: Anton Eidelman <[email protected]>
[ Upstream commit a4a6f3c8f61c3cfbda4998ad94596059ad7e4332 ]
nvme_mpath_init_identify() invoked from nvme_init_identify() fetches a fresh ANA log from the ctrl. This is essential to have an up to date path states for both existing namespaces and for those scan_work may discover once the ctrl is up.
This happens in the following cases:
1) A new ctrl is being connected.
2) An existing ctrl is successfully reconnected.
3) An existing ctrl is being reset.
While in (1) ctrl->namespaces is empty, (2 & 3) may have namespaces, and nvme_read_ana_log() may call nvme_update_ns_ana_state().
This result in a hang when the ANA state of an existing namespace changes and makes the disk live: nvme_mpath_set_live() issues IO to the namespace through the ctrl, which does NOT have IO queues yet.
See sample hang below.
Solution:
- nvme_update_ns_ana_state() to call set_live only if ctrl is live
- nvme_read_ana_log() call from nvme_mpath_init_identify() therefore only fetches and parses the ANA log;
any erros in this process will fail the ctrl setup as appropriate;
- a separate function nvme_mpath_update()
is called in nvme_start_ctrl();
this parses the ANA log without fetching it.
At this point the ctrl is live,
therefore, disks can be set live normally.
Sample failure:
nvme nvme0: starting error recovery
nvme nvme0: Reconnecting in 10 seconds...
block nvme0n6: no usable path - requeuing I/O
INFO: task kworker/u8:3:312 blocked for more than 122 seconds.
Tainted: G E 5.14.5-1.el7.elrepo.x86_64 #1
Workqueue: nvme-wq nvme_tcp_reconnect_ctrl_work [nvme_tcp]
Call Trace:
__schedule+0x2a2/0x7e0
schedule+0x4e/0xb0
io_schedule+0x16/0x40
wait_on_page_bit_common+0x15c/0x3e0
do_read_cache_page+0x1e0/0x410
read_cache_page+0x12/0x20
read_part_sector+0x46/0x100
read_lba+0x121/0x240
efi_partition+0x1d2/0x6a0
bdev_disk_changed.part.0+0x1df/0x430
bdev_disk_changed+0x18/0x20
blkdev_get_whole+0x77/0xe0
blkdev_get_by_dev+0xd2/0x3a0
__device_add_disk+0x1ed/0x310
device_add_disk+0x13/0x20
nvme_mpath_set_live+0x138/0x1b0 [nvme_core]
nvme_update_ns_ana_state+0x2b/0x30 [nvme_core]
nvme_update_ana_state+0xca/0xe0 [nvme_core]
nvme_parse_ana_log+0xac/0x170 [nvme_core]
nvme_read_ana_log+0x7d/0xe0 [nvme_core]
nvme_mpath_init_identify+0x105/0x150 [nvme_core]
nvme_init_identify+0x2df/0x4d0 [nvme_core]
nvme_init_ctrl_finish+0x8d/0x3b0 [nvme_core]
nvme_tcp_setup_ctrl+0x337/0x390 [nvme_tcp]
nvme_tcp_reconnect_ctrl_work+0x24/0x40 [nvme_tcp]
process_one_work+0x1bd/0x360
worker_thread+0x50/0x3d0--- drivers/nvme/host/core.c | 1 + drivers/nvme/host/multipath.c | 25 +++++++++++++++++++++++-- drivers/nvme/host/nvme.h | 4 ++++ 3 files changed, 28 insertions(+), 2 deletions(-)
drivers/nvme/host/core.c +1 -0
@@ -4047,6 +4047,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)if (ctrl->queue_count >1 ) {nvme_queue_scan (ctrl);nvme_start_queues (ctrl); +nvme_mpath_update (ctrl); } ctrl->created = true; }
drivers/nvme/host/multipath.c +23 -2
@@ -501,8 +501,17 @@ static void nvme_update_ns_ana_state(struct nvme_ana_group_desc *desc, ns->ana_grpid =le32_to_cpu (desc->grpid); ns->ana_state = desc->state;clear_bit (NVME_NS_ANA_PENDING , &ns->flags); - -if (nvme_state_is_live (ns->ana_state)) +/* +* nvme_mpath_set_live() will trigger I/O to the multipath path device +* and in turn to this path device. However we cannot accept this I/O +* if the controller is not live. This may deadlock if called from +* nvme_mpath_init_identify() and the ctrl will never complete +* initialization, preventing I/O from completing. For this case we +* will reprocess the ANA log page in nvme_mpath_update() once the +* controller is ready. +*/ +if (nvme_state_is_live (ns->ana_state) && + ns->ctrl->state ==NVME_CTRL_LIVE )nvme_mpath_set_live (ns); }
@@ -586,6 +595,18 @@ static void nvme_ana_work(struct work_struct *work)nvme_read_ana_log (ctrl); } +void nvme_mpath_update (struct nvme_ctrl *ctrl) +{ +u32 nr_change_groups =0 ; + +if (!ctrl->ana_log_buf) +return ; + +mutex_lock (&ctrl->ana_lock); +nvme_parse_ana_log (ctrl, &nr_change_groups, nvme_update_ana_state); +mutex_unlock (&ctrl->ana_lock); +} +static void nvme_anatt_timeout (struct timer_list *t) {struct nvme_ctrl *ctrl =from_timer (ctrl, t, anatt_timer);
drivers/nvme/host/nvme.h +4 -0
@@ -551,6 +551,7 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id);void nvme_mpath_remove_disk (struct nvme_ns_head *head);int nvme_mpath_init_identify (struct nvme_ctrl *ctrl,struct nvme_id_ctrl *id);void nvme_mpath_init_ctrl (struct nvme_ctrl *ctrl); +void nvme_mpath_update (struct nvme_ctrl *ctrl);void nvme_mpath_uninit (struct nvme_ctrl *ctrl);void nvme_mpath_stop (struct nvme_ctrl *ctrl);bool nvme_mpath_clear_current_path (struct nvme_ns *ns);
@@ -648,6 +649,9 @@ static inline int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, "Please enable CONFIG_NVME_MULTIPATH for full support of multi-port devices.\n");return 0 ; } +static inline void nvme_mpath_update (struct nvme_ctrl *ctrl) +{ +}static inline void nvme_mpath_uninit (struct nvme_ctrl *ctrl) { }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/68 rtc: mc146818-lib: Fix the AltCentury for AMD platforms
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
[ Upstream commit 3ae8fd41573af4fb3a490c9ed947fc936ba87190 ]
Setting the century forward has been failing on AMD platforms. There was a previous attempt at fixing this for family 0x17 as part of commit 7ad295d5196a ("rtc: Fix the AltCentury value on AMD/Hygon platform") but this was later reverted due to some problems reported that appeared to stem from an FW bug on a family 0x17 desktop system.
The same comments mentioned in the previous commit continue to apply to the newer platforms as well.
``` MC146818 driver use function mc146818_set_time() to set register RTC_FREQ_SELECT(RTC_REG_A)'s bit4-bit6 field which means divider stage reset value on Intel platform to 0x7. While AMD/Hygon RTC_REG_A(0Ah)'s bit4 is defined as DV0 [Reference]: DV0 = 0 selects Bank 0, DV0 = 1 selects Bank 1. Bit5-bit6 is defined as reserved. DV0 is set to 1, it will select Bank 1, which will disable AltCentury register(0x32) access. As UEFI pass acpi_gbl_FADT.century 0x32 (AltCentury), the CMOS write will be failed on code: CMOS_WRITE(century, acpi_gbl_FADT.century). Correct RTC_REG_A bank select bit(DV0) to 0 on AMD/Hygon CPUs, it will enable AltCentury(0x32) register writing and finally setup century as expected. ```
However in closer examination the change previously submitted was also modifying bits 5 & 6 which are declared reserved in the AMD documentation. So instead modify just the DV0 bank selection bit.
Being cognizant that there was a failure reported before, split the code change out to a static function that can also be used for exclusions if any regressions such as Mikhail's pop up again.
--- drivers/rtc/rtc-mc146818-lib.c | 16 +++++++++++++++- include/linux/mc146818rtc.h | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-)
drivers/rtc/rtc-mc146818-lib.c +15 -1
@@ -99,6 +99,17 @@ unsigned int mc146818_get_time(struct rtc_time *time) }EXPORT_SYMBOL_GPL (mc146818_get_time); +/* AMD systems don't allow access to AltCentury with DV1 */ +static bool apply_amd_register_a_behavior (void ) +{ +#ifdef CONFIG_X86 +if (boot_cpu_data.x86_vendor ==X86_VENDOR_AMD || + boot_cpu_data.x86_vendor ==X86_VENDOR_HYGON ) +return true; +#endif +return false; +} +/* Set the current date and time in the real time clock. */ int mc146818_set_time (struct rtc_time *time) {
@@ -172,7 +183,10 @@ int mc146818_set_time(struct rtc_time *time) save_control =CMOS_READ (RTC_CONTROL );CMOS_WRITE ((save_control|RTC_SET ),RTC_CONTROL ); save_freq_select =CMOS_READ (RTC_FREQ_SELECT ); -CMOS_WRITE ((save_freq_select|RTC_DIV_RESET2 ),RTC_FREQ_SELECT ); +if (apply_amd_register_a_behavior ()) +CMOS_WRITE ((save_freq_select & ~RTC_AMD_BANK_SELECT ),RTC_FREQ_SELECT ); +else +CMOS_WRITE ((save_freq_select|RTC_DIV_RESET2 ),RTC_FREQ_SELECT );#ifdef CONFIG_MACH_DECSTATION CMOS_WRITE (real_yrs,RTC_DEC_YEAR );
include/linux/mc146818rtc.h +2 -0
@@ -86,6 +86,8 @@ struct cmos_rtc_board_info {/* 2 values for divider stage reset, others for "testing purposes only" */ # define RTC_DIV_RESET1 0x60# define RTC_DIV_RESET2 0x70 +/* In AMD BKDG bit 5 and 6 are reserved, bit 4 is for select dv0 bank */ +# define RTC_AMD_BANK_SELECT 0x10/* Periodic intr. / Square wave rate select. 0=none, 1=32.8kHz,... 15=2Hz */ # define RTC_RATE_SELECT 0x0F
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 13/68 MIPS: lantiq: check the return value of kzalloc()
In reply to Greg Kroah-HartmanFrom: Xiaoke Wang <[email protected]>
[ Upstream commit 34123208bbcc8c884a0489f543a23fe9eebb5514 ]
kzalloc() is a memory allocation function which can return NULL when some internal memory errors happen. So it is better to check the return value of it to prevent potential wrong memory access or memory leak.
--- arch/mips/lantiq/falcon/sysctrl.c | 2 ++ arch/mips/lantiq/xway/gptu.c | 2 ++ arch/mips/lantiq/xway/sysctrl.c | 46 ++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 16 deletions(-)
arch/mips/lantiq/falcon/sysctrl.c +2 -0
@@ -167,6 +167,8 @@ static inline void clkdev_add_sys(const char *dev, unsigned int module, {struct clk *clk =kzalloc (sizeof (struct clk ),GFP_KERNEL ); +if (!clk) +return ; clk->cl.dev_id = dev; clk->cl.con_id =NULL ; clk->cl.clk = clk;
arch/mips/lantiq/xway/gptu.c +2 -0
@@ -122,6 +122,8 @@ static inline void clkdev_add_gptu(struct device *dev, const char *con, {struct clk *clk =kzalloc (sizeof (struct clk ),GFP_KERNEL ); +if (!clk) +return ; clk->cl.dev_id =dev_name (dev); clk->cl.con_id = con; clk->cl.clk = clk;
arch/mips/lantiq/xway/sysctrl.c +30 -16
75 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/68 drbd: remove usage of list iterator variable after loop
In reply to Greg Kroah-HartmanFrom: Jakob Koschel <[email protected]>
[ Upstream commit 901aeda62efa21f2eae937bccb71b49ae531be06 ]
In preparation to limit the scope of a list iterator to the list traversal loop, use a dedicated pointer to iterate through the list [1].
Since that variable should not be used past the loop iteration, a separate variable is used to 'remember the current location within the loop'.
To either continue iterating from that position or skip the iteration (if the previous iteration was complete) list_prepare_entry() is used.
--- drivers/block/drbd/drbd_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/block/drbd/drbd_main.c +5 -2
@@ -183,7 +183,7 @@ void tl_release(struct drbd_connection *connection, unsigned int barrier_nr, unsigned int set_size) {struct drbd_request *r; -struct drbd_request *req =NULL ; +struct drbd_request *req =NULL , *tmp =NULL ;int expect_epoch =0 ;int expect_size =0 ;
@@ -237,8 +237,11 @@ void tl_release(struct drbd_connection *connection, unsigned int barrier_nr,* to catch requests being barrier-acked "unexpectedly". * It usually should find the same req again, or some READ preceding it. */ list_for_each_entry (req, &connection->transfer_log, tl_requests) -if (req->epoch == expect_epoch) +if (req->epoch == expect_epoch) { + tmp = req;break ; + } + req =list_prepare_entry (tmp, &connection->transfer_log, tl_requests);list_for_each_entry_safe_from (req, r, &connection->transfer_log, tl_requests) {if (req->epoch != expect_epoch)break ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/68 platform/chrome: cros_ec_debugfs: detach log reader wq from devm
In reply to Greg Kroah-HartmanFrom: Tzung-Bi Shih <[email protected]>
[ Upstream commit 0e8eb5e8acbad19ac2e1856b2fb2320184299b33 ]
Debugfs console_log uses devm memory (e.g. debug_info in cros_ec_console_log_poll()). However, lifecycles of device and debugfs are independent. An use-after-free issue is observed if userland program operates the debugfs after the memory has been freed.
The call trace:
do_raw_spin_lock
_raw_spin_lock_irqsave
remove_wait_queue
ep_unregister_pollwait
ep_remove
do_epoll_ctl
A Python example to reproduce the issue:
... import select
... p = select.epoll()
... f = open('/sys/kernel/debug/cros_scp/console_log') ... p.register(f, select.POLLIN)
... p.poll(1)
[(4, 1)] # 4=fd, 1=select.POLLIN
[ shutdown cros_scp at the point ]
... p.poll(1)
[(4, 16)] # 4=fd, 16=select.POLLHUP
... p.unregister(f)
An use-after-free issue raises here. It called epoll_ctl with EPOLL_CTL_DEL which in turn to use the workqueue in the devm (i.e. log_wq).
Detaches log reader's workqueue from devm to make sure it is persistent even if the device has been removed.
--- drivers/platform/chrome/cros_ec_debugfs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/platform/chrome/cros_ec_debugfs.c +6 -6
@@ -26,6 +26,9 @@#define CIRC_ADD (idx, size, value) (((idx) + (value)) & ((size) - 1)) +/* waitqueue for log readers */ +static DECLARE_WAIT_QUEUE_HEAD (cros_ec_debugfs_log_wq); +/** * struct cros_ec_debugfs - EC debugging information. *
@@ -34,7 +37,6 @@* @log_buffer: circular buffer for console log information * @read_msg: preallocated EC command and buffer to read console log * @log_mutex: mutex to protect circular buffer -* @log_wq: waitqueue for log readers * @log_poll_work: recurring task to poll EC for new console log data * @panicinfo_blob: panicinfo debugfs blob */
@@ -45,7 +47,6 @@ struct cros_ec_debugfs {struct circ_buf log_buffer;struct cros_ec_command *read_msg;struct mutex log_mutex; -wait_queue_head_t log_wq;struct delayed_work log_poll_work;/* EC panicinfo */ struct debugfs_blob_wrapper panicinfo_blob;
@@ -108,7 +109,7 @@ static void cros_ec_console_log_work(struct work_struct *__work) buf_space--; } -wake_up (&debug_info->log_wq); +wake_up (&cros_ec_debugfs_log_wq); }mutex_unlock (&debug_info->log_mutex);
@@ -142,7 +143,7 @@ static ssize_t cros_ec_console_log_read(struct file *file, char __user *buf,mutex_unlock (&debug_info->log_mutex); - ret =wait_event_interruptible (debug_info->log_wq, + ret =wait_event_interruptible (cros_ec_debugfs_log_wq,CIRC_CNT (cb->head, cb->tail,LOG_SIZE ));if (ret <0 )return ret;
@@ -174,7 +175,7 @@ static __poll_t cros_ec_console_log_poll(struct file *file,struct cros_ec_debugfs *debug_info = file->private_data;__poll_t mask =0 ; -poll_wait (file, &debug_info->log_wq, wait); +poll_wait (file, &cros_ec_debugfs_log_wq, wait);mutex_lock (&debug_info->log_mutex); if (CIRC_CNT(debug_info->log_buffer.head,
@@ -359,7 +360,6 @@ static int cros_ec_create_console_log(struct cros_ec_debugfs *debug_info) debug_info->log_buffer.tail =0 ;mutex_init (&debug_info->log_mutex); -init_waitqueue_head (&debug_info->log_wq);debugfs_create_file ("console_log" ,S_IFREG |0444 , debug_info->dir, debug_info, &cros_ec_console_log_fops);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/68 ARM: 9191/1: arm/stacktrace, kasan: Silence KASAN warnings in unwind_frame()
In reply to Greg Kroah-HartmanFrom: linyujun <[email protected]>
[ Upstream commit 9be4c88bb7924f68f88cfd47d925c2d046f51a73 ]
The following KASAN warning is detected by QEMU.
==================================================================
BUG: KASAN: stack-out-of-bounds in unwind_frame+0x508/0x870 Read of size 4 at addr c36bba90 by task cat/163 CPU: 1 PID: 163 Comm: cat Not tainted 5.10.0-rc1 #40 Hardware name: ARM-Versatile Express [<c0113fac>] (unwind_backtrace) from [<c010e71c>] (show_stack+0x10/0x14) [<c010e71c>] (show_stack) from [<c0b805b4>] (dump_stack+0x98/0xb0) [<c0b805b4>] (dump_stack) from [<c0b7d658>] (print_address_description.constprop.0+0x58/0x4bc) [<c0b7d658>] (print_address_description.constprop.0) from [<c031435c>] (kasan_report+0x154/0x170) [<c031435c>] (kasan_report) from [<c0113c44>] (unwind_frame+0x508/0x870) [<c0113c44>] (unwind_frame) from [<c010e298>] (__save_stack_trace+0x110/0x134) [<c010e298>] (__save_stack_trace) from [<c01ce0d8>] (stack_trace_save+0x8c/0xb4) [<c01ce0d8>] (stack_trace_save) from [<c0313520>] (kasan_set_track+0x38/0x60) [<c0313520>] (kasan_set_track) from [<c0314cb8>] (kasan_set_free_info+0x20/0x2c) [<c0314cb8>] (kasan_set_free_info) from [<c0313474>] (__kasan_slab_free+0xec/0x120) [<c0313474>] (__kasan_slab_free) from [<c0311e20>] (kmem_cache_free+0x7c/0x334) [<c0311e20>] (kmem_cache_free) from [<c01c35dc>] (rcu_core+0x390/0xccc) [<c01c35dc>] (rcu_core) from [<c01013a8>] (__do_softirq+0x180/0x518) [<c01013a8>] (__do_softirq) from [<c0135214>] (irq_exit+0x9c/0xe0) [<c0135214>] (irq_exit) from [<c01a40e4>] (__handle_domain_irq+0xb0/0x110) [<c01a40e4>] (__handle_domain_irq) from [<c0691248>] (gic_handle_irq+0xa0/0xb8) [<c0691248>] (gic_handle_irq) from [<c0100b0c>] (__irq_svc+0x6c/0x94) Exception stack(0xc36bb928 to 0xc36bb970)
b920: c36bb9c0 00000000 c0126919 c0101228 c36bb9c0 b76d7730
b940: c36b8000 c36bb9a0 c3335b00 c01ce0d8 00000003 c36bba3c c36bb940 c36bb978
b960: c010e298 c011373c 60000013 ffffffff
[<c0100b0c>] (__irq_svc) from [<c011373c>] (unwind_frame+0x0/0x870) [<c011373c>] (unwind_frame) from [<00000000>] (0x0)
The buggy address belongs to the page: page:(ptrval) refcount:0 mapcount:0 mapping:00000000 index:0x0 pfn:0x636bb flags: 0x0() raw: 00000000 00000000 ef867764 00000000 00000000 00000000 ffffffff 00000000 page dumped because: kasan: bad access detected
addr c36bba90 is located in stack of task cat/163 at offset 48 in frame:
stack_trace_save+0x0/0xb4
this frame has 1 object:
[32, 48) 'trace'
Memory state around the buggy address:
c36bb980: f1 f1 f1 f1 00 04 f2 f2 00 00 f3 f3 00 00 00 00
c36bba00: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
>c36bba80: 00 00 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
^
c36bbb00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c36bbb80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================There is a same issue on x86 and has been resolved by the commit f7d27c35ddff ("x86/mm, kasan: Silence KASAN warnings in get_wchan()").
The solution could be applied to arm architecture too.
--- arch/arm/kernel/stacktrace.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/kernel/stacktrace.c +5 -5
@@ -53,17 +53,17 @@ int notrace unwind_frame(struct stackframe *frame)return -EINVAL ; frame->sp = frame->fp; - frame->fp = *(unsigned long *)(fp); - frame->pc = *(unsigned long *)(fp +4 ); + frame->fp =READ_ONCE_NOCHECK (*(unsigned long *)(fp)); + frame->pc =READ_ONCE_NOCHECK (*(unsigned long *)(fp +4 ));#else /* check current frame pointer is within bounds */ if (fp < low +12 || fp > high -4 )return -EINVAL ;/* restore the registers from the stack frame */ - frame->fp = *(unsigned long *)(fp -12 ); - frame->sp = *(unsigned long *)(fp -8 ); - frame->pc = *(unsigned long *)(fp -4 ); + frame->fp =READ_ONCE_NOCHECK (*(unsigned long *)(fp -12 )); + frame->sp =READ_ONCE_NOCHECK (*(unsigned long *)(fp -8 )); + frame->pc =READ_ONCE_NOCHECK (*(unsigned long *)(fp -4 ));#endif return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/68 nilfs2: fix lockdep warnings in page operations for btree nodes
In reply to Greg Kroah-HartmanFrom: Ryusuke Konishi <[email protected]>
[ Upstream commit e897be17a441fa637cd166fc3de1445131e57692 ]
Patch series "nilfs2 lockdep warning fixes".
The first two are to resolve the lockdep warning issue, and the last one is the accompanying cleanup and low priority.
Based on your comment, this series solves the issue by separating inode object as needed. Since I was worried about the impact of the object composition changes, I tested the series carefully not to cause regressions especially for delicate functions such like disk space reclamation and snapshots.
This patch (of 3):
If CONFIG_LOCKDEP is enabled, nilfs2 hits lockdep warnings at inode_to_wb() during page/folio operations for btree nodes:
WARNING: CPU: 0 PID: 6575 at include/linux/backing-dev.h:269 inode_to_wb include/linux/backing-dev.h:269 [inline]
WARNING: CPU: 0 PID: 6575 at include/linux/backing-dev.h:269 folio_account_dirtied mm/page-writeback.c:2460 [inline]
WARNING: CPU: 0 PID: 6575 at include/linux/backing-dev.h:269 __folio_mark_dirty+0xa7c/0xe30 mm/page-writeback.c:2509
Modules linked in:
...
RIP: 0010:inode_to_wb include/linux/backing-dev.h:269 [inline]
RIP: 0010:folio_account_dirtied mm/page-writeback.c:2460 [inline]
RIP: 0010:__folio_mark_dirty+0xa7c/0xe30 mm/page-writeback.c:2509
...
Call Trace:
__set_page_dirty include/linux/pagemap.h:834 [inline]
mark_buffer_dirty+0x4e6/0x650 fs/buffer.c:1145
nilfs_btree_propagate_p fs/nilfs2/btree.c:1889 [inline]
nilfs_btree_propagate+0x4ae/0xea0 fs/nilfs2/btree.c:2085
nilfs_bmap_propagate+0x73/0x170 fs/nilfs2/bmap.c:337
nilfs_collect_dat_data+0x45/0xd0 fs/nilfs2/segment.c:625
nilfs_segctor_apply_buffers+0x14a/0x470 fs/nilfs2/segment.c:1009
nilfs_segctor_scan_file+0x47a/0x700 fs/nilfs2/segment.c:1048
nilfs_segctor_collect_blocks fs/nilfs2/segment.c:1224 [inline]
nilfs_segctor_collect fs/nilfs2/segment.c:1494 [inline]
nilfs_segctor_do_construct+0x14f3/0x6c60 fs/nilfs2/segment.c:2036
nilfs_segctor_construct+0x7a7/0xb30 fs/nilfs2/segment.c:2372
nilfs_segctor_thread_construct fs/nilfs2/segment.c:2480 [inline]
nilfs_segctor_thread+0x3c3/0xf90 fs/nilfs2/segment.c:2563
kthread+0x405/0x4f0 kernel/kthread.c:327
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295This is because nilfs2 uses two page caches for each inode and inode->i_mapping never points to one of them, the btree node cache.
This causes inode_to_wb(inode) to refer to a different page cache than the caller page/folio operations such like __folio_start_writeback(), __folio_end_writeback(), or __folio_mark_dirty() acquired the lock.
This patch resolves the issue by allocating and using an additional inode to hold the page cache of btree nodes. The inode is attached one-to-one to the traditional nilfs2 inode if it requires a block mapping with b-tree. This setup change is in memory only and does not affect the disk format.
--- fs/nilfs2/btnode.c | 23 ++++++++-- fs/nilfs2/btnode.h | 1 + fs/nilfs2/btree.c | 27 ++++++++---- fs/nilfs2/gcinode.c | 7 +-- fs/nilfs2/inode.c | 104 ++++++++++++++++++++++++++++++++++++++------ fs/nilfs2/mdt.c | 7 +-- fs/nilfs2/nilfs.h | 14 +++--- fs/nilfs2/page.c | 7 ++- fs/nilfs2/segment.c | 9 ++-- fs/nilfs2/super.c | 5 +-- 10 files changed, 154 insertions(+), 50 deletions(-)
fs/nilfs2/btnode.c +20 -3
@@ -20,6 +20,23 @@#include "page.h" #include "btnode.h" + +/** +* nilfs_init_btnc_inode - initialize B-tree node cache inode +* @btnc_inode: inode to be initialized +* +* nilfs_init_btnc_inode() sets up an inode for B-tree node cache. +*/ +void nilfs_init_btnc_inode (struct inode *btnc_inode) +{ +struct nilfs_inode_info *ii =NILFS_I (btnc_inode); + + btnc_inode->i_mode =S_IFREG ; + ii->i_flags =0 ; +memset (&ii->i_bmap_data,0 ,sizeof (struct nilfs_bmap )); +mapping_set_gfp_mask (btnc_inode->i_mapping,GFP_NOFS ); +} +void nilfs_btnode_cache_clear (struct address_space *btnc) {invalidate_mapping_pages (btnc,0 ,-1 );
@@ -29,7 +46,7 @@ void nilfs_btnode_cache_clear(struct address_space *btnc)struct buffer_head *nilfs_btnode_create_block (struct address_space *btnc,__u64 blocknr) { -struct inode *inode =NILFS_BTNC_I (btnc); +struct inode *inode = btnc->host;struct buffer_head *bh; bh =nilfs_grab_buffer (inode, btnc, blocknr,BIT (BH_NILFS_Node));
@@ -57,7 +74,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, struct buffer_head **pbh, sector_t *submit_ptr) { struct buffer_head *bh; -struct inode *inode =NILFS_BTNC_I (btnc); +struct inode *inode = btnc->host;struct page *page;int err;
@@ -157,7 +174,7 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc, struct nilfs_btnode_chkey_ctxt *ctxt) {struct buffer_head *obh, *nbh; -struct inode *inode =NILFS_BTNC_I (btnc); +struct inode *inode = btnc->host;__u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey;int err;
fs/nilfs2/btnode.h +1 -0
@@ -30,6 +30,7 @@ struct nilfs_btnode_chkey_ctxt {struct buffer_head *newbh; }; +void nilfs_init_btnc_inode (struct inode *btnc_inode);void nilfs_btnode_cache_clear (struct address_space *);struct buffer_head *nilfs_btnode_create_block (struct address_space *btnc,__u64 blocknr);
fs/nilfs2/btree.c +19 -8
@@ -58,7 +58,8 @@ static void nilfs_btree_free_path(struct nilfs_btree_path *path)static int nilfs_btree_get_new_block (const struct nilfs_bmap *btree,__u64 ptr,struct buffer_head **bhp) { -struct address_space *btnc = &NILFS_BMAP_I (btree)->i_btnode_cache; +struct inode *btnc_inode =NILFS_BMAP_I (btree)->i_assoc_inode; +struct address_space *btnc = btnc_inode->i_mapping;struct buffer_head *bh; bh =nilfs_btnode_create_block (btnc, ptr);
@@ -470,7 +471,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr,struct buffer_head **bhp, const struct nilfs_btree_readahead_info *ra) { - struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache; + struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode; +struct address_space *btnc = btnc_inode->i_mapping;struct buffer_head *bh, *ra_bh;sector_t submit_ptr =0 ;int ret;
@@ -1742,6 +1744,10 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *btree, __u64 key, dat =nilfs_bmap_get_dat (btree); } + ret =nilfs_attach_btree_node_cache (&NILFS_BMAP_I (btree)->vfs_inode); +if (ret <0 ) +return ret; + ret =nilfs_bmap_prepare_alloc_ptr (btree, dreq, dat);if (ret <0 )return ret;
@@ -1914,7 +1920,7 @@ static int nilfs_btree_prepare_update_v(struct nilfs_bmap *btree, path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr; path[level].bp_ctxt.bh = path[level].bp_bh; ret =nilfs_btnode_prepare_change_key ( - &NILFS_BMAP_I (btree)->i_btnode_cache, +NILFS_BMAP_I (btree)->i_assoc_inode->i_mapping, &path[level].bp_ctxt);if (ret <0 ) { nilfs_dat_abort_update(dat,
@@ -1940,7 +1946,7 @@ static void nilfs_btree_commit_update_v(struct nilfs_bmap *btree,if (buffer_nilfs_node (path[level].bp_bh)) {nilfs_btnode_commit_change_key ( - &NILFS_BMAP_I (btree)->i_btnode_cache, +NILFS_BMAP_I (btree)->i_assoc_inode->i_mapping, &path[level].bp_ctxt); path[level].bp_bh = path[level].bp_ctxt.bh; }
@@ -1959,7 +1965,7 @@ static void nilfs_btree_abort_update_v(struct nilfs_bmap *btree, &path[level].bp_newreq.bpr_req);if (buffer_nilfs_node (path[level].bp_bh))nilfs_btnode_abort_change_key ( - &NILFS_BMAP_I (btree)->i_btnode_cache, +NILFS_BMAP_I (btree)->i_assoc_inode->i_mapping, &path[level].bp_ctxt); }
@@ -2135,7 +2141,8 @@ static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree,static void nilfs_btree_lookup_dirty_buffers (struct nilfs_bmap *btree,struct list_head *listp) { -struct address_space *btcache = &NILFS_BMAP_I (btree)->i_btnode_cache; +struct inode *btnc_inode =NILFS_BMAP_I (btree)->i_assoc_inode; +struct address_space *btcache = btnc_inode->i_mapping;struct list_head lists[NILFS_BTREE_LEVEL_MAX ];struct pagevec pvec;struct buffer_head *bh, *head;
@@ -2189,12 +2196,12 @@ static int nilfs_btree_assign_p(struct nilfs_bmap *btree, path[level].bp_ctxt.newkey = blocknr; path[level].bp_ctxt.bh = *bh; ret =nilfs_btnode_prepare_change_key ( - &NILFS_BMAP_I (btree)->i_btnode_cache, +NILFS_BMAP_I (btree)->i_assoc_inode->i_mapping, &path[level].bp_ctxt);if (ret <0 )return ret;nilfs_btnode_commit_change_key ( - &NILFS_BMAP_I (btree)->i_btnode_cache, +NILFS_BMAP_I (btree)->i_assoc_inode->i_mapping, &path[level].bp_ctxt); *bh = path[level].bp_ctxt.bh; }
@@ -2399,6 +2406,10 @@ int nilfs_btree_init(struct nilfs_bmap *bmap)if (nilfs_btree_root_broken (nilfs_btree_get_root (bmap), bmap->b_inode)) ret = -EIO ; +else + ret =nilfs_attach_btree_node_cache ( + &NILFS_BMAP_I (bmap)->vfs_inode); +return ret; }
fs/nilfs2/gcinode.c +4 -3
@@ -126,9 +126,10 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff,int nilfs_gccache_submit_read_node (struct inode *inode,sector_t pbn,__u64 vbn,struct buffer_head **out_bh) { +struct inode *btnc_inode =NILFS_I (inode)->i_assoc_inode;int ret; - ret =nilfs_btnode_submit_block (&NILFS_I (inode)->i_btnode_cache, + ret =nilfs_btnode_submit_block (btnc_inode->i_mapping, vbn ? : pbn, pbn,REQ_OP_READ ,0 , out_bh, &pbn);if (ret == -EEXIST )/* internal code (cache hit) */
@@ -170,7 +171,7 @@ int nilfs_init_gcinode(struct inode *inode) ii->i_flags =0 ;nilfs_bmap_init_gc (ii->i_bmap); -return 0 ; +return nilfs_attach_btree_node_cache (inode); }/**
@@ -185,7 +186,7 @@ void nilfs_remove_all_gcinodes(struct the_nilfs *nilfs) ii = list_first_entry(head, struct nilfs_inode_info, i_dirty);list_del_init (&ii->i_dirty);truncate_inode_pages (&ii->vfs_inode.i_data,0 ); -nilfs_btnode_cache_clear (&ii->i_btnode_cache); +nilfs_btnode_cache_clear (ii->i_assoc_inode->i_mapping);iput (&ii->vfs_inode); } }
fs/nilfs2/inode.c +90 -14
164 lines not on this page · raw message
fs/nilfs2/mdt.c +4 -3
@@ -531,7 +531,7 @@ int nilfs_mdt_save_to_shadow_map(struct inode *inode) goto out; ret =nilfs_copy_dirty_pages (&shadow->frozen_btnodes, - &ii->i_btnode_cache); + ii->i_assoc_inode->i_mapping);if (ret) goto out;
@@ -622,8 +622,9 @@ void nilfs_mdt_restore_from_shadow_map(struct inode *inode)nilfs_clear_dirty_pages (inode->i_mapping, true);nilfs_copy_back_pages (inode->i_mapping, &shadow->frozen_data); -nilfs_clear_dirty_pages (&ii->i_btnode_cache, true); -nilfs_copy_back_pages (&ii->i_btnode_cache, &shadow->frozen_btnodes); +nilfs_clear_dirty_pages (ii->i_assoc_inode->i_mapping, true); +nilfs_copy_back_pages (ii->i_assoc_inode->i_mapping, + &shadow->frozen_btnodes);nilfs_bmap_restore (ii->i_bmap, &shadow->bmap_store);
fs/nilfs2/nilfs.h +5 -9
@@ -28,7 +28,7 @@* @i_xattr: <TODO> * @i_dir_start_lookup: page index of last successful search * @i_cno: checkpoint number for GC inode -* @i_btnode_cache: cached pages of b-tree nodes +* @i_assoc_inode: associated inode (B-tree node cache holder or back pointer) * @i_dirty: list for connecting dirty files * @xattr_sem: semaphore for extended attributes processing * @i_bh: buffer contains disk inode
@@ -43,7 +43,7 @@ struct nilfs_inode_info {__u64 i_xattr;/* sector_t ??? */ __u32 i_dir_start_lookup;__u64 i_cno;/* check point number for GC inode */ -struct address_space i_btnode_cache; +struct inode *i_assoc_inode;struct list_head i_dirty;/* List for connecting dirty files */ #ifdef CONFIG_NILFS_XATTR
@@ -75,13 +75,6 @@ NILFS_BMAP_I(const struct nilfs_bmap *bmap) return container_of(bmap, struct nilfs_inode_info, i_bmap_data); } -static inline struct inode *NILFS_BTNC_I (struct address_space *btnc) -{ -struct nilfs_inode_info *ii = - container_of(btnc, struct nilfs_inode_info, i_btnode_cache); -return &ii->vfs_inode; -} -/* * Dynamic state flags of NILFS on-memory inode (i_state) */
@@ -98,6 +91,7 @@ enum {NILFS_I_INODE_SYNC ,/* dsync is not allowed for inode */ NILFS_I_BMAP ,/* has bmap and btnode_cache */ NILFS_I_GCINODE ,/* inode for GC, on memory only */ + NILFS_I_BTNC, /* inode for btree node cache */ };/*
@@ -264,6 +258,8 @@ struct inode *nilfs_iget(struct super_block *sb, struct nilfs_root *root, unsigned long ino);extern struct inode *nilfs_iget_for_gc (struct super_block *sb,unsigned long ino,__u64 cno); +int nilfs_attach_btree_node_cache (struct inode *inode); +void nilfs_detach_btree_node_cache (struct inode *inode);extern void nilfs_update_inode (struct inode *,struct buffer_head *,int );extern void nilfs_truncate (struct inode *);extern void nilfs_evict_inode (struct inode *);
fs/nilfs2/page.c +3 -4
@@ -450,10 +450,9 @@ void nilfs_mapping_init(struct address_space *mapping, struct inode *inode)/* * NILFS2 needs clear_page_dirty() in the following two cases: * -* 1) For B-tree node pages and data pages of the dat/gcdat, NILFS2 clears -* page dirty flags when it copies back pages from the shadow cache -* (gcdat->{i_mapping,i_btnode_cache}) to its original cache -* (dat->{i_mapping,i_btnode_cache}). +* 1) For B-tree node pages and data pages of DAT file, NILFS2 clears dirty +* flag of pages when it copies back pages from shadow cache to the +* original cache. * * 2) Some B-tree operations like insertion or deletion may dispose buffers * in dirty state, and this needs to cancel the dirty state of their pages.
fs/nilfs2/segment.c +6 -3
@@ -738,15 +738,18 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode, struct list_head *listp) {struct nilfs_inode_info *ii =NILFS_I (inode); -struct address_space *mapping = &ii->i_btnode_cache; +struct inode *btnc_inode = ii->i_assoc_inode;struct pagevec pvec;struct buffer_head *bh, *head;unsigned int i;pgoff_t index =0 ; +if (!btnc_inode) +return ; +pagevec_init (&pvec); -while (pagevec_lookup_tag (&pvec, mapping, &index, +while (pagevec_lookup_tag (&pvec, btnc_inode->i_mapping, &index,PAGECACHE_TAG_DIRTY )) {for (i =0 ; i <pagevec_count (&pvec); i++) { bh = head =page_buffers (pvec.pages[i]);
@@ -2410,7 +2413,7 @@ nilfs_remove_written_gcinodes(struct the_nilfs *nilfs, struct list_head *head)continue ;list_del_init (&ii->i_dirty);truncate_inode_pages (&ii->vfs_inode.i_data,0 ); -nilfs_btnode_cache_clear (&ii->i_btnode_cache); +nilfs_btnode_cache_clear (ii->i_assoc_inode->i_mapping);iput (&ii->vfs_inode); } }
fs/nilfs2/super.c +2 -3
@@ -151,7 +151,8 @@ struct inode *nilfs_alloc_inode(struct super_block *sb) ii->i_bh =NULL ; ii->i_state =0 ; ii->i_cno =0 ; -nilfs_mapping_init (&ii->i_btnode_cache, &ii->vfs_inode); + ii->i_assoc_inode =NULL ; + ii->i_bmap = &ii->i_bmap_data;return &ii->vfs_inode; }
@@ -1375,8 +1376,6 @@ static void nilfs_inode_init_once(void *obj)#ifdef CONFIG_NILFS_XATTR init_rwsem (&ii->xattr_sem);#endif -address_space_init_once (&ii->i_btnode_cache); - ii->i_bmap = &ii->i_bmap_data;inode_init_once (&ii->vfs_inode); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/68 nilfs2: fix lockdep warnings during disk space reclamation
In reply to Greg Kroah-HartmanFrom: Ryusuke Konishi <[email protected]>
[ Upstream commit 6e211930f79aa45d422009a5f2e5467d2369ffe5 ]
During disk space reclamation, nilfs2 still emits the following lockdep warning due to page/folio operations on shadowed page caches that nilfs2 uses to get a snapshot of DAT file in memory:
WARNING: CPU: 0 PID: 2643 at include/linux/backing-dev.h:272 __folio_mark_dirty+0x645/0x670
...
RIP: 0010:__folio_mark_dirty+0x645/0x670
...
Call Trace:
filemap_dirty_folio+0x74/0xd0
__set_page_dirty_nobuffers+0x85/0xb0
nilfs_copy_dirty_pages+0x288/0x510 [nilfs2]
nilfs_mdt_save_to_shadow_map+0x50/0xe0 [nilfs2]
nilfs_clean_segments+0xee/0x5d0 [nilfs2]
nilfs_ioctl_clean_segments.isra.19+0xb08/0xf40 [nilfs2]
nilfs_ioctl+0xc52/0xfb0 [nilfs2]
__x64_sys_ioctl+0x11d/0x170This fixes the remaining warning by using inode objects to hold those page caches.
--- fs/nilfs2/dat.c | 4 ++- fs/nilfs2/inode.c | 63 ++++++++++++++++++++++++++++++++++++++++++++--- fs/nilfs2/mdt.c | 38 +++++++++++++++++++--------- fs/nilfs2/mdt.h | 6 ++--- fs/nilfs2/nilfs.h | 2 ++ 5 files changed, 92 insertions(+), 21 deletions(-)
fs/nilfs2/dat.c +3 -1
@@ -497,7 +497,9 @@ int nilfs_dat_read(struct super_block *sb, size_t entry_size, di =NILFS_DAT_I (dat);lockdep_set_class (&di->mi.mi_sem, &dat_lock_key);nilfs_palloc_setup_cache (dat, &di->palloc_cache); -nilfs_mdt_setup_shadow_map (dat, &di->shadow); + err =nilfs_mdt_setup_shadow_map (dat, &di->shadow); +if (err) + goto failed; err =nilfs_read_inode_common (dat, raw_inode);if (err)
fs/nilfs2/inode.c +59 -4
123 lines not on this page · raw message
fs/nilfs2/mdt.c +26 -12
@@ -469,9 +469,18 @@ int nilfs_mdt_init(struct inode *inode, gfp_t gfp_mask, size_t objsz)void nilfs_mdt_clear (struct inode *inode) {struct nilfs_mdt_info *mdi =NILFS_MDT (inode); +struct nilfs_shadow_map *shadow = mdi->mi_shadow;if (mdi->mi_palloc_cache)nilfs_palloc_destroy_cache (inode); + +if (shadow) { +struct inode *s_inode = shadow->inode; + + shadow->inode =NULL ; +iput (s_inode); + mdi->mi_shadow =NULL ; + } }/**
@@ -505,12 +514,15 @@ int nilfs_mdt_setup_shadow_map(struct inode *inode, struct nilfs_shadow_map *shadow) {struct nilfs_mdt_info *mi =NILFS_MDT (inode); +struct inode *s_inode;INIT_LIST_HEAD (&shadow->frozen_buffers); -address_space_init_once (&shadow->frozen_data); -nilfs_mapping_init (&shadow->frozen_data, inode); -address_space_init_once (&shadow->frozen_btnodes); -nilfs_mapping_init (&shadow->frozen_btnodes, inode); + + s_inode =nilfs_iget_for_shadow (inode); +if (IS_ERR (s_inode)) +return PTR_ERR (s_inode); + + shadow->inode = s_inode; mi->mi_shadow = shadow;return 0 ; }
@@ -524,13 +536,14 @@ int nilfs_mdt_save_to_shadow_map(struct inode *inode)struct nilfs_mdt_info *mi =NILFS_MDT (inode);struct nilfs_inode_info *ii =NILFS_I (inode);struct nilfs_shadow_map *shadow = mi->mi_shadow; +struct inode *s_inode = shadow->inode;int ret; - ret =nilfs_copy_dirty_pages (&shadow->frozen_data, inode->i_mapping); + ret =nilfs_copy_dirty_pages (s_inode->i_mapping, inode->i_mapping);if (ret) goto out; - ret =nilfs_copy_dirty_pages (&shadow->frozen_btnodes, + ret =nilfs_copy_dirty_pages (NILFS_I (s_inode)->i_assoc_inode->i_mapping, ii->i_assoc_inode->i_mapping);if (ret) goto out;
@@ -547,7 +560,7 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh)struct page *page;int blkbits = inode->i_blkbits; - page =grab_cache_page (&shadow->frozen_data, bh->b_page->index); + page =grab_cache_page (shadow->inode->i_mapping, bh->b_page->index);if (!page)return -ENOMEM ;
@@ -579,7 +592,7 @@ nilfs_mdt_get_frozen_buffer(struct inode *inode, struct buffer_head *bh)struct page *page;int n; - page =find_lock_page (&shadow->frozen_data, bh->b_page->index); + page =find_lock_page (shadow->inode->i_mapping, bh->b_page->index);if (page) {if (page_has_buffers (page)) { n =bh_offset (bh) >> inode->i_blkbits;
@@ -620,11 +633,11 @@ void nilfs_mdt_restore_from_shadow_map(struct inode *inode)nilfs_palloc_clear_cache (inode);nilfs_clear_dirty_pages (inode->i_mapping, true); -nilfs_copy_back_pages (inode->i_mapping, &shadow->frozen_data); +nilfs_copy_back_pages (inode->i_mapping, shadow->inode->i_mapping);nilfs_clear_dirty_pages (ii->i_assoc_inode->i_mapping, true);nilfs_copy_back_pages (ii->i_assoc_inode->i_mapping, - &shadow->frozen_btnodes); +NILFS_I (shadow->inode)->i_assoc_inode->i_mapping);nilfs_bmap_restore (ii->i_bmap, &shadow->bmap_store);
@@ -639,10 +652,11 @@ void nilfs_mdt_clear_shadow_map(struct inode *inode) {struct nilfs_mdt_info *mi =NILFS_MDT (inode);struct nilfs_shadow_map *shadow = mi->mi_shadow; +struct inode *shadow_btnc_inode =NILFS_I (shadow->inode)->i_assoc_inode;down_write (&mi->mi_sem);nilfs_release_frozen_buffers (shadow); -truncate_inode_pages (&shadow->frozen_data,0 ); -truncate_inode_pages (&shadow->frozen_btnodes,0 ); +truncate_inode_pages (shadow->inode->i_mapping,0 ); +truncate_inode_pages (shadow_btnc_inode->i_mapping,0 );up_write (&mi->mi_sem); }
fs/nilfs2/mdt.h +2 -4
@@ -18,14 +18,12 @@/** * struct nilfs_shadow_map - shadow mapping of meta data file * @bmap_store: shadow copy of bmap state -* @frozen_data: shadowed dirty data pages -* @frozen_btnodes: shadowed dirty b-tree nodes' pages +* @inode: holder of page caches used in shadow mapping * @frozen_buffers: list of frozen buffers */ struct nilfs_shadow_map {struct nilfs_bmap_store bmap_store; -struct address_space frozen_data; -struct address_space frozen_btnodes; +struct inode *inode;struct list_head frozen_buffers; };
fs/nilfs2/nilfs.h +2 -0
@@ -92,6 +92,7 @@ enum {NILFS_I_BMAP ,/* has bmap and btnode_cache */ NILFS_I_GCINODE ,/* inode for GC, on memory only */ NILFS_I_BTNC ,/* inode for btree node cache */ + NILFS_I_SHADOW, /* inode for shadowed page cache */ };/*
@@ -260,6 +261,7 @@ extern struct inode *nilfs_iget_for_gc(struct super_block *sb, unsigned long ino, __u64 cno);int nilfs_attach_btree_node_cache (struct inode *inode);void nilfs_detach_btree_node_cache (struct inode *inode); +struct inode *nilfs_iget_for_shadow (struct inode *inode);extern void nilfs_update_inode (struct inode *,struct buffer_head *,int );extern void nilfs_truncate (struct inode *);extern void nilfs_evict_inode (struct inode *);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/68 mmc: core: Specify timeouts for BKOPS and CACHE_FLUSH for eMMC
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
commit 24ed3bd01d6a844fd5e8a75f48d0a3d10ed71bf9 upstream
The timeout values used while waiting for a CMD6 for BKOPS or a CACHE_FLUSH to complete, are not defined by the eMMC spec. However, a timeout of 10 minutes as is currently being used, is just silly for both of these cases. Instead, let's specify more reasonable timeouts, 120s for BKOPS and 30s for CACHE_FLUSH.
--- drivers/mmc/core/mmc_ops.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/mmc/core/mmc_ops.c +6 -3
@@ -19,7 +19,9 @@#include "host.h" #include "mmc_ops.h" -#define MMC_OPS_TIMEOUT_MS (10 * 60 * 1000)/* 10 minute timeout */ +#define MMC_OPS_TIMEOUT_MS (10 * 60 * 1000)/* 10min*/ +#define MMC_BKOPS_TIMEOUT_MS (120 * 1000)/* 120s */ +#define MMC_CACHE_FLUSH_TIMEOUT_MS (30 * 1000)/* 30s */ static const u8 tuning_blk_pattern_4bit[] = {0xff ,0x0f ,0xff ,0x00 ,0xff ,0xcc ,0xc3 ,0xcc ,
@@ -943,7 +945,7 @@ void mmc_run_bkops(struct mmc_card *card* urgent levels by using an asynchronous background task, when idle. */ err =mmc_switch (card,EXT_CSD_CMD_SET_NORMAL , -EXT_CSD_BKOPS_START ,1 ,MMC_OPS_TIMEOUT_MS ); +EXT_CSD_BKOPS_START ,1 ,MMC_BKOPS_TIMEOUT_MS );if (err)pr_warn ("%s: Error %d starting bkops\n" ,mmc_hostname (card->host), err);
@@ -961,7 +963,8 @@ int mmc_flush_cache(struct mmc_card *carif (mmc_cache_enabled (card->host)) { err =mmc_switch (card,EXT_CSD_CMD_SET_NORMAL , -EXT_CSD_FLUSH_CACHE ,1 ,0 ); +EXT_CSD_FLUSH_CACHE ,1 , +MMC_CACHE_FLUSH_TIMEOUT_MS );if (err)pr_err ("%s: cache flush error %d\n" ,mmc_hostname (card->host), err);
Greg Kroah-Hartman
maintainerPATCH 20/68 mmc: block: Use generic_cmd6_time when modifying INAND_CMD38_ARG_EXT_CSD
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
commit ad91619aa9d78ab1c6d4a969c3db68bc331ae76c upstream
The INAND_CMD38_ARG_EXT_CSD is a vendor specific EXT_CSD register, which is used to prepare an erase/trim operation. However, it doesn't make sense to use a timeout of 10 minutes while updating the register, which becomes the case when the timeout_ms argument for mmc_switch() is set to zero.
Instead, let's use the generic_cmd6_time, as that seems like a reasonable timeout to use for these cases.
--- drivers/mmc/core/block.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mmc/core/block.c +3 -3
@@ -1126,7 +1126,7 @@ static void mmc_blk_issue_discard_rq(str card->erase_arg ==MMC_TRIM_ARG ?INAND_CMD38_ARG_TRIM :INAND_CMD38_ARG_ERASE , - 0); + card->ext_csd.generic_cmd6_time); }if (!err) err =mmc_erase (card, from, nr, card->erase_arg);
@@ -1168,7 +1168,7 @@ retry: arg ==MMC_SECURE_TRIM1_ARG ?INAND_CMD38_ARG_SECTRIM1 :INAND_CMD38_ARG_SECERASE , - 0); + card->ext_csd.generic_cmd6_time);if (err) goto out_retry; }
@@ -1186,7 +1186,7 @@ retry: err =mmc_switch (card,EXT_CSD_CMD_SET_NORMAL ,INAND_CMD38_ARG_EXT_CSD ,INAND_CMD38_ARG_SECTRIM2 , -0 ); + card->ext_csd.generic_cmd6_time);if (err) goto out_retry; }
Greg Kroah-Hartman
maintainerPATCH 21/68 mmc: core: Default to generic_cmd6_time as timeout in __mmc_switch()
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
commit 533a6cfe08f96a7b5c65e06d20916d552c11b256 upstream
All callers of __mmc_switch() should now be specifying a valid timeout for the CMD6 command. However, just to be sure, let's print a warning and default to use the generic_cmd6_time in case the provided timeout_ms argument is zero.
In this context, let's also simplify some of the corresponding code and clarify some related comments.
--- drivers/mmc/core/mmc_ops.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
drivers/mmc/core/mmc_ops.c +7 -9
@@ -460,10 +460,6 @@ static int mmc_poll_for_busy(struct mmc_bool expired = false;bool busy = false; -/* We have an unspecified cmd timeout, use the fallback value. */ -if (!timeout_ms) - timeout_ms =MMC_OPS_TIMEOUT_MS ; -/* * In cases when not allowed to poll by using CMD13 or because we aren't * capable of polling by using ->card_busy(), then rely on waiting the
@@ -536,6 +532,12 @@ int __mmc_switch(struct mmc_card *card,mmc_retune_hold (host); +if (!timeout_ms) { +pr_warn ("%s: unspecified timeout for CMD6 - use generic\n" , +mmc_hostname (host)); + timeout_ms = card->ext_csd.generic_cmd6_time; + } +/* * If the cmd timeout and the max_busy_timeout of the host are both * specified, let's validate them. A failure means we need to prevent
@@ -544,7 +546,7 @@ int __mmc_switch(struct mmc_card *card,* which also means they are on their own when it comes to deal with the * busy timeout. */ -if (!(host->caps &MMC_CAP_NEED_RSP_BUSY ) && timeout_ms && +if (!(host->caps &MMC_CAP_NEED_RSP_BUSY ) && host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) use_r1b_resp = false;
@@ -556,10 +558,6 @@ int __mmc_switch(struct mmc_card *card, cmd.flags =MMC_CMD_AC ;if (use_r1b_resp) { cmd.flags |=MMC_RSP_SPI_R1B |MMC_RSP_R1B ; -/* -* A busy_timeout of zero means the host can decide to use -* whatever value it finds suitable. -*/ cmd.busy_timeout = timeout_ms; }else { cmd.flags |=MMC_RSP_SPI_R1 |MMC_RSP_R1 ;
Greg Kroah-Hartman
maintainerPATCH 22/68 SUNRPC: Clean up scheduling of autoclose
In reply to Greg Kroah-HartmanFrom: Meena Shanmugam <[email protected]>
From: Trond Myklebust <[email protected]>
commit e26d9972720e2484f44cdd94ca4e31cc372ed2ed upstream.
Consolidate duplicated code in xprt_force_disconnect() and xprt_conditional_disconnect().
--- net/sunrpc/xprt.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
net/sunrpc/xprt.c +15 -11
@@ -717,21 +717,29 @@ void xprt_disconnect_done(struct rpc_xprEXPORT_SYMBOL_GPL (xprt_disconnect_done);/** -* xprt_force_disconnect - force a transport to disconnect +* xprt_schedule_autoclose_locked - Try to schedule an autoclose RPC call * @xprt: transport to disconnect -* */ -void xprt_force_disconnect (struct rpc_xprt *xprt) +static void xprt_schedule_autoclose_locked (struct rpc_xprt *xprt) { -/* Don't race with the test_bit() in xprt_clear_locked() */ -spin_lock (&xprt->transport_lock);set_bit (XPRT_CLOSE_WAIT , &xprt->state); -/* Try to schedule an autoclose RPC call */ if (test_and_set_bit (XPRT_LOCKED , &xprt->state) ==0 )queue_work (xprtiod_workqueue, &xprt->task_cleanup);else if (xprt->snd_task && !test_bit (XPRT_SND_IS_COOKIE , &xprt->state))rpc_wake_up_queued_task_set_status (&xprt->pending, xprt->snd_task, -ENOTCONN ); +} + +/** +* xprt_force_disconnect - force a transport to disconnect +* @xprt: transport to disconnect +* +*/ +void xprt_force_disconnect (struct rpc_xprt *xprt) +{ +/* Don't race with the test_bit() in xprt_clear_locked() */ +spin_lock (&xprt->transport_lock); +xprt_schedule_autoclose_locked (xprt);spin_unlock (&xprt->transport_lock); }EXPORT_SYMBOL_GPL (xprt_force_disconnect);
@@ -771,11 +779,7 @@ void xprt_conditional_disconnect(struct goto out;if (test_bit (XPRT_CLOSING , &xprt->state)) goto out; -set_bit (XPRT_CLOSE_WAIT , &xprt->state); -/* Try to schedule an autoclose RPC call */ -if (test_and_set_bit (XPRT_LOCKED , &xprt->state) ==0 ) -queue_work (xprtiod_workqueue, &xprt->task_cleanup); -xprt_wake_pending_tasks (xprt, -EAGAIN ); +xprt_schedule_autoclose_locked (xprt); out:spin_unlock (&xprt->transport_lock); }
Greg Kroah-Hartman
maintainerPATCH 23/68 SUNRPC: Prevent immediate close+reconnect
In reply to Greg Kroah-HartmanFrom: Meena Shanmugam <[email protected]>
From: Trond Myklebust <[email protected]>
commit 3be232f11a3cc9b0ef0795e39fa11bdb8e422a06 upstream.
If we have already set up the socket and are waiting for it to connect, then don't immediately close and retry.
--- net/sunrpc/xprt.c | 3 ++- net/sunrpc/xprtsock.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
net/sunrpc/xprt.c +2 -1
@@ -722,7 +722,8 @@ EXPORT_SYMBOL_GPL(xprt_disconnect_done);*/ static void xprt_schedule_autoclose_locked (struct rpc_xprt *xprt) { -set_bit (XPRT_CLOSE_WAIT , &xprt->state); +if (test_and_set_bit (XPRT_CLOSE_WAIT , &xprt->state)) +return ;if (test_and_set_bit (XPRT_LOCKED , &xprt->state) ==0 )queue_work (xprtiod_workqueue, &xprt->task_cleanup);else if (xprt->snd_task && !test_bit (XPRT_SND_IS_COOKIE , &xprt->state))
net/sunrpc/xprtsock.c +1 -1
@@ -2469,7 +2469,7 @@ static void xs_connect(struct rpc_xprt *WARN_ON_ONCE (!xprt_lock_connect (xprt, task, transport)); -if (transport->sock !=NULL ) { +if (transport->sock !=NULL && !xprt_connecting (xprt)) {dprintk ("RPC: xs_connect delayed xprt %p for %lu " "seconds\n" , xprt, xprt->reestablish_timeout /HZ );
Greg Kroah-Hartman
maintainerPATCH 24/68 SUNRPC: Dont call connect() more than once on a TCP socket
In reply to Greg Kroah-HartmanFrom: Meena Shanmugam <[email protected]>
From: Trond Myklebust <[email protected]>
commit 89f42494f92f448747bd8a7ab1ae8b5d5520577d upstream.
Avoid socket state races due to repeated calls to ->connect() using the same socket. If connect() returns 0 due to the connection having completed, but we are in fact in a closing state, then we may leave the XPRT_CONNECTING flag set on the transport.
---
Added fallthrough which I missed in 5.10 patch.
include/linux/sunrpc/xprtsock.h | 1 + net/sunrpc/xprtsock.c | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-)
include/linux/sunrpc/xprtsock.h +1 -0
@@ -90,6 +90,7 @@ struct sock_xprt {#define XPRT_SOCK_WAKE_WRITE (5)#define XPRT_SOCK_WAKE_PENDING (6)#define XPRT_SOCK_WAKE_DISCONNECT (7) +#define XPRT_SOCK_CONNECT_SENT (8)#endif /* __KERNEL__ */
net/sunrpc/xprtsock.c +12 -10
@@ -2384,10 +2384,14 @@ static void xs_tcp_setup_socket(struct wstruct rpc_xprt *xprt = &transport->xprt;int status = -EIO ; -if (!sock) { - sock =xs_create_sock (xprt, transport, -xs_addr (xprt)->sa_family,SOCK_STREAM , -IPPROTO_TCP , true); +if (xprt_connected (xprt)) + goto out; +if (test_and_clear_bit (XPRT_SOCK_CONNECT_SENT , + &transport->sock_state) || + !sock) { +xs_reset_transport (transport); + sock =xs_create_sock (xprt, transport,xs_addr (xprt)->sa_family, +SOCK_STREAM ,IPPROTO_TCP , true);if (IS_ERR (sock)) { status =PTR_ERR (sock); goto out;
@@ -2418,6 +2422,8 @@ static void xs_tcp_setup_socket(struct wbreak ;case 0 :case -EINPROGRESS : +set_bit (XPRT_SOCK_CONNECT_SENT , &transport->sock_state); + fallthrough;case -EALREADY :xprt_unlock_connect (xprt, transport);return ;
@@ -2469,13 +2475,9 @@ static void xs_connect(struct rpc_xprt *WARN_ON_ONCE (!xprt_lock_connect (xprt, task, transport)); -if (transport->sock !=NULL && !xprt_connecting (xprt)) { +if (transport->sock !=NULL ) {dprintk ("RPC: xs_connect delayed xprt %p for %lu " -"seconds\n" , - xprt, xprt->reestablish_timeout /HZ ); - -/* Start by resetting any existing state */ -xs_reset_transport (transport); +"seconds\n" , xprt, xprt->reestablish_timeout /HZ ); delay =xprt_reconnect_delay (xprt);xprt_reconnect_backoff (xprt,XS_TCP_INIT_REEST_TO );
Greg Kroah-Hartman
maintainerPATCH 25/68 SUNRPC: Ensure we flush any closed sockets before xs_xprt_free()
In reply to Greg Kroah-HartmanFrom: Meena Shanmugam <[email protected]>
From: Trond Myklebust <[email protected]>
commit f00432063db1a0db484e85193eccc6845435b80e upstream.
We must ensure that all sockets are closed before we call xprt_free() and release the reference to the net namespace. The problem is that calling fput() will defer closing the socket until delayed_fput() gets called.
Let's fix the situation by allowing rpciod and the transport teardown code (which runs on the system wq) to call __fput_sync(), and directly close the socket.
--- fs/file_table.c | 1 + net/sunrpc/xprt.c | 5 +---- net/sunrpc/xprtsock.c | 16 +++++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-)
fs/file_table.c +1 -0
@@ -375,6 +375,7 @@ void __fput_sync(struct file *file) }EXPORT_SYMBOL (fput); +EXPORT_SYMBOL (__fput_sync);void __init files_init (void ) {
net/sunrpc/xprt.c +1 -4
@@ -868,10 +868,7 @@ void xprt_connect(struct rpc_task *task)if (!xprt_lock_write (xprt, task))return ; -if (test_and_clear_bit (XPRT_CLOSE_WAIT , &xprt->state)) - xprt->ops->close (xprt); - -if (!xprt_connected (xprt)) { +if (!xprt_connected (xprt) && !test_bit (XPRT_CLOSE_WAIT , &xprt->state)) { task->tk_rqstp->rq_connect_cookie = xprt->connect_cookie;rpc_sleep_on_timeout (&xprt->pending, task,NULL ,xprt_request_timeout (task->tk_rqstp));
net/sunrpc/xprtsock.c +13 -3
@@ -989,7 +989,7 @@ static int xs_local_send_request(struct/* Close the stream if the previous transmission was incomplete */ if (xs_send_request_was_aborted (transport, req)) { -xs_close (xprt); +xprt_force_disconnect (xprt);return -ENOTCONN ; }
@@ -1027,7 +1027,7 @@ static int xs_local_send_request(struct -status);/* fall through */ case -EPIPE : -xs_close (xprt); +xprt_force_disconnect (xprt); status = -ENOTCONN ; }
@@ -1303,6 +1303,16 @@ static void xs_reset_transport(struct soif (sk ==NULL )return ; +/* +* Make sure we're calling this in a context from which it is safe +* to call __fput_sync(). In practice that means rpciod and the +* system workqueue. +*/ +if (!(current->flags &PF_WQ_WORKER )) { +WARN_ON_ONCE (1 ); +set_bit (XPRT_CLOSE_WAIT , &xprt->state); +return ; + }if (atomic_read (&transport->xprt.swapper))sk_clear_memalloc (sk);
@@ -1326,7 +1336,7 @@ static void xs_reset_transport(struct somutex_unlock (&transport->recv_mutex);trace_rpc_socket_close (xprt, sock); -fput (filp); +__fput_sync (filp);xprt_disconnect_done (xprt); }
Greg Kroah-Hartman
maintainerPATCH 26/68 ALSA: wavefront: Proper check of get_user() error
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit a34ae6c0660d3b96b0055f68ef74dc9478852245 upstream.
The antient ISA wavefront driver reads its sample patch data (uploaded over an ioctl) via __get_user() with no good reason; likely just for some performance optimizations in the past. Let's change this to the standard get_user() and the error check for handling the fault case properly.
--- sound/isa/wavefront/wavefront_synth.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/isa/wavefront/wavefront_synth.c +2 -1
@@ -1088,7 +1088,8 @@ wavefront_send_sample (snd_wavefront_t *if (dataptr < data_end) { -__get_user (sample_short, dataptr); +if (get_user (sample_short, dataptr)) +return -EFAULT ; dataptr += skip;if (data_is_unsigned) {/* GUS ? */
Greg Kroah-Hartman
maintainerPATCH 27/68 perf: Fix sys_perf_event_open() race against self
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 3ac6487e584a1eb54071dbe1212e05b884136704 upstream.
Norbert reported that it's possible to race sys_perf_event_open() such that the looser ends up in another context from the group leader, triggering many WARNs.
The move_group case checks for races against itself, but the !move_group case doesn't, seemingly relying on the previous group_leader->ctx == ctx check. However, that check is racy due to not holding any locks at that time.
Therefore, re-check the result after acquiring locks and bailing if they no longer match.
Additionally, clarify the not_move_group case from the move_group-vs-move_group race.
--- kernel/events/core.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
kernel/events/core.c +14 -0
@@ -11114,6 +11114,9 @@ SYSCALL_DEFINE5(perf_event_open,* Do not allow to attach to a group in a different task * or CPU context. If we're moving SW events, we'll fix * this up later, so allow that. +* +* Racy, not holding group_leader->ctx->mutex, see comment with +* perf_event_ctx_lock(). */ if (!move_group && group_leader->ctx != ctx) goto err_context;
@@ -11181,6 +11184,7 @@ SYSCALL_DEFINE5(perf_event_open, }else {perf_event_ctx_unlock (group_leader, gctx); move_group =0 ; + goto not_move_group; } }
@@ -11197,7 +11201,17 @@ SYSCALL_DEFINE5(perf_event_open, } }else {mutex_lock (&ctx->mutex); + +/* +* Now that we hold ctx->lock, (re)validate group_leader->ctx == ctx, +* see the group_leader && !move_group test earlier. +*/ +if (group_leader && group_leader->ctx != ctx) { + err = -EINVAL ; + goto err_locked; + } } +not_move_group:if (ctx->task ==TASK_TOMBSTONE ) { err = -ESRCH ;
Greg Kroah-Hartman
maintainerPATCH 28/68 Fix double fget() in vhost_net_set_backend()
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit fb4554c2232e44d595920f4d5c66cf8f7d13f9bc upstream.
Descriptor table is a shared resource; two fget() on the same descriptor may return different struct file references. get_tap_ptr_ring() is called after we'd found (and pinned) the socket we'll be using and it tries to find the private tun/tap data structures associated with it. Redoing the lookup by the same file descriptor we'd used to get the socket is racy - we need to same struct file.
Thanks to Jason for spotting a braino in the original variant of patch - I'd missed the use of fd == -1 for disabling backend, and in that case we can end up with sock == NULL and sock != oldsock.
--- drivers/vhost/net.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/vhost/net.c +7 -8
@@ -1446,13 +1446,9 @@ err:return ERR_PTR (r); } -static struct ptr_ring *get_tap_ptr_ring (int fd) +static struct ptr_ring *get_tap_ptr_ring (struct file *file) {struct ptr_ring *ring; -struct file *file =fget (fd); - -if (!file) -return NULL ; ring =tun_get_tx_ring (file);if (!IS_ERR (ring)) goto out;
@@ -1461,7 +1457,6 @@ static struct ptr_ring *get_tap_ptr_ring goto out; ring =NULL ; out: -fput (file);return ring; }
@@ -1548,8 +1543,12 @@ static long vhost_net_set_backend(struct r =vhost_net_enable_vq (n, vq);if (r) goto err_used; -if (index ==VHOST_NET_VQ_RX ) - nvq->rx_ring =get_tap_ptr_ring (fd); +if (index ==VHOST_NET_VQ_RX ) { +if (sock) + nvq->rx_ring =get_tap_ptr_ring (sock->file); +else + nvq->rx_ring =NULL ; + } oldubufs = nvq->ubufs; nvq->ubufs = ubufs;
Greg Kroah-Hartman
maintainerPATCH 29/68 PCI/PM: Avoid putting Elo i2 PCIe Ports in D3cold
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
commit 92597f97a40bf661bebceb92e26ff87c76d562d4 upstream.
If a Root Port on Elo i2 is put into D3cold and then back into D0, the downstream device becomes permanently inaccessible, so add a bridge D3 DMI quirk for that system.
This was exposed by 14858dcc3b35 ("PCI: Use pci_update_current_state() in pci_enable_device_flags()"), but before that commit the Root Port in question had never been put into D3cold for real due to a mismatch between its power state retrieved from the PCI_PM_CTRL register (which was accessible even though the platform firmware indicated that the port was in D3cold) and the state of an ACPI power resource involved in its power management.
--- drivers/pci/pci.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/pci/pci.c +10 -0
@@ -2613,6 +2613,16 @@ static const struct dmi_system_id bridgeDMI_MATCH (DMI_BOARD_VENDOR ,"Gigabyte Technology Co., Ltd." ), DMI_MATCH(DMI_BOARD_NAME, "X299 DESIGNARE EX-CF"), }, +/* +* Downstream device is not accessible after putting a root port +* into D3cold and back into D0 on Elo i2. +*/ + .ident ="Elo i2" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Elo Touch Solutions" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Elo i2" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "RevB"), + }, }, #endif { }
Greg Kroah-Hartman
maintainerPATCH 30/68 KVM: x86/mmu: Update number of zapped pages even if page list is stable
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit b28cb0cd2c5e80a8c0feb408a0e4b0dbb6d132c5 upstream.
When zapping obsolete pages, update the running count of zapped pages regardless of whether or not the list has become unstable due to zapping a shadow page with its own child shadow pages. If the VM is backed by mostly 4kb pages, KVM can zap an absurd number of SPTEs without bumping the batch count and thus without yielding. In the worst case scenario, this can cause a soft lokcup.
watchdog: BUG: soft lockup - CPU#12 stuck for 22s! [dirty_log_perf_:13020] RIP: 0010:workingset_activation+0x19/0x130 mark_page_accessed+0x266/0x2e0 kvm_set_pfn_accessed+0x31/0x40 mmu_spte_clear_track_bits+0x136/0x1c0 drop_spte+0x1a/0xc0 mmu_page_zap_pte+0xef/0x120 __kvm_mmu_prepare_zap_page+0x205/0x5e0 kvm_mmu_zap_all_fast+0xd7/0x190 kvm_mmu_invalidate_zap_pages_in_memslot+0xe/0x10 kvm_page_track_flush_slot+0x5c/0x80 kvm_arch_flush_shadow_memslot+0xe/0x10 kvm_set_memslot+0x1a8/0x5d0 __kvm_set_memory_region+0x337/0x590 kvm_vm_ioctl+0xb08/0x1040
Message-Id: <[email protected]>
--- arch/x86/kvm/mmu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
arch/x86/kvm/mmu.c +6 -4
@@ -5821,6 +5821,7 @@ static void kvm_zap_obsolete_pages(struc {struct kvm_mmu_page *sp, *node;int nr_zapped, batch =0 ; +bool unstable; restart: list_for_each_entry_safe_reverse(sp, node,
@@ -5853,11 +5854,12 @@ restart: goto restart; } -if (__kvm_mmu_prepare_zap_page (kvm, sp, - &kvm->arch.zapped_obsolete_pages, &nr_zapped)) { - batch += nr_zapped; + unstable =__kvm_mmu_prepare_zap_page (kvm, sp, + &kvm->arch.zapped_obsolete_pages, &nr_zapped); + batch += nr_zapped; + +if (unstable) goto restart; - } }/*
Greg Kroah-Hartman
maintainerPATCH 31/68 crypto: qcom-rng - fix infinite loop on requests not multiple of WORD_SZ
In reply to Greg Kroah-HartmanFrom: Ondrej Mosnacek <[email protected]>
commit 16287397ec5c08aa58db6acf7dbc55470d78087d upstream.
The commit referenced in the Fixes tag removed the 'break' from the else branch in qcom_rng_read(), causing an infinite loop whenever 'max' is not a multiple of WORD_SZ. This can be reproduced e.g. by running:
kcapi-rng -b 67 >/dev/null
There are many ways to fix this without adding back the 'break', but they all seem more awkward than simply adding it back, so do just that.
Tested on a machine with Qualcomm Amberwing processor.
--- drivers/crypto/qcom-rng.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/qcom-rng.c +1 -0
@@ -64,6 +64,7 @@ static int qcom_rng_read(struct qcom_rng }else {/* copy only remaining bytes */ memcpy (data, &val, max - currsize); +break ; } }while (currsize < max);
Greg Kroah-Hartman
maintainerPATCH 32/68 drm/dp/mst: fix a possible memory leak in fetch_monitor_name()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
commit 6e03b13cc7d9427c2c77feed1549191015615202 upstream.
drm_dp_mst_get_edid call kmemdup to create mst_edid. So mst_edid need to be freed after use.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/drm_dp_mst_topology.c +1 -0
@@ -3657,6 +3657,7 @@ static void fetch_monitor_name(struct dr mst_edid =drm_dp_mst_get_edid (port->connector, mgr, port);drm_edid_get_monitor_name (mst_edid, name, namelen); +kfree (mst_edid); }/**
Greg Kroah-Hartman
maintainerPATCH 33/68 dma-buf: fix use of DMA_BUF_SET_NAME_{A,B} in userspace
In reply to Greg Kroah-HartmanFrom: Jérôme Pouiller <[email protected]>
commit 7c3e9fcad9c7d8bb5d69a576044fb16b1d2e8a01 upstream.
The typedefs u32 and u64 are not available in userspace. Thus user get an error he try to use DMA_BUF_SET_NAME_A or DMA_BUF_SET_NAME_B:
$ gcc -Wall -c -MMD -c -o ioctls_list.o ioctls_list.c
In file included from /usr/include/x86_64-linux-gnu/asm/ioctl.h:1,
from /usr/include/linux/ioctl.h:5,
from /usr/include/asm-generic/ioctls.h:5,
from ioctls_list.c:11:
ioctls_list.c:463:29: error: ‘u32’ undeclared here (not in a function)
463 | { "DMA_BUF_SET_NAME_A", DMA_BUF_SET_NAME_A, -1, -1 }, // linux/dma-buf.h
| ^~~~~~~~~~~~~~~~~~
ioctls_list.c:464:29: error: ‘u64’ undeclared here (not in a function)
464 | { "DMA_BUF_SET_NAME_B", DMA_BUF_SET_NAME_B, -1, -1 }, // linux/dma-buf.h
| ^~~~~~~~~~~~~~~~~~The issue was initially reported here[1].
[1]: https://github.com/jerome-pouiller/ioctl/pull/14
--- include/uapi/linux/dma-buf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/uapi/linux/dma-buf.h +2 -2
@@ -44,7 +44,7 @@ struct dma_buf_sync {* between them in actual uapi, they're just different numbers. */ #define DMA_BUF_SET_NAME _IOW(DMA_BUF_BASE, 1, const char *) -#define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) -#define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) +#define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, __u32) +#define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, __u64)#endif
Greg Kroah-Hartman
maintainerPATCH 34/68 ARM: dts: aspeed-g6: remove FWQSPID group in pinctrl dtsi
In reply to Greg Kroah-HartmanFrom: Jae Hyun Yoo <[email protected]>
[ Upstream commit efddaa397cceefb61476e383c26fafd1f8ab6356 ]
FWSPIDQ2 and FWSPIDQ3 are not part of FWSPI18 interface so remove FWQSPID group in pinctrl dtsi. These pins must be used with the FWSPI pins that are dedicated for boot SPI interface which provides same 3.3v logic level.
--- arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi | 5 ----- 1 file changed, 5 deletions(-)
arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi +0 -5
@@ -117,11 +117,6 @@ pinctrl_fwspid_default: fwspid_default { groups = "FWSPID"; }; - pinctrl_fwqspid_default: fwqspid_default { - function = "FWSPID"; - groups = "FWQSPID"; - }; - pinctrl_fwspiwp_default: fwspiwp_default { function = "FWSPIWP"; groups = "FWSPIWP";
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/68 ARM: dts: aspeed-g6: fix SPI1/SPI2 quad pin group
In reply to Greg Kroah-HartmanFrom: Jae Hyun Yoo <[email protected]>
[ Upstream commit 890362d41b244536ab63591f813393f5fdf59ed7 ]
Fix incorrect function mappings in pinctrl_qspi1_default and pinctrl_qspi2_default since their function should be SPI1 and SPI2 respectively.
--- arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi +2 -2
@@ -648,12 +648,12 @@ pinctrl_pwm9g1_default: pwm9g1_default { }; pinctrl_qspi1_default: qspi1_default { - function = "QSPI1"; + function = "SPI1"; groups = "QSPI1"; }; pinctrl_qspi2_default: qspi2_default { - function = "QSPI2"; + function = "SPI2"; groups = "QSPI2"; };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/68 net: macb: Increment rx bd head after allocating skb and buffer
In reply to Greg Kroah-HartmanFrom: Harini Katakam <[email protected]>
[ Upstream commit 9500acc631dbb8b73166e25700e656b11f6007b6 ]
In gem_rx_refill rx_prepared_head is incremented at the beginning of the while loop preparing the skb and data buffers. If the skb or data buffer allocation fails, this BD will be unusable BDs until the head loops back to the same BD (and obviously buffer allocation succeeds). In the unlikely event that there's a string of allocation failures, there will be an equal number of unusable BDs and an inconsistent RX BD chain. Hence increment the head at the end of the while loop to be clean.
--- drivers/net/ethernet/cadence/macb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb_main.c +1 -1
@@ -927,7 +927,6 @@ static void gem_rx_refill(struct macb_queue *queue)/* Make hw descriptor updates visible to CPU */ rmb (); - queue->rx_prepared_head++; desc =macb_rx_desc (queue, entry);if (!queue->rx_skbuff[entry]) {
@@ -966,6 +965,7 @@ static void gem_rx_refill(struct macb_queue *queue)dma_wmb (); desc->addr &= ~MACB_BIT (RX_USED ); } + queue->rx_prepared_head++; }/* Make descriptor updates visible to hardware */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/68 net/sched: act_pedit: sanitize shift argument before usage
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 4d42d54a7d6aa6d29221d3fd4f2ae9503e94f011 ]
syzbot was able to trigger an Out-of-Bound on the pedit action:
UBSAN: shift-out-of-bounds in net/sched/act_pedit.c:238:43 shift exponent 1400735974 is too large for 32-bit type 'unsigned int' CPU: 0 PID: 3606 Comm: syz-executor151 Not tainted 5.18.0-rc5-syzkaller-00165-g810c2f0a3f86 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106 ubsan_epilogue+0xb/0x50 lib/ubsan.c:151 __ubsan_handle_shift_out_of_bounds.cold+0xb1/0x187 lib/ubsan.c:322 tcf_pedit_init.cold+0x1a/0x1f net/sched/act_pedit.c:238 tcf_action_init_1+0x414/0x690 net/sched/act_api.c:1367 tcf_action_init+0x530/0x8d0 net/sched/act_api.c:1432 tcf_action_add+0xf9/0x480 net/sched/act_api.c:1956 tc_ctl_action+0x346/0x470 net/sched/act_api.c:2015 rtnetlink_rcv_msg+0x413/0xb80 net/core/rtnetlink.c:5993 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x543/0x7f0 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x904/0xe00 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:705 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:725 ____sys_sendmsg+0x6e2/0x800 net/socket.c:2413 ___sys_sendmsg+0xf3/0x170 net/socket.c:2467 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2496 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7fe36e9e1b59 Code: 28 c3 e8 2a 14 00 00 66 2e 0f 1f 84 00 00 00 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffef796fe88 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fe36e9e1b59 RDX: 0000000000000000 RSI: 0000000020000300 RDI: 0000000000000003 RBP: 00007fe36e9a5d00 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007fe36e9a5d90 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 </TASK>
The 'shift' field is not validated, and any value above 31 will trigger out-of-bounds. The issue predates the git history, but syzbot was able to trigger it only after the commit mentioned in the fixes tag, and this change only applies on top of such commit.
Address the issue bounding the 'shift' value to the maximum allowed by the relevant operator.
--- net/sched/act_pedit.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sched/act_pedit.c +4 -0
@@ -231,6 +231,10 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla,for (i =0 ; i < p->tcfp_nkeys; ++i) {u32 cur = p->tcfp_keys[i].off; +/* sanitize the shift value for any later use */ + p->tcfp_keys[i].shift =min_t (size_t,BITS_PER_TYPE (int) -1 , + p->tcfp_keys[i].shift); +/* The AT option can read a single byte, we can bound the actual * value with uchar max. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/68 net: vmxnet3: fix possible use-after-free bugs in vmxnet3_rq_alloc_rx_buf()
In reply to Greg Kroah-HartmanFrom: Zixuan Fu <[email protected]>
[ Upstream commit 9e7fef9521e73ca8afd7da9e58c14654b02dfad8 ]
In vmxnet3_rq_alloc_rx_buf(), when dma_map_single() fails, rbi->skb is freed immediately. Similarly, in another branch, when dma_map_page() fails, rbi->page is also freed. In the two cases, vmxnet3_rq_alloc_rx_buf() returns an error to its callers vmxnet3_rq_init() -> vmxnet3_rq_init_all() -> vmxnet3_activate_dev(). Then vmxnet3_activate_dev() calls vmxnet3_rq_cleanup_all() in error handling code, and rbi->skb or rbi->page are freed again in vmxnet3_rq_cleanup_all(), causing use-after-free bugs.
To fix these possible bugs, rbi->skb and rbi->page should be cleared after they are freed.
The error log in our fault-injection testing is shown as follows:
[ 14.319016] BUG: KASAN: use-after-free in consume_skb+0x2f/0x150 ... [ 14.321586] Call Trace: ... [ 14.325357] consume_skb+0x2f/0x150 [ 14.325671] vmxnet3_rq_cleanup_all+0x33a/0x4e0 [vmxnet3] [ 14.326150] vmxnet3_activate_dev+0xb9d/0x2ca0 [vmxnet3] [ 14.326616] vmxnet3_open+0x387/0x470 [vmxnet3] ... [ 14.361675] Allocated by task 351: ... [ 14.362688] __netdev_alloc_skb+0x1b3/0x6f0 [ 14.362960] vmxnet3_rq_alloc_rx_buf+0x1b0/0x8d0 [vmxnet3] [ 14.363317] vmxnet3_activate_dev+0x3e3/0x2ca0 [vmxnet3] [ 14.363661] vmxnet3_open+0x387/0x470 [vmxnet3] ... [ 14.367309] [ 14.367412] Freed by task 351: ... [ 14.368932] __dev_kfree_skb_any+0xd2/0xe0 [ 14.369193] vmxnet3_rq_alloc_rx_buf+0x71e/0x8d0 [vmxnet3] [ 14.369544] vmxnet3_activate_dev+0x3e3/0x2ca0 [vmxnet3] [ 14.369883] vmxnet3_open+0x387/0x470 [vmxnet3] [ 14.370174] __dev_open+0x28a/0x420 [ 14.370399] __dev_change_flags+0x192/0x590 [ 14.370667] dev_change_flags+0x7a/0x180 [ 14.370919] do_setlink+0xb28/0x3570 [ 14.371150] rtnl_newlink+0x1160/0x1740 [ 14.371399] rtnetlink_rcv_msg+0x5bf/0xa50 [ 14.371661] netlink_rcv_skb+0x1cd/0x3e0 [ 14.371913] netlink_unicast+0x5dc/0x840 [ 14.372169] netlink_sendmsg+0x856/0xc40 [ 14.372420] ____sys_sendmsg+0x8a7/0x8d0 [ 14.372673] __sys_sendmsg+0x1c2/0x270 [ 14.372914] do_syscall_64+0x41/0x90 [ 14.373145] entry_SYSCALL_64_after_hwframe+0x44/0xae
...
--- drivers/net/vmxnet3/vmxnet3_drv.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/vmxnet3/vmxnet3_drv.c +2 -0
@@ -595,6 +595,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,if (dma_mapping_error (&adapter->pdev->dev, rbi->dma_addr)) {dev_kfree_skb_any (rbi->skb); + rbi->skb =NULL ; rq->stats.rx_buf_alloc_failure++;break ; }
@@ -619,6 +620,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,if (dma_mapping_error (&adapter->pdev->dev, rbi->dma_addr)) {put_page (rbi->page); + rbi->page =NULL ; rq->stats.rx_buf_alloc_failure++;break ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 39/68 net: vmxnet3: fix possible NULL pointer dereference in vmxnet3_rq_cleanup()
In reply to Greg Kroah-HartmanFrom: Zixuan Fu <[email protected]>
[ Upstream commit edf410cb74dc612fd47ef5be319c5a0bcd6e6ccd ]
In vmxnet3_rq_create(), when dma_alloc_coherent() fails, vmxnet3_rq_destroy() is called. It sets rq->rx_ring[i].base to NULL. Then vmxnet3_rq_create() returns an error to its callers mxnet3_rq_create_all() -> vmxnet3_change_mtu(). Then vmxnet3_change_mtu() calls vmxnet3_force_close() -> dev_close() in error handling code. And the driver calls vmxnet3_close() -> vmxnet3_quiesce_dev() -> vmxnet3_rq_cleanup_all() -> vmxnet3_rq_cleanup(). In vmxnet3_rq_cleanup(), rq->rx_ring[ring_idx].base is accessed, but this variable is NULL, causing a NULL pointer dereference.
To fix this possible bug, an if statement is added to check whether rq->rx_ring[0].base is NULL in vmxnet3_rq_cleanup() and exit early if so.
The error log in our fault-injection testing is shown as follows:
[ 65.220135] BUG: kernel NULL pointer dereference, address: 0000000000000008 ... [ 65.222633] RIP: 0010:vmxnet3_rq_cleanup_all+0x396/0x4e0 [vmxnet3] ... [ 65.227977] Call Trace: ... [ 65.228262] vmxnet3_quiesce_dev+0x80f/0x8a0 [vmxnet3] [ 65.228580] vmxnet3_close+0x2c4/0x3f0 [vmxnet3] [ 65.228866] __dev_close_many+0x288/0x350 [ 65.229607] dev_close_many+0xa4/0x480 [ 65.231124] dev_close+0x138/0x230 [ 65.231933] vmxnet3_force_close+0x1f0/0x240 [vmxnet3] [ 65.232248] vmxnet3_change_mtu+0x75d/0x920 [vmxnet3]
...
--- drivers/net/vmxnet3/vmxnet3_drv.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/vmxnet3/vmxnet3_drv.c +4 -0
@@ -1586,6 +1586,10 @@ vmxnet3_rq_cleanup(struct vmxnet3_rx_queue *rq,u32 i, ring_idx;struct Vmxnet3_RxDesc *rxd; +/* ring has already been cleaned up */ +if (!rq->rx_ring[0 ].base) +return ; +for (ring_idx =0 ; ring_idx <2 ; ring_idx++) {for (i =0 ; i < rq->rx_ring[ring_idx].size; i++) {#ifdef __BIG_ENDIAN_BITFIELD
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/68 ice: fix possible under reporting of ethtool Tx and Rx statistics
In reply to Greg Kroah-HartmanFrom: Paul Greenwalt <[email protected]>
[ Upstream commit 31b6298fd8e29effe9ed6b77351ac5969be56ce0 ]
The hardware statistics counters are not cleared during resets so the drivers first access is to initialize the baseline and then subsequent reads are for reporting the counters. The statistics counters are read during the watchdog subtask when the interface is up. If the baseline is not initialized before the interface is up, then there can be a brief window in which some traffic can be transmitted/received before the initial baseline reading takes place.
Directly initialize ethtool statistics in driver open so the baseline will be initialized when the interface is up, and any dropped packets incremented before the interface is up won't be reported.
--- drivers/net/ethernet/intel/ice/ice_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +4 -3
@@ -3561,9 +3561,10 @@ static int ice_up_complete(struct ice_vsi *vsi)netif_carrier_on (vsi->netdev); } -/* clear this now, and the first stats read will be used as baseline */ - vsi->stat_offsets_loaded = false; - +/* Perform an initial read of the statistics registers now to +* set the baseline so counters are ready when interface is up +*/ +ice_update_eth_stats (vsi);ice_service_task_schedule (pf);return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 41/68 clk: at91: generated: consider range when calculating best rate
In reply to Greg Kroah-HartmanFrom: Codrin Ciubotariu <[email protected]>
[ Upstream commit d0031e6fbed955ff8d5f5bbc8fe7382482559cec ]
clk_generated_best_diff() helps in finding the parent and the divisor to compute a rate closest to the required one. However, it doesn't take into account the request's range for the new rate. Make sure the new rate is within the required range.
--- drivers/clk/at91/clk-generated.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/at91/clk-generated.c +4 -0
@@ -105,6 +105,10 @@ static void clk_generated_best_diff(struct clk_rate_request *req, tmp_rate = parent_rate; else tmp_rate = parent_rate / div; + +if (tmp_rate < req->min_rate || tmp_rate > req->max_rate) +return ; + tmp_diff =abs (req->rate - tmp_rate);if (*best_diff <0 || *best_diff >= tmp_diff) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/68 net/qla3xxx: Fix a test in ql_reset_work()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 5361448e45fac6fb96738df748229432a62d78b6 ]
test_bit() tests if one bit is set or not.
Here the logic seems to check of bit QL_RESET_PER_SCSI (i.e. 4) OR bit QL_RESET_START (i.e. 3) is set.
In fact, it checks if bit 7 (4 | 3 = 7) is set, that is to say QL_ADAPTER_UP.
This looks harmless, because this bit is likely be set, and when the ql_reset_work() delayed work is scheduled in ql3xxx_isr() (the only place that schedule this work), QL_RESET_START or QL_RESET_PER_SCSI is set.
This has been spotted by smatch.
--- drivers/net/ethernet/qlogic/qla3xxx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/qlogic/qla3xxx.c +2 -1
@@ -3629,7 +3629,8 @@ static void ql_reset_work(struct work_struct *work) qdev->mem_map_registers;unsigned long hw_flags; -if (test_bit ((QL_RESET_PER_SCSI |QL_RESET_START ), &qdev->flags)) { +if (test_bit (QL_RESET_PER_SCSI , &qdev->flags) || +test_bit (QL_RESET_START , &qdev->flags)) {clear_bit (QL_LINK_MASTER , &qdev->flags);/*
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 43/68 NFC: nci: fix sleep in atomic context bugs caused by nci_skb_alloc
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit 23dd4581350d4ffa23d58976ec46408f8f4c1e16 ]
There are sleep in atomic context bugs when the request to secure element of st-nci is timeout. The root cause is that nci_skb_alloc with GFP_KERNEL parameter is called in st_nci_se_wt_timeout which is a timer handler. The call paths that could trigger bugs are shown below:
(interrupt context 1)st_nci_se_wt_timeout
nci_hci_send_event
nci_hci_send_data
nci_skb_alloc(..., GFP_KERNEL) //may sleep (interrupt context 2)st_nci_se_wt_timeout
nci_hci_send_event
nci_hci_send_data
nci_send_data
nci_queue_tx_data_frags
nci_skb_alloc(..., GFP_KERNEL) //may sleepThis patch changes allocation mode of nci_skb_alloc from GFP_KERNEL to GFP_ATOMIC in order to prevent atomic context sleeping. The GFP_ATOMIC flag makes memory allocation operation could be used in atomic context.
--- net/nfc/nci/data.c | 2 +- net/nfc/nci/hci.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
net/nfc/nci/data.c +1 -1
@@ -118,7 +118,7 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev, skb_frag =nci_skb_alloc (ndev, (NCI_DATA_HDR_SIZE + frag_len), -GFP_KERNEL ); +GFP_ATOMIC );if (skb_frag ==NULL ) { rc = -ENOMEM ; goto free_exit;
net/nfc/nci/hci.c +2 -2
@@ -153,7 +153,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe, i =0 ; skb =nci_skb_alloc (ndev, conn_info->max_pkt_payload_len + -NCI_DATA_HDR_SIZE ,GFP_KERNEL ); +NCI_DATA_HDR_SIZE ,GFP_ATOMIC );if (!skb)return -ENOMEM ;
@@ -186,7 +186,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe,if (i < data_len) { skb =nci_skb_alloc (ndev, conn_info->max_pkt_payload_len + -NCI_DATA_HDR_SIZE ,GFP_KERNEL ); +NCI_DATA_HDR_SIZE ,GFP_ATOMIC );if (!skb)return -ENOMEM ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/68 net/mlx5e: Properly block LRO when XDP is enabled
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit cf6e34c8c22fba66bd21244b95ea47e235f68974 ]
LRO is incompatible and mutually exclusive with XDP. However, the needed checks are only made when enabling XDP. If LRO is enabled when XDP is already active, the command will succeed, and XDP will be skipped in the data path, although still enabled.
This commit fixes the bug by checking the XDP status in mlx5e_fix_features and disabling LRO if XDP is enabled.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +7 -0
@@ -3980,6 +3980,13 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev, } } +if (params->xdp_prog) { +if (features &NETIF_F_LRO ) { +netdev_warn (netdev,"LRO is incompatible with XDP\n" ); + features &= ~NETIF_F_LRO ; + } + } +if (MLX5E_GET_PFLAG (params,MLX5E_PFLAG_RX_CQE_COMPRESS )) { features &= ~NETIF_F_RXHASH ;if (netdev->features &NETIF_F_RXHASH )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/68 net: af_key: add check for pfkey_broadcast in function pfkey_process
In reply to Greg Kroah-HartmanFrom: Jiasheng Jiang <[email protected]>
[ Upstream commit 4dc2a5a8f6754492180741facf2a8787f2c415d7 ]
If skb_clone() returns null pointer, pfkey_broadcast() will return error.
Therefore, it should be better to check the return value of pfkey_broadcast() and return error if fails.
--- net/key/af_key.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/key/af_key.c +4 -2
@@ -2830,8 +2830,10 @@ static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadbvoid *ext_hdrs[SADB_EXT_MAX ];int err; -pfkey_broadcast (skb_clone (skb,GFP_KERNEL ),GFP_KERNEL , -BROADCAST_PROMISC_ONLY ,NULL ,sock_net (sk)); + err =pfkey_broadcast (skb_clone (skb,GFP_KERNEL ),GFP_KERNEL , +BROADCAST_PROMISC_ONLY ,NULL ,sock_net (sk)); +if (err) +return err;memset (ext_hdrs,0 ,sizeof (ext_hdrs)); err =parse_exthdrs (skb, hdr, ext_hdrs);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/68 ARM: 9196/1: spectre-bhb: enable for Cortex-A15
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
[ Upstream commit 0dc14aa94ccd8ba35eb17a0f9b123d1566efd39e ]
The Spectre-BHB mitigations were inadvertently left disabled for Cortex-A15, due to the fact that cpu_v7_bugs_init() is not called in that case. So fix that.
--- arch/arm/mm/proc-v7-bugs.c | 1 + 1 file changed, 1 insertion(+)
arch/arm/mm/proc-v7-bugs.c +1 -0
@@ -301,6 +301,7 @@ void cpu_v7_ca15_ibe(void) {if (check_spectre_auxcr (this_cpu_ptr (&spectre_warned),BIT (0 )))cpu_v7_spectre_v2_init (); +cpu_v7_spectre_bhb_init (); }void cpu_v7_bugs_init (void )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/68 ARM: 9197/1: spectre-bhb: fix loop8 sequence for Thumb2
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
[ Upstream commit 3cfb3019979666bdf33a1010147363cf05e0f17b ]
In Thumb2, 'b . + 4' produces a branch instruction that uses a narrow encoding, and so it does not jump to the following instruction as expected. So use W(b) instead.
--- arch/arm/kernel/entry-armv.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/kernel/entry-armv.S +1 -1
@@ -1043,7 +1043,7 @@ vector_bhb_loop8_\name: @ bhb workaround mov r0, #8 -3: b . + 4 +3: W(b) . + 4 subs r0, r0, #1 bne 3b dsb
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/68 igb: skip phy status check where unavailable
In reply to Greg Kroah-HartmanFrom: Kevin Mitchell <[email protected]>
[ Upstream commit 942d2ad5d2e0df758a645ddfadffde2795322728 ]
igb_read_phy_reg() will silently return, leaving phy_data untouched, if hw->ops.read_reg isn't set. Depending on the uninitialized value of phy_data, this led to the phy status check either succeeding immediately or looping continuously for 2 seconds before emitting a noisy err-level timeout. This message went out to the console even though there was no actual problem.
Instead, first check if there is read_reg function pointer. If not, proceed without trying to check the phy status register.
--- drivers/net/ethernet/intel/igb/igb_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/igb/igb_main.c +2 -1
@@ -5318,7 +5318,8 @@ static void igb_watchdog_task(struct work_struct *work)break ; } -if (adapter->link_speed !=SPEED_1000 ) +if (adapter->link_speed !=SPEED_1000 || + !hw->phy.ops.read_reg) goto no_wait;/* wait for Remote receiver status OK */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/68 net: bridge: Clear offload_fwd_mark when passing frame up bridge interface.
In reply to Greg Kroah-HartmanFrom: Andrew Lunn <[email protected]>
[ Upstream commit fbb3abdf2223cd0dfc07de85fe5a43ba7f435bdf ]
It is possible to stack bridges on top of each other. Consider the following which makes use of an Ethernet switch:
br1
/ \
/ \ / \
br0.11 wlan0
|
br0
/ | \
p1 p2 p3
br0 is offloaded to the switch. Above br0 is a vlan interface, for vlan 11. This vlan interface is then a slave of br1. br1 also has a wireless interface as a slave. This setup trunks wireless lan traffic over the copper network inside a VLAN.
A frame received on p1 which is passed up to the bridge has the skb->offload_fwd_mark flag set to true, indicating that the switch has dealt with forwarding the frame out ports p2 and p3 as needed. This flag instructs the software bridge it does not need to pass the frame back down again. However, the flag is not getting reset when the frame is passed upwards. As a result br1 sees the flag, wrongly interprets it, and fails to forward the frame to wlan0.
When passing a frame upwards, clear the flag. This is the Rx equivalent of br_switchdev_frame_unmark() in br_dev_xmit().
--- net/bridge/br_input.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/bridge/br_input.c +7 -0
@@ -42,6 +42,13 @@ static int br_pass_frame_up(struct sk_buff *skb)u64_stats_update_end (&brstats->syncp); vg =br_vlan_group_rcu (br); + +/* Reset the offload_fwd_mark because there could be a stacked +* bridge above, and it should not think this bridge it doing +* that bridge's work forwarding out its ports. +*/ +br_switchdev_frame_unmark (skb); +/* Bridge is just like any other port. Make sure the * packet is allowed except in promisc modue when someone * may be running packet capture.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/68 gpio: gpio-vf610: do not touch other bits when set the target bit
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit 9bf3ac466faa83d51a8fe9212131701e58fdef74 ]
For gpio controller contain register PDDR, when set one target bit, current logic will clear all other bits, this is wrong. Use operator '|=' to fix it.
--- drivers/gpio/gpio-vf610.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpio/gpio-vf610.c +6 -2
@@ -125,9 +125,13 @@ static int vf610_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, {struct vf610_gpio_port *port =gpiochip_get_data (chip);unsigned long mask =BIT (gpio); +u32 val; -if (port->sdata && port->sdata->have_paddr) -vf610_gpio_writel (mask, port->gpio_base +GPIO_PDDR ); +if (port->sdata && port->sdata->have_paddr) { + val =vf610_gpio_readl (port->gpio_base +GPIO_PDDR ); + val |= mask; +vf610_gpio_writel (val, port->gpio_base +GPIO_PDDR ); + }vf610_gpio_set (chip, gpio, value);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/68 gpio: mvebu/pwm: Refuse requests with inverted polarity
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 3ecb10175b1f776f076553c24e2689e42953fef5 ]
The driver doesn't take struct pwm_state::polarity into account when configuring the hardware, so refuse requests for inverted polarity.
--- drivers/gpio/gpio-mvebu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpio/gpio-mvebu.c +3 -0
@@ -697,6 +697,9 @@ static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,unsigned long flags;unsigned int on, off; +if (state->polarity !=PWM_POLARITY_NORMAL ) +return -EINVAL ; + val = (unsigned long long ) mvpwm->clk_rate * state->duty_cycle;do_div (val,NSEC_PER_SEC );if (val >UINT_MAX )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/68 perf bench numa: Address compiler error on s390
In reply to Greg Kroah-HartmanFrom: Thomas Richter <[email protected]>
[ Upstream commit f8ac1c478424a9a14669b8cef7389b1e14e5229d ]
The compilation on s390 results in this error:
# make DEBUG=y bench/numa.o
...
bench/numa.c: In function ‘__bench_numa’:
bench/numa.c:1749:81: error: ‘%d’ directive output may be truncated
writing between 1 and 11 bytes into a region of size between
10 and 20 [-Werror=format-truncation=]
1749 | snprintf(tname, sizeof(tname), "process%d:thread%d", p, t);
^~
...
bench/numa.c:1749:64: note: directive argument in the range
[-2147483647, 2147483646]
...
#The maximum length of the %d replacement is 11 characters because of the negative sign. Therefore extend the array by two more characters.
Output after:
# make DEBUG=y bench/numa.o > /dev/null 2>&1; ll bench/numa.o -rw-r--r-- 1 root root 418320 May 19 09:11 bench/numa.o #
--- tools/perf/bench/numa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/bench/numa.c +1 -1
@@ -1630,7 +1630,7 @@ static int __bench_numa(const char *name) "GB/sec,", "total-speed", "GB/sec total speed");if (g->p.show_details >=2 ) { -char tname[14 +2 *10 +1 ]; +char tname[14 +2 *11 +1 ];struct thread_data *td;for (p =0 ; p < g->p.nr_proc; p++) {for (t =0 ; t < g->p.nr_threads; t++) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/68 scsi: qla2xxx: Fix missed DMA unmap for aborted commands
In reply to Greg Kroah-HartmanFrom: Gleb Chesnokov <[email protected]>
[ Upstream commit 26f9ce53817a8fd84b69a73473a7de852a24c897 ]
Aborting commands that have already been sent to the firmware can cause BUG in qlt_free_cmd(): BUG_ON(cmd->sg_mapped)
For instance:
- Command passes rdx_to_xfer state, maps sgl, sends to the firmware
- Reset occurs, qla2xxx performs ISP error recovery, aborts the command
- Target stack calls qlt_abort_cmd() and then qlt_free_cmd()
- BUG_ON(cmd->sg_mapped) in qlt_free_cmd() occurs because sgl was not unmapped
Thus, unmap sgl in qlt_abort_cmd() for commands with the aborted flag set.
--- drivers/scsi/qla2xxx/qla_target.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/qla2xxx/qla_target.c +3 -0
@@ -3768,6 +3768,9 @@ int qlt_abort_cmd(struct qla_tgt_cmd *cmd)spin_lock_irqsave (&cmd->cmd_lock, flags);if (cmd->aborted) { +if (cmd->sg_mapped) +qlt_unmap_sg (vha, cmd); +spin_unlock_irqrestore (&cmd->cmd_lock, flags);/* * It's normal to see 2 calls in this path:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/68 mac80211: fix rx reordering with non explicit / psmp ack policy
In reply to Greg Kroah-HartmanFrom: Felix Fietkau <[email protected]>
[ Upstream commit 5e469ed9764d4722c59562da13120bd2dc6834c5 ]
When the QoS ack policy was set to non explicit / psmp ack, frames are treated as not being part of a BA session, which causes extra latency on reordering. Fix this by only bypassing reordering for packets with no-ack policy
--- net/mac80211/rx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/mac80211/rx.c +1 -2
@@ -1400,8 +1400,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, goto dont_reorder;/* not part of a BA session */ -if (ack_policy !=IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && - ack_policy !=IEEE80211_QOS_CTL_ACK_POLICY_NORMAL ) +if (ack_policy ==IEEE80211_QOS_CTL_ACK_POLICY_NOACK ) goto dont_reorder;/* new, potentially un-ordered, ampdu frame - process it */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/68 selftests: add ping test with ping_group_range tuned
In reply to Greg Kroah-HartmanFrom: Nicolas Dichtel <[email protected]>
[ Upstream commit e71b7f1f44d3d88c677769c85ef0171caf9fc89f ]
The 'ping' utility is able to manage two kind of sockets (raw or icmp), depending on the sysctl ping_group_range. By default, ping_group_range is set to '1 0', which forces ping to use an ip raw socket.
Let's replay the ping tests by allowing 'ping' to use the ip icmp socket. After the previous patch, ipv4 tests results are the same with both kinds of socket. For ipv6, there are a lot a new failures (the previous patch fixes only two cases).
--- tools/testing/selftests/net/fcnal-test.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+)
tools/testing/selftests/net/fcnal-test.sh +12 -0
@@ -757,10 +757,16 @@ ipv4_ping() setup set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null ipv4_ping_novrf + setup + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null + ipv4_ping_novrf log_subsection "With VRF" setup "yes" ipv4_ping_vrf + setup "yes" + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null + ipv4_ping_vrf } ################################################################################
@@ -2005,10 +2011,16 @@ ipv6_ping() log_subsection "No VRF" setup ipv6_ping_novrf + setup + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null + ipv6_ping_novrf log_subsection "With VRF" setup "yes" ipv6_ping_vrf + setup "yes" + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null + ipv6_ping_vrf } ################################################################################
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/68 ethernet: tulip: fix missing pci_disable_device() on error in tulip_init_one()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 51ca86b4c9c7c75f5630fa0dbe5f8f0bd98e3c3e ]
Fix the missing pci_disable_device() before return from tulip_init_one() in the error handling case.
--- drivers/net/ethernet/dec/tulip/tulip_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/dec/tulip/tulip_core.c +4 -1
@@ -1410,8 +1410,10 @@ static int tulip_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)/* alloc_etherdev ensures aligned and zeroed private structures */ dev =alloc_etherdev (sizeof (*tp)); -if (!dev) +if (!dev) { +pci_disable_device (pdev);return -ENOMEM ; + }SET_NETDEV_DEV (dev, &pdev->dev);if (pci_resource_len (pdev,0 ) < tulip_tbl[chip_idx].io_size) {
@@ -1788,6 +1790,7 @@ static int tulip_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) err_out_free_netdev:free_netdev (dev); +pci_disable_device (pdev);return -ENODEV ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/68 net: stmmac: fix missing pci_disable_device() on error in stmmac_pci_probe()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 0807ce0b010418a191e0e4009803b2d74c3245d5 ]
Switch to using pcim_enable_device() to avoid missing pci_disable_device().
--- drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +1 -3
@@ -481,7 +481,7 @@ static int stmmac_pci_probe(struct pci_dev *pdev,return -ENOMEM ;/* Enable pci device */ - ret =pci_enable_device (pdev); + ret =pcim_enable_device (pdev);if (ret) {dev_err (&pdev->dev,"%s: ERROR: failed to enable device\n" , __func__);
@@ -538,8 +538,6 @@ static void stmmac_pci_remove(struct pci_dev *pdev)pcim_iounmap_regions (pdev,BIT (i));break ; } - -pci_disable_device (pdev); }static int __maybe_unused stmmac_pci_suspend (struct device *dev)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/68 net: atlantic: verify hw_head_ lies within TX buffer ring
In reply to Greg Kroah-HartmanFrom: Grant Grundler <[email protected]>
[ Upstream commit 2120b7f4d128433ad8c5f503a9584deba0684901 ]
Bounds check hw_head index provided by NIC to verify it lies within the TX buffer ring.
--- drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +7 -0
@@ -674,6 +674,13 @@ static int hw_atl_b0_hw_ring_tx_head_update(struct aq_hw_s *self, err = -ENXIO ; goto err_exit; } + +/* Validate that the new hw_head_ is reasonable. */ +if (hw_head_ >= ring->size) { + err = -ENXIO ; + goto err_exit; + } + ring->hw_head = hw_head_; err =aq_hw_err_from_flags (self);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/68 Input: ili210x - fix reset timing
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
commit e4920d42ce0e9c8aafb7f64b6d9d4ae02161e51e upstream.
According to Ilitek "231x & ILI251x Programming Guide" Version: 2.30 "2.1. Power Sequence", "T4 Chip Reset and discharge time" is minimum 10ms and "T2 Chip initial time" is maximum 150ms. Adjust the reset timings such that T4 is 12ms and T2 is 160ms to fit those figures.
This prevents sporadic touch controller start up failures when some systems with at least ILI251x controller boot, without this patch the systems sometimes fail to communicate with the touch controller.
--- drivers/input/touchscreen/ili210x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/touchscreen/ili210x.c +2 -2
@@ -290,9 +290,9 @@ static int ili210x_i2c_probe(struct i2c_if (error)return error; -usleep_range (50 ,100 ); +usleep_range (12000 ,15000 );gpiod_set_value_cansleep (reset_gpio,0 ); -msleep (100 ); +msleep (160 ); } priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 60/68 block: return ELEVATOR_DISCARD_MERGE if possible
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
commit 866663b7b52d2da267b28e12eed89ee781b8fed1 upstream.
When merging one bio to request, if they are discard IO and the queue supports multi-range discard, we need to return ELEVATOR_DISCARD_MERGE because both block core and related drivers(nvme, virtio-blk) doesn't handle mixed discard io merge(traditional IO merge together with discard merge) well.
Fix the issue by returning ELEVATOR_DISCARD_MERGE in this situation, so both blk-mq and drivers just need to handle multi-range discard.
--- block/bfq-iosched.c | 3 +++ block/blk-merge.c | 15 --------------- block/elevator.c | 3 +++ block/mq-deadline.c | 2 ++ include/linux/blkdev.h | 16 ++++++++++++++++ 5 files changed, 24 insertions(+), 15 deletions(-)
block/bfq-iosched.c +3 -0
@@ -2251,6 +2251,9 @@ static int bfq_request_merge(struct requ __rq =bfq_find_rq_fmerge (bfqd, bio, q);if (__rq &&elv_bio_merge_ok (__rq, bio)) { *req = __rq; + +if (blk_discard_mergable (__rq)) +return ELEVATOR_DISCARD_MERGE ;return ELEVATOR_FRONT_MERGE ; }
block/blk-merge.c +0 -15
@@ -721,21 +721,6 @@ static void blk_account_io_merge(structpart_stat_unlock (); } } -/* -* Two cases of handling DISCARD merge: -* If max_discard_segments > 1, the driver takes every bio -* as a range and send them to controller together. The ranges -* needn't to be contiguous. -* Otherwise, the bios/requests will be handled as same as -* others which should be contiguous. -*/ -static inline bool blk_discard_mergable (struct request *req) -{ -if (req_op (req) ==REQ_OP_DISCARD && -queue_max_discard_segments (req->q) >1 ) -return true; -return false; -}static enum elv_merge blk_try_req_merge (struct request *req,struct request *next)
block/elevator.c +3 -0
@@ -337,6 +337,9 @@ enum elv_merge elv_merge(struct request_ __rq =elv_rqhash_find (q, bio->bi_iter.bi_sector);if (__rq &&elv_bio_merge_ok (__rq, bio)) { *req = __rq; + +if (blk_discard_mergable (__rq)) +return ELEVATOR_DISCARD_MERGE ;return ELEVATOR_BACK_MERGE ; }
block/mq-deadline.c +2 -0
@@ -452,6 +452,8 @@ static int dd_request_merge(struct requeif (elv_bio_merge_ok (__rq, bio)) { *rq = __rq; +if (blk_discard_mergable (__rq)) +return ELEVATOR_DISCARD_MERGE ;return ELEVATOR_FRONT_MERGE ; } }
include/linux/blkdev.h +16 -0
@@ -1409,6 +1409,22 @@ static inline int queue_limit_discard_alreturn offset <<SECTOR_SHIFT ; } +/* +* Two cases of handling DISCARD merge: +* If max_discard_segments > 1, the driver takes every bio +* as a range and send them to controller together. The ranges +* needn't to be contiguous. +* Otherwise, the bios/requests will be handled as same as +* others which should be contiguous. +*/ +static inline bool blk_discard_mergable (struct request *req) +{ +if (req_op (req) ==REQ_OP_DISCARD && +queue_max_discard_segments (req->q) >1 ) +return true; +return false; +} +static inline int bdev_discard_alignment (struct block_device *bdev) {struct request_queue *q =bdev_get_queue (bdev);
Greg Kroah-Hartman
maintainerPATCH 61/68 net: stmmac: disable Split Header (SPH) for Intel platforms
In reply to Greg Kroah-HartmanFrom: Tan Tee Min <[email protected]>
commit 47f753c1108e287edb3e27fad8a7511a9d55578e upstream.
Based on DesignWare Ethernet QoS datasheet, we are seeing the limitation of Split Header (SPH) feature is not supported for Ipv4 fragmented packet. This SPH limitation will cause ping failure when the packets size exceed the MTU size. For example, the issue happens once the basic ping packet size is larger than the configured MTU size and the data is lost inside the fragmented packet, replaced by zeros/corrupted values, and leads to ping fail.
So, disable the Split Header for Intel platforms.
v2: Add fixes tag in commit message.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +- drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 1 + include/linux/stmmac.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -4531,7 +4531,7 @@ int stmmac_dvr_probe(struct device *devidev_info (priv->device,"TSO feature enabled\n" ); } -if (priv->dma_cap.sphen) { +if (priv->dma_cap.sphen && !priv->plat->sph_disable) { ndev->hw_features |=NETIF_F_GRO ; priv->sph = true;dev_info (priv->device,"SPH feature enabled\n" );
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +1 -0
@@ -119,6 +119,7 @@ static int intel_mgbe_common_data(struct plat->has_gmac4 =1 ; plat->force_sf_dma_mode =0 ; plat->tso_en =1 ; + plat->sph_disable =1 ; plat->rx_sched_algorithm =MTL_RX_ALGORITHM_SP ;
include/linux/stmmac.h +1 -0
@@ -179,5 +179,6 @@ struct plat_stmmacenet_data {int mac_port_sel_speed;bool en_tx_lpi_clockgating;int has_xgmac; + bool sph_disable; };#endif
Greg Kroah-Hartman
maintainerPATCH 62/68 firmware_loader: use kernel credentials when reading firmware
In reply to Greg Kroah-HartmanFrom: Thiébaud Weksteen <[email protected]>
commit 581dd69830341d299b0c097fc366097ab497d679 upstream.
Device drivers may decide to not load firmware when probed to avoid slowing down the boot process should the firmware filesystem not be available yet. In this case, the firmware loading request may be done when a device file associated with the driver is first accessed. The credentials of the userspace process accessing the device file may be used to validate access to the firmware files requested by the driver. Ensure that the kernel assumes the responsibility of reading the firmware.
This was observed on Android for a graphic driver loading their firmware when the device file (e.g. /dev/mali0) was first opened by userspace (i.e. surfaceflinger). The security context of surfaceflinger was used to validate the access to the firmware file (e.g. /vendor/firmware/mali.bin).
Previously, Android configurations were not setting up the firmware_class.path command line argument and were relying on the userspace fallback mechanism. In this case, the security context of the userspace daemon (i.e. ueventd) was consistently used to read firmware files. More Android devices are now found to set firmware_class.path which gives the kernel the opportunity to read the firmware directly (via kernel_read_file_from_path_initns). In this scenario, the current process credentials were used, even if unrelated to the loading of the firmware file.
--- drivers/base/firmware_loader/main.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/base/firmware_loader/main.c +17 -0
@@ -761,6 +761,8 @@ _request_firmware(const struct firmware enum fw_opt opt_flags) {struct firmware *fw =NULL ; +struct cred *kern_cred =NULL ; +const struct cred *old_cred;int ret;if (!firmware_p)
@@ -776,6 +778,18 @@ _request_firmware(const struct firmwareif (ret <=0 )/* error or already assigned */ goto out; +/* +* We are about to try to access the firmware file. Because we may have been +* called by a driver when serving an unrelated request from userland, we use +* the kernel credentials to read the file. +*/ + kern_cred =prepare_kernel_cred (NULL ); +if (!kern_cred) { + ret = -ENOMEM ; + goto out; + } + old_cred =override_creds (kern_cred); + ret =fw_get_filesystem_firmware (device, fw->priv,"" ,NULL );#ifdef CONFIG_FW_LOADER_COMPRESS if (ret == -ENOENT )
@@ -792,6 +806,9 @@ _request_firmware(const struct firmware }else ret =assign_fw (fw, device, opt_flags); +revert_creds (old_cred); +put_cred (kern_cred); + out:if (ret <0 ) {fw_abort_batch_reqs (fw);
Greg Kroah-Hartman
maintainerPATCH 63/68 ARM: dts: imx7: Use audio_mclk_post_div instead audio_mclk_root_clk
In reply to Greg Kroah-HartmanFrom: Abel Vesa <[email protected]>
commit 4cb7df64c732b2b9918424095c11660c2a8c4a33 upstream.
The audio_mclk_root_clk was added as a gate with the CCGR121 (0x4790), but according to the reference manual, there is no such gate. Moreover, the consumer driver of the mentioned clock might gate it and leave the ECSPI2 (the true owner of that gate) hanging. So lets use the audio_mclk_post_div, which is the parent.
--- arch/arm/boot/dts/imx7-colibri.dtsi | 4 ++-- arch/arm/boot/dts/imx7-mba7.dtsi | 2 +- arch/arm/boot/dts/imx7d-nitrogen7.dts | 2 +- arch/arm/boot/dts/imx7d-pico-hobbit.dts | 4 ++-- arch/arm/boot/dts/imx7d-pico-pi.dts | 4 ++-- arch/arm/boot/dts/imx7d-sdb.dts | 2 +- arch/arm/boot/dts/imx7s-warp.dts | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-)
arch/arm/boot/dts/imx7-colibri.dtsi +2 -2
@@ -77,7 +77,7 @@ dailink_master: simple-audio-card,codec { sound-dai = <&codec>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; }; }; };
@@ -152,7 +152,7 @@ compatible = "fsl,sgtl5000"; #sound-dai-cells = <0>; reg = <0x0a>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai1_mclk>; VDDA-supply = <®_module_3v3_avdd>;
arch/arm/boot/dts/imx7-mba7.dtsi +1 -1
@@ -250,7 +250,7 @@ tlv320aic32x4: audio-codec@18 { compatible = "ti,tlv320aic32x4"; reg = <0x18>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; clock-names = "mclk"; ldoin-supply = <®_audio_3v3>; iov-supply = <®_audio_3v3>;
arch/arm/boot/dts/imx7d-nitrogen7.dts +1 -1
@@ -284,7 +284,7 @@ codec: wm8960@1a { compatible = "wlf,wm8960"; reg = <0x1a>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; clock-names = "mclk"; wlf,shared-lrclk; };
arch/arm/boot/dts/imx7d-pico-hobbit.dts +2 -2
@@ -31,7 +31,7 @@ dailink_master: simple-audio-card,codec { sound-dai = <&sgtl5000>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; }; }; };
@@ -41,7 +41,7 @@ #sound-dai-cells = <0>; reg = <0x0a>; compatible = "fsl,sgtl5000"; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; VDDA-supply = <®_2p5v>; VDDIO-supply = <®_vref_1v8>; };
arch/arm/boot/dts/imx7d-pico-pi.dts +2 -2
@@ -31,7 +31,7 @@ dailink_master: simple-audio-card,codec { sound-dai = <&sgtl5000>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; }; }; };
@@ -41,7 +41,7 @@ #sound-dai-cells = <0>; reg = <0x0a>; compatible = "fsl,sgtl5000"; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; VDDA-supply = <®_2p5v>; VDDIO-supply = <®_vref_1v8>; };
arch/arm/boot/dts/imx7d-sdb.dts +1 -1
@@ -356,7 +356,7 @@ codec: wm8960@1a { compatible = "wlf,wm8960"; reg = <0x1a>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; clock-names = "mclk"; wlf,shared-lrclk; };
arch/arm/boot/dts/imx7s-warp.dts +2 -2
@@ -75,7 +75,7 @@ dailink_master: simple-audio-card,codec { sound-dai = <&codec>; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; }; }; };
@@ -232,7 +232,7 @@ #sound-dai-cells = <0>; reg = <0x0a>; compatible = "fsl,sgtl5000"; - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai1_mclk>; VDDA-supply = <&vgen4_reg>;
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.4.196-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.4.y
* git commit: e9366e2c155ad1cd8fb6e1368bec57174ce80027
* git describe: v5.4.195-69-ge9366e2c155a
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.4.y/build/v5.4.195-69-ge9366e2c155a
## Test Regressions (compared to v5.4.194-43-g71ab15716d94) No test regressions found.
## Metric Regressions (compared to v5.4.194-43-g71ab15716d94) No metric regressions found.
## Test Fixes (compared to v5.4.194-43-g71ab15716d94) No test fixes found.
## Metric Fixes (compared to v5.4.194-43-g71ab15716d94) No metric fixes found.
## Test result summary
total: 86725, pass: 72314, fail: 836, skip: 12392, xfail: 1183
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 290 total, 290 passed, 0 failed
* arm64: 34 total, 34 passed, 0 failed
* i386: 19 total, 19 passed, 0 failed
* mips: 37 total, 37 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 54 total, 54 passed, 0 failed
* riscv: 27 total, 27 passed, 0 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x86_64: 40 total, 40 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* linux-log-parser
* log-parser-boot
* log-parser-test
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* perf/Zstd-perf.data-compression
* rcutorture
* ssuite
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.3.1 20220517): 65 configs -> no failure arm (gcc version 11.3.1 20220517): 107 configs -> no new failure arm64 (gcc version 11.3.1 20220517): 2 configs -> no failure x86_64 (gcc version 11.3.1 20220517): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/1195
--
Regards
Sudip
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 449 pass: 449 fail: 0
Guenter
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my arch x86_64 system. No dmesg regressions.
thanks,
-- Khalid Masum
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.196 release. There are 68 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 May 2022 16:56:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.196-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Tested on arm64 and x86 for 5.4.196-rc1,
Kernel repo:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-5.4.y
Version: 5.4.196-rc1
Commit: e9366e2c155ad1cd8fb6e1368bec57174ce80027
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 9030
passed: 9030
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 9030
passed: 9030
failed: 0
timeout: 0
--------------------------------------------------------------------