6.1.4-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 6.1.4-rc1 review
This is the start of the stable review cycle for the 6.1.4 release. There are 207 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 Fri, 06 Jan 2023 16:04:29 +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/v6.x/stable-review/patch-6.1.4-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-6.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.4-rc1
Evan Quan <[email protected]>
drm/amd/pm: correct the fan speed retrieving in PWM for some SMU13 asics
Evan Quan <[email protected]>
drm/amd/pm: bump SMU13.0.0 driver_if header to version 0x34
Evan Quan <[email protected]>
drm/amd/pm: add missing SMU13.0.7 mm_dpm feature mapping
Evan Quan <[email protected]>
drm/amd/pm: add missing SMU13.0.0 mm_dpm feature mapping
Chris Wilson <[email protected]>
drm/i915/migrate: Account for the reserved_space
Matthew Auld <[email protected]>
drm/i915: improve the catch-all evict to handle lock contention
Alex Deucher <[email protected]>
drm/amdgpu: make display pinning more flexible (v2)
Alex Deucher <[email protected]>
drm/amdgpu: handle polaris10/11 overlap asics (v2)
Yifan Zhang <[email protected]>
drm/amd/display: Add DCN314 display SG Support
Matthew Auld <[email protected]>
drm/i915/ttm: consider CCS for backup objects
Ye Bin <[email protected]>
ext4: allocate extended attribute value in vmalloc area
Jan Kara <[email protected]>
ext4: avoid unaccounted block allocation when expanding inode
Jan Kara <[email protected]>
ext4: initialize quota before expanding inode in setproject ioctl
Ye Bin <[email protected]>
ext4: fix inode leak in ext4_xattr_inode_create() on an error path
Ye Bin <[email protected]>
ext4: fix kernel BUG in 'ext4_write_inline_data_end()'
Jan Kara <[email protected]>
ext4: fix deadlock due to mbcache entry corruption
Jan Kara <[email protected]>
ext4: avoid BUG_ON when creating xattrs
Baokun Li <[email protected]>
ext4: fix corrupt backup group descriptors after online resize
Darrick J. Wong <[email protected]>
ext4: dont return EINVAL from GETFSUUID when reporting UUID length
Baokun Li <[email protected]>
ext4: fix bad checksum after online resize
Luís Henriques <[email protected]>
ext4: fix error code return to user-space in ext4_get_branch()
Baokun Li <[email protected]>
ext4: fix corruption when online resizing a 1K bigalloc fs
Eric Whitney <[email protected]>
ext4: fix delayed allocation bug in ext4_clu_mapped for bigalloc + inline
Darrick J. Wong <[email protected]>
ext4: don't fail GETFSUUID when the caller provides a long buffer
Ye Bin <[email protected]>
ext4: init quota for 'old.inode' in 'ext4_rename'
Ye Bin <[email protected]>
ext4: fix uninititialized value in 'ext4_evict_inode'
Eric Biggers <[email protected]>
ext4: fix off-by-one errors in fast-commit block filling
Eric Biggers <[email protected]>
ext4: fix unaligned memory access in ext4_fc_reserve_space()
Eric Biggers <[email protected]>
ext4: add missing validation of fast-commit record lengths
Eric Biggers <[email protected]>
ext4: don't set up encryption key during jbd2 transaction
Eric Biggers <[email protected]>
ext4: fix leaking uninitialized memory in fast-commit journal
Eric Biggers <[email protected]>
ext4: disable fast-commit of encrypted dir operations
Eric Biggers <[email protected]>
ext4: don't allow journal inode to have encrypt flag
Baokun Li <[email protected]>
ext4: fix bug_on in __es_tree_search caused by bad boot loader inode
Zhang Yi <[email protected]>
ext4: check and assert if marking an no_delete evicting inode dirty
Lukas Czerner <[email protected]>
ext4: journal_path mount options should follow links
Ye Bin <[email protected]>
ext4: fix reserved cluster accounting in __es_remove_extent()
Baokun Li <[email protected]>
ext4: fix bug_on in __es_tree_search caused by bad quota inode
Baokun Li <[email protected]>
ext4: add helper to check quota inums
Baokun Li <[email protected]>
ext4: add EXT4_IGET_BAD flag to prevent unexpected bad inode
Gaosheng Cui <[email protected]>
ext4: fix undefined behavior in bit shift for ext4_check_flag_values
Baokun Li <[email protected]>
ext4: fix use-after-free in ext4_orphan_cleanup
Alexander Potapenko <[email protected]>
fs: ext4: initialize fsdata in pagecache_write()
Baokun Li <[email protected]>
ext4: correct inconsistent error msg in nojournal mode
Luís Henriques <[email protected]>
ext4: remove trailing newline from ext4_msg() message
Baokun Li <[email protected]>
ext4: add inode table check in __ext4_get_inode_loc to aovid possible infinite loop
Zhang Yi <[email protected]>
ext4: silence the warning when evicting inode with dioread_nolock
Ard Biesheuvel <[email protected]>
arm64: efi: Execute runtime services from a dedicated stack
Lucas Stach <[email protected]>
drm/etnaviv: reap idle mapping if it doesn't match the softpin address
Yuan Can <[email protected]>
drm/ingenic: Fix missing platform_driver_unregister() call in ingenic_drm_init()
Mikko Kovanen <[email protected]>
drm/i915/dsi: fix VBT send packet port selection for dual link DSI
Lucas Stach <[email protected]>
drm/etnaviv: move idle mapping reaping into separate function
Jocelyn Falempe <[email protected]>
drm/mgag200: Fix PLL setup for G200_SE_A rev >=4
Zack Rusin <[email protected]>
drm/vmwgfx: Validate the box size for the snooped cursor
Simon Ser <[email protected]>
drm/connector: send hotplug uevent on connector cleanup
Wang Weiyang <[email protected]>
device_cgroup: Roll back to original exceptions after copy failure
Helge Deller <[email protected]>
parisc: Drop PMD_SHIFT from calculation in pgtable.h
Helge Deller <[email protected]>
parisc: Drop duplicate kgdb_pdc console
Helge Deller <[email protected]>
parisc: Add missing FORCE prerequisites in Makefile
Helge Deller <[email protected]>
parisc: Fix locking in pdc_iodc_print() firmware call
Helge Deller <[email protected]>
parisc: Drop locking in pdc console code
Shang XiaoJing <[email protected]>
parisc: led: Fix potential null-ptr-deref in start_task()
Peng Fan <[email protected]>
remoteproc: imx_rproc: Correct i.MX93 DRAM mapping
Maria Yu <[email protected]>
remoteproc: core: Do pm_relax when in RPROC_OFFLINE state
Shengjiu Wang <[email protected]>
remoteproc: imx_dsp_rproc: Add mutex protection for workqueue
Mike Kravetz <[email protected]>
hugetlb: really allocate vma lock for all sharable vmas
Li Hua <[email protected]>
test_kprobes: Fix implicit declaration error of test_kprobes
Kim Phillips <[email protected]>
iommu/amd: Fix ill-formed ivrs_ioapic, ivrs_hpet and ivrs_acpihid options
Kim Phillips <[email protected]>
iommu/amd: Fix ivrs_acpihid cmdline parsing code
Johan Hovold <[email protected]>
phy: qcom-qmp-combo: fix sc8180x reset
Johan Hovold <[email protected]>
phy: qcom-qmp-combo: fix sdm845 reset
Qiang Yu <[email protected]>
bus: mhi: host: Fix race between channel preparation and M0 event
Isaac J. Manjarres <[email protected]>
driver core: Fix bus_type.match() error handling in __driver_attach()
Mario Limonciello <[email protected]>
crypto: ccp - Add support for TEE for PCI ID 0x14CA
Corentin Labbe <[email protected]>
crypto: n2 - add missing hash statesize
Sergey Matyukevich <[email protected]>
riscv: mm: notify remote harts about mmu cache updates
Guo Ren <[email protected]>
riscv: stacktrace: Fixup ftrace_graph_ret_addr retp argument
Li Huafei <[email protected]>
RISC-V: kexec: Fix memory leak of elf header buffer
Guo Ren <[email protected]>
riscv: Fixup compile error with !MMU
Li Huafei <[email protected]>
RISC-V: kexec: Fix memory leak of fdt buffer
Sascha Hauer <[email protected]>
PCI/sysfs: Fix double free in error path
Michael S. Tsirkin <[email protected]>
PCI: Fix pci_device_is_present() for VFs by checking PF
Tianjia Zhang <[email protected]>
crypto: ccree,hisilicon - Fix dependencies to correct algorithm
Kees Cook <[email protected]>
um: virt-pci: Avoid GCC non-NULL warning
Roberto Sassu <[email protected]>
ima: Fix memory leak in __ima_inode_hash()
Yaliang Wang <[email protected]>
mtd: spi-nor: gigadevice: gd25q256: replace gd25q256_default_init with gd25q256_post_bfpt
Dan Carpenter <[email protected]>
ipmi: fix use after free in _ipmi_destroy_user()
Huaxin Lu <[email protected]>
ima: Fix a potential NULL pointer access in ima_restore_measurement_list
Alexander Sverdlin <[email protected]>
mtd: spi-nor: Check for zero erase size in spi_nor_find_best_erase_type()
Zhang Yuchen <[email protected]>
ipmi: fix long wait in unload when IPMI disconnect
Maximilian Luz <[email protected]>
ipu3-imgu: Fix NULL pointer dereference in imgu_subdev_set_selection()
Aidan MacDonald <[email protected]>
ASoC: jz4740-i2s: Handle independent FIFO flush bits
Michael Walle <[email protected]>
wifi: wilc1000: sdio: fix module autoloading
Aditya Garg <[email protected]>
efi: Add iMac Pro 2017 to uefi skip cert quirk
Florian-Ewald Mueller <[email protected]>
md/bitmap: Fix bitmap chunk size overflow issues
Damien Le Moal <[email protected]>
block: mq-deadline: Do not break sequential write streams to zoned HDDs
Damien Le Moal <[email protected]>
block: mq-deadline: Fix dd_finish_request() for zoned devices
Yang Wang <[email protected]>
drm/amdgpu: fix mmhub register base coding error
Ian Abbott <[email protected]>
rtc: ds1347: fix value written to century register
Biju Das <[email protected]>
ravb: Fix "failed to switch device to config mode" message during unbind
Paulo Alcantara <[email protected]>
cifs: set correct status of tcon ipc when reconnecting
Paulo Alcantara <[email protected]>
cifs: set correct ipc status after initial tree connect
Paulo Alcantara <[email protected]>
cifs: set correct tcon status after initial tree connect
Steve French <[email protected]>
cifs: fix missing display of three mount options
Paulo Alcantara <[email protected]>
cifs: fix confusing debug message
Takashi Iwai <[email protected]>
media: dvb-core: Fix UAF due to refcount races at releasing
Keita Suzuki <[email protected]>
media: dvb-core: Fix double free in dvb_register_device()
Nick Desaulniers <[email protected]>
ARM: 9256/1: NWFPE: avoid compiler-generated __aeabi_uldivmod
Macpaul Lin <[email protected]>
arm64: dts: mediatek: mt8195-demo: fix the memory size of node secmon
Luca Ceresoli <[email protected]>
staging: media: tegra-video: fix device_node use after free
Luca Ceresoli <[email protected]>
staging: media: tegra-video: fix chan->mipi value on error
Yang Jihong <[email protected]>
tracing: Fix infinite loop in tracing_read_pipe on overflowed print_trace_line
Zheng Yejian <[email protected]>
tracing: Fix issue of missing one synthetic field
Steven Rostedt (Google) <[email protected]>
tracing/probes: Handle system names with hyphens
Zheng Yejian <[email protected]>
tracing/hist: Fix wrong return value in parse_action_params()
Masami Hiramatsu (Google) <[email protected]>
tracing: Fix complicated dependency of CONFIG_TRACER_MAX_TRACE
Michael Jeanson <[email protected]>
powerpc/ftrace: fix syscall tracing on PPC64_ELF_ABI_V1
Steven Rostedt (Google) <[email protected]>
tracing: Fix race where eprobes can be called before the event
Masami Hiramatsu (Google) <[email protected]>
x86/kprobes: Fix optprobe optimization check with CONFIG_RETHUNK
Masami Hiramatsu (Google) <[email protected]>
x86/kprobes: Fix kprobes instruction boudary check with CONFIG_RETHUNK
Steven Rostedt (Google) <[email protected]>
ftrace/x86: Add back ftrace_expected for ftrace bug reports
Ashok Raj <[email protected]>
x86/microcode/intel: Do not retry microcode reloading on the APs
Sean Christopherson <[email protected]>
KVM: nVMX: Properly expose ENABLE_USR_WAIT_PAUSE control to L1
Yuan ZhaoXiong <[email protected]>
KVM: x86: fix APICv/x2AVIC disabled when vm reboot by itself
Sean Christopherson <[email protected]>
KVM: nVMX: Inject #GP, not #UD, if "generic" VMXON CR0/CR4 check fails
Sean Christopherson <[email protected]>
KVM: VMX: Resume guest immediately when injecting #GP on ECREATE
Tianjia Zhang <[email protected]>
ima: Fix hash dependency to correct algorithm
Rob Herring <[email protected]>
of/kexec: Fix reading 32-bit "linux,initrd-{start,end}" values
Max Filippov <[email protected]>
xtensa: add __umulsidi3 helper
Namhyung Kim <[email protected]>
perf/core: Call LSM hook after copying perf_event_attr
Zheng Yejian <[email protected]>
tracing/hist: Fix out-of-bound write on 'action_data.var_ref_idx'
Li Ming <[email protected]>
PCI/DOE: Fix maximum data object length miscalculation
Arnd Bergmann <[email protected]>
ata: ahci: fix enum constants for gcc-13
Mike Snitzer <[email protected]>
dm cache: set needs_check flag after aborting metadata
Luo Meng <[email protected]>
dm cache: Fix UAF in destroy()
Luo Meng <[email protected]>
dm clone: Fix UAF in clone_dtr()
Luo Meng <[email protected]>
dm integrity: Fix UAF in dm_integrity_dtr()
Luo Meng <[email protected]>
dm thin: Fix UAF in run_timer_softirq()
Luo Meng <[email protected]>
dm thin: resume even if in FAIL mode
Zhihao Cheng <[email protected]>
dm thin: Use last transaction's pmd->root when commit failed
Zhihao Cheng <[email protected]>
dm thin: Fix ABBA deadlock between shrink_slab and dm_pool_abort_metadata
Mike Snitzer <[email protected]>
dm cache: Fix ABBA deadlock between shrink_slab and dm_cache_metadata_abort
Matthieu Baerts <[email protected]>
mptcp: use proper req destructor for IPv6
Matthieu Baerts <[email protected]>
mptcp: dedicated request sock for subflow in v6
Matthieu Baerts <[email protected]>
mptcp: remove MPTCP 'ifdef' in TCP SYN cookies
Wei Yongjun <[email protected]>
mptcp: netlink: fix some error return code
Alexander Aring <[email protected]>
fs: dlm: retry accept() until -EAGAIN or error returns
Alexander Aring <[email protected]>
fs: dlm: fix sock release if listen fails
Jaroslav Kysela <[email protected]>
ALSA: usb-audio: Add new quirk FIXED_RATE for JBL Quantum810 Wireless
José Expósito <[email protected]>
HID: Ignore HP Envy x360 eu0009nv stylus battery
Hans de Goede <[email protected]>
platform/x86: x86-android-tablets: Add Advantech MICA-071 extra button
Hans de Goede <[email protected]>
platform/x86: x86-android-tablets: Add Lenovo Yoga Tab 3 (YT3-X90F) charger + fuel-gauge data
Hans de Goede <[email protected]>
platform/x86: x86-android-tablets: Add Medion Lifetab S10346 data
Vitaly Rodionov <[email protected]>
ALSA: hda/cirrus: Add extra 10 ms delay to allow PLL settle and lock.
Artem Bityutskiy <[email protected]>
platform/x86: intel-uncore-freq: add Emerald Rapids support
Hans de Goede <[email protected]>
platform/x86: ideapad-laptop: Stop writing VPCCMD_W_TOUCHPAD at probe time
Hans de Goede <[email protected]>
platform/x86: ideapad-laptop: Send KEY_TOUCHPAD_TOGGLE on some models
Hans de Goede <[email protected]>
platform/x86: ideapad-laptop: Only toggle ps2 aux port on/off on select models
Hans de Goede <[email protected]>
platform/x86: ideapad-laptop: Do not send KEY_TOUCHPAD* events on probe / resume
Hans de Goede <[email protected]>
platform/x86: ideapad-laptop: Refactor ideapad_sync_touchpad_state()
Hans de Goede <[email protected]>
ACPI: video: Prefer native over vendor
Hans de Goede <[email protected]>
ACPI: video: Simplify __acpi_video_get_backlight_type()
Philipp Jungkamp <[email protected]>
platform/x86: ideapad-laptop: support for more special keys in WMI
Eray Orçunus <[email protected]>
platform/x86: ideapad-laptop: Add new _CFG bit numbers for future use
Eray Orçunus <[email protected]>
platform/x86: ideapad-laptop: Revert "check for touchpad support in _CFG"
Hans de Goede <[email protected]>
platform/x86: thinkpad_acpi: Fix max_brightness of thinklight
Chris Chiu <[email protected]>
ALSA: hda/realtek: Apply dual codec fixup for Dell Latitude laptops
Philipp Jungkamp <[email protected]>
ALSA: patch_realtek: Fix Dell Inspiron Plus 16
Toke Høiland-Jørgensen <[email protected]>
bpf: Resolve fext program type when checking map compatibility
Smitha T Murthy <[email protected]>
media: s5p-mfc: Fix in register read and write for H264
Smitha T Murthy <[email protected]>
media: s5p-mfc: Clear workbit to handle error condition
Smitha T Murthy <[email protected]>
media: s5p-mfc: Fix to handle reference queue during finishing
Al Viro <[email protected]>
ext2: unbugger ext2_empty_dir()
Yongqiang Liu <[email protected]>
cpufreq: Init completion before kobject_init_and_add()
Kant Fan <[email protected]>
PM/devfreq: governor: Add a private governor_data for governor
Jason A. Donenfeld <[email protected]>
random: add helpers for random numbers with given floor or range
Yazen Ghannam <[email protected]>
x86/MCE/AMD: Clear DFR errors found in THR handler
Mickaël Salaün <[email protected]>
selftests: Use optional USERCFLAGS and USERLDFLAGS
Yazen Ghannam <[email protected]>
EDAC/mc_sysfs: Increase legacy channel support to 12
Dan Williams <[email protected]>
cxl/region: Fix missing probe failure
Krzysztof Kozlowski <[email protected]>
arm64: dts: qcom: sdm850-lenovo-yoga-c630: correct I2C12 pins drive strength
Andrew Cooper <[email protected]>
x86/fpu/xstate: Fix XSTATE_WARN_ON() to emit relevant diagnostics
Jason A. Donenfeld <[email protected]>
random: use rejection sampling for uniform bounded random integers
Krzysztof Kozlowski <[email protected]>
arm64: dts: qcom: sdm850-samsung-w737: correct I2C12 pins drive strength
Jason A. Donenfeld <[email protected]>
ARM: ux500: do not directly dereference __iomem
Boris Burkov <[email protected]>
btrfs: fix resolving backrefs for inline extent followed by prealloc
void0red <[email protected]>
btrfs: fix extent map use-after-free when handling missing device in read_one_chunk
Josef Bacik <[email protected]>
btrfs: fix uninitialized parent in insert_state
Evan Quan <[email protected]>
drm/amd/pm: correct SMU13.0.0 pstate profiling clock settings
Evan Quan <[email protected]>
drm/amd/pm: update SMU13.0.0 reported maximum shader clock
Johan Hovold <[email protected]>
phy: qcom-qmp-combo: fix out-of-bounds clock access
Wenchao Chen <[email protected]>
mmc: sdhci-sprd: Disable CLK_AUTO when the clock is less than 400K
Johan Hovold <[email protected]>
arm64: dts: qcom: sc8280xp: fix UFS reference clocks
Krzysztof Kozlowski <[email protected]>
arm64: dts: qcom: sdm845-db845c: correct SPI2 pins drive strength
Alexander Antonov <[email protected]>
perf/x86/intel/uncore: Clear attr_update properly
Alexander Antonov <[email protected]>
perf/x86/intel/uncore: Disable I/O stacks to PMU mapping on ICX-D
Bixuan Cui <[email protected]>
jbd2: use the correct print format
Steven Rostedt <[email protected]>
ktest.pl minconfig: Unset configs instead of just removing them
Steven Rostedt <[email protected]>
kest.pl: Fix grub2 menu handling for rebooting
Manivannan Sadhasivam <[email protected]>
soc: qcom: Select REMAP_MMIO for ICC_BWMON driver
Manivannan Sadhasivam <[email protected]>
soc: qcom: Select REMAP_MMIO for LLCC driver
Masami Hiramatsu (Google) <[email protected]>
arm64: Prohibit instrumentation on arch_stack_walk()
Johan Hovold <[email protected]>
arm64: dts: qcom: sc8280xp: fix UFS DMA coherency
Fan Ni <[email protected]>
cxl/region: Fix memdev reuse check
Jason A. Donenfeld <[email protected]>
media: stv0288: use explicitly signed char
Tim Huang <[email protected]>
drm/amdgpu: skip mes self test after s0i3 resume for MES IP v11.0
Alex Deucher <[email protected]>
drm/amdgpu: skip MES for S0ix as well since it's part of GFX
-------------
Diffstat:
Documentation/admin-guide/kernel-parameters.txt | 27 +- Documentation/filesystems/mount_api.rst | 1 + Makefile | 4 +- arch/arm/nwfpe/Makefile | 6 + arch/arm64/boot/dts/mediatek/mt8195-demo.dts | 4 +- arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 10 +- arch/arm64/boot/dts/qcom/sdm845-db845c.dts | 5 +- .../boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 6 +- arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts | 6 +- arch/arm64/include/asm/efi.h | 3 + arch/arm64/kernel/efi-rt-wrapper.S | 13 +- arch/arm64/kernel/efi.c | 27 ++ arch/arm64/kernel/stacktrace.c | 10 +- arch/parisc/include/asm/pgtable.h | 4 +- arch/parisc/kernel/firmware.c | 24 +- arch/parisc/kernel/kgdb.c | 20 -- arch/parisc/kernel/pdc_cons.c | 16 +- arch/parisc/kernel/vdso32/Makefile | 4 +- arch/parisc/kernel/vdso64/Makefile | 4 +- arch/powerpc/include/asm/ftrace.h | 12 - arch/riscv/Kconfig | 2 +- arch/riscv/include/asm/kexec.h | 5 + arch/riscv/include/asm/mmu.h | 2 + arch/riscv/include/asm/pgtable.h | 2 +- arch/riscv/include/asm/tlbflush.h | 18 + arch/riscv/kernel/elf_kexec.c | 14 + arch/riscv/kernel/stacktrace.c | 2 +- arch/riscv/mm/context.c | 10 + arch/riscv/mm/tlbflush.c | 28 +- arch/um/drivers/virt-pci.c | 9 +- arch/x86/events/intel/uncore.h | 1 + arch/x86/events/intel/uncore_snbep.c | 22 +- arch/x86/kernel/cpu/mce/amd.c | 33 +- arch/x86/kernel/cpu/microcode/intel.c | 8 +- arch/x86/kernel/fpu/xstate.c | 12 +- arch/x86/kernel/ftrace.c | 2 + arch/x86/kernel/kprobes/core.c | 10 +- arch/x86/kernel/kprobes/opt.c | 28 +- arch/x86/kvm/lapic.c | 5 +- arch/x86/kvm/vmx/nested.c | 47 ++- arch/x86/kvm/vmx/sgx.c | 4 +- arch/xtensa/kernel/xtensa_ksyms.c | 2 + arch/xtensa/lib/Makefile | 2 +- arch/xtensa/lib/umulsidi3.S | 230 +++++++++++++ block/mq-deadline.c | 83 ++++- drivers/acpi/video_detect.c | 52 ++- drivers/ata/ahci.h | 245 +++++++------- drivers/base/dd.c | 6 +- drivers/bus/mhi/host/pm.c | 3 +- drivers/char/ipmi/ipmi_msghandler.c | 4 +- drivers/char/ipmi/ipmi_si_intf.c | 27 +- drivers/char/random.c | 38 +++ drivers/cpufreq/cpufreq.c | 2 +- drivers/crypto/Kconfig | 4 +- drivers/crypto/ccp/sp-pci.c | 11 +- drivers/crypto/hisilicon/Kconfig | 2 +- drivers/crypto/n2_core.c | 6 + drivers/cxl/core/region.c | 5 +- drivers/devfreq/devfreq.c | 6 +- drivers/devfreq/governor_userspace.c | 12 +- drivers/edac/edac_mc_sysfs.c | 24 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 13 +- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 3 +- drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 3 +- drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c | 2 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 + .../pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h | 2 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 1 + drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 2 + .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 111 +++++- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 19 +- drivers/gpu/drm/drm_connector.c | 3 + drivers/gpu/drm/etnaviv/etnaviv_gem.c | 7 +- drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 23 +- drivers/gpu/drm/etnaviv/etnaviv_mmu.h | 1 + drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 4 +- drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 59 +++- drivers/gpu/drm/i915/gem/i915_gem_mman.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_object.c | 3 + drivers/gpu/drm/i915/gem/i915_gem_object_types.h | 10 +- drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c | 18 +- drivers/gpu/drm/i915/gt/intel_migrate.c | 16 +- drivers/gpu/drm/i915/i915_gem_evict.c | 37 +- drivers/gpu/drm/i915/i915_gem_evict.h | 4 +- drivers/gpu/drm/i915/i915_vma.c | 2 +- drivers/gpu/drm/i915/selftests/i915_gem_evict.c | 4 +- drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 6 +- drivers/gpu/drm/mgag200/mgag200_g200se.c | 3 +- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 3 +- drivers/hid/hid-ids.h | 1 + drivers/hid/hid-input.c | 2 + drivers/iommu/amd/init.c | 86 +++-- drivers/md/dm-cache-metadata.c | 54 ++- drivers/md/dm-cache-target.c | 11 +- drivers/md/dm-clone-target.c | 1 + drivers/md/dm-integrity.c | 2 + drivers/md/dm-thin-metadata.c | 60 +++- drivers/md/dm-thin.c | 18 +- drivers/md/md-bitmap.c | 20 +- drivers/media/dvb-core/dmxdev.c | 8 + drivers/media/dvb-core/dvbdev.c | 1 + drivers/media/dvb-frontends/stv0288.c | 5 +- .../media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.c | 4 +- .../media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 12 +- .../platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c | 14 +- drivers/mmc/host/sdhci-sprd.c | 16 +- drivers/mtd/spi-nor/core.c | 2 + drivers/mtd/spi-nor/gigadevice.c | 24 +- drivers/net/ethernet/renesas/ravb_main.c | 2 +- drivers/net/wireless/microchip/wilc1000/sdio.c | 1 + drivers/of/kexec.c | 10 +- drivers/parisc/led.c | 3 + drivers/pci/doe.c | 20 +- drivers/pci/pci-sysfs.c | 13 +- drivers/pci/pci.c | 2 + drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 47 ++- drivers/platform/x86/ideapad-laptop.c | 371 ++++++++++++++++----- .../x86/intel/uncore-frequency/uncore-frequency.c | 1 + drivers/platform/x86/thinkpad_acpi.c | 1 + drivers/platform/x86/x86-android-tablets.c | 285 +++++++++++++++- drivers/remoteproc/imx_dsp_rproc.c | 12 +- drivers/remoteproc/imx_rproc.c | 4 +- drivers/remoteproc/remoteproc_core.c | 9 +- drivers/rtc/rtc-ds1347.c | 2 +- drivers/soc/qcom/Kconfig | 2 + drivers/soc/ux500/ux500-soc-id.c | 10 +- drivers/staging/media/ipu3/ipu3-v4l2.c | 57 ++-- drivers/staging/media/tegra-video/csi.c | 4 +- drivers/staging/media/tegra-video/csi.h | 2 +- fs/btrfs/backref.c | 4 + fs/btrfs/extent-io-tree.c | 2 +- fs/btrfs/volumes.c | 3 +- fs/cifs/cifsfs.c | 8 +- fs/cifs/connect.c | 16 +- fs/dlm/lowcomms.c | 9 +- fs/ext2/dir.c | 2 +- fs/ext4/ext4.h | 9 +- fs/ext4/extents.c | 8 + fs/ext4/extents_status.c | 3 +- fs/ext4/fast_commit.c | 171 +++++----- fs/ext4/fast_commit.h | 3 +- fs/ext4/indirect.c | 9 +- fs/ext4/inode.c | 48 ++- fs/ext4/ioctl.c | 24 +- fs/ext4/namei.c | 47 +-- fs/ext4/orphan.c | 2 +- fs/ext4/resize.c | 32 +- fs/ext4/super.c | 42 ++- fs/ext4/verity.c | 2 +- fs/ext4/xattr.c | 19 +- fs/fs_parser.c | 3 +- fs/mbcache.c | 14 +- fs/quota/dquot.c | 2 + include/linux/bpf_verifier.h | 2 +- include/linux/devfreq.h | 7 +- include/linux/fs_parser.h | 1 + include/linux/mbcache.h | 9 +- include/linux/prandom.h | 18 +- include/linux/random.h | 65 ++++ include/net/mptcp.h | 12 +- include/trace/events/ext4.h | 7 +- include/trace/events/jbd2.h | 44 +-- kernel/bpf/core.c | 5 +- kernel/events/core.c | 6 +- kernel/trace/Kconfig | 2 + kernel/trace/trace.c | 38 ++- kernel/trace/trace.h | 27 +- kernel/trace/trace_eprobe.c | 3 + kernel/trace/trace_events_hist.c | 11 +- kernel/trace/trace_events_synth.c | 2 +- kernel/trace/trace_probe.c | 2 +- lib/Kconfig.debug | 1 + mm/hugetlb.c | 333 ++++++++---------- net/ipv4/syncookies.c | 7 +- net/mptcp/pm_userspace.c | 4 + net/mptcp/subflow.c | 61 +++- security/device_cgroup.c | 33 +- security/integrity/ima/Kconfig | 2 +- security/integrity/ima/ima_main.c | 7 +- security/integrity/ima/ima_template.c | 5 +- security/integrity/platform_certs/load_uefi.c | 1 + sound/pci/hda/patch_cs8409.c | 2 +- sound/pci/hda/patch_realtek.c | 50 +++ sound/soc/jz4740/jz4740-i2s.c | 39 ++- sound/usb/card.h | 1 + sound/usb/endpoint.c | 16 +- sound/usb/endpoint.h | 3 +- sound/usb/implicit.c | 6 +- sound/usb/implicit.h | 2 +- sound/usb/pcm.c | 36 +- sound/usb/pcm.h | 2 + sound/usb/quirks.c | 2 + sound/usb/usbaudio.h | 4 + tools/testing/ktest/ktest.pl | 23 +- tools/testing/selftests/lib.mk | 5 + 200 files changed, 3052 insertions(+), 1144 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/207 drm/amdgpu: skip MES for S0ix as well since its part of GFX
From: Alex Deucher <[email protected]>
commit afa6646b1c5d3affd541f76bd7476e4b835a9174 upstream.
It's also part of gfxoff.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +3 -2
@@ -3005,14 +3005,15 @@ static int amdgpu_device_ip_suspend_phascontinue ; } -/* skip suspend of gfx and psp for S0ix +/* skip suspend of gfx/mes and psp for S0ix * gfx is in gfxoff state, so on resume it will exit gfxoff just * like at runtime. PSP is also part of the always on hardware * so no need to suspend it. */ if (adev->in_s0ix && (adev->ip_blocks[i].version->type ==AMD_IP_BLOCK_TYPE_PSP || - adev->ip_blocks[i].version->type ==AMD_IP_BLOCK_TYPE_GFX )) + adev->ip_blocks[i].version->type ==AMD_IP_BLOCK_TYPE_GFX || + adev->ip_blocks[i].version->type ==AMD_IP_BLOCK_TYPE_MES ))continue ;/* XXX handle errors */
Greg Kroah-Hartman
maintainerPATCH 2/207 drm/amdgpu: skip mes self test after s0i3 resume for MES IP v11.0
In reply to Greg Kroah-HartmanFrom: Tim Huang <[email protected]>
commit 8660495a9c5b9afeec4cc006b3b75178f0fb2f10 upstream.
MES is part of gfxoff and MES suspend and resume are skipped for S0i3. But the mes_self_test call path is still in the amdgpu_device_ip_late_init. it's should also be skipped for s0ix as no hardware re-initialization happened.
Besides, mes_self_test will free the BO that triggers a lot of warning messages while in the suspend state.
[ 81.656085] WARNING: CPU: 2 PID: 1550 at drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:425 amdgpu_bo_free_kernel+0xfc/0x110 [amdgpu] [ 81.679435] Call Trace: [ 81.679726] <TASK> [ 81.679981] amdgpu_mes_remove_hw_queue+0x17a/0x230 [amdgpu] [ 81.680857] amdgpu_mes_self_test+0x390/0x430 [amdgpu] [ 81.681665] mes_v11_0_late_init+0x37/0x50 [amdgpu] [ 81.682423] amdgpu_device_ip_late_init+0x53/0x280 [amdgpu] [ 81.683257] amdgpu_device_resume+0xae/0x2a0 [amdgpu] [ 81.684043] amdgpu_pmops_resume+0x37/0x70 [amdgpu] [ 81.684818] pci_pm_resume+0x5c/0xa0 [ 81.685247] ? pci_pm_thaw+0x90/0x90 [ 81.685658] dpm_run_callback+0x4e/0x160 [ 81.686110] device_resume+0xad/0x210 [ 81.686529] async_resume+0x1e/0x40 [ 81.686931] async_run_entry_fn+0x33/0x120 [ 81.687405] process_one_work+0x21d/0x3f0 [ 81.687869] worker_thread+0x4a/0x3c0 [ 81.688293] ? process_one_work+0x3f0/0x3f0 [ 81.688777] kthread+0xff/0x130 [ 81.689157] ? kthread_complete_and_exit+0x20/0x20 [ 81.689707] ret_from_fork+0x22/0x30 [ 81.690118] </TASK> [ 81.690380] ---[ end trace 0000000000000000 ]---
v2: make the comment clean and use adev->in_s0ix instead of adev->suspend
--- drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +2 -1
@@ -1339,7 +1339,8 @@ static int mes_v11_0_late_init(void *han {struct amdgpu_device *adev = (struct amdgpu_device *)handle; -if (!amdgpu_in_reset (adev) && +/* it's only intended for use in mes_self_test case, not for s0ix and reset */ +if (!amdgpu_in_reset (adev) && !adev->in_s0ix && (adev->ip_versions[GC_HWIP ][0 ] !=IP_VERSION (11 ,0 ,3 )))amdgpu_mes_self_test (adev);
Greg Kroah-Hartman
maintainerPATCH 3/207 media: stv0288: use explicitly signed char
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit 7392134428c92a4cb541bd5c8f4f5c8d2e88364d upstream.
With char becoming unsigned by default, and with char alone being ambiguous and based on architecture, signed chars need to be marked explicitly as such. Use s8 and u8 types here, since that's what surrounding code does. This fixes:
drivers/media/dvb-frontends/stv0288.c:471 stv0288_set_frontend() warn: assigning (-9) to unsigned variable 'tm' drivers/media/dvb-frontends/stv0288.c:471 stv0288_set_frontend() warn: we never enter this loop
--- drivers/media/dvb-frontends/stv0288.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/media/dvb-frontends/stv0288.c +2 -3
@@ -440,9 +440,8 @@ static int stv0288_set_frontend(struct dstruct stv0288_state *state = fe->demodulator_priv;struct dtv_frontend_properties *c = &fe->dtv_property_cache; -char tm; -unsigned char tda[3 ]; -u8 reg, time_out =0 ; +u8 tda[3 ], reg, time_out =0 ; +s8 tm;dprintk ("%s : FE_SET_FRONTEND\n" , __func__);
Greg Kroah-Hartman
maintainerPATCH 4/207 cxl/region: Fix memdev reuse check
In reply to Greg Kroah-HartmanFrom: Fan Ni <[email protected]>
commit f04facfb993de47e2133b2b842d72b97b1c50162 upstream.
Due to a typo, the check of whether or not a memdev has already been used as a target for the region (above code piece) will always be skipped. Given a memdev with more than one HDM decoder, an interleaved region can be created that maps multiple HPAs to the same DPA. According to CXL spec 3.0 8.1.3.8.4, "Aliasing (mapping more than one Host Physical Address (HPA) to a single Device Physical Address) is forbidden."
Fix this by using existing iterator for memdev reuse check.
--- drivers/cxl/core/region.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cxl/core/region.c +1 -1
@@ -1226,7 +1226,7 @@ static int cxl_region_attach(struct cxl_struct cxl_endpoint_decoder *cxled_target;struct cxl_memdev *cxlmd_target; - cxled_target = p->targets[pos]; + cxled_target = p->targets[i];if (!cxled_target)continue ;
Greg Kroah-Hartman
maintainerPATCH 5/207 arm64: dts: qcom: sc8280xp: fix UFS DMA coherency
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 0953777640354dc459a22369eea488603d225dd9 upstream.
The SC8280XP UFS controllers are cache coherent and must be marked as such in the devicetree to avoid potential data corruption.
--- arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/sc8280xp.dtsi +2 -0
@@ -855,6 +855,7 @@ required-opps = <&rpmhpd_opp_nom>; iommus = <&apps_smmu 0xe0 0x0>; + dma-coherent; clocks = <&gcc GCC_UFS_PHY_AXI_CLK>, <&gcc GCC_AGGRE_UFS_PHY_AXI_CLK>,
@@ -923,6 +924,7 @@ power-domains = <&gcc UFS_CARD_GDSC>; iommus = <&apps_smmu 0x4a0 0x0>; + dma-coherent; clocks = <&gcc GCC_UFS_CARD_AXI_CLK>, <&gcc GCC_AGGRE_UFS_CARD_AXI_CLK>,
Greg Kroah-Hartman
maintainerPATCH 6/207 arm64: Prohibit instrumentation on arch_stack_walk()
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
commit 0fbcd8abf3375052cc7627cc53aba6f2eb189fbb upstream.
Mark arch_stack_walk() as noinstr instead of notrace and inline functions called from arch_stack_walk() as __always_inline so that user does not put any instrumentations on it, because this function can be used from return_address() which is used by lockdep.
Without this, if the kernel built with CONFIG_LOCKDEP=y, just probing arch_stack_walk() via <tracefs>/kprobe_events will crash the kernel on arm64.
# echo p arch_stack_walk >> ${TRACEFS}/kprobe_events
# echo 1 > ${TRACEFS}/events/kprobes/enable
kprobes: Failed to recover from reentered kprobes.
kprobes: Dump kprobe:
.symbol_name = arch_stack_walk, .offset = 0, .addr = arch_stack_walk+0x0/0x1c0
------------[ cut here ]------------
kernel BUG at arch/arm64/kernel/probes/kprobes.c:241!
kprobes: Failed to recover from reentered kprobes.
kprobes: Dump kprobe:
.symbol_name = arch_stack_walk, .offset = 0, .addr = arch_stack_walk+0x0/0x1c0
------------[ cut here ]------------
kernel BUG at arch/arm64/kernel/probes/kprobes.c:241!
PREEMPT SMP
Modules linked in:
CPU: 0 PID: 17 Comm: migration/0 Tainted: G N 6.1.0-rc5+ #6
Hardware name: linux,dummy-virt (DT)
Stopper: 0x0 <- 0x0
pstate: 600003c5 (nZCv DAIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : kprobe_breakpoint_handler+0x178/0x17c
lr : kprobe_breakpoint_handler+0x178/0x17c
sp : ffff8000080d3090
x29: ffff8000080d3090 x28: ffff0df5845798c0 x27: ffffc4f59057a774
x26: ffff0df5ffbba770 x25: ffff0df58f420f18 x24: ffff49006f641000
x23: ffffc4f590579768 x22: ffff0df58f420f18 x21: ffff8000080d31c0
x20: ffffc4f590579768 x19: ffffc4f590579770 x18: 0000000000000006
x17: 5f6b636174735f68 x16: 637261203d207264 x15: 64612e202c30203d
x14: 2074657366666f2e x13: 30633178302f3078 x12: 302b6b6c61775f6b
x11: 636174735f686372 x10: ffffc4f590dc5bd8 x9 : ffffc4f58eb31958
x8 : 00000000ffffefff x7 : ffffc4f590dc5bd8 x6 : 80000000fffff000
x5 : 000000000000bff4 x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : ffff0df5845798c0 x0 : 0000000000000064
Call trace:
kprobes: Failed to recover from reentered kprobes.
kprobes: Dump kprobe:
.symbol_name = arch_stack_walk, .offset = 0, .addr = arch_stack_walk+0x0/0x1c0
------------[ cut here ]------------
kernel BUG at arch/arm64/kernel/probes/kprobes.c:241!--- arch/arm64/kernel/stacktrace.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm64/kernel/stacktrace.c +5 -5
@@ -23,8 +23,8 @@* * The regs must be on a stack currently owned by the calling task. */ -static inline void unwind_init_from_regs (struct unwind_state *state, -struct pt_regs *regs) +static __always_inline void unwind_init_from_regs(struct unwind_state *state, +struct pt_regs *regs) {unwind_init_common (state, current);
@@ -58,8 +58,8 @@ static __always_inline void unwind_init_* duration of the unwind, or the unwind will be bogus. It is never valid to * call this for the current task. */ -static inline void unwind_init_from_task (struct unwind_state *state, -struct task_struct *task) +static __always_inline void unwind_init_from_task(struct unwind_state *state, +struct task_struct *task) {unwind_init_common (state, task);
@@ -186,7 +186,7 @@ void show_stack(struct task_struct *tsk, : stackinfo_get_unknown(); \ }) -noinline notrace void arch_stack_walk(stack_trace_consume_fn consume_entry, +noinline noinstr void arch_stack_walk(stack_trace_consume_fn consume_entry,void *cookie,struct task_struct *task,struct pt_regs *regs) {
Greg Kroah-Hartman
maintainerPATCH 7/207 soc: qcom: Select REMAP_MMIO for LLCC driver
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
commit 5d2fe2d7b616b8baa18348ead857b504fc2de336 upstream.
LLCC driver uses REGMAP_MMIO for accessing the hardware registers. So select the dependency in Kconfig. Without this, there will be errors while building the driver with COMPILE_TEST only:
ERROR: modpost: "__devm_regmap_init_mmio_clk" [drivers/soc/qcom/llcc-qcom.ko] undefined! make[1]: *** [scripts/Makefile.modpost:126: Module.symvers] Error 1
make: *** [Makefile:1944: modpost] Error 2
--- drivers/soc/qcom/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/soc/qcom/Kconfig +1 -0
@@ -63,6 +63,7 @@ config QCOM_GSBI config QCOM_LLCC tristate "Qualcomm Technologies, Inc. LLCC driver" depends on ARCH_QCOM || COMPILE_TEST + select REGMAP_MMIO help Qualcomm Technologies, Inc. platform specific Last Level Cache Controller(LLCC) driver for platforms such as,
Greg Kroah-Hartman
maintainerPATCH 8/207 soc: qcom: Select REMAP_MMIO for ICC_BWMON driver
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
commit a84160fbf4f2c8c5ffa588e19ea8f92eabd7ad17 upstream.
ICC_BWMON driver uses REGMAP_MMIO for accessing the hardware registers. So select the dependency in Kconfig. Without this, there will be errors while building the driver with COMPILE_TEST only:
ERROR: modpost: "__devm_regmap_init_mmio_clk" [drivers/soc/qcom/icc-bwmon.ko] undefined! make[1]: *** [scripts/Makefile.modpost:126: Module.symvers] Error 1
make: *** [Makefile:1944: modpost] Error 2
--- drivers/soc/qcom/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/soc/qcom/Kconfig +1 -0
@@ -237,6 +237,7 @@ config QCOM_ICC_BWMON tristate "QCOM Interconnect Bandwidth Monitor driver" depends on ARCH_QCOM || COMPILE_TEST select PM_OPP + select REGMAP_MMIO help Sets up driver monitoring bandwidth on various interconnects and based on that voting for interconnect bandwidth, adjusting their
Greg Kroah-Hartman
maintainerPATCH 9/207 kest.pl: Fix grub2 menu handling for rebooting
In reply to Greg Kroah-HartmanFrom: Steven Rostedt <[email protected]>
commit 26df05a8c1420ad3de314fdd407e7fc2058cc7aa upstream.
grub2 has submenus where to use grub-reboot, it requires:
grub-reboot X>Y
where X is the main index and Y is the submenu. Thus if you have:
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux ...
[...]
}
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option ...
menuentry 'Debian GNU/Linux, with Linux 6.0.0-4-amd64' --class debian --class gnu-linux ...
[...]
}
menuentry 'Debian GNU/Linux, with Linux 6.0.0-4-amd64 (recovery mode)' --class debian --class gnu-linux ...
[...]
}
menuentry 'Debian GNU/Linux, with Linux test' --class debian --class gnu-linux ...
[...]
}And wanted to boot to the "Linux test" kernel, you need to run:
# grub-reboot 1>2
As 1 is the second top menu (the submenu) and 2 is the third of the sub menu entries.
Have the grub.cfg parsing for grub2 handle such cases.
--- tools/testing/ktest/ktest.pl | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
tools/testing/ktest/ktest.pl +15 -5
@@ -1963,7 +1963,7 @@ sub run_scp_mod { sub _get_grub_index { - my ($command, $target, $skip) = @_; + my ($command, $target, $skip, $submenu) = @_; return if (defined($grub_number) && defined($last_grub_menu) && $last_grub_menu eq $grub_menu && defined($last_machine) &&
@@ -1980,11 +1980,16 @@ sub _get_grub_index { my $found = 0; + my $submenu_number = 0; + while (<IN>) { if (/$target/) { $grub_number++; $found = 1; last; + } elsif (defined($submenu) && /$submenu/) { + $submenu_number++; + $grub_number = -1; } elsif (/$skip/) { $grub_number++; }
@@ -1993,6 +1998,9 @@ sub _get_grub_index { dodie "Could not find '$grub_menu' through $command on $machine" if (!$found); + if ($submenu_number > 0) { + $grub_number = "$submenu_number>$grub_number"; + } doprint "$grub_number\n"; $last_grub_menu = $grub_menu; $last_machine = $machine;
@@ -2003,6 +2011,7 @@ sub get_grub_index { my $command; my $target; my $skip; + my $submenu; my $grub_menu_qt; if ($reboot_type !~ /^grub/) {
@@ -2017,8 +2026,9 @@ sub get_grub_index { $skip = '^\s*title\s'; } elsif ($reboot_type eq "grub2") { $command = "cat $grub_file"; - $target = '^menuentry.*' . $grub_menu_qt; - $skip = '^menuentry\s|^submenu\s'; + $target = '^\s*menuentry.*' . $grub_menu_qt; + $skip = '^\s*menuentry'; + $submenu = '^\s*submenu\s'; } elsif ($reboot_type eq "grub2bls") { $command = $grub_bls_get; $target = '^title=.*' . $grub_menu_qt;
@@ -2027,7 +2037,7 @@ sub get_grub_index { return; } - _get_grub_index($command, $target, $skip); + _get_grub_index($command, $target, $skip, $submenu); } sub wait_for_input {
@@ -2090,7 +2100,7 @@ sub reboot_to { if ($reboot_type eq "grub") { run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'"; } elsif (($reboot_type eq "grub2") or ($reboot_type eq "grub2bls")) { - run_ssh "$grub_reboot $grub_number"; + run_ssh "$grub_reboot \"'$grub_number'\""; } elsif ($reboot_type eq "syslinux") { run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path"; } elsif (defined $reboot_script) {
Greg Kroah-Hartman
maintainerPATCH 10/207 ktest.pl minconfig: Unset configs instead of just removing them
In reply to Greg Kroah-HartmanFrom: Steven Rostedt <[email protected]>
commit ef784eebb56425eed6e9b16e7d47e5c00dcf9c38 upstream.
After a full run of a make_min_config test, I noticed there were a lot of CONFIGs still enabled that really should not be. Looking at them, I noticed they were all defined as "default y". The issue is that the test simple removes the config and re-runs make oldconfig, which enables it again because it is set to default 'y'. Instead, explicitly disable the config with writing "# CONFIG_FOO is not set" to the file to keep it from being set again.
With this change, one of my box's minconfigs went from 768 configs set, down to 521 configs set.
--- tools/testing/ktest/ktest.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/ktest/ktest.pl +2 -1
@@ -3778,9 +3778,10 @@ sub test_this_config { # .config to make sure it is missing the config that # we had before my %configs = %min_configs; - delete $configs{$config}; + $configs{$config} = "# $config is not set"; make_new_config ((values %configs), (values %keep_configs)); make_oldconfig; + delete $configs{$config}; undef %configs; assign_configs \%configs, $output_config;
Greg Kroah-Hartman
maintainerPATCH 11/207 jbd2: use the correct print format
In reply to Greg Kroah-HartmanFrom: Bixuan Cui <[email protected]>
commit d87a7b4c77a997d5388566dd511ca8e6b8e8a0a8 upstream.
The print format error was found when using ftrace event:
<...>-1406 [000] .... 23599442.895823: jbd2_end_commit: dev 252,8 transaction -1866216965 sync 0 head -1866217368
<...>-1406 [000] .... 23599442.896299: jbd2_start_commit: dev 252,8 transaction -1866216964 sync 0Use the correct print format for transaction, head and tid.
--- include/trace/events/jbd2.h | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-)
include/trace/events/jbd2.h +22 -22
@@ -40,7 +40,7 @@ DECLARE_EVENT_CLASS(jbd2_commit,TP_STRUCT__entry (__field (dev_t ,dev )__field ( char, sync_commit ) -__field ( int, transaction ) +__field ( tid_t, transaction ) ), TP_fast_assign(
@@ -49,7 +49,7 @@ DECLARE_EVENT_CLASS(jbd2_commit, __entry->transaction = commit_transaction->t_tid; ), -TP_printk ("dev %d,%d transaction %d sync %d" , +TP_printk ("dev %d,%d transaction %u sync %d" ,MAJOR (__entry->dev),MINOR (__entry->dev), __entry->transaction, __entry->sync_commit) );
@@ -97,8 +97,8 @@ TRACE_EVENT(jbd2_end_commit,TP_STRUCT__entry (__field (dev_t ,dev )__field ( char, sync_commit ) -__field ( int, transaction ) -__field ( int, head ) +__field ( tid_t, transaction ) +__field ( tid_t, head ) ), TP_fast_assign(
@@ -108,7 +108,7 @@ TRACE_EVENT(jbd2_end_commit, __entry->head = journal->j_tail_sequence; ), -TP_printk ("dev %d,%d transaction %d sync %d head %d" , +TP_printk ("dev %d,%d transaction %u sync %d head %u" ,MAJOR (__entry->dev),MINOR (__entry->dev), __entry->transaction, __entry->sync_commit, __entry->head) );
@@ -134,14 +134,14 @@ TRACE_EVENT(jbd2_submit_inode_data, ); DECLARE_EVENT_CLASS(jbd2_handle_start_class, - TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, + TP_PROTO(dev_t dev, tid_t tid, unsigned int type, unsigned int line_no, int requested_blocks), TP_ARGS(dev, tid, type, line_no, requested_blocks), TP_STRUCT__entry( __field( dev_t, dev ) - __field( unsigned long, tid ) + __field( tid_t, tid ) __field( unsigned int, type ) __field( unsigned int, line_no ) __field( int, requested_blocks)
@@ -155,28 +155,28 @@ DECLARE_EVENT_CLASS(jbd2_handle_start_cl __entry->requested_blocks = requested_blocks; ), -TP_printk ("dev %d,%d tid %lu type %u line_no %u " +TP_printk ("dev %d,%d tid %u type %u line_no %u " "requested_blocks %d" ,MAJOR (__entry->dev),MINOR (__entry->dev), __entry->tid, __entry->type, __entry->line_no, __entry->requested_blocks) );DEFINE_EVENT (jbd2_handle_start_class, jbd2_handle_start, - TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, + TP_PROTO(dev_t dev, tid_t tid, unsigned int type, unsigned int line_no, int requested_blocks),TP_ARGS (dev, tid, type, line_no, requested_blocks) );DEFINE_EVENT (jbd2_handle_start_class, jbd2_handle_restart, - TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, + TP_PROTO(dev_t dev, tid_t tid, unsigned int type, unsigned int line_no, int requested_blocks),TP_ARGS (dev, tid, type, line_no, requested_blocks) ); TRACE_EVENT(jbd2_handle_extend, - TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, + TP_PROTO(dev_t dev, tid_t tid, unsigned int type, unsigned int line_no, int buffer_credits, int requested_blocks),
@@ -184,7 +184,7 @@ TRACE_EVENT(jbd2_handle_extend,TP_STRUCT__entry (__field (dev_t ,dev ) - __field( unsigned long, tid ) +__field ( tid_t, tid ) __field( unsigned int, type ) __field( unsigned int, line_no ) __field( int, buffer_credits )
@@ -200,7 +200,7 @@ TRACE_EVENT(jbd2_handle_extend, __entry->requested_blocks = requested_blocks; ), - TP_printk("dev %d,%d tid %lu type %u line_no %u " + TP_printk("dev %d,%d tid %u type %u line_no %u " "buffer_credits %d requested_blocks %d", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, __entry->type, __entry->line_no, __entry->buffer_credits,
@@ -208,7 +208,7 @@ TRACE_EVENT(jbd2_handle_extend, ); TRACE_EVENT(jbd2_handle_stats, - TP_PROTO(dev_t dev, unsigned long tid, unsigned int type, + TP_PROTO(dev_t dev, tid_t tid, unsigned int type, unsigned int line_no, int interval, int sync, int requested_blocks, int dirtied_blocks),
@@ -217,7 +217,7 @@ TRACE_EVENT(jbd2_handle_stats,TP_STRUCT__entry (__field (dev_t ,dev ) - __field( unsigned long, tid ) +__field ( tid_t, tid ) __field( unsigned int, type ) __field( unsigned int, line_no ) __field( int, interval )
@@ -237,7 +237,7 @@ TRACE_EVENT(jbd2_handle_stats, __entry->dirtied_blocks = dirtied_blocks; ), - TP_printk("dev %d,%d tid %lu type %u line_no %u interval %d " + TP_printk("dev %d,%d tid %u type %u line_no %u interval %d " "sync %d requested_blocks %d dirtied_blocks %d", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, __entry->type, __entry->line_no, __entry->interval,
@@ -246,14 +246,14 @@ TRACE_EVENT(jbd2_handle_stats, ); TRACE_EVENT(jbd2_run_stats, - TP_PROTO(dev_t dev, unsigned long tid, + TP_PROTO(dev_t dev, tid_t tid, struct transaction_run_stats_s *stats), TP_ARGS(dev, tid, stats), TP_STRUCT__entry( __field( dev_t, dev ) - __field( unsigned long, tid ) + __field( tid_t, tid ) __field( unsigned long, wait ) __field( unsigned long, request_delay ) __field( unsigned long, running )
@@ -279,7 +279,7 @@ TRACE_EVENT(jbd2_run_stats, __entry->blocks_logged = stats->rs_blocks_logged; ), - TP_printk("dev %d,%d tid %lu wait %u request_delay %u running %u " + TP_printk("dev %d,%d tid %u wait %u request_delay %u running %u " "locked %u flushing %u logging %u handle_count %u " "blocks %u blocks_logged %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid,
@@ -294,14 +294,14 @@ TRACE_EVENT(jbd2_run_stats, ); TRACE_EVENT(jbd2_checkpoint_stats, - TP_PROTO(dev_t dev, unsigned long tid, + TP_PROTO(dev_t dev, tid_t tid, struct transaction_chp_stats_s *stats), TP_ARGS(dev, tid, stats), TP_STRUCT__entry( __field( dev_t, dev ) - __field( unsigned long, tid ) + __field( tid_t, tid ) __field( unsigned long, chp_time ) __field( __u32, forced_to_close ) __field( __u32, written )
@@ -317,7 +317,7 @@ TRACE_EVENT(jbd2_checkpoint_stats, __entry->dropped = stats->cs_dropped; ), - TP_printk("dev %d,%d tid %lu chp_time %u forced_to_close %u " + TP_printk("dev %d,%d tid %u chp_time %u forced_to_close %u " "written %u dropped %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, jiffies_to_msecs(__entry->chp_time),
Greg Kroah-Hartman
maintainerPATCH 12/207 perf/x86/intel/uncore: Disable I/O stacks to PMU mapping on ICX-D
In reply to Greg Kroah-HartmanFrom: Alexander Antonov <[email protected]>
commit efe062705d149b20a15498cb999a9edbb8241e6f upstream.
Current implementation of I/O stacks to PMU mapping doesn't support ICX-D. Detect ICX-D system to disable mapping.
--- arch/x86/events/intel/uncore.h | 1 + arch/x86/events/intel/uncore_snbep.c | 5 +++++ 2 files changed, 6 insertions(+)
arch/x86/events/intel/uncore.h +1 -0
@@ -2,6 +2,7 @@#include <linux/slab.h> #include <linux/pci.h> #include <asm/apicdef.h> +#include <asm/intel-family.h> #include <linux/io-64-nonatomic-lo-hi.h> #include <linux/perf_event.h>
arch/x86/events/intel/uncore_snbep.c +5 -0
@@ -5144,6 +5144,11 @@ static int icx_iio_get_topology(struct istatic int icx_iio_set_mapping (struct intel_uncore_type *type) { +/* Detect ICX-D system. This case is not supported */ +if (boot_cpu_data.x86_model ==INTEL_FAM6_ICELAKE_D ) { +pmu_clear_mapping_attr (type->attr_update, &icx_iio_mapping_group); +return -EPERM ; + }return pmu_iio_set_mapping (type, &icx_iio_mapping_group); }
Greg Kroah-Hartman
maintainerPATCH 13/207 perf/x86/intel/uncore: Clear attr_update properly
In reply to Greg Kroah-HartmanFrom: Alexander Antonov <[email protected]>
commit 6532783310e2b2f50dc13f46c49aa6546cb6e7a3 upstream.
Current clear_attr_update procedure in pmu_set_mapping() sets attr_update field in NULL that is not correct because intel_uncore_type pmu types can contain several groups in attr_update field. For example, SPR platform already has uncore_alias_group to update and then UPI topology group will be added in next patches.
Fix current behavior and clear attr_update group related to mapping only.
--- arch/x86/events/intel/uncore_snbep.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
arch/x86/events/intel/uncore_snbep.c +16 -1
@@ -3804,6 +3804,21 @@ static const struct attribute_group *skx NULL, }; +static void pmu_clear_mapping_attr (const struct attribute_group **groups, +struct attribute_group *ag) +{ +int i; + +for (i =0 ; groups[i]; i++) { +if (groups[i] == ag) { +for (i++; groups[i]; i++) + groups[i -1 ] = groups[i]; + groups[i -1 ] =NULL ; +break ; + } + } +} +static int pmu_iio_set_mapping (struct intel_uncore_type *type,struct attribute_group *ag) {
@@ -3852,7 +3867,7 @@ clear_attrs: clear_topology:kfree (type->topology); clear_attr_update: - type->attr_update =NULL ; +pmu_clear_mapping_attr (type->attr_update, ag);return ret; }
Greg Kroah-Hartman
maintainerPATCH 14/207 arm64: dts: qcom: sdm845-db845c: correct SPI2 pins drive strength
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit 9905370560d9c29adc15f4937c5a0c0dac05f0b4 upstream.
The pin configuration (done with generic pin controller helpers and as expressed by bindings) requires children nodes with either:
1. "pins" property and the actual configuration,
2. another set of nodes with above point.
The qup_spi2_default pin configuration uses alreaady the second method with a "pinmux" child, so configure drive-strength similarly in "pinconf". Otherwise the PIN drive strength would not be applied.
--- arch/arm64/boot/dts/qcom/sdm845-db845c.dts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/sdm845-db845c.dts +4 -1
@@ -1123,7 +1123,10 @@ /* PINCTRL - additions to nodes defined in sdm845.dtsi */ &qup_spi2_default { - drive-strength = <16>; + pinconf { + pins = "gpio27", "gpio28", "gpio29", "gpio30"; + drive-strength = <16>; + }; }; &qup_uart3_default{
Greg Kroah-Hartman
maintainerPATCH 15/207 arm64: dts: qcom: sc8280xp: fix UFS reference clocks
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit f446022b932aff1d6a308ca5d537ec2b512debdc upstream.
There are three UFS reference clocks on SC8280XP which are used as follows:
- The GCC_UFS_REF_CLKREF_CLK clock is fed to any UFS device connected to either controller.
- The GCC_UFS_1_CARD_CLKREF_CLK and GCC_UFS_CARD_CLKREF_CLK clocks provide reference clocks to the two PHYs.
Note that this depends on first updating the clock driver to reflect that all three clocks are sourced from CXO. Specifically, the UFS controller driver expects the device reference clock to have a valid frequency:
ufshcd-qcom 1d84000.ufs: invalid ref_clk setting = 0
--- arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/qcom/sc8280xp.dtsi +4 -4
@@ -861,7 +861,7 @@ <&gcc GCC_AGGRE_UFS_PHY_AXI_CLK>, <&gcc GCC_UFS_PHY_AHB_CLK>, <&gcc GCC_UFS_PHY_UNIPRO_CORE_CLK>, - <&rpmhcc RPMH_CXO_CLK>, + <&gcc GCC_UFS_REF_CLKREF_CLK>, <&gcc GCC_UFS_PHY_TX_SYMBOL_0_CLK>, <&gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>, <&gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>;
@@ -892,7 +892,7 @@ ranges; clock-names = "ref", "ref_aux"; - clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>, + clocks = <&gcc GCC_UFS_CARD_CLKREF_CLK>, <&gcc GCC_UFS_PHY_PHY_AUX_CLK>; resets = <&ufs_mem_hc 0>;
@@ -930,7 +930,7 @@ <&gcc GCC_AGGRE_UFS_CARD_AXI_CLK>, <&gcc GCC_UFS_CARD_AHB_CLK>, <&gcc GCC_UFS_CARD_UNIPRO_CORE_CLK>, - <&rpmhcc RPMH_CXO_CLK>, + <&gcc GCC_UFS_REF_CLKREF_CLK>, <&gcc GCC_UFS_CARD_TX_SYMBOL_0_CLK>, <&gcc GCC_UFS_CARD_RX_SYMBOL_0_CLK>, <&gcc GCC_UFS_CARD_RX_SYMBOL_1_CLK>;
@@ -961,7 +961,7 @@ ranges; clock-names = "ref", "ref_aux"; - clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>, + clocks = <&gcc GCC_UFS_1_CARD_CLKREF_CLK>, <&gcc GCC_UFS_CARD_PHY_AUX_CLK>; resets = <&ufs_card_hc 0>;
Greg Kroah-Hartman
maintainerPATCH 16/207 mmc: sdhci-sprd: Disable CLK_AUTO when the clock is less than 400K
In reply to Greg Kroah-HartmanFrom: Wenchao Chen <[email protected]>
commit ff874dbc4f868af128b412a9bd92637103cf11d7 upstream.
When the clock is less than 400K, some SD cards fail to initialize because CLK_AUTO is enabled.
--- drivers/mmc/host/sdhci-sprd.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/mmc/host/sdhci-sprd.c +9 -7
@@ -228,13 +228,15 @@ static inline void _sdhci_sprd_set_clock div = ((div &0x300 ) >>2 ) | ((div &0xFF ) <<8 );sdhci_enable_clk (host, div); -/* enable auto gate sdhc_enable_auto_gate */ - val =sdhci_readl (host,SDHCI_SPRD_REG_32_BUSY_POSI ); - mask =SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | -SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN ; -if (mask != (val & mask)) { - val |= mask; -sdhci_writel (host, val,SDHCI_SPRD_REG_32_BUSY_POSI ); +/* Enable CLK_AUTO when the clock is greater than 400K. */ +if (clk >400000 ) { + val =sdhci_readl (host,SDHCI_SPRD_REG_32_BUSY_POSI ); + mask =SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | +SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN ; +if (mask != (val & mask)) { + val |= mask; +sdhci_writel (host, val,SDHCI_SPRD_REG_32_BUSY_POSI ); + } } }
Greg Kroah-Hartman
maintainerPATCH 17/207 phy: qcom-qmp-combo: fix out-of-bounds clock access
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit d8a5b59c5fc75c99ba17e3eb1a8f580d8d172b28 upstream.
The SM8250 only uses three clocks but the DP configuration erroneously described four clocks.
In case the DP part of the PHY is initialised before the USB part, this would lead to uninitialised memory beyond the bulk-clocks array to be treated as a clock pointer as the clocks are requested based on the USB configuration.
--- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/phy/qualcomm/phy-qcom-qmp-combo.c +2 -2
@@ -1328,8 +1328,8 @@ static const struct qmp_phy_cfg sm8250_d .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, - .clk_list = qmp_v4_phy_clk_l, - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), + .clk_list = qmp_v4_sm8250_usbphy_clk_l, + .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), .reset_list = msm8996_usb3phy_reset_l, .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), .vreg_list = qmp_phy_vreg_l,
Greg Kroah-Hartman
maintainerPATCH 18/207 drm/amd/pm: update SMU13.0.0 reported maximum shader clock
In reply to Greg Kroah-HartmanFrom: Evan Quan <[email protected]>
commit 7a18e089eff02f17eaee49fc18641f5d16a8284b upstream.
Update the reported maximum shader clock to the value which can be guarded to be achieved on all cards. This is to align with Window setting.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +69 -1
@@ -517,6 +517,23 @@ static int smu_v13_0_0_set_default_dpm_t dpm_table);if (ret)return ret; + +/* +* Update the reported maximum shader clock to the value +* which can be guarded to be achieved on all cards. This +* is aligned with Window setting. And considering that value +* might be not the peak frequency the card can achieve, it +* is normal some real-time clock frequency can overtake this +* labelled maximum clock frequency(for example in pp_dpm_sclk +* sysfs output). +*/ +if (skutable->DriverReportedClocks.GameClockAc && + (dpm_table->dpm_levels[dpm_table->count -1 ].value > + skutable->DriverReportedClocks.GameClockAc)) { + dpm_table->dpm_levels[dpm_table->count -1 ].value = + skutable->DriverReportedClocks.GameClockAc; + dpm_table->max = skutable->DriverReportedClocks.GameClockAc; + } }else { dpm_table->count =1 ; dpm_table->dpm_levels[0 ].value = smu->smu_table.boot_values.gfxclk /100 ;
@@ -779,6 +796,57 @@ static int smu_v13_0_0_get_smu_metrics_dreturn ret; } +static int smu_v13_0_0_get_dpm_ultimate_freq (struct smu_context *smu, +enum smu_clk_type clk_type, +uint32_t *min, +uint32_t *max) +{ +struct smu_13_0_dpm_context *dpm_context = + smu->smu_dpm.dpm_context; +struct smu_13_0_dpm_table *dpm_table; + +switch (clk_type) { +case SMU_MCLK : +case SMU_UCLK : +/* uclk dpm table */ + dpm_table = &dpm_context->dpm_tables.uclk_table; +break ; +case SMU_GFXCLK : +case SMU_SCLK : +/* gfxclk dpm table */ + dpm_table = &dpm_context->dpm_tables.gfx_table; +break ; +case SMU_SOCCLK : +/* socclk dpm table */ + dpm_table = &dpm_context->dpm_tables.soc_table; +break ; +case SMU_FCLK : +/* fclk dpm table */ + dpm_table = &dpm_context->dpm_tables.fclk_table; +break ; +case SMU_VCLK : +case SMU_VCLK1 : +/* vclk dpm table */ + dpm_table = &dpm_context->dpm_tables.vclk_table; +break ; +case SMU_DCLK : +case SMU_DCLK1 : +/* dclk dpm table */ + dpm_table = &dpm_context->dpm_tables.dclk_table; +break ; +default : +dev_err (smu->adev->dev,"Unsupported clock type!\n" ); +return -EINVAL ; + } + +if (min) + *min = dpm_table->min; +if (max) + *max = dpm_table->max; + +return 0 ; +} + static int smu_v13_0_0_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor, void *data,
@@ -1813,7 +1881,7 @@ static const struct pptable_funcs smu_v1 .get_enabled_mask = smu_cmn_get_enabled_mask, .dpm_set_vcn_enable = smu_v13_0_set_vcn_enable, .dpm_set_jpeg_enable = smu_v13_0_set_jpeg_enable, - .get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq, + .get_dpm_ultimate_freq = smu_v13_0_0_get_dpm_ultimate_freq, .get_vbios_bootup_values = smu_v13_0_get_vbios_bootup_values, .read_sensor = smu_v13_0_0_read_sensor, .feature_is_enabled = smu_cmn_feature_is_enabled,
Greg Kroah-Hartman
maintainerPATCH 19/207 drm/amd/pm: correct SMU13.0.0 pstate profiling clock settings
In reply to Greg Kroah-HartmanFrom: Evan Quan <[email protected]>
commit 32a7819ff8e25375c7515aaae5cfcb8c44a461b7 upstream.
Correct the pstate standard/peak profiling mode clock settings for SMU13.0.0.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 22 ++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +15 -7
@@ -1349,9 +1349,17 @@ static int smu_v13_0_0_populate_umd_stat &dpm_context->dpm_tables.fclk_table;struct smu_umd_pstate_table *pstate_table = &smu->pstate_table; +struct smu_table_context *table_context = &smu->smu_table; +PPTable_t *pptable = table_context->driver_pptable; +DriverReportedClocks_t driver_clocks = + pptable->SkuTable.DriverReportedClocks; pstate_table->gfxclk_pstate.min = gfx_table->min; - pstate_table->gfxclk_pstate.peak = gfx_table->max; +if (driver_clocks.GameClockAc && + (driver_clocks.GameClockAc < gfx_table->max)) + pstate_table->gfxclk_pstate.peak = driver_clocks.GameClockAc; +else + pstate_table->gfxclk_pstate.peak = gfx_table->max; pstate_table->uclk_pstate.min = mem_table->min; pstate_table->uclk_pstate.peak = mem_table->max;
@@ -1368,12 +1376,12 @@ static int smu_v13_0_0_populate_umd_stat pstate_table->fclk_pstate.min = fclk_table->min; pstate_table->fclk_pstate.peak = fclk_table->max; -/* -* For now, just use the mininum clock frequency. -* TODO: update them when the real pstate settings available -*/ - pstate_table->gfxclk_pstate.standard = gfx_table->min; - pstate_table->uclk_pstate.standard = mem_table->min; +if (driver_clocks.BaseClockAc && + driver_clocks.BaseClockAc < gfx_table->max) + pstate_table->gfxclk_pstate.standard = driver_clocks.BaseClockAc; +else + pstate_table->gfxclk_pstate.standard = gfx_table->max; + pstate_table->uclk_pstate.standard = mem_table->max; pstate_table->socclk_pstate.standard = soc_table->min; pstate_table->vclk_pstate.standard = vclk_table->min; pstate_table->dclk_pstate.standard = dclk_table->min;
Greg Kroah-Hartman
maintainerPATCH 20/207 btrfs: fix uninitialized parent in insert_state
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
commit d7c9e1be2876f63fb2178a24e0c1d5733ff98d47 upstream.
I don't know how this isn't caught when we build this in the kernel, but while syncing extent-io-tree.c into btrfs-progs I got an error because parent could potentially be uninitialized when we link in a new node, specifically when the extent_io_tree is empty. This means we could have garbage in the parent color. I don't know what the ramifications are of that, but it's probably not great, so fix this by initializing parent to NULL. I spot checked all of our other usages in btrfs and we appear to be doing the correct thing everywhere else.
--- fs/btrfs/extent-io-tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/extent-io-tree.c +1 -1
@@ -397,7 +397,7 @@ static int insert_state(struct extent_io u32 bits, struct extent_changeset *changeset) { struct rb_node **node; -struct rb_node *parent; +struct rb_node *parent =NULL ;const u64 end = state->end;set_state_bits (tree, state, bits, changeset);
Greg Kroah-Hartman
maintainerPATCH 21/207 btrfs: fix extent map use-after-free when handling missing device in read_one_chunk
In reply to Greg Kroah-HartmanFrom: void0red <[email protected]>
commit 1742e1c90c3da344f3bb9b1f1309b3f47482756a upstream.
Store the error code before freeing the extent_map. Though it's reference counted structure, in that function it's the first and last allocation so this would lead to a potential use-after-free.
The error can happen eg. when chunk is stored on a missing device and the degraded mount option is missing.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=216721
--- fs/btrfs/volumes.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/btrfs/volumes.c +2 -1
@@ -7241,8 +7241,9 @@ static int read_one_chunk(struct btrfs_k map->stripes[i].dev =handle_missing_device (fs_info, devid, uuid);if (IS_ERR (map->stripes[i].dev)) { + ret =PTR_ERR (map->stripes[i].dev);free_extent_map (em); -return PTR_ERR (map->stripes[i].dev); +return ret; } }
Greg Kroah-Hartman
maintainerPATCH 22/207 btrfs: fix resolving backrefs for inline extent followed by prealloc
In reply to Greg Kroah-HartmanFrom: Boris Burkov <[email protected]>
commit 560840afc3e63bbe5d9c5ef6b2ecf8f3589adff6 upstream.
If a file consists of an inline extent followed by a regular or prealloc extent, then a legitimate attempt to resolve a logical address in the non-inline region will result in add_all_parents reading the invalid offset field of the inline extent. If the inline extent item is placed in the leaf eb s.t. it is the first item, attempting to access the offset field will not only be meaningless, it will go past the end of the eb and cause this panic:
[17.626048] BTRFS warning (device dm-2): bad eb member end: ptr 0x3fd4 start 30834688 member offset 16377 size 8 [17.631693] general protection fault, probably for non-canonical address 0x5088000000000: 0000 [#1] SMP PTI [17.635041] CPU: 2 PID: 1267 Comm: btrfs Not tainted 5.12.0-07246-g75175d5adc74-dirty #199 [17.637969] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014 [17.641995] RIP: 0010:btrfs_get_64+0xe7/0x110 [17.649890] RSP: 0018:ffffc90001f73a08 EFLAGS: 00010202 [17.651652] RAX: 0000000000000001 RBX: ffff88810c42d000 RCX: 0000000000000000 [17.653921] RDX: 0005088000000000 RSI: ffffc90001f73a0f RDI: 0000000000000001 [17.656174] RBP: 0000000000000ff9 R08: 0000000000000007 R09: c0000000fffeffff [17.658441] R10: ffffc90001f73790 R11: ffffc90001f73788 R12: ffff888106afe918 [17.661070] R13: 0000000000003fd4 R14: 0000000000003f6f R15: cdcdcdcdcdcdcdcd [17.663617] FS: 00007f64e7627d80(0000) GS:ffff888237c80000(0000) knlGS:0000000000000000 [17.666525] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [17.668664] CR2: 000055d4a39152e8 CR3: 000000010c596002 CR4: 0000000000770ee0 [17.671253] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [17.673634] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [17.676034] PKRU: 55555554 [17.677004] Call Trace: [17.677877] add_all_parents+0x276/0x480 [17.679325] find_parent_nodes+0xfae/0x1590 [17.680771] btrfs_find_all_leafs+0x5e/0xa0 [17.682217] iterate_extent_inodes+0xce/0x260 [17.683809] ? btrfs_inode_flags_to_xflags+0x50/0x50 [17.685597] ? iterate_inodes_from_logical+0xa1/0xd0 [17.687404] iterate_inodes_from_logical+0xa1/0xd0 [17.689121] ? btrfs_inode_flags_to_xflags+0x50/0x50 [17.691010] btrfs_ioctl_logical_to_ino+0x131/0x190 [17.692946] btrfs_ioctl+0x104a/0x2f60 [17.694384] ? selinux_file_ioctl+0x182/0x220 [17.695995] ? __x64_sys_ioctl+0x84/0xc0 [17.697394] __x64_sys_ioctl+0x84/0xc0 [17.698697] do_syscall_64+0x33/0x40 [17.700017] entry_SYSCALL_64_after_hwframe+0x44/0xae [17.701753] RIP: 0033:0x7f64e72761b7 [17.709355] RSP: 002b:00007ffefb067f58 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 [17.712088] RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007f64e72761b7 [17.714667] RDX: 00007ffefb067fb0 RSI: 00000000c0389424 RDI: 0000000000000003 [17.717386] RBP: 00007ffefb06d188 R08: 000055d4a390d2b0 R09: 00007f64e7340a60 [17.719938] R10: 0000000000000231 R11: 0000000000000246 R12: 0000000000000001 [17.722383] R13: 0000000000000000 R14: 00000000c0389424 R15: 000055d4a38fd2a0 [17.724839] Modules linked in:
Fix the bug by detecting the inline extent item in add_all_parents and skipping to the next extent item.
--- fs/btrfs/backref.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/btrfs/backref.c +4 -0
@@ -433,6 +433,7 @@ static int add_all_parents(struct btrfs_u64 wanted_disk_byte = ref->wanted_disk_byte;u64 count =0 ;u64 data_offset; +u8 type;if (level !=0 ) { eb = path->nodes[level];
@@ -487,6 +488,9 @@ static int add_all_parents(struct btrfs_continue ; } fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item); + type =btrfs_file_extent_type (eb, fi); +if (type ==BTRFS_FILE_EXTENT_INLINE ) + goto next; disk_byte =btrfs_file_extent_disk_bytenr (eb, fi); data_offset =btrfs_file_extent_offset (eb, fi);
Greg Kroah-Hartman
maintainerPATCH 23/207 ARM: ux500: do not directly dereference __iomem
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit 65b0e307a1a9193571db12910f382f84195a3d29 upstream.
Sparse reports that calling add_device_randomness() on uid is a violation of address spaces. And indeed the next usage uses readl() properly, but that was left out when passing it toadd_device_ randomness(). So instead copy the whole thing to the stack first.
--- drivers/soc/ux500/ux500-soc-id.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/soc/ux500/ux500-soc-id.c +4 -6
@@ -167,20 +167,18 @@ ATTRIBUTE_GROUPS(ux500_soc);static const char *db8500_read_soc_id (struct device_node *backupram) {void __iomem *base; -void __iomem *uid;const char *retstr; +u32 uid[5 ]; base =of_iomap (backupram,0 );if (!base)return NULL ; - uid = base +0x1fc0 ; +memcpy_fromio (uid, base +0x1fc0 ,sizeof (uid));/* Throw these device-specific numbers into the entropy pool */ -add_device_randomness (uid,0x14 ); +add_device_randomness (uid,sizeof (uid)); retstr =kasprintf (GFP_KERNEL ,"%08x%08x%08x%08x%08x" , -readl ((u32 *)uid+0 ), -readl ((u32 *)uid+1 ),readl ((u32 *)uid+2 ), -readl ((u32 *)uid+3 ),readl ((u32 *)uid+4 )); + uid[0 ], uid[1 ], uid[2 ], uid[3 ], uid[4 ]);iounmap (base);return retstr; }
Greg Kroah-Hartman
maintainerPATCH 24/207 arm64: dts: qcom: sdm850-samsung-w737: correct I2C12 pins drive strength
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit 3638ea010c37e1e6d93474c4b3368f403600413f upstream.
The pin configuration (done with generic pin controller helpers and as expressed by bindings) requires children nodes with either:
1. "pins" property and the actual configuration,
2. another set of nodes with above point.
The qup_i2c12_default pin configuration used second method - with a "pinmux" child.
--- arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts +4 -2
@@ -415,8 +415,10 @@ }; &qup_i2c12_default { - drive-strength = <2>; - bias-disable; + pinmux { + drive-strength = <2>; + bias-disable; + }; }; &qup_uart6_default {
Greg Kroah-Hartman
maintainerPATCH 25/207 random: use rejection sampling for uniform bounded random integers
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit e9a688bcb19348862afe30d7c85bc37c4c293471 upstream.
Until the very recent commits, many bounded random integers were calculated using get_random_u32() % max_plus_one, which not only incurs the price of a division -- indicating performance mostly was not a real issue -- but also does not result in a uniformly distributed output if max_plus_one is not a power of two. Recent commits moved to using prandom_u32_max(max_plus_one), which replaces the division with a faster multiplication, but still does not solve the issue with non-uniform output.
For some users, maybe this isn't a problem, and for others, maybe it is, but for the majority of users, probably the question has never been posed and analyzed, and nobody thought much about it, probably assuming random is random is random. In other words, the unthinking expectation of most users is likely that the resultant numbers are uniform.
So we implement here an efficient way of generating uniform bounded random integers. Through use of compile-time evaluation, and avoiding divisions as much as possible, this commit introduces no measurable overhead. At least for hot-path uses tested, any potential difference was lost in the noise. On both clang and gcc, code generation is pretty small.
The new function, get_random_u32_below(), lives in random.h, rather than prandom.h, and has a "get_random_xxx" function name, because it is suitable for all uses, including cryptography.
In order to be efficient, we implement a kernel-specific variant of Daniel Lemire's algorithm from "Fast Random Integer Generation in an Interval", linked below. The kernel's variant takes advantage of constant folding to avoid divisions entirely in the vast majority of cases, works on both 32-bit and 64-bit architectures, and requests a minimal amount of bytes from the RNG.
--- drivers/char/random.c | 22 ++++++++++++++++++++++ include/linux/prandom.h | 18 ++---------------- include/linux/random.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 16 deletions(-)
drivers/char/random.c +22 -0
@@ -160,6 +160,7 @@ EXPORT_SYMBOL(wait_for_random_bytes);* u8 get_random_u8() * u16 get_random_u16() * u32 get_random_u32() +* u32 get_random_u32_below(u32 ceil) * u64 get_random_u64() * unsigned long get_random_long() *
@@ -510,6 +511,27 @@ DEFINE_BATCHED_ENTROPY(u16) DEFINE_BATCHED_ENTROPY(u32) DEFINE_BATCHED_ENTROPY(u64) +u32 __get_random_u32_below(u32 ceil) +{ +/* +* This is the slow path for variable ceil. It is still fast, most of +* the time, by doing traditional reciprocal multiplication and +* opportunistically comparing the lower half to ceil itself, before +* falling back to computing a larger bound, and then rejecting samples +* whose lower half would indicate a range indivisible by ceil. The use +* of `-ceil % ceil` is analogous to `2^32 % ceil`, but is computable +* in 32-bits. +*/ +u64 mult = (u64 )ceil *get_random_u32 (); +if (unlikely ((u32 )mult < ceil)) { +u32 bound = -ceil % ceil; +while (unlikely ((u32 )mult < bound)) + mult = (u64 )ceil *get_random_u32 (); + } +return mult >>32 ; +} +EXPORT_SYMBOL (__get_random_u32_below); +#ifdef CONFIG_SMP /* * This function is called when the CPU is coming up, with entry
include/linux/prandom.h +2 -16
@@ -23,24 +23,10 @@ void prandom_seed_full_state(struct rnd_#define prandom_init_once (pcpu_state) \ DO_ONCE(prandom_seed_full_state, (pcpu_state)) -/** -* prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro) -* @ep_ro: right open interval endpoint -* -* Returns a pseudo-random number that is in interval [0, ep_ro). This is -* useful when requesting a random index of an array containing ep_ro elements, -* for example. The result is somewhat biased when ep_ro is not a power of 2, -* so do not use this for cryptographic purposes. -* -* Returns: pseudo-random number in interval [0, ep_ro) -*/ +/* Deprecated: use get_random_u32_below() instead. */ static inline u32 prandom_u32_max (u32 ep_ro) { -if (__builtin_constant_p (ep_ro <=1U <<8 ) && ep_ro <=1U <<8 ) -return (get_random_u8 () * ep_ro) >>8 ; -if (__builtin_constant_p (ep_ro <=1U <<16 ) && ep_ro <=1U <<16 ) -return (get_random_u16 () * ep_ro) >>16 ; -return ((u64 )get_random_u32 () * ep_ro) >>32 ; +return get_random_u32_below (ep_ro); }/*
include/linux/random.h +40 -0
@@ -51,6 +51,46 @@ static inline unsigned long get_random_l#endif } +u32 __get_random_u32_below (u32 ceil); + +/* +* Returns a random integer in the interval [0, ceil), with uniform +* distribution, suitable for all uses. Fastest when ceil is a constant, but +* still fast for variable ceil as well. +*/ +static inline u32 get_random_u32_below (u32 ceil) +{ +if (!__builtin_constant_p (ceil)) +return __get_random_u32_below (ceil); + +/* +* For the fast path, below, all operations on ceil are precomputed by +* the compiler, so this incurs no overhead for checking pow2, doing +* divisions, or branching based on integer size. The resultant +* algorithm does traditional reciprocal multiplication (typically +* optimized by the compiler into shifts and adds), rejecting samples +* whose lower half would indicate a range indivisible by ceil. +*/ +BUILD_BUG_ON_MSG (!ceil,"get_random_u32_below() must take ceil > 0" ); +if (ceil <=1 ) +return 0 ; +for (;;) { +if (ceil <=1U <<8 ) { +u32 mult = ceil *get_random_u8 (); +if (likely (is_power_of_2 (ceil) || (u8 )mult >= (1U <<8 ) % ceil)) +return mult >>8 ; + }else if (ceil <=1U <<16 ) { +u32 mult = ceil *get_random_u16 (); +if (likely (is_power_of_2 (ceil) || (u16 )mult >= (1U <<16 ) % ceil)) +return mult >>16 ; + }else { +u64 mult = (u64 )ceil *get_random_u32 (); +if (likely (is_power_of_2 (ceil) || (u32 )mult >= -ceil % ceil)) +return mult >>32 ; + } + } +} +/* * On 64-bit architectures, protect against non-terminated C string overflows * by zeroing out the first byte of the canary; this leaves 56 bits of entropy.
Greg Kroah-Hartman
maintainerPATCH 26/207 x86/fpu/xstate: Fix XSTATE_WARN_ON() to emit relevant diagnostics
In reply to Greg Kroah-HartmanFrom: Andrew Cooper <[email protected]>
commit 48280042f2c6e3ac2cfb1d8b752ab4a7e0baea24 upstream.
"XSAVE consistency problem" has been reported under Xen, but that's the extent of my divination skills.
Modify XSTATE_WARN_ON() to force the caller to provide relevant diagnostic information, and modify each caller suitably.
For check_xstate_against_struct(), this removes a double WARN() where one will do perfectly fine.
CC stable as this has been wonky debugging for 7 years and it is good to have there too.
--- arch/x86/kernel/fpu/xstate.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/x86/kernel/fpu/xstate.c +6 -6
@@ -440,8 +440,8 @@ static void __init __xstate_dump_leaves( } } -#define XSTATE_WARN_ON (x) do { \ - if (WARN_ONCE(x, "XSAVE consistency problem, dumping leaves")) { \ +#define XSTATE_WARN_ON (x, fmt, ...) do { \ + if (WARN_ONCE(x, "XSAVE consistency problem: " fmt, ##__VA_ARGS__)) { \ __xstate_dump_leaves(); \ } \ } while (0)
@@ -554,8 +554,7 @@ static bool __init check_xstate_against_ (nr >= XFEATURE_MAX) || (nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) || ((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_RSRVD_COMP_16))) { -WARN_ONCE (1 ,"no structure for xstate: %d\n" , nr); -XSTATE_WARN_ON (1 ); +XSTATE_WARN_ON (1 ,"No structure for xstate: %d\n" , nr);return false; }return true;
@@ -598,12 +597,13 @@ static bool __init paranoid_xstate_size_* XSAVES. */ if (!xsaves &&xfeature_is_supervisor (i)) { -XSTATE_WARN_ON (1 ); +XSTATE_WARN_ON (1 ,"Got supervisor feature %d, but XSAVES not advertised\n" , i);return false; } } size =xstate_calculate_size (fpu_kernel_cfg.max_features, compacted); -XSTATE_WARN_ON (size != kernel_size); +XSTATE_WARN_ON (size != kernel_size, +"size %u != kernel_size %u\n" , size, kernel_size);return size == kernel_size; }
Greg Kroah-Hartman
maintainerPATCH 27/207 arm64: dts: qcom: sdm850-lenovo-yoga-c630: correct I2C12 pins drive strength
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit fd49776d8f458bba5499384131eddc0b8bcaf50c upstream.
The pin configuration (done with generic pin controller helpers and as expressed by bindings) requires children nodes with either:
1. "pins" property and the actual configuration,
2. another set of nodes with above point.
The qup_i2c12_default pin configuration used second method - with a "pinmux" child.
--- arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +4 -2
@@ -487,8 +487,10 @@ }; &qup_i2c12_default { - drive-strength = <2>; - bias-disable; + pinmux { + drive-strength = <2>; + bias-disable; + }; }; &qup_uart6_default {
Greg Kroah-Hartman
maintainerPATCH 28/207 cxl/region: Fix missing probe failure
In reply to Greg Kroah-HartmanFrom: Dan Williams <[email protected]>
commit bf3e5da8cb43a671b32fc125fa81b8f6a3677192 upstream.
cxl_region_probe() allows for regions not in the 'commit' state to be enabled. Fail probe when the region is not committed otherwise the kernel may indicate that an address range is active when none of the decoders are active.
--- drivers/cxl/core/region.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cxl/core/region.c +3 -0
@@ -1923,6 +1923,9 @@ static int cxl_region_probe(struct devic*/ up_read (&cxl_region_rwsem); +if (rc) +return rc; +switch (cxlr->mode) {case CXL_DECODER_PMEM :return devm_cxl_add_pmem_region (cxlr);
Greg Kroah-Hartman
maintainerPATCH 29/207 EDAC/mc_sysfs: Increase legacy channel support to 12
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
commit 25836ce1df827cb4830291cb2325067efb46753a upstream.
Newer AMD systems, such as Genoa, can support up to 12 channels per EDAC "mc" device. These are detected by the device's EDAC module, and the current EDAC interface is properly enumerated. However, the legacy EDAC sysfs interface provides device attributes only for channels 0 to 7. Therefore, channels 8 to 11 will not be visible in the legacy interface. This was overlooked in the initial support for AMD Genoa.
Add additional device attributes so that up to 12 channels are visible in the legacy EDAC sysfs interface.
--- drivers/edac/edac_mc_sysfs.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/edac/edac_mc_sysfs.c +24 -0
@@ -298,6 +298,14 @@ DEVICE_CHANNEL(ch6_dimm_label, S_IRUGO | channel_dimm_label_show, channel_dimm_label_store, 6);DEVICE_CHANNEL (ch7_dimm_label,S_IRUGO |S_IWUSR , channel_dimm_label_show, channel_dimm_label_store,7 ); +DEVICE_CHANNEL (ch8_dimm_label,S_IRUGO |S_IWUSR , + channel_dimm_label_show, channel_dimm_label_store,8 ); +DEVICE_CHANNEL (ch9_dimm_label,S_IRUGO |S_IWUSR , + channel_dimm_label_show, channel_dimm_label_store,9 ); +DEVICE_CHANNEL (ch10_dimm_label,S_IRUGO |S_IWUSR , + channel_dimm_label_show, channel_dimm_label_store,10 ); +DEVICE_CHANNEL (ch11_dimm_label,S_IRUGO |S_IWUSR , + channel_dimm_label_show, channel_dimm_label_store,11 );/* Total possible dynamic DIMM Label attribute file table */ static struct attribute *dynamic_csrow_dimm_attr[] = {
@@ -309,6 +317,10 @@ static struct attribute *dynamic_csrow_d &dev_attr_legacy_ch5_dimm_label.attr.attr, &dev_attr_legacy_ch6_dimm_label.attr.attr, &dev_attr_legacy_ch7_dimm_label.attr.attr, + &dev_attr_legacy_ch8_dimm_label.attr.attr, + &dev_attr_legacy_ch9_dimm_label.attr.attr, + &dev_attr_legacy_ch10_dimm_label.attr.attr, + &dev_attr_legacy_ch11_dimm_label.attr.attr, NULL };
@@ -329,6 +341,14 @@ DEVICE_CHANNEL(ch6_ce_count, S_IRUGO, channel_ce_count_show, NULL, 6);DEVICE_CHANNEL (ch7_ce_count,S_IRUGO , channel_ce_count_show,NULL ,7 ); +DEVICE_CHANNEL (ch8_ce_count,S_IRUGO , + channel_ce_count_show,NULL ,8 ); +DEVICE_CHANNEL (ch9_ce_count,S_IRUGO , + channel_ce_count_show,NULL ,9 ); +DEVICE_CHANNEL (ch10_ce_count,S_IRUGO , + channel_ce_count_show,NULL ,10 ); +DEVICE_CHANNEL (ch11_ce_count,S_IRUGO , + channel_ce_count_show,NULL ,11 );/* Total possible dynamic ce_count attribute file table */ static struct attribute *dynamic_csrow_ce_count_attr[] = {
@@ -340,6 +360,10 @@ static struct attribute *dynamic_csrow_c &dev_attr_legacy_ch5_ce_count.attr.attr, &dev_attr_legacy_ch6_ce_count.attr.attr, &dev_attr_legacy_ch7_ce_count.attr.attr, + &dev_attr_legacy_ch8_ce_count.attr.attr, + &dev_attr_legacy_ch9_ce_count.attr.attr, + &dev_attr_legacy_ch10_ce_count.attr.attr, + &dev_attr_legacy_ch11_ce_count.attr.attr, NULL };
Greg Kroah-Hartman
maintainerPATCH 30/207 selftests: Use optional USERCFLAGS and USERLDFLAGS
In reply to Greg Kroah-HartmanFrom: Mickaël Salaün <[email protected]>
commit de3ee3f63400a23954e7c1ad1cb8c20f29ab6fe3 upstream.
This change enables to extend CFLAGS and LDFLAGS from command line, e.g. to extend compiler checks: make USERCFLAGS=-Werror USERLDFLAGS=-static
USERCFLAGS and USERLDFLAGS are documented in Documentation/kbuild/makefiles.rst and Documentation/kbuild/kbuild.rst
This should be backported (down to 5.10) to improve previous kernel versions testing as well.
--- tools/testing/selftests/lib.mk | 5 +++++ 1 file changed, 5 insertions(+)
tools/testing/selftests/lib.mk +5 -0
@@ -123,6 +123,11 @@ endef clean: $(CLEAN) +# Enables to extend CFLAGS and LDFLAGS from command line, e.g. +# make USERCFLAGS=-Werror USERLDFLAGS=-static +CFLAGS += $(USERCFLAGS) +LDFLAGS += $(USERLDFLAGS) + # When make O= with kselftest target from main level # the following aren't defined. #
Greg Kroah-Hartman
maintainerPATCH 31/207 x86/MCE/AMD: Clear DFR errors found in THR handler
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
commit bc1b705b0eee4c645ad8b3bbff3c8a66e9688362 upstream.
AMD's MCA Thresholding feature counts errors of all severity levels, not just correctable errors. If a deferred error causes the threshold limit to be reached (it was the error that caused the overflow), then both a deferred error interrupt and a thresholding interrupt will be triggered.
The order of the interrupts is not guaranteed. If the threshold interrupt handler is executed first, then it will clear MCA_STATUS for the error. It will not check or clear MCA_DESTAT which also holds a copy of the deferred error. When the deferred error interrupt handler runs it will not find an error in MCA_STATUS, but it will find the error in MCA_DESTAT. This will cause two errors to be logged.
Check for deferred errors when handling a threshold interrupt. If a bank contains a deferred error, then clear the bank's MCA_DESTAT register.
Define a new helper function to do the deferred error check and clearing of MCA_DESTAT.
[ bp: Simplify, convert comment to passive voice. ]
--- arch/x86/kernel/cpu/mce/amd.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-)
arch/x86/kernel/cpu/mce/amd.c +20 -13
@@ -788,6 +788,24 @@ _log_error_bank(unsigned int bank, u32 mreturn status &MCI_STATUS_DEFERRED ; } +static bool _log_error_deferred (unsigned int bank,u32 misc) +{ +if (!_log_error_bank (bank,mca_msr_reg (bank,MCA_STATUS ), +mca_msr_reg (bank,MCA_ADDR ), misc)) +return false; + +/* +* Non-SMCA systems don't have MCA_DESTAT/MCA_DEADDR registers. +* Return true here to avoid accessing these registers. +*/ +if (!mce_flags.smca) +return true; + +/* Clear MCA_DESTAT if the deferred error was logged from MCA_STATUS. */ +wrmsrl (MSR_AMD64_SMCA_MCx_DESTAT (bank),0 ); +return true; +} +/* * We have three scenarios for checking for Deferred errors: *
@@ -799,19 +817,8 @@ _log_error_bank(unsigned int bank, u32 m*/ static void log_error_deferred (unsigned int bank) { -bool defrd; - - defrd =_log_error_bank (bank,mca_msr_reg (bank,MCA_STATUS ), -mca_msr_reg (bank,MCA_ADDR ),0 ); - -if (!mce_flags.smca) -return ; - -/* Clear MCA_DESTAT if we logged the deferred error from MCA_STATUS. */ -if (defrd) { -wrmsrl (MSR_AMD64_SMCA_MCx_DESTAT (bank),0 ); +if (_log_error_deferred (bank,0 ))return ; - }/* * Only deferred errors are logged in MCA_DE{STAT,ADDR} so just check
@@ -832,7 +839,7 @@ static void amd_deferred_error_interruptstatic void log_error_thresholding (unsigned int bank,u64 misc) { -_log_error_bank (bank,mca_msr_reg (bank,MCA_STATUS ),mca_msr_reg (bank,MCA_ADDR ), misc); +_log_error_deferred (bank, misc); }static void log_and_reset_block (struct threshold_block *block)
Greg Kroah-Hartman
maintainerPATCH 32/207 random: add helpers for random numbers with given floor or range
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit 7f576b2593a978451416424e75f69ad1e3ae4efe upstream.
Now that we have get_random_u32_below(), it's nearly trivial to make inline helpers to compute get_random_u32_above() and get_random_u32_inclusive(), which will help clean up open coded loops and manual computations throughout the tree.
One snag is that in order to make get_random_u32_inclusive() operate on closed intervals, we have to do some (unlikely) special case handling if get_random_u32_inclusive(0, U32_MAX) is called. The least expensive way of doing this is actually to adjust the slowpath of get_random_u32_below() to have its undefined 0 result just return the output of get_random_u32(). We can make this basically free by calling get_random_u32() before the branch, so that the branch latency gets interleaved.
--- drivers/char/random.c | 18 +++++++++++++++++- include/linux/random.h | 25 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-)
drivers/char/random.c +17 -1
@@ -161,6 +161,8 @@ EXPORT_SYMBOL(wait_for_random_bytes);* u16 get_random_u16() * u32 get_random_u32() * u32 get_random_u32_below(u32 ceil) +* u32 get_random_u32_above(u32 floor) +* u32 get_random_u32_inclusive(u32 floor, u32 ceil) * u64 get_random_u64() * unsigned long get_random_long() *
@@ -522,7 +524,21 @@ u32 __get_random_u32_below(u32 ceil)* of `-ceil % ceil` is analogous to `2^32 % ceil`, but is computable * in 32-bits. */ -u64 mult = (u64 )ceil *get_random_u32 (); +u32 rand =get_random_u32 (); +u64 mult; + +/* +* This function is technically undefined for ceil == 0, and in fact +* for the non-underscored constant version in the header, we build bug +* on that. But for the non-constant case, it's convenient to have that +* evaluate to being a straight call to get_random_u32(), so that +* get_random_u32_inclusive() can work over its whole range without +* undefined behavior. +*/ +if (unlikely (!ceil)) +return rand; + + mult = (u64 )ceil * rand;if (unlikely ((u32 )mult < ceil)) {u32 bound = -ceil % ceil;while (unlikely ((u32 )mult < bound))
include/linux/random.h +25 -0
@@ -92,6 +92,31 @@ static inline u32 get_random_u32_below(u }/* +* Returns a random integer in the interval (floor, U32_MAX], with uniform +* distribution, suitable for all uses. Fastest when floor is a constant, but +* still fast for variable floor as well. +*/ +static inline u32 get_random_u32_above (u32 floor) +{ +BUILD_BUG_ON_MSG (__builtin_constant_p (floor) && floor ==U32_MAX , +"get_random_u32_above() must take floor < U32_MAX" ); +return floor +1 +get_random_u32_below (U32_MAX - floor); +} + +/* +* Returns a random integer in the interval [floor, ceil], with uniform +* distribution, suitable for all uses. Fastest when floor and ceil are +* constant, but still fast for variable floor and ceil as well. +*/ +static inline u32 get_random_u32_inclusive (u32 floor,u32 ceil) +{ +BUILD_BUG_ON_MSG (__builtin_constant_p (floor) &&__builtin_constant_p (ceil) && + (floor > ceil || ceil - floor ==U32_MAX ), +"get_random_u32_inclusive() must take floor <= ceil" ); +return floor +get_random_u32_below (ceil - floor +1 ); +} + +/* * On 64-bit architectures, protect against non-terminated C string overflows * by zeroing out the first byte of the canary; this leaves 56 bits of entropy. */
Greg Kroah-Hartman
maintainerPATCH 33/207 PM/devfreq: governor: Add a private governor_data for governor
In reply to Greg Kroah-HartmanFrom: Kant Fan <[email protected]>
commit 5fdded8448924e3631d466eea499b11606c43640 upstream.
The member void *data in the structure devfreq can be overwrite by governor_userspace. For example:
1. The device driver assigned the devfreq governor to simple_ondemand by the function devfreq_add_device() and init the devfreq member void *data to a pointer of a static structure devfreq_simple_ondemand_data by the function devfreq_add_device().
2. The user changed the devfreq governor to userspace by the command "echo userspace > /sys/class/devfreq/.../governor".
3. The governor userspace alloced a dynamic memory for the struct userspace_data and assigend the member void *data of devfreq to this memory by the function userspace_init().
4. The user changed the devfreq governor back to simple_ondemand by the command "echo simple_ondemand > /sys/class/devfreq/.../governor".
5. The governor userspace exited and assigned the member void *data in the structure devfreq to NULL by the function userspace_exit().
6. The governor simple_ondemand fetched the static information of devfreq_simple_ondemand_data in the function devfreq_simple_ondemand_func() but the member void *data of devfreq was assigned to NULL by the function userspace_exit().
7. The information of upthreshold and downdifferential is lost and the governor simple_ondemand can't work correctly.
The member void *data in the structure devfreq is designed for a static pointer used in a governor and inited by the function devfreq_add_device(). This patch add an element named governor_data in the devfreq structure which can be used by a governor(E.g userspace) who want to assign a private data to do some private things.
--- drivers/devfreq/devfreq.c | 6 ++---- drivers/devfreq/governor_userspace.c | 12 ++++++------ include/linux/devfreq.h | 7 ++++--- 3 files changed, 12 insertions(+), 13 deletions(-)
drivers/devfreq/devfreq.c +2 -4
@@ -776,8 +776,7 @@ static void remove_sysfs_files(struct de* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. */ struct devfreq *devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile,
@@ -1011,8 +1010,7 @@ static void devm_devfreq_dev_release(str* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. * * This function manages automatically the memory of devfreq device using device * resource management and simplify the free operation for memory of devfreq
drivers/devfreq/governor_userspace.c +6 -6
@@ -21,7 +21,7 @@ struct userspace_data {static int devfreq_userspace_func (struct devfreq *df,unsigned long *freq) { -struct userspace_data *data = df->data; +struct userspace_data *data = df->governor_data;if (data->valid) *freq = data->user_frequency;
@@ -40,7 +40,7 @@ static ssize_t set_freq_store(struct devint err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;sscanf (buf,"%lu" , &wanted); data->user_frequency = wanted;
@@ -60,7 +60,7 @@ static ssize_t set_freq_show(struct deviint err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;if (data->valid) err =sprintf (buf,"%lu\n" , data->user_frequency);
@@ -91,7 +91,7 @@ static int userspace_init(struct devfreq goto out; } data->valid = false; - devfreq->data = data; + devfreq->governor_data = data; err =sysfs_create_group (&devfreq->dev.kobj, &dev_attr_group); out:
@@ -107,8 +107,8 @@ static void userspace_exit(struct devfreif (devfreq->dev.kobj.sd)sysfs_remove_group (&devfreq->dev.kobj, &dev_attr_group); -kfree (devfreq->data); - devfreq->data =NULL ; +kfree (devfreq->governor_data); + devfreq->governor_data =NULL ; } static int devfreq_userspace_handler(struct devfreq *devfreq,
include/linux/devfreq.h +4 -3
@@ -152,8 +152,8 @@ struct devfreq_stats {* @max_state: count of entry present in the frequency table. * @previous_freq: previously configured frequency value. * @last_status: devfreq user device info, performance statistics -* @data: Private data of the governor. The devfreq framework does not -* touch this. +* @data: devfreq driver pass to governors, governor should not change it. +* @governor_data: private data for governors, devfreq core doesn't touch it. * @user_min_freq_req: PM QoS minimum frequency request from user (via sysfs) * @user_max_freq_req: PM QoS maximum frequency request from user (via sysfs) * @scaling_min_freq: Limit minimum frequency requested by OPP interface
@@ -193,7 +193,8 @@ struct devfreq {unsigned long previous_freq;struct devfreq_dev_status last_status; -void *data;/* private data for governors */ +void *data; +void *governor_data;struct dev_pm_qos_request user_min_freq_req;struct dev_pm_qos_request user_max_freq_req;
Greg Kroah-Hartman
maintainerPATCH 34/207 cpufreq: Init completion before kobject_init_and_add()
In reply to Greg Kroah-HartmanFrom: Yongqiang Liu <[email protected]>
commit 5c51054896bcce1d33d39fead2af73fec24f40b6 upstream.
In cpufreq_policy_alloc(), it will call uninitialed completion in cpufreq_sysfs_release() when kobject_init_and_add() fails. And that will cause a crash such as the following page fault in complete:
BUG: unable to handle page fault for address: fffffffffffffff8 [..] RIP: 0010:complete+0x98/0x1f0 [..] Call Trace: kobject_put+0x1be/0x4c0 cpufreq_online.cold+0xee/0x1fd cpufreq_add_dev+0x183/0x1e0 subsys_interface_register+0x3f5/0x4e0 cpufreq_register_driver+0x3b7/0x670 acpi_cpufreq_init+0x56c/0x1000 [acpi_cpufreq] do_one_initcall+0x13d/0x780 do_init_module+0x1c3/0x630 load_module+0x6e67/0x73b0 __do_sys_finit_module+0x181/0x240 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
--- drivers/cpufreq/cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/cpufreq.c +1 -1
@@ -1207,6 +1207,7 @@ static struct cpufreq_policy *cpufreq_poif (!zalloc_cpumask_var (&policy->real_cpus,GFP_KERNEL )) goto err_free_rcpumask; +init_completion (&policy->kobj_unregister); ret =kobject_init_and_add (&policy->kobj, &ktype_cpufreq, cpufreq_global_kobject,"policy%u" , cpu);if (ret) {
@@ -1245,7 +1246,6 @@ static struct cpufreq_policy *cpufreq_poinit_rwsem (&policy->rwsem);spin_lock_init (&policy->transition_lock);init_waitqueue_head (&policy->transition_wait); -init_completion (&policy->kobj_unregister);INIT_WORK (&policy->update, handle_update); policy->cpu = cpu;
Greg Kroah-Hartman
maintainerPATCH 35/207 ext2: unbugger ext2_empty_dir()
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 27e714c007e4ad01837bf0fac5c11913a38d7695 upstream.
In 27cfa258951a "ext2: fix fs corruption when trying to remove a non-empty directory with IO error" a funny thing has happened:
- page = ext2_get_page(inode, i, dir_has_error, &page_addr);
+ page = ext2_get_page(inode, i, 0, &page_addr);
- if (IS_ERR(page)) {
- dir_has_error = 1;
- continue;
- }
+ if (IS_ERR(page))
+ goto not_empty;
And at not_empty: we hit ext2_put_page(page, page_addr), which does put_page(page). Which, unless I'm very mistaken, should oops immediately when given ERR_PTR(-E...) as page.
OK, shit happens, insufficiently tested patches included. But when commit in question describes the fault-injection test that exercised that particular failure exit...
Ow.
--- fs/ext2/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext2/dir.c +1 -1
@@ -679,7 +679,7 @@ int ext2_empty_dir (struct inode * inode page =ext2_get_page (inode, i,0 , &page_addr);if (IS_ERR (page)) - goto not_empty; +return 0 ; kaddr = page_addr; de = (ext2_dirent *)kaddr;
Greg Kroah-Hartman
maintainerPATCH 36/207 media: s5p-mfc: Fix to handle reference queue during finishing
In reply to Greg Kroah-HartmanFrom: Smitha T Murthy <[email protected]>
commit d8a46bc4e1e0446459daa77c4ce14218d32dacf9 upstream.
On receiving last buffer driver puts MFC to MFCINST_FINISHING state which in turn skips transferring of frame from SRC to REF queue. This causes driver to stop MFC encoding and last frame is lost.
This patch guarantees safe handling of frames during MFCINST_FINISHING and correct clearing of workbit to avoid early stopping of encoding.
--- drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c +10 -2
@@ -1218,6 +1218,7 @@ static int enc_post_frame_start(struct sunsigned long mb_y_addr, mb_c_addr;int slice_type;unsigned int strm_size; +bool src_ready; slice_type =s5p_mfc_hw_call (dev->mfc_ops, get_enc_slice_type, dev); strm_size =s5p_mfc_hw_call (dev->mfc_ops, get_enc_strm_size, dev);
@@ -1257,7 +1258,8 @@ static int enc_post_frame_start(struct s } } } -if ((ctx->src_queue_cnt >0 ) && (ctx->state ==MFCINST_RUNNING )) { +if (ctx->src_queue_cnt >0 && (ctx->state ==MFCINST_RUNNING || + ctx->state ==MFCINST_FINISHING )) { mb_entry = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);if (mb_entry->flags &MFC_BUF_FLAG_USED ) {
@@ -1288,7 +1290,13 @@ static int enc_post_frame_start(struct svb2_set_plane_payload (&mb_entry->b->vb2_buf,0 , strm_size);vb2_buffer_done (&mb_entry->b->vb2_buf,VB2_BUF_STATE_DONE ); } -if ((ctx->src_queue_cnt ==0 ) || (ctx->dst_queue_cnt ==0 )) + + src_ready = true; +if (ctx->state ==MFCINST_RUNNING && ctx->src_queue_cnt ==0 ) + src_ready = false; +if (ctx->state ==MFCINST_FINISHING && ctx->ref_queue_cnt ==0 ) + src_ready = false; +if (!src_ready || ctx->dst_queue_cnt ==0 )clear_work_bit (ctx);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 37/207 media: s5p-mfc: Clear workbit to handle error condition
In reply to Greg Kroah-HartmanFrom: Smitha T Murthy <[email protected]>
commit d3f3c2fe54e30b0636496d842ffbb5ad3a547f9b upstream.
During error on CLOSE_INSTANCE command, ctx_work_bits was not getting cleared. During consequent mfc execution NULL pointer dereferencing of this context led to kernel panic. This patch fixes this issue by making sure to clear ctx_work_bits always.
--- drivers/media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.c +3 -1
@@ -468,8 +468,10 @@ void s5p_mfc_close_mfc_inst(struct s5p_ms5p_mfc_hw_call (dev->mfc_ops, try_run, dev);/* Wait until instance is returned or timeout occurred */ if (s5p_mfc_wait_for_done_ctx (ctx, -S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET ,0 )) +S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET ,0 )){ +clear_work_bit_irqsave (ctx);mfc_err ("Err returning instance\n" ); + }/* Free resources */ s5p_mfc_hw_call (dev->mfc_ops, release_codec_buffers, ctx);
Greg Kroah-Hartman
maintainerPATCH 38/207 media: s5p-mfc: Fix in register read and write for H264
In reply to Greg Kroah-HartmanFrom: Smitha T Murthy <[email protected]>
commit 06710cd5d2436135046898d7e4b9408c8bb99446 upstream.
Few of the H264 encoder registers written were not getting reflected since the read values were not stored and getting overwritten.
--- drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c +7 -7
@@ -1060,7 +1060,7 @@ static int s5p_mfc_set_enc_params_h264(s }/* aspect ratio VUI */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<5 ); reg |= ((p_h264->vui_sar &0x1 ) <<5 );writel (reg, mfc_regs->e_h264_options);
@@ -1083,7 +1083,7 @@ static int s5p_mfc_set_enc_params_h264(s/* intra picture period for H.264 open GOP */ /* control */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<4 ); reg |= ((p_h264->open_gop &0x1 ) <<4 );writel (reg, mfc_regs->e_h264_options);
@@ -1097,23 +1097,23 @@ static int s5p_mfc_set_enc_params_h264(s }/* 'WEIGHTED_BI_PREDICTION' for B is disable */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x3 <<9 );writel (reg, mfc_regs->e_h264_options);/* 'CONSTRAINED_INTRA_PRED_ENABLE' is disable */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<14 );writel (reg, mfc_regs->e_h264_options);/* ASO */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<6 ); reg |= ((p_h264->aso &0x1 ) <<6 );writel (reg, mfc_regs->e_h264_options);/* hier qp enable */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<8 ); reg |= ((p_h264->open_gop &0x1 ) <<8 );writel (reg, mfc_regs->e_h264_options);
@@ -1134,7 +1134,7 @@ static int s5p_mfc_set_enc_params_h264(swritel (reg, mfc_regs->e_h264_num_t_layer);/* frame packing SEI generation */ -readl (mfc_regs->e_h264_options); + reg =readl (mfc_regs->e_h264_options); reg &= ~(0x1 <<25 ); reg |= ((p_h264->sei_frame_packing &0x1 ) <<25 );writel (reg, mfc_regs->e_h264_options);
Greg Kroah-Hartman
maintainerPATCH 39/207 bpf: Resolve fext program type when checking map compatibility
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 1c123c567fb138ebd187480b7fc0610fcb0851f5 ]
The bpf_prog_map_compatible() check makes sure that BPF program types are not mixed inside BPF map types that can contain programs (tail call maps, cpumaps and devmaps). It does this by setting the fields of the map->owner struct to the values of the first program being checked against, and rejecting any subsequent programs if the values don't match.
One of the values being set in the map owner struct is the program type, and since the code did not resolve the prog type for fext programs, the map owner type would be set to PROG_TYPE_EXT and subsequent loading of programs of the target type into the map would fail.
This bug is seen in particular for XDP programs that are loaded as PROG_TYPE_EXT using libxdp; these cannot insert programs into devmaps and cpumaps because the check fails as described above.
Fix the bug by resolving the fext program type to its target program type as elsewhere in the verifier.
v3:
- Add Yonghong's ACK
--- include/linux/bpf_verifier.h | 2 +- kernel/bpf/core.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-)
include/linux/bpf_verifier.h +1 -1
@@ -642,7 +642,7 @@ static inline u32 type_flag(u32 type) }/* only use after check_attach_btf_id() */ -static inline enum bpf_prog_type resolve_prog_type (struct bpf_prog *prog) +static inline enum bpf_prog_type resolve_prog_type (const struct bpf_prog *prog) {return prog->type ==BPF_PROG_TYPE_EXT ? prog->aux->dst_prog->type : prog->type;
kernel/bpf/core.c +3 -2
@@ -2088,6 +2088,7 @@ static unsigned int __bpf_prog_ret0_warn(const void *ctx,bool bpf_prog_map_compatible (struct bpf_map *map,const struct bpf_prog *fp) { +enum bpf_prog_type prog_type =resolve_prog_type (fp);bool ret;if (fp->kprobe_override)
@@ -2098,12 +2099,12 @@ bool bpf_prog_map_compatible(struct bpf_map *map,/* There's no owner yet where we could check for * compatibility. */ - map->owner.type = fp->type; + map->owner.type = prog_type; map->owner.jited = fp->jited; map->owner.xdp_has_frags = fp->aux->xdp_has_frags; ret = true; }else { - ret = map->owner.type == fp->type && + ret = map->owner.type == prog_type && map->owner.jited == fp->jited && map->owner.xdp_has_frags == fp->aux->xdp_has_frags; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/207 ALSA: patch_realtek: Fix Dell Inspiron Plus 16
In reply to Greg Kroah-HartmanFrom: Philipp Jungkamp <[email protected]>
[ Upstream commit 2912cdda734d9136615ed05636d9fcbca2a7a3c5 ]
The Dell Inspiron Plus 16, in both laptop and 2in1 form factor, has top speakers connected on NID 0x17, which the codec reports as unconnected. These speakers should be connected to the DAC on NID 0x03.
Stable-dep-of: a4517c4f3423 ("ALSA: hda/realtek: Apply dual codec fixup for Dell Latitude laptops")
--- sound/pci/hda/patch_realtek.c | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
sound/pci/hda/patch_realtek.c +37 -0
@@ -6903,6 +6903,34 @@ static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec, } } +static void alc295_fixup_dell_inspiron_top_speakers (struct hda_codec *codec, +const struct hda_fixup *fix,int action) +{ +static const struct hda_pintbl pincfgs[] = { + {0x14 ,0x90170151 }, + {0x17 ,0x90170150 }, + { } + }; +static const hda_nid_t conn[] = {0x02 ,0x03 }; +static const hda_nid_t preferred_pairs[] = { +0x14 ,0x02 , +0x17 ,0x03 , +0x21 ,0x02 , +0 + }; +struct alc_spec *spec = codec->spec; + +alc_fixup_no_shutup (codec, fix, action); + +switch (action) { +case HDA_FIXUP_ACT_PRE_PROBE : +snd_hda_apply_pincfgs (codec, pincfgs); +snd_hda_override_conn_list (codec,0x17 ,ARRAY_SIZE (conn), conn); + spec->gen.preferred_dacs = preferred_pairs; +break ; + } +} +enum {ALC269_FIXUP_GPIO2 ,ALC269_FIXUP_SONY_VAIO ,
@@ -7146,6 +7174,7 @@ enum {ALC287_FIXUP_LEGION_16ITHG6 ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN , + ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS, };/* A special fixup for Lenovo C940 and Yoga Duet 7;
@@ -9095,6 +9124,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK, }, + [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc295_fixup_dell_inspiron_top_speakers, + .chained = true, + .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, + }, }; static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -9195,6 +9230,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1028 ,0x0a9e ,"Dell Latitude 5430" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x0b19 ,"Dell XPS 15 9520" ,ALC289_FIXUP_DUAL_SPK ),SND_PCI_QUIRK (0x1028 ,0x0b1a ,"Dell Precision 5570" ,ALC289_FIXUP_DUAL_SPK ), +SND_PCI_QUIRK (0x1028 ,0x0b37 ,"Dell Inspiron 16 Plus 7620 2-in-1" ,ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS ), +SND_PCI_QUIRK (0x1028 ,0x0b71 ,"Dell Inspiron 16 Plus 7620" ,ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS ),SND_PCI_QUIRK (0x1028 ,0x164a ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x164b ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 41/207 ALSA: hda/realtek: Apply dual codec fixup for Dell Latitude laptops
In reply to Greg Kroah-HartmanFrom: Chris Chiu <[email protected]>
[ Upstream commit a4517c4f3423c7c448f2c359218f97c1173523a1 ]
The Dell Latiture 3340/3440/3540 laptops with Realtek ALC3204 have dual codecs and need the ALC1220_FIXUP_GB_DUAL_CODECS to fix the conflicts of Master controls. The existing headset mic fixup for Dell is also required to enable the jack sense and the headset mic.
Introduce a new fixup to fix the dual codec and headset mic issues for particular Dell laptops since other old Dell laptops with the same codec configuration are already well handled by the fixup in alc269_fallback_pin_fixup_tbl[].
--- sound/pci/hda/patch_realtek.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/pci/hda/patch_realtek.c +13 -0
@@ -7175,6 +7175,7 @@ enum {ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ,ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS , + ALC236_FIXUP_DELL_DUAL_CODECS, };/* A special fixup for Lenovo C940 and Yoga Duet 7;
@@ -9130,6 +9131,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, }, + [ALC236_FIXUP_DELL_DUAL_CODECS] = { + .type = HDA_FIXUP_PINS, + .v.func = alc1220_fixup_gb_dual_codecs, + .chained = true, + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, + }, }; static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -9232,6 +9239,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1028 ,0x0b1a ,"Dell Precision 5570" ,ALC289_FIXUP_DUAL_SPK ),SND_PCI_QUIRK (0x1028 ,0x0b37 ,"Dell Inspiron 16 Plus 7620 2-in-1" ,ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS ),SND_PCI_QUIRK (0x1028 ,0x0b71 ,"Dell Inspiron 16 Plus 7620" ,ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS ), +SND_PCI_QUIRK (0x1028 ,0x0c19 ,"Dell Precision 3340" ,ALC236_FIXUP_DELL_DUAL_CODECS ), +SND_PCI_QUIRK (0x1028 ,0x0c1a ,"Dell Precision 3340" ,ALC236_FIXUP_DELL_DUAL_CODECS ), +SND_PCI_QUIRK (0x1028 ,0x0c1b ,"Dell Precision 3440" ,ALC236_FIXUP_DELL_DUAL_CODECS ), +SND_PCI_QUIRK (0x1028 ,0x0c1c ,"Dell Precision 3540" ,ALC236_FIXUP_DELL_DUAL_CODECS ), +SND_PCI_QUIRK (0x1028 ,0x0c1d ,"Dell Precision 3440" ,ALC236_FIXUP_DELL_DUAL_CODECS ), +SND_PCI_QUIRK (0x1028 ,0x0c1e ,"Dell Precision 3540" ,ALC236_FIXUP_DELL_DUAL_CODECS ),SND_PCI_QUIRK (0x1028 ,0x164a ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x164b ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/207 platform/x86: thinkpad_acpi: Fix max_brightness of thinklight
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit db5e2a4ca0a7a5fe54f410590292ea2e91de6798 ]
Thinklight has only two values, on/off so it's reasonable for max_brightness to be 0 and 1 as if you write anything between 0 and 255 it will be 255 anyway so there's no point for it to be 255.
This may look like it is a userspace API change, but writes with a value larget then the new max_brightness will still be accepted, these will be silently clamped to the new max_brightness by led_set_brightness_nosleep(). So no userspace API problems are expected.
--- drivers/platform/x86/thinkpad_acpi.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/thinkpad_acpi.c +1 -0
@@ -5572,6 +5572,7 @@ static enum led_brightness light_sysfs_get(struct led_classdev *led_cdev)static struct tpacpi_led_classdev tpacpi_led_thinklight = { .led_classdev = { .name ="tpacpi::thinklight" , + .max_brightness =1 , .brightness_set_blocking = &light_sysfs_set, .brightness_get = &light_sysfs_get, }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 43/207 platform/x86: ideapad-laptop: Revert "check for touchpad support in _CFG"
In reply to Greg Kroah-HartmanFrom: Eray Orçunus <[email protected]>
[ Upstream commit 5831882880e9a1749553e78f9d8369fe33116aaf ]
Last 8 bit of _CFG started being used in later IdeaPads, thus 30th bit doesn't always show whether device supports touchpad or touchpad switch. Remove checking bit 30 of _CFG, so older IdeaPads like S10-3 can switch touchpad again via touchpad attribute.
This reverts commit b3ed1b7fe378 ("platform/x86: ideapad-laptop: check for touchpad support in _CFG").
--- drivers/platform/x86/ideapad-laptop.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/platform/x86/ideapad-laptop.c +5 -9
@@ -46,11 +46,10 @@ static const char *const ideapad_wmi_fnesc_events[] = {#endif enum { -CFG_CAP_BT_BIT =16 , -CFG_CAP_3G_BIT =17 , -CFG_CAP_WIFI_BIT =18 , -CFG_CAP_CAM_BIT =19 , -CFG_CAP_TOUCHPAD_BIT =30 , +CFG_CAP_BT_BIT =16 , +CFG_CAP_3G_BIT =17 , +CFG_CAP_WIFI_BIT =18 , +CFG_CAP_CAM_BIT =19 , };enum {
@@ -386,8 +385,6 @@ static int debugfs_cfg_show(struct seq_file *s, void *data)seq_puts (s," wifi" );if (test_bit (CFG_CAP_CAM_BIT , &priv->cfg))seq_puts (s," camera" ); -if (test_bit (CFG_CAP_TOUCHPAD_BIT , &priv->cfg)) -seq_puts (s," touchpad" );seq_puts (s,"\n" );seq_puts (s,"Graphics: " );
@@ -680,8 +677,7 @@ static umode_t ideapad_is_visible(struct kobject *kobj,else if (attr == &dev_attr_fn_lock.attr) supported = priv->features.fn_lock;else if (attr == &dev_attr_touchpad.attr) - supported = priv->features.touchpad_ctrl_via_ec && -test_bit (CFG_CAP_TOUCHPAD_BIT , &priv->cfg); + supported = priv->features.touchpad_ctrl_via_ec;else if (attr == &dev_attr_usb_charging.attr) supported = priv->features.usb_charging;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/207 platform/x86: ideapad-laptop: Add new _CFG bit numbers for future use
In reply to Greg Kroah-HartmanFrom: Eray Orçunus <[email protected]>
[ Upstream commit be5dd7d8359de9fb22115a63f09981cdf689db4f ]
Later IdeaPads report various things in last 8 bits of _CFG, at least 5 of them represent supported on-screen-displays. Add those bit numbers to the enum, and use CFG_OSD_ as prefix of their names. Also expose the values of these bits to debugfs, since they can be useful.
--- drivers/platform/x86/ideapad-laptop.c | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-)
drivers/platform/x86/ideapad-laptop.c +29 -4
@@ -46,10 +46,22 @@ static const char *const ideapad_wmi_fnesc_events[] = {#endif enum { -CFG_CAP_BT_BIT =16 , -CFG_CAP_3G_BIT =17 , -CFG_CAP_WIFI_BIT =18 , -CFG_CAP_CAM_BIT =19 , +CFG_CAP_BT_BIT =16 , +CFG_CAP_3G_BIT =17 , +CFG_CAP_WIFI_BIT =18 , +CFG_CAP_CAM_BIT =19 , + +/* +* These are OnScreenDisplay support bits that can be useful to determine +* whether a hotkey exists/should show OSD. But they aren't particularly +* meaningful since they were introduced later, i.e. 2010 IdeaPads +* don't have these, but they still have had OSD for hotkeys. +*/ +CFG_OSD_NUMLK_BIT =27 , +CFG_OSD_CAPSLK_BIT =28 , +CFG_OSD_MICMUTE_BIT =29 , +CFG_OSD_TOUCHPAD_BIT =30 , +CFG_OSD_CAM_BIT =31 , };enum {
@@ -387,6 +399,19 @@ static int debugfs_cfg_show(struct seq_file *s, void *data)seq_puts (s," camera" );seq_puts (s,"\n" ); +seq_puts (s,"OSD support:" ); +if (test_bit (CFG_OSD_NUMLK_BIT , &priv->cfg)) +seq_puts (s," num-lock" ); +if (test_bit (CFG_OSD_CAPSLK_BIT , &priv->cfg)) +seq_puts (s," caps-lock" ); +if (test_bit (CFG_OSD_MICMUTE_BIT , &priv->cfg)) +seq_puts (s," mic-mute" ); +if (test_bit (CFG_OSD_TOUCHPAD_BIT , &priv->cfg)) +seq_puts (s," touchpad" ); +if (test_bit (CFG_OSD_CAM_BIT , &priv->cfg)) +seq_puts (s," camera" ); +seq_puts (s,"\n" ); +seq_puts (s,"Graphics: " );switch (priv->cfg &0x700 ) {case 0x100 :
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/207 platform/x86: ideapad-laptop: support for more special keys in WMI
In reply to Greg Kroah-HartmanFrom: Philipp Jungkamp <[email protected]>
[ Upstream commit f32e02417614d3588a3954dab2a70320c43d1010 ]
The event data of the WMI event 0xD0, which is assumed to be the fn_lock, is used to indicate several special keys on newer Yoga 7/9 laptops.
The notify_id 0xD0 is non-unique in the DSDT of the Yoga 9 14IAP7, this causes wmi_get_event_data() to report wrong values.
Port the ideapad-laptop WMI code to the wmi bus infrastructure which does not suffer from the shortcomings of wmi_get_event_data().
--- drivers/platform/x86/ideapad-laptop.c | 261 ++++++++++++++++++++------ 1 file changed, 202 insertions(+), 59 deletions(-)
drivers/platform/x86/ideapad-laptop.c +202 -59
@@ -30,6 +30,7 @@#include <linux/seq_file.h> #include <linux/sysfs.h> #include <linux/types.h> +#include <linux/wmi.h> #include <acpi/video.h>
@@ -37,14 +38,6 @@#define IDEAPAD_RFKILL_DEV_NUM 3 -#if IS_ENABLED (CONFIG_ACPI_WMI ) -static const char *const ideapad_wmi_fnesc_events[] = { -"26CAB2E5-5CF1-46AE-AAC3-4A12B6BA50E6" ,/* Yoga 3 */ -"56322276-8493-4CE8-A783-98C991274F5E" ,/* Yoga 700 */ -"8FC0DE0C-B4E4-43FD-B0F3-8871711C1294" ,/* Legion 5 */ -}; -#endif -enum {CFG_CAP_BT_BIT =16 ,CFG_CAP_3G_BIT =17 ,
@@ -141,7 +134,6 @@ struct ideapad_private {struct ideapad_dytc_priv *dytc;struct dentry *debug;unsigned long cfg; -const char *fnesc_guid;struct {bool conservation_mode :1 ;bool dytc :1 ;
@@ -182,6 +174,42 @@ MODULE_PARM_DESC(set_fn_lock_led,"Enable driver based updates of the fn-lock LED on fn-lock changes. " "If you need this please report this to: [email protected]"); +/* +* shared data +*/ + +static struct ideapad_private *ideapad_shared; +static DEFINE_MUTEX (ideapad_shared_mutex); + +static int ideapad_shared_init (struct ideapad_private *priv) +{ +int ret; + +mutex_lock (&ideapad_shared_mutex); + +if (!ideapad_shared) { + ideapad_shared = priv; + ret =0 ; + }else { +dev_warn (&priv->adev->dev,"found multiple platform devices\n" ); + ret = -EINVAL ; + } + +mutex_unlock (&ideapad_shared_mutex); + +return ret; +} + +static void ideapad_shared_exit (struct ideapad_private *priv) +{ +mutex_lock (&ideapad_shared_mutex); + +if (ideapad_shared == priv) + ideapad_shared =NULL ; + +mutex_unlock (&ideapad_shared_mutex); +} +/* * ACPI Helpers */
@@ -1110,6 +1138,8 @@ static void ideapad_sysfs_exit(struct ideapad_private *priv)/* * input device */ +#define IDEAPAD_WMI_KEY 0x100 +static const struct key_entry ideapad_keymap[] = { {KE_KEY ,6 , {KEY_SWITCHVIDEOMODE } }, {KE_KEY ,7 , {KEY_CAMERA } },
@@ -1123,6 +1153,28 @@ static const struct key_entry ideapad_keymap[] = { { KE_KEY, 66, { KEY_TOUCHPAD_OFF } }, { KE_KEY, 67, { KEY_TOUCHPAD_ON } }, { KE_KEY, 128, { KEY_ESC } }, + +/* +* WMI keys +*/ + +/* FnLock (handled by the firmware) */ + { KE_IGNORE, 0x02 | IDEAPAD_WMI_KEY }, +/* Esc (handled by the firmware) */ + { KE_IGNORE, 0x03 | IDEAPAD_WMI_KEY }, +/* Customizable Lenovo Hotkey ("star" with 'S' inside) */ + { KE_KEY, 0x01 | IDEAPAD_WMI_KEY, { KEY_FAVORITES } }, +/* Dark mode toggle */ + { KE_KEY, 0x13 | IDEAPAD_WMI_KEY, { KEY_PROG1 } }, +/* Sound profile switch */ + { KE_KEY, 0x12 | IDEAPAD_WMI_KEY, { KEY_PROG2 } }, +/* Lenovo Virtual Background application */ + { KE_KEY, 0x28 | IDEAPAD_WMI_KEY, { KEY_PROG3 } }, +/* Lenovo Support */ + { KE_KEY, 0x27 | IDEAPAD_WMI_KEY, { KEY_HELP } }, +/* Refresh Rate Toggle */ + { KE_KEY, 0x0a | IDEAPAD_WMI_KEY, { KEY_DISPLAYTOGGLE } }, + { KE_END }, };
@@ -1526,33 +1578,6 @@ static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data) } } -#if IS_ENABLED (CONFIG_ACPI_WMI ) -static void ideapad_wmi_notify (u32 value,void *context) -{ -struct ideapad_private *priv = context; -unsigned long result; - -switch (value) { -case 128 : -ideapad_input_report (priv, value); -break ; -case 208 : -if (!priv->features.set_fn_lock_led) -break ; - -if (!eval_hals (priv->adev->handle, &result)) { -bool state =test_bit (HALS_FNLOCK_STATE_BIT , &result); - -exec_sals (priv->adev->handle, state ?SALS_FNLOCK_ON :SALS_FNLOCK_OFF ); - } -break ; -default : -dev_info (&priv->platform_device->dev, -"Unknown WMI event: %u\n" , value); - } -} -#endif -/* On some models we need to call exec_sals(SALS_FNLOCK_ON/OFF) to set the LED */ static const struct dmi_system_id set_fn_lock_led_list[] = { {
@@ -1643,6 +1668,118 @@ static void ideapad_check_features(struct ideapad_private *priv) } } +#if IS_ENABLED (CONFIG_ACPI_WMI ) +/* +* WMI driver +*/ +enum ideapad_wmi_event_type { +IDEAPAD_WMI_EVENT_ESC , +IDEAPAD_WMI_EVENT_FN_KEYS , +}; + +struct ideapad_wmi_private { +enum ideapad_wmi_event_type event; +}; + +static int ideapad_wmi_probe (struct wmi_device *wdev,const void *context) +{ +struct ideapad_wmi_private *wpriv; + + wpriv =devm_kzalloc (&wdev->dev,sizeof (*wpriv),GFP_KERNEL ); +if (!wpriv) +return -ENOMEM ; + + *wpriv = *(const struct ideapad_wmi_private *)context; + +dev_set_drvdata (&wdev->dev, wpriv); +return 0 ; +} + +static void ideapad_wmi_notify (struct wmi_device *wdev,union acpi_object *data) +{ +struct ideapad_wmi_private *wpriv =dev_get_drvdata (&wdev->dev); +struct ideapad_private *priv; +unsigned long result; + +mutex_lock (&ideapad_shared_mutex); + + priv = ideapad_shared; +if (!priv) + goto unlock; + +switch (wpriv->event) { +case IDEAPAD_WMI_EVENT_ESC : +ideapad_input_report (priv,128 ); +break ; +case IDEAPAD_WMI_EVENT_FN_KEYS : +if (priv->features.set_fn_lock_led && + !eval_hals (priv->adev->handle, &result)) { +bool state =test_bit (HALS_FNLOCK_STATE_BIT , &result); + +exec_sals (priv->adev->handle, state ?SALS_FNLOCK_ON :SALS_FNLOCK_OFF ); + } + +if (data->type !=ACPI_TYPE_INTEGER ) { +dev_warn (&wdev->dev, +"WMI event data is not an integer\n" ); +break ; + } + +dev_dbg (&wdev->dev,"WMI fn-key event: 0x%llx\n" , + data->integer.value); + +ideapad_input_report (priv, + data->integer.value |IDEAPAD_WMI_KEY ); + +break ; + } +unlock: +mutex_unlock (&ideapad_shared_mutex); +} + +static const struct ideapad_wmi_private ideapad_wmi_context_esc = { + .event =IDEAPAD_WMI_EVENT_ESC +}; + +static const struct ideapad_wmi_private ideapad_wmi_context_fn_keys = { + .event =IDEAPAD_WMI_EVENT_FN_KEYS +}; + +static const struct wmi_device_id ideapad_wmi_ids[] = { + {"26CAB2E5-5CF1-46AE-AAC3-4A12B6BA50E6" , &ideapad_wmi_context_esc },/* Yoga 3 */ + {"56322276-8493-4CE8-A783-98C991274F5E" , &ideapad_wmi_context_esc },/* Yoga 700 */ + {"8FC0DE0C-B4E4-43FD-B0F3-8871711C1294" , &ideapad_wmi_context_fn_keys },/* Legion 5 */ + {}, +}; +MODULE_DEVICE_TABLE (wmi, ideapad_wmi_ids); + +static struct wmi_driver ideapad_wmi_driver = { + .driver = { + .name ="ideapad_wmi" , + }, + .id_table = ideapad_wmi_ids, + .probe = ideapad_wmi_probe, + .notify = ideapad_wmi_notify, +}; + +static int ideapad_wmi_driver_register (void ) +{ +return wmi_driver_register (&ideapad_wmi_driver); +} + +static void ideapad_wmi_driver_unregister (void ) +{ +return wmi_driver_unregister (&ideapad_wmi_driver); +} + +#else +static inline int ideapad_wmi_driver_register (void ) {return 0 ; } +static inline void ideapad_wmi_driver_unregister (void ) { } +#endif + +/* +* ACPI driver +*/ static int ideapad_acpi_add (struct platform_device *pdev) {struct acpi_device *adev =ACPI_COMPANION (&pdev->dev);
@@ -1724,30 +1861,16 @@ static int ideapad_acpi_add(struct platform_device *pdev) goto notification_failed; } -#if IS_ENABLED (CONFIG_ACPI_WMI ) -for (i =0 ; i <ARRAY_SIZE (ideapad_wmi_fnesc_events); i++) { - status =wmi_install_notify_handler (ideapad_wmi_fnesc_events[i], - ideapad_wmi_notify, priv); -if (ACPI_SUCCESS (status)) { - priv->fnesc_guid = ideapad_wmi_fnesc_events[i]; -break ; - } - } - -if (ACPI_FAILURE (status) && status !=AE_NOT_EXIST ) { - err = -EIO ; - goto notification_failed_wmi; - } -#endif + err =ideapad_shared_init (priv); +if (err) + goto shared_init_failed;return 0 ; -#if IS_ENABLED (CONFIG_ACPI_WMI ) -notification_failed_wmi: +shared_init_failed:acpi_remove_notify_handler (priv->adev->handle,ACPI_DEVICE_NOTIFY , ideapad_acpi_notify); -#endif notification_failed:ideapad_backlight_exit (priv);
@@ -1773,10 +1896,7 @@ static int ideapad_acpi_remove(struct platform_device *pdev)struct ideapad_private *priv =dev_get_drvdata (&pdev->dev);int i; -#if IS_ENABLED (CONFIG_ACPI_WMI ) -if (priv->fnesc_guid) -wmi_remove_notify_handler (priv->fnesc_guid); -#endif +ideapad_shared_exit (priv); acpi_remove_notify_handler(priv->adev->handle, ACPI_DEVICE_NOTIFY,
@@ -1828,7 +1948,30 @@ static struct platform_driver ideapad_acpi_driver = { }, }; -module_platform_driver (ideapad_acpi_driver); +static int __init ideapad_laptop_init (void ) +{ +int err; + + err =ideapad_wmi_driver_register (); +if (err) +return err; + + err =platform_driver_register (&ideapad_acpi_driver); +if (err) { +ideapad_wmi_driver_unregister (); +return err; + } + +return 0 ; +} +module_init (ideapad_laptop_init) + +static void __exit ideapad_laptop_exit(void) +{ +ideapad_wmi_driver_unregister (); +platform_driver_unregister (&ideapad_acpi_driver); +} +module_exit(ideapad_laptop_exit) MODULE_AUTHOR("David Woodhouse <[email protected]>");MODULE_DESCRIPTION ("IdeaPad ACPI Extras" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/207 ACPI: video: Simplify __acpi_video_get_backlight_type()
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit a5df42521f328b45c9d89c13740e747be08ac66e ]
Simplify __acpi_video_get_backlight_type() removing a nested if which makes the flow harder to follow.
This also results in having only 1 exit point with return acpi_backlight_native instead of 2.
Note this drops the (video_caps & ACPI_VIDEO_BACKLIGHT) check from the if (acpi_osi_is_win8() && native_available) return native path. Windows 8's hardware certification requirements include that there must be ACPI video bus backlight control, so the ACPI_VIDEO_BACKLIGHT check is redundant.
--- drivers/acpi/video_detect.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-)
drivers/acpi/video_detect.c +17 -19
@@ -734,6 +734,16 @@ static bool google_cros_ec_present(void)return acpi_dev_found ("GOOG0004" ) ||acpi_dev_found ("GOOG000C" ); } +/* +* Windows 8 and newer no longer use the ACPI video interface, so it often +* does not work. So on win8+ systems prefer native brightness control. +* Chromebooks should always prefer native backlight control. +*/ +static bool prefer_native_over_acpi_video (void ) +{ +return acpi_osi_is_win8 () ||google_cros_ec_present (); +} +/* * Determine which type of backlight interface to use on this system, * First check cmdline, then dmi quirks, then do autodetect.
@@ -779,26 +789,14 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)if (apple_gmux_backlight_present ())return acpi_backlight_apple_gmux; -/* Chromebooks should always prefer native backlight control. */ -if (google_cros_ec_present () && native_available) -return acpi_backlight_native; +/* Use ACPI video if available, except when native should be preferred. */ +if ((video_caps &ACPI_VIDEO_BACKLIGHT ) && + !(native_available &&prefer_native_over_acpi_video ())) +return acpi_backlight_video; -/* On systems with ACPI video use either native or ACPI video. */ -if (video_caps &ACPI_VIDEO_BACKLIGHT ) { -/* -* Windows 8 and newer no longer use the ACPI video interface, -* so it often does not work. If the ACPI tables are written -* for win8 and native brightness ctl is available, use that. -* -* The native check deliberately is inside the if acpi-video -* block on older devices without acpi-video support native -* is usually not the best choice. -*/ -if (acpi_osi_is_win8 () && native_available) -return acpi_backlight_native; -else -return acpi_backlight_video; - } +/* Use native if available */ +if (native_available &&prefer_native_over_acpi_video ()) +return acpi_backlight_native;/* No ACPI video (old hw), use vendor specific fw methods. */ return acpi_backlight_vendor;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/207 ACPI: video: Prefer native over vendor
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit fb1836c91317e0770950260dfa91eb9b2170cb27 ]
When available prefer native backlight control over vendor backlight control.
Testing has shown that there are quite a few laptop models which rely on native backlight control (they don't have ACPI video bus backlight control) and on which acpi_osi_is_win8() returns false.
Currently __acpi_video_get_backlight_type() returns vendor on these laptops, leading to an empty /sys/class/backlight.
As a workaround for this acpi_video_backlight_use_native() has been temporarily changed to always return true.
This re-introduces the problem of having multiple backlight devices under /sys/class/backlight for a single panel.
Change __acpi_video_get_backlight_type() to prefer native over vendor when available. So that it returns native on these models.
And change acpi_video_backlight_use_native() back to only return true when __acpi_video_get_backlight_type() returns native.
--- drivers/acpi/video_detect.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-)
drivers/acpi/video_detect.c +3 -15
@@ -795,10 +795,10 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)return acpi_backlight_video;/* Use native if available */ -if (native_available &&prefer_native_over_acpi_video ()) +if (native_available)return acpi_backlight_native; -/* No ACPI video (old hw), use vendor specific fw methods. */ +/* No ACPI video/native (old hw), use vendor specific fw methods. */ return acpi_backlight_vendor; }
@@ -810,18 +810,6 @@ EXPORT_SYMBOL(acpi_video_get_backlight_type);bool acpi_video_backlight_use_native (void ) { -/* -* Call __acpi_video_get_backlight_type() to let it know that -* a native backlight is available. -*/ -__acpi_video_get_backlight_type (true); - -/* -* For now just always return true. There is a whole bunch of laptop -* models where (video_caps & ACPI_VIDEO_BACKLIGHT) is false causing -* __acpi_video_get_backlight_type() to return vendor, while these -* models only have a native backlight control. -*/ -return true; +return __acpi_video_get_backlight_type (true) == acpi_backlight_native; }EXPORT_SYMBOL (acpi_video_backlight_use_native);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/207 platform/x86: ideapad-laptop: Refactor ideapad_sync_touchpad_state()
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 289a59895e7a380cdc7fe2780d3073f4b9237020 ]
Add an error exit for read_ec_data() failing instead of putting the main body in an if (success) block.
--- drivers/platform/x86/ideapad-laptop.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)
drivers/platform/x86/ideapad-laptop.c +15 -12
@@ -1490,23 +1490,26 @@ static void ideapad_kbd_bl_exit(struct ideapad_private *priv)static void ideapad_sync_touchpad_state (struct ideapad_private *priv) {unsigned long value; +unsigned char param; +int ret;if (!priv->features.touchpad_ctrl_via_ec)return ;/* Without reading from EC touchpad LED doesn't switch state */ -if (!read_ec_data (priv->adev->handle,VPCCMD_R_TOUCHPAD , &value)) { -unsigned char param; -/* -* Some IdeaPads don't really turn off touchpad - they only -* switch the LED state. We (de)activate KBC AUX port to turn -* touchpad off and on. We send KEY_TOUCHPAD_OFF and -* KEY_TOUCHPAD_ON to not to get out of sync with LED -*/ -i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE ); -ideapad_input_report (priv, value ?67 :66 ); -sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); - } + ret =read_ec_data (priv->adev->handle,VPCCMD_R_TOUCHPAD , &value); +if (ret) +return ; + +/* +* Some IdeaPads don't really turn off touchpad - they only +* switch the LED state. We (de)activate KBC AUX port to turn +* touchpad off and on. We send KEY_TOUCHPAD_OFF and +* KEY_TOUCHPAD_ON to not to get out of sync with LED +*/ +i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE ); +ideapad_input_report (priv, value ?67 :66 ); +sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); }static void ideapad_acpi_notify (acpi_handle handle,u32 event,void *data)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/207 platform/x86: ideapad-laptop: Do not send KEY_TOUCHPAD* events on probe / resume
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit f4dd8c44bb831ff885680bc77111fa39c193a93f ]
The sending of KEY_TOUCHPAD* events is causing spurious touchpad OSD showing on resume.
Disable the sending of events on probe / resume to fix this.
--- drivers/platform/x86/ideapad-laptop.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/platform/x86/ideapad-laptop.c +9 -6
@@ -1487,7 +1487,7 @@ static void ideapad_kbd_bl_exit(struct ideapad_private *priv)/* * module init/exit */ -static void ideapad_sync_touchpad_state (struct ideapad_private *priv) +static void ideapad_sync_touchpad_state (struct ideapad_private *priv,bool send_events) {unsigned long value;unsigned char param;
@@ -1508,8 +1508,11 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv)* KEY_TOUCHPAD_ON to not to get out of sync with LED */ i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE ); -ideapad_input_report (priv, value ?67 :66 ); -sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); + +if (send_events) { +ideapad_input_report (priv, value ?67 :66 ); +sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); + } }static void ideapad_acpi_notify (acpi_handle handle,u32 event,void *data)
@@ -1550,7 +1553,7 @@ static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data)ideapad_sync_rfk_state (priv);break ;case 5 : -ideapad_sync_touchpad_state (priv); +ideapad_sync_touchpad_state (priv, true);break ;case 4 :ideapad_backlight_notify_brightness (priv);
@@ -1840,7 +1843,7 @@ static int ideapad_acpi_add(struct platform_device *pdev)ideapad_register_rfkill (priv, i);ideapad_sync_rfk_state (priv); -ideapad_sync_touchpad_state (priv); +ideapad_sync_touchpad_state (priv, false); err =ideapad_dytc_profile_init (priv);if (err) {
@@ -1925,7 +1928,7 @@ static int ideapad_acpi_resume(struct device *dev)struct ideapad_private *priv =dev_get_drvdata (dev);ideapad_sync_rfk_state (priv); -ideapad_sync_touchpad_state (priv); +ideapad_sync_touchpad_state (priv, false);if (priv->dytc)dytc_profile_refresh (priv);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/207 platform/x86: ideapad-laptop: Only toggle ps2 aux port on/off on select models
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit c69e7d843d2c34b80b8731a5dc57c34ea04a3edf ]
Recently there have been multiple patches to disable the ideapad-laptop's touchpad control code, because it is causing issues on various laptops:
Commit d69cd7eea93e ("platform/x86: ideapad-laptop: Disable touchpad_switch for ELAN0634") Commit a231224a601c ("platform/x86: ideapad-laptop: Disable touchpad_switch")
The turning on/off of the ps2 aux port was added specifically for the IdeaPad Z570, where the EC does toggle the touchpad on/off LED and toggles the value returned by reading VPCCMD_R_TOUCHPAD, but it does not actually turn on/off the touchpad.
The ideapad-laptop code really should not be messing with the i8042 controller on all devices just for this special case.
Add a new ctrl_ps2_aux_port flag set based on a DMI based allow-list for devices which need this workaround, populating it with just the Ideapad Z570 for now.
This also adds a module parameter so that this behavior can easily be enabled on other models which may need it.
--- drivers/platform/x86/ideapad-laptop.c | 29 ++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
drivers/platform/x86/ideapad-laptop.c +28 -1
@@ -143,6 +143,7 @@ struct ideapad_private { bool hw_rfkill_switch : 1; bool kbd_bl : 1; bool touchpad_ctrl_via_ec : 1; + bool ctrl_ps2_aux_port : 1; bool usb_charging : 1; } features;struct {
@@ -174,6 +175,12 @@ MODULE_PARM_DESC(set_fn_lock_led,"Enable driver based updates of the fn-lock LED on fn-lock changes. " "If you need this please report this to: [email protected]"); +static bool ctrl_ps2_aux_port; +module_param (ctrl_ps2_aux_port, bool,0444 ); +MODULE_PARM_DESC (ctrl_ps2_aux_port, +"Enable driver based PS/2 aux port en-/dis-abling on touchpad on/off toggle. " +"If you need this please report this to: [email protected]" ); +/* * shared data */
@@ -1507,7 +1514,8 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv, bool send_* touchpad off and on. We send KEY_TOUCHPAD_OFF and * KEY_TOUCHPAD_ON to not to get out of sync with LED */ -i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE ); +if (priv->features.ctrl_ps2_aux_port) +i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE );if (send_events) {ideapad_input_report (priv, value ?67 :66 );
@@ -1615,6 +1623,23 @@ static const struct dmi_system_id hw_rfkill_list[] = { {} }; +/* +* On some models the EC toggles the touchpad muted LED on touchpad toggle +* hotkey presses, but the EC does not actually disable the touchpad itself. +* On these models the driver needs to explicitly enable/disable the i8042 +* (PS/2) aux port. +*/ +static const struct dmi_system_id ctrl_ps2_aux_port_list[] = { + { +/* Lenovo Ideapad Z570 */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"Ideapad Z570" ), + }, + }, + {} +}; +static const struct dmi_system_id no_touchpad_switch_list[] = { { .ident ="Lenovo Yoga 3 Pro 1370" ,
@@ -1642,6 +1667,8 @@ static void ideapad_check_features(struct ideapad_private *priv) set_fn_lock_led ||dmi_check_system (set_fn_lock_led_list); priv->features.hw_rfkill_switch = hw_rfkill_switch ||dmi_check_system (hw_rfkill_list); + priv->features.ctrl_ps2_aux_port = + ctrl_ps2_aux_port ||dmi_check_system (ctrl_ps2_aux_port_list);/* Most ideapads with ELAN0634 touchpad don't use EC touchpad switch */ if (acpi_dev_present ("ELAN0634" ,NULL ,-1 ))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/207 platform/x86: ideapad-laptop: Send KEY_TOUCHPAD_TOGGLE on some models
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 5829f8a897e4f030cd2d32a930eea8954ab5dcd3 ]
On recent Ideapad models the EC does not control the touchpad at all, so instead of sending KEY_TOUCHPAD_ON/ _OFF on touchpad toggle hotkey events, ideapad-laptop should send KEY_TOUCHPAD_TOGGLE and let userspace handle the toggling.
Check for this by checking if the value read from VPCCMD_R_TOUCHPAD actually changes when receiving a touchpad-toggle hotkey event; and if it does not change send KEY_TOUCHPAD_TOGGLE to userspace to let userspace enable/disable the touchpad in software.
Note this also drops the priv->features.touchpad_ctrl_via_ec check from ideapad_sync_touchpad_state() so that KEY_TOUCHPAD_TOGGLE will be send on laptops where this is not set too. This can be safely dropped now because the i8042_command(I8042_CMD_AUX_ENABLE/_DISABLE) call is now guarded by its own feature flag.
--- drivers/platform/x86/ideapad-laptop.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
drivers/platform/x86/ideapad-laptop.c +19 -5
@@ -134,6 +134,7 @@ struct ideapad_private {struct ideapad_dytc_priv *dytc;struct dentry *debug;unsigned long cfg; +unsigned long r_touchpad_val;struct {bool conservation_mode :1 ;bool dytc :1 ;
@@ -650,6 +651,8 @@ static ssize_t touchpad_show(struct device *dev,if (err)return err; + priv->r_touchpad_val = result; +return sysfs_emit (buf,"%d\n" , !!result); }
@@ -669,6 +672,8 @@ static ssize_t touchpad_store(struct device *dev,if (err)return err; + priv->r_touchpad_val = state; +return count; }
@@ -1159,6 +1164,7 @@ static const struct key_entry ideapad_keymap[] = { { KE_KEY, 65, { KEY_PROG4 } }, { KE_KEY, 66, { KEY_TOUCHPAD_OFF } }, { KE_KEY, 67, { KEY_TOUCHPAD_ON } }, + { KE_KEY, 68, { KEY_TOUCHPAD_TOGGLE } }, { KE_KEY, 128, { KEY_ESC } },/*
@@ -1500,9 +1506,6 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv, bool send_unsigned char param;int ret; -if (!priv->features.touchpad_ctrl_via_ec) -return ; -/* Without reading from EC touchpad LED doesn't switch state */ ret =read_ec_data (priv->adev->handle,VPCCMD_R_TOUCHPAD , &value);if (ret)
@@ -1518,9 +1521,20 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv, bool send_i8042_command (¶m, value ?I8042_CMD_AUX_ENABLE :I8042_CMD_AUX_DISABLE );if (send_events) { -ideapad_input_report (priv, value ?67 :66 ); -sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); +/* +* On older models the EC controls the touchpad and toggles it +* on/off itself, in this case we report KEY_TOUCHPAD_ON/_OFF. +* If the EC did not toggle, report KEY_TOUCHPAD_TOGGLE. +*/ +if (value != priv->r_touchpad_val) { +ideapad_input_report (priv, value ?67 :66 ); +sysfs_notify (&priv->platform_device->dev.kobj,NULL ,"touchpad" ); + }else { +ideapad_input_report (priv,68 ); + } } + + priv->r_touchpad_val = value; }static void ideapad_acpi_notify (acpi_handle handle,u32 event,void *data)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/207 platform/x86: ideapad-laptop: Stop writing VPCCMD_W_TOUCHPAD at probe time
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit a10ba160d427e78ffa2ab15a86cacaec291fa58a ]
Commit d69cd7eea93e ("platform/x86: ideapad-laptop: Disable touchpad_switch for ELAN0634") from Janary 2021 added a flag hiding the touchpad sysfs-attr and disabling ideapad_sync_touchpad_state() because some devices "do not use EC to switch touchpad".
At the same time this added a write(VPCCMD_W_TOUCHPAD, 1) call at probe time on these same devices. This seems to be copied from the rfkill code which does something similar when hw rfkill support is disabled.
But for the rfkill code this is known to be necessary on some models, where as for the touchpad control no motivation is given for doing this and prior to this patch there were no reports of needing to do this.
So this seems unnecessary; and it is best to avoid poking the hardware unnecessary to avoid unwanted side effects, so remove this.
--- drivers/platform/x86/ideapad-laptop.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/platform/x86/ideapad-laptop.c +0 -4
@@ -1875,10 +1875,6 @@ static int ideapad_acpi_add(struct platform_device *pdev)if (!priv->features.hw_rfkill_switch)write_ec_cmd (priv->adev->handle,VPCCMD_W_RF ,1 ); -/* The same for Touchpad */ -if (!priv->features.touchpad_ctrl_via_ec) -write_ec_cmd (priv->adev->handle,VPCCMD_W_TOUCHPAD ,1 ); -for (i =0 ; i <IDEAPAD_RFKILL_DEV_NUM ; i++)if (test_bit (ideapad_rfk_data[i].cfgbit, &priv->cfg))ideapad_register_rfkill (priv, i);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/207 platform/x86: intel-uncore-freq: add Emerald Rapids support
In reply to Greg Kroah-HartmanFrom: Artem Bityutskiy <[email protected]>
[ Upstream commit 9c252ecf30360cb7b4dbcc275aebe5642174fd39 ]
Make Intel uncore frequency driver support Emerald Rapids by adding its CPU model to the match table.
Emerald Rapids uncore frequency control is the same as in Sapphire Rapids.
--- drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c +1 -0
@@ -203,6 +203,7 @@ static const struct x86_cpu_id intel_uncore_cpu_ids[] = {X86_MATCH_INTEL_FAM6_MODEL (ICELAKE_X ,NULL ),X86_MATCH_INTEL_FAM6_MODEL (ICELAKE_D ,NULL ),X86_MATCH_INTEL_FAM6_MODEL (SAPPHIRERAPIDS_X ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (EMERALDRAPIDS_X ,NULL ), {} };MODULE_DEVICE_TABLE (x86cpu, intel_uncore_cpu_ids);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/207 ALSA: hda/cirrus: Add extra 10 ms delay to allow PLL settle and lock.
In reply to Greg Kroah-HartmanFrom: Vitaly Rodionov <[email protected]>
[ Upstream commit 9fb9fa18fb50d1a33a1bd947681fce96fc2c8db6 ]
New HW platforms with multiple CS42L42 parts, faster CPU and i2c requre some extra delay to allow PLL to settle and lock. Adding extra 10ms delay.
--- sound/pci/hda/patch_cs8409.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_cs8409.c +1 -1
@@ -888,7 +888,7 @@ static void cs42l42_resume(struct sub_codec *cs42l42)/* Initialize CS42L42 companion codec */ cs8409_i2c_bulk_write (cs42l42, cs42l42->init_seq, cs42l42->init_seq_num); -usleep_range (20000 ,25000 ); +usleep_range (30000 ,35000 );/* Clear interrupts, by reading interrupt status registers */ cs8409_i2c_bulk_read (cs42l42, irq_regs,ARRAY_SIZE (irq_regs));
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/207 platform/x86: x86-android-tablets: Add Medion Lifetab S10346 data
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 902ce18ab1f4444ff9d49865bea35a07adcc03fd ]
The Medion Lifetab S10346 is a x86 ACPI tablet which ships with Android x86 as factory OS. Its DSDT contains a bunch of I2C devices which are not actually there, causing various resource conflicts. Enumeration of these is skipped through the acpi_quirk_skip_i2c_client_enumeration().
Add support for manually instantiating the I2C devices which are actually present on this tablet by adding the necessary device info to the x86-android-tablets module.
--- drivers/platform/x86/x86-android-tablets.c | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+)
drivers/platform/x86/x86-android-tablets.c +92 -0
@@ -987,6 +987,88 @@ static void lenovo_yoga_tab2_830_1050_exit(void) } } +/* Medion Lifetab S10346 tablets have an Android factory img with everything hardcoded */ +static const char *const medion_lifetab_s10346_accel_mount_matrix[] = { +"0" ,"1" ,"0" , +"1" ,"0" ,"0" , +"0" ,"0" ,"1" +}; + +static const struct property_entry medion_lifetab_s10346_accel_props[] = { +PROPERTY_ENTRY_STRING_ARRAY ("mount-matrix" , medion_lifetab_s10346_accel_mount_matrix), + { } +}; + +static const struct software_node medion_lifetab_s10346_accel_node = { + .properties = medion_lifetab_s10346_accel_props, +}; + +/* Note the LCD panel is mounted upside down, this is correctly indicated in the VBT */ +static const struct property_entry medion_lifetab_s10346_touchscreen_props[] = { +PROPERTY_ENTRY_BOOL ("touchscreen-inverted-x" ), +PROPERTY_ENTRY_BOOL ("touchscreen-swapped-x-y" ), + { } +}; + +static const struct software_node medion_lifetab_s10346_touchscreen_node = { + .properties = medion_lifetab_s10346_touchscreen_props, +}; + +static const struct x86_i2c_client_info medion_lifetab_s10346_i2c_clients[]__initconst = { + { +/* kxtj21009 accel */ + .board_info = { + .type ="kxtj21009" , + .addr =0x0f , + .dev_name ="kxtj21009" , + .swnode = &medion_lifetab_s10346_accel_node, + }, + .adapter_path ="\\_SB_.I2C3" , + .irq_data = { + .type =X86_ACPI_IRQ_TYPE_GPIOINT , + .chip ="INT33FC:02" , + .index =23 , + .trigger =ACPI_EDGE_SENSITIVE , + .polarity =ACPI_ACTIVE_HIGH , + }, + }, { +/* goodix touchscreen */ + .board_info = { + .type ="GDIX1001:00" , + .addr =0x14 , + .dev_name ="goodix_ts" , + .swnode = &medion_lifetab_s10346_touchscreen_node, + }, + .adapter_path ="\\_SB_.I2C4" , + .irq_data = { + .type =X86_ACPI_IRQ_TYPE_APIC , + .index =0x44 , + .trigger =ACPI_EDGE_SENSITIVE , + .polarity =ACPI_ACTIVE_LOW , + }, + }, +}; + +static struct gpiod_lookup_table medion_lifetab_s10346_goodix_gpios = { + .dev_id ="i2c-goodix_ts" , + .table = { +GPIO_LOOKUP ("INT33FC:01" ,26 ,"reset" ,GPIO_ACTIVE_HIGH ), +GPIO_LOOKUP ("INT33FC:02" ,3 ,"irq" ,GPIO_ACTIVE_HIGH ), + { } + }, +}; + +static struct gpiod_lookup_table *const medion_lifetab_s10346_gpios[] = { + &medion_lifetab_s10346_goodix_gpios, +NULL +}; + +static const struct x86_dev_info medion_lifetab_s10346_info__initconst = { + .i2c_client_info = medion_lifetab_s10346_i2c_clients, + .i2c_client_count =ARRAY_SIZE (medion_lifetab_s10346_i2c_clients), + .gpiod_lookup_tables = medion_lifetab_s10346_gpios, +}; +/* Nextbook Ares 8 tablets have an Android factory img with everything hardcoded */ static const char *const nextbook_ares8_accel_mount_matrix[] = {"0" ,"-1" ,"0" ,
@@ -1245,6 +1327,16 @@ static const struct dmi_system_id x86_android_tablet_ids[] __initconst = { }, .driver_data = (void *)&lenovo_yoga_tab2_830_1050_info, }, + { +/* Medion Lifetab S10346 */ + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"AMI Corporation" ), +DMI_MATCH (DMI_BOARD_NAME ,"Aptio CRB" ), +/* Above strings are much too generic, also match on BIOS date */ + DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"), + }, + .driver_data = (void *)&medion_lifetab_s10346_info, + }, {/* Nextbook Ares 8 */ .matches = {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/207 platform/x86: x86-android-tablets: Add Lenovo Yoga Tab 3 (YT3-X90F) charger + fuel-gauge data
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit b6c14ff1deaafd30036ec36d5205acd5a578b1cd ]
The Lenovo Yoga Tab 3 (YT3-X90F) is an Intel Cherry Trail based tablet which ships with Android as Factory OS. Its DSDT contains a bunch of I2C devices which are not actually there, causing various resource conflicts. Use acpi_quirk_skip_i2c_client_enumeration() to not enumerate these.
The YT3-X90F has quite a bit of exotic hardware, this adds initial support by manually instantiating the i2c-clients for the 2 charger + 2 fuel-gauge chips used for the 2 batteries.
Support for other parts of the hw will be added by follow-up patches.
--- drivers/platform/x86/x86-android-tablets.c | 135 ++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-)
drivers/platform/x86/x86-android-tablets.c +134 -1
@@ -5,7 +5,7 @@* devices typically have a bunch of things hardcoded, rather than specified * in their DSDT. * -* Copyright (C) 2021 Hans de Goede <[email protected]> +* Copyright (C) 2021-2022 Hans de Goede <[email protected]> */ #define pr_fmt (fmt) KBUILD_MODNAME ": " fmt
@@ -987,6 +987,130 @@ static void lenovo_yoga_tab2_830_1050_exit(void) } } +/* Lenovo Yoga Tab 3 Pro YT3-X90F */ + +/* +* There are 2 batteries, with 2 bq27500 fuel-gauges and 2 bq25892 chargers, +* "bq25890-charger-1" is instantiated from: drivers/i2c/busses/i2c-cht-wc.c. +*/ +static const char *const lenovo_yt3_bq25892_0_suppliers[] = {"cht_wcove_pwrsrc" }; +static const char *const bq25890_1_psy[] = {"bq25890-charger-1" }; + +static const struct property_entry fg_bq25890_1_supply_props[] = { +PROPERTY_ENTRY_STRING_ARRAY ("supplied-from" , bq25890_1_psy), + { } +}; + +static const struct software_node fg_bq25890_1_supply_node = { + .properties = fg_bq25890_1_supply_props, +}; + +/* bq25892 charger settings for the flat lipo battery behind the screen */ +static const struct property_entry lenovo_yt3_bq25892_0_props[] = { +PROPERTY_ENTRY_STRING_ARRAY ("supplied-from" , lenovo_yt3_bq25892_0_suppliers), +PROPERTY_ENTRY_STRING ("linux,power-supply-name" ,"bq25892-second-chrg" ), +PROPERTY_ENTRY_U32 ("linux,iinlim-percentage" ,40 ), +PROPERTY_ENTRY_BOOL ("linux,skip-reset" ), +/* Values taken from Android Factory Image */ +PROPERTY_ENTRY_U32 ("ti,charge-current" ,2048000 ), +PROPERTY_ENTRY_U32 ("ti,battery-regulation-voltage" ,4352000 ), +PROPERTY_ENTRY_U32 ("ti,termination-current" ,128000 ), +PROPERTY_ENTRY_U32 ("ti,precharge-current" ,128000 ), +PROPERTY_ENTRY_U32 ("ti,minimum-sys-voltage" ,3700000 ), +PROPERTY_ENTRY_U32 ("ti,boost-voltage" ,4998000 ), +PROPERTY_ENTRY_U32 ("ti,boost-max-current" ,500000 ), +PROPERTY_ENTRY_BOOL ("ti,use-ilim-pin" ), + { } +}; + +static const struct software_node lenovo_yt3_bq25892_0_node = { + .properties = lenovo_yt3_bq25892_0_props, +}; + +static const struct x86_i2c_client_info lenovo_yt3_i2c_clients[]__initconst = { + { +/* bq27500 fuel-gauge for the flat lipo battery behind the screen */ + .board_info = { + .type ="bq27500" , + .addr =0x55 , + .dev_name ="bq27500_0" , + .swnode = &fg_bq25890_supply_node, + }, + .adapter_path ="\\_SB_.PCI0.I2C1" , + }, { +/* bq25892 charger for the flat lipo battery behind the screen */ + .board_info = { + .type ="bq25892" , + .addr =0x6b , + .dev_name ="bq25892_0" , + .swnode = &lenovo_yt3_bq25892_0_node, + }, + .adapter_path ="\\_SB_.PCI0.I2C1" , + .irq_data = { + .type =X86_ACPI_IRQ_TYPE_GPIOINT , + .chip ="INT33FF:01" , + .index =5 , + .trigger =ACPI_EDGE_SENSITIVE , + .polarity =ACPI_ACTIVE_LOW , + }, + }, { +/* bq27500 fuel-gauge for the round li-ion cells in the hinge */ + .board_info = { + .type ="bq27500" , + .addr =0x55 , + .dev_name ="bq27500_1" , + .swnode = &fg_bq25890_1_supply_node, + }, + .adapter_path ="\\_SB_.PCI0.I2C2" , + } +}; + +static int __init lenovo_yt3_init (void ) +{ +struct gpio_desc *gpiod; +int ret; + +/* +* The "bq25892_0" charger IC has its /CE (Charge-Enable) and OTG pins +* connected to GPIOs, rather then having them hardwired to the correct +* values as is normally done. +* +* The bq25890_charger driver controls these through I2C, but this only +* works if not overridden by the pins. Set these pins here: +* 1. Set /CE to 0 to allow charging. +* 2. Set OTG to 0 disable V5 boost output since the 5V boost output of +* the main "bq25892_1" charger is used when necessary. +*/ + +/* /CE pin */ + ret =x86_android_tablet_get_gpiod ("INT33FF:02" ,22 , &gpiod); +if (ret <0 ) +return ret; + +/* +* The gpio_desc returned by x86_android_tablet_get_gpiod() is a "raw" +* gpio_desc, that is there is no way to pass lookup-flags like +* GPIO_ACTIVE_LOW. Set the GPIO to 0 here to enable charging since +* the /CE pin is active-low, but not marked as such in the gpio_desc. +*/ +gpiod_set_value (gpiod,0 ); + +/* OTG pin */ + ret =x86_android_tablet_get_gpiod ("INT33FF:03" ,19 , &gpiod); +if (ret <0 ) +return ret; + +gpiod_set_value (gpiod,0 ); + +return 0 ; +} + +static const struct x86_dev_info lenovo_yt3_info__initconst = { + .i2c_client_info = lenovo_yt3_i2c_clients, + .i2c_client_count =ARRAY_SIZE (lenovo_yt3_i2c_clients), + .init = lenovo_yt3_init, +}; +/* Medion Lifetab S10346 tablets have an Android factory img with everything hardcoded */ static const char *const medion_lifetab_s10346_accel_mount_matrix[] = {"0" ,"1" ,"0" ,
@@ -1327,6 +1451,15 @@ static const struct dmi_system_id x86_android_tablet_ids[] __initconst = { }, .driver_data = (void *)&lenovo_yoga_tab2_830_1050_info, }, + { +/* Lenovo Yoga Tab 3 Pro YT3-X90F */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Intel Corporation" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"CHERRYVIEW D1 PLATFORM" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), + }, + .driver_data = (void *)&lenovo_yt3_info, + }, {/* Medion Lifetab S10346 */ .matches = {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/207 platform/x86: x86-android-tablets: Add Advantech MICA-071 extra button
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit b03ae77e7e057f4b3b858f10c840557e71448a91 ]
The Advantech MICA-071 is a standard Windows tablet, but it has an extra "quick launch" button which is not described in the ACPI tables in anyway.
Use the x86-android-tablets infra to create a gpio-button device for this.
--- drivers/platform/x86/x86-android-tablets.c | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+)
drivers/platform/x86/x86-android-tablets.c +58 -0
@@ -265,6 +265,56 @@ static struct gpiod_lookup_table int3496_gpo2_pin22_gpios = { }, }; +/* +* Advantech MICA-071 +* This is a standard Windows tablet, but it has an extra "quick launch" button +* which is not described in the ACPI tables in anyway. +* Use the x86-android-tablets infra to create a gpio-button device for this. +*/ +static struct gpio_keys_button advantech_mica_071_button = { + .code =KEY_PROG1 , +/* .gpio gets filled in by advantech_mica_071_init() */ + .active_low = true, + .desc ="prog1_key" , + .type =EV_KEY , + .wakeup = false, + .debounce_interval =50 , +}; + +static const struct gpio_keys_platform_data advantech_mica_071_button_pdata__initconst = { + .buttons = &advantech_mica_071_button, + .nbuttons =1 , + .name ="prog1_key" , +}; + +static const struct platform_device_info advantech_mica_071_pdevs[]__initconst = { + { + .name ="gpio-keys" , + .id =PLATFORM_DEVID_AUTO , + .data = &advantech_mica_071_button_pdata, + .size_data =sizeof (advantech_mica_071_button_pdata), + }, +}; + +static int __init advantech_mica_071_init (void ) +{ +struct gpio_desc *gpiod; +int ret; + + ret =x86_android_tablet_get_gpiod ("INT33FC:00" ,2 , &gpiod); +if (ret <0 ) +return ret; + advantech_mica_071_button.gpio =desc_to_gpio (gpiod); + +return 0 ; +} + +static const struct x86_dev_info advantech_mica_071_info__initconst = { + .pdev_info = advantech_mica_071_pdevs, + .pdev_count =ARRAY_SIZE (advantech_mica_071_pdevs), + .init = advantech_mica_071_init, +}; +/* Asus ME176C and TF103C tablets shared data */ static struct gpio_keys_button asus_me176c_tf103c_lid = { .code =SW_LID ,
@@ -1385,6 +1435,14 @@ static const struct x86_dev_info xiaomi_mipad2_info __initconst = { };static const struct dmi_system_id x86_android_tablet_ids[]__initconst = { + { +/* Advantech MICA-071 */ + .matches = { +DMI_EXACT_MATCH (DMI_SYS_VENDOR ,"Advantech" ), +DMI_EXACT_MATCH (DMI_PRODUCT_NAME ,"MICA-071" ), + }, + .driver_data = (void *)&advantech_mica_071_info, + }, {/* Asus MeMO Pad 7 ME176C */ .matches = {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/207 HID: Ignore HP Envy x360 eu0009nv stylus battery
In reply to Greg Kroah-HartmanFrom: José Expósito <[email protected]>
[ Upstream commit cec827d658dd5c287ea8925737d45f0a60e47422 ]
Battery status is reported for the HP Envy x360 eu0009nv stylus even though it does not have battery.
Prevent it from always reporting the battery as low (1%).
--- drivers/hid/hid-ids.h | 1 + drivers/hid/hid-input.c | 2 ++ 2 files changed, 3 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -412,6 +412,7 @@#define USB_DEVICE_ID_HP_X2_10_COVER 0x0755#define I2C_DEVICE_ID_HP_ENVY_X360_15 0x2d05#define I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 0x29CF +#define I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV 0x2CF9#define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
drivers/hid/hid-input.c +2 -0
@@ -380,6 +380,8 @@ static const struct hid_device_id hid_battery_quirks[] = { HID_BATTERY_QUIRK_IGNORE }, {HID_I2C_DEVICE (USB_VENDOR_ID_ELAN ,I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 ), HID_BATTERY_QUIRK_IGNORE }, + { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV), + HID_BATTERY_QUIRK_IGNORE }, { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15), HID_BATTERY_QUIRK_IGNORE }, { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/207 ALSA: usb-audio: Add new quirk FIXED_RATE for JBL Quantum810 Wireless
In reply to Greg Kroah-HartmanFrom: Jaroslav Kysela <[email protected]>
[ Upstream commit fd28941cff1cd9d8ffa59fe11eb64148e09b6ed6 ]
It seems that the firmware is broken and does not accept the UAC_EP_CS_ATTR_SAMPLE_RATE URB. There is only one rate (48000Hz) available in the descriptors for the output endpoint.
Create a new quirk QUIRK_FLAG_FIXED_RATE to skip the rate setup when only one rate is available (fixed).
--- sound/usb/card.h | 1 + sound/usb/endpoint.c | 16 ++++++++++------ sound/usb/endpoint.h | 3 ++- sound/usb/implicit.c | 6 +++++- sound/usb/implicit.h | 2 +- sound/usb/pcm.c | 36 +++++++++++++++++++++++++++++++++--- sound/usb/pcm.h | 2 ++ sound/usb/quirks.c | 2 ++ sound/usb/usbaudio.h | 4 ++++ 9 files changed, 60 insertions(+), 12 deletions(-)
sound/usb/card.h +1 -0
@@ -131,6 +131,7 @@ struct snd_usb_endpoint {bool lowlatency_playback;/* low-latency playback mode */ bool need_setup;/* (re-)need for hw_params? */ bool need_prepare;/* (re-)need for prepare? */ +bool fixed_rate;/* skip rate setup */ /* for hw constraints */ const struct audioformat *cur_audiofmt;
sound/usb/endpoint.c +10 -6
@@ -769,7 +769,8 @@ struct snd_usb_endpoint * snd_usb_endpoint_open(struct snd_usb_audio *chip, const struct audioformat *fp, const struct snd_pcm_hw_params *params, - bool is_sync_ep) + bool is_sync_ep, + bool fixed_rate) { struct snd_usb_endpoint *ep;int ep_num = is_sync_ep ? fp->sync_ep : fp->endpoint;
@@ -825,6 +826,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip, ep->implicit_fb_sync = fp->implicit_fb; ep->need_setup = true; ep->need_prepare = true; + ep->fixed_rate = fixed_rate; usb_audio_dbg(chip, " channels=%d, rate=%d, format=%s, period_bytes=%d, periods=%d, implicit_fb=%d\n", ep->cur_channels, ep->cur_rate,
@@ -1413,11 +1415,13 @@ static int init_sample_rate(struct snd_usb_audio *chip,if (clock && !clock->need_setup)return 0 ; - err =snd_usb_init_sample_rate (chip, ep->cur_audiofmt, rate); -if (err <0 ) { -if (clock) - clock->rate =0 ;/* reset rate */ -return err; +if (!ep->fixed_rate) { + err =snd_usb_init_sample_rate (chip, ep->cur_audiofmt, rate); +if (err <0 ) { +if (clock) + clock->rate =0 ;/* reset rate */ +return err; + } }if (clock)
sound/usb/endpoint.h +2 -1
@@ -14,7 +14,8 @@ struct snd_usb_endpoint * snd_usb_endpoint_open(struct snd_usb_audio *chip, const struct audioformat *fp, const struct snd_pcm_hw_params *params, - bool is_sync_ep); + bool is_sync_ep, + bool fixed_rate);void snd_usb_endpoint_close (struct snd_usb_audio *chip,struct snd_usb_endpoint *ep); int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
sound/usb/implicit.c +5 -1
@@ -15,6 +15,7 @@#include "usbaudio.h" #include "card.h" #include "helper.h" +#include "pcm.h" #include "implicit.h" enum {
@@ -455,7 +456,8 @@ const struct audioformat * snd_usb_find_implicit_fb_sync_format(struct snd_usb_audio *chip, const struct audioformat *target, const struct snd_pcm_hw_params *params, - int stream) + int stream, + bool *fixed_rate) { struct snd_usb_substream *subs;const struct audioformat *fp, *sync_fmt =NULL ;
@@ -483,6 +485,8 @@ snd_usb_find_implicit_fb_sync_format(struct snd_usb_audio *chip, } } +if (fixed_rate) + *fixed_rate =snd_usb_pcm_has_fixed_rate (subs);return sync_fmt; }
sound/usb/implicit.h +1 -1
@@ -9,6 +9,6 @@ const struct audioformat * snd_usb_find_implicit_fb_sync_format(struct snd_usb_audio *chip, const struct audioformat *target, const struct snd_pcm_hw_params *params, - int stream); + int stream, bool *fixed_rate);#endif /* __USBAUDIO_IMPLICIT_H */
sound/usb/pcm.c +33 -3
@@ -157,6 +157,31 @@ find_substream_format(struct snd_usb_substream *subs, true, subs); } +bool snd_usb_pcm_has_fixed_rate (struct snd_usb_substream *subs) +{ +const struct audioformat *fp; +struct snd_usb_audio *chip = subs->stream->chip; +int rate =-1 ; + +if (!(chip->quirk_flags &QUIRK_FLAG_FIXED_RATE )) +return false; +list_for_each_entry (fp, &subs->fmt_list, list) { +if (fp->rates &SNDRV_PCM_RATE_CONTINUOUS ) +return false; +if (fp->nr_rates <1 ) +continue ; +if (fp->nr_rates >1 ) +return false; +if (rate <0 ) { + rate = fp->rate_table[0 ]; +continue ; + } +if (rate != fp->rate_table[0 ]) +return false; + } +return true; +} +static int init_pitch_v1 (struct snd_usb_audio *chip,int ep) {struct usb_device *dev = chip->dev;
@@ -450,12 +475,14 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,struct snd_usb_audio *chip = subs->stream->chip;const struct audioformat *fmt;const struct audioformat *sync_fmt; +bool fixed_rate, sync_fixed_rate;int ret; ret =snd_media_start_pipeline (subs);if (ret)return ret; + fixed_rate =snd_usb_pcm_has_fixed_rate (subs); fmt =find_substream_format (subs, hw_params);if (!fmt) { usb_audio_dbg(chip,
@@ -469,7 +496,8 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,if (fmt->implicit_fb) { sync_fmt =snd_usb_find_implicit_fb_sync_format (chip, fmt, hw_params, - !substream->stream); + !substream->stream, + &sync_fixed_rate);if (!sync_fmt) { usb_audio_dbg(chip, "cannot find sync format: ep=0x%x, iface=%d:%d, format=%s, rate=%d, channels=%d\n",
@@ -482,6 +510,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, } }else { sync_fmt = fmt; + sync_fixed_rate = fixed_rate; } ret =snd_usb_lock_shutdown (chip);
@@ -499,7 +528,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,close_endpoints (chip, subs); } - subs->data_endpoint =snd_usb_endpoint_open (chip, fmt, hw_params, false); + subs->data_endpoint =snd_usb_endpoint_open (chip, fmt, hw_params, false, fixed_rate);if (!subs->data_endpoint) { ret = -EINVAL ; goto unlock;
@@ -508,7 +537,8 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,if (fmt->sync_ep) { subs->sync_endpoint =snd_usb_endpoint_open (chip, sync_fmt, hw_params, - fmt == sync_fmt); + fmt == sync_fmt, + sync_fixed_rate);if (!subs->sync_endpoint) { ret = -EINVAL ; goto unlock;
sound/usb/pcm.h +2 -0
@@ -6,6 +6,8 @@ void snd_usb_set_pcm_ops(struct snd_pcm *pcm, int stream);int snd_usb_pcm_suspend (struct snd_usb_stream *as);int snd_usb_pcm_resume (struct snd_usb_stream *as); +bool snd_usb_pcm_has_fixed_rate (struct snd_usb_substream *as); +int snd_usb_init_pitch (struct snd_usb_audio *chip,const struct audioformat *fmt);void snd_usb_preallocate_buffer (struct snd_usb_substream *subs);
sound/usb/quirks.c +2 -0
@@ -2152,6 +2152,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_GENERIC_IMPLICIT_FB),DEVICE_FLG (0x0525 ,0xa4ad ,/* Hamedal C20 usb camero */ QUIRK_FLAG_IFACE_SKIP_CLOSE ), +DEVICE_FLG (0x0ecb ,0x2069 ,/* JBL Quantum810 Wireless */ +QUIRK_FLAG_FIXED_RATE ),/* Vendor matches */ VENDOR_FLG(0x045e, /* MS Lifecam */
sound/usb/usbaudio.h +4 -0
@@ -175,6 +175,9 @@ extern bool snd_usb_skip_validation;* QUIRK_FLAG_FORCE_IFACE_RESET * Force an interface reset whenever stopping & restarting a stream * (e.g. after xrun) +* QUIRK_FLAG_FIXED_RATE +* Do not set PCM rate (frequency) when only one rate is available +* for the given endpoint. */ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
@@ -198,5 +201,6 @@ extern bool snd_usb_skip_validation;#define QUIRK_FLAG_SKIP_IMPLICIT_FB (1U << 18)#define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19)#define QUIRK_FLAG_FORCE_IFACE_RESET (1U << 20) +#define QUIRK_FLAG_FIXED_RATE (1U << 21)#endif /* __USBAUDIO_H */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/207 fs: dlm: fix sock release if listen fails
In reply to Greg Kroah-HartmanFrom: Alexander Aring <[email protected]>
commit 08ae0547e75ec3d062b6b6b9cf4830c730df68df upstream.
This patch fixes a double sock_release() call when the listen() is called for the dlm lowcomms listen socket. The caller of dlm_listen_for_all should never care about releasing the socket if dlm_listen_for_all() fails, it's done now only once if listen() fails.
--- fs/dlm/lowcomms.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/dlm/lowcomms.c +1 -2
@@ -1820,7 +1820,7 @@ static int dlm_listen_for_all(void) result = sock->ops->listen (sock,5 );if (result <0 ) {dlm_close_sock (&listen_con.sock); - goto out; +return result; }return 0 ;
@@ -2023,7 +2023,6 @@ fail_listen: dlm_proto_ops =NULL ; fail_proto_ops: dlm_allow_conn =0 ; -dlm_close_sock (&listen_con.sock);work_stop (); fail_local:deinit_local ();
Greg Kroah-Hartman
maintainerPATCH 61/207 fs: dlm: retry accept() until -EAGAIN or error returns
In reply to Greg Kroah-HartmanFrom: Alexander Aring <[email protected]>
commit f0f4bb431bd543ed7bebbaea3ce326cfcd5388bc upstream.
This patch fixes a race if we get two times an socket data ready event while the listen connection worker is queued. Currently it will be served only once but we need to do it (in this case twice) until we hit -EAGAIN which tells us there is no pending accept going on.
This patch wraps an do while loop until we receive a return value which is different than 0 as it was done before commit d11ccd451b65 ("fs: dlm:
listen socket out of connection hash").
--- fs/dlm/lowcomms.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/dlm/lowcomms.c +5 -1
@@ -1543,7 +1543,11 @@ static void process_recv_sockets(structstatic void process_listen_recv_socket (struct work_struct *work) { -accept_from_sock (&listen_con); +int ret; + +do { + ret =accept_from_sock (&listen_con); + }while (!ret); }static void dlm_connect (struct connection *con)
Greg Kroah-Hartman
maintainerPATCH 62/207 mptcp: netlink: fix some error return code
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
commit e0fe1123ab2b07d2cd5475660bd0b4e6993ffaa7 upstream.
Fix to return negative error code -EINVAL from some error handling case instead of 0, as done elsewhere in those functions.
--- net/mptcp/pm_userspace.c | 4 ++++ 1 file changed, 4 insertions(+)
net/mptcp/pm_userspace.c +4 -0
@@ -156,6 +156,7 @@ int mptcp_nl_cmd_announce(struct sk_buffif (addr_val.addr.id ==0 || !(addr_val.flags &MPTCP_PM_ADDR_FLAG_SIGNAL )) {GENL_SET_ERR_MSG (info,"invalid addr id or flags" ); + err = -EINVAL ; goto announce_err; }
@@ -282,6 +283,7 @@ int mptcp_nl_cmd_sf_create(struct sk_bufif (addr_l.id ==0 ) {NL_SET_ERR_MSG_ATTR (info->extack, laddr,"missing local addr id" ); + err = -EINVAL ; goto create_err; }
@@ -395,11 +397,13 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buif (addr_l.family != addr_r.family) {GENL_SET_ERR_MSG (info,"address families do not match" ); + err = -EINVAL ; goto destroy_err; }if (!addr_l.port || !addr_r.port) {GENL_SET_ERR_MSG (info,"missing local or remote port" ); + err = -EINVAL ; goto destroy_err; }
Greg Kroah-Hartman
maintainerPATCH 63/207 mptcp: remove MPTCP ifdef in TCP SYN cookies
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 3fff88186f047627bb128d65155f42517f8e448f upstream.
To ease the maintenance, it is often recommended to avoid having #ifdef preprocessor conditions.
Here the section related to CONFIG_MPTCP was quite short but the next commit needs to add more code around. It is then cleaner to move specific MPTCP code to functions located in net/mptcp directory.
Now that mptcp_subflow_request_sock_ops structure can be static, it can also be marked as "read only after init".
--- include/net/mptcp.h | 12 ++++++++++-- net/ipv4/syncookies.c | 7 +++---- net/mptcp/subflow.c | 12 +++++++++++- 3 files changed, 24 insertions(+), 7 deletions(-)
include/net/mptcp.h +10 -2
@@ -97,8 +97,6 @@ struct mptcp_out_options { };#ifdef CONFIG_MPTCP -extern struct request_sock_ops mptcp_subflow_request_sock_ops; -void mptcp_init (void );static inline bool sk_is_mptcp (const struct sock *sk)
@@ -188,6 +186,9 @@ void mptcp_seq_show(struct seq_file *seqint mptcp_subflow_init_cookie_req (struct request_sock *req,const struct sock *sk_listener,struct sk_buff *skb); +struct request_sock *mptcp_subflow_reqsk_alloc (const struct request_sock_ops *ops, +struct sock *sk_listener, +bool attach_listener);__be32 mptcp_get_reset_option (const struct sk_buff *skb);
@@ -274,6 +275,13 @@ static inline int mptcp_subflow_init_coo return 0; /* TCP fallback */ } +static inline struct request_sock *mptcp_subflow_reqsk_alloc (const struct request_sock_ops *ops, +struct sock *sk_listener, +bool attach_listener) +{ +return NULL ; +} +static inline __be32 mptcp_reset_option (const struct sk_buff *skb) {return htonl (0u ); }#endif /* CONFIG_MPTCP */
net/ipv4/syncookies.c +3 -4
@@ -288,12 +288,11 @@ struct request_sock *cookie_tcp_reqsk_alstruct tcp_request_sock *treq;struct request_sock *req; -#ifdef CONFIG_MPTCP if (sk_is_mptcp (sk)) - ops = &mptcp_subflow_request_sock_ops; -#endif + req =mptcp_subflow_reqsk_alloc (ops, sk, false); +else + req =inet_reqsk_alloc (ops, sk, false); - req =inet_reqsk_alloc (ops, sk, false);if (!req)return NULL ;
net/mptcp/subflow.c +11 -1
@@ -529,7 +529,7 @@ static int subflow_v6_rebuild_header(str }#endif -struct request_sock_ops mptcp_subflow_request_sock_ops; +static struct request_sock_ops mptcp_subflow_request_sock_ops__ro_after_init ;static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops__ro_after_init ;static int subflow_v4_conn_request (struct sock *sk,struct sk_buff *skb)
@@ -582,6 +582,16 @@ drop: }#endif +struct request_sock *mptcp_subflow_reqsk_alloc (const struct request_sock_ops *ops, +struct sock *sk_listener, +bool attach_listener) +{ + ops = &mptcp_subflow_request_sock_ops; + +return inet_reqsk_alloc (ops, sk_listener, attach_listener); +} +EXPORT_SYMBOL (mptcp_subflow_reqsk_alloc); +/* validate hmac received in third ACK */ static bool subflow_hmac_valid (const struct request_sock *req,const struct mptcp_options_received *mp_opt)
Greg Kroah-Hartman
maintainerPATCH 64/207 mptcp: dedicated request sock for subflow in v6
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 34b21d1ddc8ace77a8fa35c1b1e06377209e0dae upstream.
tcp_request_sock_ops structure is specific to IPv4. It should then not be used with MPTCP subflows on top of IPv6.
For example, it contains the 'family' field, initialised to AF_INET. This 'family' field is used by TCP FastOpen code to generate the cookie but also by TCP Metrics, SELinux and SYN Cookies. Using the wrong family will not lead to crashes but displaying/using/checking wrong things.
Note that 'send_reset' callback from request_sock_ops structure is used in some error paths. It is then also important to use the correct one for IPv4 or IPv6.
The slab name can also be different in IPv4 and IPv6, it will be used when printing some log messages. The slab pointer will anyway be the same because the object size is the same for both v4 and v6. A BUILD_BUG_ON() has also been added to make sure this size is the same.
--- net/mptcp/subflow.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-)
net/mptcp/subflow.c +26 -8
@@ -529,7 +529,7 @@ static int subflow_v6_rebuild_header(str }#endif -static struct request_sock_ops mptcp_subflow_request_sock_ops__ro_after_init ; +static struct request_sock_ops mptcp_subflow_v4_request_sock_ops__ro_after_init ;static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops__ro_after_init ;static int subflow_v4_conn_request (struct sock *sk,struct sk_buff *skb)
@@ -542,7 +542,7 @@ static int subflow_v4_conn_request(strucif (skb_rtable (skb)->rt_flags & (RTCF_BROADCAST |RTCF_MULTICAST )) goto drop; -return tcp_conn_request (&mptcp_subflow_request_sock_ops, +return tcp_conn_request (&mptcp_subflow_v4_request_sock_ops, &subflow_request_sock_ipv4_ops, sk, skb); drop:
@@ -551,6 +551,7 @@ drop: }#if IS_ENABLED (CONFIG_MPTCP_IPV6 ) +static struct request_sock_ops mptcp_subflow_v6_request_sock_ops__ro_after_init ;static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops__ro_after_init ;static struct inet_connection_sock_af_ops subflow_v6_specific__ro_after_init ;static struct inet_connection_sock_af_ops subflow_v6m_specific__ro_after_init ;
@@ -573,7 +574,7 @@ static int subflow_v6_conn_request(strucreturn 0 ; } -return tcp_conn_request (&mptcp_subflow_request_sock_ops, +return tcp_conn_request (&mptcp_subflow_v6_request_sock_ops, &subflow_request_sock_ipv6_ops, sk, skb); drop:
@@ -586,7 +587,12 @@ struct request_sock *mptcp_subflow_reqsk struct sock *sk_listener, bool attach_listener) { - ops = &mptcp_subflow_request_sock_ops; +if (ops->family ==AF_INET ) + ops = &mptcp_subflow_v4_request_sock_ops; +#if IS_ENABLED (CONFIG_MPTCP_IPV6 ) + else if (ops->family == AF_INET6) + ops = &mptcp_subflow_v6_request_sock_ops; +#endif return inet_reqsk_alloc (ops, sk_listener, attach_listener); }
@@ -1914,7 +1920,6 @@ static struct tcp_ulp_ops subflow_ulp_opstatic int subflow_ops_init (struct request_sock_ops *subflow_ops) { subflow_ops->obj_size =sizeof (struct mptcp_subflow_request_sock ); - subflow_ops->slab_name ="request_sock_subflow" ; subflow_ops->slab = kmem_cache_create(subflow_ops->slab_name, subflow_ops->obj_size, 0,
@@ -1931,9 +1936,10 @@ static int subflow_ops_init(struct requevoid __init mptcp_subflow_init (void ) { - mptcp_subflow_request_sock_ops = tcp_request_sock_ops; -if (subflow_ops_init (&mptcp_subflow_request_sock_ops) !=0 ) -panic ("MPTCP: failed to init subflow request sock ops\n" ); + mptcp_subflow_v4_request_sock_ops = tcp_request_sock_ops; + mptcp_subflow_v4_request_sock_ops.slab_name ="request_sock_subflow_v4" ; +if (subflow_ops_init (&mptcp_subflow_v4_request_sock_ops) !=0 ) +panic ("MPTCP: failed to init subflow v4 request sock ops\n" ); subflow_request_sock_ipv4_ops = tcp_request_sock_ipv4_ops; subflow_request_sock_ipv4_ops.route_req = subflow_v4_route_req;
@@ -1948,6 +1954,18 @@ void __init mptcp_subflow_init(void) tcp_prot_override.release_cb = tcp_release_cb_override;#if IS_ENABLED (CONFIG_MPTCP_IPV6 ) +/* In struct mptcp_subflow_request_sock, we assume the TCP request sock +* structures for v4 and v6 have the same size. It should not changed in +* the future but better to make sure to be warned if it is no longer +* the case. +*/ +BUILD_BUG_ON (sizeof (struct tcp_request_sock ) !=sizeof (struct tcp6_request_sock )); + + mptcp_subflow_v6_request_sock_ops = tcp6_request_sock_ops; + mptcp_subflow_v6_request_sock_ops.slab_name ="request_sock_subflow_v6" ; +if (subflow_ops_init (&mptcp_subflow_v6_request_sock_ops) !=0 ) +panic ("MPTCP: failed to init subflow v6 request sock ops\n" ); + subflow_request_sock_ipv6_ops = tcp_request_sock_ipv6_ops; subflow_request_sock_ipv6_ops.route_req = subflow_v6_route_req;
Greg Kroah-Hartman
maintainerPATCH 65/207 mptcp: use proper req destructor for IPv6
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit d3295fee3c756ece33ac0d935e172e68c0a4161b upstream.
Before, only the destructor from TCP request sock in IPv4 was called even if the subflow was IPv6.
It is important to use the right destructor to avoid memory leaks with some advanced IPv6 features, e.g. when the request socks contain specific IPv6 options.
--- net/mptcp/subflow.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
net/mptcp/subflow.c +16 -3
@@ -45,7 +45,6 @@ static void subflow_req_destructor(strucsock_put ((struct sock *)subflow_req->msk);mptcp_token_destroy_request (req); - tcp_request_sock_ops.destructor (req); } static void subflow_generate_hmac(u64 key1, u64 key2, u32 nonce1, u32 nonce2,
@@ -550,6 +549,12 @@ drop:return 0 ; } +static void subflow_v4_req_destructor (struct request_sock *req) +{ +subflow_req_destructor (req); + tcp_request_sock_ops.destructor (req); +} +#if IS_ENABLED (CONFIG_MPTCP_IPV6 )static struct request_sock_ops mptcp_subflow_v6_request_sock_ops__ro_after_init ;static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops__ro_after_init ;
@@ -581,6 +586,12 @@ drop:tcp_listendrop (sk);return 0 ;/* don't send reset */ } + +static void subflow_v6_req_destructor (struct request_sock *req) +{ +subflow_req_destructor (req); + tcp6_request_sock_ops.destructor (req); +}#endif struct request_sock *mptcp_subflow_reqsk_alloc(const struct request_sock_ops *ops,
@@ -1929,8 +1940,6 @@ static int subflow_ops_init(struct requeif (!subflow_ops->slab)return -ENOMEM ; - subflow_ops->destructor = subflow_req_destructor; -return 0 ; }
@@ -1938,6 +1947,8 @@ void __init mptcp_subflow_init(void) { mptcp_subflow_v4_request_sock_ops = tcp_request_sock_ops; mptcp_subflow_v4_request_sock_ops.slab_name ="request_sock_subflow_v4" ; + mptcp_subflow_v4_request_sock_ops.destructor = subflow_v4_req_destructor; +if (subflow_ops_init (&mptcp_subflow_v4_request_sock_ops) !=0 )panic ("MPTCP: failed to init subflow v4 request sock ops\n" );
@@ -1963,6 +1974,8 @@ void __init mptcp_subflow_init(void) mptcp_subflow_v6_request_sock_ops = tcp6_request_sock_ops; mptcp_subflow_v6_request_sock_ops.slab_name ="request_sock_subflow_v6" ; + mptcp_subflow_v6_request_sock_ops.destructor = subflow_v6_req_destructor; +if (subflow_ops_init (&mptcp_subflow_v6_request_sock_ops) !=0 )panic ("MPTCP: failed to init subflow v6 request sock ops\n" );
Greg Kroah-Hartman
maintainerPATCH 66/207 dm cache: Fix ABBA deadlock between shrink_slab and dm_cache_metadata_abort
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit 352b837a5541690d4f843819028cf2b8be83d424 upstream.
Same ABBA deadlock pattern fixed in commit 4b60f452ec51 ("dm thin: Fix ABBA deadlock between shrink_slab and dm_pool_abort_metadata") to DM-cache's metadata.
--- drivers/md/dm-cache-metadata.c | 54 +++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-)
drivers/md/dm-cache-metadata.c +47 -7
@@ -551,11 +551,13 @@ static int __create_persistent_data_objereturn r; } -static void __destroy_persistent_data_objects (struct dm_cache_metadata *cmd) +static void __destroy_persistent_data_objects (struct dm_cache_metadata *cmd, +bool destroy_bm) {dm_sm_destroy (cmd->metadata_sm);dm_tm_destroy (cmd->tm); -dm_block_manager_destroy (cmd->bm); +if (destroy_bm) +dm_block_manager_destroy (cmd->bm); }typedef unsigned long (*flags_mutator )(unsigned long );
@@ -826,7 +828,7 @@ static struct dm_cache_metadata *lookup_ cmd2 =lookup (bdev);if (cmd2) {mutex_unlock (&table_lock); -__destroy_persistent_data_objects (cmd); +__destroy_persistent_data_objects (cmd, true);kfree (cmd);return cmd2; }
@@ -874,7 +876,7 @@ void dm_cache_metadata_close(struct dm_cmutex_unlock (&table_lock);if (!cmd->fail_io) -__destroy_persistent_data_objects (cmd); +__destroy_persistent_data_objects (cmd, true);kfree (cmd); } }
@@ -1807,14 +1809,52 @@ int dm_cache_metadata_needs_check(structint dm_cache_metadata_abort (struct dm_cache_metadata *cmd) { -int r; +int r = -EINVAL ; +struct dm_block_manager *old_bm =NULL , *new_bm =NULL ; + +/* fail_io is double-checked with cmd->root_lock held below */ +if (unlikely (cmd->fail_io)) +return r; + +/* +* Replacement block manager (new_bm) is created and old_bm destroyed outside of +* cmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of +* shrinker associated with the block manager's bufio client vs cmd root_lock). +* - must take shrinker_rwsem without holding cmd->root_lock +*/ + new_bm =dm_block_manager_create (cmd->bdev,DM_CACHE_METADATA_BLOCK_SIZE <<SECTOR_SHIFT , +CACHE_MAX_CONCURRENT_LOCKS );WRITE_LOCK (cmd); -__destroy_persistent_data_objects (cmd); - r =__create_persistent_data_objects (cmd, false); +if (cmd->fail_io) { +WRITE_UNLOCK (cmd); + goto out; + } + +__destroy_persistent_data_objects (cmd, false); + old_bm = cmd->bm; +if (IS_ERR (new_bm)) { +DMERR ("could not create block manager during abort" ); + cmd->bm =NULL ; + r =PTR_ERR (new_bm); + goto out_unlock; + } + + cmd->bm = new_bm; + r =__open_or_format_metadata (cmd, false); +if (r) { + cmd->bm =NULL ; + goto out_unlock; + } + new_bm =NULL ; +out_unlock:if (r) cmd->fail_io = true;WRITE_UNLOCK (cmd); +dm_block_manager_destroy (old_bm); +out: +if (new_bm && !IS_ERR (new_bm)) +dm_block_manager_destroy (new_bm);return r; }
Greg Kroah-Hartman
maintainerPATCH 67/207 dm thin: Fix ABBA deadlock between shrink_slab and dm_pool_abort_metadata
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
commit 8111964f1b8524c4bb56b02cd9c7a37725ea21fd upstream.
Following concurrent processes:
P1(drop cache) P2(kworker)drop_caches_sysctl_handler
drop_slab
shrink_slab
down_read(&shrinker_rwsem) - LOCK A
do_shrink_slab
super_cache_scan
prune_icache_sb
dispose_list
evict
ext4_evict_inode
ext4_clear_inode
ext4_discard_preallocations
ext4_mb_load_buddy_gfp
ext4_mb_init_cache
ext4_read_block_bitmap_nowait
ext4_read_bh_nowait
submit_bh
dm_submit_bio
do_worker
process_deferred_bios
commit
metadata_operation_failed
dm_pool_abort_metadata
down_write(&pmd->root_lock) - LOCK B
__destroy_persistent_data_objects
dm_block_manager_destroy
dm_bufio_client_destroy
unregister_shrinker
down_write(&shrinker_rwsem)
thin_map |
dm_thin_find_block ↓
down_read(&pmd->root_lock) --> ABBA deadlock, which triggers hung task:
[ 76.974820] INFO: task kworker/u4:3:63 blocked for more than 15 seconds. [ 76.976019] Not tainted 6.1.0-rc4-00011-g8f17dd350364-dirty #910 [ 76.978521] task:kworker/u4:3 state:D stack:0 pid:63 ppid:2 [ 76.978534] Workqueue: dm-thin do_worker [ 76.978552] Call Trace: [ 76.978564] __schedule+0x6ba/0x10f0 [ 76.978582] schedule+0x9d/0x1e0 [ 76.978588] rwsem_down_write_slowpath+0x587/0xdf0 [ 76.978600] down_write+0xec/0x110 [ 76.978607] unregister_shrinker+0x2c/0xf0 [ 76.978616] dm_bufio_client_destroy+0x116/0x3d0 [ 76.978625] dm_block_manager_destroy+0x19/0x40 [ 76.978629] __destroy_persistent_data_objects+0x5e/0x70 [ 76.978636] dm_pool_abort_metadata+0x8e/0x100 [ 76.978643] metadata_operation_failed+0x86/0x110 [ 76.978649] commit+0x6a/0x230 [ 76.978655] do_worker+0xc6e/0xd90 [ 76.978702] process_one_work+0x269/0x630 [ 76.978714] worker_thread+0x266/0x630 [ 76.978730] kthread+0x151/0x1b0 [ 76.978772] INFO: task test.sh:2646 blocked for more than 15 seconds. [ 76.979756] Not tainted 6.1.0-rc4-00011-g8f17dd350364-dirty #910 [ 76.982111] task:test.sh state:D stack:0 pid:2646 ppid:2459 [ 76.982128] Call Trace: [ 76.982139] __schedule+0x6ba/0x10f0 [ 76.982155] schedule+0x9d/0x1e0 [ 76.982159] rwsem_down_read_slowpath+0x4f4/0x910 [ 76.982173] down_read+0x84/0x170 [ 76.982177] dm_thin_find_block+0x4c/0xd0 [ 76.982183] thin_map+0x201/0x3d0 [ 76.982188] __map_bio+0x5b/0x350 [ 76.982195] dm_submit_bio+0x2b6/0x930 [ 76.982202] __submit_bio+0x123/0x2d0 [ 76.982209] submit_bio_noacct_nocheck+0x101/0x3e0 [ 76.982222] submit_bio_noacct+0x389/0x770 [ 76.982227] submit_bio+0x50/0xc0 [ 76.982232] submit_bh_wbc+0x15e/0x230 [ 76.982238] submit_bh+0x14/0x20 [ 76.982241] ext4_read_bh_nowait+0xc5/0x130 [ 76.982247] ext4_read_block_bitmap_nowait+0x340/0xc60 [ 76.982254] ext4_mb_init_cache+0x1ce/0xdc0 [ 76.982259] ext4_mb_load_buddy_gfp+0x987/0xfa0 [ 76.982263] ext4_discard_preallocations+0x45d/0x830 [ 76.982274] ext4_clear_inode+0x48/0xf0 [ 76.982280] ext4_evict_inode+0xcf/0xc70 [ 76.982285] evict+0x119/0x2b0 [ 76.982290] dispose_list+0x43/0xa0 [ 76.982294] prune_icache_sb+0x64/0x90 [ 76.982298] super_cache_scan+0x155/0x210 [ 76.982303] do_shrink_slab+0x19e/0x4e0 [ 76.982310] shrink_slab+0x2bd/0x450 [ 76.982317] drop_slab+0xcc/0x1a0 [ 76.982323] drop_caches_sysctl_handler+0xb7/0xe0 [ 76.982327] proc_sys_call_handler+0x1bc/0x300 [ 76.982331] proc_sys_write+0x17/0x20 [ 76.982334] vfs_write+0x3d3/0x570 [ 76.982342] ksys_write+0x73/0x160 [ 76.982347] __x64_sys_write+0x1e/0x30 [ 76.982352] do_syscall_64+0x35/0x80 [ 76.982357] entry_SYSCALL_64_after_hwframe+0x63/0xcd
Function metadata_operation_failed() is called when operations failed on dm pool metadata, dm pool will destroy and recreate metadata. So, shrinker will be unregistered and registered, which could down write shrinker_rwsem under pmd_write_lock.
Fix it by allocating dm_block_manager before locking pmd->root_lock and destroying old dm_block_manager after unlocking pmd->root_lock, then old dm_block_manager is replaced with new dm_block_manager under pmd->root_lock. So, shrinker register/unregister could be done without holding pmd->root_lock.
Fetch a reproducer in [Link].
--- drivers/md/dm-thin-metadata.c | 51 +++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 8 deletions(-)
drivers/md/dm-thin-metadata.c +43 -8
@@ -776,13 +776,15 @@ static int __create_persistent_data_objereturn r; } -static void __destroy_persistent_data_objects (struct dm_pool_metadata *pmd) +static void __destroy_persistent_data_objects (struct dm_pool_metadata *pmd, +bool destroy_bm) {dm_sm_destroy (pmd->data_sm);dm_sm_destroy (pmd->metadata_sm);dm_tm_destroy (pmd->nb_tm);dm_tm_destroy (pmd->tm); -dm_block_manager_destroy (pmd->bm); +if (destroy_bm) +dm_block_manager_destroy (pmd->bm); }static int __begin_transaction (struct dm_pool_metadata *pmd)
@@ -989,7 +991,7 @@ int dm_pool_metadata_close(struct dm_poo }pmd_write_unlock (pmd);if (!pmd->fail_io) -__destroy_persistent_data_objects (pmd); +__destroy_persistent_data_objects (pmd, true);kfree (pmd);return 0 ;
@@ -1860,19 +1862,52 @@ static void __set_abort_with_changes_flaint dm_pool_abort_metadata (struct dm_pool_metadata *pmd) {int r = -EINVAL ; +struct dm_block_manager *old_bm =NULL , *new_bm =NULL ; + +/* fail_io is double-checked with pmd->root_lock held below */ +if (unlikely (pmd->fail_io)) +return r; + +/* +* Replacement block manager (new_bm) is created and old_bm destroyed outside of +* pmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of +* shrinker associated with the block manager's bufio client vs pmd root_lock). +* - must take shrinker_rwsem without holding pmd->root_lock +*/ + new_bm =dm_block_manager_create (pmd->bdev,THIN_METADATA_BLOCK_SIZE <<SECTOR_SHIFT , +THIN_MAX_CONCURRENT_LOCKS );pmd_write_lock (pmd); -if (pmd->fail_io) +if (pmd->fail_io) { +pmd_write_unlock (pmd); goto out; + }__set_abort_with_changes_flags (pmd); -__destroy_persistent_data_objects (pmd); - r =__create_persistent_data_objects (pmd, false); +__destroy_persistent_data_objects (pmd, false); + old_bm = pmd->bm; +if (IS_ERR (new_bm)) { +DMERR ("could not create block manager during abort" ); + pmd->bm =NULL ; + r =PTR_ERR (new_bm); + goto out_unlock; + } + + pmd->bm = new_bm; + r =__open_or_format_metadata (pmd, false); +if (r) { + pmd->bm =NULL ; + goto out_unlock; + } + new_bm =NULL ; +out_unlock:if (r) pmd->fail_io = true; - -out:pmd_write_unlock (pmd); +dm_block_manager_destroy (old_bm); +out: +if (new_bm && !IS_ERR (new_bm)) +dm_block_manager_destroy (new_bm);return r; }
Greg Kroah-Hartman
maintainerPATCH 68/207 dm thin: Use last transactions pmd->root when commit failed
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
commit 7991dbff6849f67e823b7cc0c15e5a90b0549b9f upstream.
Recently we found a softlock up problem in dm thin pool btree lookup code due to corrupted metadata:
Kernel panic - not syncing: softlockup: hung tasks CPU: 7 PID: 2669225 Comm: kworker/u16:3 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) Workqueue: dm-thin do_worker [dm_thin_pool] Call Trace: <IRQ> dump_stack+0x9c/0xd3 panic+0x35d/0x6b9 watchdog_timer_fn.cold+0x16/0x25 __run_hrtimer+0xa2/0x2d0 </IRQ> RIP: 0010:__relink_lru+0x102/0x220 [dm_bufio] __bufio_new+0x11f/0x4f0 [dm_bufio] new_read+0xa3/0x1e0 [dm_bufio] dm_bm_read_lock+0x33/0xd0 [dm_persistent_data] ro_step+0x63/0x100 [dm_persistent_data] btree_lookup_raw.constprop.0+0x44/0x220 [dm_persistent_data] dm_btree_lookup+0x16f/0x210 [dm_persistent_data] dm_thin_find_block+0x12c/0x210 [dm_thin_pool] __process_bio_read_only+0xc5/0x400 [dm_thin_pool] process_thin_deferred_bios+0x1a4/0x4a0 [dm_thin_pool] process_one_work+0x3c5/0x730
Following process may generate a broken btree mixed with fresh and stale btree nodes, which could get dm thin trapped in an infinite loop while looking up data block:
Transaction 1: pmd->root = A, A->B->C // One path in btree
pmd->root = X, X->Y->Z // Copy-up
Transaction 2: X,Z is updated on disk, Y write failed.
// Commit failed, dm thin becomes read-only.
process_bio_read_only
dm_thin_find_block
__find_block
dm_btree_lookup(pmd->root)The pmd->root points to a broken btree, Y may contain stale node pointing to any block, for example X, which gets dm thin trapped into a dead loop while looking up Z.
Fix this by setting pmd->root in __open_metadata(), so that dm thin will use the last transaction's pmd->root if commit failed.
Fetch a reproducer in [Link].
Linke: https://bugzilla.kernel.org/show_bug.cgi?id=216790
--- drivers/md/dm-thin-metadata.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/md/dm-thin-metadata.c +9 -0
@@ -724,6 +724,15 @@ static int __open_metadata(struct dm_poo goto bad_cleanup_data_sm; } +/* +* For pool metadata opening process, root setting is redundant +* because it will be set again in __begin_transaction(). But dm +* pool aborting process really needs to get last transaction's +* root to avoid accessing broken btree. +*/ + pmd->root =le64_to_cpu (disk_super->data_mapping_root); + pmd->details_root =le64_to_cpu (disk_super->device_details_root); +__setup_btree_details (pmd);dm_bm_unlock (sblock);
Greg Kroah-Hartman
maintainerPATCH 69/207 dm thin: resume even if in FAIL mode
In reply to Greg Kroah-HartmanFrom: Luo Meng <[email protected]>
commit 19eb1650afeb1aa86151f61900e9e5f1de5d8d02 upstream.
If a thinpool set fail_io while suspending, resume will fail with:
device-mapper: resume ioctl on vg-thinpool failed: Invalid argument
The thin-pool also can't be removed if an in-flight bio is in the deferred list.
This can be easily reproduced using:
echo "offline" > /sys/block/sda/device/state dd if=/dev/zero of=/dev/mapper/thin bs=4K count=1 dmsetup suspend /dev/mapper/pool mkfs.ext4 /dev/mapper/thin
dmsetup resume /dev/mapper/pool
The root cause is maybe_resize_data_dev() will check fail_io and return error before called dm_resume.
Fix this by adding FAIL mode check at the end of pool_preresume().
--- drivers/md/dm-thin.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/md/dm-thin.c +12 -4
@@ -3540,20 +3540,28 @@ static int pool_preresume(struct dm_targ*/ r =bind_control_target (pool, ti);if (r) -return r; + goto out; r =maybe_resize_data_dev (ti, &need_commit1);if (r) -return r; + goto out; r =maybe_resize_metadata_dev (ti, &need_commit2);if (r) -return r; + goto out;if (need_commit1 || need_commit2) (void )commit (pool); +out: +/* +* When a thin-pool is PM_FAIL, it cannot be rebuilt if +* bio is in deferred list. Therefore need to return 0 +* to allow pool_resume() to flush IO. +*/ +if (r &&get_pool_mode (pool) ==PM_FAIL ) + r =0 ; -return 0 ; +return r; }static void pool_suspend_active_thins (struct pool *pool)
Greg Kroah-Hartman
maintainerPATCH 70/207 dm thin: Fix UAF in run_timer_softirq()
In reply to Greg Kroah-HartmanFrom: Luo Meng <[email protected]>
commit 88430ebcbc0ec637b710b947738839848c20feff upstream.
When dm_resume() and dm_destroy() are concurrent, it will lead to UAF, as follows:
BUG: KASAN: use-after-free in __run_timers+0x173/0x710 Write of size 8 at addr ffff88816d9490f0 by task swapper/0/0 <snip> Call Trace: <IRQ> dump_stack_lvl+0x73/0x9f print_report.cold+0x132/0xaa2 _raw_spin_lock_irqsave+0xcd/0x160 __run_timers+0x173/0x710 kasan_report+0xad/0x110 __run_timers+0x173/0x710 __asan_store8+0x9c/0x140 __run_timers+0x173/0x710 call_timer_fn+0x310/0x310 pvclock_clocksource_read+0xfa/0x250 kvm_clock_read+0x2c/0x70 kvm_clock_get_cycles+0xd/0x20 ktime_get+0x5c/0x110 lapic_next_event+0x38/0x50 clockevents_program_event+0xf1/0x1e0 run_timer_softirq+0x49/0x90 __do_softirq+0x16e/0x62c __irq_exit_rcu+0x1fa/0x270 irq_exit_rcu+0x12/0x20 sysvec_apic_timer_interrupt+0x8e/0xc0
One of the concurrency UAF can be shown as below:
use free
do_resume |
__find_device_hash_cell |
dm_get |
atomic_inc(&md->holders) |
| dm_destroy
| __dm_destroy
| if (!dm_suspended_md(md))
| atomic_read(&md->holders)
| msleep(1)
dm_resume |
__dm_resume |
dm_table_resume_targets |
pool_resume |
do_waker #add delay work |
dm_put |
atomic_dec(&md->holders) |
| dm_table_destroy
| pool_dtr
| __pool_dec
| __pool_destroy
| destroy_workqueue
| kfree(pool) # free pool time out__do_softirq
run_timer_softirq # pool has already been freed
This can be easily reproduced using:
1. create thin-pool
2. dmsetup suspend pool
3. dmsetup resume pool
4. dmsetup remove_all # Concurrent with 3
The root cause of this UAF bug is that dm_resume() adds timer after dm_destroy() skips cancelling the timer because of suspend status. After timeout, it will call run_timer_softirq(), however pool has already been freed. The concurrency UAF bug will happen.
Therefore, cancelling timer again in __pool_destroy().
--- drivers/md/dm-thin.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/dm-thin.c +2 -0
@@ -2889,6 +2889,8 @@ static void __pool_destroy(struct pool *dm_bio_prison_destroy (pool->prison);dm_kcopyd_client_destroy (pool->copier); +cancel_delayed_work_sync (&pool->waker); +cancel_delayed_work_sync (&pool->no_space_timeout);if (pool->wq)destroy_workqueue (pool->wq);
Greg Kroah-Hartman
maintainerPATCH 71/207 dm integrity: Fix UAF in dm_integrity_dtr()
In reply to Greg Kroah-HartmanFrom: Luo Meng <[email protected]>
commit f50cb2cbabd6c4a60add93d72451728f86e4791c upstream.
Dm_integrity also has the same UAF problem when dm_resume() and dm_destroy() are concurrent.
Therefore, cancelling timer again in dm_integrity_dtr().
--- drivers/md/dm-integrity.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/dm-integrity.c +2 -0
@@ -4558,6 +4558,8 @@ static void dm_integrity_dtr(struct dm_tBUG_ON (!RB_EMPTY_ROOT (&ic->in_progress));BUG_ON (!list_empty (&ic->wait_list)); +if (ic->mode =='B' ) +cancel_delayed_work_sync (&ic->bitmap_flush_work);if (ic->metadata_wq)destroy_workqueue (ic->metadata_wq);if (ic->wait_wq)
Greg Kroah-Hartman
maintainerPATCH 72/207 dm clone: Fix UAF in clone_dtr()
In reply to Greg Kroah-HartmanFrom: Luo Meng <[email protected]>
commit e4b5957c6f749a501c464f92792f1c8e26b61a94 upstream.
Dm_clone also has the same UAF problem when dm_resume() and dm_destroy() are concurrent.
Therefore, cancelling timer again in clone_dtr().
--- drivers/md/dm-clone-target.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-clone-target.c +1 -0
@@ -1958,6 +1958,7 @@ static void clone_dtr(struct dm_target *mempool_exit (&clone->hydration_pool);dm_kcopyd_client_destroy (clone->kcopyd_client); +cancel_delayed_work_sync (&clone->waker);destroy_workqueue (clone->wq);hash_table_exit (clone);dm_clone_metadata_close (clone->cmd);
Greg Kroah-Hartman
maintainerPATCH 73/207 dm cache: Fix UAF in destroy()
In reply to Greg Kroah-HartmanFrom: Luo Meng <[email protected]>
commit 6a459d8edbdbe7b24db42a5a9f21e6aa9e00c2aa upstream.
Dm_cache also has the same UAF problem when dm_resume() and dm_destroy() are concurrent.
Therefore, cancelling timer again in destroy().
--- drivers/md/dm-cache-target.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-cache-target.c +1 -0
@@ -1887,6 +1887,7 @@ static void destroy(struct cache *cache)if (cache->prison)dm_bio_prison_destroy_v2 (cache->prison); +cancel_delayed_work_sync (&cache->waker);if (cache->wq)destroy_workqueue (cache->wq);
Greg Kroah-Hartman
maintainerPATCH 74/207 dm cache: set needs_check flag after aborting metadata
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit 6b9973861cb2e96dcd0bb0f1baddc5c034207c5c upstream.
Otherwise the commit that will be aborted will be associated with the metadata objects that will be torn down. Must write needs_check flag to metadata with a reset block manager.
Found through code-inspection (and compared against dm-thin.c).
--- drivers/md/dm-cache-target.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/md/dm-cache-target.c +5 -5
@@ -907,16 +907,16 @@ static void abort_transaction(struct cacif (get_cache_mode (cache) >=CM_READ_ONLY )return ; -if (dm_cache_metadata_set_needs_check (cache->cmd)) { -DMERR ("%s: failed to set 'needs_check' flag in metadata" , dev_name); -set_cache_mode (cache,CM_FAIL ); - } -DMERR_LIMIT ("%s: aborting current metadata transaction" , dev_name);if (dm_cache_metadata_abort (cache->cmd)) {DMERR ("%s: failed to abort metadata transaction" , dev_name);set_cache_mode (cache,CM_FAIL ); } + +if (dm_cache_metadata_set_needs_check (cache->cmd)) { +DMERR ("%s: failed to set 'needs_check' flag in metadata" , dev_name); +set_cache_mode (cache,CM_FAIL ); + } }static void metadata_operation_failed (struct cache *cache,const char *op,int r)
Greg Kroah-Hartman
maintainerPATCH 75/207 ata: ahci: fix enum constants for gcc-13
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit f07788079f515ca4a681c5f595bdad19cfbd7b1d upstream.
gcc-13 slightly changes the type of constant expressions that are defined in an enum, which triggers a compile time sanity check in libata:
linux/drivers/ata/libahci.c: In function 'ahci_led_store':linux/include/linux/compiler_types.h:357:45: error: call to '__compiletime_assert_302' declared with attribute error: BUILD_BUG_ON failed: sizeof(_s) > sizeof(long) 357 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
The new behavior is that sizeof() returns the same value for the constant as it does for the enum type, which is generally more sensible and consistent.
The problem in libata is that it contains a single enum definition for lots of unrelated constants, some of which are large positive (unsigned) integers like 0xffffffff, while others like (1<<31) are interpreted as negative integers, and this forces the enum type to become 64 bit wide even though most constants would still fit into a signed 32-bit 'int'.
Fix this by changing the entire enum definition to use BIT(x) in place of (1<<x), which results in all values being seen as 'unsigned' and fitting into an unsigned 32-bit type.
--- drivers/ata/ahci.h | 245 ++++++++++++++++++++++++++--------------------------- 1 file changed, 123 insertions(+), 122 deletions(-)
drivers/ata/ahci.h +123 -122
@@ -24,6 +24,7 @@#include <linux/libata.h> #include <linux/phy/phy.h> #include <linux/regulator/consumer.h> +#include <linux/bits.h> /* Enclosure Management Control */ #define EM_CTRL_MSG_TYPE 0x000f0000
@@ -53,12 +54,12 @@ enum {AHCI_PORT_PRIV_FBS_DMA_SZ =AHCI_CMD_SLOT_SZ +AHCI_CMD_TBL_AR_SZ + (AHCI_RX_FIS_SZ *16 ), -AHCI_IRQ_ON_SG = (1 <<31 ), -AHCI_CMD_ATAPI = (1 <<5 ), -AHCI_CMD_WRITE = (1 <<6 ), -AHCI_CMD_PREFETCH = (1 <<7 ), -AHCI_CMD_RESET = (1 <<8 ), -AHCI_CMD_CLR_BUSY = (1 <<10 ), +AHCI_IRQ_ON_SG =BIT (31 ), +AHCI_CMD_ATAPI =BIT (5 ), +AHCI_CMD_WRITE =BIT (6 ), +AHCI_CMD_PREFETCH =BIT (7 ), +AHCI_CMD_RESET =BIT (8 ), +AHCI_CMD_CLR_BUSY =BIT (10 ),RX_FIS_PIO_SETUP =0x20 ,/* offset of PIO Setup FIS data */ RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */
@@ -76,37 +77,37 @@ enum {HOST_CAP2 =0x24 ,/* host capabilities, extended */ /* HOST_CTL bits */ -HOST_RESET = (1 <<0 ),/* reset controller; self-clear */ -HOST_IRQ_EN = (1 <<1 ),/* global IRQ enable */ -HOST_MRSM = (1 <<2 ),/* MSI Revert to Single Message */ -HOST_AHCI_EN = (1 <<31 ),/* AHCI enabled */ +HOST_RESET =BIT (0 ),/* reset controller; self-clear */ +HOST_IRQ_EN =BIT (1 ),/* global IRQ enable */ +HOST_MRSM =BIT (2 ),/* MSI Revert to Single Message */ +HOST_AHCI_EN =BIT (31 ),/* AHCI enabled */ /* HOST_CAP bits */ -HOST_CAP_SXS = (1 <<5 ),/* Supports External SATA */ -HOST_CAP_EMS = (1 <<6 ),/* Enclosure Management support */ -HOST_CAP_CCC = (1 <<7 ),/* Command Completion Coalescing */ -HOST_CAP_PART = (1 <<13 ),/* Partial state capable */ -HOST_CAP_SSC = (1 <<14 ),/* Slumber state capable */ -HOST_CAP_PIO_MULTI = (1 <<15 ),/* PIO multiple DRQ support */ -HOST_CAP_FBS = (1 <<16 ),/* FIS-based switching support */ -HOST_CAP_PMP = (1 <<17 ),/* Port Multiplier support */ -HOST_CAP_ONLY = (1 <<18 ),/* Supports AHCI mode only */ -HOST_CAP_CLO = (1 <<24 ),/* Command List Override support */ -HOST_CAP_LED = (1 <<25 ),/* Supports activity LED */ -HOST_CAP_ALPM = (1 <<26 ),/* Aggressive Link PM support */ -HOST_CAP_SSS = (1 <<27 ),/* Staggered Spin-up */ -HOST_CAP_MPS = (1 <<28 ),/* Mechanical presence switch */ -HOST_CAP_SNTF = (1 <<29 ),/* SNotification register */ -HOST_CAP_NCQ = (1 <<30 ),/* Native Command Queueing */ -HOST_CAP_64 = (1 <<31 ),/* PCI DAC (64-bit DMA) support */ +HOST_CAP_SXS =BIT (5 ),/* Supports External SATA */ +HOST_CAP_EMS =BIT (6 ),/* Enclosure Management support */ +HOST_CAP_CCC =BIT (7 ),/* Command Completion Coalescing */ +HOST_CAP_PART =BIT (13 ),/* Partial state capable */ +HOST_CAP_SSC =BIT (14 ),/* Slumber state capable */ +HOST_CAP_PIO_MULTI =BIT (15 ),/* PIO multiple DRQ support */ +HOST_CAP_FBS =BIT (16 ),/* FIS-based switching support */ +HOST_CAP_PMP =BIT (17 ),/* Port Multiplier support */ +HOST_CAP_ONLY =BIT (18 ),/* Supports AHCI mode only */ +HOST_CAP_CLO =BIT (24 ),/* Command List Override support */ +HOST_CAP_LED =BIT (25 ),/* Supports activity LED */ +HOST_CAP_ALPM =BIT (26 ),/* Aggressive Link PM support */ +HOST_CAP_SSS =BIT (27 ),/* Staggered Spin-up */ +HOST_CAP_MPS =BIT (28 ),/* Mechanical presence switch */ +HOST_CAP_SNTF =BIT (29 ),/* SNotification register */ +HOST_CAP_NCQ =BIT (30 ),/* Native Command Queueing */ +HOST_CAP_64 =BIT (31 ),/* PCI DAC (64-bit DMA) support */ /* HOST_CAP2 bits */ -HOST_CAP2_BOH = (1 <<0 ),/* BIOS/OS handoff supported */ -HOST_CAP2_NVMHCI = (1 <<1 ),/* NVMHCI supported */ -HOST_CAP2_APST = (1 <<2 ),/* Automatic partial to slumber */ -HOST_CAP2_SDS = (1 <<3 ),/* Support device sleep */ -HOST_CAP2_SADM = (1 <<4 ),/* Support aggressive DevSlp */ -HOST_CAP2_DESO = (1 <<5 ),/* DevSlp from slumber only */ +HOST_CAP2_BOH =BIT (0 ),/* BIOS/OS handoff supported */ +HOST_CAP2_NVMHCI =BIT (1 ),/* NVMHCI supported */ +HOST_CAP2_APST =BIT (2 ),/* Automatic partial to slumber */ +HOST_CAP2_SDS =BIT (3 ),/* Support device sleep */ +HOST_CAP2_SADM =BIT (4 ),/* Support aggressive DevSlp */ +HOST_CAP2_DESO =BIT (5 ),/* DevSlp from slumber only */ /* registers for each SATA port */ PORT_LST_ADDR = 0x00, /* command list DMA addr */
@@ -128,24 +129,24 @@ enum {PORT_DEVSLP =0x44 ,/* device sleep */ /* PORT_IRQ_{STAT,MASK} bits */ -PORT_IRQ_COLD_PRES = (1 <<31 ),/* cold presence detect */ -PORT_IRQ_TF_ERR = (1 <<30 ),/* task file error */ -PORT_IRQ_HBUS_ERR = (1 <<29 ),/* host bus fatal error */ -PORT_IRQ_HBUS_DATA_ERR = (1 <<28 ),/* host bus data error */ -PORT_IRQ_IF_ERR = (1 <<27 ),/* interface fatal error */ -PORT_IRQ_IF_NONFATAL = (1 <<26 ),/* interface non-fatal error */ -PORT_IRQ_OVERFLOW = (1 <<24 ),/* xfer exhausted available S/G */ -PORT_IRQ_BAD_PMP = (1 <<23 ),/* incorrect port multiplier */ - -PORT_IRQ_PHYRDY = (1 <<22 ),/* PhyRdy changed */ -PORT_IRQ_DMPS = (1 <<7 ),/* mechanical presence status */ -PORT_IRQ_CONNECT = (1 <<6 ),/* port connect change status */ -PORT_IRQ_SG_DONE = (1 <<5 ),/* descriptor processed */ -PORT_IRQ_UNK_FIS = (1 <<4 ),/* unknown FIS rx'd */ -PORT_IRQ_SDB_FIS = (1 <<3 ),/* Set Device Bits FIS rx'd */ -PORT_IRQ_DMAS_FIS = (1 <<2 ),/* DMA Setup FIS rx'd */ -PORT_IRQ_PIOS_FIS = (1 <<1 ),/* PIO Setup FIS rx'd */ -PORT_IRQ_D2H_REG_FIS = (1 <<0 ),/* D2H Register FIS rx'd */ +PORT_IRQ_COLD_PRES =BIT (31 ),/* cold presence detect */ +PORT_IRQ_TF_ERR =BIT (30 ),/* task file error */ +PORT_IRQ_HBUS_ERR =BIT (29 ),/* host bus fatal error */ +PORT_IRQ_HBUS_DATA_ERR =BIT (28 ),/* host bus data error */ +PORT_IRQ_IF_ERR =BIT (27 ),/* interface fatal error */ +PORT_IRQ_IF_NONFATAL =BIT (26 ),/* interface non-fatal error */ +PORT_IRQ_OVERFLOW =BIT (24 ),/* xfer exhausted available S/G */ +PORT_IRQ_BAD_PMP =BIT (23 ),/* incorrect port multiplier */ + +PORT_IRQ_PHYRDY =BIT (22 ),/* PhyRdy changed */ +PORT_IRQ_DMPS =BIT (7 ),/* mechanical presence status */ +PORT_IRQ_CONNECT =BIT (6 ),/* port connect change status */ +PORT_IRQ_SG_DONE =BIT (5 ),/* descriptor processed */ +PORT_IRQ_UNK_FIS =BIT (4 ),/* unknown FIS rx'd */ +PORT_IRQ_SDB_FIS =BIT (3 ),/* Set Device Bits FIS rx'd */ +PORT_IRQ_DMAS_FIS =BIT (2 ),/* DMA Setup FIS rx'd */ +PORT_IRQ_PIOS_FIS =BIT (1 ),/* PIO Setup FIS rx'd */ +PORT_IRQ_D2H_REG_FIS =BIT (0 ),/* D2H Register FIS rx'd */ PORT_IRQ_FREEZE =PORT_IRQ_HBUS_ERR | PORT_IRQ_IF_ERR |
@@ -161,27 +162,27 @@ enum {PORT_IRQ_PIOS_FIS |PORT_IRQ_D2H_REG_FIS ,/* PORT_CMD bits */ -PORT_CMD_ASP = (1 <<27 ),/* Aggressive Slumber/Partial */ -PORT_CMD_ALPE = (1 <<26 ),/* Aggressive Link PM enable */ -PORT_CMD_ATAPI = (1 <<24 ),/* Device is ATAPI */ -PORT_CMD_FBSCP = (1 <<22 ),/* FBS Capable Port */ -PORT_CMD_ESP = (1 <<21 ),/* External Sata Port */ -PORT_CMD_CPD = (1 <<20 ),/* Cold Presence Detection */ -PORT_CMD_MPSP = (1 <<19 ),/* Mechanical Presence Switch */ -PORT_CMD_HPCP = (1 <<18 ),/* HotPlug Capable Port */ -PORT_CMD_PMP = (1 <<17 ),/* PMP attached */ -PORT_CMD_LIST_ON = (1 <<15 ),/* cmd list DMA engine running */ -PORT_CMD_FIS_ON = (1 <<14 ),/* FIS DMA engine running */ -PORT_CMD_FIS_RX = (1 <<4 ),/* Enable FIS receive DMA engine */ -PORT_CMD_CLO = (1 <<3 ),/* Command list override */ -PORT_CMD_POWER_ON = (1 <<2 ),/* Power up device */ -PORT_CMD_SPIN_UP = (1 <<1 ),/* Spin up device */ -PORT_CMD_START = (1 <<0 ),/* Enable port DMA engine */ - -PORT_CMD_ICC_MASK = (0xf <<28 ),/* i/f ICC state mask */ -PORT_CMD_ICC_ACTIVE = (0x1 <<28 ),/* Put i/f in active state */ -PORT_CMD_ICC_PARTIAL = (0x2 <<28 ),/* Put i/f in partial state */ -PORT_CMD_ICC_SLUMBER = (0x6 <<28 ),/* Put i/f in slumber state */ +PORT_CMD_ASP =BIT (27 ),/* Aggressive Slumber/Partial */ +PORT_CMD_ALPE =BIT (26 ),/* Aggressive Link PM enable */ +PORT_CMD_ATAPI =BIT (24 ),/* Device is ATAPI */ +PORT_CMD_FBSCP =BIT (22 ),/* FBS Capable Port */ +PORT_CMD_ESP =BIT (21 ),/* External Sata Port */ +PORT_CMD_CPD =BIT (20 ),/* Cold Presence Detection */ +PORT_CMD_MPSP =BIT (19 ),/* Mechanical Presence Switch */ +PORT_CMD_HPCP =BIT (18 ),/* HotPlug Capable Port */ +PORT_CMD_PMP =BIT (17 ),/* PMP attached */ +PORT_CMD_LIST_ON =BIT (15 ),/* cmd list DMA engine running */ +PORT_CMD_FIS_ON =BIT (14 ),/* FIS DMA engine running */ +PORT_CMD_FIS_RX =BIT (4 ),/* Enable FIS receive DMA engine */ +PORT_CMD_CLO =BIT (3 ),/* Command list override */ +PORT_CMD_POWER_ON =BIT (2 ),/* Power up device */ +PORT_CMD_SPIN_UP =BIT (1 ),/* Spin up device */ +PORT_CMD_START =BIT (0 ),/* Enable port DMA engine */ + +PORT_CMD_ICC_MASK = (0xfu <<28 ),/* i/f ICC state mask */ +PORT_CMD_ICC_ACTIVE = (0x1u <<28 ),/* Put i/f in active state */ +PORT_CMD_ICC_PARTIAL = (0x2u <<28 ),/* Put i/f in partial state */ +PORT_CMD_ICC_SLUMBER = (0x6u <<28 ),/* Put i/f in slumber state */ /* PORT_CMD capabilities mask */ PORT_CMD_CAP = PORT_CMD_HPCP | PORT_CMD_MPSP |
@@ -192,9 +193,9 @@ enum {PORT_FBS_ADO_OFFSET =12 ,/* FBS active dev optimization offset */ PORT_FBS_DEV_OFFSET =8 ,/* FBS device to issue offset */ PORT_FBS_DEV_MASK = (0xf <<PORT_FBS_DEV_OFFSET ),/* FBS.DEV */ -PORT_FBS_SDE = (1 <<2 ),/* FBS single device error */ -PORT_FBS_DEC = (1 <<1 ),/* FBS device error clear */ -PORT_FBS_EN = (1 <<0 ),/* Enable FBS */ +PORT_FBS_SDE =BIT (2 ),/* FBS single device error */ +PORT_FBS_DEC =BIT (1 ),/* FBS device error clear */ +PORT_FBS_EN =BIT (0 ),/* Enable FBS */ /* PORT_DEVSLP bits */ PORT_DEVSLP_DM_OFFSET = 25, /* DITO multiplier offset */
@@ -202,50 +203,50 @@ enum {PORT_DEVSLP_DITO_OFFSET =15 ,/* DITO offset */ PORT_DEVSLP_MDAT_OFFSET =10 ,/* Minimum assertion time */ PORT_DEVSLP_DETO_OFFSET =2 ,/* DevSlp exit timeout */ -PORT_DEVSLP_DSP = (1 <<1 ),/* DevSlp present */ -PORT_DEVSLP_ADSE = (1 <<0 ),/* Aggressive DevSlp enable */ +PORT_DEVSLP_DSP =BIT (1 ),/* DevSlp present */ +PORT_DEVSLP_ADSE =BIT (0 ),/* Aggressive DevSlp enable */ /* hpriv->flags bits */ #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) -AHCI_HFLAG_NO_NCQ = (1 <<0 ), -AHCI_HFLAG_IGN_IRQ_IF_ERR = (1 <<1 ),/* ignore IRQ_IF_ERR */ -AHCI_HFLAG_IGN_SERR_INTERNAL = (1 <<2 ),/* ignore SERR_INTERNAL */ -AHCI_HFLAG_32BIT_ONLY = (1 <<3 ),/* force 32bit */ -AHCI_HFLAG_MV_PATA = (1 <<4 ),/* PATA port */ -AHCI_HFLAG_NO_MSI = (1 <<5 ),/* no PCI MSI */ -AHCI_HFLAG_NO_PMP = (1 <<6 ),/* no PMP */ -AHCI_HFLAG_SECT255 = (1 <<8 ),/* max 255 sectors */ -AHCI_HFLAG_YES_NCQ = (1 <<9 ),/* force NCQ cap on */ -AHCI_HFLAG_NO_SUSPEND = (1 <<10 ),/* don't suspend */ -AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 <<11 ),/* treat SRST timeout as -link offline */ -AHCI_HFLAG_NO_SNTF = (1 <<12 ),/* no sntf */ -AHCI_HFLAG_NO_FPDMA_AA = (1 <<13 ),/* no FPDMA AA */ -AHCI_HFLAG_YES_FBS = (1 <<14 ),/* force FBS cap on */ -AHCI_HFLAG_DELAY_ENGINE = (1 <<15 ),/* do not start engine on -port start (wait until -error-handling stage) */ -AHCI_HFLAG_NO_DEVSLP = (1 <<17 ),/* no device sleep */ -AHCI_HFLAG_NO_FBS = (1 <<18 ),/* no FBS */ +AHCI_HFLAG_NO_NCQ =BIT (0 ), +AHCI_HFLAG_IGN_IRQ_IF_ERR =BIT (1 ),/* ignore IRQ_IF_ERR */ +AHCI_HFLAG_IGN_SERR_INTERNAL =BIT (2 ),/* ignore SERR_INTERNAL */ +AHCI_HFLAG_32BIT_ONLY =BIT (3 ),/* force 32bit */ +AHCI_HFLAG_MV_PATA =BIT (4 ),/* PATA port */ +AHCI_HFLAG_NO_MSI =BIT (5 ),/* no PCI MSI */ +AHCI_HFLAG_NO_PMP =BIT (6 ),/* no PMP */ +AHCI_HFLAG_SECT255 =BIT (8 ),/* max 255 sectors */ +AHCI_HFLAG_YES_NCQ =BIT (9 ),/* force NCQ cap on */ +AHCI_HFLAG_NO_SUSPEND =BIT (10 ),/* don't suspend */ +AHCI_HFLAG_SRST_TOUT_IS_OFFLINE =BIT (11 ),/* treat SRST timeout as +link offline */ +AHCI_HFLAG_NO_SNTF =BIT (12 ),/* no sntf */ +AHCI_HFLAG_NO_FPDMA_AA =BIT (13 ),/* no FPDMA AA */ +AHCI_HFLAG_YES_FBS =BIT (14 ),/* force FBS cap on */ +AHCI_HFLAG_DELAY_ENGINE =BIT (15 ),/* do not start engine on +port start (wait until +error-handling stage) */ +AHCI_HFLAG_NO_DEVSLP =BIT (17 ),/* no device sleep */ +AHCI_HFLAG_NO_FBS =BIT (18 ),/* no FBS */ #ifdef CONFIG_PCI_MSI -AHCI_HFLAG_MULTI_MSI = (1 <<20 ),/* per-port MSI(-X) */ +AHCI_HFLAG_MULTI_MSI =BIT (20 ),/* per-port MSI(-X) */ #else/* compile out MSI infrastructure */ AHCI_HFLAG_MULTI_MSI =0 , #endif -AHCI_HFLAG_WAKE_BEFORE_STOP = (1 <<22 ),/* wake before DMA stop */ -AHCI_HFLAG_YES_ALPM = (1 <<23 ),/* force ALPM cap on */ -AHCI_HFLAG_NO_WRITE_TO_RO = (1 <<24 ),/* don't write to read -only registers */ -AHCI_HFLAG_USE_LPM_POLICY = (1 <<25 ),/* chipset that should use -SATA_MOBILE_LPM_POLICY -as default lpm_policy */ -AHCI_HFLAG_SUSPEND_PHYS = (1 <<26 ),/* handle PHYs during -suspend/resume */ -AHCI_HFLAG_NO_SXS = (1 <<28 ),/* SXS not supported */ +AHCI_HFLAG_WAKE_BEFORE_STOP =BIT (22 ),/* wake before DMA stop */ +AHCI_HFLAG_YES_ALPM =BIT (23 ),/* force ALPM cap on */ +AHCI_HFLAG_NO_WRITE_TO_RO =BIT (24 ),/* don't write to read +only registers */ +AHCI_HFLAG_USE_LPM_POLICY =BIT (25 ),/* chipset that should use +SATA_MOBILE_LPM_POLICY +as default lpm_policy */ +AHCI_HFLAG_SUSPEND_PHYS =BIT (26 ),/* handle PHYs during +suspend/resume */ +AHCI_HFLAG_NO_SXS =BIT (28 ),/* SXS not supported */ /* ap->flags bits */
@@ -261,22 +262,22 @@ enum {EM_MAX_RETRY =5 ,/* em_ctl bits */ -EM_CTL_RST = (1 <<9 ),/* Reset */ -EM_CTL_TM = (1 <<8 ),/* Transmit Message */ -EM_CTL_MR = (1 <<0 ),/* Message Received */ -EM_CTL_ALHD = (1 <<26 ),/* Activity LED */ -EM_CTL_XMT = (1 <<25 ),/* Transmit Only */ -EM_CTL_SMB = (1 <<24 ),/* Single Message Buffer */ -EM_CTL_SGPIO = (1 <<19 ),/* SGPIO messages supported */ -EM_CTL_SES = (1 <<18 ),/* SES-2 messages supported */ -EM_CTL_SAFTE = (1 <<17 ),/* SAF-TE messages supported */ -EM_CTL_LED = (1 <<16 ),/* LED messages supported */ +EM_CTL_RST =BIT (9 ),/* Reset */ +EM_CTL_TM =BIT (8 ),/* Transmit Message */ +EM_CTL_MR =BIT (0 ),/* Message Received */ +EM_CTL_ALHD =BIT (26 ),/* Activity LED */ +EM_CTL_XMT =BIT (25 ),/* Transmit Only */ +EM_CTL_SMB =BIT (24 ),/* Single Message Buffer */ +EM_CTL_SGPIO =BIT (19 ),/* SGPIO messages supported */ +EM_CTL_SES =BIT (18 ),/* SES-2 messages supported */ +EM_CTL_SAFTE =BIT (17 ),/* SAF-TE messages supported */ +EM_CTL_LED =BIT (16 ),/* LED messages supported */ /* em message type */ -EM_MSG_TYPE_LED = (1 <<0 ),/* LED */ -EM_MSG_TYPE_SAFTE = (1 <<1 ),/* SAF-TE */ -EM_MSG_TYPE_SES2 = (1 <<2 ),/* SES-2 */ - EM_MSG_TYPE_SGPIO = (1 << 3), /* SGPIO */ +EM_MSG_TYPE_LED =BIT (0 ),/* LED */ +EM_MSG_TYPE_SAFTE =BIT (1 ),/* SAF-TE */ +EM_MSG_TYPE_SES2 =BIT (2 ),/* SES-2 */ + EM_MSG_TYPE_SGPIO = BIT(3), /* SGPIO */ }; struct ahci_cmd_hdr {
Greg Kroah-Hartman
maintainerPATCH 76/207 PCI/DOE: Fix maximum data object length miscalculation
In reply to Greg Kroah-HartmanFrom: Li Ming <[email protected]>
commit a4ff8e7a71601321f7bf7b58ede664dc0d774274 upstream.
Per PCIe r6.0, sec 6.30.1, a data object Length of 0x0 indicates 2^18 DWORDs (256K DW or 1MB) being transferred. Adjust the value of data object length for this case on both sending side and receiving side.
Don't bother checking whether Length is greater than SZ_1M because all values of the 18-bit Length field are valid, and it is impossible to represent anything larger than SZ_1M:
0x00000 256K DW (1M bytes)
0x00001 1 DW (4 bytes)
...
0x3ffff 256K-1 DW (1M - 4 bytes)
--- drivers/pci/doe.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/pci/doe.c +16 -4
@@ -29,6 +29,9 @@#define PCI_DOE_FLAG_CANCEL 0#define PCI_DOE_FLAG_DEAD 1 +/* Max data object length is 2^18 dwords */ +#define PCI_DOE_MAX_LENGTH (1 << 18) +/** * struct pci_doe_mb - State for a single DOE mailbox *
@@ -107,6 +110,7 @@ static int pci_doe_send_req(struct pci_d {struct pci_dev *pdev = doe_mb->pdev;int offset = doe_mb->cap_offset; +size_t length;u32 val;int i;
@@ -123,15 +127,20 @@ static int pci_doe_send_req(struct pci_dif (FIELD_GET (PCI_DOE_STATUS_ERROR , val))return -EIO ; +/* Length is 2 DW of header + length of payload in DW */ + length =2 + task->request_pl_sz /sizeof (u32); +if (length >PCI_DOE_MAX_LENGTH ) +return -EIO ; +if (length ==PCI_DOE_MAX_LENGTH ) + length =0 ; +/* Write DOE Header */ val =FIELD_PREP (PCI_DOE_DATA_OBJECT_HEADER_1_VID , task->prot.vid) |FIELD_PREP (PCI_DOE_DATA_OBJECT_HEADER_1_TYPE , task->prot.type);pci_write_config_dword (pdev, offset +PCI_DOE_WRITE , val); -/* Length is 2 DW of header + length of payload in DW */ pci_write_config_dword (pdev, offset +PCI_DOE_WRITE ,FIELD_PREP (PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH , -2 + task->request_pl_sz / -sizeof (u32))); + length));for (i =0 ; i < task->request_pl_sz /sizeof (u32); i++)pci_write_config_dword (pdev, offset +PCI_DOE_WRITE , task->request_pl[i]);
@@ -178,7 +187,10 @@ static int pci_doe_recv_resp(struct pci_pci_write_config_dword (pdev, offset +PCI_DOE_READ ,0 ); length =FIELD_GET (PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH , val); -if (length >SZ_1M || length <2 ) +/* A value of 0x0 indicates max data object length */ +if (!length) + length =PCI_DOE_MAX_LENGTH ; +if (length <2 )return -EIO ;/* First 2 dwords have already been read */
Greg Kroah-Hartman
maintainerPATCH 77/207 tracing/hist: Fix out-of-bound write on action_data.var_ref_idx
In reply to Greg Kroah-HartmanFrom: Zheng Yejian <[email protected]>
commit 82470f7d9044842618c847a7166de2b7458157a7 upstream.
When generate a synthetic event with many params and then create a trace action for it [1], kernel panic happened [2].
It is because that in trace_action_create() 'data->n_params' is up to SYNTH_FIELDS_MAX (current value is 64), and array 'data->var_ref_idx' keeps indices into array 'hist_data->var_refs' for each synthetic event param, but the length of 'data->var_ref_idx' is TRACING_MAP_VARS_MAX (current value is 16), so out-of-bound write happened when 'data->n_params' more than 16. In this case, 'data->match_data.event' is overwritten and eventually cause the panic.
To solve the issue, adjust the length of 'data->var_ref_idx' to be SYNTH_FIELDS_MAX and add sanity checks to avoid out-of-bound write.
[1]
# cd /sys/kernel/tracing/ # echo "my_synth_event int v1; int v2; int v3; int v4; int v5; int v6;\ int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14;\ int v15; int v16; int v17; int v18; int v19; int v20; int v21; int v22;\ int v23; int v24; int v25; int v26; int v27; int v28; int v29; int v30;\ int v31; int v32; int v33; int v34; int v35; int v36; int v37; int v38;\ int v39; int v40; int v41; int v42; int v43; int v44; int v45; int v46;\ int v47; int v48; int v49; int v50; int v51; int v52; int v53; int v54;\ int v55; int v56; int v57; int v58; int v59; int v60; int v61; int v62;\ int v63" >> synthetic_events # echo 'hist:keys=pid:ts0=common_timestamp.usecs if comm=="bash"' >> \ events/sched/sched_waking/trigger # echo "hist:keys=next_pid:onmatch(sched.sched_waking).my_synth_event(\ pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,\ pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,\ pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,pid,\ pid,pid,pid,pid,pid,pid,pid,pid,pid)" >> events/sched/sched_switch/trigger
[2]
BUG: unable to handle page fault for address: ffff91c900000000 PGD 61001067 P4D 61001067 PUD 0 Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 2 PID: 322 Comm: bash Tainted: G W 6.1.0-rc8+ #229 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014 RIP: 0010:strcmp+0xc/0x30 Code: 75 f7 31 d2 44 0f b6 04 16 44 88 04 11 48 83 c2 01 45 84 c0 75 ee c3 cc cc cc cc 0f 1f 00 31 c0 eb 08 48 83 c0 01 84 d2 74 13 <0f> b6 14 07 3a 14 06 74 ef 19 c0 83 c8 01 c3 cc cc cc cc 31 c3 RSP: 0018:ffff9b3b00f53c48 EFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffffba958a68 RCX: 0000000000000000 RDX: 0000000000000010 RSI: ffff91c943d33a90 RDI: ffff91c900000000 RBP: ffff91c900000000 R08: 00000018d604b529 R09: 0000000000000000 R10: ffff91c9483eddb1 R11: ffff91ca483eddab R12: ffff91c946171580 R13: ffff91c9479f0538 R14: ffff91c9457c2848 R15: ffff91c9479f0538 FS: 00007f1d1cfbe740(0000) GS:ffff91c9bdc80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff91c900000000 CR3: 0000000006316000 CR4: 00000000000006e0 Call Trace: <TASK> __find_event_file+0x55/0x90 action_create+0x76c/0x1060 event_hist_trigger_parse+0x146d/0x2060 ? event_trigger_write+0x31/0xd0 trigger_process_regex+0xbb/0x110 event_trigger_write+0x6b/0xd0 vfs_write+0xc8/0x3e0 ? alloc_fd+0xc0/0x160 ? preempt_count_add+0x4d/0xa0 ? preempt_count_add+0x70/0xa0 ksys_write+0x5f/0xe0 do_syscall_64+0x3b/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f1d1d0cf077 Code: 64 89 02 48 c7 c0 ff ff ff ff eb bb 0f 1f 80 00 00 00 00 f3 0f 1e
fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 48 89 54 24 18 48 89 74
RSP: 002b:00007ffcebb0e568 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
RAX: ffffffffffffffda RBX: 0000000000000143 RCX: 00007f1d1d0cf077
RDX: 0000000000000143 RSI: 00005639265aa7e0 RDI: 0000000000000001
RBP: 00005639265aa7e0 R08: 000000000000000a R09: 0000000000000142
R10: 000056392639c017 R11: 0000000000000246 R12: 0000000000000143
R13: 00007f1d1d1ae6a0 R14: 00007f1d1d1aa4a0 R15: 00007f1d1d1a98a0
</TASK> Modules linked in: CR2: ffff91c900000000 ---[ end trace 0000000000000000 ]--- RIP: 0010:strcmp+0xc/0x30 Code: 75 f7 31 d2 44 0f b6 04 16 44 88 04 11 48 83 c2 01 45 84 c0 75 ee c3 cc cc cc cc 0f 1f 00 31 c0 eb 08 48 83 c0 01 84 d2 74 13 <0f> b6 14 07 3a 14 06 74 ef 19 c0 83 c8 01 c3 cc cc cc cc 31 c3 RSP: 0018:ffff9b3b00f53c48 EFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffffba958a68 RCX: 0000000000000000 RDX: 0000000000000010 RSI: ffff91c943d33a90 RDI: ffff91c900000000 RBP: ffff91c900000000 R08: 00000018d604b529 R09: 0000000000000000 R10: ffff91c9483eddb1 R11: ffff91ca483eddab R12: ffff91c946171580 R13: ffff91c9479f0538 R14: ffff91c9457c2848 R15: ffff91c9479f0538 FS: 00007f1d1cfbe740(0000) GS:ffff91c9bdc80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff91c900000000 CR3: 0000000006316000 CR4: 00000000000006e0
--- kernel/trace/trace_events_hist.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
kernel/trace/trace_events_hist.c +8 -2
@@ -617,7 +617,7 @@ struct action_data {* event param, and is passed to the synthetic event * invocation. */ -unsigned int var_ref_idx[TRACING_MAP_VARS_MAX ]; +unsigned int var_ref_idx[SYNTH_FIELDS_MAX ];struct synth_event *synth_event;bool use_trace_keyword;char *synth_event_name;
@@ -2173,7 +2173,9 @@ static struct hist_field *create_var_refreturn ref_field; } } - +/* Sanity check to avoid out-of-bound write on 'hist_data->var_refs' */ +if (hist_data->n_var_refs >=TRACING_MAP_VARS_MAX ) +return NULL ; ref_field =create_hist_field (var_field->hist_data,NULL , flags,NULL );if (ref_field) {if (init_var_ref (ref_field, var_field, system, event_name)) {
@@ -3922,6 +3924,10 @@ static int trace_action_create(struct hilockdep_assert_held (&event_mutex); +/* Sanity check to avoid out-of-bound write on 'data->var_ref_idx' */ +if (data->n_params >SYNTH_FIELDS_MAX ) +return -EINVAL ; +if (data->use_trace_keyword) synth_event_name = data->synth_event_name;else
Greg Kroah-Hartman
maintainerPATCH 78/207 perf/core: Call LSM hook after copying perf_event_attr
In reply to Greg Kroah-HartmanFrom: Namhyung Kim <[email protected]>
commit 0a041ebca4956292cadfb14a63ace3a9c1dcb0a3 upstream.
It passes the attr struct to the security_perf_event_open() but it's not initialized yet.
--- kernel/events/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/events/core.c +3 -3
@@ -12231,12 +12231,12 @@ SYSCALL_DEFINE5(perf_event_open,if (flags & ~PERF_FLAG_ALL )return -EINVAL ; -/* Do we allow access to perf_event_open(2) ? */ - err =security_perf_event_open (&attr,PERF_SECURITY_OPEN ); + err =perf_copy_attr (attr_uptr, &attr);if (err)return err; - err =perf_copy_attr (attr_uptr, &attr); +/* Do we allow access to perf_event_open(2) ? */ + err =security_perf_event_open (&attr,PERF_SECURITY_OPEN );if (err)return err;
Greg Kroah-Hartman
maintainerPATCH 79/207 xtensa: add __umulsidi3 helper
In reply to Greg Kroah-HartmanFrom: Max Filippov <[email protected]>
commit 8939c58d68f97ce530f02d46c9f2b56c3ec88399 upstream.
xtensa gcc-13 has changed multiplication handling and may now use __umulsidi3 helper where it used to use __muldi3. As a result building the kernel with the new gcc may fail with the following error:
linux/init/main.c:1287: undefined reference to `__umulsidi3'
Fix the build by providing __umulsidi3 implementation for xtensa.
--- arch/xtensa/kernel/xtensa_ksyms.c | 2 arch/xtensa/lib/Makefile | 2 arch/xtensa/lib/umulsidi3.S | 230 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 arch/xtensa/lib/umulsidi3.S
arch/xtensa/kernel/xtensa_ksyms.c +2 -0
@@ -62,6 +62,7 @@ extern int __modsi3(int, int);extern int __mulsi3 (int ,int );extern unsigned int __udivsi3 (unsigned int ,unsigned int );extern unsigned int __umodsi3 (unsigned int ,unsigned int ); +extern unsigned long long __umulsidi3 (unsigned int ,unsigned int );EXPORT_SYMBOL (__ashldi3);EXPORT_SYMBOL (__ashrdi3);
@@ -71,6 +72,7 @@ EXPORT_SYMBOL(__modsi3);EXPORT_SYMBOL (__mulsi3);EXPORT_SYMBOL (__udivsi3);EXPORT_SYMBOL (__umodsi3); +EXPORT_SYMBOL (__umulsidi3);unsigned int __sync_fetch_and_and_4 (volatile void *p,unsigned int v) {
arch/xtensa/lib/Makefile +1 -1
@@ -5,7 +5,7 @@ lib-y += memcopy.o memset.o checksum.o \ ashldi3.o ashrdi3.o lshrdi3.o \ - divsi3.o udivsi3.o modsi3.o umodsi3.o mulsi3.o \ + divsi3.o udivsi3.o modsi3.o umodsi3.o mulsi3.o umulsidi3.o \ usercopy.o strncpy_user.o strnlen_user.o lib-$(CONFIG_PCI) += pci-auto.o lib-$(CONFIG_KCSAN) += kcsan-stubs.o
arch/xtensa/lib/umulsidi3.S new file +230 -0
230 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 80/207 of/kexec: Fix reading 32-bit "linux,initrd-{start,end}" values
In reply to Greg Kroah-HartmanFrom: Rob Herring <[email protected]>
commit e553ad8d7957697385e81034bf76db3b2cb2cf27 upstream.
"linux,initrd-start" and "linux,initrd-end" can be 32-bit values even on a 64-bit platform. Ideally, the size should be based on '#address-cells', but that has never been enforced in the kernel's FDT boot parsing code (early_init_dt_check_for_initrd()). Bootloader behavior is known to vary. For example, kexec always writes these as 64-bit. The result of incorrectly reading 32-bit values is most likely the reserved memory for the original initrd will still be reserved for the new kernel. The original arm64 equivalent of this code failed to release the initrd reserved memory in *all* cases.
Use of_read_number() to mirror the early_init_dt_check_for_initrd() code.
--- drivers/of/kexec.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/of/kexec.c +5 -5
@@ -281,7 +281,7 @@ void *of_kexec_alloc_and_setup_fdt(const const char *cmdline, size_t extra_fdt_size) { void *fdt; -int ret, chosen_node; +int ret, chosen_node, len;const void *prop;size_t fdt_size;
@@ -324,19 +324,19 @@ void *of_kexec_alloc_and_setup_fdt(const goto out;/* Did we boot using an initrd? */ - prop =fdt_getprop (fdt, chosen_node,"linux,initrd-start" ,NULL ); + prop =fdt_getprop (fdt, chosen_node,"linux,initrd-start" , &len);if (prop) {u64 tmp_start, tmp_end, tmp_size; - tmp_start =fdt64_to_cpu (*((const fdt64_t *) prop)); + tmp_start =of_read_number (prop, len /4 ); - prop =fdt_getprop (fdt, chosen_node,"linux,initrd-end" ,NULL ); + prop =fdt_getprop (fdt, chosen_node,"linux,initrd-end" , &len);if (!prop) { ret = -EINVAL ; goto out; } - tmp_end =fdt64_to_cpu (*((const fdt64_t *) prop)); + tmp_end =of_read_number (prop, len /4 );/* * kexec reserves exact initrd size, while firmware may
Greg Kroah-Hartman
maintainerPATCH 81/207 ima: Fix hash dependency to correct algorithm
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
commit b6018af440a07bd0d74b58c4e18045f4a8dbfe6b upstream.
Commit d2825fa9365d ("crypto: sm3,sm4 - move into crypto directory") moves the SM3 and SM4 stand-alone library and the algorithm implementation for the Crypto API into the same directory, and the corresponding relationship of Kconfig is modified, CONFIG_CRYPTO_SM3/4 corresponds to the stand-alone library of SM3/4, and CONFIG_CRYPTO_SM3/4_GENERIC corresponds to the algorithm implementation for the Crypto API. Therefore, it is necessary for this module to depend on the correct algorithm.
--- security/integrity/ima/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/integrity/ima/Kconfig +1 -1
@@ -112,7 +112,7 @@ choice config IMA_DEFAULT_HASH_SM3 bool "SM3" - depends on CRYPTO_SM3=y + depends on CRYPTO_SM3_GENERIC=y endchoice config IMA_DEFAULT_HASH
Greg Kroah-Hartman
maintainerPATCH 82/207 KVM: VMX: Resume guest immediately when injecting #GP on ECREATE
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit eb3992e833d3a17f9b0a3e0371d0b1d3d566f740 upstream.
Resume the guest immediately when injecting a #GP on ECREATE due to an invalid enclave size, i.e. don't attempt ECREATE in the host. The #GP is a terminal fault, e.g. skipping the instruction if ECREATE is successful would result in KVM injecting #GP on the instruction following ECREATE.
--- arch/x86/kvm/vmx/sgx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/kvm/vmx/sgx.c +3 -1
@@ -182,8 +182,10 @@ static int __handle_encls_ecreate(struct/* Enforce CPUID restriction on max enclave size. */ max_size_log2 = (attributes &SGX_ATTR_MODE64BIT ) ? sgx_12_0->edx >>8 : sgx_12_0->edx; -if (size >=BIT_ULL (max_size_log2)) +if (size >=BIT_ULL (max_size_log2)) {kvm_inject_gp (vcpu,0 ); +return 1 ; + }/* * sgx_virt_ecreate() returns:
Greg Kroah-Hartman
maintainerPATCH 83/207 KVM: nVMX: Inject #GP, not #UD, if "generic" VMXON CR0/CR4 check fails
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 9cc409325ddd776f6fd6293d5ce93ce1248af6e4 upstream.
Inject #GP for if VMXON is attempting with a CR0/CR4 that fails the generic "is CRx valid" check, but passes the CR4.VMXE check, and do the generic checks _after_ handling the post-VMXON VM-Fail.
The CR4.VMXE check, and all other #UD cases, are special pre-conditions that are enforced prior to pivoting on the current VMX mode, i.e. occur before interception if VMXON is attempted in VMX non-root mode.
All other CR0/CR4 checks generate #GP and effectively have lower priority than the post-VMXON check.
Per the SDM:
IF (register operand) or (CR0.PE = 0) or (CR4.VMXE = 0) or ...
THEN #UD;
ELSIF not in VMX operation
THEN
IF (CPL > 0) or (in A20M mode) or
(the values of CR0 and CR4 are not supported in VMX operation)
THEN #GP(0);
ELSIF in VMX non-root operation
THEN VMexit;
ELSIF CPL > 0
THEN #GP(0);
ELSE VMfail("VMXON executed in VMX root operation");
FI;which, if re-written without ELSIF, yields:
IF (register operand) or (CR0.PE = 0) or (CR4.VMXE = 0) or ...
THEN #UD
IF in VMX non-root operation
THEN VMexit;
IF CPL > 0
THEN #GP(0)
IF in VMX operation
THEN VMfail("VMXON executed in VMX root operation");
IF (in A20M mode) or
(the values of CR0 and CR4 are not supported in VMX operation)
THEN #GP(0);
Note, KVM unconditionally forwards VMXON VM-Exits that occur in L2 to L1, i.e. there is no need to check the vCPU is not in VMX non-root mode. Add a comment to explain why unconditionally forwarding such exits is functionally correct.
--- arch/x86/kvm/vmx/nested.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-)
arch/x86/kvm/vmx/nested.c +33 -11
@@ -5100,24 +5100,35 @@ static int handle_vmxon(struct kvm_vcpu | FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX;/* -* Note, KVM cannot rely on hardware to perform the CR0/CR4 #UD checks -* that have higher priority than VM-Exit (see Intel SDM's pseudocode -* for VMXON), as KVM must load valid CR0/CR4 values into hardware while -* running the guest, i.e. KVM needs to check the _guest_ values. +* Manually check CR4.VMXE checks, KVM must force CR4.VMXE=1 to enter +* the guest and so cannot rely on hardware to perform the check, +* which has higher priority than VM-Exit (see Intel SDM's pseudocode +* for VMXON). * -* Rely on hardware for the other two pre-VM-Exit checks, !VM86 and -* !COMPATIBILITY modes. KVM may run the guest in VM86 to emulate Real -* Mode, but KVM will never take the guest out of those modes. +* Rely on hardware for the other pre-VM-Exit checks, CR0.PE=1, !VM86 +* and !COMPATIBILITY modes. For an unrestricted guest, KVM doesn't +* force any of the relevant guest state. For a restricted guest, KVM +* does force CR0.PE=1, but only to also force VM86 in order to emulate +* Real Mode, and so there's no need to check CR0.PE manually. */ -if (!nested_host_cr0_valid (vcpu,kvm_read_cr0 (vcpu)) || - !nested_host_cr4_valid (vcpu,kvm_read_cr4 (vcpu))) { +if (!kvm_read_cr4_bits (vcpu,X86_CR4_VMXE )) {kvm_queue_exception (vcpu,UD_VECTOR );return 1 ; }/* -* CPL=0 and all other checks that are lower priority than VM-Exit must -* be checked manually. +* The CPL is checked for "not in VMX operation" and for "in VMX root", +* and has higher priority than the VM-Fail due to being post-VMXON, +* i.e. VMXON #GPs outside of VMX non-root if CPL!=0. In VMX non-root, +* VMXON causes VM-Exit and KVM unconditionally forwards VMXON VM-Exits +* from L2 to L1, i.e. there's no need to check for the vCPU being in +* VMX non-root. +* +* Forwarding the VM-Exit unconditionally, i.e. without performing the +* #UD checks (see above), is functionally ok because KVM doesn't allow +* L1 to run L2 without CR4.VMXE=0, and because KVM never modifies L2's +* CR0 or CR4, i.e. it's L2's responsibility to emulate #UDs that are +* missed by hardware due to shadowing CR0 and/or CR4. */ if (vmx_get_cpl (vcpu)) {kvm_inject_gp (vcpu,0 );
@@ -5127,6 +5138,17 @@ static int handle_vmxon(struct kvm_vcpuif (vmx->nested.vmxon)return nested_vmx_fail (vcpu,VMXERR_VMXON_IN_VMX_ROOT_OPERATION ); +/* +* Invalid CR0/CR4 generates #GP. These checks are performed if and +* only if the vCPU isn't already in VMX operation, i.e. effectively +* have lower priority than the VM-Fail above. +*/ +if (!nested_host_cr0_valid (vcpu,kvm_read_cr0 (vcpu)) || + !nested_host_cr4_valid (vcpu,kvm_read_cr4 (vcpu))) { +kvm_inject_gp (vcpu,0 ); +return 1 ; + } +if ((vmx->msr_ia32_feature_control &VMXON_NEEDED_FEATURES ) !=VMXON_NEEDED_FEATURES ) {kvm_inject_gp (vcpu,0 );
Greg Kroah-Hartman
maintainerPATCH 84/207 KVM: x86: fix APICv/x2AVIC disabled when vm reboot by itself
In reply to Greg Kroah-HartmanFrom: Yuan ZhaoXiong <[email protected]>
commit ef40757743b47cc95de9b4ed41525c94f8dc73d9 upstream.
When a VM reboots itself, the reset process will result in an ioctl(KVM_SET_LAPIC, ...) to disable x2APIC mode and set the xAPIC id of the vCPU to its default value, which is the vCPU id.
That will be handled in KVM as follows:
kvm_vcpu_ioctl_set_lapic
kvm_apic_set_state
kvm_lapic_set_base => disable X2APIC mode
kvm_apic_state_fixup
kvm_lapic_xapic_id_updated
kvm_xapic_id(apic) != apic->vcpu->vcpu_id
kvm_set_apicv_inhibit(APICV_INHIBIT_REASON_APIC_ID_MODIFIED)
memcpy(vcpu->arch.apic->regs, s->regs, sizeof(*s)) => update APIC_IDWhen kvm_apic_set_state invokes kvm_lapic_set_base to disable x2APIC mode, the old 32-bit x2APIC id is still present rather than the 8-bit xAPIC id. kvm_lapic_xapic_id_updated will set the APICV_INHIBIT_REASON_APIC_ID_MODIFIED bit and disable APICv/x2AVIC.
Instead, kvm_lapic_xapic_id_updated must be called after APIC_ID is changed.
In fact, this fixes another small issue in the code in that potential changes to a vCPU's xAPIC ID need not be tracked for KVM_GET_LAPIC.
Message-Id: <[email protected]>
--- arch/x86/kvm/lapic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/x86/kvm/lapic.c +3 -2
@@ -2722,8 +2722,6 @@ static int kvm_apic_state_fixup(struct k icr =__kvm_lapic_get_reg64 (s->regs,APIC_ICR );__kvm_lapic_set_reg (s->regs,APIC_ICR2 , icr >>32 ); } - }else { -kvm_lapic_xapic_id_updated (vcpu->arch.apic); }return 0 ;
@@ -2759,6 +2757,9 @@ int kvm_apic_set_state(struct kvm_vcpu * }memcpy (vcpu->arch.apic->regs, s->regs,sizeof (*s)); +if (!apic_x2apic_mode (apic)) +kvm_lapic_xapic_id_updated (apic); +atomic_set_release (&apic->vcpu->kvm->arch.apic_map_dirty,DIRTY );kvm_recalculate_apic_map (vcpu->kvm);kvm_apic_set_version (vcpu);
Greg Kroah-Hartman
maintainerPATCH 85/207 KVM: nVMX: Properly expose ENABLE_USR_WAIT_PAUSE control to L1
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 31de69f4eea77b28a9724b3fa55aae104fc91fc7 upstream.
Set ENABLE_USR_WAIT_PAUSE in KVM's supported VMX MSR configuration if the feature is supported in hardware and enabled in KVM's base, non-nested configuration, i.e. expose ENABLE_USR_WAIT_PAUSE to L1 if it's supported. This fixes a bug where saving/restoring, i.e. migrating, a vCPU will fail if WAITPKG (the associated CPUID feature) is enabled for the vCPU, and obviously allows L1 to enable the feature for L2.
KVM already effectively exposes ENABLE_USR_WAIT_PAUSE to L1 by stuffing the allowed-1 control ina vCPU's virtual MSR_IA32_VMX_PROCBASED_CTLS2 when updating secondary controls in response to KVM_SET_CPUID(2), but (a) that depends on flawed code (KVM shouldn't touch VMX MSRs in response to CPUID updates) and (b) runs afoul of vmx_restore_control_msr()'s restriction that the guest value must be a strict subset of the supported host value.
Although no past commit explicitly enabled nested support for WAITPKG, doing so is safe and functionally correct from an architectural perspective as no additional KVM support is needed to virtualize TPAUSE, UMONITOR, and UMWAIT for L2 relative to L1, and KVM already forwards VM-Exits to L1 as necessary (commit bf653b78f960, "KVM: vmx: Introduce handle_unexpected_vmexit and handle WAITPKG vmexit").
Note, KVM always keeps the hosts MSR_IA32_UMWAIT_CONTROL resident in hardware, i.e. always runs both L1 and L2 with the host's power management settings for TPAUSE and UMWAIT. See commit bf09fb6cba4f ("KVM: VMX: Stop context switching MSR_IA32_UMWAIT_CONTROL") for more details.
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/nested.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/kvm/vmx/nested.c +2 -1
@@ -6830,7 +6830,8 @@ void nested_vmx_setup_ctls_msrs(struct vSECONDARY_EXEC_ENABLE_INVPCID |SECONDARY_EXEC_RDSEED_EXITING |SECONDARY_EXEC_XSAVES | -SECONDARY_EXEC_TSC_SCALING ; +SECONDARY_EXEC_TSC_SCALING | +SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE ;/* * We can emulate "VMCS shadowing," even if the hardware
Greg Kroah-Hartman
maintainerPATCH 86/207 x86/microcode/intel: Do not retry microcode reloading on the APs
In reply to Greg Kroah-HartmanFrom: Ashok Raj <[email protected]>
commit be1b670f61443aa5d0d01782e9b8ea0ee825d018 upstream.
The retries in load_ucode_intel_ap() were in place to support systems with mixed steppings. Mixed steppings are no longer supported and there is only one microcode image at a time. Any retries will simply reattempt to apply the same image over and over without making progress.
[ bp: Zap the circumstantial reasoning from the commit message. ]
--- arch/x86/kernel/cpu/microcode/intel.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
arch/x86/kernel/cpu/microcode/intel.c +1 -7
@@ -621,7 +621,6 @@ void load_ucode_intel_ap(void)else iup = &intel_ucode_patch; -reget:if (!*iup) { patch =__load_ucode_intel (&uci);if (!patch)
@@ -632,12 +631,7 @@ reget: uci.mc = *iup; -if (apply_microcode_early (&uci, true)) { -/* Mixed-silicon system? Try to refetch the proper patch: */ - *iup =NULL ; - - goto reget; - } +apply_microcode_early (&uci, true); }static struct microcode_intel *find_patch (struct ucode_cpu_info *uci)
Greg Kroah-Hartman
maintainerPATCH 87/207 ftrace/x86: Add back ftrace_expected for ftrace bug reports
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
commit fd3dc56253acbe9c641a66d312d8393cd55eb04c upstream.
After someone reported a bug report with a failed modification due to the expected value not matching what was found, it came to my attention that the ftrace_expected is no longer set when that happens. This makes for debugging the issue a bit more difficult.
Set ftrace_expected to the expected code before calling ftrace_bug, so that it shows what was expected and why it failed.
--- arch/x86/kernel/ftrace.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/ftrace.c +2 -0
@@ -217,7 +217,9 @@ void ftrace_replace_code(int enable) ret =ftrace_verify_code (rec->ip, old);if (ret) { + ftrace_expected = old;ftrace_bug (ret, rec); + ftrace_expected =NULL ;return ; } }
Greg Kroah-Hartman
maintainerPATCH 88/207 x86/kprobes: Fix kprobes instruction boudary check with CONFIG_RETHUNK
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
commit 1993bf97992df2d560287f3c4120eda57426843d upstream.
Since the CONFIG_RETHUNK and CONFIG_SLS will use INT3 for stopping speculative execution after RET instruction, kprobes always failes to check the probed instruction boundary by decoding the function body if the probed address is after such sequence. (Note that some conditional code blocks will be placed after function return, if compiler decides it is not on the hot path.)
This is because kprobes expects kgdb puts the INT3 as a software breakpoint and it will replace the original instruction. But these INT3 are not such purpose, it doesn't need to recover the original instruction.
To avoid this issue, kprobes checks whether the INT3 is owned by kgdb or not, and if so, stop decoding and make it fail. The other INT3 will come from CONFIG_RETHUNK/CONFIG_SLS and those can be treated as a one-byte instruction.
--- arch/x86/kernel/kprobes/core.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/x86/kernel/kprobes/core.c +7 -3
@@ -37,6 +37,7 @@#include <linux/extable.h> #include <linux/kdebug.h> #include <linux/kallsyms.h> +#include <linux/kgdb.h> #include <linux/ftrace.h> #include <linux/kasan.h> #include <linux/moduleloader.h>
@@ -281,12 +282,15 @@ static int can_probe(unsigned long paddrif (ret <0 )return 0 ; +#ifdef CONFIG_KGDB /* -* Another debugging subsystem might insert this breakpoint. -* In that case, we can't recover it. +* If there is a dynamically installed kgdb sw breakpoint, +* this function should not be probed. */ -if (insn.opcode.bytes[0 ] ==INT3_INSN_OPCODE ) +if (insn.opcode.bytes[0 ] ==INT3_INSN_OPCODE && +kgdb_has_hit_break (addr))return 0 ; +#endif addr += insn.length; }
Greg Kroah-Hartman
maintainerPATCH 89/207 x86/kprobes: Fix optprobe optimization check with CONFIG_RETHUNK
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
commit 63dc6325ff41ee9e570bde705ac34a39c5dbeb44 upstream.
Since the CONFIG_RETHUNK and CONFIG_SLS will use INT3 for stopping speculative execution after function return, kprobe jump optimization always fails on the functions with such INT3 inside the function body. (It already checks the INT3 padding between functions, but not inside
the function)
To avoid this issue, as same as kprobes, check whether the INT3 comes from kgdb or not, and if so, stop decoding and make it fail. The other INT3 will come from CONFIG_RETHUNK/CONFIG_SLS and those can be treated as a one-byte instruction.
--- arch/x86/kernel/kprobes/opt.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-)
arch/x86/kernel/kprobes/opt.c +8 -20
@@ -15,6 +15,7 @@#include <linux/extable.h> #include <linux/kdebug.h> #include <linux/kallsyms.h> +#include <linux/kgdb.h> #include <linux/ftrace.h> #include <linux/objtool.h> #include <linux/pgtable.h>
@@ -279,19 +280,6 @@ static int insn_is_indirect_jump(structreturn ret; } -static bool is_padding_int3 (unsigned long addr,unsigned long eaddr) -{ -unsigned char ops; - -for (; addr < eaddr; addr++) { -if (get_kernel_nofault (ops, (void *)addr) <0 || - ops !=INT3_INSN_OPCODE ) -return false; - } - -return true; -} -/* Decode whole function to ensure any instructions don't jump into target */ static int can_optimize (unsigned long paddr) {
@@ -334,15 +322,15 @@ static int can_optimize(unsigned long pa ret =insn_decode_kernel (&insn, (void *)recovered_insn);if (ret <0 )return 0 ; - +#ifdef CONFIG_KGDB /* -* In the case of detecting unknown breakpoint, this could be -* a padding INT3 between functions. Let's check that all the -* rest of the bytes are also INT3. +* If there is a dynamically installed kgdb sw breakpoint, +* this function should not be probed. */ -if (insn.opcode.bytes[0 ] ==INT3_INSN_OPCODE ) -return is_padding_int3 (addr, paddr - offset + size) ?1 :0 ; - +if (insn.opcode.bytes[0 ] ==INT3_INSN_OPCODE && +kgdb_has_hit_break (addr)) +return 0 ; +#endif /* Recover address */ insn.kaddr = (void *)addr; insn.next_byte = (void *)(addr + insn.length);
Greg Kroah-Hartman
maintainerPATCH 90/207 tracing: Fix race where eprobes can be called before the event
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
commit d5f30a7da8ea8e6450250275cec5670cee3c4264 upstream.
The flag that tells the event to call its triggers after reading the event is set for eprobes after the eprobe is enabled. This leads to a race where the eprobe may be triggered at the beginning of the event where the record information is NULL. The eprobe then dereferences the NULL record causing a NULL kernel pointer bug.
Test for a NULL record to keep this from happening.
--- kernel/trace/trace_eprobe.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/trace_eprobe.c +3 -0
@@ -567,6 +567,9 @@ static void eprobe_trigger_func(struct eif (unlikely (!rec))return ; +if (unlikely (!rec)) +return ; +__eprobe_trace_func (edata, rec); }
Greg Kroah-Hartman
maintainerPATCH 91/207 powerpc/ftrace: fix syscall tracing on PPC64_ELF_ABI_V1
In reply to Greg Kroah-HartmanFrom: Michael Jeanson <[email protected]>
commit ad050d2390fccb22aa3e6f65e11757ce7a5a7ca5 upstream.
In v5.7 the powerpc syscall entry/exit logic was rewritten in C, on PPC64_ELF_ABI_V1 this resulted in the symbols in the syscall table changing from their dot prefixed variant to the non-prefixed ones.
Since ftrace prefixes a dot to the syscall names when matching them to build its syscall event list, this resulted in no syscall events being available.
Remove the PPC64_ELF_ABI_V1 specific version of arch_syscall_match_sym_name to have the same behavior across all powerpc variants.
--- arch/powerpc/include/asm/ftrace.h | 12 ------------ 1 file changed, 12 deletions(-)
arch/powerpc/include/asm/ftrace.h +0 -12
@@ -64,17 +64,6 @@ void ftrace_graph_func(unsigned long ip,* those. */ #define ARCH_HAS_SYSCALL_MATCH_SYM_NAME -#ifdef CONFIG_PPC64_ELF_ABI_V1 -static inline bool arch_syscall_match_sym_name (const char *sym,const char *name) -{ -/* We need to skip past the initial dot, and the __se_sys alias */ -return !strcmp (sym +1 , name) || - (!strncmp (sym,".__se_sys" ,9 ) && !strcmp (sym +6 , name)) || - (!strncmp (sym,".ppc_" ,5 ) && !strcmp (sym +5 , name +4 )) || - (!strncmp (sym,".ppc32_" ,7 ) && !strcmp (sym +7 , name +4 )) || - (!strncmp (sym,".ppc64_" ,7 ) && !strcmp (sym +7 , name +4 )); -} -#else static inline bool arch_syscall_match_sym_name (const char *sym,const char *name) { return !strcmp(sym, name) ||
@@ -83,7 +72,6 @@ static inline bool arch_syscall_match_sy (!strncmp (sym,"ppc32_" ,6 ) && !strcmp (sym +6 , name +4 )) || (!strncmp(sym, "ppc64_", 6) && !strcmp(sym + 6, name + 4)); } -#endif /* CONFIG_PPC64_ELF_ABI_V1 */ #endif /* CONFIG_FTRACE_SYSCALLS */ #if defined(CONFIG_PPC64 ) && defined(CONFIG_FUNCTION_TRACER )
Greg Kroah-Hartman
maintainerPATCH 92/207 tracing: Fix complicated dependency of CONFIG_TRACER_MAX_TRACE
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
commit e25e43a4e5d8cb2323553d8b6a7ba08d2ebab21f upstream.
Both CONFIG_OSNOISE_TRACER and CONFIG_HWLAT_TRACER partially enables the CONFIG_TRACER_MAX_TRACE code, but that is complicated and has introduced a bug; It declares tracing_max_lat_fops data structure outside of #ifdefs, but since it is defined only when CONFIG_TRACER_MAX_TRACE=y or CONFIG_HWLAT_TRACER=y, if only CONFIG_OSNOISE_TRACER=y, that declaration comes to a definition(!).
To fix this issue, and do not repeat the similar problem, makes CONFIG_OSNOISE_TRACER and CONFIG_HWLAT_TRACER enables the CONFIG_TRACER_MAX_TRACE always. It has there benefits;
- Fix the tracing_max_lat_fops bug
- Simplify the #ifdefs
- CONFIG_TRACER_MAX_TRACE code is fully enabled, or not.
--- kernel/trace/Kconfig | 2 ++ kernel/trace/trace.c | 23 +++++++++++++---------- kernel/trace/trace.h | 8 +++----- 3 files changed, 18 insertions(+), 15 deletions(-)
kernel/trace/Kconfig +2 -0
@@ -375,6 +375,7 @@ config SCHED_TRACER config HWLAT_TRACER bool "Tracer to detect hardware latencies (like SMIs)" select GENERIC_TRACER + select TRACER_MAX_TRACE help This tracer, when enabled will create one or more kernel threads, depending on what the cpumask file is set to, which each thread
@@ -410,6 +411,7 @@ config HWLAT_TRACER config OSNOISE_TRACER bool "OS Noise tracer" select GENERIC_TRACER + select TRACER_MAX_TRACE help In the context of high-performance computing (HPC), the Operating System Noise (osnoise) refers to the interference experienced by an
kernel/trace/trace.c +13 -10
@@ -1421,6 +1421,7 @@ int tracing_snapshot_cond_disable(struct return false; }EXPORT_SYMBOL_GPL (tracing_snapshot_cond_disable); +#define free_snapshot (tr) do { } while (0)#endif /* CONFIG_TRACER_SNAPSHOT */ void tracer_tracing_off (struct trace_array *tr)
@@ -1692,6 +1693,8 @@ static ssize_t trace_seq_to_buffer(struc }unsigned long __read_mostly tracing_thresh; + +#ifdef CONFIG_TRACER_MAX_TRACE static const struct file_operations tracing_max_lat_fops;#ifdef LATENCY_FS_NOTIFY
@@ -1748,18 +1751,14 @@ void latency_fsnotify(struct trace_array irq_work_queue(&tr->fsnotify_irqwork); } -#elif defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) \ - || defined(CONFIG_OSNOISE_TRACER) +#else /* !LATENCY_FS_NOTIFY */ #define trace_create_maxlat_file (tr, d_tracer) \ trace_create_file("tracing_max_latency", TRACE_MODE_WRITE, \ d_tracer, &tr->max_latency, &tracing_max_lat_fops) -#else -#define trace_create_maxlat_file (tr, d_tracer) do { } while (0)#endif -#ifdef CONFIG_TRACER_MAX_TRACE /* * Copy the new maximum trace into the separate maximum-trace * structure. (this way the maximum trace is permanently saved,
@@ -1834,14 +1833,15 @@ update_max_tr(struct trace_array *tr, string_buffer_record_off (tr->max_buffer.buffer);#ifdef CONFIG_TRACER_SNAPSHOT -if (tr->cond_snapshot && !tr->cond_snapshot->update (tr, cond_data)) - goto out_unlock; +if (tr->cond_snapshot && !tr->cond_snapshot->update (tr, cond_data)) { +arch_spin_unlock (&tr->max_lock); +return ; + }#endif swap (tr->array_buffer.buffer, tr->max_buffer.buffer);__update_max_tr (tr, tsk, cpu); - out_unlock:arch_spin_unlock (&tr->max_lock); }
@@ -1888,6 +1888,7 @@ update_max_tr_single(struct trace_array__update_max_tr (tr, tsk, cpu); arch_spin_unlock(&tr->max_lock); } +#endif /* CONFIG_TRACER_MAX_TRACE */ static int wait_on_pipe (struct trace_iterator *iter,int full)
@@ -6572,7 +6573,7 @@ out:return ret; } -#if defined(CONFIG_TRACER_MAX_TRACE ) || defined(CONFIG_HWLAT_TRACER ) +#ifdef CONFIG_TRACER_MAX_TRACE static ssize_t tracing_max_lat_read(struct file *filp, char __user *ubuf,
@@ -7587,7 +7588,7 @@ static const struct file_operations trac .llseek = generic_file_llseek, }; -#if defined(CONFIG_TRACER_MAX_TRACE ) || defined(CONFIG_HWLAT_TRACER ) +#ifdef CONFIG_TRACER_MAX_TRACE static const struct file_operations tracing_max_lat_fops = { .open = tracing_open_generic, .read = tracing_max_lat_read,
@@ -9601,7 +9602,9 @@ init_tracer_tracefs(struct trace_array *create_trace_options_dir (tr); +#ifdef CONFIG_TRACER_MAX_TRACE trace_create_maxlat_file (tr, d_tracer); +#endif if (ftrace_create_function_files (tr, d_tracer))MEM_FAIL (1 ,"Could not allocate function filter files" );
kernel/trace/trace.h +3 -5
@@ -308,8 +308,7 @@ struct trace_array {struct array_buffer max_buffer;bool allocated_snapshot;#endif -#if defined(CONFIG_TRACER_MAX_TRACE ) || defined(CONFIG_HWLAT_TRACER ) \ - || defined(CONFIG_OSNOISE_TRACER ) +#ifdef CONFIG_TRACER_MAX_TRACE unsigned long max_latency;#ifdef CONFIG_FSNOTIFY struct dentry *d_max_latency;
@@ -688,12 +687,11 @@ void update_max_tr(struct trace_array *t void *cond_data);void update_max_tr_single (struct trace_array *tr,struct task_struct *tsk,int cpu); -#endif /* CONFIG_TRACER_MAX_TRACE */ -#if (defined(CONFIG_TRACER_MAX_TRACE ) || defined(CONFIG_HWLAT_TRACER ) \ - || defined(CONFIG_OSNOISE_TRACER )) && defined(CONFIG_FSNOTIFY ) +#ifdef CONFIG_FSNOTIFY #define LATENCY_FS_NOTIFY #endif +#endif /* CONFIG_TRACER_MAX_TRACE */ #ifdef LATENCY_FS_NOTIFY void latency_fsnotify (struct trace_array *tr);
Greg Kroah-Hartman
maintainerPATCH 93/207 tracing/hist: Fix wrong return value in parse_action_params()
In reply to Greg Kroah-HartmanFrom: Zheng Yejian <[email protected]>
commit 2cc6a528882d0e0ccbc1bca5f95b8c963cedac54 upstream.
When number of synth fields is more than SYNTH_FIELDS_MAX, parse_action_params() should return -EINVAL.
--- kernel/trace/trace_events_hist.c | 1 + 1 file changed, 1 insertion(+)
kernel/trace/trace_events_hist.c +1 -0
@@ -3588,6 +3588,7 @@ static int parse_action_params(struct trwhile (params) {if (data->n_params >=SYNTH_FIELDS_MAX ) {hist_err (tr,HIST_ERR_TOO_MANY_PARAMS ,0 ); + ret = -EINVAL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 94/207 tracing/probes: Handle system names with hyphens
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
commit 575b76cb885532aae13a9d979fd476bb2b156cb9 upstream.
When creating probe names, a check is done to make sure it matches basic C standard variable naming standards. Basically, starts with alphabetic or underline, and then the rest of the characters have alpha-numeric or underline in them.
But system names do not have any true naming conventions, as they are created by the TRACE_SYSTEM macro and nothing tests to see what they are. The "xhci-hcd" trace events has a '-' in the system name. When trying to attach a eprobe to one of these trace points, it fails because the system name does not follow the variable naming convention because of the hyphen, and the eprobe checks fail on this.
Allow hyphens in the system name so that eprobes can attach to the "xhci-hcd" trace events.
--- kernel/trace/trace.h | 19 ++++++++++++++++--- kernel/trace/trace_probe.c | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-)
kernel/trace/trace.h +16 -3
@@ -1954,17 +1954,30 @@ static __always_inline void trace_iterat }/* Check the name is good for event/group/fields */ -static inline bool is_good_name (const char *name) +static inline bool __is_good_name (const char *name,bool hash_ok) { -if (!isalpha (*name) && *name !='_' ) +if (!isalpha (*name) && *name !='_' && (!hash_ok || *name !='-' ))return false;while (*++name !='\0' ) { -if (!isalpha (*name) && !isdigit (*name) && *name !='_' ) +if (!isalpha (*name) && !isdigit (*name) && *name !='_' && + (!hash_ok || *name !='-' ))return false; }return true; } +/* Check the name is good for event/group/fields */ +static inline bool is_good_name (const char *name) +{ +return __is_good_name (name, false); +} + +/* Check the name is good for system */ +static inline bool is_good_system_name (const char *name) +{ +return __is_good_name (name, true); +} +/* Convert certain expected symbols into '_' when generating event names */ static inline void sanitize_event_name (char *name) {
kernel/trace/trace_probe.c +1 -1
@@ -246,7 +246,7 @@ int traceprobe_parse_event_name(const chreturn -EINVAL ; }strlcpy (buf, event, slash - event +1 ); -if (!is_good_name (buf)) { +if (!is_good_system_name (buf)) {trace_probe_log_err (offset,BAD_GROUP_NAME );return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 95/207 tracing: Fix issue of missing one synthetic field
In reply to Greg Kroah-HartmanFrom: Zheng Yejian <[email protected]>
commit ff4837f7fe59ff018eca4705a70eca5e0b486b97 upstream.
The maximum number of synthetic fields supported is defined as SYNTH_FIELDS_MAX which value currently is 64, but it actually fails when try to generate a synthetic event with 64 fields by executing like:
# echo "my_synth_event int v1; int v2; int v3; int v4; int v5; int v6;\ int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14;\ int v15; int v16; int v17; int v18; int v19; int v20; int v21; int v22;\ int v23; int v24; int v25; int v26; int v27; int v28; int v29; int v30;\ int v31; int v32; int v33; int v34; int v35; int v36; int v37; int v38;\ int v39; int v40; int v41; int v42; int v43; int v44; int v45; int v46;\ int v47; int v48; int v49; int v50; int v51; int v52; int v53; int v54;\ int v55; int v56; int v57; int v58; int v59; int v60; int v61; int v62;\ int v63; int v64" >> /sys/kernel/tracing/synthetic_events
Correct the field counting to fix it.
--- kernel/trace/trace_events_synth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_events_synth.c +1 -1
@@ -1282,12 +1282,12 @@ static int __create_synth_event(const ch goto err_free_arg; } - fields[n_fields++] = field;if (n_fields ==SYNTH_FIELDS_MAX ) {synth_err (SYNTH_ERR_TOO_MANY_FIELDS ,0 ); ret = -EINVAL ; goto err_free_arg; } + fields[n_fields++] = field; n_fields_this_loop++; }
Greg Kroah-Hartman
maintainerPATCH 96/207 tracing: Fix infinite loop in tracing_read_pipe on overflowed print_trace_line
In reply to Greg Kroah-HartmanFrom: Yang Jihong <[email protected]>
commit c1ac03af6ed45d05786c219d102f37eb44880f28 upstream.
print_trace_line may overflow seq_file buffer. If the event is not consumed, the while loop keeps peeking this event, causing a infinite loop.
--- kernel/trace/trace.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
kernel/trace/trace.c +14 -1
@@ -6797,7 +6797,20 @@ waitagain: ret =print_trace_line (iter);if (ret ==TRACE_TYPE_PARTIAL_LINE ) { -/* don't print partial lines */ +/* +* If one print_trace_line() fills entire trace_seq in one shot, +* trace_seq_to_user() will returns -EBUSY because save_len == 0, +* In this case, we need to consume it, otherwise, loop will peek +* this event next time, resulting in an infinite loop. +*/ +if (save_len ==0 ) { + iter->seq.full =0 ; +trace_seq_puts (&iter->seq,"[LINE TOO BIG]\n" ); +trace_consume (iter); +break ; + } + +/* In other cases, don't print partial lines */ iter->seq.seq.len = save_len;break ; }
Greg Kroah-Hartman
maintainerPATCH 97/207 staging: media: tegra-video: fix chan->mipi value on error
In reply to Greg Kroah-HartmanFrom: Luca Ceresoli <[email protected]>
commit 10b5ce6743c839fa75336042c64e2479caec9430 upstream.
chan->mipi takes the return value of tegra_mipi_request() which can be a valid pointer or an error. However chan->mipi is checked in several places, including error-cleanup code in tegra_csi_channels_cleanup(), as 'if (chan->mipi)', which suggests the initial intent was that chan->mipi should be either NULL or a valid pointer, never an error. As a consequence, cleanup code in case of tegra_mipi_request() errors would dereference an invalid pointer.
Fix by ensuring chan->mipi always contains either NULL or a void pointer.
Also add that to the documentation.
--- drivers/staging/media/tegra-video/csi.c | 1 + drivers/staging/media/tegra-video/csi.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/staging/media/tegra-video/csi.c +1 -0
@@ -448,6 +448,7 @@ static int tegra_csi_channel_alloc(struc chan->mipi =tegra_mipi_request (csi->dev, node);if (IS_ERR (chan->mipi)) { ret =PTR_ERR (chan->mipi); + chan->mipi =NULL ;dev_err (csi->dev,"failed to get mipi device: %d\n" , ret); }
drivers/staging/media/tegra-video/csi.h +1 -1
@@ -56,7 +56,7 @@ struct tegra_csi;* @framerate: active framerate for TPG * @h_blank: horizontal blanking for TPG active format * @v_blank: vertical blanking for TPG active format -* @mipi: mipi device for corresponding csi channel pads +* @mipi: mipi device for corresponding csi channel pads, or NULL if not applicable (TPG, error) * @pixel_rate: active pixel rate from the sensor on this channel */ struct tegra_csi_channel {
Greg Kroah-Hartman
maintainerPATCH 98/207 staging: media: tegra-video: fix device_node use after free
In reply to Greg Kroah-HartmanFrom: Luca Ceresoli <[email protected]>
commit c4d344163c3a7f90712525f931a6c016bbb35e18 upstream.
At probe time this code path is followed:
* tegra_csi_init
* tegra_csi_channels_alloc
* for_each_child_of_node(node, channel) -- iterates over channels
* automatically gets 'channel'
* tegra_csi_channel_alloc()
* saves into chan->of_node a pointer to the channel OF node
* automatically gets and puts 'channel'
* now the node saved in chan->of_node has refcount 0, can disappear
* tegra_csi_channels_init
* iterates over channels
* tegra_csi_channel_init -- uses chan->of_node
After that, chan->of_node keeps storing the node until the device is removed.
of_node_get() the node and of_node_put() it during teardown to avoid any risk.
--- drivers/staging/media/tegra-video/csi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/staging/media/tegra-video/csi.c +2 -1
@@ -433,7 +433,7 @@ static int tegra_csi_channel_alloc(strucfor (i =0 ; i < chan->numgangports; i++) chan->csi_port_nums[i] = port_num + i *CSI_PORTS_PER_BRICK ; - chan->of_node = node; + chan->of_node =of_node_get (node); chan->numpads = num_pads;if (num_pads &0x2 ) { chan->pads[0 ].flags =MEDIA_PAD_FL_SINK ;
@@ -641,6 +641,7 @@ static void tegra_csi_channels_cleanup(smedia_entity_cleanup (&subdev->entity); } +of_node_put (chan->of_node);list_del (&chan->list);kfree (chan); }
Greg Kroah-Hartman
maintainerPATCH 99/207 arm64: dts: mediatek: mt8195-demo: fix the memory size of node secmon
In reply to Greg Kroah-HartmanFrom: Macpaul Lin <[email protected]>
commit e4a4175201014c0222f6bab1895a17b3d1b92f08 upstream.
The size of device tree node secmon (bl31_secmon_reserved) was incorrect. It should be increased to 2MiB (0x200000).
The origin setting will cause some abnormal behavior due to trusted-firmware-a and related firmware didn't load correctly. The incorrect behavior may vary because of different software stacks. For example, it will cause build error in some Yocto project because it will check if there was enough memory to load trusted-firmware-a to the reserved memory.
When mt8195-demo.dts sent to the upstream, at that time the size of BL31 was small. Because supported functions and modules in BL31 are basic sets when the board was under early development stage.
Now BL31 includes more firmwares of coprocessors and maturer functions so the size has grown bigger in real applications. According to the value reported by customers, we think reserved 2MiB for BL31 might be enough for maybe the following 2 or 3 years.
--- arch/arm64/boot/dts/mediatek/mt8195-demo.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt8195-demo.dts +2 -2
@@ -56,10 +56,10 @@ #size-cells = <2>; ranges; - /* 192 KiB reserved for ARM Trusted Firmware (BL31) */ + /* 2 MiB reserved for ARM Trusted Firmware (BL31) */ bl31_secmon_reserved: secmon@54600000 { no-map; - reg = <0 0x54600000 0x0 0x30000>; + reg = <0 0x54600000 0x0 0x200000>; }; /* 12 MiB reserved for OP-TEE (BL32)
Greg Kroah-Hartman
maintainerPATCH 100/207 ARM: 9256/1: NWFPE: avoid compiler-generated __aeabi_uldivmod
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
commit 3220022038b9a3845eea762af85f1c5694b9f861 upstream.
clang-15's ability to elide loops completely became more aggressive when it can deduce how a variable is being updated in a loop. Counting down one variable by an increment of another can be replaced by a modulo operation.
For 64b variables on 32b ARM EABI targets, this can result in the compiler generating calls to __aeabi_uldivmod, which it does for a do while loop in float64_rem().
For the kernel, we'd generally prefer that developers not open code 64b division via binary / operators and instead use the more explicit helpers from div64.h. On arm-linux-gnuabi targets, failure to do so can result in linkage failures due to undefined references to __aeabi_uldivmod().
While developers can avoid open coding divisions on 64b variables, the compiler doesn't know that the Linux kernel has a partial implementation of a compiler runtime (--rtlib) to enforce this convention.
It's also undecidable for the compiler whether the code in question would be faster to execute the loop vs elide it and do the 64b division.
While I actively avoid using the internal -mllvm command line flags, I think we get better code than using barrier() here, which will force reloads+spills in the loop for all toolchains.
--- arch/arm/nwfpe/Makefile | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm/nwfpe/Makefile +6 -0
@@ -11,3 +11,9 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11 entry.o nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o + +# Try really hard to avoid generating calls to __aeabi_uldivmod() from +# float64_rem() due to loop elision. +ifdef CONFIG_CC_IS_CLANG +CFLAGS_softfloat.o += -mllvm -replexitval=never +endif
Greg Kroah-Hartman
maintainerPATCH 101/207 media: dvb-core: Fix double free in dvb_register_device()
In reply to Greg Kroah-HartmanFrom: Keita Suzuki <[email protected]>
commit 6b0d0477fce747d4137aa65856318b55fba72198 upstream.
In function dvb_register_device() -> dvb_register_media_device() -> dvb_create_media_entity(), dvb->entity is allocated and initialized. If the initialization fails, it frees the dvb->entity, and return an error code. The caller takes the error code and handles the error by calling dvb_media_device_free(), which unregisters the entity and frees the field again if it is not NULL. As dvb->entity may not NULLed in dvb_create_media_entity() when the allocation of dvbdev->pad fails, a double free may occur. This may also cause an Use After free in media_device_unregister_entity().
Fix this by storing NULL to dvb->entity when it is freed.
--- drivers/media/dvb-core/dvbdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/dvb-core/dvbdev.c +1 -0
@@ -335,6 +335,7 @@ static int dvb_create_media_entity(struc GFP_KERNEL);if (!dvbdev->pads) {kfree (dvbdev->entity); + dvbdev->entity =NULL ;return -ENOMEM ; } }
Greg Kroah-Hartman
maintainerPATCH 102/207 media: dvb-core: Fix UAF due to refcount races at releasing
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit fd3d91ab1c6ab0628fe642dd570b56302c30a792 upstream.
The dvb-core tries to sync the releases of opened files at dvb_dmxdev_release() with two refcounts: dvbdev->users and dvr_dvbdev->users. A problem is present in those two syncs: when yet another dvb_demux_open() is called during those sync waits, dvb_demux_open() continues to process even if the device is being closed. This includes the increment of the former refcount, resulting in the leftover refcount after the sync of the latter refcount at dvb_dmxdev_release(). It ends up with use-after-free, since the function believes that all usages were gone and releases the resources.
This patch addresses the problem by adding the check of dmxdev->exit flag at dvb_demux_open(), just like dvb_dvr_open() already does. With the exit flag check, the second call of dvb_demux_open() fails, hence the further corruption can be avoided.
Also for avoiding the races of the dmxdev->exit flag reference, this patch serializes the dmxdev->exit set up and the sync waits with the dmxdev->mutex lock at dvb_dmxdev_release(). Without the mutex lock, dvb_demux_open() (or dvb_dvr_open()) may run concurrently with dvb_dmxdev_release(), which allows to skip the exit flag check and continue the open process that is being closed.
CVE-2022-41218 is assigned to those bugs above.
--- drivers/media/dvb-core/dmxdev.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/media/dvb-core/dmxdev.c +8 -0
@@ -790,6 +790,11 @@ static int dvb_demux_open(struct inode *if (mutex_lock_interruptible (&dmxdev->mutex))return -ERESTARTSYS ; +if (dmxdev->exit) { +mutex_unlock (&dmxdev->mutex); +return -ENODEV ; + } +for (i =0 ; i < dmxdev->filternum; i++)if (dmxdev->filter[i].state ==DMXDEV_STATE_FREE )break ;
@@ -1448,7 +1453,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);void dvb_dmxdev_release (struct dmxdev *dmxdev) { +mutex_lock (&dmxdev->mutex); dmxdev->exit =1 ; +mutex_unlock (&dmxdev->mutex); +if (dmxdev->dvbdev->users >1 ) {wait_event (dmxdev->dvbdev->wait_queue, dmxdev->dvbdev->users ==1 );
Greg Kroah-Hartman
maintainerPATCH 103/207 cifs: fix confusing debug message
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit a85ceafd41927e41a4103d228a993df7edd8823b upstream.
Since rc was initialised to -ENOMEM in cifs_get_smb_ses(), when an existing smb session was found, free_xid() would be called and then print
CIFS: fs/cifs/connect.c: Existing tcp session with server found
CIFS: fs/cifs/connect.c: VFS: in cifs_get_smb_ses as Xid: 44 with uid: 0
CIFS: fs/cifs/connect.c: Existing smb sess found (status=1)
CIFS: fs/cifs/connect.c: VFS: leaving cifs_get_smb_ses (xid = 44) rc = -12
Fix this by initialising rc to 0 and then let free_xid() print this instead
CIFS: fs/cifs/connect.c: Existing tcp session with server found
CIFS: fs/cifs/connect.c: VFS: in cifs_get_smb_ses as Xid: 14 with uid: 0
CIFS: fs/cifs/connect.c: Existing smb sess found (status=1)
CIFS: fs/cifs/connect.c: VFS: leaving cifs_get_smb_ses (xid = 14) rc = 0
--- fs/cifs/connect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/cifs/connect.c +3 -1
@@ -2157,7 +2157,7 @@ cifs_set_cifscreds(struct smb3_fs_contexstruct cifs_ses *cifs_get_smb_ses (struct TCP_Server_Info *server,struct smb3_fs_context *ctx) { -int rc = -ENOMEM ; +int rc =0 ;unsigned int xid;struct cifs_ses *ses;struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
@@ -2206,6 +2206,8 @@ cifs_get_smb_ses(struct TCP_Server_Inforeturn ses; } + rc = -ENOMEM ; +cifs_dbg (FYI ,"Existing smb sess not found\n" ); ses =sesInfoAlloc ();if (ses ==NULL )
Greg Kroah-Hartman
maintainerPATCH 104/207 cifs: fix missing display of three mount options
In reply to Greg Kroah-HartmanFrom: Steve French <[email protected]>
commit 2bfd81043e944af0e52835ef6d9b41795af22341 upstream.
Three mount options: "tcpnodelay" and "noautotune" and "noblocksend" were not displayed when passed in on cifs/smb3 mounts (e.g. displayed in /proc/mounts e.g.). No change to defaults so these are not displayed if not specified on mount.
--- fs/cifs/cifsfs.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/cifs/cifsfs.c +7 -1
@@ -678,9 +678,15 @@ cifs_show_options(struct seq_file *s, stseq_printf (s,",echo_interval=%lu" , tcon->ses->server->echo_interval /HZ ); -/* Only display max_credits if it was overridden on mount */ +/* Only display the following if overridden on mount */ if (tcon->ses->server->max_credits !=SMB2_MAX_CREDITS_AVAILABLE )seq_printf (s,",max_credits=%u" , tcon->ses->server->max_credits); +if (tcon->ses->server->tcp_nodelay) +seq_puts (s,",tcpnodelay" ); +if (tcon->ses->server->noautotune) +seq_puts (s,",noautotune" ); +if (tcon->ses->server->noblocksnd) +seq_puts (s,",noblocksend" );if (tcon->snapshot_time)seq_printf (s,",snapshot=%llu" , tcon->snapshot_time);
Greg Kroah-Hartman
maintainerPATCH 105/207 cifs: set correct tcon status after initial tree connect
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit b248586a49a7729f73c504b1e7b958caea45e927 upstream.
cifs_tcon::status wasn't correctly updated to TID_GOOD after initial tree connect thus staying at TID_NEW as long as it was connected.
--- fs/cifs/connect.c | 1 + 1 file changed, 1 insertion(+)
fs/cifs/connect.c +1 -0
@@ -2602,6 +2602,7 @@ cifs_get_tcon(struct cifs_ses *ses, stru tcon->nodelete = ctx->nodelete; tcon->local_lease = ctx->local_lease;INIT_LIST_HEAD (&tcon->pending_opens); + tcon->status =TID_GOOD ;/* schedule query interfaces poll */ INIT_DELAYED_WORK(&tcon->query_interfaces,
Greg Kroah-Hartman
maintainerPATCH 106/207 cifs: set correct ipc status after initial tree connect
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit 86fe0fa8747fb1bc4cc44fc1966e0959fe752f38 upstream.
cifs_tcon::status wasn't correctly updated to TID_GOOD after establishing initial IPC connection thus staying at TID_NEW as long as it wasn't reconnected.
--- fs/cifs/connect.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/cifs/connect.c +5 -2
@@ -1871,6 +1871,9 @@ cifs_setup_ipc(struct cifs_ses *ses, strcifs_dbg (FYI ,"IPC tcon rc=%d ipc tid=0x%x\n" , rc, tcon->tid); +spin_lock (&tcon->tc_lock); + tcon->status =TID_GOOD ; +spin_unlock (&tcon->tc_lock); ses->tcon_ipc = tcon; out:return rc;
@@ -2280,10 +2283,10 @@ cifs_get_smb_ses(struct TCP_Server_Infolist_add (&ses->smb_ses_list, &server->smb_ses_list);spin_unlock (&cifs_tcp_ses_lock); -free_xid (xid); -cifs_setup_ipc (ses, ctx); +free_xid (xid); +return ses; get_ses_fail:
Greg Kroah-Hartman
maintainerPATCH 107/207 cifs: set correct status of tcon ipc when reconnecting
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit 25cf01b7c9200d6ace5a59125d8166435dd9dea7 upstream.
The status of tcon ipcs were not being set to TID_NEED_RECO when marking sessions and tcons to be reconnected, therefore not sending tree connect to those ipcs in cifs_tree_connect() and leaving them disconnected.
--- fs/cifs/connect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/cifs/connect.c +3 -1
@@ -279,8 +279,10 @@ cifs_mark_tcp_ses_conns_for_reconnect(st tcon->need_reconnect = true; tcon->status =TID_NEED_RECON ; } -if (ses->tcon_ipc) +if (ses->tcon_ipc) { ses->tcon_ipc->need_reconnect = true; + ses->tcon_ipc->status =TID_NEED_RECON ; + } next_session:spin_unlock (&ses->chan_lock);
Greg Kroah-Hartman
maintainerPATCH 108/207 ravb: Fix "failed to switch device to config mode" message during unbind
In reply to Greg Kroah-HartmanFrom: Biju Das <[email protected]>
commit c72a7e42592b2e18d862cf120876070947000d7a upstream.
This patch fixes the error "ravb 11c20000.ethernet eth0: failed to switch device to config mode" during unbind.
We are doing register access after pm_runtime_put_sync().
We usually do cleanup in reverse order of init. Currently in remove(), the "pm_runtime_put_sync" is not in reverse order.
Probe
reset_control_deassert(rstc); pm_runtime_enable(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
remove
pm_runtime_put_sync(&pdev->dev); unregister_netdev(ndev); .. ravb_mdio_release(priv); pm_runtime_disable(&pdev->dev);
Consider the call to unregister_netdev() unregister_netdev->unregister_netdevice_queue->rollback_registered_many that calls the below functions which access the registers after pm_runtime_put_sync()
1) ravb_get_stats
2) ravb_close
--- drivers/net/ethernet/renesas/ravb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/renesas/ravb_main.c +1 -1
@@ -2903,12 +2903,12 @@ static int ravb_remove(struct platform_d priv->desc_bat_dma);/* Set reset mode */ ravb_write (ndev,CCC_OPC_RESET ,CCC ); -pm_runtime_put_sync (&pdev->dev);unregister_netdev (ndev);if (info->nc_queues)netif_napi_del (&priv->napi[RAVB_NC ]);netif_napi_del (&priv->napi[RAVB_BE ]);ravb_mdio_release (priv); +pm_runtime_put_sync (&pdev->dev);pm_runtime_disable (&pdev->dev);reset_control_assert (priv->rstc);free_netdev (ndev);
Greg Kroah-Hartman
maintainerPATCH 109/207 rtc: ds1347: fix value written to century register
In reply to Greg Kroah-HartmanFrom: Ian Abbott <[email protected]>
commit 4dfe05bdc1ade79b943d4979a2e2a8b5ef68fbb5 upstream.
In ds1347_set_time(), the wrong value is being written to the DS1347_CENTURY_REG register. It needs to be converted to BCD. Fix it.
--- drivers/rtc/rtc-ds1347.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-ds1347.c +1 -1
@@ -112,7 +112,7 @@ static int ds1347_set_time(struct devicereturn err; century = (dt->tm_year /100 ) +19 ; - err =regmap_write (map,DS1347_CENTURY_REG , century); + err =regmap_write (map,DS1347_CENTURY_REG ,bin2bcd (century));if (err)return err;
Greg Kroah-Hartman
maintainerPATCH 110/207 drm/amdgpu: fix mmhub register base coding error
In reply to Greg Kroah-HartmanFrom: Yang Wang <[email protected]>
commit 347fafe0eb46df941965c355c77ce480e4d49f1f upstream.
fix MMHUB register base coding error.
--- drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c | 2 +- drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c +1 -1
@@ -319,7 +319,7 @@ static void mmhub_v2_0_init_cache_regs(s tmp = mmMMVM_L2_CNTL5_DEFAULT; tmp =REG_SET_FIELD (tmp,MMVM_L2_CNTL5 ,L2_CACHE_SMALLK_FRAGMENT_SIZE ,0 ); -WREG32_SOC15 (GC ,0 , mmMMVM_L2_CNTL5, tmp); +WREG32_SOC15 (MMHUB ,0 , mmMMVM_L2_CNTL5, tmp); }static void mmhub_v2_0_enable_system_domain (struct amdgpu_device *adev)
drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c +1 -1
@@ -243,7 +243,7 @@ static void mmhub_v2_3_init_cache_regs(s tmp = mmMMVM_L2_CNTL5_DEFAULT; tmp =REG_SET_FIELD (tmp,MMVM_L2_CNTL5 ,L2_CACHE_SMALLK_FRAGMENT_SIZE ,0 ); -WREG32_SOC15 (GC ,0 , mmMMVM_L2_CNTL5, tmp); +WREG32_SOC15 (MMHUB ,0 , mmMMVM_L2_CNTL5, tmp); }static void mmhub_v2_3_enable_system_domain (struct amdgpu_device *adev)
drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c +1 -1
@@ -275,7 +275,7 @@ static void mmhub_v3_0_init_cache_regs(s tmp = regMMVM_L2_CNTL5_DEFAULT; tmp =REG_SET_FIELD (tmp,MMVM_L2_CNTL5 ,L2_CACHE_SMALLK_FRAGMENT_SIZE ,0 ); -WREG32_SOC15 (GC ,0 , regMMVM_L2_CNTL5, tmp); +WREG32_SOC15 (MMHUB ,0 , regMMVM_L2_CNTL5, tmp); }static void mmhub_v3_0_enable_system_domain (struct amdgpu_device *adev)
drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c +1 -1
@@ -269,7 +269,7 @@ static void mmhub_v3_0_1_init_cache_regs tmp = regMMVM_L2_CNTL5_DEFAULT; tmp =REG_SET_FIELD (tmp,MMVM_L2_CNTL5 ,L2_CACHE_SMALLK_FRAGMENT_SIZE ,0 ); -WREG32_SOC15 (GC ,0 , regMMVM_L2_CNTL5, tmp); +WREG32_SOC15 (MMHUB ,0 , regMMVM_L2_CNTL5, tmp); }static void mmhub_v3_0_1_enable_system_domain (struct amdgpu_device *adev)
drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c +1 -1
@@ -268,7 +268,7 @@ static void mmhub_v3_0_2_init_cache_regs tmp = regMMVM_L2_CNTL5_DEFAULT; tmp =REG_SET_FIELD (tmp,MMVM_L2_CNTL5 ,L2_CACHE_SMALLK_FRAGMENT_SIZE ,0 ); -WREG32_SOC15 (GC ,0 , regMMVM_L2_CNTL5, tmp); +WREG32_SOC15 (MMHUB ,0 , regMMVM_L2_CNTL5, tmp); }static void mmhub_v3_0_2_enable_system_domain (struct amdgpu_device *adev)
Greg Kroah-Hartman
maintainerPATCH 111/207 block: mq-deadline: Fix dd_finish_request() for zoned devices
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
commit 2820e5d0820ac4daedff1272616a53d9c7682fd2 upstream.
dd_finish_request() tests if the per prio fifo_list is not empty to determine if request dispatching must be restarted for handling blocked write requests to zoned devices with a call to blk_mq_sched_mark_restart_hctx(). While simple, this implementation has 2 problems:
1) Only the priority level of the completed request is considered. However, writes to a zone may be blocked due to other writes to the same zone using a different priority level. While this is unlikely to happen in practice, as writing a zone with different IO priorirites does not make sense, nothing in the code prevents this from happening.
2) The use of list_empty() is dangerous as dd_finish_request() does not take dd->lock and may run concurrently with the insert and dispatch code.
Fix these 2 problems by testing the write fifo list of all priority levels using the new helper dd_has_write_work(), and by testing each fifo list using list_empty_careful().
--- block/mq-deadline.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
block/mq-deadline.c +15 -2
@@ -789,6 +789,18 @@ static void dd_prepare_request(struct re rq->elv.priv[0 ] =NULL ; } +static bool dd_has_write_work (struct blk_mq_hw_ctx *hctx) +{ +struct deadline_data *dd = hctx->queue->elevator->elevator_data; +enum dd_prio p; + +for (p =0 ; p <=DD_PRIO_MAX ; p++) +if (!list_empty_careful (&dd->per_prio[p].fifo_list[DD_WRITE ])) +return true; + +return false; +} +/* * Callback from inside blk_mq_free_request(). *
@@ -828,9 +840,10 @@ static void dd_finish_request(struct reqspin_lock_irqsave (&dd->zone_lock, flags);blk_req_zone_write_unlock (rq); -if (!list_empty (&per_prio->fifo_list[DD_WRITE ])) -blk_mq_sched_mark_restart_hctx (rq->mq_hctx);spin_unlock_irqrestore (&dd->zone_lock, flags); + +if (dd_has_write_work (rq->mq_hctx)) +blk_mq_sched_mark_restart_hctx (rq->mq_hctx); } }
Greg Kroah-Hartman
maintainerPATCH 112/207 block: mq-deadline: Do not break sequential write streams to zoned HDDs
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
commit 015d02f48537cf2d1a65eeac50717566f9db6eec upstream.
mq-deadline ensures an in order dispatching of write requests to zoned block devices using a per zone lock (a bit). This implies that for any purely sequential write workload, the drive is exercised most of the time at a maximum queue depth of one.
However, when such sequential write workload crosses a zone boundary (when sequentially writing multiple contiguous zones), zone write locking may prevent the last write to one zone to be issued (as the previous write is still being executed) but allow the first write to the following zone to be issued (as that zone is not yet being writen and not locked). This result in an out of order delivery of the sequential write commands to the device every time a zone boundary is crossed.
While such behavior does not break the sequential write constraint of zoned block devices (and does not generate any write error), some zoned hard-disks react badly to seeing these out of order writes, resulting in lower write throughput.
This problem can be addressed by always dispatching the first request of a stream of sequential write requests, regardless of the zones targeted by these sequential writes. To do so, the function deadline_skip_seq_writes() is introduced and used in deadline_next_request() to select the next write command to issue if the target device is an HDD (blk_queue_nonrot() being false). deadline_fifo_request() is modified using the new deadline_earlier_request() and deadline_is_seq_write() helpers to ignore requests in the fifo list that have a preceding request in lba order that is sequential.
With this fix, a sequential write workload executed with the following fio command:
fio --name=seq-write --filename=/dev/sda --zonemode=zbd --direct=1 \
--size=68719476736 --ioengine=libaio --iodepth=32 --rw=write \
--bs=65536results in an increase from 225 MB/s to 250 MB/s of the write throughput of an SMR HDD (11% increase).
--- block/mq-deadline.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 4 deletions(-)
block/mq-deadline.c +62 -4
@@ -131,6 +131,20 @@ static u8 dd_rq_ioclass(struct request * }/* +* get the request before `rq' in sector-sorted order +*/ +static inline struct request * +deadline_earlier_request (struct request *rq) +{ +struct rb_node *node =rb_prev (&rq->rb_node); + +if (node) +return rb_entry_rq (node); + +return NULL ; +} + +/* * get the request after `rq' in sector-sorted order */ static inline struct request *
@@ -278,6 +292,39 @@ static inline int deadline_check_fifo(st }/* +* Check if rq has a sequential request preceding it. +*/ +static bool deadline_is_seq_writes (struct deadline_data *dd,struct request *rq) +{ +struct request *prev =deadline_earlier_request (rq); + +if (!prev) +return false; + +return blk_rq_pos (prev) +blk_rq_sectors (prev) ==blk_rq_pos (rq); +} + +/* +* Skip all write requests that are sequential from @rq, even if we cross +* a zone boundary. +*/ +static struct request *deadline_skip_seq_writes (struct deadline_data *dd, +struct request *rq) +{ +sector_t pos =blk_rq_pos (rq); +sector_t skipped_sectors =0 ; + +while (rq) { +if (blk_rq_pos (rq) != pos + skipped_sectors) +break ; + skipped_sectors +=blk_rq_sectors (rq); + rq =deadline_latter_request (rq); + } + +return rq; +} + +/* * For the specified data direction, return the next request to * dispatch using arrival ordered lists. */
@@ -297,11 +344,16 @@ deadline_fifo_request(struct deadline_da/* * Look for a write request that can be dispatched, that is one with -* an unlocked target zone. +* an unlocked target zone. For some HDDs, breaking a sequential +* write stream can lead to lower throughput, so make sure to preserve +* sequential write streams, even if that stream crosses into the next +* zones and these zones are unlocked. */ spin_lock_irqsave (&dd->zone_lock, flags);list_for_each_entry (rq, &per_prio->fifo_list[DD_WRITE ], queuelist) { -if (blk_req_can_dispatch_to_zone (rq)) +if (blk_req_can_dispatch_to_zone (rq) && + (blk_queue_nonrot (rq->q) || + !deadline_is_seq_writes (dd, rq))) goto out; } rq =NULL ;
@@ -331,13 +383,19 @@ deadline_next_request(struct deadline_da/* * Look for a write request that can be dispatched, that is one with -* an unlocked target zone. +* an unlocked target zone. For some HDDs, breaking a sequential +* write stream can lead to lower throughput, so make sure to preserve +* sequential write streams, even if that stream crosses into the next +* zones and these zones are unlocked. */ spin_lock_irqsave (&dd->zone_lock, flags);while (rq) {if (blk_req_can_dispatch_to_zone (rq))break ; - rq =deadline_latter_request (rq); +if (blk_queue_nonrot (rq->q)) + rq =deadline_latter_request (rq); +else + rq =deadline_skip_seq_writes (dd, rq); }spin_unlock_irqrestore (&dd->zone_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 113/207 md/bitmap: Fix bitmap chunk size overflow issues
In reply to Greg Kroah-HartmanFrom: Florian-Ewald Mueller <[email protected]>
commit 4555211190798b6b6fa2c37667d175bf67945c78 upstream.
- limit bitmap chunk size internal u64 variable to values not overflowing the u32 bitmap superblock structure variable stored on persistent media
- assign bitmap chunk size internal u64 variable from unsigned values to avoid possible sign extension artifacts when assigning from a s32 value
The bug has been there since at least kernel 4.0.
Steps to reproduce it:
1: mdadm -C /dev/mdx -l 1 --bitmap=internal --bitmap-chunk=256M -e 1.2 -n2 /dev/rnbd1 /dev/rnbd2
2 resize member device rnbd1 and rnbd2 to 8 TB
3 mdadm --grow /dev/mdx --size=max
The bitmap_chunksize will overflow without patch.
--- drivers/md/md-bitmap.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/md/md-bitmap.c +12 -8
@@ -486,7 +486,7 @@ void md_bitmap_print_sb(struct bitmap *b sb =kmap_atomic (bitmap->storage.sb_page);pr_debug ("%s: bitmap file superblock:\n" ,bmname (bitmap));pr_debug (" magic: %08x\n" ,le32_to_cpu (sb->magic)); -pr_debug (" version: %d\n" ,le32_to_cpu (sb->version)); +pr_debug (" version: %u\n" ,le32_to_cpu (sb->version)); pr_debug(" uuid: %08x.%08x.%08x.%08x\n", le32_to_cpu(*(__le32 *)(sb->uuid+0)), le32_to_cpu(*(__le32 *)(sb->uuid+4)),
@@ -497,11 +497,11 @@ void md_bitmap_print_sb(struct bitmap *bpr_debug ("events cleared: %llu\n" , (unsigned long long )le64_to_cpu (sb->events_cleared));pr_debug (" state: %08x\n" ,le32_to_cpu (sb->state)); -pr_debug (" chunksize: %d B\n" ,le32_to_cpu (sb->chunksize)); -pr_debug (" daemon sleep: %ds\n" ,le32_to_cpu (sb->daemon_sleep)); +pr_debug (" chunksize: %u B\n" ,le32_to_cpu (sb->chunksize)); +pr_debug (" daemon sleep: %us\n" ,le32_to_cpu (sb->daemon_sleep));pr_debug (" sync size: %llu KB\n" , (unsigned long long )le64_to_cpu (sb->sync_size)/2 ); -pr_debug ("max write behind: %d\n" ,le32_to_cpu (sb->write_behind)); +pr_debug ("max write behind: %u\n" ,le32_to_cpu (sb->write_behind));kunmap_atomic (sb); }
@@ -2105,7 +2105,8 @@ int md_bitmap_resize(struct bitmap *bitm bytes =DIV_ROUND_UP (chunks,8 );if (!bitmap->mddev->bitmap_info.external) bytes +=sizeof (bitmap_super_t); - }while (bytes > (space <<9 )); + }while (bytes > (space <<9 ) && (chunkshift +BITMAP_BLOCK_SHIFT ) < + (BITS_PER_BYTE *sizeof (((bitmap_super_t *)0 )->chunksize) -1 )); }else chunkshift =ffz (~chunksize) -BITMAP_BLOCK_SHIFT ;
@@ -2150,7 +2151,7 @@ int md_bitmap_resize(struct bitmap *bitm bitmap->counts.missing_pages = pages; bitmap->counts.chunkshift = chunkshift; bitmap->counts.chunks = chunks; - bitmap->mddev->bitmap_info.chunksize =1 << (chunkshift + + bitmap->mddev->bitmap_info.chunksize =1UL << (chunkshift +BITMAP_BLOCK_SHIFT ); blocks = min(old_counts.chunks << old_counts.chunkshift,
@@ -2176,8 +2177,8 @@ int md_bitmap_resize(struct bitmap *bitm bitmap->counts.missing_pages = old_counts.pages; bitmap->counts.chunkshift = old_counts.chunkshift; bitmap->counts.chunks = old_counts.chunks; - bitmap->mddev->bitmap_info.chunksize =1 << (old_counts.chunkshift + -BITMAP_BLOCK_SHIFT ); + bitmap->mddev->bitmap_info.chunksize = +1UL << (old_counts.chunkshift +BITMAP_BLOCK_SHIFT ); blocks = old_counts.chunks << old_counts.chunkshift;pr_warn ("Could not pre-allocate in-memory bitmap for cluster raid\n" );break ;
@@ -2537,6 +2538,9 @@ chunksize_store(struct mddev *mddev, conif (csize <512 || !is_power_of_2 (csize))return -EINVAL ; +if (BITS_PER_LONG >32 && csize >= (1ULL << (BITS_PER_BYTE * +sizeof (((bitmap_super_t *)0 )->chunksize)))) +return -EOVERFLOW ; mddev->bitmap_info.chunksize = csize;return len; }
Greg Kroah-Hartman
maintainerPATCH 114/207 efi: Add iMac Pro 2017 to uefi skip cert quirk
In reply to Greg Kroah-HartmanFrom: Aditya Garg <[email protected]>
commit 0be56a116220f9e5731a6609e66a11accfe8d8e2 upstream.
The iMac Pro 2017 is also a T2 Mac. Thus add it to the list of uefi skip cert.
--- security/integrity/platform_certs/load_uefi.c | 1 + 1 file changed, 1 insertion(+)
security/integrity/platform_certs/load_uefi.c +1 -0
@@ -35,6 +35,7 @@ static const struct dmi_system_id uefi_s { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacPro7,1") }, { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,1") }, { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,2") }, + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMacPro1,1") }, { } };
Greg Kroah-Hartman
maintainerPATCH 115/207 wifi: wilc1000: sdio: fix module autoloading
In reply to Greg Kroah-HartmanFrom: Michael Walle <[email protected]>
commit 57d545b5a3d6ce3a8fb6b093f02bfcbb908973f3 upstream.
There are no SDIO module aliases included in the driver, therefore, module autoloading isn't working. Add the proper MODULE_DEVICE_TABLE().
--- drivers/net/wireless/microchip/wilc1000/sdio.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/microchip/wilc1000/sdio.c +1 -0
@@ -20,6 +20,7 @@ static const struct sdio_device_id wilc_ { SDIO_DEVICE(SDIO_VENDOR_ID_MICROCHIP_WILC, SDIO_DEVICE_ID_MICROCHIP_WILC1000) }, { }, }; +MODULE_DEVICE_TABLE (sdio, wilc_sdio_ids);#define WILC_SDIO_BLOCK_SIZE 512
Greg Kroah-Hartman
maintainerPATCH 116/207 ASoC: jz4740-i2s: Handle independent FIFO flush bits
In reply to Greg Kroah-HartmanFrom: Aidan MacDonald <[email protected]>
commit 8b3a9ad86239f80ed569e23c3954a311f66481d6 upstream.
On the JZ4740, there is a single bit that flushes (empties) both the transmit and receive FIFO. Later SoCs have independent flush bits for each FIFO.
Independent FIFOs can be flushed before the snd_soc_dai_active() check because it won't disturb other active streams. This ensures that the FIFO we're about to use is always flushed before starting up. With shared FIFOs we can't do that because if another substream is active, flushing its FIFO would cause underrun errors.
This also fixes a bug: since we were only setting the JZ4740's flush bit, which corresponds to the TX FIFO flush bit on other SoCs, other SoCs were not having their RX FIFO flushed at all.
--- sound/soc/jz4740/jz4740-i2s.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-)
sound/soc/jz4740/jz4740-i2s.c +34 -5
@@ -55,7 +55,8 @@#define JZ_AIC_CTRL_MONO_TO_STEREO BIT(11)#define JZ_AIC_CTRL_SWITCH_ENDIANNESS BIT(10)#define JZ_AIC_CTRL_SIGNED_TO_UNSIGNED BIT(9) -#define JZ_AIC_CTRL_FLUSH BIT(8) +#define JZ_AIC_CTRL_TFLUSH BIT(8) +#define JZ_AIC_CTRL_RFLUSH BIT(7)#define JZ_AIC_CTRL_ENABLE_ROR_INT BIT(6)#define JZ_AIC_CTRL_ENABLE_TUR_INT BIT(5)#define JZ_AIC_CTRL_ENABLE_RFS_INT BIT(4)
@@ -90,6 +91,8 @@ enum jz47xx_i2s_version {struct i2s_soc_info {enum jz47xx_i2s_version version;struct snd_soc_dai_driver *dai; + +bool shared_fifo_flush; };struct jz4740_i2s {
@@ -116,19 +119,44 @@ static inline void jz4740_i2s_write(conswritel (value, i2s->base + reg); } +static inline void jz4740_i2s_set_bits (const struct jz4740_i2s *i2s, +unsigned int reg,uint32_t bits) +{ +uint32_t value =jz4740_i2s_read (i2s, reg); + value |= bits; +jz4740_i2s_write (i2s, reg, value); +} +static int jz4740_i2s_startup (struct snd_pcm_substream *substream,struct snd_soc_dai *dai) {struct jz4740_i2s *i2s =snd_soc_dai_get_drvdata (dai); -uint32_t conf, ctrl; +uint32_t conf;int ret; +/* +* When we can flush FIFOs independently, only flush the FIFO +* that is starting up. We can do this when the DAI is active +* because it does not disturb other active substreams. +*/ +if (!i2s->soc_info->shared_fifo_flush) { +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) +jz4740_i2s_set_bits (i2s,JZ_REG_AIC_CTRL ,JZ_AIC_CTRL_TFLUSH ); +else +jz4740_i2s_set_bits (i2s,JZ_REG_AIC_CTRL ,JZ_AIC_CTRL_RFLUSH ); + } +if (snd_soc_dai_active (dai))return 0 ; - ctrl =jz4740_i2s_read (i2s,JZ_REG_AIC_CTRL ); - ctrl |=JZ_AIC_CTRL_FLUSH ; -jz4740_i2s_write (i2s,JZ_REG_AIC_CTRL , ctrl); +/* +* When there is a shared flush bit for both FIFOs, the TFLUSH +* bit flushes both FIFOs. Flushing while the DAI is active would +* cause FIFO underruns in other active substreams so we have to +* guard this behind the snd_soc_dai_active() check. +*/ +if (i2s->soc_info->shared_fifo_flush) +jz4740_i2s_set_bits (i2s,JZ_REG_AIC_CTRL ,JZ_AIC_CTRL_TFLUSH ); ret =clk_prepare_enable (i2s->clk_i2s);if (ret)
@@ -443,6 +471,7 @@ static struct snd_soc_dai_driver jz4740_static const struct i2s_soc_info jz4740_i2s_soc_info = { .version =JZ_I2S_JZ4740 , .dai = &jz4740_i2s_dai, + .shared_fifo_flush = true, };static const struct i2s_soc_info jz4760_i2s_soc_info = {
Greg Kroah-Hartman
maintainerPATCH 117/207 ipu3-imgu: Fix NULL pointer dereference in imgu_subdev_set_selection()
In reply to Greg Kroah-HartmanFrom: Maximilian Luz <[email protected]>
commit dc608edf7d45ba0c2ad14c06eccd66474fec7847 upstream.
Calling v4l2_subdev_get_try_crop() and v4l2_subdev_get_try_compose() with a subdev state of NULL leads to a NULL pointer dereference. This can currently happen in imgu_subdev_set_selection() when the state passed in is NULL, as this method first gets pointers to both the "try" and "active" states and only then decides which to use.
The same issue has been addressed for imgu_subdev_get_selection() with commit 30d03a0de650 ("ipu3-imgu: Fix NULL pointer dereference in active selection access"). However the issue still persists in imgu_subdev_set_selection().
Therefore, apply a similar fix as done in the aforementioned commit to imgu_subdev_set_selection(). To keep things a bit cleaner, introduce helper functions for "crop" and "compose" access and use them in both imgu_subdev_set_selection() and imgu_subdev_get_selection().
--- drivers/staging/media/ipu3/ipu3-v4l2.c | 57 +++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 23 deletions(-)
drivers/staging/media/ipu3/ipu3-v4l2.c +34 -23
@@ -188,6 +188,28 @@ static int imgu_subdev_set_fmt(struct v4return 0 ; } +static struct v4l2_rect * +imgu_subdev_get_crop (struct imgu_v4l2_subdev *sd, +struct v4l2_subdev_state *sd_state,unsigned int pad, +enum v4l2_subdev_format_whence which) +{ +if (which ==V4L2_SUBDEV_FORMAT_TRY ) +return v4l2_subdev_get_try_crop (&sd->subdev, sd_state, pad); +else +return &sd->rect.eff; +} + +static struct v4l2_rect * +imgu_subdev_get_compose (struct imgu_v4l2_subdev *sd, +struct v4l2_subdev_state *sd_state,unsigned int pad, +enum v4l2_subdev_format_whence which) +{ +if (which ==V4L2_SUBDEV_FORMAT_TRY ) +return v4l2_subdev_get_try_compose (&sd->subdev, sd_state, pad); +else +return &sd->rect.bds; +} +static int imgu_subdev_get_selection (struct v4l2_subdev *sd,struct v4l2_subdev_state *sd_state,struct v4l2_subdev_selection *sel)
@@ -200,18 +222,12 @@ static int imgu_subdev_get_selection(strswitch (sel->target) {case V4L2_SEL_TGT_CROP : -if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) - sel->r = *v4l2_subdev_get_try_crop (sd, sd_state, - sel->pad); -else - sel->r = imgu_sd->rect.eff; + sel->r = *imgu_subdev_get_crop (imgu_sd, sd_state, sel->pad, + sel->which);return 0 ;case V4L2_SEL_TGT_COMPOSE : -if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) - sel->r = *v4l2_subdev_get_try_compose (sd, sd_state, - sel->pad); -else - sel->r = imgu_sd->rect.bds; + sel->r = *imgu_subdev_get_compose (imgu_sd, sd_state, sel->pad, + sel->which);return 0 ;default :return -EINVAL ;
@@ -223,10 +239,9 @@ static int imgu_subdev_set_selection(str struct v4l2_subdev_selection *sel) {struct imgu_device *imgu =v4l2_get_subdevdata (sd); -struct imgu_v4l2_subdev *imgu_sd =container_of (sd, - struct imgu_v4l2_subdev, - subdev); -struct v4l2_rect *rect, *try_sel; +struct imgu_v4l2_subdev *imgu_sd = + container_of(sd, struct imgu_v4l2_subdev, subdev); +struct v4l2_rect *rect; dev_dbg(&imgu->pci_dev->dev, "set subdev %u sel which %u target 0x%4x rect [%ux%u]",
@@ -238,22 +253,18 @@ static int imgu_subdev_set_selection(strswitch (sel->target) {case V4L2_SEL_TGT_CROP : - try_sel =v4l2_subdev_get_try_crop (sd, sd_state, sel->pad); - rect = &imgu_sd->rect.eff; + rect =imgu_subdev_get_crop (imgu_sd, sd_state, sel->pad, + sel->which);break ;case V4L2_SEL_TGT_COMPOSE : - try_sel =v4l2_subdev_get_try_compose (sd, sd_state, sel->pad); - rect = &imgu_sd->rect.bds; + rect =imgu_subdev_get_compose (imgu_sd, sd_state, sel->pad, + sel->which);break ;default :return -EINVAL ; } -if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) - *try_sel = sel->r; -else - *rect = sel->r; - + *rect = sel->r;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 118/207 ipmi: fix long wait in unload when IPMI disconnect
In reply to Greg Kroah-HartmanFrom: Zhang Yuchen <[email protected]>
commit f6f1234d98cce69578bfac79df147a1f6660596c upstream.
When fixing the problem mentioned in PATCH1, we also found the following problem:
If the IPMI is disconnected and in the sending process, the uninstallation driver will be stuck for a long time.
The main problem is that uninstalling the driver waits for curr_msg to be sent or HOSED. After stopping tasklet, the only place to trigger the timeout mechanism is the circular poll in shutdown_smi.
The poll function delays 10us and calls smi_event_handler(smi_info,10). Smi_event_handler deducts 10us from kcs->ibf_timeout.
But the poll func is followed by schedule_timeout_uninterruptible(1). The time consumed here is not counted in kcs->ibf_timeout.
So when 10us is deducted from kcs->ibf_timeout, at least 1 jiffies has actually passed. The waiting time has increased by more than a hundredfold.
Now instead of calling poll(). call smi_event_handler() directly and calculate the elapsed time.
For verification, you can directly use ebpf to check the kcs-> ibf_timeout for each call to kcs_event() when IPMI is disconnected. Decrement at normal rate before unloading. The decrement rate becomes very slow after unloading.
$ bpftrace -e 'kprobe:kcs_event {printf("kcs->ibftimeout : %d\n",
*(arg0+584));}'Message-Id: <[email protected]>
--- drivers/char/ipmi/ipmi_si_intf.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-)
drivers/char/ipmi/ipmi_si_intf.c +19 -8
@@ -2153,6 +2153,20 @@ skip_fallback_noirq: }module_init (init_ipmi_si); +static void wait_msg_processed (struct smi_info *smi_info) +{ +unsigned long jiffies_now; +long time_diff; + +while (smi_info->curr_msg || (smi_info->si_state !=SI_NORMAL )) { + jiffies_now = jiffies; + time_diff = (((long )jiffies_now - (long )smi_info->last_timeout_jiffies) + *SI_USEC_PER_JIFFY ); +smi_event_handler (smi_info, time_diff); +schedule_timeout_uninterruptible (1 ); + } +} +static void shutdown_smi (void *send_info) {struct smi_info *smi_info = send_info;
@@ -2187,16 +2201,13 @@ static void shutdown_smi(void *send_info* in the BMC. Note that timers and CPU interrupts are off, * so no need for locks. */ -while (smi_info->curr_msg || (smi_info->si_state !=SI_NORMAL )) { -poll (smi_info); -schedule_timeout_uninterruptible (1 ); - } +wait_msg_processed (smi_info); +if (smi_info->handlers)disable_si_irq (smi_info); -while (smi_info->curr_msg || (smi_info->si_state !=SI_NORMAL )) { -poll (smi_info); -schedule_timeout_uninterruptible (1 ); - } + +wait_msg_processed (smi_info); +if (smi_info->handlers) smi_info->handlers->cleanup (smi_info->si_sm);
Greg Kroah-Hartman
maintainerPATCH 119/207 mtd: spi-nor: Check for zero erase size in spi_nor_find_best_erase_type()
In reply to Greg Kroah-HartmanFrom: Alexander Sverdlin <[email protected]>
commit 2ebc336be08160debfe27f87660cf550d710f3e9 upstream.
Erase can be zeroed in spi_nor_parse_4bait() or spi_nor_init_non_uniform_erase_map(). In practice it happened with mt25qu256a, which supports 4K, 32K, 64K erases with 3b address commands, but only 4K and 64K erase with 4b address commands.
--- drivers/mtd/spi-nor/core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mtd/spi-nor/core.c +2 -0
@@ -1184,6 +1184,8 @@ spi_nor_find_best_erase_type(const struccontinue ; erase = &map->erase_type[i]; +if (!erase->size) +continue ;/* Alignment is not mandatory for overlaid regions */ if (region->offset & SNOR_OVERLAID_REGION &&
Greg Kroah-Hartman
maintainerPATCH 120/207 ima: Fix a potential NULL pointer access in ima_restore_measurement_list
In reply to Greg Kroah-HartmanFrom: Huaxin Lu <[email protected]>
commit 11220db412edae8dba58853238f53258268bdb88 upstream.
In restore_template_fmt, when kstrdup fails, a non-NULL value will still be returned, which causes a NULL pointer access in template_desc_init_fields.
--- security/integrity/ima/ima_template.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
security/integrity/ima/ima_template.c +4 -1
@@ -340,8 +340,11 @@ static struct ima_template_desc *restore template_desc->name ="" ; template_desc->fmt =kstrdup (template_name,GFP_KERNEL ); -if (!template_desc->fmt) +if (!template_desc->fmt) { +kfree (template_desc); + template_desc =NULL ; goto out; + }spin_lock (&template_list);list_add_tail_rcu (&template_desc->list, &defined_templates);
Greg Kroah-Hartman
maintainerPATCH 121/207 ipmi: fix use after free in _ipmi_destroy_user()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit a92ce570c81dc0feaeb12a429b4bc65686d17967 upstream.
The intf_free() function frees the "intf" pointer so we cannot dereference it again on the next line.
Message-Id: <Y3M8xa1drZv4CToE@kili>
--- drivers/char/ipmi/ipmi_msghandler.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/char/ipmi/ipmi_msghandler.c +3 -1
@@ -1330,6 +1330,7 @@ static void _ipmi_destroy_user(struct ipunsigned long flags;struct cmd_rcvr *rcvr;struct cmd_rcvr *rcvrs =NULL ; +struct module *owner;if (!acquire_ipmi_user (user, &i)) {/*
@@ -1392,8 +1393,9 @@ static void _ipmi_destroy_user(struct ipkfree (rcvr); } + owner = intf->owner;kref_put (&intf->refcount, intf_free); -module_put (intf->owner); +module_put (owner); }int ipmi_destroy_user (struct ipmi_user *user)
Greg Kroah-Hartman
maintainerPATCH 122/207 mtd: spi-nor: gigadevice: gd25q256: replace gd25q256_default_init with gd25q256_post_bfpt
In reply to Greg Kroah-HartmanFrom: Yaliang Wang <[email protected]>
commit 4dc49062a7e9c0c7261807fb855df1c611eb78c3 upstream.
When utilizing PARSE_SFDP to initialize the flash parameter, the deprecated initializing method spi_nor_init_params_deprecated() and the function spi_nor_manufacturer_init_params() within it will never be executed, which results in the default_init hook function will also never be executed.
This is okay for 'D' generation of GD25Q256, because 'D' generation is implementing the JESD216B standards, it has QER field defined in BFPT, parsing the SFDP can properly set the quad_enable function. The 'E' generation also implements the JESD216B standards, and it has the same status register definitions as 'D' generation, parsing the SFDP to set the quad_enable function should also work for 'E' generation.
However, the same thing can't apply to 'C' generation. 'C' generation 'GD25Q256C' implements the JESD216 standards, and it doesn't have the QER field defined in BFPT, since it does have QE bit in status register 1, the quad_enable hook needs to be tweaked to properly set the quad_enable function, this can be done in post_bfpt fixup hook.
--- drivers/mtd/spi-nor/gigadevice.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)
drivers/mtd/spi-nor/gigadevice.c +17 -7
@@ -8,19 +8,29 @@#include "core.h" -static void gd25q256_default_init (struct spi_nor *nor) +static int +gd25q256_post_bfpt (struct spi_nor *nor, +const struct sfdp_parameter_header *bfpt_header, +const struct sfdp_bfpt *bfpt) {/* -* Some manufacturer like GigaDevice may use different -* bit to set QE on different memories, so the MFR can't -* indicate the quad_enable method for this case, we need -* to set it in the default_init fixup hook. +* GD25Q256C supports the first version of JESD216 which does not define +* the Quad Enable methods. Overwrite the default Quad Enable method. +* +* GD25Q256 GENERATION | SFDP MAJOR VERSION | SFDP MINOR VERSION +* GD25Q256C | SFDP_JESD216_MAJOR | SFDP_JESD216_MINOR +* GD25Q256D | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR +* GD25Q256E | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR */ - nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; +if (bfpt_header->major ==SFDP_JESD216_MAJOR && + bfpt_header->minor ==SFDP_JESD216_MINOR ) + nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; + +return 0 ; }static const struct spi_nor_fixups gd25q256_fixups = { - .default_init = gd25q256_default_init, + .post_bfpt = gd25q256_post_bfpt, };static const struct flash_info gigadevice_nor_parts[] = {
Greg Kroah-Hartman
maintainerPATCH 123/207 ima: Fix memory leak in __ima_inode_hash()
In reply to Greg Kroah-HartmanFrom: Roberto Sassu <[email protected]>
commit 8c1d6a050a0f16e0a9d32eaf53b965c77279c6f8 upstream.
Commit f3cc6b25dcc5 ("ima: always measure and audit files in policy") lets measurement or audit happen even if the file digest cannot be calculated.
As a result, iint->ima_hash could have been allocated despite ima_collect_measurement() returning an error.
Since ima_hash belongs to a temporary inode metadata structure, declared at the beginning of __ima_inode_hash(), just add a kfree() call if ima_collect_measurement() returns an error different from -ENOMEM (in that case, ima_hash should not have been allocated).
--- security/integrity/ima/ima_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
security/integrity/ima/ima_main.c +6 -1
@@ -542,8 +542,13 @@ static int __ima_inode_hash(struct inode rc =ima_collect_measurement (&tmp_iint, file,NULL ,0 , ima_hash_algo,NULL ); -if (rc <0 ) +if (rc <0 ) { +/* ima_hash could be allocated in case of failure. */ +if (rc != -ENOMEM ) +kfree (tmp_iint.ima_hash); +return -EOPNOTSUPP ; + } iint = &tmp_iint;mutex_lock (&iint->mutex);
Greg Kroah-Hartman
maintainerPATCH 124/207 um: virt-pci: Avoid GCC non-NULL warning
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit bdc77507fecd00ddad2f502f86a48a9ec38f0f84 upstream.
GCC gets confused about the return value of get_cpu_var() possibly being NULL, so explicitly test for it before calls to memcpy() and memset(). Avoids warnings like this:
arch/um/drivers/virt-pci.c: In function 'um_pci_send_cmd':
include/linux/fortify-string.h:48:33: warning: argument 1 null where non-null expected [-Wnonnull]
48 | #define __underlying_memcpy __builtin_memcpy
| ^
include/linux/fortify-string.h:438:9: note: in expansion of macro '__underlying_memcpy'
438 | __underlying_##op(p, q, __fortify_size); \
| ^~~~~~~~~~~~~
include/linux/fortify-string.h:483:26: note: in expansion of macro '__fortify_memcpy_chk'
483 | #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \
| ^~~~~~~~~~~~~~~~~~~~
arch/um/drivers/virt-pci.c:100:9: note: in expansion of macro 'memcpy'
100 | memcpy(buf, cmd, cmd_size);
| ^~~~~~While at it, avoid literal "8" and use stored sizeof(buf->data) in memset() and um_pci_send_cmd().
--- arch/um/drivers/virt-pci.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/um/drivers/virt-pci.c +6 -3
@@ -97,7 +97,8 @@ static int um_pci_send_cmd(struct um_pci } buf =get_cpu_var (um_pci_msg_bufs); -memcpy (buf, cmd, cmd_size); +if (buf) +memcpy (buf, cmd, cmd_size);if (posted) {u8 *ncmd =kmalloc (cmd_size + extra_size,GFP_ATOMIC );
@@ -182,6 +183,7 @@ static unsigned long um_pci_cfgspace_reastruct um_pci_message_buffer *buf;u8 *data;unsigned long ret =ULONG_MAX ; +size_t bytes =sizeof (buf->data);if (!dev)return ULONG_MAX ;
@@ -189,7 +191,8 @@ static unsigned long um_pci_cfgspace_rea buf =get_cpu_var (um_pci_msg_bufs); data = buf->data; -memset (buf->data,0xff ,sizeof (buf->data)); +if (buf) +memset (data,0xff , bytes);switch (size) {case 1 :
@@ -204,7 +207,7 @@ static unsigned long um_pci_cfgspace_rea goto out; } -if (um_pci_send_cmd (dev, &hdr,sizeof (hdr),NULL ,0 , data,8 )) +if (um_pci_send_cmd (dev, &hdr,sizeof (hdr),NULL ,0 , data, bytes)) goto out;switch (size) {
Greg Kroah-Hartman
maintainerPATCH 125/207 crypto: ccree,hisilicon - Fix dependencies to correct algorithm
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
commit 2ae6feb1a1f6678fe11864f1b6920ed10b09ad6a upstream.
Commit d2825fa9365d ("crypto: sm3,sm4 - move into crypto directory") moves the SM3 and SM4 stand-alone library and the algorithm implementation for the Crypto API into the same directory, and the corresponding relationship of Kconfig is modified, CONFIG_CRYPTO_SM3/4 corresponds to the stand-alone library of SM3/4, and CONFIG_CRYPTO_SM3/4_GENERIC corresponds to the algorithm implementation for the Crypto API. Therefore, it is necessary for this module to depend on the correct algorithm.
--- drivers/crypto/Kconfig | 4 ++-- drivers/crypto/hisilicon/Kconfig | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/Kconfig +2 -2
@@ -790,8 +790,8 @@ config CRYPTO_DEV_CCREE select CRYPTO_ECB select CRYPTO_CTR select CRYPTO_XTS - select CRYPTO_SM4 - select CRYPTO_SM3 + select CRYPTO_SM4_GENERIC + select CRYPTO_SM3_GENERIC help Say 'Y' to enable a driver for the REE interface of the Arm TrustZone CryptoCell family of processors. Currently the
drivers/crypto/hisilicon/Kconfig +1 -1
@@ -26,7 +26,7 @@ config CRYPTO_DEV_HISI_SEC2 select CRYPTO_SHA1 select CRYPTO_SHA256 select CRYPTO_SHA512 - select CRYPTO_SM4 + select CRYPTO_SM4_GENERIC depends on PCI && PCI_MSI depends on UACCE || UACCE=n depends on ARM64 || (COMPILE_TEST && 64BIT)
Greg Kroah-Hartman
maintainerPATCH 126/207 PCI: Fix pci_device_is_present() for VFs by checking PF
In reply to Greg Kroah-HartmanFrom: Michael S. Tsirkin <[email protected]>
commit 98b04dd0b4577894520493d96bc4623387767445 upstream.
pci_device_is_present() previously didn't work for VFs because it reads the Vendor and Device ID, which are 0xffff for VFs, which looks like they aren't present. Check the PF instead.
Wei Gong reported that if virtio I/O is in progress when the driver is unbound or "0" is written to /sys/.../sriov_numvfs, the virtio I/O operation hangs, which may result in output like this:
task:bash state:D stack: 0 pid: 1773 ppid: 1241 flags:0x00004002
Call Trace: schedule+0x4f/0xc0 blk_mq_freeze_queue_wait+0x69/0xa0 blk_mq_freeze_queue+0x1b/0x20 blk_cleanup_queue+0x3d/0xd0 virtblk_remove+0x3c/0xb0 [virtio_blk] virtio_dev_remove+0x4b/0x80 ... device_unregister+0x1b/0x60 unregister_virtio_device+0x18/0x30 virtio_pci_remove+0x41/0x80 pci_device_remove+0x3e/0xb0
This happened because pci_device_is_present(VF) returned "false" in virtio_pci_remove(), so it called virtio_break_device(). The broken vq meant that vring_interrupt() skipped the vq.callback() that would have completed the virtio I/O operation via virtblk_done().
--- drivers/pci/pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/pci.c +2 -0
@@ -6447,6 +6447,8 @@ bool pci_device_is_present(struct pci_de {u32 v; +/* Check PF if pdev is a VF, since VF Vendor/Device IDs are 0xffff */ + pdev =pci_physfn (pdev);if (pci_dev_is_disconnected (pdev))return false;return pci_bus_read_dev_vendor_id (pdev->bus, pdev->devfn, &v,0 );
Greg Kroah-Hartman
maintainerPATCH 127/207 PCI/sysfs: Fix double free in error path
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
commit aa382ffa705bea9931ec92b6f3c70e1fdb372195 upstream.
When pci_create_attr() fails, pci_remove_resource_files() is called which will iterate over the res_attr[_wc] arrays and frees every non NULL entry. To avoid a double free here set the array entry only after it's clear we successfully initialized it.
--- drivers/pci/pci-sysfs.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/pci/pci-sysfs.c +9 -4
@@ -1175,11 +1175,9 @@ static int pci_create_attr(struct pci_desysfs_bin_attr_init (res_attr);if (write_combine) { - pdev->res_attr_wc[num] = res_attr;sprintf (res_attr_name,"resource%d_wc" , num); res_attr->mmap = pci_mmap_resource_wc; }else { - pdev->res_attr[num] = res_attr;sprintf (res_attr_name,"resource%d" , num);if (pci_resource_flags (pdev, num) &IORESOURCE_IO ) { res_attr->read = pci_read_resource_io;
@@ -1197,10 +1195,17 @@ static int pci_create_attr(struct pci_de res_attr->size =pci_resource_len (pdev, num); res_attr->private = (void *)(unsigned long )num; retval =sysfs_create_bin_file (&pdev->dev.kobj, res_attr); -if (retval) +if (retval) {kfree (res_attr); +return retval; + } + +if (write_combine) + pdev->res_attr_wc[num] = res_attr; +else + pdev->res_attr[num] = res_attr; -return retval; +return 0 ; }/**
Greg Kroah-Hartman
maintainerPATCH 128/207 RISC-V: kexec: Fix memory leak of fdt buffer
In reply to Greg Kroah-HartmanFrom: Li Huafei <[email protected]>
commit 96df59b1ae23f5c11698c3c2159aeb2ecd4944a4 upstream.
This is reported by kmemleak detector:
unreferenced object 0xff60000082864000 (size 9588):
comm "kexec", pid 146, jiffies 4294900634 (age 64.788s) hex dump (first 32 bytes):
d0 0d fe ed 00 00 12 ed 00 00 00 48 00 00 11 40 ...........H...@
00 00 00 28 00 00 00 11 00 00 00 02 00 00 00 00 ...(............
backtrace:
[<00000000f95b17c4>] kmemleak_alloc+0x34/0x3e
[<00000000b9ec8e3e>] kmalloc_order+0x9c/0xc4
[<00000000a95cf02e>] kmalloc_order_trace+0x34/0xb6
[<00000000f01e68b4>] __kmalloc+0x5c2/0x62a
[<000000002bd497b2>] kvmalloc_node+0x66/0xd6
[<00000000906542fa>] of_kexec_alloc_and_setup_fdt+0xa6/0x6ea
[<00000000e1166bde>] elf_kexec_load+0x206/0x4ec
[<0000000036548e09>] kexec_image_load_default+0x40/0x4c
[<0000000079fbe1b4>] sys_kexec_file_load+0x1c4/0x322
[<0000000040c62c03>] ret_from_syscall+0x0/0x2In elf_kexec_load(), a buffer is allocated via kvmalloc() to store fdt. While it's not freed back to system when kexec kernel is reloaded or unloaded. Then memory leak is caused. Fix it by introducing riscv specific function arch_kimage_file_post_load_cleanup(), and freeing the buffer there.
--- arch/riscv/include/asm/kexec.h | 5 +++++ arch/riscv/kernel/elf_kexec.c | 10 ++++++++++ 2 files changed, 15 insertions(+)
arch/riscv/include/asm/kexec.h +5 -0
@@ -39,6 +39,7 @@ crash_setup_regs(struct pt_regs *newregs#define ARCH_HAS_KIMAGE_ARCH struct kimage_arch { +void *fdt;/* For CONFIG_KEXEC_FILE */ unsigned long fdt_addr; };
@@ -62,6 +63,10 @@ int arch_kexec_apply_relocations_add(strconst Elf_Shdr *relsec, const Elf_Shdr *symtab);#define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add + +struct kimage ; +int arch_kimage_file_post_load_cleanup (struct kimage *image); +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup#endif #endif
arch/riscv/kernel/elf_kexec.c +10 -0
@@ -21,6 +21,14 @@#include <linux/memblock.h> #include <asm/setup.h> +int arch_kimage_file_post_load_cleanup (struct kimage *image) +{ +kvfree (image->arch.fdt); + image->arch.fdt =NULL ; + +return kexec_image_post_load_cleanup_default (image); +} +static int riscv_kexec_elf_load (struct kimage *image,struct elfhdr *ehdr,struct kexec_elf_info *elf_info,unsigned long old_pbase,unsigned long new_pbase)
@@ -298,6 +306,8 @@ static void *elf_kexec_load(struct kimagpr_err ("Error add DTB kbuf ret=%d\n" , ret); goto out_free_fdt; } +/* Cache the fdt buffer address for memory cleanup */ + image->arch.fdt = fdt;pr_notice ("Loaded device tree at 0x%lx\n" , kbuf.mem); goto out;
Greg Kroah-Hartman
maintainerPATCH 129/207 riscv: Fixup compile error with !MMU
In reply to Greg Kroah-HartmanFrom: Guo Ren <[email protected]>
commit c528ef0888b75f673f7d48022de8d31d5b451e8c upstream.
Current nommu_virt_defconfig can't compile:
In file included from arch/riscv/kernel/crash_core.c:3:arch/riscv/kernel/crash_core.c:
In function 'arch_crash_save_vmcoreinfo':arch/riscv/kernel/crash_core.c:8:27:
error: 'VA_BITS' undeclared (first use in this function)
8 | VMCOREINFO_NUMBER(VA_BITS);
| ^~~~~~~Add MMU dependency for KEXEC_FILE.
--- arch/riscv/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/Kconfig +1 -1
@@ -502,7 +502,7 @@ config KEXEC_FILE select KEXEC_CORE select KEXEC_ELF select HAVE_IMA_KEXEC if IMA - depends on 64BIT + depends on 64BIT && MMU help This is new version of kexec system call. This system call is file based and takes file descriptors as system call argument
Greg Kroah-Hartman
maintainerPATCH 130/207 RISC-V: kexec: Fix memory leak of elf header buffer
In reply to Greg Kroah-HartmanFrom: Li Huafei <[email protected]>
commit cbc32023ddbdf4baa3d9dc513a2184a84080a5a2 upstream.
This is reported by kmemleak detector:
unreferenced object 0xff2000000403d000 (size 4096):
comm "kexec", pid 146, jiffies 4294900633 (age 64.792s) hex dump (first 32 bytes):
7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 .ELF............
04 00 f3 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<00000000566ca97c>] kmemleak_vmalloc+0x3c/0xbe
[<00000000979283d8>] __vmalloc_node_range+0x3ac/0x560
[<00000000b4b3712a>] __vmalloc_node+0x56/0x62
[<00000000854f75e2>] vzalloc+0x2c/0x34
[<00000000e9a00db9>] crash_prepare_elf64_headers+0x80/0x30c
[<0000000067e8bf48>] elf_kexec_load+0x3e8/0x4ec
[<0000000036548e09>] kexec_image_load_default+0x40/0x4c
[<0000000079fbe1b4>] sys_kexec_file_load+0x1c4/0x322
[<0000000040c62c03>] ret_from_syscall+0x0/0x2In elf_kexec_load(), a buffer is allocated via vzalloc() to store elf headers. While it's not freed back to system when kdump kernel is reloaded or unloaded, or when image->elf_header is successfully set and then fails to load kdump kernel for some reason. Fix it by freeing the buffer in arch_kimage_file_post_load_cleanup().
--- arch/riscv/kernel/elf_kexec.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/riscv/kernel/elf_kexec.c +4 -0
@@ -26,6 +26,10 @@ int arch_kimage_file_post_load_cleanup(skvfree (image->arch.fdt); image->arch.fdt =NULL ; +vfree (image->elf_headers); + image->elf_headers =NULL ; + image->elf_headers_sz =0 ; +return kexec_image_post_load_cleanup_default (image); }
Greg Kroah-Hartman
maintainerPATCH 131/207 riscv: stacktrace: Fixup ftrace_graph_ret_addr retp argument
In reply to Greg Kroah-HartmanFrom: Guo Ren <[email protected]>
commit 5c3022e4a616d800cf5f4c3a981d7992179e44a1 upstream.
The 'retp' is a pointer to the return address on the stack, so we must pass the current return address pointer as the 'retp' argument to ftrace_push_return_trace(). Not parent function's return address on the stack.
--- arch/riscv/kernel/stacktrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/stacktrace.c +1 -1
@@ -58,7 +58,7 @@ void notrace walk_stackframe(struct task }else { fp = frame->fp; pc =ftrace_graph_ret_addr (current,NULL , frame->ra, - (unsigned long *)(fp -8 )); + &frame->ra); } }
Greg Kroah-Hartman
maintainerPATCH 132/207 riscv: mm: notify remote harts about mmu cache updates
In reply to Greg Kroah-HartmanFrom: Sergey Matyukevich <[email protected]>
commit 4bd1d80efb5af640f99157f39b50fb11326ce641 upstream.
Current implementation of update_mmu_cache function performs local TLB flush. It does not take into account ASID information. Besides, it does not take into account other harts currently running the same mm context or possible migration of the running context to other harts. Meanwhile TLB flush is not performed for every context switch if ASID support is enabled.
Patch [1] proposed to add ASID support to update_mmu_cache to avoid flushing local TLB entirely. This patch takes into account other harts currently running the same mm context as well as possible migration of this context to other harts.
For this purpose the approach from flush_icache_mm is reused. Remote harts currently running the same mm context are informed via SBI calls that they need to flush their local TLBs. All the other harts are marked as needing a deferred TLB flush when this mm context runs on them.
[1] https://lore.kernel.org/linux-riscv/[email protected]/
--- arch/riscv/include/asm/mmu.h | 2 ++ arch/riscv/include/asm/pgtable.h | 2 +- arch/riscv/include/asm/tlbflush.h | 18 ++++++++++++++++++ arch/riscv/mm/context.c | 10 ++++++++++ arch/riscv/mm/tlbflush.c | 28 +++++++++++----------------- 5 files changed, 42 insertions(+), 18 deletions(-)
arch/riscv/include/asm/mmu.h +2 -0
@@ -19,6 +19,8 @@ typedef struct {#ifdef CONFIG_SMP /* A local icache flush is needed before user execution can resume. */ cpumask_t icache_stale_mask; +/* A local tlb flush is needed before user execution can resume. */ +cpumask_t tlb_stale_mask;#endif } mm_context_t;
arch/riscv/include/asm/pgtable.h +1 -1
@@ -415,7 +415,7 @@ static inline void update_mmu_cache(stru* Relying on flush_tlb_fix_spurious_fault would suffice, but * the extra traps reduce performance. So, eagerly SFENCE.VMA. */ -local_flush_tlb_page (address); +flush_tlb_page (vma, address); } static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
arch/riscv/include/asm/tlbflush.h +18 -0
@@ -22,6 +22,24 @@ static inline void local_flush_tlb_page( {ALT_FLUSH_TLB_PAGE (__asm__ __volatile__ ("sfence.vma %0" : :"r" (addr) :"memory" )); } + +static inline void local_flush_tlb_all_asid (unsigned long asid) +{ + __asm__ __volatile__ ("sfence.vma x0, %0" + : + :"r" (asid) + :"memory" ); +} + +static inline void local_flush_tlb_page_asid (unsigned long addr, +unsigned long asid) +{ + __asm__ __volatile__ ("sfence.vma %0, %1" + : + :"r" (addr),"r" (asid) + :"memory" ); +} +#else /* CONFIG_MMU */ #define local_flush_tlb_all () do { } while (0)#define local_flush_tlb_page (addr) do { } while (0)
arch/riscv/mm/context.c +10 -0
@@ -196,6 +196,16 @@ switch_mm_fast:if (need_flush_tlb)local_flush_tlb_all (); +#ifdef CONFIG_SMP + else { +cpumask_t *mask = &mm->context.tlb_stale_mask; + +if (cpumask_test_cpu (cpu, mask)) { +cpumask_clear_cpu (cpu, mask); +local_flush_tlb_all_asid (cntx & asid_mask); + } + } +#endif }static void set_mm_noasid (struct mm_struct *mm)
arch/riscv/mm/tlbflush.c +11 -17
@@ -5,23 +5,7 @@#include <linux/sched.h> #include <asm/sbi.h> #include <asm/mmu_context.h> - -static inline void local_flush_tlb_all_asid (unsigned long asid) -{ - __asm__ __volatile__ ("sfence.vma x0, %0" - : - :"r" (asid) - :"memory" ); -} - -static inline void local_flush_tlb_page_asid (unsigned long addr, -unsigned long asid) -{ - __asm__ __volatile__ ("sfence.vma %0, %1" - : - :"r" (addr),"r" (asid) - :"memory" ); -} +#include <asm/tlbflush.h> void flush_tlb_all (void ) {
@@ -31,6 +15,7 @@ void flush_tlb_all(void)static void __sbi_tlb_flush_range (struct mm_struct *mm,unsigned long start,unsigned long size,unsigned long stride) { +struct cpumask *pmask = &mm->context.tlb_stale_mask;struct cpumask *cmask =mm_cpumask (mm);unsigned int cpuid;bool broadcast;
@@ -44,6 +29,15 @@ static void __sbi_tlb_flush_range(structif (static_branch_unlikely (&use_asid_allocator)) {unsigned long asid =atomic_long_read (&mm->context.id); +/* +* TLB will be immediately flushed on harts concurrently +* executing this MM context. TLB flush on other harts +* is deferred until this MM context migrates there. +*/ +cpumask_setall (pmask); +cpumask_clear_cpu (cpuid, pmask); +cpumask_andnot (pmask, pmask, cmask); +if (broadcast) {sbi_remote_sfence_vma_asid (cmask, start, size, asid); }else if (size <= stride) {
Greg Kroah-Hartman
maintainerPATCH 133/207 crypto: n2 - add missing hash statesize
In reply to Greg Kroah-HartmanFrom: Corentin Labbe <[email protected]>
commit 76a4e874593543a2dff91d249c95bac728df2774 upstream.
Add missing statesize to hash templates.
This is mandatory otherwise no algorithms can be registered as the core requires statesize to be set.
--- drivers/crypto/n2_core.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/crypto/n2_core.c +6 -0
@@ -1229,6 +1229,7 @@ struct n2_hash_tmpl {const u8 *hash_init;u8 hw_op_hashsz;u8 digest_size; +u8 statesize;u8 block_size;u8 auth_type;u8 hmac_type;
@@ -1260,6 +1261,7 @@ static const struct n2_hash_tmpl hash_tm .hmac_type = AUTH_TYPE_HMAC_MD5, .hw_op_hashsz = MD5_DIGEST_SIZE, .digest_size = MD5_DIGEST_SIZE, + .statesize = sizeof(struct md5_state), .block_size = MD5_HMAC_BLOCK_SIZE }, { .name = "sha1", .hash_zero = sha1_zero_message_hash,
@@ -1268,6 +1270,7 @@ static const struct n2_hash_tmpl hash_tm .hmac_type = AUTH_TYPE_HMAC_SHA1, .hw_op_hashsz = SHA1_DIGEST_SIZE, .digest_size = SHA1_DIGEST_SIZE, + .statesize = sizeof(struct sha1_state), .block_size = SHA1_BLOCK_SIZE }, { .name = "sha256", .hash_zero = sha256_zero_message_hash,
@@ -1276,6 +1279,7 @@ static const struct n2_hash_tmpl hash_tm .hmac_type = AUTH_TYPE_HMAC_SHA256, .hw_op_hashsz = SHA256_DIGEST_SIZE, .digest_size = SHA256_DIGEST_SIZE, + .statesize = sizeof(struct sha256_state), .block_size = SHA256_BLOCK_SIZE }, { .name = "sha224", .hash_zero = sha224_zero_message_hash,
@@ -1284,6 +1288,7 @@ static const struct n2_hash_tmpl hash_tm .hmac_type = AUTH_TYPE_RESERVED, .hw_op_hashsz = SHA256_DIGEST_SIZE, .digest_size = SHA224_DIGEST_SIZE, + .statesize = sizeof(struct sha256_state), .block_size = SHA224_BLOCK_SIZE }, };#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
@@ -1424,6 +1429,7 @@ static int __n2_register_one_ahash(const halg = &ahash->halg; halg->digestsize = tmpl->digest_size; + halg->statesize = tmpl->statesize; base = &halg->base;snprintf (base->cra_name,CRYPTO_MAX_ALG_NAME ,"%s" , tmpl->name);
Greg Kroah-Hartman
maintainerPATCH 134/207 crypto: ccp - Add support for TEE for PCI ID 0x14CA
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit 10da230a4df1dfe32a58eb09246f5ffe82346f27 upstream.
SoCs containing 0x14CA are present both in datacenter parts that support SEV as well as client parts that support TEE.
--- drivers/crypto/ccp/sp-pci.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/crypto/ccp/sp-pci.c +10 -1
@@ -381,6 +381,15 @@ static const struct psp_vdata pspv3 = { .inten_reg = 0x10690, .intsts_reg = 0x10694, }; + +static const struct psp_vdata pspv4 = { + .sev = &sevv2, + .tee = &teev1, + .feature_reg =0x109fc , + .inten_reg =0x10690 , + .intsts_reg =0x10694 , +}; +#endif static const struct sp_dev_vdata dev_vdata[] = {
@@ -426,7 +435,7 @@ static const struct sp_dev_vdata dev_vda {/* 5 */ .bar = 2, #ifdef CONFIG_CRYPTO_DEV_SP_PSP - .psp_vdata = &pspv2, + .psp_vdata = &pspv4,#endif }, {/* 6 */
Greg Kroah-Hartman
maintainerPATCH 135/207 driver core: Fix bus_type.match() error handling in __driver_attach()
In reply to Greg Kroah-HartmanFrom: Isaac J. Manjarres <[email protected]>
commit 27c0d217340e47ec995557f61423ef415afba987 upstream.
When a driver registers with a bus, it will attempt to match with every device on the bus through the __driver_attach() function. Currently, if the bus_type.match() function encounters an error that is not -EPROBE_DEFER, __driver_attach() will return a negative error code, which causes the driver registration logic to stop trying to match with the remaining devices on the bus.
This behavior is not correct; a failure while matching a driver to a device does not mean that the driver won't be able to match and bind with other devices on the bus. Update the logic in __driver_attach() to reflect this.
--- drivers/base/dd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/base/dd.c +5 -1
@@ -1162,7 +1162,11 @@ static int __driver_attach(struct devicereturn 0 ; }else if (ret <0 ) {dev_dbg (dev,"Bus failed to match device: %d\n" , ret); -return ret; +/* +* Driver could not match with device, but may match with +* another device on the bus. +*/ +return 0 ; }/* ret > 0 means positive match */ if (driver_allows_async_probing (drv)) {
Greg Kroah-Hartman
maintainerPATCH 136/207 bus: mhi: host: Fix race between channel preparation and M0 event
In reply to Greg Kroah-HartmanFrom: Qiang Yu <[email protected]>
commit 869a99907faea6d1835b0bd0d0422ae3519c6ea9 upstream.
There is a race condition where mhi_prepare_channel() updates the read and write pointers as the base address and in parallel, if an M0 transition occurs, the tasklet goes ahead and rings doorbells for all channels with a delta in TRE rings assuming they are already enabled. This causes a null pointer access. Fix it by adding a channel enabled check before ringing channel doorbells.
--- drivers/bus/mhi/host/pm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/bus/mhi/host/pm.c +2 -1
@@ -301,7 +301,8 @@ int mhi_pm_m0_transition(struct mhi_contread_lock_irq (&mhi_chan->lock);/* Only ring DB if ring is not empty */ -if (tre_ring->base && tre_ring->wp != tre_ring->rp) +if (tre_ring->base && tre_ring->wp != tre_ring->rp && + mhi_chan->ch_state ==MHI_CH_STATE_ENABLED )mhi_ring_chan_db (mhi_cntrl, mhi_chan);read_unlock_irq (&mhi_chan->lock); }
Greg Kroah-Hartman
maintainerPATCH 138/207 phy: qcom-qmp-combo: fix sc8180x reset
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 910dd4883d757af5faac92590f33f0f7da963032 upstream.
The SC8180X has two resets but the DP configuration erroneously described only one.
In case the DP part of the PHY is initialised before the USB part (e.g. depending on probe order), then only the first reset would be asserted.
--- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/phy/qualcomm/phy-qcom-qmp-combo.c +2 -2
@@ -1221,8 +1221,8 @@ static const struct qmp_phy_cfg sc8180x_ .clk_list = qmp_v3_phy_clk_l, .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), - .reset_list = sc7180_usb3phy_reset_l, - .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l), + .reset_list = msm8996_usb3phy_reset_l, + .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), .vreg_list = qmp_phy_vreg_l, .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), .regs = qmp_v3_usb3phy_regs_layout,
Greg Kroah-Hartman
maintainerPATCH 139/207 iommu/amd: Fix ivrs_acpihid cmdline parsing code
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
commit 5f18e9f8868c6d4eae71678e7ebd4977b7d8c8cf upstream.
The second (UID) strcmp in acpi_dev_hid_uid_match considers "0" and "00" different, which can prevent device registration.
Have the AMD IOMMU driver's ivrs_acpihid parsing code remove any leading zeroes to make the UID strcmp succeed. Now users can safely specify "AMDxxxxx:00" or "AMDxxxxx:0" and expect the same behaviour.
--- drivers/iommu/amd/init.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/iommu/amd/init.c +7 -0
@@ -3488,6 +3488,13 @@ static int __init parse_ivrs_acpihid(chareturn 1 ; } +/* +* Ignore leading zeroes after ':', so e.g., AMDI0095:00 +* will match AMDI0095:0 in the second strcmp in acpi_dev_hid_uid_match +*/ +while (*uid =='0' && *(uid +1 )) + uid++; + i = early_acpihid_map_size++;memcpy (early_acpihid_map[i].hid, hid,strlen (hid));memcpy (early_acpihid_map[i].uid, uid,strlen (uid));
Greg Kroah-Hartman
maintainerPATCH 140/207 iommu/amd: Fix ill-formed ivrs_ioapic, ivrs_hpet and ivrs_acpihid options
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
commit 1198d2316dc4265a97d0e8445a22c7a6d17580a4 upstream.
Currently, these options cause the following libkmod error:
libkmod: ERROR ../libkmod/libkmod-config.c:489 kcmdline_parse_result: \ Ignoring bad option on kernel command line while parsing module \ name: 'ivrs_xxxx[XX:XX'
Fix by introducing a new parameter format for these options and throw a warning for the deprecated format.
Users are still allowed to omit the PCI Segment if zero.
Adding a Link: to the reason why we're modding the syntax parsing in the driver and not in libkmod.
--- Documentation/admin-guide/kernel-parameters.txt | 27 ++++++-- drivers/iommu/amd/init.c | 77 ++++++++++++++++-------- 2 files changed, 75 insertions(+), 29 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +22 -5
@@ -2300,7 +2300,13 @@ Provide an override to the IOAPIC-ID<->DEVICE-ID mapping provided in the IVRS ACPI table. By default, PCI segment is 0, and can be omitted. - For example: + + For example, to map IOAPIC-ID decimal 10 to + PCI segment 0x1 and PCI device 00:14.0, + write the parameter as: + ivrs_ioapic=10@0001:00:14.0 + + Deprecated formats: * To map IOAPIC-ID decimal 10 to PCI device 00:14.0 write the parameter as: ivrs_ioapic[10]=00:14.0
@@ -2312,7 +2318,13 @@ Provide an override to the HPET-ID<->DEVICE-ID mapping provided in the IVRS ACPI table. By default, PCI segment is 0, and can be omitted. - For example: + + For example, to map HPET-ID decimal 10 to + PCI segment 0x1 and PCI device 00:14.0, + write the parameter as: + ivrs_hpet=10@0001:00:14.0 + + Deprecated formats: * To map HPET-ID decimal 0 to PCI device 00:14.0 write the parameter as: ivrs_hpet[0]=00:14.0
@@ -2323,15 +2335,20 @@ ivrs_acpihid [HW,X86-64] Provide an override to the ACPI-HID:UID<->DEVICE-ID mapping provided in the IVRS ACPI table. + By default, PCI segment is 0, and can be omitted. For example, to map UART-HID:UID AMD0020:0 to PCI segment 0x1 and PCI device ID 00:14.5, write the parameter as: - ivrs_acpihid[0001:00:14.5]=AMD0020:0 + ivrs_acpihid=AMD0020:0@0001:00:14.5 - By default, PCI segment is 0, and can be omitted. - For example, PCI device 00:14.5 write the parameter as: + Deprecated formats: + * To map UART-HID:UID AMD0020:0 to PCI segment is 0, + PCI device ID 00:14.5, write the parameter as: ivrs_acpihid[00:14.5]=AMD0020:0 + * To map UART-HID:UID AMD0020:0 to PCI segment 0x1 and + PCI device ID 00:14.5, write the parameter as: + ivrs_acpihid[0001:00:14.5]=AMD0020:0 js= [HW,JOY] Analog joystick See Documentation/input/joydev/joystick.rst.
drivers/iommu/amd/init.c +53 -24
108 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 141/207 test_kprobes: Fix implicit declaration error of test_kprobes
In reply to Greg Kroah-HartmanFrom: Li Hua <[email protected]>
commit 63a4dc0a0bb0e9bfeb2c88ccda81abdde4cdd6b8 upstream.
If KPROBES_SANITY_TEST and ARCH_CORRECT_STACKTRACE_ON_KRETPROBE is enabled, but STACKTRACE is not set. Build failed as below:
lib/test_kprobes.c: In function ‘stacktrace_return_handler’:lib/test_kprobes.c:228:8: error: implicit declaration of function ‘stack_trace_save’; did you mean ‘stacktrace_driver’? [-Werror=implicit-function-declaration]
ret = stack_trace_save(stack_buf, STACK_BUF_SIZE, 0);
^~~~~~~~~~~~~~~~
stacktrace_drivercc1: all warnings being treated as errors scripts/Makefile.build:250: recipe for target 'lib/test_kprobes.o' failed make[2]: *** [lib/test_kprobes.o] Error 1
To fix this error, Select STACKTRACE if ARCH_CORRECT_STACKTRACE_ON_KRETPROBE is enabled.
--- lib/Kconfig.debug | 1 + 1 file changed, 1 insertion(+)
lib/Kconfig.debug +1 -0
@@ -2092,6 +2092,7 @@ config TEST_MIN_HEAP config TEST_SORT tristate "Array-based sort test" if !KUNIT_ALL_TESTS depends on KUNIT + select STACKTRACE if ARCH_CORRECT_STACKTRACE_ON_KRETPROBE default KUNIT_ALL_TESTS help This option enables the self-test function of 'sort()' at boot,
Greg Kroah-Hartman
maintainerPATCH 142/207 hugetlb: really allocate vma lock for all sharable vmas
In reply to Greg Kroah-HartmanFrom: Mike Kravetz <[email protected]>
commit e700898fa075c69b3ae02b702ab57fb75e1a82ec upstream.
Commit bbff39cc6cbc ("hugetlb: allocate vma lock for all sharable vmas") removed the pmd sharable checks in the vma lock helper routines. However, it left the functional version of helper routines behind #ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE. Therefore, the vma lock is not being used for sharable vmas on architectures that do not support pmd sharing. On these architectures, a potential fault/truncation race is exposed that could leave pages in a hugetlb file past i_size until the file is removed.
Move the functional vma lock helpers outside the ifdef, and remove the non-functional stubs. Since the vma lock is not just for pmd sharing, rename the routine __vma_shareable_flags_pmd.
--- mm/hugetlb.c | 333 ++++++++++++++++++++++++++--------------------------------- 1 file changed, 148 insertions(+), 185 deletions(-)
mm/hugetlb.c +148 -185
@@ -255,6 +255,152 @@ static inline struct hugepage_subpool *sreturn subpool_inode (file_inode (vma->vm_file)); } +/* +* hugetlb vma_lock helper routines +*/ +static bool __vma_shareable_lock (struct vm_area_struct *vma) +{ +return vma->vm_flags & (VM_MAYSHARE |VM_SHARED ) && + vma->vm_private_data; +} + +void hugetlb_vma_lock_read (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +down_read (&vma_lock->rw_sema); + } +} + +void hugetlb_vma_unlock_read (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +up_read (&vma_lock->rw_sema); + } +} + +void hugetlb_vma_lock_write (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +down_write (&vma_lock->rw_sema); + } +} + +void hugetlb_vma_unlock_write (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +up_write (&vma_lock->rw_sema); + } +} + +int hugetlb_vma_trylock_write (struct vm_area_struct *vma) +{ +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +if (!__vma_shareable_lock (vma)) +return 1 ; + +return down_write_trylock (&vma_lock->rw_sema); +} + +void hugetlb_vma_assert_locked (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +lockdep_assert_held (&vma_lock->rw_sema); + } +} + +void hugetlb_vma_lock_release (struct kref *kref) +{ +struct hugetlb_vma_lock *vma_lock =container_of (kref, + struct hugetlb_vma_lock, refs); + +kfree (vma_lock); +} + +static void __hugetlb_vma_unlock_write_put (struct hugetlb_vma_lock *vma_lock) +{ +struct vm_area_struct *vma = vma_lock->vma; + +/* +* vma_lock structure may or not be released as a result of put, +* it certainly will no longer be attached to vma so clear pointer. +* Semaphore synchronizes access to vma_lock->vma field. +*/ + vma_lock->vma =NULL ; + vma->vm_private_data =NULL ; +up_write (&vma_lock->rw_sema); +kref_put (&vma_lock->refs, hugetlb_vma_lock_release); +} + +static void __hugetlb_vma_unlock_write_free (struct vm_area_struct *vma) +{ +if (__vma_shareable_lock (vma)) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +__hugetlb_vma_unlock_write_put (vma_lock); + } +} + +static void hugetlb_vma_lock_free (struct vm_area_struct *vma) +{ +/* +* Only present in sharable vmas. +*/ +if (!vma || !__vma_shareable_lock (vma)) +return ; + +if (vma->vm_private_data) { +struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; + +down_write (&vma_lock->rw_sema); +__hugetlb_vma_unlock_write_put (vma_lock); + } +} + +static void hugetlb_vma_lock_alloc (struct vm_area_struct *vma) +{ +struct hugetlb_vma_lock *vma_lock; + +/* Only establish in (flags) sharable vmas */ +if (!vma || !(vma->vm_flags &VM_MAYSHARE )) +return ; + +/* Should never get here with non-NULL vm_private_data */ +if (vma->vm_private_data) +return ; + + vma_lock =kmalloc (sizeof (*vma_lock),GFP_KERNEL ); +if (!vma_lock) { +/* +* If we can not allocate structure, then vma can not +* participate in pmd sharing. This is only a possible +* performance enhancement and memory saving issue. +* However, the lock is also used to synchronize page +* faults with truncation. If the lock is not present, +* unlikely races could leave pages in a file past i_size +* until the file is removed. Warn in the unlikely case of +* allocation failure. +*/ +pr_warn_once ("HugeTLB: unable to allocate vma specific lock\n" ); +return ; + } + +kref_init (&vma_lock->refs); +init_rwsem (&vma_lock->rw_sema); + vma_lock->vma = vma; + vma->vm_private_data = vma_lock; +} +/* Helper that removes a struct file_region from the resv_map cache and returns * it for use. */
@@ -6557,7 +6703,8 @@ bool hugetlb_reserve_pages(struct inode }/* -* vma specific semaphore used for pmd sharing synchronization +* vma specific semaphore used for pmd sharing and fault/truncation +* synchronization */ hugetlb_vma_lock_alloc (vma);
@@ -6813,149 +6960,6 @@ void adjust_range_if_pmd_sharing_possibl *end =ALIGN (*end,PUD_SIZE ); } -static bool __vma_shareable_flags_pmd (struct vm_area_struct *vma) -{ -return vma->vm_flags & (VM_MAYSHARE |VM_SHARED ) && - vma->vm_private_data; -} - -void hugetlb_vma_lock_read (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -down_read (&vma_lock->rw_sema); - } -} - -void hugetlb_vma_unlock_read (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -up_read (&vma_lock->rw_sema); - } -} - -void hugetlb_vma_lock_write (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -down_write (&vma_lock->rw_sema); - } -} - -void hugetlb_vma_unlock_write (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -up_write (&vma_lock->rw_sema); - } -} - -int hugetlb_vma_trylock_write (struct vm_area_struct *vma) -{ -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -if (!__vma_shareable_flags_pmd (vma)) -return 1 ; - -return down_write_trylock (&vma_lock->rw_sema); -} - -void hugetlb_vma_assert_locked (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -lockdep_assert_held (&vma_lock->rw_sema); - } -} - -void hugetlb_vma_lock_release (struct kref *kref) -{ -struct hugetlb_vma_lock *vma_lock =container_of (kref, - struct hugetlb_vma_lock, refs); - -kfree (vma_lock); -} - -static void __hugetlb_vma_unlock_write_put (struct hugetlb_vma_lock *vma_lock) -{ -struct vm_area_struct *vma = vma_lock->vma; - -/* -* vma_lock structure may or not be released as a result of put, -* it certainly will no longer be attached to vma so clear pointer. -* Semaphore synchronizes access to vma_lock->vma field. -*/ - vma_lock->vma =NULL ; - vma->vm_private_data =NULL ; -up_write (&vma_lock->rw_sema); -kref_put (&vma_lock->refs, hugetlb_vma_lock_release); -} - -static void __hugetlb_vma_unlock_write_free (struct vm_area_struct *vma) -{ -if (__vma_shareable_flags_pmd (vma)) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -__hugetlb_vma_unlock_write_put (vma_lock); - } -} - -static void hugetlb_vma_lock_free (struct vm_area_struct *vma) -{ -/* -* Only present in sharable vmas. -*/ -if (!vma || !__vma_shareable_flags_pmd (vma)) -return ; - -if (vma->vm_private_data) { -struct hugetlb_vma_lock *vma_lock = vma->vm_private_data; - -down_write (&vma_lock->rw_sema); -__hugetlb_vma_unlock_write_put (vma_lock); - } -} - -static void hugetlb_vma_lock_alloc (struct vm_area_struct *vma) -{ -struct hugetlb_vma_lock *vma_lock; - -/* Only establish in (flags) sharable vmas */ -if (!vma || !(vma->vm_flags &VM_MAYSHARE )) -return ; - -/* Should never get here with non-NULL vm_private_data */ -if (vma->vm_private_data) -return ; - - vma_lock =kmalloc (sizeof (*vma_lock),GFP_KERNEL ); -if (!vma_lock) { -/* -* If we can not allocate structure, then vma can not -* participate in pmd sharing. This is only a possible -* performance enhancement and memory saving issue. -* However, the lock is also used to synchronize page -* faults with truncation. If the lock is not present, -* unlikely races could leave pages in a file past i_size -* until the file is removed. Warn in the unlikely case of -* allocation failure. -*/ -pr_warn_once ("HugeTLB: unable to allocate vma specific lock\n" ); -return ; - } - -kref_init (&vma_lock->refs); -init_rwsem (&vma_lock->rw_sema); - vma_lock->vma = vma; - vma->vm_private_data = vma_lock; -} -/* * Search for a shareable pmd page for hugetlb. In any case calls pmd_alloc() * and returns the corresponding pte. While this is not necessary for the
@@ -7044,47 +7048,6 @@ int huge_pmd_unshare(struct mm_struct *m#else /* !CONFIG_ARCH_WANT_HUGE_PMD_SHARE */ -void hugetlb_vma_lock_read (struct vm_area_struct *vma) -{ -} - -void hugetlb_vma_unlock_read (struct vm_area_struct *vma) -{ -} - -void hugetlb_vma_lock_write (struct vm_area_struct *vma) -{ -} - -void hugetlb_vma_unlock_write (struct vm_area_struct *vma) -{ -} - -int hugetlb_vma_trylock_write (struct vm_area_struct *vma) -{ -return 1 ; -} - -void hugetlb_vma_assert_locked (struct vm_area_struct *vma) -{ -} - -void hugetlb_vma_lock_release (struct kref *kref) -{ -} - -static void __hugetlb_vma_unlock_write_free (struct vm_area_struct *vma) -{ -} - -static void hugetlb_vma_lock_free (struct vm_area_struct *vma) -{ -} - -static void hugetlb_vma_lock_alloc (struct vm_area_struct *vma) -{ -} -pte_t *huge_pmd_share (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long addr,pud_t *pud) {
Greg Kroah-Hartman
maintainerPATCH 143/207 remoteproc: imx_dsp_rproc: Add mutex protection for workqueue
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
commit 47e6ab07018edebf94ce873cf50a05ec76ff2dde upstream.
The workqueue may execute late even after remoteproc is stopped or stopping, some resources (rpmsg device and endpoint) have been released in rproc_stop_subdevices(), then rproc_vq_interrupt() accessing these resources will cause kennel dump.
Call trace: virtqueue_add_split+0x1ac/0x560 virtqueue_add_inbuf+0x4c/0x60 rpmsg_recv_done+0x15c/0x294 vring_interrupt+0x6c/0xa4 rproc_vq_interrupt+0x30/0x50 imx_dsp_rproc_vq_work+0x24/0x40 [imx_dsp_rproc] process_one_work+0x1d0/0x354 worker_thread+0x13c/0x470 kthread+0x154/0x160 ret_from_fork+0x10/0x20
Add mutex protection in imx_dsp_rproc_vq_work(), if the state is not running, then just skip calling rproc_vq_interrupt().
Also the flush workqueue operation can't be added in rproc stop for the same reason. The call sequence is
rproc_shutdown
-> rproc_stop
->rproc_stop_subdevices
->rproc->ops->stop()
->imx_dsp_rproc_stop
->flush_work
-> rproc_vq_interruptThe resource needed by rproc_vq_interrupt has been released in rproc_stop_subdevices, so flush_work is not safe to be called in imx_dsp_rproc_stop.
--- drivers/remoteproc/imx_dsp_rproc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/remoteproc/imx_dsp_rproc.c +9 -3
@@ -347,9 +347,6 @@ static int imx_dsp_rproc_stop(struct rprstruct device *dev = rproc->dev.parent;int ret =0 ; -/* Make sure work is finished */ -flush_work (&priv->rproc_work); -if (rproc->state ==RPROC_CRASHED ) { priv->flags &= ~REMOTE_IS_READY ;return 0 ;
@@ -432,9 +429,18 @@ static void imx_dsp_rproc_vq_work(struct { struct imx_dsp_rproc *priv = container_of(work, struct imx_dsp_rproc, rproc_work); +struct rproc *rproc = priv->rproc; + +mutex_lock (&rproc->lock); + +if (rproc->state !=RPROC_RUNNING ) + goto unlock_mutex;rproc_vq_interrupt (priv->rproc,0 );rproc_vq_interrupt (priv->rproc,1 ); + +unlock_mutex: +mutex_unlock (&rproc->lock); }/**
Greg Kroah-Hartman
maintainerPATCH 144/207 remoteproc: core: Do pm_relax when in RPROC_OFFLINE state
In reply to Greg Kroah-HartmanFrom: Maria Yu <[email protected]>
commit 11c7f9e3131ad14b27a957496088fa488b153a48 upstream.
Make sure that pm_relax() happens even when the remoteproc is stopped before the crash handler work is scheduled.
--- drivers/remoteproc/remoteproc_core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/remoteproc/remoteproc_core.c +8 -1
@@ -1868,12 +1868,18 @@ static void rproc_crash_handler_work(strmutex_lock (&rproc->lock); -if (rproc->state ==RPROC_CRASHED || rproc->state ==RPROC_OFFLINE ) { +if (rproc->state ==RPROC_CRASHED ) {/* handle only the first crash detected */ mutex_unlock (&rproc->lock);return ; } +if (rproc->state ==RPROC_OFFLINE ) { +/* Don't recover if the remote processor was stopped */ +mutex_unlock (&rproc->lock); + goto out; + } + rproc->state =RPROC_CRASHED ;dev_err (dev,"handling crash #%u in %s\n" , ++rproc->crash_cnt, rproc->name);
@@ -1883,6 +1889,7 @@ static void rproc_crash_handler_work(strif (!rproc->recovery_disabled)rproc_trigger_recovery (rproc); +out:pm_relax (rproc->dev.parent); }
Greg Kroah-Hartman
maintainerPATCH 145/207 remoteproc: imx_rproc: Correct i.MX93 DRAM mapping
In reply to Greg Kroah-HartmanFrom: Peng Fan <[email protected]>
commit ee18f2715e85f4ef051851a0c4831ee7ad7d83b3 upstream.
According to updated reference mannual, the M33 DRAM view of 0x[C,D]0000000 maps to A55 0xC0000000, so correct it.
--- drivers/remoteproc/imx_rproc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/remoteproc/imx_rproc.c +2 -2
@@ -113,8 +113,8 @@ static const struct imx_rproc_att imx_rp { 0x80000000, 0x80000000, 0x10000000, 0 }, { 0x90000000, 0x80000000, 0x10000000, 0 }, - { 0xC0000000, 0xa0000000, 0x10000000, 0 }, - { 0xD0000000, 0xa0000000, 0x10000000, 0 }, + { 0xC0000000, 0xC0000000, 0x10000000, 0 }, + { 0xD0000000, 0xC0000000, 0x10000000, 0 }, }; static const struct imx_rproc_att imx_rproc_att_imx8mn[] = {
Greg Kroah-Hartman
maintainerPATCH 146/207 parisc: led: Fix potential null-ptr-deref in start_task()
In reply to Greg Kroah-HartmanFrom: Shang XiaoJing <[email protected]>
commit 41f563ab3c33698bdfc3403c7c2e6c94e73681e4 upstream.
start_task() calls create_singlethread_workqueue() and not checked the ret value, which may return NULL. And a null-ptr-deref may happen:
start_task()
create_singlethread_workqueue() # failed, led_wq is NULL queue_delayed_work()
queue_delayed_work_on()
__queue_delayed_work() # warning here, but continue
__queue_work() # access wq->flags, null-ptr-deref
Check the ret value and return -ENOMEM if it is NULL.
--- drivers/parisc/led.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/parisc/led.c +3 -0
@@ -137,6 +137,9 @@ static int start_task(void)/* Create the work queue and queue the LED task */ led_wq =create_singlethread_workqueue ("led_wq" ); +if (!led_wq) +return -ENOMEM ; +queue_delayed_work (led_wq, &led_task,0 );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 147/207 parisc: Drop locking in pdc console code
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit 7dc4dbfe750e1f18c511e73c8ed114da8de9ff85 upstream.
No need to have specific locking for console I/O since the PDC functions provide an own locking.
--- arch/parisc/kernel/pdc_cons.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
arch/parisc/kernel/pdc_cons.c +3 -13
@@ -12,37 +12,27 @@#include <asm/page.h> /* for PAGE0 */ #include <asm/pdc.h> /* for iodc_call() proto and friends */ -static DEFINE_SPINLOCK (pdc_console_lock); -static void pdc_console_write (struct console *co,const char *s,unsigned count) {int i =0 ; -unsigned long flags; -spin_lock_irqsave (&pdc_console_lock, flags);do { i +=pdc_iodc_print (s + i, count - i); }while (i < count); -spin_unlock_irqrestore (&pdc_console_lock, flags); }#ifdef CONFIG_KGDB static int kgdb_pdc_read_char (void ) { -int c; -unsigned long flags; - -spin_lock_irqsave (&pdc_console_lock, flags); - c =pdc_iodc_getc (); -spin_unlock_irqrestore (&pdc_console_lock, flags); +int c =pdc_iodc_getc ();return (c <=0 ) ?NO_POLL_CHAR : c; }static void kgdb_pdc_write_char (u8 chr) { -if (PAGE0 ->mem_cons.cl_class !=CL_DUPLEX ) -pdc_console_write (NULL , &chr,1 ); +/* no need to print char as it's shown on standard console */ +/* pdc_iodc_print(&chr, 1); */ } static struct kgdb_io kgdb_pdc_io_ops = {
Signature · 1 line
2.39.0