5.19.15-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.19.15-rc1 review
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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, 12 Oct 2022 07:03:19 +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.19.15-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.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.19.15-rc1
Tetsuo Handa <[email protected]>
Bluetooth: use hdev->workqueue when queuing hdev->{cmd,ncmd}_timer worksJules Irenge <[email protected]>
bpf: Fix resetting logic for unreferenced kptrs
Daniel Golle <[email protected]>
net: ethernet: mtk_eth_soc: fix state in __mtk_foe_entry_clear
Kumar Kartikeya Dwivedi <[email protected]>
bpf: Gate dynptr API behind CAP_BPF
Krzysztof Kozlowski <[email protected]>
rpmsg: qcom: glink: replace strncpy() with strscpy_pad()
Brian Norris <[email protected]>
mmc: core: Terminate infinite loop in SD-UHS voltage switch
ChanWoo Lee <[email protected]>
mmc: core: Replace with already defined values for readability
Mario Limonciello <[email protected]>
gpiolib: acpi: Add a quirk for Asus UM325UAZ
Mario Limonciello <[email protected]>
gpiolib: acpi: Add support to ignore programming an interrupt
Johan Hovold <[email protected]>
USB: serial: ftdi_sio: fix 300 bps rate for SIO
Tadeusz Struk <[email protected]>
usb: mon: make mmapped memory read only
Zhang Qilong <[email protected]>
i2c: davinci: fix PM disable depth imbalance in davinci_i2c_probe
Al Viro <[email protected]>
don't use __kernel_write() on kmap_local_page()
Kan Liang <[email protected]>
perf/x86/intel: Fix unchecked MSR access error for Alder Lake N
Dmytro Laktyushkin <[email protected]>
drm/amd/display: increase dcn315 pstate change latency
Cruise Hung <[email protected]>
drm/amd/display: Fix DP MST timeslot issue when fallback happened
zhikzhai <[email protected]>
drm/amd/display: skip audio setup when audio stream is enabled
Hugo Hu <[email protected]>
drm/amd/display: update gamut remap if plane has changed
Michael Strauss <[email protected]>
drm/amd/display: Assume an LTTPR is always present on fixed_vs links
Leo Li <[email protected]>
drm/amd/display: Fix double cursor on non-video RGB MPO
Janis Schoetterl-Glausch <[email protected]>
KVM: s390: Pass initialized arg even if unused
Jianglei Nie <[email protected]>
net: atlantic: fix potential memory leak in aq_ndev_close()
David Gow <[email protected]>
arch: um: Mark the stack non-executable to fix a binutils warning
Linus Walleij <[email protected]>
gpio: ftgpio010: Make irqchip immutable
Lukas Straub <[email protected]>
um: Cleanup compiler warning in arch/x86/um/tls_32.c
Lukas Straub <[email protected]>
um: Cleanup syscall_handler_t cast in syscalls_32.h
Jaroslav Kysela <[email protected]>
ALSA: hda/hdmi: Fix the converter reuse for the silent stream
Oleksandr Mazur <[email protected]>
net: marvell: prestera: add support for for Aldrin2
Haimin Zhang <[email protected]>
net/ieee802154: fix uninit value bug in dgram_sendmsg
Letu Ren <[email protected]>
scsi: qedf: Fix a UAF bug in __qedf_probe()
Yifan Zhang <[email protected]>
drm/amdgpu/mes: zero the sdma_hqd_mask of 2nd SDMA engine for SDMA 6.0.1
Sergei Antonov <[email protected]>
ARM: dts: fix Moxa SDIO 'compatible', remove 'sdhci' misnomer
Jason A. Donenfeld <[email protected]>
wifi: iwlwifi: don't spam logs with NSS>2 messages
Swati Agarwal <[email protected]>
dmaengine: xilinx_dma: Report error in case of dma_set_mask_and_coherent API failure
Swati Agarwal <[email protected]>
dmaengine: xilinx_dma: cleanup for fetching xlnx,num-fstores property
Swati Agarwal <[email protected]>
dmaengine: xilinx_dma: Fix devm_platform_ioremap_resource error handling
Frank Wunderlich <[email protected]>
arm64: dts: rockchip: fix upper usb port on BPI-R2-Pro
Cristian Marussi <[email protected]>
firmware: arm_scmi: Add SCMI PM driver remove routine
Cristian Marussi <[email protected]>
firmware: arm_scmi: Harden accesses to the sensor domains
Cristian Marussi <[email protected]>
firmware: arm_scmi: Improve checks in the info_get operations
Dongliang Mu <[email protected]>
fs: fix UAF/GPF bug in nilfs_mdt_destroy
Mikulas Patocka <[email protected]>
provide arch_test_bit_acquire for architectures that define test_bit
Mikulas Patocka <[email protected]>
wait_on_bit: add an acquire memory barrier
Jalal Mostafa <[email protected]>
xsk: Inherit need_wakeup flag for shared sockets
Shuah Khan <[email protected]>
docs: update mediator information in CoC docs
Kees Cook <[email protected]>
hardening: Remove Clang's enable flag for -ftrivial-auto-var-init=zero
Sami Tolvanen <[email protected]>
Makefile.extrawarn: Move -Wcast-function-type-strict to W=1
Bart Van Assche <[email protected]>
sparc: Unbreak the build
-------------
Diffstat:
.../devicetree/bindings/dma/moxa,moxart-dma.txt | 4 +-- .../process/code-of-conduct-interpretation.rst | 2 +- Makefile | 8 ++--- arch/alpha/include/asm/bitops.h | 7 ++++ arch/arm/boot/dts/moxart-uc7112lx.dts | 2 +- arch/arm/boot/dts/moxart.dtsi | 4 +-- arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 2 +- arch/hexagon/include/asm/bitops.h | 15 ++++++++ arch/ia64/include/asm/bitops.h | 7 ++++ arch/m68k/include/asm/bitops.h | 6 ++++ arch/s390/include/asm/bitops.h | 7 ++++ arch/s390/kvm/gaccess.c | 16 +++++++-- arch/sh/include/asm/bitops-op32.h | 7 ++++ arch/sparc/include/asm/smp_32.h | 15 ++++---- arch/sparc/kernel/leon_smp.c | 12 ++++--- arch/sparc/kernel/sun4d_smp.c | 12 ++++--- arch/sparc/kernel/sun4m_smp.c | 10 +++--- arch/sparc/mm/srmmu.c | 29 +++++++-------- arch/um/Makefile | 8 +++++ arch/x86/events/intel/core.c | 40 ++++++++++++++++++++- arch/x86/events/intel/ds.c | 9 +++-- arch/x86/events/perf_event.h | 2 ++ arch/x86/include/asm/bitops.h | 21 +++++++++++ arch/x86/um/shared/sysdep/syscalls_32.h | 5 ++- arch/x86/um/tls_32.c | 6 ---- arch/x86/um/vdso/Makefile | 2 +- drivers/dma/xilinx/xilinx_dma.c | 21 ++++++----- drivers/firmware/arm_scmi/clock.c | 6 +++- drivers/firmware/arm_scmi/scmi_pm_domain.c | 20 +++++++++++ drivers/firmware/arm_scmi/sensors.c | 25 ++++++++++--- drivers/gpio/gpio-ftgpio010.c | 22 +++++++----- drivers/gpio/gpiolib-acpi.c | 38 +++++++++++++++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 3 ++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 +++++-- .../amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c | 22 +++++++----- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 16 ++++++++- .../amd/display/dc/dce110/dce110_hw_sequencer.c | 6 ++-- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 1 + drivers/i2c/busses/i2c-davinci.c | 3 +- drivers/mmc/core/sd.c | 3 +- drivers/net/ethernet/aquantia/atlantic/aq_main.c | 3 -- .../net/ethernet/marvell/prestera/prestera_pci.c | 1 + drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 +-- drivers/rpmsg/qcom_glink_native.c | 2 +- drivers/rpmsg/qcom_smd.c | 4 +-- drivers/scsi/qedf/qedf_main.c | 5 --- drivers/usb/mon/mon_bin.c | 5 +++ drivers/usb/serial/ftdi_sio.c | 3 +- fs/coredump.c | 38 +++++++++++++++++--- fs/inode.c | 7 ++-- fs/internal.h | 3 ++ fs/read_write.c | 22 +++++++----- .../asm-generic/bitops/instrumented-non-atomic.h | 12 +++++++ include/asm-generic/bitops/non-atomic.h | 14 ++++++++ include/linux/buffer_head.h | 2 +- include/linux/scmi_protocol.h | 4 +-- include/linux/wait_bit.h | 8 ++--- include/net/ieee802154_netdev.h | 37 +++++++++++++++++++ include/net/xsk_buff_pool.h | 2 +- kernel/bpf/helpers.c | 28 +++++++-------- kernel/bpf/syscall.c | 2 +- kernel/sched/wait_bit.c | 2 +- net/bluetooth/hci_core.c | 15 ++++++-- net/bluetooth/hci_event.c | 6 ++-- net/ieee802154/socket.c | 42 ++++++++++++---------- net/xdp/xsk.c | 4 +-- net/xdp/xsk_buff_pool.c | 5 +-- scripts/Makefile.extrawarn | 1 + security/Kconfig.hardening | 14 +++++--- sound/pci/hda/patch_hdmi.c | 1 + 71 files changed, 559 insertions(+), 195 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/48 sparc: Unbreak the build
From: Bart Van Assche <[email protected]>
commit 17006e86a7641fa3c50324cfb602f0e74dac8527 upstream.
Fix the following build errors:
arch/sparc/mm/srmmu.c: In function ‘smp_flush_page_for_dma’:arch/sparc/mm/srmmu.c:1639:13: error: cast between incompatible function types from ‘void (*)(long unsigned int)’ to ‘void (*)(long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int)’ [-Werror=cast-function-type]
1639 | xc1((smpfunc_t) local_ops->page_for_dma, page);
| ^arch/sparc/mm/srmmu.c: In function ‘smp_flush_cache_mm’:arch/sparc/mm/srmmu.c:1662:29: error: cast between incompatible function types from ‘void (*)(struct mm_struct *)’ to ‘void (*)(long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int)’ [-Werror=cast-function-type]
1662 | xc1((smpfunc_t) local_ops->cache_mm, (unsigned long) mm);
|[ ... ]
Compile-tested only.
--- arch/sparc/include/asm/smp_32.h | 15 ++++++--------- arch/sparc/kernel/leon_smp.c | 12 +++++++----- arch/sparc/kernel/sun4d_smp.c | 12 +++++++----- arch/sparc/kernel/sun4m_smp.c | 10 ++++++---- arch/sparc/mm/srmmu.c | 29 +++++++++++++---------------- 5 files changed, 39 insertions(+), 39 deletions(-)
arch/sparc/include/asm/smp_32.h +6 -9
@@ -33,9 +33,6 @@ extern volatile unsigned long cpu_callinextern cpumask_t smp_commenced_mask;extern struct linux_prom_registers smp_penguin_ctable; -typedef void (*smpfunc_t )(unsigned long ,unsigned long ,unsigned long , -unsigned long ,unsigned long ); -void cpu_panic (void );/*
@@ -57,7 +54,7 @@ void smp_bogo(struct seq_file *);void smp_info (struct seq_file *);struct sparc32_ipi_ops { -void (*cross_call)(smpfunc_t func,cpumask_t mask,unsigned long arg1, +void (*cross_call)(void *func,cpumask_t mask,unsigned long arg1,unsigned long arg2,unsigned long arg3,unsigned long arg4);void (*resched)(int cpu);
@@ -66,28 +63,28 @@ struct sparc32_ipi_ops { };extern const struct sparc32_ipi_ops *sparc32_ipi_ops; -static inline void xc0 (smpfunc_t func) +static inline void xc0 (void *func) { sparc32_ipi_ops->cross_call (func, *cpu_online_mask,0 ,0 ,0 ,0 ); } -static inline void xc1 (smpfunc_t func,unsigned long arg1) +static inline void xc1 (void *func,unsigned long arg1) { sparc32_ipi_ops->cross_call (func, *cpu_online_mask, arg1,0 ,0 ,0 ); } -static inline void xc2 (smpfunc_t func,unsigned long arg1,unsigned long arg2) +static inline void xc2 (void *func,unsigned long arg1,unsigned long arg2) { sparc32_ipi_ops->cross_call (func, *cpu_online_mask, arg1, arg2,0 ,0 ); } -static inline void xc3 (smpfunc_t func,unsigned long arg1,unsigned long arg2, +static inline void xc3 (void *func,unsigned long arg1,unsigned long arg2,unsigned long arg3) { sparc32_ipi_ops->cross_call (func, *cpu_online_mask, arg1, arg2, arg3,0 ); } -static inline void xc4 (smpfunc_t func,unsigned long arg1,unsigned long arg2, +static inline void xc4 (void *func,unsigned long arg1,unsigned long arg2,unsigned long arg3,unsigned long arg4) { sparc32_ipi_ops->cross_call(func, *cpu_online_mask,
arch/sparc/kernel/leon_smp.c +7 -5
@@ -359,7 +359,7 @@ void leonsmp_ipi_interrupt(void) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3;
@@ -372,7 +372,7 @@ static struct smp_funcall {static DEFINE_SPINLOCK (cross_call_lock);/* Cross calls must be serialized, at least currently. */ -static void leon_cross_call (smpfunc_t func,cpumask_t mask,unsigned long arg1, +static void leon_cross_call (void *func,cpumask_t mask,unsigned long arg1,unsigned long arg2,unsigned long arg3,unsigned long arg4) {
@@ -384,7 +384,7 @@ static void leon_cross_call(smpfunc_t fu {/* If you make changes here, make sure gcc generates proper code... */ - register smpfunc_t f asm("i0") = func; + register void *f asm("i0") = func; register unsigned long a1 asm("i1") = arg1; register unsigned long a2 asm("i2") = arg2; register unsigned long a3 asm("i3") = arg3;
@@ -444,11 +444,13 @@ static void leon_cross_call(smpfunc_t fu/* Running cross calls. */ void leon_cross_call_irq (void ) { +void (*func)(unsigned long ,unsigned long ,unsigned long ,unsigned long , +unsigned long ) = ccall_info.func;int i =smp_processor_id (); ccall_info.processors_in[i] =1 ; - ccall_info.func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); +func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] =1 ; }
arch/sparc/kernel/sun4d_smp.c +7 -5
@@ -268,7 +268,7 @@ static void sun4d_ipi_resched(int cpu) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3;
@@ -281,7 +281,7 @@ static struct smp_funcall {static DEFINE_SPINLOCK (cross_call_lock);/* Cross calls must be serialized, at least currently. */ -static void sun4d_cross_call (smpfunc_t func,cpumask_t mask,unsigned long arg1, +static void sun4d_cross_call (void *func,cpumask_t mask,unsigned long arg1,unsigned long arg2,unsigned long arg3,unsigned long arg4) {
@@ -296,7 +296,7 @@ static void sun4d_cross_call(smpfunc_t f* If you make changes here, make sure * gcc generates proper code... */ - register smpfunc_t f asm("i0") = func; + register void *f asm("i0") = func; register unsigned long a1 asm("i1") = arg1; register unsigned long a2 asm("i2") = arg2; register unsigned long a3 asm("i3") = arg3;
@@ -353,11 +353,13 @@ static void sun4d_cross_call(smpfunc_t f/* Running cross calls. */ void smp4d_cross_call_irq (void ) { +void (*func)(unsigned long ,unsigned long ,unsigned long ,unsigned long , +unsigned long ) = ccall_info.func;int i =hard_smp_processor_id (); ccall_info.processors_in[i] =1 ; - ccall_info.func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); +func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] =1 ; }
arch/sparc/kernel/sun4m_smp.c +6 -4
@@ -157,7 +157,7 @@ static void sun4m_ipi_mask_one(int cpu) } static struct smp_funcall { - smpfunc_t func; + void *func; unsigned long arg1; unsigned long arg2; unsigned long arg3;
@@ -170,7 +170,7 @@ static struct smp_funcall {static DEFINE_SPINLOCK (cross_call_lock);/* Cross calls must be serialized, at least currently. */ -static void sun4m_cross_call (smpfunc_t func,cpumask_t mask,unsigned long arg1, +static void sun4m_cross_call (void *func,cpumask_t mask,unsigned long arg1,unsigned long arg2,unsigned long arg3,unsigned long arg4) {
@@ -230,11 +230,13 @@ static void sun4m_cross_call(smpfunc_t f/* Running cross calls. */ void smp4m_cross_call_irq (void ) { +void (*func)(unsigned long ,unsigned long ,unsigned long ,unsigned long , +unsigned long ) = ccall_info.func;int i =smp_processor_id (); ccall_info.processors_in[i] =1 ; - ccall_info.func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, - ccall_info.arg4, ccall_info.arg5); +func (ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4, + ccall_info.arg5); ccall_info.processors_out[i] =1 ; }
arch/sparc/mm/srmmu.c +13 -16
@@ -1636,19 +1636,19 @@ static void __init get_srmmu_type(void)/* Local cross-calls. */ static void smp_flush_page_for_dma (unsigned long page) { -xc1 ((smpfunc_t ) local_ops->page_for_dma, page); +xc1 (local_ops->page_for_dma, page); local_ops->page_for_dma (page); }static void smp_flush_cache_all (void ) { -xc0 ((smpfunc_t ) local_ops->cache_all); +xc0 (local_ops->cache_all); local_ops->cache_all (); }static void smp_flush_tlb_all (void ) { -xc0 ((smpfunc_t ) local_ops->tlb_all); +xc0 (local_ops->tlb_all); local_ops->tlb_all (); }
@@ -1659,7 +1659,7 @@ static void smp_flush_cache_mm(struct mmcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc1 ((smpfunc_t ) local_ops->cache_mm, (unsigned long ) mm); +xc1 (local_ops->cache_mm, (unsigned long )mm); local_ops->cache_mm (mm); } }
@@ -1671,7 +1671,7 @@ static void smp_flush_tlb_mm(struct mm_scpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) { -xc1 ((smpfunc_t ) local_ops->tlb_mm, (unsigned long ) mm); +xc1 (local_ops->tlb_mm, (unsigned long )mm);if (atomic_read (&mm->mm_users) ==1 && current->active_mm == mm)cpumask_copy (mm_cpumask (mm),cpumask_of (smp_processor_id ()));
@@ -1691,8 +1691,8 @@ static void smp_flush_cache_range(structcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc3 ((smpfunc_t ) local_ops->cache_range, - (unsigned long ) vma, start, end); +xc3 (local_ops->cache_range, (unsigned long )vma, start, + end); local_ops->cache_range (vma, start, end); } }
@@ -1708,8 +1708,8 @@ static void smp_flush_tlb_range(struct vcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc3 ((smpfunc_t ) local_ops->tlb_range, - (unsigned long ) vma, start, end); +xc3 (local_ops->tlb_range, (unsigned long )vma, start, + end); local_ops->tlb_range (vma, start, end); } }
@@ -1723,8 +1723,7 @@ static void smp_flush_cache_page(structcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc2 ((smpfunc_t ) local_ops->cache_page, - (unsigned long ) vma, page); +xc2 (local_ops->cache_page, (unsigned long )vma, page); local_ops->cache_page (vma, page); } }
@@ -1738,8 +1737,7 @@ static void smp_flush_tlb_page(struct vmcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc2 ((smpfunc_t ) local_ops->tlb_page, - (unsigned long ) vma, page); +xc2 (local_ops->tlb_page, (unsigned long )vma, page); local_ops->tlb_page (vma, page); } }
@@ -1753,7 +1751,7 @@ static void smp_flush_page_to_ram(unsign* XXX This experiment failed, research further... -DaveM */ #if 1 -xc1 ((smpfunc_t ) local_ops->page_to_ram, page); +xc1 (local_ops->page_to_ram, page);#endif local_ops->page_to_ram (page); }
@@ -1764,8 +1762,7 @@ static void smp_flush_sig_insns(struct mcpumask_copy (&cpu_mask,mm_cpumask (mm));cpumask_clear_cpu (smp_processor_id (), &cpu_mask);if (!cpumask_empty (&cpu_mask)) -xc2 ((smpfunc_t ) local_ops->sig_insns, - (unsigned long ) mm, insn_addr); +xc2 (local_ops->sig_insns, (unsigned long )mm, insn_addr); local_ops->sig_insns (mm, insn_addr); }
Greg Kroah-Hartman
maintainerPATCH 2/48 Makefile.extrawarn: Move -Wcast-function-type-strict to W=1
In reply to Greg Kroah-HartmanFrom: Sami Tolvanen <[email protected]>
commit 2120635108b35ecad9c59c8b44f6cbdf4f98214e upstream.
We enable -Wcast-function-type globally in the kernel to warn about mismatching types in function pointer casts. Compilers currently warn only about ABI incompability with this flag, but Clang 16 will enable a stricter version of the check by default that checks for an exact type match. This will be very noisy in the kernel, so disable -Wcast-function-type-strict without W=1 until the new warnings have been addressed.
--- scripts/Makefile.extrawarn | 1 + 1 file changed, 1 insertion(+)
scripts/Makefile.extrawarn +1 -0
@@ -53,6 +53,7 @@ KBUILD_CFLAGS += -Wno-format-zero-length KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) +KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict) endif endif
Greg Kroah-Hartman
maintainerPATCH 3/48 hardening: Remove Clangs enable flag for -ftrivial-auto-var-init=zero
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 607e57c6c62c00965ae276902c166834ce73014a upstream.
Now that Clang's -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang option is no longer required, remove it from the command line. Clang 16
and later will warn when it is used, which will cause Kconfig to think
it can't use -ftrivial-auto-var-init=zero at all. Check for whether it
is required and only use it when so.
--- Makefile | 4 ++-- security/Kconfig.hardening | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-)
Makefile +2 -2
@@ -830,8 +830,8 @@ endif # Initialize all stack variables with a zero value. ifdef CONFIG_INIT_STACK_ALL_ZERO KBUILD_CFLAGS += -ftrivial-auto-var-init=zero -ifdef CONFIG_CC_IS_CLANG -# https://bugs.llvm.org/show_bug.cgi?id=45497 +ifdef CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER +# https://github.com/llvm/llvm-project/issues/44842 KBUILD_CFLAGS += -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang endif endif
security/Kconfig.hardening +10 -4
@@ -22,11 +22,17 @@ menu "Memory initialization" config CC_HAS_AUTO_VAR_INIT_PATTERN def_bool $(cc-option,-ftrivial-auto-var-init=pattern) -config CC_HAS_AUTO_VAR_INIT_ZERO - # GCC ignores the -enable flag, so we can test for the feature with - # a single invocation using the flag, but drop it as appropriate in - # the Makefile, depending on the presence of Clang. +config CC_HAS_AUTO_VAR_INIT_ZERO_BARE + def_bool $(cc-option,-ftrivial-auto-var-init=zero) + +config CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER + # Clang 16 and later warn about using the -enable flag, but it + # is required before then. def_bool $(cc-option,-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang) + depends on !CC_HAS_AUTO_VAR_INIT_ZERO_BARE + +config CC_HAS_AUTO_VAR_INIT_ZERO + def_bool CC_HAS_AUTO_VAR_INIT_ZERO_BARE || CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER choice prompt "Initialize kernel stack variables at function entry"
Greg Kroah-Hartman
maintainerPATCH 4/48 docs: update mediator information in CoC docs
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 8bfdfa0d6b929ede7b6189e0e546ceb6a124d05d upstream.
Update mediator information in the CoC interpretation document.
--- Documentation/process/code-of-conduct-interpretation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/process/code-of-conduct-interpretation.rst +1 -1
@@ -51,7 +51,7 @@ the Technical Advisory Board (TAB) or ot uncertain how to handle situations that come up. It will not be considered a violation report unless you want it to be. If you are uncertain about approaching the TAB or any other maintainers, please -reach out to our conflict mediator, Mishi Choudhary <[email protected]>. +reach out to our conflict mediator, Joanna Lee <[email protected]>. In the end, "be kind to each other" is really what the end goal is for everybody. We know everyone is human and we all fail at times, but the
Greg Kroah-Hartman
maintainerPATCH 5/48 xsk: Inherit need_wakeup flag for shared sockets
In reply to Greg Kroah-HartmanFrom: Jalal Mostafa <[email protected]>
commit 60240bc26114543fcbfcd8a28466e67e77b20388 upstream.
The flag for need_wakeup is not set for xsks with XDP_SHARED_UMEM flag and of different queue ids and/or devices. They should inherit the flag from the first socket buffer pool since no flags can be specified once XDP_SHARED_UMEM is specified.
--- include/net/xsk_buff_pool.h | 2 +- net/xdp/xsk.c | 4 ++-- net/xdp/xsk_buff_pool.c | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-)
include/net/xsk_buff_pool.h +1 -1
@@ -95,7 +95,7 @@ struct xsk_buff_pool *xp_create_and_assi struct xdp_umem *umem);int xp_assign_dev (struct xsk_buff_pool *pool,struct net_device *dev,u16 queue_id,u16 flags); -int xp_assign_dev_shared (struct xsk_buff_pool *pool,struct xdp_umem *umem, +int xp_assign_dev_shared (struct xsk_buff_pool *pool,struct xdp_sock *umem_xs,struct net_device *dev,u16 queue_id);int xp_alloc_tx_descs (struct xsk_buff_pool *pool,struct xdp_sock *xs);void xp_destroy (struct xsk_buff_pool *pool);
net/xdp/xsk.c +2 -2
@@ -951,8 +951,8 @@ static int xsk_bind(struct socket *sock, goto out_unlock; } - err =xp_assign_dev_shared (xs->pool, umem_xs->umem, - dev, qid); + err =xp_assign_dev_shared (xs->pool, umem_xs, dev, + qid);if (err) {xp_destroy (xs->pool); xs->pool =NULL ;
net/xdp/xsk_buff_pool.c +3 -2
@@ -212,17 +212,18 @@ err_unreg_pool:return err; } -int xp_assign_dev_shared (struct xsk_buff_pool *pool,struct xdp_umem *umem, +int xp_assign_dev_shared (struct xsk_buff_pool *pool,struct xdp_sock *umem_xs,struct net_device *dev,u16 queue_id) {u16 flags; +struct xdp_umem *umem = umem_xs->umem;/* One fill and completion ring required for each queue id. */ if (!pool->fq || !pool->cq)return -EINVAL ; flags = umem->zc ?XDP_ZEROCOPY :XDP_COPY ; -if (pool->uses_need_wakeup) +if (umem_xs->pool->uses_need_wakeup) flags |=XDP_USE_NEED_WAKEUP ;return xp_assign_dev (pool, dev, queue_id, flags);
Greg Kroah-Hartman
maintainerPATCH 6/48 wait_on_bit: add an acquire memory barrier
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 8238b4579866b7c1bb99883cfe102a43db5506ff upstream.
There are several places in the kernel where wait_on_bit is not followed by a memory barrier (for example, in drivers/md/dm-bufio.c:new_read).
On architectures with weak memory ordering, it may happen that memory accesses that follow wait_on_bit are reordered before wait_on_bit and they may return invalid data.
Fix this class of bugs by introducing a new function "test_bit_acquire" that works like test_bit, but has acquire memory ordering semantics.
--- arch/x86/include/asm/bitops.h | 21 +++++++++++++++++++ include/asm-generic/bitops/instrumented-non-atomic.h | 12 ++++++++++ include/asm-generic/bitops/non-atomic.h | 14 ++++++++++++ include/linux/buffer_head.h | 2 - include/linux/wait_bit.h | 8 +++---- kernel/sched/wait_bit.c | 2 - 6 files changed, 53 insertions(+), 6 deletions(-)
arch/x86/include/asm/bitops.h +21 -0
@@ -207,6 +207,20 @@ static __always_inline bool constant_tes (addr[nr >> _BITOPS_LONG_SHIFT])) != 0; } +static __always_inline bool constant_test_bit_acquire(long nr, const volatile unsigned long *addr) +{ +bool oldbit; + + asm volatile("testb %2,%1" + CC_SET(nz) + : CC_OUT(nz) (oldbit) + : "m" (((unsigned char *)addr)[nr >> 3]), + "i" (1 << (nr & 7)) + :"memory"); + +return oldbit; +} + static __always_inline bool variable_test_bit(long nr, volatile const unsigned long *addr) {bool oldbit;
@@ -224,6 +238,13 @@ static __always_inline bool variable_tes ? constant_test_bit((nr), (addr)) \ : variable_test_bit((nr), (addr))) +static __always_inline bool +arch_test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +return __builtin_constant_p (nr) ?constant_test_bit_acquire (nr, addr) : +variable_test_bit (nr, addr); +} +/** * __ffs - find first set bit in word * @word: The word to search
include/asm-generic/bitops/instrumented-non-atomic.h +12 -0
@@ -135,4 +135,16 @@ static __always_inline bool test_bit(lon return arch_test_bit(nr, addr); } +/** +* _test_bit_acquire - Determine, with acquire semantics, whether a bit is set +* @nr: bit number to test +* @addr: Address to start counting from +*/ +static __always_inline bool +test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +instrument_atomic_read (addr +BIT_WORD (nr),sizeof (long )); +return arch_test_bit_acquire (nr, addr); +} +#endif /* _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H */
include/asm-generic/bitops/non-atomic.h +14 -0
@@ -3,6 +3,7 @@#define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_#include <asm/types.h> +#include <asm/barrier.h> /** * arch___set_bit - Set a bit in memory
@@ -119,4 +120,17 @@ arch_test_bit(unsigned int nr, const vol }#define test_bit arch_test_bit +/** +* arch_test_bit_acquire - Determine, with acquire semantics, whether a bit is set +* @nr: bit number to test +* @addr: Address to start counting from +*/ +static __always_inline bool +arch_test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +} +#define test_bit_acquire arch_test_bit_acquire +#endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */
include/linux/buffer_head.h +1 -1
@@ -166,7 +166,7 @@ static __always_inline int buffer_uptoda* make it consistent with folio_test_uptodate * pairs with smp_mb__before_atomic in set_buffer_uptodate */ -return (smp_load_acquire (&bh->b_state) & (1UL << BH_Uptodate)) !=0 ; +return test_bit_acquire (BH_Uptodate, &bh->b_state); }#define bh_offset (bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK)
include/linux/wait_bit.h +4 -4
@@ -71,7 +71,7 @@ static inline int wait_on_bit(unsigned long *word, int bit, unsigned mode) {might_sleep (); -if (!test_bit (bit, word)) +if (!test_bit_acquire (bit, word))return 0 ; return out_of_line_wait_on_bit(word, bit, bit_wait,
@@ -96,7 +96,7 @@ static inline int wait_on_bit_io(unsigned long *word, int bit, unsigned mode) {might_sleep (); -if (!test_bit (bit, word)) +if (!test_bit_acquire (bit, word))return 0 ; return out_of_line_wait_on_bit(word, bit, bit_wait_io,
@@ -123,7 +123,7 @@ wait_on_bit_timeout(unsigned long *word, unsigned long timeout) {might_sleep (); -if (!test_bit (bit, word)) +if (!test_bit_acquire (bit, word))return 0 ; return out_of_line_wait_on_bit_timeout(word, bit, bit_wait_timeout,
@@ -151,7 +151,7 @@ wait_on_bit_action(unsigned long *word, unsigned mode) {might_sleep (); -if (!test_bit (bit, word)) +if (!test_bit_acquire (bit, word))return 0 ;return out_of_line_wait_on_bit (word, bit, action, mode); }
kernel/sched/wait_bit.c +1 -1
@@ -47,7 +47,7 @@ __wait_on_bit(struct wait_queue_head *wqprepare_to_wait (wq_head, &wbq_entry->wq_entry, mode);if (test_bit (wbq_entry->key.bit_nr, wbq_entry->key.flags)) ret = (*action)(&wbq_entry->key, mode); - }while (test_bit (wbq_entry->key.bit_nr, wbq_entry->key.flags) && !ret); + }while (test_bit_acquire (wbq_entry->key.bit_nr, wbq_entry->key.flags) && !ret);finish_wait (wq_head, &wbq_entry->wq_entry);
Greg Kroah-Hartman
maintainerPATCH 7/48 provide arch_test_bit_acquire for architectures that define test_bit
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit d6ffe6067a54972564552ea45d320fb98db1ac5e upstream.
Some architectures define their own arch_test_bit and they also need arch_test_bit_acquire, otherwise they won't compile. We also clean up the code by using the generic test_bit if that is equivalent to the arch-specific version.
--- arch/alpha/include/asm/bitops.h | 7 +++++++ arch/hexagon/include/asm/bitops.h | 15 +++++++++++++++ arch/ia64/include/asm/bitops.h | 7 +++++++ arch/m68k/include/asm/bitops.h | 6 ++++++ arch/s390/include/asm/bitops.h | 7 +++++++ arch/sh/include/asm/bitops-op32.h | 7 +++++++ 6 files changed, 49 insertions(+)
arch/alpha/include/asm/bitops.h +7 -0
@@ -289,6 +289,13 @@ test_bit(int nr, const volatile void * areturn (1UL & (((const int *) addr)[nr >>5 ] >> (nr &31 ))) !=0UL ; } +static __always_inline bool +test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +} +/* * ffz = Find First Zero in word. Undefined if no zero exists, * so code should check against ~0UL first..
arch/hexagon/include/asm/bitops.h +15 -0
@@ -172,7 +172,22 @@ static inline int __test_bit(int nr, conreturn retval; } +static inline int __test_bit_acquire (int nr,const volatile unsigned long *addr) +{ +int retval; + + asmvolatile ( +"{P0 = tstbit(%1,%2); if (P0.new) %0 = #1; if (!P0.new) %0 = #0;}\n" + :"=&r" (retval) + :"r" (addr[BIT_WORD (nr)]),"r" (nr %BITS_PER_LONG ) + :"p0" ,"memory" + ); + +return retval; +} +#define test_bit (nr, addr) __test_bit(nr, addr) +#define test_bit_acquire (nr, addr) __test_bit_acquire(nr, addr)/* * ffz - find first zero in word.
arch/ia64/include/asm/bitops.h +7 -0
@@ -337,6 +337,13 @@ test_bit (int nr, const volatile void *areturn 1 & (((const volatile __u32 *) addr)[nr >>5 ] >> (nr &31 )); } +static __always_inline bool +test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +} +/** * ffz - find the first zero bit in a long word * @x: The long word to find the bit in
arch/m68k/include/asm/bitops.h +6 -0
@@ -153,6 +153,12 @@ static inline int test_bit(int nr, constreturn (vaddr[nr >>5 ] & (1UL << (nr &31 ))) !=0 ; } +static __always_inline bool +test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +}static inline int bset_reg_test_and_set_bit (int nr,volatile unsigned long *vaddr)
arch/s390/include/asm/bitops.h +7 -0
@@ -184,6 +184,13 @@ static inline bool arch_test_bit(unsignereturn *addr & mask; } +static __always_inline bool +arch_test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +} +static inline bool arch_test_and_set_bit_lock (unsigned long nr,volatile unsigned long *ptr) {
arch/sh/include/asm/bitops-op32.h +7 -0
@@ -138,4 +138,11 @@ static inline int test_bit(int nr, constreturn 1UL & (addr[BIT_WORD (nr)] >> (nr & (BITS_PER_LONG -1 ))); } +static __always_inline bool +test_bit_acquire (unsigned long nr,const volatile unsigned long *addr) +{ +unsigned long *p = ((unsigned long *)addr) +BIT_WORD (nr); +return 1UL & (smp_load_acquire (p) >> (nr & (BITS_PER_LONG -1 ))); +} +#endif /* __ASM_SH_BITOPS_OP32_H */
Greg Kroah-Hartman
maintainerPATCH 8/48 fs: fix UAF/GPF bug in nilfs_mdt_destroy
In reply to Greg Kroah-HartmanFrom: Dongliang Mu <[email protected]>
commit 2e488f13755ffbb60f307e991b27024716a33b29 upstream.
In alloc_inode, inode_init_always() could return -ENOMEM if security_inode_alloc() fails, which causes inode->i_private uninitialized. Then nilfs_is_metadata_file_inode() returns true and nilfs_free_inode() wrongly calls nilfs_mdt_destroy(), which frees the uninitialized inode->i_private
and leads to crashes(e.g., UAF/GPF).
Fix this by moving security_inode_alloc just prior to this_cpu_inc(nr_inodes)
--- fs/inode.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/inode.c +3 -4
@@ -192,8 +192,6 @@ int inode_init_always(struct super_block inode->i_wb_frn_history =0 ;#endif -if (security_inode_alloc (inode)) - goto out;spin_lock_init (&inode->i_lock);lockdep_set_class (&inode->i_lock, &sb->s_type->i_lock_key);
@@ -228,11 +226,12 @@ int inode_init_always(struct super_block inode->i_fsnotify_mask =0 ;#endif inode->i_flctx =NULL ; + +if (unlikely (security_inode_alloc (inode))) +return -ENOMEM ;this_cpu_inc (nr_inodes);return 0 ; -out: -return -ENOMEM ; }EXPORT_SYMBOL (inode_init_always);
Greg Kroah-Hartman
maintainerPATCH 9/48 firmware: arm_scmi: Improve checks in the info_get operations
In reply to Greg Kroah-HartmanFrom: Cristian Marussi <[email protected]>
[ Upstream commit 1ecb7d27b1af6705e9a4e94415b4d8cc8cf2fbfb ]
SCMI protocols abstract and expose a number of protocol specific resources like clocks, sensors and so on. Information about such specific domain resources are generally exposed via an info_get protocol operation.
Improve the sanity check on these operations where needed.
--- drivers/firmware/arm_scmi/clock.c | 6 +++++- drivers/firmware/arm_scmi/sensors.c | 3 +++ include/linux/scmi_protocol.h | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-)
drivers/firmware/arm_scmi/clock.c +5 -1
@@ -450,9 +450,13 @@ static int scmi_clock_count_get(const struct scmi_protocol_handle *ph)static const struct scmi_clock_info *scmi_clock_info_get (const struct scmi_protocol_handle *ph,u32 clk_id) { +struct scmi_clock_info *clk;struct clock_info *ci = ph->get_priv (ph); -struct scmi_clock_info *clk = ci->clk + clk_id; +if (clk_id >= ci->num_clocks) +return NULL ; + + clk = ci->clk + clk_id;if (!clk->name[0 ])return NULL ;
drivers/firmware/arm_scmi/sensors.c +3 -0
@@ -948,6 +948,9 @@ scmi_sensor_info_get(const struct scmi_protocol_handle *ph, u32 sensor_id) {struct sensors_info *si = ph->get_priv (ph); +if (sensor_id >= si->num_sensors) +return NULL ; +return si->sensors + sensor_id; }
include/linux/scmi_protocol.h +2 -2
@@ -78,7 +78,7 @@ struct scmi_protocol_handle;struct scmi_clk_proto_ops {int (*count_get)(const struct scmi_protocol_handle *ph); -const struct scmi_clock_info *(*info_get) +const struct scmi_clock_info __must_check *(*info_get) (const struct scmi_protocol_handle *ph,u32 clk_id);int (*rate_get)(const struct scmi_protocol_handle *ph,u32 clk_id,u64 *rate);
@@ -460,7 +460,7 @@ enum scmi_sensor_class {*/ struct scmi_sensor_proto_ops {int (*count_get)(const struct scmi_protocol_handle *ph); -const struct scmi_sensor_info *(*info_get) +const struct scmi_sensor_info __must_check *(*info_get) (const struct scmi_protocol_handle *ph,u32 sensor_id);int (*trip_point_config)(const struct scmi_protocol_handle *ph,u32 sensor_id,u8 trip_id,u64 trip_value);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 10/48 firmware: arm_scmi: Harden accesses to the sensor domains
In reply to Greg Kroah-HartmanFrom: Cristian Marussi <[email protected]>
[ Upstream commit 76f89c954788763db575fb512a40bd483864f1e9 ]
Accessing sensor domains descriptors by the index upon the SCMI drivers requests through the SCMI sensor operations interface can potentially lead to out-of-bound violations if the SCMI driver misbehave.
Add an internal consistency check before any such domains descriptors accesses.
--- drivers/firmware/arm_scmi/sensors.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
drivers/firmware/arm_scmi/sensors.c +18 -4
@@ -762,6 +762,10 @@ static int scmi_sensor_config_get(const struct scmi_protocol_handle *ph, {int ret;struct scmi_xfer *t; +struct sensors_info *si = ph->get_priv (ph); + +if (sensor_id >= si->num_sensors) +return -EINVAL ; ret = ph->xops->xfer_get_init (ph,SENSOR_CONFIG_GET ,sizeof (__le32),sizeof (__le32), &t);
@@ -771,7 +775,6 @@ static int scmi_sensor_config_get(const struct scmi_protocol_handle *ph,put_unaligned_le32 (sensor_id, t->tx.buf); ret = ph->xops->do_xfer (ph, t);if (!ret) { -struct sensors_info *si = ph->get_priv (ph);struct scmi_sensor_info *s = si->sensors + sensor_id; *sensor_config =get_unaligned_le64 (t->rx.buf);
@@ -788,6 +791,10 @@ static int scmi_sensor_config_set(const struct scmi_protocol_handle *ph,int ret;struct scmi_xfer *t;struct scmi_msg_sensor_config_set *msg; +struct sensors_info *si = ph->get_priv (ph); + +if (sensor_id >= si->num_sensors) +return -EINVAL ; ret = ph->xops->xfer_get_init (ph,SENSOR_CONFIG_SET ,sizeof (*msg),0 , &t);
@@ -800,7 +807,6 @@ static int scmi_sensor_config_set(const struct scmi_protocol_handle *ph, ret = ph->xops->do_xfer (ph, t);if (!ret) { -struct sensors_info *si = ph->get_priv (ph);struct scmi_sensor_info *s = si->sensors + sensor_id; s->sensor_config = sensor_config;
@@ -831,8 +837,11 @@ static int scmi_sensor_reading_get(const struct scmi_protocol_handle *ph,int ret;struct scmi_xfer *t;struct scmi_msg_sensor_reading_get *sensor; +struct scmi_sensor_info *s;struct sensors_info *si = ph->get_priv (ph); -struct scmi_sensor_info *s = si->sensors + sensor_id; + +if (sensor_id >= si->num_sensors) +return -EINVAL ; ret = ph->xops->xfer_get_init (ph,SENSOR_READING_GET ,sizeof (*sensor),0 , &t);
@@ -841,6 +850,7 @@ static int scmi_sensor_reading_get(const struct scmi_protocol_handle *ph, sensor = t->tx.buf; sensor->id =cpu_to_le32 (sensor_id); + s = si->sensors + sensor_id;if (s->async) { sensor->flags =cpu_to_le32 (SENSOR_READ_ASYNC ); ret = ph->xops->do_xfer_with_response (ph, t);
@@ -895,9 +905,13 @@ scmi_sensor_reading_get_timestamped(const struct scmi_protocol_handle *ph,int ret;struct scmi_xfer *t;struct scmi_msg_sensor_reading_get *sensor; +struct scmi_sensor_info *s;struct sensors_info *si = ph->get_priv (ph); -struct scmi_sensor_info *s = si->sensors + sensor_id; +if (sensor_id >= si->num_sensors) +return -EINVAL ; + + s = si->sensors + sensor_id;if (!count || !readings || (!s->num_axis && count >1 ) || (s->num_axis && count > s->num_axis))return -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/48 firmware: arm_scmi: Add SCMI PM driver remove routine
In reply to Greg Kroah-HartmanFrom: Cristian Marussi <[email protected]>
[ Upstream commit dea796fcab0a219830831c070b8dc367d7e0f708 ]
Currently, when removing the SCMI PM driver not all the resources registered with genpd subsystem are properly de-registered.
As a side effect of this after a driver unload/load cycle you get a splat with a few warnings like this:
| debugfs: Directory 'BIG_CPU0' with parent 'pm_genpd' already present! | debugfs: Directory 'BIG_CPU1' with parent 'pm_genpd' already present! | debugfs: Directory 'LITTLE_CPU0' with parent 'pm_genpd' already present! | debugfs: Directory 'LITTLE_CPU1' with parent 'pm_genpd' already present! | debugfs: Directory 'LITTLE_CPU2' with parent 'pm_genpd' already present! | debugfs: Directory 'LITTLE_CPU3' with parent 'pm_genpd' already present! | debugfs: Directory 'BIG_SSTOP' with parent 'pm_genpd' already present! | debugfs: Directory 'LITTLE_SSTOP' with parent 'pm_genpd' already present! | debugfs: Directory 'DBGSYS' with parent 'pm_genpd' already present! | debugfs: Directory 'GPUTOP' with parent 'pm_genpd' already present!
Add a proper scmi_pm_domain_remove callback to the driver in order to take care of all the needed cleanups not handled by devres framework.
--- drivers/firmware/arm_scmi/scmi_pm_domain.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/firmware/arm_scmi/scmi_pm_domain.c +20 -0
@@ -112,9 +112,28 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev) scmi_pd_data->domains = domains; scmi_pd_data->num_domains = num_domains; +dev_set_drvdata (dev, scmi_pd_data); +return of_genpd_add_provider_onecell (np, scmi_pd_data); } +static void scmi_pm_domain_remove (struct scmi_device *sdev) +{ +int i; +struct genpd_onecell_data *scmi_pd_data; +struct device *dev = &sdev->dev; +struct device_node *np = dev->of_node; + +of_genpd_del_provider (np); + + scmi_pd_data =dev_get_drvdata (dev); +for (i =0 ; i < scmi_pd_data->num_domains; i++) { +if (!scmi_pd_data->domains[i]) +continue ; +pm_genpd_remove (scmi_pd_data->domains[i]); + } +} +static const struct scmi_device_id scmi_id_table[] = { {SCMI_PROTOCOL_POWER ,"genpd" }, { },
@@ -124,6 +143,7 @@ MODULE_DEVICE_TABLE(scmi, scmi_id_table);static struct scmi_driver scmi_power_domain_driver = { .name ="scmi-power-domain" , .probe = scmi_pm_domain_probe, + .remove = scmi_pm_domain_remove, .id_table = scmi_id_table, };module_scmi_driver (scmi_power_domain_driver);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/48 arm64: dts: rockchip: fix upper usb port on BPI-R2-Pro
In reply to Greg Kroah-HartmanFrom: Frank Wunderlich <[email protected]>
[ Upstream commit 388f9f0a7ff84b7890a24499a3a1fea0cad21373 ]
- extcon is no more needed in 5.19 - so drop it
commit 51a9b2c03dd3 ("phy: rockchip-inno-usb2: Handle ID IRQ")
- dr_mode was changed from host to otg in rk356x.dtsi commit bc405bb3eeee ("arm64: dts: rockchip: enable otg/drd operation of usb_host0_xhci in rk356x")
change it back on board level as id-pin on r2pro is not connected
--- arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +1 -1
@@ -558,7 +558,7 @@ &usb_host0_ohci { }; &usb_host0_xhci { - extcon = <&usb2phy0>; + dr_mode = "host"; status = "okay"; };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 13/48 dmaengine: xilinx_dma: Fix devm_platform_ioremap_resource error handling
In reply to Greg Kroah-HartmanFrom: Swati Agarwal <[email protected]>
[ Upstream commit 91df7751eb890e970afc08f50b8f0fa5ea39e03d ]
Add missing cleanup in devm_platform_ioremap_resource(). When probe fails remove dma channel resources and disable clocks in accordance with the order of resources allocated .
--- drivers/dma/xilinx/xilinx_dma.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/dma/xilinx/xilinx_dma.c +7 -6
@@ -3160,9 +3160,10 @@ static int xilinx_dma_probe(struct platform_device *pdev)/* Request and map I/O memory */ xdev->regs =devm_platform_ioremap_resource (pdev,0 ); -if (IS_ERR (xdev->regs)) -return PTR_ERR (xdev->regs); - +if (IS_ERR (xdev->regs)) { + err =PTR_ERR (xdev->regs); + goto disable_clks; + }/* Retrieve the DMA engine properties from the device tree */ xdev->max_buffer_len =GENMASK (XILINX_DMA_MAX_TRANS_LEN_MAX -1 ,0 ); xdev->s2mm_chan_id = xdev->dma_config->max_channels /2 ;
@@ -3259,7 +3260,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)for_each_child_of_node (node, child) { err =xilinx_dma_child_probe (xdev, child);if (err <0 ) - goto disable_clks; + goto error; }if (xdev->dma_config->dmatype ==XDMA_TYPE_VDMA ) {
@@ -3294,12 +3295,12 @@ static int xilinx_dma_probe(struct platform_device *pdev)return 0 ; -disable_clks: -xdma_disable_allclks (xdev); error:for (i =0 ; i < xdev->dma_config->max_channels; i++)if (xdev->chan[i])xilinx_dma_chan_remove (xdev->chan[i]); +disable_clks: +xdma_disable_allclks (xdev);return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/48 dmaengine: xilinx_dma: cleanup for fetching xlnx,num-fstores property
In reply to Greg Kroah-HartmanFrom: Swati Agarwal <[email protected]>
[ Upstream commit 462bce790e6a7e68620a4ce260cc38f7ed0255d5 ]
Free the allocated resources for missing xlnx,num-fstores property.
--- drivers/dma/xilinx/xilinx_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/xilinx/xilinx_dma.c +1 -1
@@ -3191,7 +3191,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)if (err <0 ) {dev_err (xdev->dev,"missing xlnx,num-fstores property\n" ); -return err; + goto disable_clks; } err = of_property_read_u32(node, "xlnx,flush-fsync",
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/48 dmaengine: xilinx_dma: Report error in case of dma_set_mask_and_coherent API failure
In reply to Greg Kroah-HartmanFrom: Swati Agarwal <[email protected]>
[ Upstream commit 8f2b6bc79c32f0fa60df000ae387a790ec80eae9 ]
The driver does not handle the failure case while calling dma_set_mask_and_coherent API.
In case of failure, capture the return value of API and then report an error.
Addresses-coverity: Unchecked return value (CHECKED_RETURN)
--- drivers/dma/xilinx/xilinx_dma.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/dma/xilinx/xilinx_dma.c +5 -1
@@ -3211,7 +3211,11 @@ static int xilinx_dma_probe(struct platform_device *pdev) xdev->ext_addr = false;/* Set the dma mask bits */ -dma_set_mask_and_coherent (xdev->dev,DMA_BIT_MASK (addr_width)); + err =dma_set_mask_and_coherent (xdev->dev,DMA_BIT_MASK (addr_width)); +if (err <0 ) { +dev_err (xdev->dev,"DMA mask error %d\n" , err); + goto disable_clks; + }/* Initialize the DMA engine */ xdev->common.dev = &pdev->dev;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/48 wifi: iwlwifi: dont spam logs with NSS>2 messages
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
[ Upstream commit 4d8421f2dd88583cc7a4d6c2a5532c35e816a52a ]
I get a log line like this every 4 seconds when connected to my AP:
[15650.221468] iwlwifi 0000:09:00.0: Got NSS = 4 - trimming to 2
Looking at the code, this seems to be related to a hardware limitation, and there's nothing to be done. In an effort to keep my dmesg manageable, downgrade this error to "debug" rather than "info".
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +2 -2
@@ -1833,8 +1833,8 @@ static void iwl_mvm_parse_ppe(struct iwl_mvm *mvm,* If nss < MAX: we can set zeros in other streams */ if (nss >MAX_HE_SUPP_NSS ) { -IWL_INFO (mvm,"Got NSS = %d - trimming to %d\n" , nss, -MAX_HE_SUPP_NSS ); +IWL_DEBUG_INFO (mvm,"Got NSS = %d - trimming to %d\n" , nss, +MAX_HE_SUPP_NSS ); nss =MAX_HE_SUPP_NSS ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/48 ARM: dts: fix Moxa SDIO compatible, remove sdhci misnomer
In reply to Greg Kroah-HartmanFrom: Sergei Antonov <[email protected]>
[ Upstream commit 02181e68275d28cab3c3f755852770367f1bc229 ]
Driver moxart-mmc.c has .compatible = "moxa,moxart-mmc".
But moxart .dts/.dtsi and the documentation file moxa,moxart-dma.txt contain compatible = "moxa,moxart-sdhci".
Change moxart .dts/.dtsi files and moxa,moxart-dma.txt to match the driver.
Replace 'sdhci' with 'mmc' in names too, since SDHCI is a different controller from FTSDC010.
--- Documentation/devicetree/bindings/dma/moxa,moxart-dma.txt | 4 ++-- arch/arm/boot/dts/moxart-uc7112lx.dts | 2 +- arch/arm/boot/dts/moxart.dtsi | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/dma/moxa,moxart-dma.txt +2 -2
@@ -34,8 +34,8 @@ Example: Use specific request line passing from dma For example, MMC request line is 5 - sdhci: sdhci@98e00000 { - compatible = "moxa,moxart-sdhci"; + mmc: mmc@98e00000 { + compatible = "moxa,moxart-mmc"; reg = <0x98e00000 0x5C>; interrupts = <5 0>; clocks = <&clk_apb>;
arch/arm/boot/dts/moxart-uc7112lx.dts +1 -1
@@ -79,7 +79,7 @@ &clk_pll { clocks = <&ref12>; }; -&sdhci { +&mmc { status = "okay"; };
arch/arm/boot/dts/moxart.dtsi +2 -2
@@ -93,8 +93,8 @@ watchdog: watchdog@98500000 { clock-names = "PCLK"; }; - sdhci: sdhci@98e00000 { - compatible = "moxa,moxart-sdhci"; + mmc: mmc@98e00000 { + compatible = "moxa,moxart-mmc"; reg = <0x98e00000 0x5C>; interrupts = <5 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk_apb>;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/48 drm/amdgpu/mes: zero the sdma_hqd_mask of 2nd SDMA engine for SDMA 6.0.1
In reply to Greg Kroah-HartmanFrom: Yifan Zhang <[email protected]>
[ Upstream commit 0af4ed0c329ebb4cef95fda4fcdbfcdea0255442 ]
there is only one SDMA engine in SDMA 6.0.1, the sdma_hqd_mask has to be zeroed for the 2nd engine, otherwise MES scheduler will consider 2nd engine exists and map/unmap SDMA queues to the non-existent engine.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +3 -0
@@ -169,6 +169,9 @@ int amdgpu_mes_init(struct amdgpu_device *adev)for (i =0 ; i <AMDGPU_MES_MAX_SDMA_PIPES ; i++) {if (adev->ip_versions[SDMA0_HWIP ][0 ] <IP_VERSION (6 ,0 ,0 )) adev->mes.sdma_hqd_mask[i] = i ?0 :0x3fc ; +/* zero sdma_hqd_mask for non-existent engine */ +else if (adev->sdma.num_instances ==1 ) + adev->mes.sdma_hqd_mask[i] = i ?0 :0xfc ;else adev->mes.sdma_hqd_mask[i] =0xfc ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/48 scsi: qedf: Fix a UAF bug in __qedf_probe()
In reply to Greg Kroah-HartmanFrom: Letu Ren <[email protected]>
[ Upstream commit fbfe96869b782364caebae0445763969ddb6ea67 ]
In __qedf_probe(), if qedf->cdev is NULL which means qed_ops->common->probe() failed, then the program will goto label err1, and scsi_host_put() will free lport->host pointer. Because the memory qedf points to is allocated by libfc_host_alloc(), it will be freed by scsi_host_put(). However, the if statement below label err0 only checks whether qedf is NULL but doesn't check whether the memory has been freed. So a UAF bug can occur.
There are two ways to reach the statements below err0. The first one is described as before, "qedf" should be set to NULL. The second one is goto "err0" directly. In the latter scenario qedf hasn't been changed and it has the initial value NULL. As a result the if statement is not reachable in any situation.
The KASAN logs are as follows:
[ 2.312969] BUG: KASAN: use-after-free in __qedf_probe+0x5dcf/0x6bc0 [ 2.312969] [ 2.312969] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014 [ 2.312969] Call Trace: [ 2.312969] dump_stack_lvl+0x59/0x7b [ 2.312969] print_address_description+0x7c/0x3b0 [ 2.312969] ? __qedf_probe+0x5dcf/0x6bc0 [ 2.312969] __kasan_report+0x160/0x1c0 [ 2.312969] ? __qedf_probe+0x5dcf/0x6bc0 [ 2.312969] kasan_report+0x4b/0x70 [ 2.312969] ? kobject_put+0x25d/0x290 [ 2.312969] kasan_check_range+0x2ca/0x310 [ 2.312969] __qedf_probe+0x5dcf/0x6bc0 [ 2.312969] ? selinux_kernfs_init_security+0xdc/0x5f0 [ 2.312969] ? trace_rpm_return_int_rcuidle+0x18/0x120 [ 2.312969] ? rpm_resume+0xa5c/0x16e0 [ 2.312969] ? qedf_get_generic_tlv_data+0x160/0x160 [ 2.312969] local_pci_probe+0x13c/0x1f0 [ 2.312969] pci_device_probe+0x37e/0x6c0
--- drivers/scsi/qedf/qedf_main.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/scsi/qedf/qedf_main.c +0 -5
@@ -3686,11 +3686,6 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) err1:scsi_host_put (lport->host); err0: -if (qedf) { -QEDF_INFO (&qedf->dbg_ctx,QEDF_LOG_DISC ,"Probe done.\n" ); - -clear_bit (QEDF_PROBING , &qedf->flags); - }return rc; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/48 net/ieee802154: fix uninit value bug in dgram_sendmsg
In reply to Greg Kroah-HartmanFrom: Haimin Zhang <[email protected]>
[ Upstream commit 94160108a70c8af17fa1484a37e05181c0e094af ]
There is uninit value bug in dgram_sendmsg function in net/ieee802154/socket.c when the length of valid data pointed by the msg->msg_name isn't verified.
We introducing a helper function ieee802154_sockaddr_check_size to check namelen. First we check there is addr_type in ieee802154_addr_sa. Then, we check namelen according to addr_type.
Also fixed in raw_bind, dgram_bind, dgram_connect.
--- include/net/ieee802154_netdev.h | 37 +++++++++++++++++++++++++++++ net/ieee802154/socket.c | 42 ++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 19 deletions(-)
include/net/ieee802154_netdev.h +37 -0
@@ -15,6 +15,22 @@#ifndef IEEE802154_NETDEVICE_H #define IEEE802154_NETDEVICE_H +#define IEEE802154_REQUIRED_SIZE (struct_type, member) \ + (offsetof(typeof(struct_type), member) + \ + sizeof(((typeof(struct_type) *)(NULL))->member)) + +#define IEEE802154_ADDR_OFFSET \ + offsetof(typeof(struct sockaddr_ieee802154), addr) + +#define IEEE802154_MIN_NAMELEN (IEEE802154_ADDR_OFFSET + \ + IEEE802154_REQUIRED_SIZE(struct ieee802154_addr_sa, addr_type)) + +#define IEEE802154_NAMELEN_SHORT (IEEE802154_ADDR_OFFSET + \ + IEEE802154_REQUIRED_SIZE(struct ieee802154_addr_sa, short_addr)) + +#define IEEE802154_NAMELEN_LONG (IEEE802154_ADDR_OFFSET + \ + IEEE802154_REQUIRED_SIZE(struct ieee802154_addr_sa, hwaddr)) +#include <net/af_ieee802154.h> #include <linux/netdevice.h> #include <linux/skbuff.h>
@@ -165,6 +181,27 @@ static inline void ieee802154_devaddr_to_raw(void *raw, __le64 addr)memcpy (raw, &temp,IEEE802154_ADDR_LEN ); } +static inline int +ieee802154_sockaddr_check_size (struct sockaddr_ieee802154 *daddr,int len) +{ +struct ieee802154_addr_sa *sa; + + sa = &daddr->addr; +if (len <IEEE802154_MIN_NAMELEN ) +return -EINVAL ; +switch (sa->addr_type) { +case IEEE802154_ADDR_SHORT : +if (len <IEEE802154_NAMELEN_SHORT ) +return -EINVAL ; +break ; +case IEEE802154_ADDR_LONG : +if (len <IEEE802154_NAMELEN_LONG ) +return -EINVAL ; +break ; + } +return 0 ; +} +static inline void ieee802154_addr_from_sa (struct ieee802154_addr *a,const struct ieee802154_addr_sa *sa) {
net/ieee802154/socket.c +23 -19
78 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/48 net: marvell: prestera: add support for for Aldrin2
In reply to Greg Kroah-HartmanFrom: Oleksandr Mazur <[email protected]>
[ Upstream commit 9124dbcc2dd6c51e81f97f63f7807118c4eb140a ]
Aldrin2 (98DX8525) is a Marvell Prestera PP, with 100G support.
V2:
- retarget to net tree instead of net-next;
- fix missed colon in patch subject ('net marvell' vs 'net: mavell');
--- drivers/net/ethernet/marvell/prestera/prestera_pci.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/marvell/prestera/prestera_pci.c +1 -0
@@ -872,6 +872,7 @@ static void prestera_pci_remove(struct pci_dev *pdev)static const struct pci_device_id prestera_pci_devices[] = { {PCI_DEVICE (PCI_VENDOR_ID_MARVELL ,0xC804 ) }, {PCI_DEVICE (PCI_VENDOR_ID_MARVELL ,0xC80C ) }, + {PCI_DEVICE (PCI_VENDOR_ID_MARVELL ,0xCC1E ) }, { } };MODULE_DEVICE_TABLE (pci, prestera_pci_devices);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/48 ALSA: hda/hdmi: Fix the converter reuse for the silent stream
In reply to Greg Kroah-HartmanFrom: Jaroslav Kysela <[email protected]>
[ Upstream commit 5f80d6bd2b01de4cafac3302f58456bf860322fc ]
When the user space pcm stream uses the silent stream converter, it is no longer allocated for the silent stream. Clear the appropriate flag in the hdmi_pcm_open() function. The silent stream setup may be applied in hdmi_pcm_close() (and the error path - open fcn) again.
If the flag is not cleared, the reuse conditions for the silent stream converter in hdmi_choose_cvt() may improperly share this converter.
--- sound/pci/hda/patch_hdmi.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_hdmi.c +1 -0
@@ -1278,6 +1278,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo,set_bit (pcm_idx, &spec->pcm_in_use); per_pin =get_pin (spec, pin_idx); per_pin->cvt_nid = per_cvt->cvt_nid; + per_pin->silent_stream = false; hinfo->nid = per_cvt->cvt_nid;/* flip stripe flag for the assigned stream if supported */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/48 um: Cleanup syscall_handler_t cast in syscalls_32.h
In reply to Greg Kroah-HartmanFrom: Lukas Straub <[email protected]>
[ Upstream commit 61670b4d270c71219def1fbc9441debc2ac2e6e9 ]
Like in f4f03f299a56ce4d73c5431e0327b3b6cb55ebb9 "um: Cleanup syscall_handler_t definition/cast, fix warning", remove the cast to to fix the compiler warning.
--- arch/x86/um/shared/sysdep/syscalls_32.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/x86/um/shared/sysdep/syscalls_32.h +2 -3
@@ -6,10 +6,9 @@#include <asm/unistd.h> #include <sysdep/ptrace.h> -typedef long syscall_handler_t (struct pt_regs ); +typedef long syscall_handler_t (struct syscall_args );extern syscall_handler_t *sys_call_table[];#define EXECUTE_SYSCALL (syscall, regs) \ - ((long (*)(struct syscall_args)) \ - (*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs)) + ((*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/48 um: Cleanup compiler warning in arch/x86/um/tls_32.c
In reply to Greg Kroah-HartmanFrom: Lukas Straub <[email protected]>
[ Upstream commit d27fff3499671dc23a08efd01cdb8b3764a391c4 ]
arch.tls_array is statically allocated so checking for NULL doesn't make sense. This causes the compiler warning below.
Remove the checks to silence these warnings.
../arch/x86/um/tls_32.c: In function 'get_free_idx':../arch/x86/um/tls_32.c:68:13: warning: the comparison will always evaluate as 'true' for the address of 'tls_array' will never be NULL [-Waddress]
68 | if (!t->arch.tls_array)
| ^
In file included from ../arch/x86/um/asm/processor.h:10,
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 ../arch/x86/um/tls_32.c:7:../arch/x86/um/asm/processor_32.h:22:31: note: 'tls_array' declared here
22 | struct uml_tls_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
| ^~~~~~~~~../arch/x86/um/tls_32.c: In function 'get_tls_entry':../arch/x86/um/tls_32.c:243:13: warning: the comparison will always evaluate as 'true' for the address of 'tls_array' will never be NULL [-Waddress]
243 | if (!t->arch.tls_array)
| ^../arch/x86/um/asm/processor_32.h:22:31: note: 'tls_array' declared here
22 | struct uml_tls_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
| ^~~~~~~~~
--- arch/x86/um/tls_32.c | 6 ------ 1 file changed, 6 deletions(-)
arch/x86/um/tls_32.c +0 -6
@@ -65,9 +65,6 @@ static int get_free_idx(struct task_struct* task)struct thread_struct *t = &task->thread;int idx; -if (!t->arch.tls_array) -return GDT_ENTRY_TLS_MIN ; -for (idx =0 ; idx <GDT_ENTRY_TLS_ENTRIES ; idx++)if (!t->arch.tls_array[idx].present)return idx +GDT_ENTRY_TLS_MIN ;
@@ -240,9 +237,6 @@ static int get_tls_entry(struct task_struct *task, struct user_desc *info, {struct thread_struct *t = &task->thread; -if (!t->arch.tls_array) - goto clear; -if (idx <GDT_ENTRY_TLS_MIN || idx >GDT_ENTRY_TLS_MAX )return -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 25/48 gpio: ftgpio010: Make irqchip immutable
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit ab637d48363d7b8ee67ae089808a8bc6051d53c4 ]
This turns the FTGPIO010 irqchip immutable.
Tested on the D-Link DIR-685.
--- drivers/gpio/gpio-ftgpio010.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
drivers/gpio/gpio-ftgpio010.c +13 -9
@@ -41,14 +41,12 @@* struct ftgpio_gpio - Gemini GPIO state container * @dev: containing device for this instance * @gc: gpiochip for this instance -* @irq: irqchip for this instance * @base: remapped I/O-memory base * @clk: silicon clock */ struct ftgpio_gpio {struct device *dev;struct gpio_chip gc; -struct irq_chip irq;void __iomem *base;struct clk *clk; };
@@ -70,6 +68,7 @@ static void ftgpio_gpio_mask_irq(struct irq_data *d) val =readl (g->base +GPIO_INT_EN ); val &= ~BIT (irqd_to_hwirq (d));writel (val, g->base +GPIO_INT_EN ); +gpiochip_disable_irq (gc,irqd_to_hwirq (d)); }static void ftgpio_gpio_unmask_irq (struct irq_data *d)
@@ -78,6 +77,7 @@ static void ftgpio_gpio_unmask_irq(struct irq_data *d)struct ftgpio_gpio *g =gpiochip_get_data (gc);u32 val; +gpiochip_enable_irq (gc,irqd_to_hwirq (d)); val =readl (g->base +GPIO_INT_EN ); val |=BIT (irqd_to_hwirq (d));writel (val, g->base +GPIO_INT_EN );
@@ -221,6 +221,16 @@ static int ftgpio_gpio_set_config(struct gpio_chip *gc, unsigned int offset,return 0 ; } +static const struct irq_chip ftgpio_irq_chip = { + .name ="FTGPIO010" , + .irq_ack = ftgpio_gpio_ack_irq, + .irq_mask = ftgpio_gpio_mask_irq, + .irq_unmask = ftgpio_gpio_unmask_irq, + .irq_set_type = ftgpio_gpio_set_irq_type, + .flags =IRQCHIP_IMMUTABLE , +GPIOCHIP_IRQ_RESOURCE_HELPERS , +}; +static int ftgpio_gpio_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;
@@ -277,14 +287,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)if (!IS_ERR (g->clk)) g->gc.set_config = ftgpio_gpio_set_config; - g->irq.name ="FTGPIO010" ; - g->irq.irq_ack = ftgpio_gpio_ack_irq; - g->irq.irq_mask = ftgpio_gpio_mask_irq; - g->irq.irq_unmask = ftgpio_gpio_unmask_irq; - g->irq.irq_set_type = ftgpio_gpio_set_irq_type; - girq = &g->gc.irq; - girq->chip = &g->irq; +gpio_irq_chip_set_chip (girq, &ftgpio_irq_chip); girq->parent_handler = ftgpio_gpio_irq_handler; girq->num_parents =1 ; girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 26/48 arch: um: Mark the stack non-executable to fix a binutils warning
In reply to Greg Kroah-HartmanFrom: David Gow <[email protected]>
[ Upstream commit bd71558d585ac61cfd799db7f25e78dca404dd7a ]
Since binutils 2.39, ld will print a warning if any stack section is executable, which is the default for stack sections on files without a .note.GNU-stack section.
This was fixed for x86 in commit ffcf9c5700e4 ("x86: link vdso and boot with -z noexecstack --no-warn-rwx-segments"), but remained broken for UML, resulting in several warnings:
/usr/bin/ld: warning: arch/x86/um/vdso/vdso.o: missing .note.GNU-stack section implies executable stack /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker /usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions
Link both the VDSO and vmlinux with -z noexecstack, fixing the warnings about .note.GNU-stack sections. In addition, pass --no-warn-rwx-segments to dodge the remaining warnings about LOAD segments with RWX permissions in the kallsyms objects. (Note that this flag is apparently not available on lld, so hide it behind a test for BFD, which is what the x86 patch does.)
--- arch/um/Makefile | 8 ++++++++ arch/x86/um/vdso/Makefile | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)
arch/um/Makefile +8 -0
@@ -132,10 +132,18 @@ export LDS_ELF_FORMAT := $(ELF_FORMAT) # The wrappers will select whether using "malloc" or the kernel allocator. LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc +# Avoid binutils 2.39+ warnings by marking the stack non-executable and +# ignorning warnings for the kallsyms sections. +LDFLAGS_EXECSTACK = -z noexecstack +ifeq ($(CONFIG_LD_IS_BFD),y) +LDFLAGS_EXECSTACK += $(call ld-option,--no-warn-rwx-segments) +endif + LD_FLAGS_CMDLINE = $(foreach opt,$(KBUILD_LDFLAGS),-Wl,$(opt)) # Used by link-vmlinux.sh which has special support for um link export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE) +export LDFLAGS_vmlinux := $(LDFLAGS_EXECSTACK) # When cleaning we don't include .config, so we don't include # TT or skas makefiles and don't clean skas_ptregs.h.
arch/x86/um/vdso/Makefile +1 -1
@@ -62,7 +62,7 @@ quiet_cmd_vdso = VDSO $@ -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) && \ sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@' -VDSO_LDFLAGS = -fPIC -shared -Wl,--hash-style=sysv +VDSO_LDFLAGS = -fPIC -shared -Wl,--hash-style=sysv -z noexecstack GCOV_PROFILE := n #
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 27/48 net: atlantic: fix potential memory leak in aq_ndev_close()
In reply to Greg Kroah-HartmanFrom: Jianglei Nie <[email protected]>
[ Upstream commit 65e5d27df61283e5390f04b09dc79cd832f95607 ]
If aq_nic_stop() fails, aq_ndev_close() returns err without calling aq_nic_deinit() to release the relevant memory and resource, which will lead to a memory leak.
We can fix it by deleting the if condition judgment and goto statement to call aq_nic_deinit() directly after aq_nic_stop() to fix the memory leak.
--- drivers/net/ethernet/aquantia/atlantic/aq_main.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/ethernet/aquantia/atlantic/aq_main.c +0 -3
@@ -94,11 +94,8 @@ static int aq_ndev_close(struct net_device *ndev)int err =0 ; err =aq_nic_stop (aq_nic); -if (err <0 ) - goto err_exit;aq_nic_deinit (aq_nic, true); -err_exit:return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 28/48 KVM: s390: Pass initialized arg even if unused
In reply to Greg Kroah-HartmanFrom: Janis Schoetterl-Glausch <[email protected]>
[ Upstream commit b3cefd6bf16e7234ffbd4209f6083060f4e35f59 ]
This silences smatch warnings reported by kbuild bot:arch/s390/kvm/gaccess.c:859 guest_range_to_gpas() error: uninitialized symbol 'prot'. arch/s390/kvm/gaccess.c:1064 access_guest_with_key() error: uninitialized symbol 'prot'.
This is because it cannot tell that the value is not used in this case. The trans_exc* only examine prot if code is PGM_PROTECTION. Pass a dummy value for other codes.
--- arch/s390/kvm/gaccess.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
arch/s390/kvm/gaccess.c +13 -3
@@ -489,6 +489,8 @@ enum prot_type {PROT_TYPE_ALC =2 ,PROT_TYPE_DAT =3 ,PROT_TYPE_IEP =4 , +/* Dummy value for passing an initialized value when code != PGM_PROTECTION */ + PROT_NONE, }; static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, u8 ar,
@@ -504,6 +506,10 @@ static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva,switch (code) {case PGM_PROTECTION :switch (prot) { +case PROT_NONE : +/* We should never get here, acts like termination */ +WARN_ON_ONCE (1 ); +break ;case PROT_TYPE_IEP : tec->b61 =1 ; fallthrough;
@@ -968,8 +974,10 @@ static int guest_range_to_gpas(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar,return rc; }else { gpa =kvm_s390_real_to_abs (vcpu, ga); -if (kvm_is_error_gpa (vcpu->kvm, gpa)) +if (kvm_is_error_gpa (vcpu->kvm, gpa)) { rc =PGM_ADDRESSING ; + prot =PROT_NONE ; + } }if (rc)return trans_exc (vcpu, rc, ga, ar, mode, prot);
@@ -1112,8 +1120,6 @@ int access_guest_with_key(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar,if (rc ==PGM_PROTECTION && try_storage_prot_override) rc =access_guest_page_with_key (vcpu->kvm, mode, gpas[idx], data, fragment_len,PAGE_SPO_ACC ); -if (rc ==PGM_PROTECTION ) - prot =PROT_TYPE_KEYC ;if (rc)break ; len -= fragment_len;
@@ -1123,6 +1129,10 @@ int access_guest_with_key(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar,if (rc >0 ) {bool terminate = (mode ==GACC_STORE ) && (idx >0 ); +if (rc ==PGM_PROTECTION ) + prot =PROT_TYPE_KEYC ; +else + prot =PROT_NONE ; rc =trans_exc_ending (vcpu, rc, ga, ar, mode, prot, terminate); } out_unlock:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 29/48 drm/amd/display: Fix double cursor on non-video RGB MPO
In reply to Greg Kroah-HartmanFrom: Leo Li <[email protected]>
[ Upstream commit b261509952bc19d1012cf732f853659be6ebc61e ]
[Why]
DC makes use of layer_index (zpos) when picking the HW plane to enable HW cursor on. However, some compositors will not attach zpos information to each DRM plane. Consequently, in amdgpu, we default layer_index to 0 and do not update it.
This causes said DC logic to enable HW cursor on all planes of the same layer_index, which manifests as a double cursor issue if one of the planes is scaled (and hence scaling the cursor as well).
[How]
Use DRM core helpers to calculate a normalized_zpos value for each drm_plane_state under each crtc, within the atomic state.
This helper will first consider existing zpos values, and if identical/unset, fallback to plane ID ordering.
The normalized_zpos is then passed to dc_plane_info during atomic check for later use by the cursor logic.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +10 -2
@@ -5629,7 +5629,7 @@ fill_dc_plane_info_and_addr(struct amdgpu_device *adev, plane_info->visible = true; plane_info->stereo_format =PLANE_STEREO_FORMAT_NONE ; - plane_info->layer_index =0 ; + plane_info->layer_index = plane_state->normalized_zpos; ret =fill_plane_color_attributes (plane_state, plane_info->format, &plane_info->color_space);
@@ -5697,7 +5697,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, dc_plane_state->global_alpha = plane_info.global_alpha; dc_plane_state->global_alpha_value = plane_info.global_alpha_value; dc_plane_state->dcc = plane_info.dcc; - dc_plane_state->layer_index = plane_info.layer_index;// Always returns 0 + dc_plane_state->layer_index = plane_info.layer_index; dc_plane_state->flip_int_enabled = true;/*
@@ -11147,6 +11147,14 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, } } +/* +* DC consults the zpos (layer_index in DC terminology) to determine the +* hw plane on which to enable the hw cursor (see +* `dcn10_can_pipe_disable_cursor`). By now, all modified planes are in +* atomic state, so call drm helper to normalize zpos. +*/ +drm_atomic_normalize_zpos (dev, state); +/* Remove exiting planes if they are modified */ for_each_oldnew_plane_in_state_reverse (state, plane, old_plane_state, new_plane_state, i) { ret = dm_update_plane_state(dc, state, plane,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 30/48 drm/amd/display: Assume an LTTPR is always present on fixed_vs links
In reply to Greg Kroah-HartmanFrom: Michael Strauss <[email protected]>
[ Upstream commit 29956d0fded036a570bd8e7d4ea4b1a1730307d2 ]
[WHY]
LTTPRs can in very rare instsances fail to increment DPCD LTTPR count. This results in aux-i LTTPR requests to be sent to the wrong DPCD address, which causes link training failure.
[HOW]
Override internal repeater count if fixed_vs flag is set for a given link
--- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +8 -0
@@ -5211,6 +5211,14 @@ bool dp_retrieve_lttpr_cap(struct dc_link *link) lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ]; +/* If this chip cap is set, at least one retimer must exist in the chain +* Override count to 1 if we receive a known bad count (0 or an invalid value) */ +if (link->chip_caps &EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN && + (dp_convert_to_count (link->dpcd_caps.lttpr_caps.phy_repeater_cnt) ==0 )) { +ASSERT (0 ); + link->dpcd_caps.lttpr_caps.phy_repeater_cnt =0x80 ; + } +/* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */ is_lttpr_present = (link->dpcd_caps.lttpr_caps.max_lane_count > 0 && link->dpcd_caps.lttpr_caps.max_lane_count <= 4 &&
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 31/48 drm/amd/display: update gamut remap if plane has changed
In reply to Greg Kroah-HartmanFrom: Hugo Hu <[email protected]>
[ Upstream commit 52bb21499cf54fa65b56d97cd0d68579c90207dd ]
[Why]
The desktop plane and full-screen game plane may have different gamut remap coefficients, if switching between desktop and full-screen game without updating the gamut remap will cause incorrect color.
[How]
Update gamut remap if planes change.
--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +1 -0
@@ -1520,6 +1520,7 @@ static void dcn20_update_dchubp_dpp(/* Any updates are handled in dc interface, just need * to apply existing for plane enable / opp change */ if (pipe_ctx->update_flags.bits.enable || pipe_ctx->update_flags.bits.opp_changed + || pipe_ctx->update_flags.bits.plane_changed || pipe_ctx->stream->update_flags.bits.gamut_remap || pipe_ctx->stream->update_flags.bits.out_csc) {/* dpp/cm gamut remap*/
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/48 drm/amd/display: skip audio setup when audio stream is enabled
In reply to Greg Kroah-HartmanFrom: zhikzhai <[email protected]>
[ Upstream commit 65fbfb02c2734cacffec5e3f492e1b4f1dabcf98 ]
[why]
We have minimal pipe split transition method to avoid pipe allocation outage.However, this method will invoke audio setup which cause audio output stuck once pipe reallocate.
[how]
skip audio setup for pipelines which audio stream has been enabled
--- drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +4 -2
@@ -2165,7 +2165,8 @@ static void dce110_setup_audio_dto(continue ;if (pipe_ctx->stream->signal !=SIGNAL_TYPE_HDMI_TYPE_A )continue ; -if (pipe_ctx->stream_res.audio !=NULL ) { +if (pipe_ctx->stream_res.audio !=NULL && + pipe_ctx->stream_res.audio->enabled == false) {struct audio_output audio_output;build_audio_output (context, pipe_ctx, &audio_output);
@@ -2207,7 +2208,8 @@ static void dce110_setup_audio_dto(if (!dc_is_dp_signal (pipe_ctx->stream->signal))continue ; -if (pipe_ctx->stream_res.audio !=NULL ) { +if (pipe_ctx->stream_res.audio !=NULL && + pipe_ctx->stream_res.audio->enabled == false) {struct audio_output audio_output;build_audio_output (context, pipe_ctx, &audio_output);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/48 drm/amd/display: Fix DP MST timeslot issue when fallback happened
In reply to Greg Kroah-HartmanFrom: Cruise Hung <[email protected]>
[ Upstream commit 20c6168b3c8aadef7d2853c925d99eb546bd5e1c ]
[Why]
When USB4 DP link training failed and fell back to lower link rate, the time slot calculation uses the verified_link_cap. And the verified_link_cap was not updated to the new one. It caused the wrong VC payload time-slot was allocated.
[How]
Updated verified_link_cap with the new one from cur_link_settings after the LT completes successfully.
--- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +7 -1
@@ -2857,8 +2857,14 @@ bool perform_link_training_with_retries( skip_video_pattern);/* Transmit idle pattern once training successful. */ -if (status ==LINK_TRAINING_SUCCESS && !is_link_bw_low) +if (status ==LINK_TRAINING_SUCCESS && !is_link_bw_low) {dp_set_hw_test_pattern (link, &pipe_ctx->link_res,DP_TEST_PATTERN_VIDEO_MODE ,NULL ,0 ); +/* Update verified link settings to current one +* Because DPIA LT might fallback to lower link setting. +*/ + link->verified_link_cap.link_rate = link->cur_link_settings.link_rate; + link->verified_link_cap.lane_count = link->cur_link_settings.lane_count; + } }else { status = dc_link_dp_perform_link_training(link, &pipe_ctx->link_res,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/48 drm/amd/display: increase dcn315 pstate change latency
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit dcc2527df918edfe297c5074ccc1f05eae361ca6 ]
[Why & How]
Update after new measurment came in
--- .../dc/clk_mgr/dcn315/dcn315_clk_mgr.c | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +14 -8
@@ -46,6 +46,9 @@#define TO_CLK_MGR_DCN315 (clk_mgr)\ container_of(clk_mgr, struct clk_mgr_dcn315, base) +#define UNSUPPORTED_DCFCLK 10000000 +#define MIN_DPP_DISP_CLK 100000 +static int dcn315_get_active_display_cnt_wa (struct dc *dc,struct dc_state *context)
@@ -146,6 +149,9 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base, } } +/* Lock pstate by requesting unsupported dcfclk if change is unsupported */ +if (!new_clocks->p_state_change_support) + new_clocks->dcfclk_khz =UNSUPPORTED_DCFCLK ;if (should_set_clock (safe_to_lower, new_clocks->dcfclk_khz, clk_mgr_base->clks.dcfclk_khz)) { clk_mgr_base->clks.dcfclk_khz = new_clocks->dcfclk_khz;dcn315_smu_set_hard_min_dcfclk (clk_mgr, clk_mgr_base->clks.dcfclk_khz);
@@ -159,10 +165,10 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. if (!IS_DIAG_DC (dc->ctx->dce_environment)) { -if (new_clocks->dppclk_khz <100000 ) - new_clocks->dppclk_khz =100000 ; -if (new_clocks->dispclk_khz <100000 ) - new_clocks->dispclk_khz =100000 ; +if (new_clocks->dppclk_khz <MIN_DPP_DISP_CLK ) + new_clocks->dppclk_khz =MIN_DPP_DISP_CLK ; +if (new_clocks->dispclk_khz <MIN_DPP_DISP_CLK ) + new_clocks->dispclk_khz =MIN_DPP_DISP_CLK ; }if (should_set_clock (safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {
@@ -272,7 +278,7 @@ static struct wm_table ddr5_wm_table = { { .wm_inst = WM_A, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 64.0, + .pstate_latency_us = 129.0, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true,
@@ -280,7 +286,7 @@ static struct wm_table ddr5_wm_table = { { .wm_inst = WM_B, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 64.0, + .pstate_latency_us = 129.0, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true,
@@ -288,7 +294,7 @@ static struct wm_table ddr5_wm_table = { { .wm_inst = WM_C, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 64.0, + .pstate_latency_us = 129.0, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true,
@@ -296,7 +302,7 @@ static struct wm_table ddr5_wm_table = { { .wm_inst = WM_D, .wm_type = WM_TYPE_PSTATE_CHG, - .pstate_latency_us = 64.0, + .pstate_latency_us = 129.0, .sr_exit_time_us = 11.5, .sr_enter_plus_exit_time_us = 14.5, .valid = true,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/48 perf/x86/intel: Fix unchecked MSR access error for Alder Lake N
In reply to Greg Kroah-HartmanFrom: Kan Liang <[email protected]>
[ Upstream commit 24919fdea6f8b31d7cdf32ac291bc5dd0b023878 ]
For some Alder Lake N machine, the below unchecked MSR access error may be triggered.
[ 0.088017] rcu: Hierarchical SRCU implementation. [ 0.088017] unchecked MSR access error: WRMSR to 0x38f (tried to write 0x0001000f0000003f) at rIP: 0xffffffffb5684de8 (native_write_msr+0x8/0x30) [ 0.088017] Call Trace: [ 0.088017] <TASK> [ 0.088017] __intel_pmu_enable_all.constprop.46+0x4a/0xa0
The Alder Lake N only has e-cores. The X86_FEATURE_HYBRID_CPU flag is not set. The perf cannot retrieve the correct CPU type via get_this_hybrid_cpu_type(). The model specific get_hybrid_cpu_type() is hardcode to p-core. The wrong CPU type is given to the PMU of the Alder Lake N.
Since Alder Lake N isn't in fact a hybrid CPU, remove ALDERLAKE_N from the rest of {ALDER,RAPTOP}LAKE and create a non-hybrid PMU setup.
The differences between Gracemont and the previous Tremont are,
- Number of GP counters
- Load and store latency Events
- PEBS event_constraints
- Instruction Latency support
- Data source encoding
- Memory access latency encoding
--- arch/x86/events/intel/core.c | 40 +++++++++++++++++++++++++++++++++++- arch/x86/events/intel/ds.c | 9 ++++++-- arch/x86/events/perf_event.h | 2 ++ 3 files changed, 48 insertions(+), 3 deletions(-)
arch/x86/events/intel/core.c +39 -1
@@ -2101,6 +2101,15 @@ static struct extra_reg intel_tnt_extra_regs[] __read_mostly = {EVENT_EXTRA_END }; +EVENT_ATTR_STR (mem-loads, mem_ld_grt,"event=0xd0,umask=0x5,ldlat=3" ); +EVENT_ATTR_STR (mem-stores, mem_st_grt,"event=0xd0,umask=0x6" ); + +static struct attribute *grt_mem_attrs[] = { +EVENT_PTR (mem_ld_grt), +EVENT_PTR (mem_st_grt), +NULL +}; +static struct extra_reg intel_grt_extra_regs[]__read_mostly = {/* must define OFFCORE_RSP_X first, see intel_fixup_er() */ INTEL_UEVENT_EXTRA_REG (0x01b7 ,MSR_OFFCORE_RSP_0 ,0x3fffffffffull ,RSP_0 ),
@@ -5874,6 +5883,36 @@ __init int intel_pmu_init(void) name ="Tremont" ;break ; +case INTEL_FAM6_ALDERLAKE_N : + x86_pmu.mid_ack = true; +memcpy (hw_cache_event_ids, glp_hw_cache_event_ids, +sizeof (hw_cache_event_ids)); +memcpy (hw_cache_extra_regs, tnt_hw_cache_extra_regs, +sizeof (hw_cache_extra_regs)); + hw_cache_event_ids[C (ITLB )][C (OP_READ )][C (RESULT_ACCESS )] =-1 ; + + x86_pmu.event_constraints = intel_slm_event_constraints; + x86_pmu.pebs_constraints = intel_grt_pebs_event_constraints; + x86_pmu.extra_regs = intel_grt_extra_regs; + + x86_pmu.pebs_aliases =NULL ; + x86_pmu.pebs_prec_dist = true; + x86_pmu.pebs_block = true; + x86_pmu.lbr_pt_coexist = true; + x86_pmu.flags |=PMU_FL_HAS_RSP_1 ; + x86_pmu.flags |=PMU_FL_INSTR_LATENCY ; + +intel_pmu_pebs_data_source_grt (); + x86_pmu.pebs_latency_data = adl_latency_data_small; + x86_pmu.get_event_constraints = tnt_get_event_constraints; + x86_pmu.limit_period = spr_limit_period; + td_attr = tnt_events_attrs; + mem_attr = grt_mem_attrs; + extra_attr = nhm_format_attr; +pr_cont ("Gracemont events, " ); + name ="gracemont" ; +break ; +case INTEL_FAM6_WESTMERE :case INTEL_FAM6_WESTMERE_EP :case INTEL_FAM6_WESTMERE_EX :
@@ -6216,7 +6255,6 @@ __init int intel_pmu_init(void)case INTEL_FAM6_ALDERLAKE :case INTEL_FAM6_ALDERLAKE_L : -case INTEL_FAM6_ALDERLAKE_N :case INTEL_FAM6_RAPTORLAKE :case INTEL_FAM6_RAPTORLAKE_P :/*
arch/x86/events/intel/ds.c +7 -2
@@ -110,13 +110,18 @@ void __init intel_pmu_pebs_data_source_skl(bool pmem)__intel_pmu_pebs_data_source_skl (pmem, pebs_data_source); } -static void __init intel_pmu_pebs_data_source_grt (u64 *data_source) +static void __init __intel_pmu_pebs_data_source_grt (u64 *data_source) { data_source[0x05 ] =OP_LH |P (LVL ,L3 ) |LEVEL (L3 ) |P (SNOOP ,HIT ); data_source[0x06 ] =OP_LH |P (LVL ,L3 ) |LEVEL (L3 ) |P (SNOOP ,HITM ); data_source[0x08 ] =OP_LH |P (LVL ,L3 ) |LEVEL (L3 ) |P (SNOOPX ,FWD ); } +void __init intel_pmu_pebs_data_source_grt (void ) +{ +__intel_pmu_pebs_data_source_grt (pebs_data_source); +} +void __init intel_pmu_pebs_data_source_adl (void ) {u64 *data_source;
@@ -127,7 +132,7 @@ void __init intel_pmu_pebs_data_source_adl(void) data_source = x86_pmu.hybrid_pmu[X86_HYBRID_PMU_ATOM_IDX ].pebs_data_source;memcpy (data_source, pebs_data_source,sizeof (pebs_data_source)); -intel_pmu_pebs_data_source_grt (data_source); +__intel_pmu_pebs_data_source_grt (data_source); }static u64 precise_store_data (u64 status)
arch/x86/events/perf_event.h +2 -0
@@ -1513,6 +1513,8 @@ void intel_pmu_pebs_data_source_skl(bool pmem);void intel_pmu_pebs_data_source_adl (void ); +void intel_pmu_pebs_data_source_grt (void ); +int intel_pmu_setup_lbr_filter (struct perf_event *event);void intel_pt_interrupt (void );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/48 dont use __kernel_write() on kmap_local_page()
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
[ Upstream commit 06bbaa6dc53cb72040db952053432541acb9adc7 ]
passing kmap_local_page() result to __kernel_write() is unsafe - random ->write_iter() might (and 9p one does) get unhappy when passed ITER_KVEC with pointer that came from kmap_local_page().
Fix by providing a variant of __kernel_write() that takes an iov_iter from caller (__kernel_write() becomes a trivial wrapper) and adding dump_emit_page() that parallels dump_emit(), except that instead of __kernel_write() it uses __kernel_write_iter() with ITER_BVEC source.
--- fs/coredump.c | 38 +++++++++++++++++++++++++++++++++----- fs/internal.h | 3 +++ fs/read_write.c | 22 ++++++++++++++-------- 3 files changed, 50 insertions(+), 13 deletions(-)
fs/coredump.c +33 -5
@@ -832,6 +832,38 @@ static int __dump_skip(struct coredump_params *cprm, size_t nr) } } +static int dump_emit_page (struct coredump_params *cprm,struct page *page) +{ +struct bio_vec bvec = { + .bv_page = page, + .bv_offset =0 , + .bv_len =PAGE_SIZE , + }; +struct iov_iter iter; +struct file *file = cprm->file; +loff_t pos = file->f_pos; +ssize_t n; + +if (cprm->to_skip) { +if (!__dump_skip (cprm, cprm->to_skip)) +return 0 ; + cprm->to_skip =0 ; + } +if (cprm->written +PAGE_SIZE > cprm->limit) +return 0 ; +if (dump_interrupted ()) +return 0 ; +iov_iter_bvec (&iter,WRITE , &bvec,1 ,PAGE_SIZE ); + n =__kernel_write_iter (cprm->file, &iter, &pos); +if (n !=PAGE_SIZE ) +return 0 ; + file->f_pos = pos; + cprm->written +=PAGE_SIZE ; + cprm->pos +=PAGE_SIZE ; + +return 1 ; +} +int dump_emit (struct coredump_params *cprm,const void *addr,int nr) {if (cprm->to_skip) {
@@ -863,7 +895,6 @@ int dump_user_range(struct coredump_params *cprm, unsigned long start,for (addr = start; addr < start + len; addr +=PAGE_SIZE ) {struct page *page; -int stop;/* * To avoid having to allocate page tables for virtual address
@@ -874,10 +905,7 @@ int dump_user_range(struct coredump_params *cprm, unsigned long start,*/ page =get_dump_page (addr);if (page) { -void *kaddr =kmap_local_page (page); - - stop = !dump_emit (cprm, kaddr,PAGE_SIZE ); -kunmap_local (kaddr); +int stop = !dump_emit_page (cprm, page);put_page (page);if (stop)return 0 ;
fs/internal.h +3 -0
@@ -16,6 +16,7 @@ struct shrink_control;struct fs_context ;struct user_namespace ;struct pipe_inode_info ; +struct iov_iter ;/* * block/bdev.c
@@ -221,3 +222,5 @@ ssize_t do_getxattr(struct user_namespace *mnt_userns,int setxattr_copy (const char __user *name,struct xattr_ctx *ctx);int do_setxattr (struct user_namespace *mnt_userns,struct dentry *dentry,struct xattr_ctx *ctx); + +ssize_t __kernel_write_iter (struct file *file,struct iov_iter *from,loff_t *pos);
fs/read_write.c +14 -8
@@ -509,14 +509,9 @@ static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t }/* caller is responsible for file_start_write/file_end_write */ -ssize_t __kernel_write (struct file *file,const void *buf,size_t count,loff_t *pos) +ssize_t __kernel_write_iter (struct file *file,struct iov_iter *from,loff_t *pos) { -struct kvec iov = { - .iov_base = (void *)buf, - .iov_len =min_t (size_t, count,MAX_RW_COUNT ), - };struct kiocb kiocb; -struct iov_iter iter;ssize_t ret;if (WARN_ON_ONCE (!(file->f_mode &FMODE_WRITE )))
@@ -532,8 +527,7 @@ ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_tinit_sync_kiocb (&kiocb, file); kiocb.ki_pos = pos ? *pos :0 ; -iov_iter_kvec (&iter,WRITE , &iov,1 , iov.iov_len); - ret = file->f_op->write_iter (&kiocb, &iter); + ret = file->f_op->write_iter (&kiocb, from);if (ret >0 ) {if (pos) *pos = kiocb.ki_pos;
@@ -543,6 +537,18 @@ ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_tinc_syscw (current);return ret; } + +/* caller is responsible for file_start_write/file_end_write */ +ssize_t __kernel_write (struct file *file,const void *buf,size_t count,loff_t *pos) +{ +struct kvec iov = { + .iov_base = (void *)buf, + .iov_len =min_t (size_t, count,MAX_RW_COUNT ), + }; +struct iov_iter iter; +iov_iter_kvec (&iter,WRITE , &iov,1 , iov.iov_len); +return __kernel_write_iter (file, &iter, pos); +}/* * This "EXPORT_SYMBOL_GPL()" is more of a "EXPORT_SYMBOL_DONTUSE()", * but autofs is one of the few internal kernel users that actually
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/48 i2c: davinci: fix PM disable depth imbalance in davinci_i2c_probe
In reply to Greg Kroah-HartmanFrom: Zhang Qilong <[email protected]>
[ Upstream commit e2062df704dea47efe16edcaa2316d7b5ecca64f ]
The pm_runtime_enable will increase power disable depth. Thus a pairing decrement is needed on the error handling path to keep it balanced according to context.
--- drivers/i2c/busses/i2c-davinci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-davinci.c +2 -1
@@ -823,7 +823,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) r =pm_runtime_resume_and_get (dev->dev);if (r <0 ) {dev_err (dev->dev,"failed to runtime_get device: %d\n" , r); -return r; + goto err_pm; }i2c_davinci_init (dev);
@@ -882,6 +882,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) err_unuse_clocks:pm_runtime_dont_use_autosuspend (dev->dev);pm_runtime_put_sync (dev->dev); +err_pm:pm_runtime_disable (dev->dev);return r;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/48 usb: mon: make mmapped memory read only
In reply to Greg Kroah-HartmanFrom: Tadeusz Struk <[email protected]>
commit a659daf63d16aa883be42f3f34ff84235c302198 upstream.
Syzbot found an issue in usbmon module, where the user space client can corrupt the monitor's internal memory, causing the usbmon module to crash the kernel with segfault, UAF, etc.
The reproducer mmaps the /dev/usbmon memory to user space, and overwrites it with arbitrary data, which causes all kinds of issues.
Return an -EPERM error from mon_bin_mmap() if the flag VM_WRTIE is set. Also clear VM_MAYWRITE to make it impossible to change it to writable later.
--- drivers/usb/mon/mon_bin.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/mon/mon_bin.c +5 -0
@@ -1268,6 +1268,11 @@ static int mon_bin_mmap(struct file *fil {/* don't do anything here: "fault" will set up page table entries */ vma->vm_ops = &mon_bin_vm_ops; + +if (vma->vm_flags &VM_WRITE ) +return -EPERM ; + + vma->vm_flags &= ~VM_MAYWRITE ; vma->vm_flags |=VM_DONTEXPAND |VM_DONTDUMP ; vma->vm_private_data = filp->private_data;mon_bin_vma_open (vma);
Greg Kroah-Hartman
maintainerPATCH 39/48 USB: serial: ftdi_sio: fix 300 bps rate for SIO
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 7bd7ad3c310cd6766f170927381eea0aa6f46c69 upstream.
The 300 bps rate of SIO devices has been mapped to 9600 bps since 2003... Let's fix the regression.
--- drivers/usb/serial/ftdi_sio.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/serial/ftdi_sio.c +1 -2
@@ -1319,8 +1319,7 @@ static u32 get_ftdi_divisor(struct tty_scase 38400 : div_value = ftdi_sio_b38400;break ;case 57600 : div_value = ftdi_sio_b57600;break ;case 115200 : div_value = ftdi_sio_b115200;break ; - }/* baud */ -if (div_value ==0 ) { +default :dev_dbg (dev,"%s - Baudrate (%d) requested is not supported\n" , __func__, baud); div_value = ftdi_sio_b9600;
Greg Kroah-Hartman
maintainerPATCH 40/48 gpiolib: acpi: Add support to ignore programming an interrupt
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit 6b6af7bd5718f4e45a9b930533aec1158387d552 upstream.
gpiolib-acpi already had support for ignoring a pin for wakeup, but if an OEM configures a floating pin as an interrupt source then stopping it from being a wakeup won't do much good to stop the interrupt storm.
Add support for a module parameter and quirk infrastructure to ignore interrupts as well.
--- drivers/gpio/gpiolib-acpi.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
drivers/gpio/gpiolib-acpi.c +20 -4
@@ -32,9 +32,16 @@ MODULE_PARM_DESC(ignore_wake,"controller@pin combos on which to ignore the ACPI wake flag " "ignore_wake=controller@pin[,controller@pin[,...]]"); +static char *ignore_interrupt; +module_param (ignore_interrupt, charp,0444 ); +MODULE_PARM_DESC (ignore_interrupt, +"controller@pin combos on which to ignore interrupt " +"ignore_interrupt=controller@pin[,controller@pin[,...]]" ); +struct acpi_gpiolib_dmi_quirk {bool no_edge_events_on_boot;char *ignore_wake; +char *ignore_interrupt; };/**
@@ -317,14 +324,15 @@ static struct gpio_desc *acpi_request_owreturn desc; } -static bool acpi_gpio_in_ignore_list (const char *controller_in,unsigned int pin_in) +static bool acpi_gpio_in_ignore_list (const char *ignore_list,const char *controller_in, +unsigned int pin_in) {const char *controller, *pin_str;unsigned int pin;char *endp;int len; - controller = ignore_wake; + controller = ignore_list;while (controller) { pin_str =strchr (controller,'@' );if (!pin_str)
@@ -348,7 +356,7 @@ static bool acpi_gpio_in_ignore_list(conreturn false; err: -pr_err_once ("Error: Invalid value for gpiolib_acpi.ignore_wake: %s\n" , ignore_wake); +pr_err_once ("Error: Invalid value for gpiolib_acpi.ignore_...: %s\n" , ignore_list);return false; }
@@ -360,7 +368,7 @@ static bool acpi_gpio_irq_is_wake(structif (agpio->wake_capable !=ACPI_WAKE_CAPABLE )return false; -if (acpi_gpio_in_ignore_list (dev_name (parent), pin)) { +if (acpi_gpio_in_ignore_list (ignore_wake,dev_name (parent), pin)) {dev_info (parent,"Ignoring wakeup on pin %u\n" , pin);return false; }
@@ -427,6 +435,11 @@ static acpi_status acpi_gpiochip_alloc_e goto fail_unlock_irq; } +if (acpi_gpio_in_ignore_list (ignore_interrupt,dev_name (chip->parent), pin)) { +dev_info (chip->parent,"Ignoring interrupt on pin %u\n" , pin); +return AE_OK ; + } + event =kzalloc (sizeof (*event),GFP_KERNEL );if (!event) goto fail_unlock_irq;
@@ -1582,6 +1595,9 @@ static int __init acpi_gpio_setup_paramsif (ignore_wake ==NULL && quirk && quirk->ignore_wake) ignore_wake = quirk->ignore_wake; +if (ignore_interrupt ==NULL && quirk && quirk->ignore_interrupt) + ignore_interrupt = quirk->ignore_interrupt; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 41/48 gpiolib: acpi: Add a quirk for Asus UM325UAZ
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit 0ea76c401f9245ac209f1b1ce03a7e1fb9de36e5 upstream.
Asus UM325UAZ has GPIO 18 programmed as both an interrupt and a wake source, but confirmed with internal team on this design this pin is floating and shouldn't have been programmed. This causes lots of spurious IRQs on the system and horrendous battery life.
Add a quirk to ignore attempts to program this pin on this system.
--- drivers/gpio/gpiolib-acpi.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/gpio/gpiolib-acpi.c +14 -0
@@ -1573,6 +1573,20 @@ static const struct dmi_system_id gpioli .ignore_wake = "INT33FF:01@0", }, }, + { + /* + * Interrupt storm caused from edge triggered floating pin + * Found in BIOS UX325UAZ.300 + * https://bugzilla.kernel.org/show_bug.cgi?id=216208 + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UAZ_UM325UAZ"), + }, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .ignore_interrupt = "AMDI0030:00@18", + }, + }, {} /* Terminating entry */ };
Greg Kroah-Hartman
maintainerPATCH 42/48 mmc: core: Replace with already defined values for readability
In reply to Greg Kroah-HartmanFrom: ChanWoo Lee <[email protected]>
commit e427266460826bea21b70f9b2bb29decfb2c2620 upstream.
SD_ROCR_S18A is already defined and is used to check the rocr value, so let's replace with already defined values for readability.
--- drivers/mmc/core/sd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/core/sd.c +1 -1
@@ -870,7 +870,7 @@ try_again:* the CCS bit is set as well. We deliberately deviate from the spec in * regards to this, which allows UHS-I to be supported for SDSC cards. */ -if (!mmc_host_is_spi (host) && rocr && (*rocr &0x01000000 )) { +if (!mmc_host_is_spi (host) && rocr && (*rocr &SD_ROCR_S18A )) { err =mmc_set_uhs_voltage (host, pocr);if (err == -EAGAIN ) { retries--;
Greg Kroah-Hartman
maintainerPATCH 43/48 mmc: core: Terminate infinite loop in SD-UHS voltage switch
In reply to Greg Kroah-HartmanFrom: Brian Norris <[email protected]>
commit e9233917a7e53980664efbc565888163c0a33c3f upstream.
This loop intends to retry a max of 10 times, with some implicit termination based on the SD_{R,}OCR_S18A bit. Unfortunately, the termination condition depends on the value reported by the SD card (*rocr), which may or may not correctly reflect what we asked it to do.
Needless to say, it's not wise to rely on the card doing what we expect; we should at least terminate the loop regardless. So, check both the input and output values, so we ensure we will terminate regardless of the SD card behavior.
Note that SDIO learned a similar retry loop in commit 0797e5f1453b ("mmc: core: Fixup signal voltage switch"), but that used the 'ocr' result, and so the current pre-terminating condition looks like:
rocr & ocr & R4_18V_PRESENT
(i.e., it doesn't have the same bug.)
This addresses a number of crash reports seen on ChromeOS that look like the following:
... // lots of repeated: ...
<4>[13142.846061] mmc1: Skipping voltage switch
<4>[13143.406087] mmc1: Skipping voltage switch
<4>[13143.964724] mmc1: Skipping voltage switch
<4>[13144.526089] mmc1: Skipping voltage switch
<4>[13145.086088] mmc1: Skipping voltage switch
<4>[13145.645941] mmc1: Skipping voltage switch
<3>[13146.153969] INFO: task halt:30352 blocked for more than 122 seconds.
...--- drivers/mmc/core/sd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mmc/core/sd.c +2 -1
@@ -870,7 +870,8 @@ try_again:* the CCS bit is set as well. We deliberately deviate from the spec in * regards to this, which allows UHS-I to be supported for SDSC cards. */ -if (!mmc_host_is_spi (host) && rocr && (*rocr &SD_ROCR_S18A )) { +if (!mmc_host_is_spi (host) && (ocr &SD_OCR_S18R ) && + rocr && (*rocr &SD_ROCR_S18A )) { err =mmc_set_uhs_voltage (host, pocr);if (err == -EAGAIN ) { retries--;
Greg Kroah-Hartman
maintainerPATCH 44/48 rpmsg: qcom: glink: replace strncpy() with strscpy_pad()
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit 766279a8f85df32345dbda03b102ca1ee3d5ddea upstream.
The use of strncpy() is considered deprecated for NUL-terminated strings[1]. Replace strncpy() with strscpy_pad(), to keep existing pad-behavior of strncpy, similarly to commit 08de420a8014 ("rpmsg:
glink: Replace strncpy() with strscpy_pad()"). This fixes W=1 warning:
In function ‘qcom_glink_rx_close’,
inlined from ‘qcom_glink_work’ at ../drivers/rpmsg/qcom_glink_native.c:1638:4:
drivers/rpmsg/qcom_glink_native.c:1549:17: warning: ‘strncpy’ specified bound 32 equals destination size [-Wstringop-truncation]
1549 | strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
[1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings
--- drivers/rpmsg/qcom_glink_native.c | 2 +- drivers/rpmsg/qcom_smd.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/rpmsg/qcom_glink_native.c +1 -1
@@ -1546,7 +1546,7 @@ static void qcom_glink_rx_close(struct qcancel_work_sync (&channel->intent_work);if (channel->rpdev) { -strncpy (chinfo.name, channel->name,sizeof (chinfo.name)); +strscpy_pad (chinfo.name, channel->name,sizeof (chinfo.name)); chinfo.src =RPMSG_ADDR_ANY ; chinfo.dst =RPMSG_ADDR_ANY ;
drivers/rpmsg/qcom_smd.c +2 -2
@@ -1089,7 +1089,7 @@ static int qcom_smd_create_device(struct/* Assign public information to the rpmsg_device */ rpdev = &qsdev->rpdev; -strncpy (rpdev->id.name, channel->name,RPMSG_NAME_SIZE ); +strscpy_pad (rpdev->id.name, channel->name,RPMSG_NAME_SIZE ); rpdev->src =RPMSG_ADDR_ANY ; rpdev->dst =RPMSG_ADDR_ANY ;
@@ -1323,7 +1323,7 @@ static void qcom_channel_state_worker(stspin_unlock_irqrestore (&edge->channels_lock, flags); -strncpy (chinfo.name, channel->name,sizeof (chinfo.name)); +strscpy_pad (chinfo.name, channel->name,sizeof (chinfo.name)); chinfo.src =RPMSG_ADDR_ANY ; chinfo.dst =RPMSG_ADDR_ANY ;rpmsg_unregister_device (&edge->dev, &chinfo);
Greg Kroah-Hartman
maintainerPATCH 45/48 bpf: Gate dynptr API behind CAP_BPF
In reply to Greg Kroah-HartmanFrom: Kumar Kartikeya Dwivedi <[email protected]>
commit 8addbfc7b308d591f8a5f2f6bb24d08d9d79dfbb upstream.
This has been enabled for unprivileged programs for only one kernel release, hence the expected annoyances due to this move are low. Users using ringbuf can stick to non-dynptr APIs. The actual use cases dynptr is meant to serve may not make sense in unprivileged BPF programs.
Hence, gate these helpers behind CAP_BPF and limit use to privileged BPF programs.
--- kernel/bpf/helpers.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
kernel/bpf/helpers.c +14 -14
@@ -1627,26 +1627,12 @@ bpf_base_func_proto(enum bpf_func_id func_id)return &bpf_ringbuf_discard_proto;case BPF_FUNC_ringbuf_query:return &bpf_ringbuf_query_proto; -case BPF_FUNC_ringbuf_reserve_dynptr: -return &bpf_ringbuf_reserve_dynptr_proto; -case BPF_FUNC_ringbuf_submit_dynptr: -return &bpf_ringbuf_submit_dynptr_proto; -case BPF_FUNC_ringbuf_discard_dynptr: -return &bpf_ringbuf_discard_dynptr_proto;case BPF_FUNC_for_each_map_elem:return &bpf_for_each_map_elem_proto;case BPF_FUNC_loop:return &bpf_loop_proto;case BPF_FUNC_strncmp:return &bpf_strncmp_proto; -case BPF_FUNC_dynptr_from_mem: -return &bpf_dynptr_from_mem_proto; -case BPF_FUNC_dynptr_read: -return &bpf_dynptr_read_proto; -case BPF_FUNC_dynptr_write: -return &bpf_dynptr_write_proto; -case BPF_FUNC_dynptr_data: -return &bpf_dynptr_data_proto;default :break ; }
@@ -1675,6 +1661,20 @@ bpf_base_func_proto(enum bpf_func_id func_id)return &bpf_timer_cancel_proto;case BPF_FUNC_kptr_xchg:return &bpf_kptr_xchg_proto; +case BPF_FUNC_ringbuf_reserve_dynptr: +return &bpf_ringbuf_reserve_dynptr_proto; +case BPF_FUNC_ringbuf_submit_dynptr: +return &bpf_ringbuf_submit_dynptr_proto; +case BPF_FUNC_ringbuf_discard_dynptr: +return &bpf_ringbuf_discard_dynptr_proto; +case BPF_FUNC_dynptr_from_mem: +return &bpf_dynptr_from_mem_proto; +case BPF_FUNC_dynptr_read: +return &bpf_dynptr_read_proto; +case BPF_FUNC_dynptr_write: +return &bpf_dynptr_write_proto; +case BPF_FUNC_dynptr_data: +return &bpf_dynptr_data_proto;default :break ; }
Signature · 1 line
2.38.0
Greg Kroah-Hartman
maintainerPATCH 46/48 net: ethernet: mtk_eth_soc: fix state in __mtk_foe_entry_clear
In reply to Greg Kroah-HartmanFrom: Daniel Golle <[email protected]>
commit ae3ed15da5889263de372ff9df2e83e16acca4cb upstream.
Setting ib1 state to MTK_FOE_STATE_UNBIND in __mtk_foe_entry_clear routine as done by commit 0e80707d94e4c8 ("net: ethernet: mtk_eth_soc:
fix typo in __mtk_foe_entry_clear") breaks flow offloading, at least on older MTK_NETSYS_V1 SoCs, OpenWrt users have confirmed the bug on MT7622 and MT7621 systems.
Felix Fietkau suggested to use MTK_FOE_STATE_INVALID instead which works well on both, MTK_NETSYS_V1 and MTK_NETSYS_V2.
Tested on MT7622 (Linksys E8450) and MT7986 (BananaPi BPI-R3).
--- drivers/net/ethernet/mediatek/mtk_ppe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mediatek/mtk_ppe.c +1 -1
@@ -412,7 +412,7 @@ __mtk_foe_entry_clear(struct mtk_ppe *ppif (entry->hash !=0xffff ) { ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE ; ppe->foe_table[entry->hash].ib1 |=FIELD_PREP (MTK_FOE_IB1_STATE , -MTK_FOE_STATE_UNBIND ); +MTK_FOE_STATE_INVALID );dma_wmb (); } entry->hash =0xffff ;
Greg Kroah-Hartman
maintainerPATCH 47/48 bpf: Fix resetting logic for unreferenced kptrs
In reply to Greg Kroah-HartmanFrom: Jules Irenge <[email protected]>
commit 9fad7fe5b29803584c7f17a2abe6c2936fec6828 upstream.
Sparse reported a warning at bpf_map_free_kptrs()
"warning: Using plain integer as NULL pointer"
During the process of fixing this warning, it was discovered that the current code erroneously writes to the pointer variable instead of deferencing and writing to the actual kptr. Hence, Sparse tool accidentally helped to uncover this problem. Fix this by doing WRITE_ONCE(*p, 0) instead of WRITE_ONCE(p, 0).
Note that the effect of this bug is that unreferenced kptrs will not be cleared during check_and_free_fields. It is not a problem if the clearing is not done during map_free stage, as there is nothing to free for them.
--- kernel/bpf/syscall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/bpf/syscall.c +1 -1
@@ -578,7 +578,7 @@ void bpf_map_free_kptrs(struct bpf_map *if (off_desc->type ==BPF_KPTR_UNREF ) {u64 *p = (u64 *)btf_id_ptr; -WRITE_ONCE (p,0 ); +WRITE_ONCE (*p,0 );continue ; } old_ptr =xchg (btf_id_ptr,0 );
Greg Kroah-Hartman
maintainerPATCH 48/48 Bluetooth: use hdev->workqueue when queuing hdev->{cmd,ncmd}_timer works
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit deee93d13d385103205879a8a0915036ecd83261 upstream.
syzbot is reporting attempt to schedule hdev->cmd_work work from system_wq WQ into hdev->workqueue WQ which is under draining operation [1], for commit c8efcc2589464ac7 ("workqueue: allow chained queueing during destruction") does not allow such operation.
The check introduced by commit 877afadad2dce8aa ("Bluetooth: When HCI work queue is drained, only queue chained work") was incomplete.
Use hdev->workqueue WQ when queuing hdev->{cmd,ncmd}_timer works because hci_{cmd,ncmd}_timeout() calls queue_work(hdev->workqueue). Also, protect the queuing operation with RCU read lock in order to avoid calling queue_delayed_work() after cancel_delayed_work() completed.
--- net/bluetooth/hci_core.c | 15 +++++++++++++-- net/bluetooth/hci_event.c | 6 ++++-- 2 files changed, 17 insertions(+), 4 deletions(-)
net/bluetooth/hci_core.c +13 -2
@@ -596,6 +596,15 @@ static int hci_dev_do_reset(struct hci_d/* Cancel these to avoid queueing non-chained pending work */ hci_dev_set_flag (hdev,HCI_CMD_DRAIN_WORKQUEUE ); +/* Wait for +* +* if (!hci_dev_test_flag(hdev, HCI_CMD_DRAIN_WORKQUEUE)) +* queue_delayed_work(&hdev->{cmd,ncmd}_timer) +* +* inside RCU section to see the flag or complete scheduling. +*/ +synchronize_rcu (); +/* Explicitly cancel works in case scheduled after setting the flag. */ cancel_delayed_work (&hdev->cmd_timer);cancel_delayed_work (&hdev->ncmd_timer);
@@ -3871,12 +3880,14 @@ static void hci_cmd_work(struct work_strif (res <0 )__hci_cmd_sync_cancel (hdev, -res); +rcu_read_lock ();if (test_bit (HCI_RESET , &hdev->flags) ||hci_dev_test_flag (hdev,HCI_CMD_DRAIN_WORKQUEUE ))cancel_delayed_work (&hdev->cmd_timer);else -schedule_delayed_work (&hdev->cmd_timer, -HCI_CMD_TIMEOUT ); +queue_delayed_work (hdev->workqueue, &hdev->cmd_timer, +HCI_CMD_TIMEOUT ); +rcu_read_unlock (); }else {skb_queue_head (&hdev->cmd_q, skb);queue_work (hdev->workqueue, &hdev->cmd_work);
net/bluetooth/hci_event.c +4 -2
@@ -3763,16 +3763,18 @@ static inline void handle_cmd_cnt_and_ti {cancel_delayed_work (&hdev->cmd_timer); +rcu_read_lock ();if (!test_bit (HCI_RESET , &hdev->flags)) {if (ncmd) {cancel_delayed_work (&hdev->ncmd_timer);atomic_set (&hdev->cmd_cnt,1 ); }else {if (!hci_dev_test_flag (hdev,HCI_CMD_DRAIN_WORKQUEUE )) -schedule_delayed_work (&hdev->ncmd_timer, -HCI_NCMD_TIMEOUT ); +queue_delayed_work (hdev->workqueue, &hdev->ncmd_timer, +HCI_NCMD_TIMEOUT ); } } +rcu_read_unlock (); }#define HCI_CC_VL (_op, _func, _min, _max) \
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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, 12 Oct 2022 07:03:19 +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.19.15-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.19.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.
NOTE:
1) Build warning which were reported on last round of stable rc review
Following build warning found on few arm configs which do not set Kconfig # CONFIG_ELF_CORE is not set
- powerpc: tqm8xx_defconfig
- arm: keystone_defconfig and omap1_defconfig
- mips: ar7_defconfigfs/coredump.c:835:12: warning: 'dump_emit_page' defined but not used [-Wunused-function]
835 | static int dump_emit_page(struct coredump_params *cprm, struct
page *page)
| ^~~~~~~~~~~~~~
## Build
* kernel: 5.19.15-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.19.y
* git commit: 2e79dbde2710b3939943c5d2ea3028329b820e9f
* git describe: v5.19.14-49-g2e79dbde2710
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.19.y/build/v5.19.14-49-g2e79dbde2710
## Test Regressions (compared to v5.19.12-110-g30c780ac0f9f)
## Metric Regressions (compared to v5.19.12-110-g30c780ac0f9f)
## Test Fixes (compared to v5.19.12-110-g30c780ac0f9f)
## Metric Fixes (compared to v5.19.12-110-g30c780ac0f9f)
## Test result summary
total: 112321, pass: 100742, fail: 732, skip: 10568, xfail: 279
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 339 total, 336 passed, 3 failed
* arm64: 72 total, 70 passed, 2 failed
* i386: 61 total, 55 passed, 6 failed
* mips: 62 total, 59 passed, 3 failed
* parisc: 14 total, 14 passed, 0 failed
* powerpc: 75 total, 66 passed, 9 failed
* riscv: 32 total, 27 passed, 5 failed
* s390: 26 total, 24 passed, 2 failed
* sh: 26 total, 24 passed, 2 failed
* sparc: 14 total, 14 passed, 0 failed
* x86_64: 65 total, 63 passed, 2 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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, 12 Oct 2022 07:03:19 +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.19.15-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.19.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, armv7, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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, 12 Oct 2022 07:03:19 +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.19.15-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.19.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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, 12 Oct 2022 07:03:19 +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.19.15-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.19.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 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.19.15 release. There are 48 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.
Successfully cross-compiled for arm64 (bcm2711_defconfig, GCC 10.2.0) and powerpc (ps3_defconfig, GCC 12.1.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara