5.16.5-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.16.5-rc1 review
This is the start of the stable review cycle for the 5.16.5 release. There are 200 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 02 Feb 2022 10:51:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.16.5-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.16.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.16.5-rc1
OGAWA Hirofumi <[email protected]>
block: Fix wrong offset in bio_truncate()
Vitaly Kuznetsov <[email protected]>
KVM: nVMX: Allow VMREAD when Enlightened VMCS is in use
Vitaly Kuznetsov <[email protected]>
KVM: nVMX: Implement evmcs_field_offset() suitable for handle_vmread()
Vitaly Kuznetsov <[email protected]>
KVM: nVMX: Rename vmcs_to_field_offset{,_table}Maor Gottlieb <[email protected]>
tools/testing/scatterlist: add missing defines
Dmitry V. Levin <[email protected]>
usr/include/Makefile: add linux/nfc.h to the compile-test coverage
Robert Hancock <[email protected]>
usb: dwc3: xilinx: fix uninitialized return value
Suren Baghdasaryan <[email protected]>
psi: fix "defined but not used" warnings when CONFIG_PROC_FS=n
Suren Baghdasaryan <[email protected]>
psi: fix "no previous prototype" warnings when CONFIG_CGROUPS=n
Namhyung Kim <[email protected]>
perf/core: Fix cgroup event list management
Sergio Paracuellos <[email protected]>
PCI: mt7621: Remove unused function pcie_rmw()
Marc Kleine-Budde <[email protected]>
dt-bindings: can: tcan4x5x: fix mram-cfg RX FIFO config
Sander Vanheule <[email protected]>
irqchip/realtek-rtl: Fix off-by-one in routing
Sander Vanheule <[email protected]>
irqchip/realtek-rtl: Map control data to virq
Tim Yi <[email protected]>
net: bridge: vlan: fix memory leak in __allowed_ingress
Eric Dumazet <[email protected]>
ipv4: remove sparse error in ip_neigh_gw4()
Eric Dumazet <[email protected]>
ipv4: tcp: send zero IPID in SYNACK messages
Eric Dumazet <[email protected]>
ipv4: raw: lock the socket in raw_bind()
Nikolay Aleksandrov <[email protected]>
net: bridge: vlan: fix single net device option dumping
Guillaume Nault <[email protected]>
Revert "ipv6: Honor all IPv6 PIO Valid Lifetime values"
Catherine Sullivan <[email protected]>
gve: Fix GFP flags when allocing pages
Xiubo Li <[email protected]>
ceph: put the requests/sessions when it fails to alloc memory
Sean Christopherson <[email protected]>
KVM: selftests: Don't skip L2's VMCALL in SMM test for SVM guest
Dave Airlie <[email protected]>
Revert "drm/ast: Support 1600x900 with 108MHz PCLK"
Maxim Mikityanskiy <[email protected]>
sch_htb: Fail on unsupported parameters when offload is requested
David Matlack <[email protected]>
KVM: selftests: Re-enable access_tracking_perf_test
Yufeng Mo <[email protected]>
net: hns3: handle empty unknown interrupt for VF
Toke Høiland-Jørgensen <[email protected]>
net: cpsw: Properly initialise struct page_pool_params
Hangyu Hua <[email protected]>
yam: fix a memory leak in yam_siocdevprivate()
Rob Clark <[email protected]>
drm/msm/a6xx: Add missing suspend_count increment
José Expósito <[email protected]>
drm/msm/dpu: invalid parameter check in dpu_setup_dspp_pcc
Miaoqian Lin <[email protected]>
drm/msm/hdmi: Fix missing put_device() call in msm_hdmi_get_phy
Guenter Roeck <[email protected]>
hwmon: (nct6775) Fix crash in clear_caseopen
Marc Kleine-Budde <[email protected]>
can: tcan4x5x: regmap: fix max register value
Michael Kelley <[email protected]>
video: hyperv_fb: Fix validation of screen resolution
Wen Gu <[email protected]>
net/smc: Transitional solution for clcsock race issue
Sukadev Bhattiprolu <[email protected]>
ibmvnic: don't spin in tasklet
Sukadev Bhattiprolu <[email protected]>
ibmvnic: init ->running_cap_crqs early
Sukadev Bhattiprolu <[email protected]>
ibmvnic: Allow extra failures before disabling
Jakub Kicinski <[email protected]>
ipv4: fix ip option filtering for locally generated fragments
Athira Rajeev <[email protected]>
powerpc/perf: Fix power_pmu_disable to call clear_pmi_irq_pending only if PMI is pending
Dan Carpenter <[email protected]>
hwmon: (adt7470) Prevent divide by zero in adt7470_fan_write()
Guenter Roeck <[email protected]>
hwmon: (lm90) Fix sysfs and udev notifications
Guenter Roeck <[email protected]>
hwmon: (lm90) Mark alert as broken for MAX6654
Guenter Roeck <[email protected]>
hwmon: (lm90) Re-enable interrupts after alert clears
Yanming Liu <[email protected]>
Drivers: hv: balloon: account for vmbus packet header in max_pkt_size
Miaoqian Lin <[email protected]>
block: fix memory leak in disk_register_independent_access_ranges
Dylan Yudaken <[email protected]>
io_uring: fix bug in slow unregistering of nodes
Mihai Carabas <[email protected]>
efi/libstub: arm64: Fix image check alignment at entry
David Howells <[email protected]>
rxrpc: Adjust retransmission backoff
Kiran Kumar K <[email protected]>
octeontx2-af: Add KPU changes to parse NGIO as separate layer
Subbaraya Sundeep <[email protected]>
octeontx2-pf: Forward error codes to VF
Geetha sowjanya <[email protected]>
octeontx2-af: cn10k: Do not enable RPM loopback for LPC interfaces
Geetha sowjanya <[email protected]>
octeontx2-af: Increase link credit restore polling timeout
Geetha sowjanya <[email protected]>
octeontx2-pf: cn10k: Ensure valid pointers are freed to aura
Geetha sowjanya <[email protected]>
octeontx2-af: cn10k: Use appropriate register for LMAC enable
Geetha sowjanya <[email protected]>
octeontx2-af: Retry until RVU block reset complete
Sunil Goutham <[email protected]>
octeontx2-af: Fix LBK backpressure id count
Subbaraya Sundeep <[email protected]>
octeontx2-af: Do not fixup all VF action entries
Paolo Abeni <[email protected]>
selftests: mptcp: fix ipv6 routing setup
Geliang Tang <[email protected]>
mptcp: fix removing ids bitmap setting
Paolo Abeni <[email protected]>
mptcp: fix msk traversal in mptcp_nl_cmd_set_flags()
Paolo Abeni <[email protected]>
mptcp: keep track of local endpoint still available for each msk
Jean Sacren <[email protected]>
mptcp: clean up harmless false expressions
Davide Caratti <[email protected]>
mptcp: allow changing the "backup" bit by endpoint id
Marek Behún <[email protected]>
phylib: fix potential use-after-free
Yuji Ishikawa <[email protected]>
net: stmmac: dwmac-visconti: Fix clock configuration for RMII mode
Yuji Ishikawa <[email protected]>
net: stmmac: dwmac-visconti: Fix bit definitions for ETHER_CLK_SEL
Moshe Tal <[email protected]>
ethtool: Fix link extended state for big endian
Robert Hancock <[email protected]>
net: phy: broadcom: hook up soft_reset for BCM54616S
Vincent Guittot <[email protected]>
sched/pelt: Relax the sync of util_sum with util_avg
Peter Zijlstra <[email protected]>
perf: Fix perf_event_read_local() time
Nicholas Piggin <[email protected]>
powerpc/64s: Mask SRR0 before checking against the masked NIP
Randy Dunlap <[email protected]>
remoteproc: qcom: q6v5: fix service routines build errors
Florian Westphal <[email protected]>
netfilter: conntrack: don't increment invalid counter on NF_REPEAT
Naveen N. Rao <[email protected]>
powerpc64/bpf: Limit 'ldbrx' to processors compliant with ISA v2.06
Chuck Lever <[email protected]>
SUNRPC: Don't dereference xprt->snd_task if it's a cookie
Marc Zyngier <[email protected]>
KVM: arm64: pkvm: Use the mm_ops indirection for cache maintenance
Trond Myklebust <[email protected]>
NFS: Ensure the server has an up to date ctime before renaming
Trond Myklebust <[email protected]>
NFS: Ensure the server has an up to date ctime before hardlinking
Eric Dumazet <[email protected]>
ipv6: annotate accesses to fn->fn_sernum
José Expósito <[email protected]>
drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable
Miaoqian Lin <[email protected]>
drm/msm/dsi: Fix missing put_device() call in dsi_get_phy
Xianting Tian <[email protected]>
drm/msm: Fix wrong size calculation
Jianguo Wu <[email protected]>
net-procfs: show net devices bound packet types
Trond Myklebust <[email protected]>
NFSv4: nfs_atomic_open() can race when looking up a non-regular file
Trond Myklebust <[email protected]>
NFSv4: Handle case where the lookup of a directory fails
Guenter Roeck <[email protected]>
hwmon: (lm90) Reduce maximum conversion rate for G781
Eric Dumazet <[email protected]>
ipv4: avoid using shared IP generator for connected sockets
Xin Long <[email protected]>
ping: fix the sk_bound_dev_if match in ping_lookup
Guenter Roeck <[email protected]>
hwmon: (lm90) Mark alert as broken for MAX6680
Guenter Roeck <[email protected]>
hwmon: (lm90) Mark alert as broken for MAX6646/6647/6649
Congyu Liu <[email protected]>
net: fix information leakage in /proc/net/ptype
sparkhuang <[email protected]>
ARM: 9170/1: fix panic when kasan and kprobe are enabled
Ido Schimmel <[email protected]>
ipv6_tunnel: Rate limit warning messages
John Meneghini <[email protected]>
scsi: bnx2fc: Flush destroy_work queue before calling bnx2fc_interface_put()
Yang Yingliang <[email protected]>
scsi: elx: efct: Don't use GFP_KERNEL under spin lock
Matthias Kaehlcke <[email protected]>
rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev
Sujit Kautkar <[email protected]>
rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev
Linyu Yuan <[email protected]>
usb: roles: fix include/linux/usb/role.h compile issue
Joe Damato <[email protected]>
i40e: fix unsigned stat widths
Karen Sornek <[email protected]>
i40e: Fix for failed to init adminq while VF reset
Sylwester Dziedziuch <[email protected]>
i40e: Fix queues reservation for XDP
Jedrzej Jagielski <[email protected]>
i40e: Fix issue when maximum queues is exceeded
Jedrzej Jagielski <[email protected]>
i40e: Increase delay to 1 s after global EMP reset
Christophe Leroy <[email protected]>
powerpc/32: Fix boot failure with GCC latent entropy plugin
Christophe Leroy <[email protected]>
powerpc/32s: Fix kasan_init_region() for KASAN
Christophe Leroy <[email protected]>
powerpc/32s: Allocate one 256k IBAT instead of two consecutives 128k IBATs
Tony Luck <[email protected]>
x86/cpu: Add Xeon Icelake-D to list of CPUs that support PPIN
Yazen Ghannam <[email protected]>
x86/MCE/AMD: Allow thresholding interface updates after init
Bjorn Helgaas <[email protected]>
PCI/sysfs: Find shadow ROM before static attribute initialization
Mathieu Desnoyers <[email protected]>
sched/membarrier: Fix membarrier-rseq fence command missing from query bitmask
Joseph Qi <[email protected]>
ocfs2: fix a deadlock when commit trans
Joseph Qi <[email protected]>
jbd2: export jbd2_journal_[grab|put]_journal_head
Peter Collingbourne <[email protected]>
mm, kasan: use compare-exchange operation to set KASAN page tag
Lorenzo Bianconi <[email protected]>
mt76: connac: introduce MCU_CE_CMD macro
Sing-Han Chen <[email protected]>
ucsi_ccg: Check DEV_INT bit only when starting CCG4
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: Do not disconnect when receiving VSAFE0V
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: Do not disconnect while receiving VBUS off
Xu Yang <[email protected]>
usb: typec: tcpci: don't touch CC line if it's Vconn source
Alan Stern <[email protected]>
USB: core: Fix hang in usb_kill_urb by adding memory barriers
Robert Hancock <[email protected]>
usb: dwc3: xilinx: Fix error handling when getting USB3 PHY
Robert Hancock <[email protected]>
usb: dwc3: xilinx: Skip resets and USB3 register settings for USB2.0 mode
Pawel Laszczak <[email protected]>
usb: cdnsp: Fix segmentation fault in cdns_lost_power function
Pavankumar Kondeti <[email protected]>
usb: gadget: f_sourcesink: Fix isoc transfer for USB_SPEED_SUPER_PLUS
Jon Hunter <[email protected]>
usb: common: ulpi: Fix crash in ulpi_match()
Frank Li <[email protected]>
usb: xhci-plat: fix crash when suspend if remote wake enable
Alan Stern <[email protected]>
usb-storage: Add unusual-devs entry for VL817 USB-SATA bridge
Greg Kroah-Hartman <[email protected]>
kbuild: remove include/linux/cyclades.h from header file check
Cameron Williams <[email protected]>
tty: Add support for Brainboxes UC cards.
Maciej W. Rozycki <[email protected]>
tty: Partially revert the removal of the Cyclades public API
[email protected] <[email protected]>
tty: n_gsm: fix SW flow control encoding/handling
Arnaud Pouliquen <[email protected]>
tty: rpmsg: Fix race condition releasing tty port
Valentin Caron <[email protected]>
serial: stm32: fix software flow control transfer
Robert Hancock <[email protected]>
serial: 8250: of: Fix mapped region size when using reg-offset property
Jochen Mades <[email protected]>
serial: pl011: Fix incorrect rs485 RTS polarity on set_mctrl
Mike Snitzer <[email protected]>
dm: properly fix redundant bio-based IO accounting
Mike Snitzer <[email protected]>
block: add bio_start_io_acct_time() to control start_time
Mike Snitzer <[email protected]>
dm: revert partial fix for redundant bio-based IO accounting
Evgenii Stepanov <[email protected]>
arm64: extable: fix load_unaligned_zeropad() reg indices
Vivek Goyal <[email protected]>
security, lsm: dentry_init_security() Handle multi LSM registration
Nicholas Piggin <[email protected]>
KVM: PPC: Book3S HV Nested: Fix nested HFSCR being clobbered with multiple vCPUs
Like Xu <[email protected]>
KVM: x86: Sync the states size with the XCR0/IA32_XSS at, any time
Like Xu <[email protected]>
KVM: x86: Update vCPU's runtime CPUID on write to MSR_IA32_XSS
Xiaoyao Li <[email protected]>
KVM: x86: Keep MSR_IA32_XSS unchanged for INIT
Vitaly Kuznetsov <[email protected]>
KVM: x86: Check .flags in kvm_cpuid_check_equal() too
Sean Christopherson <[email protected]>
KVM: x86: Forcibly leave nested virt when SMM state is toggled
Sean Christopherson <[email protected]>
KVM: x86: Free kvm_cpuid_entry2 array on post-KVM_RUN KVM_SET_CPUID{,2}Vitaly Kuznetsov <[email protected]>
KVM: x86: Move CPUID.(EAX=0x12,ECX=1) mangling to __kvm_update_cpuid_runtime()
Denis Valeev <[email protected]>
KVM: x86: nSVM: skip eax alignment check for non-SVM instructions
Sean Christopherson <[email protected]>
KVM: SVM: Don't intercept #GP for SEV guests
Sean Christopherson <[email protected]>
KVM: SVM: Never reject emulation due to SMAP errata for !SEV guests
Wanpeng Li <[email protected]>
KVM: LAPIC: Also cancel preemption timer during SET_LAPIC
Bas Nieuwenhuizen <[email protected]>
drm/amd/display: Wrap dcn301_calculate_wm_and_dlg for FPU.
Bas Nieuwenhuizen <[email protected]>
drm/amd/display: Fix FP start/end for dcn30_internal_validate_bw.
Bas Nieuwenhuizen <[email protected]>
drm/amdgpu/display: Remove t_srx_delay_us.
Alex Deucher <[email protected]>
drm/amdgpu: filter out radeon secondary ids as well
Manasi Navare <[email protected]>
drm/atomic: Add the crtc to affected crtc only if uapi.enable = true
Lucas Stach <[email protected]>
drm/etnaviv: relax submit size limits
Kan Liang <[email protected]>
perf/x86/intel: Add a quirk for the calculation of the number of counters on Alder Lake
Zhengjun Xing <[email protected]>
perf/x86/intel/uncore: Fix CAS_COUNT_WRITE issue for ICX
Christophe Leroy <[email protected]>
powerpc/audit: Fix syscall_get_arch()
Suren Baghdasaryan <[email protected]>
psi: Fix uaf issue when psi trigger is destroyed while being polled
Sean Christopherson <[email protected]>
Revert "KVM: SVM: avoid infinite loop on NPF from bad address"
Amir Goldstein <[email protected]>
fsnotify: fix fsnotify hooks in pseudo filesystems
Amir Goldstein <[email protected]>
fsnotify: invalidate dcache before IN_DELETE event
Jeff Layton <[email protected]>
ceph: set pool_ns in new inode layout for async creates
Jeff Layton <[email protected]>
ceph: properly put ceph_string reference after async create attempt
Tom Zanussi <[email protected]>
tracing: Don't inc err_log entry count if entry allocation fails
Tom Zanussi <[email protected]>
tracing: Propagate is_signed to expression
Xiaoke Wang <[email protected]>
tracing/histogram: Fix a potential memory leak for kstrdup()
Greg Kroah-Hartman <[email protected]>
PM: wakeup: simplify the output logic of pm_show_wakelocks()
Ard Biesheuvel <[email protected]>
efi: runtime: avoid EFIv2 runtime services on Apple x86 machines
Jan Kara <[email protected]>
udf: Fix NULL ptr deref when converting from inline format
Jan Kara <[email protected]>
udf: Restore i_lenAlloc when inode expansion fails
Steffen Maier <[email protected]>
scsi: zfcp: Fix failed recovery on gone remote port with non-NPIV FCP devices
Eric W. Biederman <[email protected]>
ucount: Make get_ucount a safe get_user replacement
Naveen N. Rao <[email protected]>
powerpc/bpf: Update ldimm64 instructions during extra pass
Naveen N. Rao <[email protected]>
powerpc32/bpf: Fix codegen for bpf-to-bpf calls
Naveen N. Rao <[email protected]>
bpf: Guard against accessing NULL pt_regs in bpf_get_task_stack()
Christian Borntraeger <[email protected]>
s390/nmi: handle vector validity failures for KVM guests
Christian Borntraeger <[email protected]>
s390/nmi: handle guarded storage validity failures for KVM guests
Vasily Gorbik <[email protected]>
s390/hypfs: include z/VM guests with access control group set
Ilya Leoshkevich <[email protected]>
s390/module: fix loading modules with a lot of relocations
Marc Zyngier <[email protected]>
KVM: arm64: vgic-v3: Restrict SEIS workaround to known broken systems
Marc Zyngier <[email protected]>
KVM: arm64: Use shadow SPSR_EL1 when injecting exceptions on !VHE
Ard Biesheuvel <[email protected]>
ARM: 9180/1: Thumb2: align ALT_UP() sections in modules sufficiently
Ard Biesheuvel <[email protected]>
ARM: 9179/1: uaccess: avoid alignment faults in copy_[from|to]_kernel_nofault
Mohammad Athari Bin Ismail <[email protected]>
net: stmmac: skip only stmmac_ptp_register when resume from suspend
Mohammad Athari Bin Ismail <[email protected]>
net: stmmac: configure PTP clock source prior to PTP initialization
Marek Behún <[email protected]>
net: sfp: ignore disabled SFP node
Marc Kleine-Budde <[email protected]>
can: m_can: m_can_fifo_{read,write}: don't read or write from/to FIFO if length is 0
Filipe Manana <[email protected]>
btrfs: update writeback index when starting defrag
Filipe Manana <[email protected]>
btrfs: add back missing dirty page rate limiting to defrag
Filipe Manana <[email protected]>
btrfs: fix deadlock when reserving space during defrag
Qu Wenruo <[email protected]>
btrfs: defrag: properly update range->start for autodefrag
Qu Wenruo <[email protected]>
btrfs: defrag: fix wrong number of defragged sectors
Filipe Manana <[email protected]>
btrfs: allow defrag to be interruptible
Filipe Manana <[email protected]>
btrfs: fix too long loop when defragging a 1 byte file
Brian Gix <[email protected]>
Bluetooth: refactor malicious adv data check
-------------
Diffstat:
Documentation/accounting/psi.rst | 3 +- .../devicetree/bindings/net/can/tcan4x5x.txt | 2 +- Makefile | 4 +- arch/arm/include/asm/assembler.h | 2 + arch/arm/include/asm/processor.h | 1 + arch/arm/include/asm/uaccess.h | 10 +- arch/arm/probes/kprobes/Makefile | 3 + arch/arm64/kvm/hyp/exception.c | 5 +- arch/arm64/kvm/hyp/pgtable.c | 18 +- arch/arm64/kvm/hyp/vgic-v3-sr.c | 3 + arch/arm64/kvm/vgic/vgic-v3.c | 17 +- arch/arm64/mm/extable.c | 4 +- arch/ia64/pci/fixup.c | 4 +- arch/mips/loongson64/vbios_quirk.c | 9 +- arch/powerpc/include/asm/book3s/32/mmu-hash.h | 2 + arch/powerpc/include/asm/kvm_book3s_64.h | 1 - arch/powerpc/include/asm/kvm_host.h | 1 + arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/include/asm/syscall.h | 4 +- arch/powerpc/include/asm/thread_info.h | 2 + arch/powerpc/kernel/Makefile | 1 + arch/powerpc/kernel/interrupt_64.S | 2 + arch/powerpc/kvm/book3s_hv.c | 3 +- arch/powerpc/kvm/book3s_hv_nested.c | 2 +- arch/powerpc/lib/Makefile | 3 + arch/powerpc/mm/book3s32/mmu.c | 15 +- arch/powerpc/mm/kasan/book3s_32.c | 59 ++--- arch/powerpc/net/bpf_jit_comp.c | 29 ++- arch/powerpc/net/bpf_jit_comp32.c | 9 + arch/powerpc/net/bpf_jit_comp64.c | 29 ++- arch/powerpc/perf/core-book3s.c | 17 +- arch/s390/hypfs/hypfs_vm.c | 6 +- arch/s390/kernel/module.c | 37 ++- arch/s390/kernel/nmi.c | 27 ++- arch/x86/events/intel/core.c | 13 ++ arch/x86/events/intel/uncore_snbep.c | 2 +- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kernel/cpu/mce/amd.c | 2 +- arch/x86/kernel/cpu/mce/intel.c | 1 + arch/x86/kvm/cpuid.c | 65 ++++-- arch/x86/kvm/lapic.c | 2 +- arch/x86/kvm/svm/nested.c | 9 +- arch/x86/kvm/svm/svm.c | 41 ++-- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/vmx/evmcs.c | 3 +- arch/x86/kvm/vmx/evmcs.h | 44 +++- arch/x86/kvm/vmx/nested.c | 60 +++-- arch/x86/kvm/vmx/vmcs12.c | 4 +- arch/x86/kvm/vmx/vmcs12.h | 6 +- arch/x86/kvm/x86.c | 10 +- arch/x86/pci/fixup.c | 4 +- block/bio.c | 3 +- block/blk-core.c | 25 +- block/blk-ia-ranges.c | 2 +- drivers/firmware/efi/efi.c | 7 + drivers/firmware/efi/libstub/arm64-stub.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 81 +++++++ drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 1 - .../gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 4 +- .../drm/amd/display/dc/dcn301/dcn301_resource.c | 11 + .../display/dc/dml/dcn20/display_rq_dlg_calc_20.c | 2 - .../dc/dml/dcn20/display_rq_dlg_calc_20v2.c | 2 - .../display/dc/dml/dcn21/display_rq_dlg_calc_21.c | 2 - .../display/dc/dml/dcn30/display_rq_dlg_calc_30.c | 2 - .../gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c | 2 +- .../gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.h | 2 +- .../drm/amd/display/dc/dml/display_mode_structs.h | 1 - .../amd/display/dc/dml/display_rq_dlg_helpers.c | 3 - .../amd/display/dc/dml/dml1_display_rq_dlg_calc.c | 4 - drivers/gpu/drm/ast/ast_tables.h | 2 - drivers/gpu/drm/drm_atomic.c | 12 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 4 +- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 11 +- drivers/gpu/drm/msm/dsi/dsi.c | 7 +- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 +- drivers/gpu/drm/msm/hdmi/hdmi.c | 7 +- drivers/gpu/drm/msm/msm_drv.c | 2 +- drivers/hv/hv_balloon.c | 7 + drivers/hwmon/adt7470.c | 3 + drivers/hwmon/lm90.c | 21 +- drivers/hwmon/nct6775.c | 6 +- drivers/irqchip/irq-realtek-rtl.c | 10 +- drivers/md/dm.c | 20 +- drivers/net/can/m_can/m_can.c | 6 + drivers/net/can/m_can/tcan4x5x-regmap.c | 2 +- drivers/net/ethernet/google/gve/gve.h | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 6 +- drivers/net/ethernet/google/gve/gve_rx.c | 3 +- drivers/net/ethernet/google/gve/gve_rx_dqo.c | 2 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 3 +- drivers/net/ethernet/ibm/ibmvnic.c | 133 +++++++---- drivers/net/ethernet/intel/i40e/i40e.h | 9 +- drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 44 ++-- drivers/net/ethernet/intel/i40e/i40e_register.h | 3 + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 103 ++++++++- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 1 + drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 2 + .../ethernet/marvell/octeontx2/af/lmac_common.h | 3 + drivers/net/ethernet/marvell/octeontx2/af/mbox.h | 1 + .../ethernet/marvell/octeontx2/af/npc_profile.h | 70 +++--- drivers/net/ethernet/marvell/octeontx2/af/rpm.c | 66 ++++-- drivers/net/ethernet/marvell/octeontx2/af/rpm.h | 4 + drivers/net/ethernet/marvell/octeontx2/af/rvu.c | 7 +- drivers/net/ethernet/marvell/octeontx2/af/rvu.h | 1 + .../net/ethernet/marvell/octeontx2/af/rvu_cgx.c | 14 +- .../ethernet/marvell/octeontx2/af/rvu_debugfs.c | 2 + .../net/ethernet/marvell/octeontx2/af/rvu_nix.c | 20 +- .../net/ethernet/marvell/octeontx2/af/rvu_npc.c | 22 +- .../net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c | 20 +- .../ethernet/marvell/octeontx2/nic/otx2_common.h | 1 + .../net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 7 +- .../net/ethernet/stmicro/stmmac/dwmac-visconti.c | 42 ++-- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 23 +- drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 3 - drivers/net/ethernet/ti/cpsw_priv.c | 2 +- drivers/net/hamradio/yam.c | 4 +- drivers/net/phy/broadcom.c | 1 + drivers/net/phy/phy_device.c | 6 +- drivers/net/phy/sfp-bus.c | 5 + drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 16 +- .../net/wireless/mediatek/mt76/mt76_connac_mcu.c | 47 ++-- .../net/wireless/mediatek/mt76/mt76_connac_mcu.h | 48 ++-- drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 24 +- .../net/wireless/mediatek/mt76/mt7921/testmode.c | 4 +- drivers/pci/controller/pcie-mt7621.c | 9 - drivers/remoteproc/Kconfig | 4 + drivers/remoteproc/qcom_q6v5.c | 1 + drivers/rpmsg/rpmsg_char.c | 22 +- drivers/s390/scsi/zfcp_fc.c | 13 +- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 20 +- drivers/scsi/elx/libefc/efc_els.c | 8 +- drivers/tty/n_gsm.c | 4 +- drivers/tty/rpmsg_tty.c | 40 ++-- drivers/tty/serial/8250/8250_of.c | 11 +- drivers/tty/serial/8250/8250_pci.c | 100 +++++++- drivers/tty/serial/amba-pl011.c | 8 +- drivers/tty/serial/stm32-usart.c | 2 +- drivers/usb/cdns3/drd.c | 6 +- drivers/usb/common/ulpi.c | 7 +- drivers/usb/core/hcd.c | 14 ++ drivers/usb/core/urb.c | 12 + drivers/usb/dwc3/dwc3-xilinx.c | 25 +- drivers/usb/gadget/function/f_sourcesink.c | 1 + drivers/usb/host/xhci-plat.c | 3 + drivers/usb/storage/unusual_devs.h | 10 + drivers/usb/typec/tcpm/tcpci.c | 26 +++ drivers/usb/typec/tcpm/tcpci.h | 1 + drivers/usb/typec/tcpm/tcpm.c | 7 +- drivers/usb/typec/ucsi/ucsi_ccg.c | 2 +- drivers/video/fbdev/hyperv_fb.c | 16 +- fs/btrfs/ioctl.c | 90 ++++++-- fs/ceph/caps.c | 55 +++-- fs/ceph/file.c | 9 + fs/configfs/dir.c | 6 +- fs/devpts/inode.c | 2 +- fs/io_uring.c | 7 +- fs/jbd2/journal.c | 2 + fs/namei.c | 10 +- fs/nfs/dir.c | 22 ++ fs/nfsd/nfsctl.c | 5 +- fs/ocfs2/suballoc.c | 25 +- fs/udf/inode.c | 9 +- include/linux/blkdev.h | 1 + include/linux/ethtool.h | 2 +- include/linux/fsnotify.h | 49 +++- include/linux/lsm_hook_defs.h | 2 +- include/linux/mm.h | 17 +- include/linux/netdevice.h | 1 + include/linux/perf_event.h | 15 +- include/linux/psi.h | 13 +- include/linux/psi_types.h | 3 - include/linux/usb/role.h | 6 + include/net/addrconf.h | 2 + include/net/ip.h | 21 +- include/net/ip6_fib.h | 2 +- include/net/route.h | 2 +- include/trace/events/sunrpc.h | 18 +- include/uapi/linux/cyclades.h | 35 +++ kernel/bpf/stackmap.c | 5 +- kernel/cgroup/cgroup.c | 11 +- kernel/events/core.c | 257 +++++++++++++-------- kernel/power/wakelock.c | 11 +- kernel/sched/fair.c | 16 +- kernel/sched/membarrier.c | 9 +- kernel/sched/pelt.h | 4 +- kernel/sched/psi.c | 145 ++++++------ kernel/trace/trace.c | 3 +- kernel/trace/trace_events_hist.c | 4 + kernel/ucount.c | 2 + net/bluetooth/hci_event.c | 10 +- net/bridge/br_vlan.c | 9 +- net/core/net-procfs.c | 38 ++- net/ipv4/ip_output.c | 26 ++- net/ipv4/ping.c | 3 +- net/ipv4/raw.c | 5 +- net/ipv6/addrconf.c | 27 ++- net/ipv6/ip6_fib.c | 23 +- net/ipv6/ip6_tunnel.c | 8 +- net/ipv6/route.c | 2 +- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 176 ++++++++------ net/mptcp/protocol.c | 3 +- net/mptcp/protocol.h | 12 +- net/netfilter/nf_conntrack_core.c | 8 +- net/packet/af_packet.c | 2 + net/rxrpc/call_event.c | 8 +- net/rxrpc/output.c | 2 +- net/sched/sch_htb.c | 20 ++ net/smc/af_smc.c | 63 ++++- net/sunrpc/rpc_pipe.c | 4 +- security/security.c | 15 +- tools/testing/scatterlist/linux/mm.h | 3 +- tools/testing/selftests/kvm/Makefile | 1 + tools/testing/selftests/kvm/x86_64/smm_test.c | 1 - tools/testing/selftests/net/mptcp/mptcp_join.sh | 10 +- usr/include/Makefile | 2 +- virt/kvm/kvm_main.c | 1 - 219 files changed, 2317 insertions(+), 1102 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/200 Bluetooth: refactor malicious adv data check
From: Brian Gix <[email protected]>
commit 899663be5e75dc0174dc8bda0b5e6826edf0b29a upstream.
Check for out-of-bound read was being performed at the end of while num_reports loop, and would fill journal with false positives. Added check to beginning of loop processing so that it doesn't get checked after ptr has been advanced.
--- net/bluetooth/hci_event.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
net/bluetooth/hci_event.c +5 -5
@@ -5822,6 +5822,11 @@ static void hci_le_adv_report_evt(structstruct hci_ev_le_advertising_info *ev = ptr;s8 rssi; +if (ptr > (void *)skb_tail_pointer (skb) -sizeof (*ev)) { +bt_dev_err (hdev,"Malicious advertising data." ); +break ; + } +if (ev->length <=HCI_MAX_AD_LENGTH && ev->data + ev->length <=skb_tail_pointer (skb)) { rssi = ev->data[ev->length];
@@ -5833,11 +5838,6 @@ static void hci_le_adv_report_evt(struct } ptr +=sizeof (*ev) + ev->length +1 ; - -if (ptr > (void *)skb_tail_pointer (skb) -sizeof (*ev)) { -bt_dev_err (hdev,"Malicious advertising data. Stopping processing" ); -break ; - } }hci_dev_unlock (hdev);
Greg Kroah-Hartman
maintainerPATCH 2/200 btrfs: fix too long loop when defragging a 1 byte file
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 6b34cd8e175bfbf4f3f01b6d19eae18245e1a8cc upstream.
When attempting to defrag a file with a single byte, we can end up in a too long loop, which is nearly infinite because at btrfs_defrag_file() we end up with the variable last_byte assigned with a value of 18446744073709551615 (which is (u64)-1). The problem comes from the fact we end up doing:
last_byte = round_up(last_byte, fs_info->sectorsize) - 1;
So if last_byte was assigned 0, which is i_size - 1, we underflow and end up with the value 18446744073709551615.
This is trivial to reproduce and the following script triggers it:
$ cat test.sh #!/bin/bash
DEV=/dev/sdj
MNT=/mnt/sdj
mkfs.btrfs -f $DEV
mount $DEV $MNT
echo -n "X" > $MNT/foobar
btrfs filesystem defragment $MNT/foobar
umount $MNT
So fix this by not decrementing last_byte by 1 before doing the sector size round up. Also, to make it easier to follow, make the round up right after computing last_byte.
--- fs/btrfs/ioctl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/btrfs/ioctl.c +6 -6
@@ -1492,12 +1492,16 @@ int btrfs_defrag_file(struct inode *inodif (range->start + range->len > range->start) {/* Got a specific range */ - last_byte =min (isize, range->start + range->len) -1 ; + last_byte =min (isize, range->start + range->len); }else {/* Defrag until file end */ - last_byte = isize -1 ; + last_byte = isize; } +/* Align the range */ + cur =round_down (range->start, fs_info->sectorsize); + last_byte =round_up (last_byte, fs_info->sectorsize) -1 ; +/* * If we were not given a ra, allocate a readahead context. As * readahead is just an optimization, defrag will work without it so
@@ -1510,10 +1514,6 @@ int btrfs_defrag_file(struct inode *inodfile_ra_state_init (ra, inode->i_mapping); } -/* Align the range */ - cur =round_down (range->start, fs_info->sectorsize); - last_byte =round_up (last_byte, fs_info->sectorsize) -1 ; -while (cur < last_byte) {u64 cluster_end;
Greg Kroah-Hartman
maintainerPATCH 3/200 btrfs: allow defrag to be interruptible
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit b767c2fc787e992daeadfff40d61c05f66c82da0 upstream.
During defrag, at btrfs_defrag_file(), we have this loop that iterates over a file range in steps no larger than 256K subranges. If the range is too long, there's no way to interrupt it. So make the loop check in each iteration if there's signal pending, and if there is, break and return -AGAIN to userspace.
Before kernel 5.16, we used to allow defrag to be cancelled through a signal, but that was lost with commit 7b508037d4cac3 ("btrfs: defrag:
use defrag_one_cluster() to implement btrfs_defrag_file()").
This change adds back the possibility to cancel a defrag with a signal and keeps the same semantics, returning -EAGAIN to user space (and not the usually more expected -EINTR).
This is also motivated by a recent bug on 5.16 where defragging a 1 byte file resulted in iterating from file range 0 to (u64)-1, as hitting the bug triggered a too long loop, basically requiring one to reboot the machine, as it was not possible to cancel defrag.
--- fs/btrfs/ioctl.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/btrfs/ioctl.c +5 -0
@@ -1520,6 +1520,11 @@ int btrfs_defrag_file(struct inode *inod/* The cluster size 256K should always be page aligned */ BUILD_BUG_ON (!IS_ALIGNED (CLUSTER_SIZE ,PAGE_SIZE )); +if (btrfs_defrag_cancelled (fs_info)) { + ret = -EAGAIN ; +break ; + } +/* We want the cluster end at page boundary when possible */ cluster_end = (((cur >>PAGE_SHIFT ) + (SZ_256K >>PAGE_SHIFT )) <<PAGE_SHIFT ) -1 ;
Greg Kroah-Hartman
maintainerPATCH 4/200 btrfs: defrag: fix wrong number of defragged sectors
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
commit 484167da77739a8d0e225008c48e697fd3f781ae upstream.
[BUG]
There are users using autodefrag mount option reporting obvious increase in IO:
Quoted 9 lines
If I compare the write average (in total, I don't have it per process) when taking idle periods on the same machine:
Linux 5.16:
without autodefrag: ~ 10KiB/s
with autodefrag: between 1 and 2MiB/s.Linux 5.15:
with autodefrag:~ 10KiB/s (around the same as without
autodefrag on 5.16)
[CAUSE]
When autodefrag mount option is enabled, btrfs_defrag_file() will be called with @max_sectors = BTRFS_DEFRAG_BATCH (1024) to limit how many sectors we can defrag in one try.
And then use the number of sectors defragged to determine if we need to re-defrag.
But commit b18c3ab2343d ("btrfs: defrag: introduce helper to defrag one cluster") uses wrong unit to increase @sectors_defragged, which should be in unit of sector, not byte.
This means, if we have defragged any sector, then @sectors_defragged will be >= sectorsize (normally 4096), which is larger than BTRFS_DEFRAG_BATCH.
This makes the @max_sectors check in defrag_one_cluster() to underflow, rendering the whole @max_sectors check useless.
Thus causing way more IO for autodefrag mount options, as now there is no limit on how many sectors can really be defragged.
[FIX]
Fix the problems by:
- Use sector as unit when increasing @sectors_defragged
- Include @sectors_defragged > @max_sectors case to break the loop
- Add extra comment on the return value of btrfs_defrag_file()
--- fs/btrfs/ioctl.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
fs/btrfs/ioctl.c +7 -3
@@ -1416,8 +1416,8 @@ static int defrag_one_cluster(struct btrlist_for_each_entry (entry, &target_list, list) {u32 range_len = entry->len; -/* Reached the limit */ -if (max_sectors && max_sectors == *sectors_defragged) +/* Reached or beyond the limit */ +if (max_sectors && *sectors_defragged >= max_sectors)break ;if (max_sectors)
@@ -1439,7 +1439,8 @@ static int defrag_one_cluster(struct btr extent_thresh, newer_than, do_compress);if (ret <0 )break ; - *sectors_defragged += range_len; + *sectors_defragged += range_len >> + inode->root->fs_info->sectorsize_bits; } out:list_for_each_entry_safe (entry, tmp, &target_list, list) {
@@ -1458,6 +1459,9 @@ out:* @newer_than: minimum transid to defrag * @max_to_defrag: max number of sectors to be defragged, if 0, the whole inode * will be defragged. +* +* Return <0 for error. +* Return >=0 for the number of sectors defragged. */ int btrfs_defrag_file(struct inode *inode, struct file_ra_state *ra, struct btrfs_ioctl_defrag_range_args *range,
Greg Kroah-Hartman
maintainerPATCH 5/200 btrfs: defrag: properly update range->start for autodefrag
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
commit c080b4144b9dd3b7af838a194ffad3204ca15166 upstream.
[BUG]
After commit 7b508037d4ca ("btrfs: defrag: use defrag_one_cluster() to implement btrfs_defrag_file()") autodefrag no longer properly re-defrag the file from previously finished location.
[CAUSE]
The recent refactoring of defrag only focuses on defrag ioctl subpage support, doesn't take autodefrag into consideration.
There are two problems involved which prevents autodefrag to restart its scan:
- No range.start update
Previously when one defrag target is found, range->start will be updated to indicate where next search should start from.
But now btrfs_defrag_file() doesn't update it anymore, making all autodefrag to rescan from file offset 0.
This would also make autodefrag to mark the same range dirty again and again, causing extra IO.
- No proper quick exit for defrag_one_cluster()
Currently if we reached or exceed @max_sectors limit, we just exit defrag_one_cluster(), and let next defrag_one_cluster() call to do a quick exit.
This makes @cur increase, thus no way to properly know which range is defragged and which range is skipped.
[FIX]
The fix involves two modifications:
- Update range->start to next cluster start
This is a little different from the old behavior. Previously range->start is updated to the next defrag target.
But in the end, the behavior should still be pretty much the same, as now we skip to next defrag target inside btrfs_defrag_file().
Thus if auto-defrag determines to re-scan, then we still do the skip, just at a different timing.
- Make defrag_one_cluster() to return >0 to indicate a quick exit So that btrfs_defrag_file() can also do a quick exit, without increasing @cur to the range end, and re-use @cur to update @range->start.
- Add comment for btrfs_defrag_file() to mention the range->start update Currently only autodefrag utilize this behavior, as defrag ioctl won't set @max_to_defrag parameter, thus unless interrupted it will always try to defrag the whole range.
--- fs/btrfs/ioctl.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
fs/btrfs/ioctl.c +16 -2
@@ -1417,8 +1417,10 @@ static int defrag_one_cluster(struct btru32 range_len = entry->len;/* Reached or beyond the limit */ -if (max_sectors && *sectors_defragged >= max_sectors) +if (max_sectors && *sectors_defragged >= max_sectors) { + ret =1 ;break ; + }if (max_sectors) range_len = min_t(u32, range_len,
@@ -1461,7 +1463,10 @@ out:* will be defragged. * * Return <0 for error. -* Return >=0 for the number of sectors defragged. +* Return >=0 for the number of sectors defragged, and range->start will be updated +* to indicate the file offset where next defrag should be started at. +* (Mostly for autodefrag, which sets @max_to_defrag thus we may exit early without +* defragging all the range). */ int btrfs_defrag_file(struct inode *inode, struct file_ra_state *ra, struct btrfs_ioctl_defrag_range_args *range,
@@ -1554,10 +1559,19 @@ int btrfs_defrag_file(struct inode *inodif (ret <0 )break ; cur = cluster_end +1 ; +if (ret >0 ) { + ret =0 ; +break ; + } }if (ra_allocated)kfree (ra); +/* +* Update range.start for autodefrag, this will indicate where to start +* in next run. +*/ + range->start = cur;if (sectors_defragged) {/* * We have defragged some sectors, for compression case they
Greg Kroah-Hartman
maintainerPATCH 6/200 btrfs: fix deadlock when reserving space during defrag
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 0cb5950f3f3b51a4e8657d106f897f2b913e0586 upstream.
When defragging we can end up collecting a range for defrag that has already pages under delalloc (dirty), as long as the respective extent map for their range is not mapped to a hole, a prealloc extent or the extent map is from an old generation.
Most of the time that is harmless from a functional perspective at least, however it can result in a deadlock:
1) At defrag_collect_targets() we find an extent map that meets all requirements but there's delalloc for the range it covers, and we add its range to list of ranges to defrag;
2) The defrag_collect_targets() function is called at defrag_one_range(), after it locked a range that overlaps the range of the extent map;
3) At defrag_one_range(), while the range is still locked, we call defrag_one_locked_target() for the range associated to the extent map we collected at step 1);
4) Then finally at defrag_one_locked_target() we do a call to btrfs_delalloc_reserve_space(), which will reserve data and metadata space. If the space reservations can not be satisfied right away, the flusher might be kicked in and start flushing delalloc and wait for the respective ordered extents to complete. If this happens we will deadlock, because both flushing delalloc and finishing an ordered extent, requires locking the range in the inode's io tree, which was already locked at defrag_collect_targets().
So fix this by skipping extent maps for which there's already delalloc.
--- fs/btrfs/ioctl.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)
fs/btrfs/ioctl.c +30 -1
@@ -1188,6 +1188,35 @@ static int defrag_collect_targets(struct goto next;/* +* Our start offset might be in the middle of an existing extent +* map, so take that into account. +*/ + range_len = em->len - (cur - em->start); +/* +* If this range of the extent map is already flagged for delalloc, +* skip it, because: +* +* 1) We could deadlock later, when trying to reserve space for +* delalloc, because in case we can't immediately reserve space +* the flusher can start delalloc and wait for the respective +* ordered extents to complete. The deadlock would happen +* because we do the space reservation while holding the range +* locked, and starting writeback, or finishing an ordered +* extent, requires locking the range; +* +* 2) If there's delalloc there, it means there's dirty pages for +* which writeback has not started yet (we clean the delalloc +* flag when starting writeback and after creating an ordered +* extent). If we mark pages in an adjacent range for defrag, +* then we will have a larger contiguous range for delalloc, +* very likely resulting in a larger extent after writeback is +* triggered (except in a case of free space fragmentation). +*/ +if (test_range_bit (&inode->io_tree, cur, cur + range_len -1 , +EXTENT_DELALLOC ,0 ,NULL )) + goto next; + +/* * For do_compress case, we want to compress all valid file * extents, thus no @extent_thresh or mergeable check. */
@@ -1195,7 +1224,7 @@ static int defrag_collect_targets(struct goto add;/* Skip too large extent */ -if (em->len >= extent_thresh) +if (range_len >= extent_thresh) goto next; next_mergeable = defrag_check_next_extent(&inode->vfs_inode, em,
Greg Kroah-Hartman
maintainerPATCH 7/200 btrfs: add back missing dirty page rate limiting to defrag
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 3c9d31c715948aaff0ee6d322a91a2dec07770bf upstream.
A defrag operation can dirty a lot of pages, specially if operating on the entire file or a large file range. Any task dirtying pages should periodically call balance_dirty_pages_ratelimited(), as stated in that function's comments, otherwise they can leave too many dirty pages in the system. This is what we did before the refactoring in 5.16, and it should have remained, just like in the buffered write path and relocation. So restore that behaviour.
--- fs/btrfs/ioctl.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/btrfs/ioctl.c +5 -0
@@ -1553,6 +1553,7 @@ int btrfs_defrag_file(struct inode *inod }while (cur < last_byte) { +const unsigned long prev_sectors_defragged = sectors_defragged;u64 cluster_end;/* The cluster size 256K should always be page aligned */
@@ -1584,6 +1585,10 @@ int btrfs_defrag_file(struct inode *inod cluster_end +1 - cur, extent_thresh, newer_than, do_compress, §ors_defragged, max_to_defrag); + +if (sectors_defragged > prev_sectors_defragged) +balance_dirty_pages_ratelimited (inode->i_mapping); +btrfs_inode_unlock (inode,0 );if (ret <0 )break ;
Greg Kroah-Hartman
maintainerPATCH 8/200 btrfs: update writeback index when starting defrag
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 27cdfde181bcacd226c230b2fd831f6f5b8c215f upstream.
When starting a defrag, we should update the writeback index of the inode's mapping in case it currently has a value beyond the start of the range we are defragging. This can help performance and often result in getting less extents after writeback - for e.g., if the current value of the writeback index sits somewhere in the middle of a range that gets dirty by the defrag, then after writeback we can get two smaller extents instead of a single, larger extent.
We used to have this before the refactoring in 5.16, but it was removed without any reason to do so. Originally it was added in kernel 3.1, by commit 2a0f7f5769992b ("Btrfs: fix recursive auto-defrag"), in order to fix a loop with autodefrag resulting in dirtying and writing pages over and over, but some testing on current code did not show that happening, at least with the test described in that commit.
So add back the behaviour, as at the very least it is a nice to have optimization.
--- fs/btrfs/ioctl.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/btrfs/ioctl.c +9 -0
@@ -1511,6 +1511,7 @@ int btrfs_defrag_file(struct inode *inodint compress_type =BTRFS_COMPRESS_ZLIB ;int ret =0 ;u32 extent_thresh = range->extent_thresh; +pgoff_t start_index;if (isize ==0 )return 0 ;
@@ -1552,6 +1553,14 @@ int btrfs_defrag_file(struct inode *inodfile_ra_state_init (ra, inode->i_mapping); } +/* +* Make writeback start from the beginning of the range, so that the +* defrag range can be written sequentially. +*/ + start_index = cur >>PAGE_SHIFT ; +if (start_index < inode->i_mapping->writeback_index) + inode->i_mapping->writeback_index = start_index; +while (cur < last_byte) {const unsigned long prev_sectors_defragged = sectors_defragged;u64 cluster_end;
Greg Kroah-Hartman
maintainerPATCH 9/200 can: m_can: m_can_fifo_{read,write}: dont read or write from/to FIFO if length is 0
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
commit db72589c49fd260bfc99c7160c079675bc7417af upstream.
In order to optimize FIFO access, especially on m_can cores attached to slow busses like SPI, in patch
| e39381770ec9 ("can: m_can: Disable IRQs on FIFO bus errors")
bulk read/write support has been added to the m_can_fifo_{read,write} functions.
That change leads to the tcan driver to call regmap_bulk_{read,write}() with a length of 0 (for CAN frames with 0 data length). regmap treats this as an error:
| tcan4x5x spi1.0 tcan4x5x0: FIFO write returned -22
This patch fixes the problem by not calling the cdev->ops->{read,write)_fifo() in case of a 0 length read/write.
--- drivers/net/can/m_can/m_can.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/can/m_can/m_can.c +6 -0
@@ -336,6 +336,9 @@ m_can_fifo_read(struct m_can_classdev *cu32 addr_offset = cdev->mcfg[MRAM_RXF0 ].off + fgi *RXF0_ELEMENT_SIZE + offset; +if (val_count ==0 ) +return 0 ; +return cdev->ops->read_fifo (cdev, addr_offset, val, val_count); }
@@ -346,6 +349,9 @@ m_can_fifo_write(struct m_can_classdev *u32 addr_offset = cdev->mcfg[MRAM_TXB ].off + fpi *TXB_ELEMENT_SIZE + offset; +if (val_count ==0 ) +return 0 ; +return cdev->ops->write_fifo (cdev, addr_offset, val, val_count); }
Re: [PATCH 5.16 009/200] can: m_can: m_can_fifo_{read,write}: dont read or write from/to FIFO if length is 0
There is no -22 error message now. Tested with "cansend can0 123#"
But now it floods continuous from __skb_queue_add_sort:
[ xxx.xxx] tcan4x5x spi0.0 can0: __skb_queue_add_sort: pos=0x000000, new=0x000000, diff= 0, queue_len=1
Only modprobe -r tcan4x5x or reboot helps
Hardware: RPI4 board with tcan4550 on spi0 Kernel 5.17.0-rc3-v7l+
from https://github.com/raspberrypi/linux/tree/rpi-5.17.y
Am 31.01.2022 um 11:54 schrieb Greg Kroah-Hartman:
Quoted 56 lines
From: Marc Kleine-Budde <[email protected]>
commit
db72589c49fd260bfc99c7160c079675bc7417afupstream.In order to optimize FIFO access, especially on
m_cancores attached to slow busses like SPI, in patch|
e39381770ec9("can:m_can: Disable IRQs on FIFO bus errors")bulk read/write support has been added to the m_can_fifo_{read,write} functions.
That change leads to the tcan driver to call regmap_bulk_{read,write}() with a length of 0 (for CAN frames with 0 data length). regmap treats this as an error:
| tcan4x5x spi1.0 tcan4x5x0: FIFO write returned -22
This patch fixes the problem by not calling the cdev->ops->{read,write)_fifo() in case of a 0 length read/write.
Fixes e39381770ec9 ("can: m_can: Disable IRQs on FIFO bus errors")Cc Matt Kline <[email protected]>Cc Chandrasekar Ramakrishnan <[email protected]>Reported-by Michael Anochin <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/net/can/m_can/m_can.c | 6 ++++++ 1 file changed, 6 insertions(+)drivers/net/can/m_can/m_can.c +6
-0@@ -336,6 +336,9 @@ m_can_fifo_read(struct m_can_classdev *cu32 addr_offset = cdev->mcfg[MRAM_RXF0 ].off + fgi *RXF0_ELEMENT_SIZE + offset; +if (val_count ==0 ) +return 0 ; +return cdev->ops->read_fifo (cdev, addr_offset, val, val_count); }@@ -346,6 +349,9 @@ m_can_fifo_write(struct m_can_classdev *u32 addr_offset = cdev->mcfg[MRAM_TXB ].off + fpi *TXB_ELEMENT_SIZE + offset; +if (val_count ==0 ) +return 0 ; +return cdev->ops->write_fifo (cdev, addr_offset, val, val_count); }
Greg Kroah-Hartman
maintainerPATCH 10/200 net: sfp: ignore disabled SFP node
In reply to Greg Kroah-HartmanFrom: Marek Behún <[email protected]>
commit 2148927e6ed43a1667baf7c2ae3e0e05a44b51a0 upstream.
Commit ce0aa27ff3f6 ("sfp: add sfp-bus to bridge between network devices and sfp cages") added code which finds SFP bus DT node even if the node is disabled with status = "disabled". Because of this, when phylink is created, it ends with non-null .sfp_bus member, even though the SFP module is not probed (because the node is disabled).
We need to ignore disabled SFP bus node.
--- drivers/net/phy/sfp-bus.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/phy/sfp-bus.c +5 -0
@@ -651,6 +651,11 @@ struct sfp_bus *sfp_bus_find_fwnode(struelse if (ret <0 )return ERR_PTR (ret); +if (!fwnode_device_is_available (ref.fwnode)) { +fwnode_handle_put (ref.fwnode); +return NULL ; + } + bus =sfp_bus_get (ref.fwnode);fwnode_handle_put (ref.fwnode);if (!bus)
Greg Kroah-Hartman
maintainerPATCH 11/200 net: stmmac: configure PTP clock source prior to PTP initialization
In reply to Greg Kroah-HartmanFrom: Mohammad Athari Bin Ismail <[email protected]>
commit 94c82de43e01ef5747a95e4a590880de863fe423 upstream.
For Intel platform, it is required to configure PTP clock source prior PTP initialization in MAC. So, need to move ptp_clk_freq_config execution from stmmac_ptp_register() to stmmac_init_ptp().
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 +++ drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -0
@@ -899,6 +899,9 @@ static int stmmac_init_ptp(struct stmmacbool xmac = priv->plat->has_gmac4 || priv->plat->has_xgmac;int ret; +if (priv->plat->ptp_clk_freq_config) + priv->plat->ptp_clk_freq_config (priv); + ret =stmmac_init_tstamp_counter (priv,STMMAC_HWTS_ACTIVE );if (ret)return ret;
drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +0 -3
@@ -297,9 +297,6 @@ void stmmac_ptp_register(struct stmmac_p {int i; -if (priv->plat->ptp_clk_freq_config) - priv->plat->ptp_clk_freq_config (priv); -for (i =0 ; i < priv->dma_cap.pps_out_num; i++) {if (i >=STMMAC_PPS_MAX )break ;
Greg Kroah-Hartman
maintainerPATCH 12/200 net: stmmac: skip only stmmac_ptp_register when resume from suspend
In reply to Greg Kroah-HartmanFrom: Mohammad Athari Bin Ismail <[email protected]>
commit 0735e639f129dff455aeb91da291f5c578cc33db upstream.
When resume from suspend, besides skipping PTP registration, it also skipping PTP HW initialization. This could cause PTP clock not able to operate properly when resume from suspend.
To fix this, only stmmac_ptp_register() is skipped when resume from suspend.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +9 -11
@@ -924,8 +924,6 @@ static int stmmac_init_ptp(struct stmmac priv->hwts_tx_en =0 ; priv->hwts_rx_en =0 ; -stmmac_ptp_register (priv); -return 0 ; }
@@ -3248,7 +3246,7 @@ static int stmmac_fpe_start_wq(struct st/** * stmmac_hw_setup - setup mac in a usable state. * @dev : pointer to the device structure. -* @init_ptp: initialize PTP if set +* @ptp_register: register PTP if set * Description: * this is the main function to setup the HW in a usable state because the * dma engine is reset, the core registers are configured (e.g. AXI,
@@ -3258,7 +3256,7 @@ static int stmmac_fpe_start_wq(struct st* 0 on success and an appropriate (-)ve integer as defined in errno.h * file on failure. */ -static int stmmac_hw_setup (struct net_device *dev,bool init_ptp) +static int stmmac_hw_setup (struct net_device *dev,bool ptp_register) {struct stmmac_priv *priv =netdev_priv (dev);u32 rx_cnt = priv->plat->rx_queues_to_use;
@@ -3315,13 +3313,13 @@ static int stmmac_hw_setup(struct net_destmmac_mmc_setup (priv); -if (init_ptp) { - ret =stmmac_init_ptp (priv); -if (ret == -EOPNOTSUPP ) -netdev_warn (priv->dev,"PTP not supported by HW\n" ); -else if (ret) -netdev_warn (priv->dev,"PTP init failed\n" ); - } + ret =stmmac_init_ptp (priv); +if (ret == -EOPNOTSUPP ) +netdev_warn (priv->dev,"PTP not supported by HW\n" ); +else if (ret) +netdev_warn (priv->dev,"PTP init failed\n" ); +else if (ptp_register) +stmmac_ptp_register (priv); priv->eee_tw_timer =STMMAC_DEFAULT_TWT_LS ;
Greg Kroah-Hartman
maintainerPATCH 13/200 ARM: 9179/1: uaccess: avoid alignment faults in copy_[from|to]_kernel_nofault
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit 15420269b02a63ed8c1841905d8b8b2403246004 upstream.
The helpers that are used to implement copy_from_kernel_nofault() and copy_to_kernel_nofault() cast a void* to a pointer to a wider type, which may result in alignment faults on ARM if the compiler decides to use double-word or multiple-word load/store instructions.
Only configurations that define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y are affected, given that commit 2423de2e6f4d ("ARM: 9115/1: mm/maccess:
fix unaligned copy_{from,to}_kernel_nofault") ensures that dst and src are sufficiently aligned otherwise.
So use the unaligned accessors for accessing dst and src in cases where they may be misaligned.
--- arch/arm/include/asm/uaccess.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/arm/include/asm/uaccess.h +8 -2
@@ -11,6 +11,7 @@#include <linux/string.h> #include <asm/memory.h> #include <asm/domain.h> +#include <asm/unaligned.h> #include <asm/unified.h> #include <asm/compiler.h>
@@ -497,7 +498,10 @@ do { \ } \default : __err =__get_user_bad ();break ; \ } \ - *(type *)(dst) = __val; \ +if (IS_ENABLED (CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS )) \ +put_unaligned (__val, (type *)(dst)); \ +else \ + *(type *)(dst) = __val;/* aligned by caller */ \if (__err) \ goto err_label; \ }while (0 )
@@ -507,7 +511,9 @@ do { \const type *__pk_ptr = (dst); \unsigned long __dst = (unsigned long )__pk_ptr; \int __err =0 ; \ -type __val = *(type *)src; \ +type __val =IS_ENABLED (CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) \ + ?get_unaligned ((type *)(src)) \ + : *(type *)(src);/* aligned by caller */ \switch (sizeof (type)) { \case 1 :__put_user_asm_byte (__val, __dst, __err,"" );break ; \case 2 :__put_user_asm_half (__val, __dst, __err,"" );break ; \
Greg Kroah-Hartman
maintainerPATCH 14/200 ARM: 9180/1: Thumb2: align ALT_UP() sections in modules sufficiently
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit 9f80ccda53b9417236945bc7ece4b519037df74d upstream.
When building for Thumb2, the .alt.smp.init sections that are emitted by the ALT_UP() patching code may not be 32-bit aligned, even though the fixup_smp_on_up() routine expects that. This results in alignment faults at module load time, which need to be fixed up by the fault handler.
So let's align those sections explicitly, and prevent this from occurring.
--- arch/arm/include/asm/assembler.h | 2 ++ arch/arm/include/asm/processor.h | 1 + 2 files changed, 3 insertions(+)
arch/arm/include/asm/assembler.h +2 -0
@@ -288,6 +288,7 @@*/ #define ALT_UP(instr...) \ .pushsection ".alt.smp.init", "a" ;\ + .align 2 ;\ .long 9998b - . ;\ 9997: instr ;\ .if . - 9997b == 2 ;\
@@ -299,6 +300,7 @@ .popsection#define ALT_UP_B (label) \ .pushsection ".alt.smp.init", "a" ;\ + .align 2 ;\ .long 9998b - . ;\ W(b) . + (label - 9998b) ;\ .popsection
arch/arm/include/asm/processor.h +1 -0
@@ -96,6 +96,7 @@ unsigned long __get_wchan(struct task_st#define __ALT_SMP_ASM (smp, up) \ "9998: " smp "\n" \ " .pushsection \".alt.smp.init\", \"a\"\n" \ + " .align 2\n" \ " .long 9998b - .\n" \ " " up "\n" \ " .popsection\n"
Greg Kroah-Hartman
maintainerPATCH 15/200 KVM: arm64: Use shadow SPSR_EL1 when injecting exceptions on !VHE
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 278583055a237270fac70518275ba877bf9e4013 upstream.
Injecting an exception into a guest with non-VHE is risky business. Instead of writing in the shadow register for the switch code to restore it, we override the CPU register instead. Which gets overriden a few instructions later by said restore code.
The result is that although the guest correctly gets the exception, it will return to the original context in some random state, depending on what was there the first place... Boo.
Fix the issue by writing to the shadow register. The original code is absolutely fine on VHE, as the state is already loaded, and writing to the shadow register in that case would actually be a bug.
--- arch/arm64/kvm/hyp/exception.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/arm64/kvm/hyp/exception.c +4 -1
@@ -38,7 +38,10 @@ static inline void __vcpu_write_sys_reg(static void __vcpu_write_spsr (struct kvm_vcpu *vcpu,u64 val) { -write_sysreg_el1 (val,SYS_SPSR ); +if (has_vhe ()) +write_sysreg_el1 (val,SYS_SPSR ); +else +__vcpu_sys_reg (vcpu,SPSR_EL1 ) = val; }static void __vcpu_write_spsr_abt (struct kvm_vcpu *vcpu,u64 val)
Greg Kroah-Hartman
maintainerPATCH 16/200 KVM: arm64: vgic-v3: Restrict SEIS workaround to known broken systems
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit d11a327ed95dbec756b99cbfef2a7fd85c9eeb09 upstream.
Contrary to what df652bcf1136 ("KVM: arm64: vgic-v3: Work around GICv3 locally generated SErrors") was asserting, there is at least one other system out there (Cavium ThunderX2) implementing SEIS, and not in an obviously broken way.
So instead of imposing the M1 workaround on an innocent bystander, let's limit it to the two known broken Apple implementations.
--- arch/arm64/kvm/hyp/vgic-v3-sr.c | 3 +++ arch/arm64/kvm/vgic/vgic-v3.c | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)
arch/arm64/kvm/hyp/vgic-v3-sr.c +3 -0
@@ -983,6 +983,9 @@ static void __vgic_v3_read_ctlr(struct k val = ((vtr >>29 ) &7 ) <<ICC_CTLR_EL1_PRI_BITS_SHIFT ;/* IDbits */ val |= ((vtr >>23 ) &7 ) <<ICC_CTLR_EL1_ID_BITS_SHIFT ; +/* SEIS */ +if (kvm_vgic_global_state.ich_vtr_el2 &ICH_VTR_SEIS_MASK ) + val |=BIT (ICC_CTLR_EL1_SEIS_SHIFT );/* A3V */ val |= ((vtr >>21 ) &1 ) <<ICC_CTLR_EL1_A3V_SHIFT ;/* EOImode */
arch/arm64/kvm/vgic/vgic-v3.c +15 -2
@@ -609,6 +609,18 @@ static int __init early_gicv4_enable(cha }early_param ("kvm-arm.vgic_v4_enable" , early_gicv4_enable); +static const struct midr_range broken_seis[] = { +MIDR_ALL_VERSIONS (MIDR_APPLE_M1_ICESTORM ), +MIDR_ALL_VERSIONS (MIDR_APPLE_M1_FIRESTORM ), + {}, +}; + +static bool vgic_v3_broken_seis (void ) +{ +return ((kvm_vgic_global_state.ich_vtr_el2 &ICH_VTR_SEIS_MASK ) && +is_midr_in_range_list (read_cpuid_id (), broken_seis)); +} +/** * vgic_v3_probe - probe for a VGICv3 compatible interrupt controller * @info: pointer to the GIC description
@@ -676,9 +688,10 @@ int vgic_v3_probe(const struct gic_kvm_i group1_trap = true; } -if (kvm_vgic_global_state.ich_vtr_el2 &ICH_VTR_SEIS_MASK ) { -kvm_info ("GICv3 with locally generated SEI\n" ); +if (vgic_v3_broken_seis ()) { +kvm_info ("GICv3 with broken locally generated SEI\n" ); + kvm_vgic_global_state.ich_vtr_el2 &= ~ICH_VTR_SEIS_MASK ; group0_trap = true; group1_trap = true;if (ich_vtr_el2 &ICH_VTR_TDS_MASK )
Greg Kroah-Hartman
maintainerPATCH 17/200 s390/module: fix loading modules with a lot of relocations
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
commit f3b7e73b2c6619884351a3a0a7468642f852b8a2 upstream.
If the size of the PLT entries generated by apply_rela() exceeds 64KiB, the first ones can no longer reach __jump_r1 with brc. Fix by using brcl. An alternative solution is to add a __jump_r1 copy after every 64KiB, however, the space savings are quite small and do not justify the additional complexity.
--- arch/s390/kernel/module.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-)
arch/s390/kernel/module.c +18 -19
@@ -33,7 +33,7 @@#define DEBUGP (fmt , ...)#endif -#define PLT_ENTRY_SIZE 20 +#define PLT_ENTRY_SIZE 22void *module_alloc (unsigned long size) {
@@ -341,27 +341,26 @@ static int apply_rela(Elf_Rela *rela, Elcase R_390_PLTOFF32 :/* 32 bit offset from GOT to PLT. */ case R_390_PLTOFF64 :/* 16 bit offset from GOT to PLT. */ if (info->plt_initialized ==0 ) { -unsigned int insn[5 ]; -unsigned int *ip = me->core_layout.base + - me->arch.plt_offset + - info->plt_offset; - - insn[0 ] =0x0d10e310 ;/* basr 1,0 */ - insn[1 ] =0x100a0004 ;/* lg 1,10(1) */ +unsigned char insn[PLT_ENTRY_SIZE ]; +char *plt_base; +char *ip; + + plt_base = me->core_layout.base + me->arch.plt_offset; + ip = plt_base + info->plt_offset; + *(int *)insn =0x0d10e310 ;/* basr 1,0 */ + *(int *)&insn[4 ] =0x100c0004 ;/* lg 1,12(1) */ if (IS_ENABLED (CONFIG_EXPOLINE ) && !nospec_disable) { -unsigned int *ij; - ij = me->core_layout.base + - me->arch.plt_offset + - me->arch.plt_size -PLT_ENTRY_SIZE ; - insn[2 ] =0xa7f40000 +/* j __jump_r1 */ - (unsigned int )(u16) - (((unsigned long ) ij -8 - - (unsigned long ) ip) /2 ); +char *jump_r1; + + jump_r1 = plt_base + me->arch.plt_size - +PLT_ENTRY_SIZE ; +/* brcl 0xf,__jump_r1 */ + *(short *)&insn[8 ] =0xc0f4 ; + *(int *)&insn[10 ] = (jump_r1 - (ip +8 )) /2 ; }else { - insn[2 ] =0x07f10000 ;/* br %r1 */ + *(int *)&insn[8 ] =0x07f10000 ;/* br %r1 */ } - insn[3 ] = (unsigned int ) (val >>32 ); - insn[4 ] = (unsigned int ) val; + *(long *)&insn[14 ] = val;write (ip, insn,sizeof (insn)); info->plt_initialized =1 ;
Greg Kroah-Hartman
maintainerPATCH 18/200 s390/hypfs: include z/VM guests with access control group set
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
commit 663d34c8df98740f1e90241e78e456d00b3c6cad upstream.
Currently if z/VM guest is allowed to retrieve hypervisor performance data globally for all guests (privilege class B) the query is formed in a way to include all guests but the group name is left empty. This leads to that z/VM guests which have access control group set not being included in the results (even local vm).
Change the query group identifier from empty to "any" to retrieve information about all guests from any groups (or without a group set).
--- arch/s390/hypfs/hypfs_vm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/s390/hypfs/hypfs_vm.c +4 -2
@@ -20,6 +20,7 @@static char local_guest[] =" " ;static char all_guests[] ="* " ; +static char *all_groups = all_guests;static char *guest_query;struct diag2fc_data {
@@ -62,10 +63,11 @@ static int diag2fc(int size, char* querymemcpy (parm_list.userid, query,NAME_LEN );ASCEBC (parm_list.userid,NAME_LEN ); - parm_list.addr = (unsigned long ) addr ; +memcpy (parm_list.aci_grp, all_groups,NAME_LEN ); +ASCEBC (parm_list.aci_grp,NAME_LEN ); + parm_list.addr = (unsigned long )addr; parm_list.size = size; parm_list.fmt =0x02 ; -memset (parm_list.aci_grp,0x40 ,NAME_LEN ); rc =-1 ;diag_stat_inc (DIAG_STAT_X2FC );
Greg Kroah-Hartman
maintainerPATCH 19/200 s390/nmi: handle guarded storage validity failures for KVM guests
In reply to Greg Kroah-HartmanFrom: Christian Borntraeger <[email protected]>
commit 1ea1d6a847d2b1d17fefd9196664b95f052a0775 upstream.
machine check validity bits reflect the state of the machine check. If a guest does not make use of guarded storage, the validity bit might be off. We can not use the host CR bit to decide if the validity bit must be on. So ignore "invalid" guarded storage controls for KVM guests in the host and rely on the machine check being forwarded to the guest. If no other errors happen from a host perspective everything is fine and no process must be killed and the host can continue to run.
--- arch/s390/kernel/nmi.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
arch/s390/kernel/nmi.c +14 -4
@@ -316,11 +316,21 @@ static int notrace s390_validate_registeif (cr2.gse) {if (!mci.gs) {/* -* Guarded storage register can't be restored and -* the current processes uses guarded storage. -* It has to be terminated. +* 2 cases: +* - machine check in kernel or userspace +* - machine check while running SIE (KVM guest) +* For kernel or userspace the userspace values of +* guarded storage control can not be recreated, the +* process must be terminated. +* For SIE the guest values of guarded storage can not +* be recreated. This is either due to a bug or due to +* GS being disabled in the guest. The guest will be +* notified by KVM code and the guests machine check +* handling must take care of this. The host values +* are saved by KVM and are not affected. */ - kill_task =1 ; +if (!test_cpu_flag (CIF_MCCK_GUEST )) + kill_task =1 ; }else {load_gs_cb ((struct gs_cb *)mcesa->guarded_storage_save_area); }
Greg Kroah-Hartman
maintainerPATCH 20/200 s390/nmi: handle vector validity failures for KVM guests
In reply to Greg Kroah-HartmanFrom: Christian Borntraeger <[email protected]>
commit f094a39c6ba168f2df1edfd1731cca377af5f442 upstream.
The machine check validity bit tells about the context. If a KVM guest was running the bit tells about the guest validity and the host state is not affected. As a guest can disable the guest validity this might result in unwanted host errors on machine checks.
--- arch/s390/kernel/nmi.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
arch/s390/kernel/nmi.c +8 -1
@@ -273,7 +273,14 @@ static int notrace s390_validate_registe/* Validate vector registers */ union ctlreg0 cr0; -if (!mci.vr) { +/* +* The vector validity must only be checked if not running a +* KVM guest. For KVM guests the machine check is forwarded by +* KVM and it is the responsibility of the guest to take +* appropriate actions. The host vector or FPU values have been +* saved by KVM and will be restored by KVM. +*/ +if (!mci.vr && !test_cpu_flag (CIF_MCCK_GUEST )) {/* * Vector registers can't be restored. If the kernel * currently uses vector registers the system is
Greg Kroah-Hartman
maintainerPATCH 21/200 bpf: Guard against accessing NULL pt_regs in bpf_get_task_stack()
In reply to Greg Kroah-HartmanFrom: Naveen N. Rao <[email protected]>
commit b992f01e66150fc5e90be4a96f5eb8e634c8249e upstream.
task_pt_regs() can return NULL on powerpc for kernel threads. This is then used in __bpf_get_stack() to check for user mode, resulting in a kernel oops. Guard against this by checking return value of task_pt_regs() before trying to obtain the call chain.
--- kernel/bpf/stackmap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/bpf/stackmap.c +3 -2
@@ -525,13 +525,14 @@ BPF_CALL_4(bpf_get_task_stack, struct ta u32, size, u64, flags) {struct pt_regs *regs; -long res; +long res = -EINVAL ;if (!try_get_task_stack (task))return -EFAULT ; regs =task_pt_regs (task); - res =__bpf_get_stack (regs, task,NULL , buf, size, flags); +if (regs) + res =__bpf_get_stack (regs, task,NULL , buf, size, flags);put_task_stack (task);return res;
Greg Kroah-Hartman
maintainerPATCH 22/200 powerpc32/bpf: Fix codegen for bpf-to-bpf calls
In reply to Greg Kroah-HartmanFrom: Naveen N. Rao <[email protected]>
commit fab07611fb2e6a15fac05c4583045ca5582fd826 upstream.
Pad instructions emitted for BPF_CALL so that the number of instructions generated does not change for different function addresses. This is especially important for calls to other bpf functions, whose address will only be known during extra pass.
--- arch/powerpc/net/bpf_jit_comp32.c | 3 +++ 1 file changed, 3 insertions(+)
arch/powerpc/net/bpf_jit_comp32.c +3 -0
@@ -191,6 +191,9 @@ void bpf_jit_emit_func_call_rel(u32 *imaif (image && rel <0x2000000 && rel >=-0x2000000 ) {PPC_BL_ABS (func); +EMIT (PPC_RAW_NOP ()); +EMIT (PPC_RAW_NOP ()); +EMIT (PPC_RAW_NOP ()); }else {/* Load function address into r0 */ EMIT (PPC_RAW_LIS (_R0,IMM_H (func)));
Greg Kroah-Hartman
maintainerPATCH 23/200 powerpc/bpf: Update ldimm64 instructions during extra pass
In reply to Greg Kroah-HartmanFrom: Naveen N. Rao <[email protected]>
commit f9320c49993ca3c0ec0f9a7026b313735306bb8b upstream.
These instructions are updated after the initial JIT, so redo codegen during the extra pass. Rename bpf_jit_fixup_subprog_calls() to clarify that this is more than just subprog calls.
--- arch/powerpc/net/bpf_jit_comp.c | 29 +++++++++++++++++++++++------ arch/powerpc/net/bpf_jit_comp32.c | 6 ++++++ arch/powerpc/net/bpf_jit_comp64.c | 7 ++++++- 3 files changed, 35 insertions(+), 7 deletions(-)
arch/powerpc/net/bpf_jit_comp.c +23 -6
@@ -23,15 +23,15 @@ static void bpf_jit_fill_ill_insns(voidmemset32 (area,BREAKPOINT_INSTRUCTION , size /4 ); } -/* Fix the branch target addresses for subprog calls */ -static int bpf_jit_fixup_subprog_calls (struct bpf_prog *fp,u32 *image, -struct codegen_context *ctx,u32 *addrs) +/* Fix updated addresses (for subprog calls, ldimm64, et al) during extra pass */ +static int bpf_jit_fixup_addresses (struct bpf_prog *fp,u32 *image, +struct codegen_context *ctx,u32 *addrs) {const struct bpf_insn *insn = fp->insnsi;bool func_addr_fixed;u64 func_addr;u32 tmp_idx; -int i, ret; +int i, j, ret;for (i =0 ; i < fp->len; i++) {/*
@@ -66,6 +66,23 @@ static int bpf_jit_fixup_subprog_calls(s* of the JITed sequence remains unchanged. */ ctx->idx = tmp_idx; + }else if (insn[i].code == (BPF_LD |BPF_IMM |BPF_DW )) { + tmp_idx = ctx->idx; + ctx->idx = addrs[i] /4 ; +#ifdef CONFIG_PPC32 +PPC_LI32 (ctx->b2p[insn[i].dst_reg] -1 , (u32 )insn[i +1 ].imm); +PPC_LI32 (ctx->b2p[insn[i].dst_reg], (u32 )insn[i].imm); +for (j = ctx->idx - addrs[i] /4 ; j <4 ; j++) +EMIT (PPC_RAW_NOP ()); +#else + func_addr = ((u64 )(u32 )insn[i].imm) | (((u64 )(u32 )insn[i +1 ].imm) <<32 ); +PPC_LI64 (b2p[insn[i].dst_reg], func_addr); +/* overwrite rest with nops */ +for (j = ctx->idx - addrs[i] /4 ; j <5 ; j++) +EMIT (PPC_RAW_NOP ()); +#endif + ctx->idx = tmp_idx; + i++; } }
@@ -193,13 +210,13 @@ skip_init_ctx:/* * Do not touch the prologue and epilogue as they will remain * unchanged. Only fix the branch target address for subprog -* calls in the body. +* calls in the body, and ldimm64 instructions. * * This does not change the offsets and lengths of the subprog * call instruction sequences and hence, the size of the JITed * image as well. */ -bpf_jit_fixup_subprog_calls (fp, code_base, &cgctx, addrs); +bpf_jit_fixup_addresses (fp, code_base, &cgctx, addrs);/* There is no need to perform the usual passes. */ goto skip_codegen_passes;
arch/powerpc/net/bpf_jit_comp32.c +6 -0
@@ -292,6 +292,8 @@ int bpf_jit_build_body(struct bpf_prog *bool func_addr_fixed;u64 func_addr;u32 true_cond; +u32 tmp_idx; +int j;/* * addrs[] maps a BPF bytecode address into a real offset from
@@ -839,8 +841,12 @@ int bpf_jit_build_body(struct bpf_prog ** 16 byte instruction that uses two 'struct bpf_insn' */ case BPF_LD |BPF_IMM |BPF_DW :/* dst = (u64) imm */ + tmp_idx = ctx->idx;PPC_LI32 (dst_reg_h, (u32 )insn[i +1 ].imm);PPC_LI32 (dst_reg, (u32 )insn[i].imm); +/* padding to allow full 4 instructions for later patching */ +for (j = ctx->idx - tmp_idx; j <4 ; j++) +EMIT (PPC_RAW_NOP ());/* Adjust for two bpf instructions */ addrs[++i] = ctx->idx *4 ;break ;
arch/powerpc/net/bpf_jit_comp64.c +6 -1
@@ -318,6 +318,7 @@ int bpf_jit_build_body(struct bpf_prog *u64 imm64;u32 true_cond;u32 tmp_idx; +int j;/* * addrs[] maps a BPF bytecode address into a real offset from
@@ -806,9 +807,13 @@ emit_clear:case BPF_LD |BPF_IMM |BPF_DW :/* dst = (u64) imm */ imm64 = ((u64 )(u32 ) insn[i].imm) | (((u64 )(u32 ) insn[i+1 ].imm) <<32 ); + tmp_idx = ctx->idx; +PPC_LI64 (dst_reg, imm64); +/* padding to allow full 5 instructions for later patching */ +for (j = ctx->idx - tmp_idx; j <5 ; j++) +EMIT (PPC_RAW_NOP ());/* Adjust for two bpf instructions */ addrs[++i] = ctx->idx *4 ; -PPC_LI64 (dst_reg, imm64);break ;/*
Greg Kroah-Hartman
maintainerPATCH 24/200 ucount: Make get_ucount a safe get_user replacement
In reply to Greg Kroah-HartmanFrom: Eric W. Biederman <[email protected]>
commit f9d87929d451d3e649699d0f1d74f71f77ad38f5 upstream.
When the ucount code was refactored to create get_ucount it was missed that some of the contexts in which a rlimit is kept elevated can be the only reference to the user/ucount in the system.
Ordinary ucount references exist in places that also have a reference to the user namspace, but in POSIX message queues, the SysV shm code, and the SIGPENDING code there is no independent user namespace reference.
Inspection of the the user_namespace show no instance of circular references between struct ucounts and the user_namespace. So hold a reference from struct ucount to i's user_namespace to resolve this problem.
--- kernel/ucount.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/ucount.c +2 -0
@@ -190,6 +190,7 @@ struct ucounts *alloc_ucounts(struct usekfree (new); }else {hlist_add_head (&new->node, hashent); +get_user_ns (new->ns);spin_unlock_irq (&ucounts_lock);return new; }
@@ -210,6 +211,7 @@ void put_ucounts(struct ucounts *ucountsif (atomic_dec_and_lock_irqsave (&ucounts->count, &ucounts_lock, flags)) {hlist_del_init (&ucounts->node);spin_unlock_irqrestore (&ucounts_lock, flags); +put_user_ns (ucounts->ns);kfree (ucounts); } }
Greg Kroah-Hartman
maintainerPATCH 25/200 scsi: zfcp: Fix failed recovery on gone remote port with non-NPIV FCP devices
In reply to Greg Kroah-HartmanFrom: Steffen Maier <[email protected]>
commit 8c9db6679be4348b8aae108e11d4be2f83976e30 upstream.
Suppose we have an environment with a number of non-NPIV FCP devices (virtual HBAs / FCP devices / zfcp "adapter"s) sharing the same physical FCP channel (HBA port) and its I_T nexus. Plus a number of storage target ports zoned to such shared channel. Now one target port logs out of the fabric causing an RSCN. Zfcp reacts with an ADISC ELS and subsequent port recovery depending on the ADISC result. This happens on all such FCP devices (in different Linux images) concurrently as they all receive a copy of this RSCN. In the following we look at one of those FCP devices.
Requests other than FSF_QTCB_FCP_CMND can be slow until they get a response.
Depending on which requests are affected by slow responses, there are different recovery outcomes. Here we want to fix failed recoveries on port or adapter level by avoiding recovery requests that can be slow.
We need the cached N_Port_ID for the remote port "link" test with ADISC. Just before sending the ADISC, we now intentionally forget the old cached N_Port_ID. The idea is that on receiving an RSCN for a port, we have to assume that any cached information about this port is stale. This forces a fresh new GID_PN [FC-GS] nameserver lookup on any subsequent recovery for the same port. Since we typically can still communicate with the nameserver efficiently, we now reach steady state quicker: Either the nameserver still does not know about the port so we stop recovery, or the nameserver already knows the port potentially with a new N_Port_ID and we can successfully and quickly perform open port recovery. For the one case, where ADISC returns successfully, we re-initialize port->d_id because that case does not involve any port recovery.
This also solves a problem if the storage WWPN quickly logs into the fabric again but with a different N_Port_ID. Such as on virtual WWPN takeover during target NPIV failover.
[https://www.redbooks.ibm.com/abstracts/redp5477.html] In that case the RSCN from the storage FDISC was ignored by zfcp and we could not successfully recover the failover. On some later failback on the storage, we could have been lucky if the virtual WWPN got the same old N_Port_ID from the SAN switch as we still had cached. Then the related RSCN triggered a successful port reopen recovery. However, there is no guarantee to get the same N_Port_ID on NPIV FDISC.
Even though NPIV-enabled FCP devices are not affected by this problem, this code change optimizes recovery time for gone remote ports as a side effect. The timely drop of cached N_Port_IDs prevents unnecessary slow open port attempts.
While the problem might have been in code before v2.6.32 commit 799b76d09aee ("[SCSI] zfcp: Decouple gid_pn requests from erp") this fix depends on the gid_pn_work introduced with that commit, so we mark it as culprit to satisfy fix dependencies.
Note: Point-to-point remote port is already handled separately and gets its N_Port_ID from the cached peer_d_id. So resetting port->d_id in general does not affect PtP.
--- drivers/s390/scsi/zfcp_fc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/s390/scsi/zfcp_fc.c +12 -1
@@ -521,6 +521,8 @@ static void zfcp_fc_adisc_handler(void * goto out; } +/* re-init to undo drop from zfcp_fc_adisc() */ + port->d_id =ntoh24 (adisc_resp->adisc_port_id);/* port is good, unblock rport without going through erp */ zfcp_scsi_schedule_rport_register (port); out:
@@ -534,6 +536,7 @@ static int zfcp_fc_adisc(struct zfcp_porstruct zfcp_fc_req *fc_req;struct zfcp_adapter *adapter = port->adapter;struct Scsi_Host *shost = adapter->scsi_host; +u32 d_id;int ret; fc_req =kmem_cache_zalloc (zfcp_fc_req_cache,GFP_ATOMIC );
@@ -558,7 +561,15 @@ static int zfcp_fc_adisc(struct zfcp_por fc_req->u.adisc.req.adisc_cmd =ELS_ADISC ;hton24 (fc_req->u.adisc.req.adisc_port_id,fc_host_port_id (shost)); - ret =zfcp_fsf_send_els (adapter, port->d_id, &fc_req->ct_els, + d_id = port->d_id;/* remember as destination for send els below */ +/* +* Force fresh GID_PN lookup on next port recovery. +* Must happen after request setup and before sending request, +* to prevent race with port->d_id re-init in zfcp_fc_adisc_handler(). +*/ + port->d_id =0 ; + + ret =zfcp_fsf_send_els (adapter, d_id, &fc_req->ct_els,ZFCP_FC_CTELS_TMO );if (ret)kmem_cache_free (zfcp_fc_req_cache, fc_req);
Greg Kroah-Hartman
maintainerPATCH 26/200 udf: Restore i_lenAlloc when inode expansion fails
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit ea8569194b43f0f01f0a84c689388542c7254a1f upstream.
When we fail to expand inode from inline format to a normal format, we restore inode to contain the original inline formatting but we forgot to set i_lenAlloc back. The mismatch between i_lenAlloc and i_size was then causing further problems such as warnings and lost data down the line.
--- fs/udf/inode.c | 1 + 1 file changed, 1 insertion(+)
fs/udf/inode.c +1 -0
@@ -317,6 +317,7 @@ int udf_expand_file_adinicb(struct inodeunlock_page (page); iinfo->i_alloc_type =ICBTAG_FLAG_AD_IN_ICB ; inode->i_data.a_ops = &udf_adinicb_aops; + iinfo->i_lenAlloc = inode->i_size;up_write (&iinfo->i_data_sem); }put_page (page);
Greg Kroah-Hartman
maintainerPATCH 27/200 udf: Fix NULL ptr deref when converting from inline format
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit 7fc3b7c2981bbd1047916ade327beccb90994eee upstream.
udf_expand_file_adinicb() calls directly ->writepage to write data expanded into a page. This however misses to setup inode for writeback properly and so we can crash on inode->i_wb dereference when submitting page for IO like:
BUG: kernel NULL pointer dereference, address: 0000000000000158 #PF: supervisor read access in kernel mode ... <TASK> __folio_start_writeback+0x2ac/0x350 __block_write_full_page+0x37d/0x490 udf_expand_file_adinicb+0x255/0x400 [udf] udf_file_write_iter+0xbe/0x1b0 [udf] new_sync_write+0x125/0x1c0 vfs_write+0x28e/0x400
Fix the problem by marking the page dirty and going through the standard writeback path to write the page. Strictly speaking we would not even have to write the page but we want to catch e.g. ENOSPC errors early.
--- fs/udf/inode.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
fs/udf/inode.c +3 -5
@@ -258,10 +258,6 @@ int udf_expand_file_adinicb(struct inodechar *kaddr;struct udf_inode_info *iinfo =UDF_I (inode);int err; -struct writeback_control udf_wbc = { - .sync_mode =WB_SYNC_NONE , - .nr_to_write =1 , - };WARN_ON_ONCE (!inode_is_locked (inode));if (!iinfo->i_lenAlloc) {
@@ -305,8 +301,10 @@ int udf_expand_file_adinicb(struct inode iinfo->i_alloc_type =ICBTAG_FLAG_AD_LONG ;/* from now on we have normal address_space methods */ inode->i_data.a_ops = &udf_aops; +set_page_dirty (page); +unlock_page (page);up_write (&iinfo->i_data_sem); - err = inode->i_data.a_ops->writepage (page, &udf_wbc); + err =filemap_fdatawrite (inode->i_mapping);if (err) {/* Restore everything back so that we don't lose data... */ lock_page (page);
Greg Kroah-Hartman
maintainerPATCH 28/200 efi: runtime: avoid EFIv2 runtime services on Apple x86 machines
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit f5390cd0b43c2e54c7cf5506c7da4a37c5cef746 upstream.
Aditya reports [0] that his recent MacbookPro crashes in the firmware when using the variable services at runtime. The culprit appears to be a call to QueryVariableInfo(), which we did not use to call on Apple x86 machines in the past as they only upgraded from EFI v1.10 to EFI v2.40 firmware fairly recently, and QueryVariableInfo() (along with UpdateCapsule() et al) was added in EFI v2.00.
The only runtime service introduced in EFI v2.00 that we actually use in Linux is QueryVariableInfo(), as the capsule based ones are optional, generally not used at runtime (all the LVFS/fwupd firmware update infrastructure uses helper EFI programs that invoke capsule update at boot time, not runtime), and not implemented by Apple machines in the first place. QueryVariableInfo() is used to 'safely' set variables, i.e., only when there is enough space. This prevents machines with buggy firmwares from corrupting their NVRAMs when they run out of space.
Given that Apple machines have been using EFI v1.10 services only for the longest time (the EFI v2.0 spec was released in 2006, and Linux support for the newly introduced runtime services was added in 2011, but the MacbookPro12,1 released in 2015 still claims to be EFI v1.10 only), let's avoid the EFI v2.0 ones on all Apple x86 machines.
[0] https://lore.kernel.org/all/[email protected]/
--- drivers/firmware/efi/efi.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/firmware/efi/efi.c +7 -0
@@ -722,6 +722,13 @@ void __init efi_systab_report_header(con systab_hdr->revision >>16 , systab_hdr->revision &0xffff , vendor); + +if (IS_ENABLED (CONFIG_X86_64 ) && + systab_hdr->revision >EFI_1_10_SYSTEM_TABLE_REVISION && + !strcmp (vendor,"Apple" )) { +pr_info ("Apple Mac detected, using EFI v1.10 runtime services only\n" ); + efi.runtime_version =EFI_1_10_SYSTEM_TABLE_REVISION ; + } }static __initdata char memory_type_name[][13 ] = {
Greg Kroah-Hartman
maintainerPATCH 29/200 PM: wakeup: simplify the output logic of pm_show_wakelocks()
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
commit c9d967b2ce40d71e968eb839f36c936b8a9cf1ea upstream.
The buffer handling in pm_show_wakelocks() is tricky, and hopefully correct. Ensure it really is correct by using sysfs_emit_at() which handles all of the tricky string handling logic in a PAGE_SIZE buffer for us automatically as this is a sysfs file being read from.
--- kernel/power/wakelock.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
kernel/power/wakelock.c +4 -7
@@ -39,23 +39,20 @@ ssize_t pm_show_wakelocks(char *buf, boo {struct rb_node *node;struct wakelock *wl; -char *str = buf; -char *end = buf +PAGE_SIZE ; +int len =0 ;mutex_lock (&wakelocks_lock);for (node =rb_first (&wakelocks_tree); node; node =rb_next (node)) { wl = rb_entry(node, struct wakelock, node);if (wl->ws->active == show_active) - str +=scnprintf (str, end - str,"%s " , wl->name); + len +=sysfs_emit_at (buf, len,"%s " , wl->name); } -if (str > buf) - str--; - str +=scnprintf (str, end - str,"\n" ); + len +=sysfs_emit_at (buf, len,"\n" );mutex_unlock (&wakelocks_lock); -return (str - buf); +return len; }#if CONFIG_PM_WAKELOCKS_LIMIT >0
Greg Kroah-Hartman
maintainerPATCH 30/200 tracing/histogram: Fix a potential memory leak for kstrdup()
In reply to Greg Kroah-HartmanFrom: Xiaoke Wang <[email protected]>
commit e629e7b525a179e29d53463d992bdee759c950fb upstream.
kfree() is missing on an error path to free the memory allocated by kstrdup():
p = param = kstrdup(data->params[i], GFP_KERNEL);
So it is better to free it via kfree(p).
--- kernel/trace/trace_events_hist.c | 1 + 1 file changed, 1 insertion(+)
kernel/trace/trace_events_hist.c +1 -0
@@ -3919,6 +3919,7 @@ static int trace_action_create(struct hi var_ref_idx =find_var_ref_idx (hist_data, var_ref);if (WARN_ON (var_ref_idx <0 )) { +kfree (p); ret = var_ref_idx; goto err; }
Greg Kroah-Hartman
maintainerPATCH 31/200 tracing: Propagate is_signed to expression
In reply to Greg Kroah-HartmanFrom: Tom Zanussi <[email protected]>
commit 097f1eefedeab528cecbd35586dfe293853ffb17 upstream.
During expression parsing, a new expression field is created which should inherit the properties of the operands, such as size and is_signed.
is_signed propagation was missing, causing spurious errors with signed operands. Add it in parse_expr() and parse_unary() to fix the problem.
--- kernel/trace/trace_events_hist.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/trace_events_hist.c +3 -0
@@ -2487,6 +2487,8 @@ static struct hist_field *parse_unary(st (HIST_FIELD_FL_TIMESTAMP |HIST_FIELD_FL_TIMESTAMP_USECS ); expr->fn = hist_field_unary_minus; expr->operands[0 ] = operand1; + expr->size = operand1->size; + expr->is_signed = operand1->is_signed; expr->operator =FIELD_OP_UNARY_MINUS ; expr->name =expr_str (expr,0 ); expr->type =kstrdup_const (operand1->type,GFP_KERNEL );
@@ -2703,6 +2705,7 @@ static struct hist_field *parse_expr(str/* The operand sizes should be the same, so just pick one */ expr->size = operand1->size; + expr->is_signed = operand1->is_signed; expr->operator = field_op; expr->type =kstrdup_const (operand1->type,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 32/200 tracing: Dont inc err_log entry count if entry allocation fails
In reply to Greg Kroah-HartmanFrom: Tom Zanussi <[email protected]>
commit 67ab5eb71b37b55f7c5522d080a1b42823351776 upstream.
tr->n_err_log_entries should only be increased if entry allocation succeeds.
Doing it when it fails won't cause any problems other than wasting an entry, but should be fixed anyway.
--- kernel/trace/trace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/trace/trace.c +2 -1
@@ -7734,7 +7734,8 @@ static struct tracing_log_err *get_traci err =kzalloc (sizeof (*err),GFP_KERNEL );if (!err) err =ERR_PTR (-ENOMEM ); - tr->n_err_log_entries++; +else + tr->n_err_log_entries++;return err; }
Greg Kroah-Hartman
maintainerPATCH 33/200 ceph: properly put ceph_string reference after async create attempt
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
commit 932a9b5870d38b87ba0a9923c804b1af7d3605b9 upstream.
The reference acquired by try_prep_async_create is currently leaked. Ensure we put it.
--- fs/ceph/file.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ceph/file.c +2 -0
@@ -746,8 +746,10 @@ retry:restore_deleg_ino (dir, req->r_deleg_ino);ceph_mdsc_put_request (req); try_async = false; +ceph_put_string (rcu_dereference_raw (lo.pool_ns)); goto retry; } +ceph_put_string (rcu_dereference_raw (lo.pool_ns)); goto out_req; } }
Greg Kroah-Hartman
maintainerPATCH 34/200 ceph: set pool_ns in new inode layout for async creates
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
commit 4584a768f22b7669cdebabc911543621ac661341 upstream.
Dan reported that he was unable to write to files that had been asynchronously created when the client's OSD caps are restricted to a particular namespace.
The issue is that the layout for the new inode is only partially being filled. Ensure that we populate the pool_ns_data and pool_ns_len in the iinfo before calling ceph_fill_inode.
Cc: [email protected]
URL: https://tracker.ceph.com/issues/54013
--- fs/ceph/file.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/ceph/file.c +7 -0
@@ -579,6 +579,7 @@ static int ceph_finish_async_create(strustruct ceph_inode_info *ci =ceph_inode (dir);struct inode *inode;struct timespec64 now; +struct ceph_string *pool_ns;struct ceph_mds_client *mdsc =ceph_sb_to_mdsc (dir->i_sb);struct ceph_vino vino = { .ino = req->r_deleg_ino, .snap =CEPH_NOSNAP };
@@ -628,6 +629,12 @@ static int ceph_finish_async_create(stru in.max_size =cpu_to_le64 (lo->stripe_unit);ceph_file_layout_to_legacy (lo, &in.layout); +/* lo is private, so pool_ns can't change */ + pool_ns =rcu_dereference_raw (lo->pool_ns); +if (pool_ns) { + iinfo.pool_ns_len = pool_ns->len; + iinfo.pool_ns_data = pool_ns->str; + }down_read (&mdsc->snap_rwsem); ret = ceph_fill_inode(inode, NULL, &iinfo, NULL, req->r_session,
Greg Kroah-Hartman
maintainerPATCH 35/200 fsnotify: invalidate dcache before IN_DELETE event
In reply to Greg Kroah-HartmanFrom: Amir Goldstein <[email protected]>
commit a37d9a17f099072fe4d3a9048b0321978707a918 upstream.
Apparently, there are some applications that use IN_DELETE event as an invalidation mechanism and expect that if they try to open a file with the name reported with the delete event, that it should not contain the content of the deleted file.
Commit 49246466a989 ("fsnotify: move fsnotify_nameremove() hook out of d_delete()") moved the fsnotify delete hook before d_delete() so fsnotify will have access to a positive dentry.
This allowed a race where opening the deleted file via cached dentry is now possible after receiving the IN_DELETE event.
To fix the regression, create a new hook fsnotify_delete() that takes the unlinked inode as an argument and use a helper d_delete_notify() to pin the inode, so we can pass it to fsnotify_delete() after d_delete().
Backporting hint: this regression is from v5.3. Although patch will apply with only trivial conflicts to v5.4 and v5.10, it won't build, because fsnotify_delete() implementation is different in each of those versions (see fsnotify_link()).
A follow up patch will fix the fsnotify_unlink/rmdir() calls in pseudo filesystem that do not need to call d_delete().
--- fs/btrfs/ioctl.c | 6 +---- fs/namei.c | 10 ++++----- include/linux/fsnotify.h | 49 +++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 50 insertions(+), 15 deletions(-)
fs/btrfs/ioctl.c +2 -4
@@ -3126,10 +3126,8 @@ static noinline int btrfs_ioctl_snap_desbtrfs_inode_lock (inode,0 ); err =btrfs_delete_subvolume (dir, dentry);btrfs_inode_unlock (inode,0 ); -if (!err) { -fsnotify_rmdir (dir, dentry); -d_delete (dentry); - } +if (!err) +d_delete_notify (dir, dentry); out_dput:dput (dentry);
fs/namei.c +5 -5
@@ -3973,13 +3973,12 @@ int vfs_rmdir(struct user_namespace *mnt dentry->d_inode->i_flags |=S_DEAD ;dont_mount (dentry);detach_mounts (dentry); -fsnotify_rmdir (dir, dentry); out:inode_unlock (dentry->d_inode);dput (dentry);if (!error) -d_delete (dentry); +d_delete_notify (dir, dentry);return error; }EXPORT_SYMBOL (vfs_rmdir);
@@ -4101,7 +4100,6 @@ int vfs_unlink(struct user_namespace *mnif (!error) {dont_mount (dentry);detach_mounts (dentry); -fsnotify_unlink (dir, dentry); } } }
@@ -4109,9 +4107,11 @@ out:inode_unlock (target);/* We don't d_delete() NFS sillyrenamed files--they still exist. */ -if (!error && !(dentry->d_flags &DCACHE_NFSFS_RENAMED )) { +if (!error && dentry->d_flags &DCACHE_NFSFS_RENAMED ) { +fsnotify_unlink (dir, dentry); + }else if (!error) {fsnotify_link_count (target); -d_delete (dentry); +d_delete_notify (dir, dentry); }return error;
include/linux/fsnotify.h +43 -6
69 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 36/200 fsnotify: fix fsnotify hooks in pseudo filesystems
In reply to Greg Kroah-HartmanFrom: Amir Goldstein <[email protected]>
commit 29044dae2e746949ad4b9cbdbfb248994d1dcdb4 upstream.
Commit 49246466a989 ("fsnotify: move fsnotify_nameremove() hook out of d_delete()") moved the fsnotify delete hook before d_delete() so fsnotify will have access to a positive dentry.
This allowed a race where opening the deleted file via cached dentry is now possible after receiving the IN_DELETE event.
To fix the regression in pseudo filesystems, convert d_delete() calls to d_drop() (see commit 46c46f8df9aa ("devpts_pty_kill(): don't bother with d_delete()") and move the fsnotify hook after d_drop().
Add a missing fsnotify_unlink() hook in nfsdfs that was found during the audit of fsnotify hooks in pseudo filesystems.
Note that the fsnotify hooks in simple_recursive_removal() follow d_invalidate(), so they require no change.
--- fs/configfs/dir.c | 6 +++--- fs/devpts/inode.c | 2 +- fs/nfsd/nfsctl.c | 5 +++-- net/sunrpc/rpc_pipe.c | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-)
fs/configfs/dir.c +3 -3
@@ -1780,8 +1780,8 @@ void configfs_unregister_group(struct coconfigfs_detach_group (&group->cg_item);d_inode (dentry)->i_flags |=S_DEAD ;dont_mount (dentry); +d_drop (dentry);fsnotify_rmdir (d_inode (parent), dentry); -d_delete (dentry);inode_unlock (d_inode (parent));dput (dentry);
@@ -1922,10 +1922,10 @@ void configfs_unregister_subsystem(strucconfigfs_detach_group (&group->cg_item);d_inode (dentry)->i_flags |=S_DEAD ;dont_mount (dentry); -fsnotify_rmdir (d_inode (root), dentry);inode_unlock (d_inode (dentry)); -d_delete (dentry); +d_drop (dentry); +fsnotify_rmdir (d_inode (root), dentry);inode_unlock (d_inode (root));
fs/devpts/inode.c +1 -1
@@ -621,8 +621,8 @@ void devpts_pty_kill(struct dentry *dent dentry->d_fsdata =NULL ;drop_nlink (dentry->d_inode); -fsnotify_unlink (d_inode (dentry->d_parent), dentry);d_drop (dentry); +fsnotify_unlink (d_inode (dentry->d_parent), dentry);dput (dentry);/* d_alloc_name() in devpts_pty_new() */ }
fs/nfsd/nfsctl.c +3 -2
@@ -1249,7 +1249,8 @@ static void nfsdfs_remove_file(struct inclear_ncl (d_inode (dentry));dget (dentry); ret =simple_unlink (dir, dentry); -d_delete (dentry); +d_drop (dentry); +fsnotify_unlink (dir, dentry);dput (dentry);WARN_ON_ONCE (ret); }
@@ -1340,8 +1341,8 @@ void nfsd_client_rmdir(struct dentry *dedget (dentry); ret =simple_rmdir (dir, dentry);WARN_ON_ONCE (ret); +d_drop (dentry);fsnotify_rmdir (dir, dentry); -d_delete (dentry);dput (dentry);inode_unlock (dir); }
net/sunrpc/rpc_pipe.c +2 -2
@@ -600,9 +600,9 @@ static int __rpc_rmdir(struct inode *dirdget (dentry); ret =simple_rmdir (dir, dentry); +d_drop (dentry);if (!ret)fsnotify_rmdir (dir, dentry); -d_delete (dentry);dput (dentry);return ret; }
@@ -613,9 +613,9 @@ static int __rpc_unlink(struct inode *didget (dentry); ret =simple_unlink (dir, dentry); +d_drop (dentry);if (!ret)fsnotify_unlink (dir, dentry); -d_delete (dentry);dput (dentry);return ret; }
Greg Kroah-Hartman
maintainerPATCH 37/200 Revert "KVM: SVM: avoid infinite loop on NPF from bad address"
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 31c25585695abdf03d6160aa6d829e855b256329 upstream.
Revert a completely broken check on an "invalid" RIP in SVM's workaround for the DecodeAssists SMAP errata. kvm_vcpu_gfn_to_memslot() obviously expects a gfn, i.e. operates in the guest physical address space, whereas RIP is a virtual (not even linear) address. The "fix" worked for the problematic KVM selftest because the test identity mapped RIP.
Fully revert the hack instead of trying to translate RIP to a GPA, as the non-SEV case is now handled earlier, and KVM cannot access guest page tables to translate RIP.
This reverts commit e72436bc3a5206f95bb384e741154166ddb3202e.
Message-Id: <[email protected]>
--- arch/x86/kvm/svm/svm.c | 7 ------- virt/kvm/kvm_main.c | 1 - 2 files changed, 8 deletions(-)
arch/x86/kvm/svm/svm.c +0 -7
@@ -4513,13 +4513,6 @@ static bool svm_can_emulate_instruction(if (likely (!insn || insn_len))return true; -/* -* If RIP is invalid, go ahead with emulation which will cause an -* internal error exit. -*/ -if (!kvm_vcpu_gfn_to_memslot (vcpu,kvm_rip_read (vcpu) >>PAGE_SHIFT )) -return true; - cr4 =kvm_read_cr4 (vcpu); smep = cr4 &X86_CR4_SMEP ; smap = cr4 &X86_CR4_SMAP ;
virt/kvm/kvm_main.c +0 -1
@@ -2112,7 +2112,6 @@ struct kvm_memory_slot *kvm_vcpu_gfn_to_return NULL ; } -EXPORT_SYMBOL_GPL (kvm_vcpu_gfn_to_memslot);bool kvm_is_visible_gfn (struct kvm *kvm,gfn_t gfn) {
Greg Kroah-Hartman
maintainerPATCH 38/200 psi: Fix uaf issue when psi trigger is destroyed while being polled
In reply to Greg Kroah-HartmanFrom: Suren Baghdasaryan <[email protected]>
commit a06247c6804f1a7c86a2e5398a4c1f1db1471848 upstream.
With write operation on psi files replacing old trigger with a new one, the lifetime of its waitqueue is totally arbitrary. Overwriting an existing trigger causes its waitqueue to be freed and pending poll() will stumble on trigger->event_wait which was destroyed.
Fix this by disallowing to redefine an existing psi trigger. If a write operation is used on a file descriptor with an already existing psi trigger, the operation will fail with EBUSY error.
Also bypass a check for psi_disabled in the psi_trigger_destroy as the flag can be flipped after the trigger is created, leading to a memory leak.
--- Documentation/accounting/psi.rst | 3 + include/linux/psi.h | 2 - include/linux/psi_types.h | 3 - kernel/cgroup/cgroup.c | 11 ++++-- kernel/sched/psi.c | 66 +++++++++++++++++---------------------- 5 files changed, 40 insertions(+), 45 deletions(-)
Documentation/accounting/psi.rst +2 -1
@@ -92,7 +92,8 @@ Triggers can be set on more than one psi for the same psi metric can be specified. However for each trigger a separate file descriptor is required to be able to poll it separately from others, therefore for each trigger a separate open() syscall should be made even -when opening the same psi interface file. +when opening the same psi interface file. Write operations to a file descriptor +with an already existing psi trigger will fail with EBUSY. Monitors activate only when system enters stall state for the monitored psi metric and deactivates upon exit from the stall state. While system is
include/linux/psi.h +1 -1
@@ -32,7 +32,7 @@ void cgroup_move_task(struct task_structstruct psi_trigger *psi_trigger_create (struct psi_group *group,char *buf,size_t nbytes,enum psi_res res); -void psi_trigger_replace (void **trigger_ptr,struct psi_trigger *t); +void psi_trigger_destroy (struct psi_trigger *t);__poll_t psi_trigger_poll (void **trigger_ptr,struct file *file,poll_table *wait);
include/linux/psi_types.h +0 -3
@@ -140,9 +140,6 @@ struct psi_trigger {* events to one per window */ u64 last_event_time; - -/* Refcounting to prevent premature destruction */ -struct kref refcount; };struct psi_group {
kernel/cgroup/cgroup.c +8 -3
@@ -3642,6 +3642,12 @@ static ssize_t cgroup_pressure_write(strcgroup_get (cgrp);cgroup_kn_unlock (of->kn); +/* Allow only one trigger per file descriptor */ +if (ctx->psi.trigger) { +cgroup_put (cgrp); +return -EBUSY ; + } + psi =cgroup_ino (cgrp) ==1 ? &psi_system : &cgrp->psi; new =psi_trigger_create (psi, buf, nbytes, res);if (IS_ERR (new)) {
@@ -3649,8 +3655,7 @@ static ssize_t cgroup_pressure_write(strreturn PTR_ERR (new); } -psi_trigger_replace (&ctx->psi.trigger, new); - +smp_store_release (&ctx->psi.trigger, new);cgroup_put (cgrp);return nbytes;
@@ -3689,7 +3694,7 @@ static void cgroup_pressure_release(stru {struct cgroup_file_ctx *ctx = of->priv; -psi_trigger_replace (&ctx->psi.trigger,NULL ); +psi_trigger_destroy (ctx->psi.trigger); }bool cgroup_psi_enabled (void )
kernel/sched/psi.c +29 -37
123 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 39/200 powerpc/audit: Fix syscall_get_arch()
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit 252745240ba0ae774d2f80c5e185ed59fbc4fb41 upstream.
Commit 770cec16cdc9 ("powerpc/audit: Simplify syscall_get_arch()") and commit 898a1ef06ad4 ("powerpc/audit: Avoid unneccessary #ifdef in syscall_get_arguments()")
replaced test_tsk_thread_flag(task, TIF_32BIT)) by is_32bit_task().
But is_32bit_task() applies on current task while be want the test done on task 'task'
So add a new macro is_tsk_32bit_task() to check any task.
--- arch/powerpc/include/asm/syscall.h | 4 ++-- arch/powerpc/include/asm/thread_info.h | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/syscall.h +2 -2
@@ -90,7 +90,7 @@ static inline void syscall_get_argumentsunsigned long val, mask =-1UL ;unsigned int n =6 ; -if (is_32bit_task ()) +if (is_tsk_32bit_task (task)) mask =0xffffffff ;while (n--) {
@@ -105,7 +105,7 @@ static inline void syscall_get_argumentsstatic inline int syscall_get_arch (struct task_struct *task) { -if (is_32bit_task ()) +if (is_tsk_32bit_task (task))return AUDIT_ARCH_PPC ;else if (IS_ENABLED (CONFIG_CPU_LITTLE_ENDIAN ))return AUDIT_ARCH_PPC64LE ;
arch/powerpc/include/asm/thread_info.h +2 -0
@@ -168,8 +168,10 @@ static inline bool test_thread_local_fla#ifdef CONFIG_COMPAT #define is_32bit_task () (test_thread_flag(TIF_32BIT)) +#define is_tsk_32bit_task (tsk) (test_tsk_thread_flag(tsk, TIF_32BIT))#else #define is_32bit_task () (IS_ENABLED(CONFIG_PPC32)) +#define is_tsk_32bit_task (tsk) (IS_ENABLED(CONFIG_PPC32))#endif #if defined(CONFIG_PPC64 )
Greg Kroah-Hartman
maintainerPATCH 40/200 perf/x86/intel/uncore: Fix CAS_COUNT_WRITE issue for ICX
In reply to Greg Kroah-HartmanFrom: Zhengjun Xing <[email protected]>
commit 96fd2e89fba1aaada6f4b1e5d25a9d9ecbe1943d upstream.
The user recently report a perf issue in the ICX platform, when test by perf event “uncore_imc_x/cas_count_write”,the write bandwidth is always very small (only 0.38MB/s), it is caused by the wrong "umask" for the "cas_count_write" event. When double-checking, find "cas_count_read" also is wrong.
The public document for ICX uncore:
3rd Gen Intel® Xeon® Processor Scalable Family, Codename Ice Lake,Uncore Performance Monitoring Reference Manual, Revision 1.00, May 2021
On 2.4.7, it defines Unit Masks for CAS_COUNT:
RD b00001111
WR b00110000
So corrected both "cas_count_read" and "cas_count_write" for ICX.
Old settings:
hswep_uncore_imc_events
INTEL_UNCORE_EVENT_DESC(cas_count_read, "event=0x04,umask=0x03") INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x0c")
New settings:
snr_uncore_imc_events
INTEL_UNCORE_EVENT_DESC(cas_count_read, "event=0x04,umask=0x0f") INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x30")
--- arch/x86/events/intel/uncore_snbep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/events/intel/uncore_snbep.c +1 -1
@@ -5482,7 +5482,7 @@ static struct intel_uncore_type icx_unco .fixed_ctr_bits = 48, .fixed_ctr = SNR_IMC_MMIO_PMON_FIXED_CTR, .fixed_ctl = SNR_IMC_MMIO_PMON_FIXED_CTL, - .event_descs = hswep_uncore_imc_events, + .event_descs = snr_uncore_imc_events, .perf_ctr = SNR_IMC_MMIO_PMON_CTR0, .event_ctl = SNR_IMC_MMIO_PMON_CTL0, .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
Greg Kroah-Hartman
maintainerPATCH 41/200 perf/x86/intel: Add a quirk for the calculation of the number of counters on Alder Lake
In reply to Greg Kroah-HartmanFrom: Kan Liang <[email protected]>
commit 7fa981cad216e9f64f49e22112f610c0bfed91bc upstream.
For some Alder Lake machine with all E-cores disabled in a BIOS, the below warning may be triggered.
[ 2.010766] hw perf events fixed 5 > max(4), clipping!
Current perf code relies on the CPUID leaf 0xA and leaf 7.EDX[15] to calculate the number of the counters and follow the below assumption.
For a hybrid configuration, the leaf 7.EDX[15] (X86_FEATURE_HYBRID_CPU) is set. The leaf 0xA only enumerate the common counters. Linux perf has to manually add the extra GP counters and fixed counters for P-cores. For a non-hybrid configuration, the X86_FEATURE_HYBRID_CPU should not be set. The leaf 0xA enumerates all counters.
However, that's not the case when all E-cores are disabled in a BIOS. Although there are only P-cores in the system, the leaf 7.EDX[15] (X86_FEATURE_HYBRID_CPU) is still set. But the leaf 0xA is updated to enumerate all counters of P-cores. The inconsistency triggers the warning.
Several software ways were considered to handle the inconsistency.
- Drop the leaf 0xA and leaf 7.EDX[15] CPUID enumeration support. Hardcode the number of counters. This solution may be a problem for virtualization. A hypervisor cannot control the number of counters in a Linux guest via changing the guest CPUID enumeration anymore.
- Find another CPUID bit that is also updated with E-cores disabled. There may be a problem in the virtualization environment too. Because a hypervisor may disable the feature/CPUID bit.
- The P-cores have a maximum of 8 GP counters and 4 fixed counters on ADL. The maximum number can be used to detect the case. This solution is implemented in this patch.
--- arch/x86/events/intel/core.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
arch/x86/events/intel/core.c +13 -0
@@ -6242,6 +6242,19 @@ __init int intel_pmu_init(void) pmu->num_counters = x86_pmu.num_counters; pmu->num_counters_fixed = x86_pmu.num_counters_fixed; } + +/* +* Quirk: For some Alder Lake machine, when all E-cores are disabled in +* a BIOS, the leaf 0xA will enumerate all counters of P-cores. However, +* the X86_FEATURE_HYBRID_CPU is still set. The above codes will +* mistakenly add extra counters for P-cores. Correct the number of +* counters here. +*/ +if ((pmu->num_counters >8 ) || (pmu->num_counters_fixed >4 )) { + pmu->num_counters = x86_pmu.num_counters; + pmu->num_counters_fixed = x86_pmu.num_counters_fixed; + } + pmu->max_pebs_events =min_t (unsigned,MAX_PEBS_EVENTS , pmu->num_counters); pmu->unconstrained = (struct event_constraint ) __EVENT_CONSTRAINT(0, (1ULL << pmu->num_counters) - 1,
Greg Kroah-Hartman
maintainerPATCH 42/200 drm/etnaviv: relax submit size limits
In reply to Greg Kroah-HartmanFrom: Lucas Stach <[email protected]>
commit e3d26528e083e612314d4dcd713f3d5a26143ddc upstream.
While all userspace tried to limit commandstreams to 64K in size, a bug in the Mesa driver lead to command streams of up to 128K being submitted. Allow those to avoid breaking existing userspace.
--- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +2 -2
@@ -469,8 +469,8 @@ int etnaviv_ioctl_gem_submit(struct drm_return -EINVAL ; } -if (args->stream_size >SZ_64K || args->nr_relocs >SZ_64K || - args->nr_bos >SZ_64K || args->nr_pmrs >128 ) { +if (args->stream_size >SZ_128K || args->nr_relocs >SZ_128K || + args->nr_bos >SZ_128K || args->nr_pmrs >128 ) {DRM_ERROR ("submit arguments out of size limits\n" );return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 43/200 drm/atomic: Add the crtc to affected crtc only if uapi.enable = true
In reply to Greg Kroah-HartmanFrom: Manasi Navare <[email protected]>
commit 5ec1cebd59300ddd26dbaa96c17c508764eef911 upstream.
In case of a modeset where a mode gets split across multiple CRTCs in the driver specific implementation (bigjoiner in i915) we wrongly count the affected CRTCs based on the drm_crtc_mask and indicate the stolen CRTC as an affected CRTC in atomic_check_only().
This triggers a warning since affected CRTCs doent match requested CRTC.
To fix this in such bigjoiner configurations, we should only increment affected crtcs if that CRTC is enabled in UAPI not if it is just used internally in the driver to split the mode.
v3: Add the same uapi crtc_state->enable check in requested crtc calc (Ville)
--- drivers/gpu/drm/drm_atomic.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/drm_atomic.c +8 -4
@@ -1310,8 +1310,10 @@ int drm_atomic_check_only(struct drm_atoDRM_DEBUG_ATOMIC ("checking %p\n" , state); -for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) - requested_crtc |=drm_crtc_mask (crtc); +for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) { +if (new_crtc_state->enable) + requested_crtc |=drm_crtc_mask (crtc); + }for_each_oldnew_plane_in_state (state, plane, old_plane_state, new_plane_state, i) { ret =drm_atomic_plane_check (old_plane_state, new_plane_state);
@@ -1360,8 +1362,10 @@ int drm_atomic_check_only(struct drm_ato } } -for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) - affected_crtc |=drm_crtc_mask (crtc); +for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) { +if (new_crtc_state->enable) + affected_crtc |=drm_crtc_mask (crtc); + }/* * For commits that allow modesets drivers can add other CRTCs to the
Greg Kroah-Hartman
maintainerPATCH 44/200 drm/amdgpu: filter out radeon secondary ids as well
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
commit 9e5a14bce2402e84251a10269df0235cd7ce9234 upstream.
Older radeon boards (r2xx-r5xx) had secondary PCI functions which we solely there for supporting multi-head on OSs with special requirements. Add them to the unsupported list as well so we don't attempt to bind to them. The driver would fail to bind to them anyway, but this does so in a cleaner way that should not confuse the user.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 81 ++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +81 -0
@@ -1523,6 +1523,87 @@ static const u16 amdgpu_unsupported_pcii0x99A0 ,0x99A2 ,0x99A4 , +/* radeon secondary ids */ +0x3171 , +0x3e70 , +0x4164 , +0x4165 , +0x4166 , +0x4168 , +0x4170 , +0x4171 , +0x4172 , +0x4173 , +0x496e , +0x4a69 , +0x4a6a , +0x4a6b , +0x4a70 , +0x4a74 , +0x4b69 , +0x4b6b , +0x4b6c , +0x4c6e , +0x4e64 , +0x4e65 , +0x4e66 , +0x4e67 , +0x4e68 , +0x4e69 , +0x4e6a , +0x4e71 , +0x4f73 , +0x5569 , +0x556b , +0x556d , +0x556f , +0x5571 , +0x5854 , +0x5874 , +0x5940 , +0x5941 , +0x5b72 , +0x5b73 , +0x5b74 , +0x5b75 , +0x5d44 , +0x5d45 , +0x5d6d , +0x5d6f , +0x5d72 , +0x5d77 , +0x5e6b , +0x5e6d , +0x7120 , +0x7124 , +0x7129 , +0x712e , +0x712f , +0x7162 , +0x7163 , +0x7166 , +0x7167 , +0x7172 , +0x7173 , +0x71a0 , +0x71a1 , +0x71a3 , +0x71a7 , +0x71bb , +0x71e0 , +0x71e1 , +0x71e2 , +0x71e6 , +0x71e7 , +0x71f2 , +0x7269 , +0x726b , +0x726e , +0x72a0 , +0x72a8 , +0x72b1 , +0x72b3 , + 0x793f, }; static const struct pci_device_id pciidlist[] = {
Greg Kroah-Hartman
maintainerPATCH 45/200 drm/amdgpu/display: Remove t_srx_delay_us.
In reply to Greg Kroah-HartmanFrom: Bas Nieuwenhuizen <[email protected]>
commit 2a807341ed1074ab83638f2fab08dffaa373f6b8 upstream.
Unused. Convert the divisions into asserts on the divisor, to debug why it is zero. The divide by zero is suspected of causing kernel panics.
While I have no idea where the zero is coming from I think this patch is a positive either way.
--- drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 1 - drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c | 2 -- drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c | 2 -- drivers/gpu/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c | 2 -- drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c | 2 -- drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h | 1 - drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_helpers.c | 3 --- drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c | 4 ---- 8 files changed, 17 deletions(-)
drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c +0 -1
@@ -503,7 +503,6 @@ static void dcn_bw_calc_rq_dlg_ttu(//input[in_idx].dout.output_standard; /*todo: soc->sr_enter_plus_exit_time??*/ - dlg_sys_param->t_srx_delay_us = dc->dcn_ip->dcfclk_cstate_latency / v->dcf_clk_deep_sleep;dml1_rq_dlg_get_rq_params (dml, rq_param, &input->pipe.src);dml1_extract_rq_regs (dml, rq_regs, rq_param);
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c +0 -2
@@ -1576,8 +1576,6 @@ void dml20_rq_dlg_get_dlg_reg(struct dis dlg_sys_param.total_flip_bytes =get_total_immediate_flip_bytes (mode_lib, e2e_pipe_param, num_pipes); - dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency - / dlg_sys_param.deepsleep_dcfclk_mhz;// TODO: Deprecated print__dlg_sys_params_st (mode_lib, &dlg_sys_param);
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c +0 -2
@@ -1577,8 +1577,6 @@ void dml20v2_rq_dlg_get_dlg_reg(struct d dlg_sys_param.total_flip_bytes =get_total_immediate_flip_bytes (mode_lib, e2e_pipe_param, num_pipes); - dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency - / dlg_sys_param.deepsleep_dcfclk_mhz;// TODO: Deprecated print__dlg_sys_params_st (mode_lib, &dlg_sys_param);
drivers/gpu/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c +0 -2
@@ -1688,8 +1688,6 @@ void dml21_rq_dlg_get_dlg_reg( mode_lib, e2e_pipe_param, num_pipes); - dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency - / dlg_sys_param.deepsleep_dcfclk_mhz;// TODO: Deprecated print__dlg_sys_params_st (mode_lib, &dlg_sys_param);
drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c +0 -2
@@ -1858,8 +1858,6 @@ void dml30_rq_dlg_get_dlg_reg(struct dis dlg_sys_param.total_flip_bytes =get_total_immediate_flip_bytes (mode_lib, e2e_pipe_param, num_pipes); - dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency - / dlg_sys_param.deepsleep_dcfclk_mhz;// TODO: Deprecated print__dlg_sys_params_st (mode_lib, &dlg_sys_param);
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h +0 -1
@@ -546,7 +546,6 @@ struct _vcs_dpi_display_dlg_sys_params_sdouble t_sr_wm_us;double t_extra_us;double mem_trip_us; -double t_srx_delay_us;double deepsleep_dcfclk_mhz;double total_flip_bw;unsigned int total_flip_bytes;
drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_helpers.c +0 -3
@@ -142,9 +142,6 @@ void print__dlg_sys_params_st(struct disdml_print ("DML_RQ_DLG_CALC: t_sr_wm_us = %3.2f\n" , dlg_sys_param->t_sr_wm_us);dml_print ("DML_RQ_DLG_CALC: t_extra_us = %3.2f\n" , dlg_sys_param->t_extra_us);dml_print ( -"DML_RQ_DLG_CALC: t_srx_delay_us = %3.2f\n" , - dlg_sys_param->t_srx_delay_us); -dml_print ("DML_RQ_DLG_CALC: deepsleep_dcfclk_mhz = %3.2f\n" , dlg_sys_param->deepsleep_dcfclk_mhz); dml_print(
drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c +0 -4
@@ -1331,10 +1331,6 @@ void dml1_rq_dlg_get_dlg_params(if (dual_plane)DTRACE ("DLG: %s: swath_height_c = %d" , __func__, swath_height_c); -DTRACE ( -"DLG: %s: t_srx_delay_us = %3.2f" , - __func__, - (double ) dlg_sys_param->t_srx_delay_us);DTRACE ("DLG: %s: line_time_in_us = %3.2f" , __func__, (double ) line_time_in_us);DTRACE ("DLG: %s: vupdate_offset = %d" , __func__, vupdate_offset);DTRACE ("DLG: %s: vupdate_width = %d" , __func__, vupdate_width);
Greg Kroah-Hartman
maintainerPATCH 46/200 drm/amd/display: Fix FP start/end for dcn30_internal_validate_bw.
In reply to Greg Kroah-HartmanFrom: Bas Nieuwenhuizen <[email protected]>
commit 72a8d87b87270bff0c0b2fed4d59c48d0dd840d7 upstream.
It calls populate_dml_pipes which uses doubles to initialize the scale_ratio_depth params. Mirrors the dcn20 logic.
--- drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c +2 -2
@@ -1880,7 +1880,6 @@ noinline bool dcn30_internal_validate_bw dc->res_pool->funcs->update_soc_for_wm_a (dc, context); pipe_cnt = dc->res_pool->funcs->populate_dml_pipes (dc, context, pipes, fast_validate); -DC_FP_START ();if (!pipe_cnt) { out = true; goto validate_out;
@@ -2106,7 +2105,6 @@ validate_fail: out = false; validate_out: -DC_FP_END ();return out; }
@@ -2308,7 +2306,9 @@ bool dcn30_validate_bandwidth(struct dcBW_VAL_TRACE_COUNT (); +DC_FP_START (); out =dcn30_internal_validate_bw (dc, context, pipes, &pipe_cnt, &vlevel, fast_validate); +DC_FP_END ();if (pipe_cnt ==0 ) goto validate_out;
Greg Kroah-Hartman
maintainerPATCH 47/200 drm/amd/display: Wrap dcn301_calculate_wm_and_dlg for FPU.
In reply to Greg Kroah-HartmanFrom: Bas Nieuwenhuizen <[email protected]>
commit 25f1488bdbba63415239ff301fe61a8546140d9f upstream.
Mirrors the logic for dcn30. Cue lots of WARNs and some kernel panics without this fix.
--- drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c | 11 +++++++++++ drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c | 2 +- drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.h | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c +11 -0
@@ -1391,6 +1391,17 @@ static void set_wm_ranges( pp_smu->nv_funcs.set_wm_ranges (&pp_smu->nv_funcs.pp_smu, &ranges); } +static void dcn301_calculate_wm_and_dlg ( +struct dc *dc,struct dc_state *context, +display_e2e_pipe_params_st *pipes, +int pipe_cnt, +int vlevel) +{ +DC_FP_START (); +dcn301_calculate_wm_and_dlg_fp (dc, context, pipes, pipe_cnt, vlevel); +DC_FP_END (); +} +static struct resource_funcs dcn301_res_pool_funcs = { .destroy = dcn301_destroy_resource_pool, .link_enc_create = dcn301_link_encoder_create,
drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c +1 -1
@@ -327,7 +327,7 @@ void dcn301_fpu_init_soc_bounding_box(st dcn3_01_soc.sr_exit_time_us = bb_info.dram_sr_exit_latency_100ns *10 ; } -void dcn301_calculate_wm_and_dlg(struct dc *dc, +void dcn301_calculate_wm_and_dlg_fp(struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes, int pipe_cnt,
drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.h +1 -1
@@ -34,7 +34,7 @@ void dcn301_fpu_set_wm_ranges(int i,void dcn301_fpu_init_soc_bounding_box (struct bp_soc_bb_info bb_info); -void dcn301_calculate_wm_and_dlg(struct dc *dc, +void dcn301_calculate_wm_and_dlg_fp(struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes, int pipe_cnt,
Greg Kroah-Hartman
maintainerPATCH 48/200 KVM: LAPIC: Also cancel preemption timer during SET_LAPIC
In reply to Greg Kroah-HartmanFrom: Wanpeng Li <[email protected]>
commit 35fe7cfbab2e81f1afb23fc4212210b1de6d9633 upstream.
The below warning is splatting during guest reboot.
------------[ cut here ]------------ WARNING: CPU: 0 PID: 1931 at arch/x86/kvm/x86.c:10322 kvm_arch_vcpu_ioctl_run+0x874/0x880 [kvm] CPU: 0 PID: 1931 Comm: qemu-system-x86 Tainted: G I 5.17.0-rc1+ #5 RIP: 0010:kvm_arch_vcpu_ioctl_run+0x874/0x880 [kvm] Call Trace: <TASK> kvm_vcpu_ioctl+0x279/0x710 [kvm] __x64_sys_ioctl+0x83/0xb0 do_syscall_64+0x3b/0xc0 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7fd39797350b
This can be triggered by not exposing tsc-deadline mode and doing a reboot in the guest. The lapic_shutdown() function which is called in sys_reboot path will not disarm the flying timer, it just masks LVTT. lapic_shutdown() clears APIC state w/ LVT_MASKED and timer-mode bit is 0, this can trigger timer-mode switch between tsc-deadline and oneshot/periodic, which can result in preemption timer be cancelled in apic_update_lvtt(). However, We can't depend on this when not exposing tsc-deadline mode and oneshot/periodic modes emulated by preemption timer. Qemu will synchronise states around reset, let's cancel preemption timer under KVM_SET_LAPIC.
Message-Id: <[email protected]>
--- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/lapic.c +1 -1
@@ -2623,7 +2623,7 @@ int kvm_apic_set_state(struct kvm_vcpu *kvm_apic_set_version (vcpu);apic_update_ppr (apic); -hrtimer_cancel (&apic->lapic_timer.timer); +cancel_apic_timer (apic); apic->lapic_timer.expired_tscdeadline =0 ;apic_update_lvtt (apic);apic_manage_nmi_watchdog (apic,kvm_lapic_get_reg (apic,APIC_LVT0 ));
Greg Kroah-Hartman
maintainerPATCH 49/200 KVM: SVM: Never reject emulation due to SMAP errata for !SEV guests
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 55467fcd55b89c622e62b4afe60ac0eb2fae91f2 upstream.
Always signal that emulation is possible for !SEV guests regardless of whether or not the CPU provided a valid instruction byte stream. KVM can read all guest state (memory and registers) for !SEV guests, i.e. can fetch the code stream from memory even if the CPU failed to do so because of the SMAP errata.
Message-Id: <[email protected]>
--- arch/x86/kvm/svm/svm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
arch/x86/kvm/svm/svm.c +6 -4
@@ -4464,8 +4464,13 @@ static bool svm_can_emulate_instruction(bool smep, smap, is_user;unsigned long cr4; +/* Emulation is always possible when KVM has access to all guest state. */ +if (!sev_guest (vcpu->kvm)) +return true; +/* -* When the guest is an SEV-ES guest, emulation is not possible. +* Emulation is impossible for SEV-ES guests as KVM doesn't have access +* to guest register state. */ if (sev_es_guest (vcpu->kvm))return false;
@@ -4518,9 +4523,6 @@ static bool svm_can_emulate_instruction( smap = cr4 &X86_CR4_SMAP ; is_user =svm_get_cpl (vcpu) ==3 ;if (smap && (!smep || is_user)) { -if (!sev_guest (vcpu->kvm)) -return true; -pr_err_ratelimited ("KVM: SEV Guest triggered AMD Erratum 1096\n" );kvm_make_request (KVM_REQ_TRIPLE_FAULT , vcpu); }
Greg Kroah-Hartman
maintainerPATCH 50/200 KVM: SVM: Dont intercept #GP for SEV guests
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 0b0be065b7563ac708aaa9f69dd4941c80b3446d upstream.
Never intercept #GP for SEV guests as reading SEV guest private memory will return cyphertext, i.e. emulating on #GP can't work as intended.
Message-Id: <[email protected]>
--- arch/x86/kvm/svm/svm.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
arch/x86/kvm/svm/svm.c +8 -3
@@ -312,7 +312,11 @@ int svm_set_efer(struct kvm_vcpu *vcpu,return ret; } -if (svm_gp_erratum_intercept) +/* +* Never intercept #GP for SEV guests, KVM can't +* decrypt guest memory to workaround the erratum. +*/ +if (svm_gp_erratum_intercept && !sev_guest (vcpu->kvm))set_exception_intercept (svm,GP_VECTOR ); } }
@@ -1238,9 +1242,10 @@ static void init_vmcb(struct kvm_vcpu *v* Guest access to VMware backdoor ports could legitimately * trigger #GP because of TSS I/O permission bitmap. * We intercept those #GP and allow access to them anyway -* as VMware does. +* as VMware does. Don't intercept #GP for SEV guests as KVM can't +* decrypt guest memory to decode the faulting instruction. */ -if (enable_vmware_backdoor) +if (enable_vmware_backdoor && !sev_guest (vcpu->kvm))set_exception_intercept (svm,GP_VECTOR );svm_set_intercept (svm,INTERCEPT_INTR );
Greg Kroah-Hartman
maintainerPATCH 51/200 KVM: x86: nSVM: skip eax alignment check for non-SVM instructions
In reply to Greg Kroah-HartmanFrom: Denis Valeev <[email protected]>
commit 47c28d436f409f5b009dc82bd82d4971088aa391 upstream.
The bug occurs on #GP triggered by VMware backdoor when eax value is unaligned. eax alignment check should not be applied to non-SVM instructions because it leads to incorrect omission of the instructions emulation.
Apply the alignment check only to SVM instructions to fix.
Message-Id: <Yexlhaoe1Fscm59u@q>
--- arch/x86/kvm/svm/svm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
arch/x86/kvm/svm/svm.c +6 -5
@@ -2306,10 +2306,6 @@ static int gp_interception(struct kvm_vcif (error_code) goto reinject; -/* All SVM instructions expect page aligned RAX */ -if (svm->vmcb->save.rax & ~PAGE_MASK ) - goto reinject; -/* Decode the instruction for usage later */ if (x86_decode_emulated_instruction (vcpu,0 ,NULL ,0 ) !=EMULATION_OK ) goto reinject;
@@ -2327,8 +2323,13 @@ static int gp_interception(struct kvm_vcif (!is_guest_mode (vcpu))return kvm_emulate_instruction (vcpu,EMULTYPE_VMWARE_GP |EMULTYPE_NO_DECODE ); - }else + }else { +/* All SVM instructions expect page aligned RAX */ +if (svm->vmcb->save.rax & ~PAGE_MASK ) + goto reinject; +return emulate_svm_instr (vcpu, opcode); + } reinject:kvm_queue_exception_e (vcpu,GP_VECTOR , error_code);
Greg Kroah-Hartman
maintainerPATCH 52/200 KVM: x86: Move CPUID.(EAX=0x12,ECX=1) mangling to __kvm_update_cpuid_runtime()
In reply to Greg Kroah-HartmanFrom: Vitaly Kuznetsov <[email protected]>
commit 5c89be1dd5cfb697614bc13626ba3bd0781aa160 upstream.
Full equality check of CPUID data on update (kvm_cpuid_check_equal()) may fail for SGX enabled CPUs as CPUID.(EAX=0x12,ECX=1) is currently being mangled in kvm_vcpu_after_set_cpuid(). Move it to __kvm_update_cpuid_runtime() and split off cpuid_get_supported_xcr0() helper as 'vcpu->arch.guest_supported_xcr0' update needs (logically) to stay in kvm_vcpu_after_set_cpuid().
Message-Id: <[email protected]>
--- arch/x86/kvm/cpuid.c | 54 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 21 deletions(-)
arch/x86/kvm/cpuid.c +33 -21
@@ -176,10 +176,26 @@ void kvm_update_pv_runtime(struct kvm_vc vcpu->arch.pv_cpuid.features = best->eax; } +/* +* Calculate guest's supported XCR0 taking into account guest CPUID data and +* supported_xcr0 (comprised of host configuration and KVM_SUPPORTED_XCR0). +*/ +static u64 cpuid_get_supported_xcr0 (struct kvm_cpuid_entry2 *entries,int nent) +{ +struct kvm_cpuid_entry2 *best; + + best =cpuid_entry2_find (entries, nent,0xd ,0 ); +if (!best) +return 0 ; + +return (best->eax | ((u64 )best->edx <<32 )) & supported_xcr0; +} +static void __kvm_update_cpuid_runtime (struct kvm_vcpu *vcpu,struct kvm_cpuid_entry2 *entries,int nent) {struct kvm_cpuid_entry2 *best; +u64 guest_supported_xcr0 =cpuid_get_supported_xcr0 (entries, nent); best =cpuid_entry2_find (entries, nent,1 ,0 );if (best) {
@@ -218,6 +234,21 @@ static void __kvm_update_cpuid_runtime(s vcpu->arch.ia32_misc_enable_msr & MSR_IA32_MISC_ENABLE_MWAIT); } + +/* +* Bits 127:0 of the allowed SECS.ATTRIBUTES (CPUID.0x12.0x1) enumerate +* the supported XSAVE Feature Request Mask (XFRM), i.e. the enclave's +* requested XCR0 value. The enclave's XFRM must be a subset of XCRO +* at the time of EENTER, thus adjust the allowed XFRM by the guest's +* supported XCR0. Similar to XCR0 handling, FP and SSE are forced to +* '1' even on CPUs that don't support XSAVE. +*/ + best =cpuid_entry2_find (entries, nent,0x12 ,0x1 ); +if (best) { + best->ecx &= guest_supported_xcr0 &0xffffffff ; + best->edx &= guest_supported_xcr0 >>32 ; + best->ecx |=XFEATURE_MASK_FPSSE ; + } }void kvm_update_cpuid_runtime (struct kvm_vcpu *vcpu)
@@ -241,27 +272,8 @@ static void kvm_vcpu_after_set_cpuid(strkvm_apic_set_version (vcpu); } - best =kvm_find_cpuid_entry (vcpu,0xD ,0 ); -if (!best) - vcpu->arch.guest_supported_xcr0 =0 ; -else - vcpu->arch.guest_supported_xcr0 = - (best->eax | ((u64 )best->edx <<32 )) & supported_xcr0; - -/* -* Bits 127:0 of the allowed SECS.ATTRIBUTES (CPUID.0x12.0x1) enumerate -* the supported XSAVE Feature Request Mask (XFRM), i.e. the enclave's -* requested XCR0 value. The enclave's XFRM must be a subset of XCRO -* at the time of EENTER, thus adjust the allowed XFRM by the guest's -* supported XCR0. Similar to XCR0 handling, FP and SSE are forced to -* '1' even on CPUs that don't support XSAVE. -*/ - best =kvm_find_cpuid_entry (vcpu,0x12 ,0x1 ); -if (best) { - best->ecx &= vcpu->arch.guest_supported_xcr0 &0xffffffff ; - best->edx &= vcpu->arch.guest_supported_xcr0 >>32 ; - best->ecx |=XFEATURE_MASK_FPSSE ; - } + vcpu->arch.guest_supported_xcr0 = +cpuid_get_supported_xcr0 (vcpu->arch.cpuid_entries, vcpu->arch.cpuid_nent);kvm_update_pv_runtime (vcpu);
Greg Kroah-Hartman
maintainerPATCH 53/200 KVM: x86: Free kvm_cpuid_entry2 array on post-KVM_RUN KVM_SET_CPUID{,2}
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 811f95ff95270e6048197821434d9301e3d7f07c upstream.
Free the "struct kvm_cpuid_entry2" array on successful post-KVM_RUN KVM_SET_CPUID{,2} to fix a memory leak, the callers of kvm_set_cpuid() free the array only on failure.
BUG: memory leak
unreferenced object 0xffff88810963a800 (size 2048):
comm "syz-executor025", pid 3610, jiffies 4294944928 (age 8.080s)
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 ................
47 65 6e 75 6e 74 65 6c 69 6e 65 49 00 00 00 00 GenuntelineI....
backtrace:
[<ffffffff814948ee>] kmalloc_node include/linux/slab.h:604 [inline]
[<ffffffff814948ee>] kvmalloc_node+0x3e/0x100 mm/util.c:580
[<ffffffff814950f2>] kvmalloc include/linux/slab.h:732 [inline]
[<ffffffff814950f2>] vmemdup_user+0x22/0x100 mm/util.c:199
[<ffffffff8109f5ff>] kvm_vcpu_ioctl_set_cpuid2+0x8f/0xf0 arch/x86/kvm/cpuid.c:423
[<ffffffff810711b9>] kvm_arch_vcpu_ioctl+0xb99/0x1e60 arch/x86/kvm/x86.c:5251
[<ffffffff8103e92d>] kvm_vcpu_ioctl+0x4ad/0x950 arch/x86/kvm/../../../virt/kvm/kvm_main.c:4066
[<ffffffff815afacc>] vfs_ioctl fs/ioctl.c:51 [inline]
[<ffffffff815afacc>] __do_sys_ioctl fs/ioctl.c:874 [inline]
[<ffffffff815afacc>] __se_sys_ioctl fs/ioctl.c:860 [inline]
[<ffffffff815afacc>] __x64_sys_ioctl+0xfc/0x140 fs/ioctl.c:860
[<ffffffff844a3335>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
[<ffffffff844a3335>] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
[<ffffffff84600068>] entry_SYSCALL_64_after_hwframe+0x44/0xaeMessage-Id: <[email protected]>
--- arch/x86/kvm/cpuid.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/x86/kvm/cpuid.c +8 -2
@@ -338,8 +338,14 @@ static int kvm_set_cpuid(struct kvm_vcpu* KVM_SET_CPUID{,2} again. To support this legacy behavior, check * whether the supplied CPUID data is equal to what's already set. */ -if (vcpu->arch.last_vmentry_cpu !=-1 ) -return kvm_cpuid_check_equal (vcpu, e2, nent); +if (vcpu->arch.last_vmentry_cpu !=-1 ) { + r =kvm_cpuid_check_equal (vcpu, e2, nent); +if (r) +return r; + +kvfree (e2); +return 0 ; + } r =kvm_check_cpuid (e2, nent);if (r)
Greg Kroah-Hartman
maintainerPATCH 54/200 KVM: x86: Forcibly leave nested virt when SMM state is toggled
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit f7e570780efc5cec9b2ed1e0472a7da14e864fdb upstream.
Forcibly leave nested virtualization operation if userspace toggles SMM state via KVM_SET_VCPU_EVENTS or KVM_SYNC_X86_EVENTS. If userspace forces the vCPU out of SMM while it's post-VMXON and then injects an SMI, vmx_enter_smm() will overwrite vmx->nested.smm.vmxon and end up with both vmxon=false and smm.vmxon=false, but all other nVMX state allocated.
Don't attempt to gracefully handle the transition as (a) most transitions are nonsencial, e.g. forcing SMM while L2 is running, (b) there isn't sufficient information to handle all transitions, e.g. SVM wants access to the SMRAM save state, and (c) KVM_SET_VCPU_EVENTS must precede KVM_SET_NESTED_STATE during state restore as the latter disallows putting the vCPU into L2 if SMM is active, and disallows tagging the vCPU as being post-VMXON in SMM if SMM is not active.
Abuse of KVM_SET_VCPU_EVENTS manifests as a WARN and memory leak in nVMX due to failure to free vmcs01's shadow VMCS, but the bug goes far beyond just a memory leak, e.g. toggling SMM on while L2 is active puts the vCPU in an architecturally impossible state.
WARNING: CPU: 0 PID: 3606 at free_loaded_vmcs arch/x86/kvm/vmx/vmx.c:2665 [inline] WARNING: CPU: 0 PID: 3606 at free_loaded_vmcs+0x158/0x1a0 arch/x86/kvm/vmx/vmx.c:2656 Modules linked in: CPU: 1 PID: 3606 Comm: syz-executor725 Not tainted 5.17.0-rc1-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:free_loaded_vmcs arch/x86/kvm/vmx/vmx.c:2665 [inline] RIP: 0010:free_loaded_vmcs+0x158/0x1a0 arch/x86/kvm/vmx/vmx.c:2656 Code: <0f> 0b eb b3 e8 8f 4d 9f 00 e9 f7 fe ff ff 48 89 df e8 92 4d 9f 00 Call Trace: <TASK> kvm_arch_vcpu_destroy+0x72/0x2f0 arch/x86/kvm/x86.c:11123 kvm_vcpu_destroy arch/x86/kvm/../../../virt/kvm/kvm_main.c:441 [inline] kvm_destroy_vcpus+0x11f/0x290 arch/x86/kvm/../../../virt/kvm/kvm_main.c:460 kvm_free_vcpus arch/x86/kvm/x86.c:11564 [inline] kvm_arch_destroy_vm+0x2e8/0x470 arch/x86/kvm/x86.c:11676 kvm_destroy_vm arch/x86/kvm/../../../virt/kvm/kvm_main.c:1217 [inline] kvm_put_kvm+0x4fa/0xb00 arch/x86/kvm/../../../virt/kvm/kvm_main.c:1250 kvm_vm_release+0x3f/0x50 arch/x86/kvm/../../../virt/kvm/kvm_main.c:1273 __fput+0x286/0x9f0 fs/file_table.c:311 task_work_run+0xdd/0x1a0 kernel/task_work.c:164 exit_task_work include/linux/task_work.h:32 [inline] do_exit+0xb29/0x2a30 kernel/exit.c:806 do_group_exit+0xd2/0x2f0 kernel/exit.c:935 get_signal+0x4b0/0x28c0 kernel/signal.c:2862 arch_do_signal_or_restart+0x2a9/0x1c40 arch/x86/kernel/signal.c:868 handle_signal_work kernel/entry/common.c:148 [inline] exit_to_user_mode_loop kernel/entry/common.c:172 [inline] exit_to_user_mode_prepare+0x17d/0x290 kernel/entry/common.c:207 __syscall_exit_to_user_mode_work kernel/entry/common.c:289 [inline] syscall_exit_to_user_mode+0x19/0x60 kernel/entry/common.c:300 do_syscall_64+0x42/0xb0 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x44/0xae </TASK>
Message-Id: <[email protected]>
--- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/svm/nested.c | 9 +++++---- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/vmx/nested.c | 1 + arch/x86/kvm/x86.c | 4 +++- 6 files changed, 12 insertions(+), 7 deletions(-)
arch/x86/include/asm/kvm_host.h +1 -0
@@ -1497,6 +1497,7 @@ struct kvm_x86_ops { };struct kvm_x86_nested_ops { +void (*leave_nested)(struct kvm_vcpu *vcpu);int (*check_events)(struct kvm_vcpu *vcpu);bool (*hv_timer_pending)(struct kvm_vcpu *vcpu);void (*triple_fault)(struct kvm_vcpu *vcpu);
arch/x86/kvm/svm/nested.c +5 -4
@@ -964,9 +964,9 @@ void svm_free_nested(struct vcpu_svm *sv/* * Forcibly leave nested mode in order to be able to reset the VCPU later on. */ -void svm_leave_nested (struct vcpu_svm *svm) +void svm_leave_nested (struct kvm_vcpu *vcpu) { -struct kvm_vcpu *vcpu = &svm->vcpu; +struct vcpu_svm *svm =to_svm (vcpu);if (is_guest_mode (vcpu)) { svm->nested.nested_run_pending =0 ;
@@ -1345,7 +1345,7 @@ static int svm_set_nested_state(struct kreturn -EINVAL ;if (!(kvm_state->flags &KVM_STATE_NESTED_GUEST_MODE )) { -svm_leave_nested (svm); +svm_leave_nested (vcpu);svm_set_gif (svm, !!(kvm_state->flags &KVM_STATE_NESTED_GIF_SET ));return 0 ; }
@@ -1410,7 +1410,7 @@ static int svm_set_nested_state(struct k*/ if (is_guest_mode (vcpu)) -svm_leave_nested (svm); +svm_leave_nested (vcpu);else svm->nested.vmcb02.ptr->save = svm->vmcb01.ptr->save;
@@ -1464,6 +1464,7 @@ static bool svm_get_nested_state_pages(s }struct kvm_x86_nested_ops svm_nested_ops = { + .leave_nested = svm_leave_nested, .check_events = svm_check_nested_events, .triple_fault = nested_svm_triple_fault, .get_nested_state_pages = svm_get_nested_state_pages,
arch/x86/kvm/svm/svm.c +1 -1
@@ -290,7 +290,7 @@ int svm_set_efer(struct kvm_vcpu *vcpu,if ((old_efer &EFER_SVME ) != (efer &EFER_SVME )) {if (!(efer &EFER_SVME )) { -svm_leave_nested (svm); +svm_leave_nested (vcpu);svm_set_gif (svm, true);/* #GP intercept is still needed for vmware backdoor */ if (!enable_vmware_backdoor)
arch/x86/kvm/svm/svm.h +1 -1
@@ -470,7 +470,7 @@ static inline bool nested_exit_on_nmi(stint enter_svm_guest_mode (struct kvm_vcpu *vcpu,u64 vmcb_gpa,struct vmcb *vmcb12,bool from_vmrun); -void svm_leave_nested (struct vcpu_svm *svm); +void svm_leave_nested (struct kvm_vcpu *vcpu);void svm_free_nested (struct vcpu_svm *svm);int svm_allocate_nested (struct vcpu_svm *svm);int nested_svm_vmrun (struct kvm_vcpu *vcpu);
arch/x86/kvm/vmx/nested.c +1 -0
@@ -6744,6 +6744,7 @@ __init int nested_vmx_hardware_setup(int }struct kvm_x86_nested_ops vmx_nested_ops = { + .leave_nested = vmx_leave_nested, .check_events = vmx_check_nested_events, .hv_timer_pending = nested_vmx_preemption_timer_pending, .triple_fault = nested_vmx_triple_fault,
arch/x86/kvm/x86.c +3 -1
@@ -4784,8 +4784,10 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_e vcpu->arch.apic->sipi_vector = events->sipi_vector;if (events->flags &KVM_VCPUEVENT_VALID_SMM ) { -if (!!(vcpu->arch.hflags &HF_SMM_MASK ) != events->smi.smm) +if (!!(vcpu->arch.hflags &HF_SMM_MASK ) != events->smi.smm) { + kvm_x86_ops.nested_ops->leave_nested (vcpu);kvm_smm_changed (vcpu, events->smi.smm); + } vcpu->arch.smi_pending = events->smi.pending;
Greg Kroah-Hartman
maintainerPATCH 55/200 KVM: x86: Check .flags in kvm_cpuid_check_equal() too
In reply to Greg Kroah-HartmanFrom: Vitaly Kuznetsov <[email protected]>
commit 033a3ea59a19df63edb4db6bfdbb357cd028258a upstream.
kvm_cpuid_check_equal() checks for the (full) equality of the supplied CPUID data so .flags need to be checked too.
Message-Id: <[email protected]>
--- arch/x86/kvm/cpuid.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kvm/cpuid.c +1 -0
@@ -113,6 +113,7 @@ static int kvm_cpuid_check_equal(struct orig = &vcpu->arch.cpuid_entries[i];if (e2[i].function != orig->function || e2[i].index != orig->index || + e2[i].flags != orig->flags || e2[i].eax != orig->eax || e2[i].ebx != orig->ebx || e2[i].ecx != orig->ecx || e2[i].edx != orig->edx)return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 56/200 KVM: x86: Keep MSR_IA32_XSS unchanged for INIT
In reply to Greg Kroah-HartmanFrom: Xiaoyao Li <[email protected]>
commit be4f3b3f82271c3193ce200a996dc70682c8e622 upstream.
It has been corrected from SDM version 075 that MSR_IA32_XSS is reset to zero on Power up and Reset but keeps unchanged on INIT.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/x86/kvm/x86.c +1 -2
@@ -11065,6 +11065,7 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcp vcpu->arch.msr_misc_features_enables =0 ; vcpu->arch.xcr0 =XFEATURE_MASK_FP ; + vcpu->arch.ia32_xss =0 ; }/* All GPRs except RDX (handled below) are zeroed on RESET/INIT. */
@@ -11081,8 +11082,6 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcp cpuid_0x1 =kvm_find_cpuid_entry (vcpu,1 ,0 );kvm_rdx_write (vcpu, cpuid_0x1 ? cpuid_0x1->eax :0x600 ); - vcpu->arch.ia32_xss =0 ; -static_call (kvm_x86_vcpu_reset)(vcpu, init_event);kvm_set_rflags (vcpu,X86_EFLAGS_FIXED );
Greg Kroah-Hartman
maintainerPATCH 57/200 KVM: x86: Update vCPUs runtime CPUID on write to MSR_IA32_XSS
In reply to Greg Kroah-HartmanFrom: Like Xu <[email protected]>
commit 4c282e51e4450b94680d6ca3b10f830483b1f243 upstream.
Do a runtime CPUID update for a vCPU if MSR_IA32_XSS is written, as the size in bytes of the XSAVE area is affected by the states enabled in XSS.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kvm/x86.c +1 -0
@@ -3508,6 +3508,7 @@ int kvm_set_msr_common(struct kvm_vcpu *if (data & ~supported_xss)return 1 ; vcpu->arch.ia32_xss = data; +kvm_update_cpuid_runtime (vcpu);break ;case MSR_SMI_COUNT :if (!msr_info->host_initiated)
Greg Kroah-Hartman
maintainerPATCH 58/200 KVM: x86: Sync the states size with the XCR0/IA32_XSS at, any time
In reply to Greg Kroah-HartmanFrom: Like Xu <[email protected]>
commit 05a9e065059e566f218f8778c4d17ee75db56c55 upstream.
XCR0 is reset to 1 by RESET but not INIT and IA32_XSS is zeroed by both RESET and INIT. The kvm_set_msr_common()'s handling of MSR_IA32_XSS also needs to update kvm_update_cpuid_runtime(). In the above cases, the size in bytes of the XSAVE area containing all states enabled by XCR0 or (XCRO | IA32_XSS) needs to be updated.
For simplicity and consistency, existing helpers are used to write values and call kvm_update_cpuid_runtime(), and it's not exactly a fast path.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/kvm/x86.c +2 -2
@@ -11065,8 +11065,8 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcp vcpu->arch.msr_misc_features_enables =0 ; - vcpu->arch.xcr0 =XFEATURE_MASK_FP ; - vcpu->arch.ia32_xss =0 ; +__kvm_set_xcr (vcpu,0 ,XFEATURE_MASK_FP ); +__kvm_set_msr (vcpu,MSR_IA32_XSS ,0 , true); }/* All GPRs except RDX (handled below) are zeroed on RESET/INIT. */
Greg Kroah-Hartman
maintainerPATCH 59/200 KVM: PPC: Book3S HV Nested: Fix nested HFSCR being clobbered with multiple vCPUs
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
commit 22f7ff0dea9491e90b6fe808ed40c30bd791e5c2 upstream.
The L0 is storing HFSCR requested by the L1 for the L2 in struct kvm_nested_guest when the L1 requests a vCPU enter L2. kvm_nested_guest is not a per-vCPU structure. Hilarity ensues.
Fix it by moving the nested hfscr into the vCPU structure together with the other per-vCPU nested fields.
--- arch/powerpc/include/asm/kvm_book3s_64.h | 1 - arch/powerpc/include/asm/kvm_host.h | 1 + arch/powerpc/kvm/book3s_hv.c | 3 +-- arch/powerpc/kvm/book3s_hv_nested.c | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-)
arch/powerpc/include/asm/kvm_book3s_64.h +0 -1
@@ -39,7 +39,6 @@ struct kvm_nested_guest {pgd_t *shadow_pgtable;/* our page table for this guest */ u64 l1_gr_to_hr;/* L1's addr of part'n-scoped table */ u64 process_table;/* process table entry for this guest */ -u64 hfscr;/* HFSCR that the L1 requested for this nested guest */ long refcnt;/* number of pointers to this struct */ struct mutex tlb_lock;/* serialize page faults and tlbies */ struct kvm_nested_guest *next;
arch/powerpc/include/asm/kvm_host.h +1 -0
@@ -814,6 +814,7 @@ struct kvm_vcpu_arch {/* For support of nested guests */ struct kvm_nested_guest *nested; +u64 nested_hfscr;/* HFSCR that the L1 requested for the nested guest */ u32 nested_vcpu_id;gpa_t nested_io_gpr;#endif
arch/powerpc/kvm/book3s_hv.c +1 -2
@@ -1731,7 +1731,6 @@ static int kvmppc_handle_exit_hv(structstatic int kvmppc_handle_nested_exit (struct kvm_vcpu *vcpu) { -struct kvm_nested_guest *nested = vcpu->arch.nested;int r;int srcu_idx;
@@ -1831,7 +1830,7 @@ static int kvmppc_handle_nested_exit(str* it into a HEAI. */ if (!(vcpu->arch.hfscr_permitted & (1UL << cause)) || - (nested->hfscr & (1UL << cause))) { + (vcpu->arch.nested_hfscr & (1UL << cause))) { vcpu->arch.trap =BOOK3S_INTERRUPT_H_EMUL_ASSIST ;/*
arch/powerpc/kvm/book3s_hv_nested.c +1 -1
@@ -362,7 +362,7 @@ long kvmhv_enter_nested_guest(struct kvm/* set L1 state to L2 state */ vcpu->arch.nested = l2; vcpu->arch.nested_vcpu_id = l2_hv.vcpu_token; - l2->hfscr = l2_hv.hfscr; + vcpu->arch.nested_hfscr = l2_hv.hfscr; vcpu->arch.regs = l2_regs;/* Guest must always run with ME enabled, HV disabled. */
Greg Kroah-Hartman
maintainerPATCH 60/200 security, lsm: dentry_init_security() Handle multi LSM registration
In reply to Greg Kroah-HartmanFrom: Vivek Goyal <[email protected]>
commit 7f5056b9e7b71149bf11073f00a57fa1ac2921a9 upstream.
A ceph user has reported that ceph is crashing with kernel NULL pointer dereference. Following is the backtrace.
/proc/version: Linux version 5.16.2-arch1-1 (linux@archlinux) (gcc (GCC) 11.1.0, GNU ld (GNU Binutils) 2.36.1) #1 SMP PREEMPT Thu, 20 Jan 2022 16:18:29 +0000
distro / arch: Arch Linux / x86_64
SELinux is not enabled
ceph cluster version: 16.2.7 (dd0603118f56ab514f133c8d2e3adfc983942503)
relevant dmesg output:
[ 30.947129] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 30.947206] #PF: supervisor read access in kernel mode [ 30.947258] #PF: error_code(0x0000) - not-present page [ 30.947310] PGD 0 P4D 0 [ 30.947342] Oops: 0000 [#1] PREEMPT SMP PTI [ 30.947388] CPU: 5 PID: 778 Comm: touch Not tainted 5.16.2-arch1-1 #1 86fbf2c313cc37a553d65deb81d98e9dcc2a3659 [ 30.947486] Hardware name: Gigabyte Technology Co., Ltd. B365M DS3H/B365M DS3H, BIOS F5 08/13/2019 [ 30.947569] RIP: 0010:strlen+0x0/0x20 [ 30.947616] Code: b6 07 38 d0 74 16 48 83 c7 01 84 c0 74 05 48 39 f7 75 ec 31 c0 31 d2 89 d6 89 d7 c3 48 89 f8 31 d2 89 d6 89 d7 c3 0 f 1f 40 00 <80> 3f 00 74 12 48 89 f8 48 83 c0 01 80 38 00 75 f7 48 29 f8 31 ff [ 30.947782] RSP: 0018:ffffa4ed80ffbbb8 EFLAGS: 00010246 [ 30.947836] RAX: 0000000000000000 RBX: ffffa4ed80ffbc60 RCX: 0000000000000000 [ 30.947904] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 30.947971] RBP: ffff94b0d15c0ae0 R08: 0000000000000000 R09: 0000000000000000 [ 30.948040] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 [ 30.948106] R13: 0000000000000001 R14: ffffa4ed80ffbc60 R15: 0000000000000000 [ 30.948174] FS: 00007fc7520f0740(0000) GS:ffff94b7ced40000(0000) knlGS:0000000000000000 [ 30.948252] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 30.948308] CR2: 0000000000000000 CR3: 0000000104a40001 CR4: 00000000003706e0 [ 30.948376] Call Trace: [ 30.948404] <TASK> [ 30.948431] ceph_security_init_secctx+0x7b/0x240 [ceph 49f9c4b9bf5be8760f19f1747e26da33920bce4b] [ 30.948582] ceph_atomic_open+0x51e/0x8a0 [ceph 49f9c4b9bf5be8760f19f1747e26da33920bce4b] [ 30.948708] ? get_cached_acl+0x4d/0xa0 [ 30.948759] path_openat+0x60d/0x1030 [ 30.948809] do_filp_open+0xa5/0x150 [ 30.948859] do_sys_openat2+0xc4/0x190 [ 30.948904] __x64_sys_openat+0x53/0xa0 [ 30.948948] do_syscall_64+0x5c/0x90 [ 30.948989] ? exc_page_fault+0x72/0x180 [ 30.949034] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 30.949091] RIP: 0033:0x7fc7521e25bb [ 30.950849] Code: 25 00 00 41 00 3d 00 00 41 00 74 4b 64 8b 04 25 18 00
00 00 85 c0 75 67 44 89 e2 48 89 ee bf 9c ff ff ff b8 01 01 0
0 00 0f 05 <48> 3d 00 f0 ff ff 0f 87 91 00 00 00 48 8b 54 24 28 64 48 2b 14 25
Core of the problem is that ceph checks for return code from security_dentry_init_security() and if return code is 0, it assumes everything is fine and continues to call strlen(name), which crashes.
Typically SELinux LSM returns 0 and sets name to "security.selinux" and it is not a problem. Or if selinux is not compiled in or disabled, it returns -EOPNOTSUP and ceph deals with it.
But somehow in this configuration, 0 is being returned and "name" is not being initialized and that's creating the problem.
Our suspicion is that BPF LSM is registering a hook for dentry_init_security() and returns hook default of 0.
LSM_HOOK(int, 0, dentry_init_security, struct dentry *dentry,...)
I have not been able to reproduce it just by doing CONFIG_BPF_LSM=y. Stephen has tested the patch though and confirms it solves the problem for him.
dentry_init_security() is written in such a way that it expects only one LSM to register the hook. Atleast that's the expectation with current code.
If another LSM returns a hook and returns default, it will simply return 0 as of now and that will break ceph.
Hence, suggestion is that change semantics of this hook a bit. If there are no LSMs or no LSM is taking ownership and initializing security context, then return -EOPNOTSUP. Also allow at max one LSM to initialize security context. This hook can't deal with multiple LSMs trying to init security context. This patch implements this new behavior.
--- include/linux/lsm_hook_defs.h | 2 +- security/security.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-)
include/linux/lsm_hook_defs.h +1 -1
@@ -82,7 +82,7 @@ LSM_HOOK(int, 0, sb_add_mnt_opt, const c int len, void **mnt_opts) LSM_HOOK(int, 0, move_mount, const struct path *from_path, const struct path *to_path) -LSM_HOOK(int, 0, dentry_init_security, struct dentry *dentry, +LSM_HOOK(int, -EOPNOTSUPP, dentry_init_security, struct dentry *dentry, int mode, const struct qstr *name, const char **xattr_name, void **ctx, u32 *ctxlen) LSM_HOOK(int, 0, dentry_create_files_as, struct dentry *dentry, int mode,
security/security.c +13 -2
@@ -1056,8 +1056,19 @@ int security_dentry_init_security(struct const char **xattr_name, void **ctx, u32 *ctxlen) { - return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode, -name ,xattr_name ,ctx ,ctxlen ); + struct security_hook_list *hp; +int rc; + +/* +* Only one module will provide a security context. +*/ +hlist_for_each_entry (hp, &security_hook_heads.dentry_init_security, list) { + rc = hp->hook.dentry_init_security (dentry, mode, name, + xattr_name, ctx, ctxlen); +if (rc !=LSM_RET_DEFAULT (dentry_init_security)) +return rc; + } +return LSM_RET_DEFAULT (dentry_init_security); }EXPORT_SYMBOL (security_dentry_init_security);
Greg Kroah-Hartman
maintainerPATCH 61/200 arm64: extable: fix load_unaligned_zeropad() reg indices
In reply to Greg Kroah-HartmanFrom: Evgenii Stepanov <[email protected]>
commit 3758a6c74e08bdc15ccccd6872a6ad37d165239a upstream.
In ex_handler_load_unaligned_zeropad() we erroneously extract the data and addr register indices from ex->type rather than ex->data. As ex->type will contain EX_TYPE_LOAD_UNALIGNED_ZEROPAD (i.e. 4):
* We'll always treat X0 as the address register, since EX_DATA_REG_ADDR is extracted from bits [9:5]. Thus, we may attempt to dereference an arbitrary address as X0 may hold an arbitrary value.
* We'll always treat X4 as the data register, since EX_DATA_REG_DATA is extracted from bits [4:0]. Thus we will corrupt X4 and cause arbitrary behaviour within load_unaligned_zeropad() and its caller.
Fix this by extracting both values from ex->data as originally intended.
On an MTE-enabled QEMU image we are hitting the following crash:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 Call trace: fixup_exception+0xc4/0x108 __do_kernel_fault+0x3c/0x268 do_tag_check_fault+0x3c/0x104 do_mem_abort+0x44/0xf4 el1_abort+0x40/0x64 el1h_64_sync_handler+0x60/0xa0 el1h_64_sync+0x7c/0x80 link_path_walk+0x150/0x344 path_openat+0xa0/0x7dc do_filp_open+0xb8/0x168 do_sys_openat2+0x88/0x17c __arm64_sys_openat+0x74/0xa0 invoke_syscall+0x48/0x148 el0_svc_common+0xb8/0xf8 do_el0_svc+0x28/0x88 el0_svc+0x24/0x84 el0t_64_sync_handler+0x88/0xec el0t_64_sync+0x1b4/0x1b8 Code: f8695a69 71007d1f 540000e0 927df12a (f940014a)
--- arch/arm64/mm/extable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/mm/extable.c +2 -2
@@ -43,8 +43,8 @@ static bool ex_handler_load_unaligned_zeropad(const struct exception_table_entry *ex, struct pt_regs *regs) { - int reg_data = FIELD_GET(EX_DATA_REG_DATA, ex->type); -int reg_addr =FIELD_GET (EX_DATA_REG_ADDR , ex->type); + int reg_data = FIELD_GET(EX_DATA_REG_DATA, ex->data); +int reg_addr =FIELD_GET (EX_DATA_REG_ADDR , ex->data);unsigned long data, addr, offset; addr =pt_regs_read_reg (regs, reg_addr);
Greg Kroah-Hartman
maintainerPATCH 62/200 dm: revert partial fix for redundant bio-based IO accounting
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit f524d9c95fab54783d0038f7a3e8c014d5b56857 upstream.
Reverts a1e1cb72d9649 ("dm: fix redundant IO accounting for bios that need splitting") because it was too narrow in scope (only addressed redundant 'sectors[]' accounting and not ios, nsecs[], etc).
--- drivers/md/dm.c | 15 --------------- 1 file changed, 15 deletions(-)
drivers/md/dm.c +0 -15
@@ -1510,9 +1510,6 @@ static void init_clone_info(struct clone ci->sector = bio->bi_iter.bi_sector; } -#define __dm_part_stat_sub (part, field, subnd) \ - (part_stat_get(part, field) -= (subnd)) -/* * Entry point to split a bio into clones and submit them to the targets. */
@@ -1548,18 +1545,6 @@ static void __split_and_process_bio(stru GFP_NOIO, &md->queue->bio_split); ci.io->orig_bio = b; -/* -* Adjust IO stats for each split, otherwise upon queue -* reentry there will be redundant IO accounting. -* NOTE: this is a stop-gap fix, a proper fix involves -* significant refactoring of DM core's bio splitting -* (by eliminating DM's splitting and just using bio_split) -*/ -part_stat_lock (); -__dm_part_stat_sub (dm_disk (md)->part0, - sectors[op_stat_group (bio_op (bio))], ci.sector_count); -part_stat_unlock (); -bio_chain (b, bio);trace_block_split (b, bio->bi_iter.bi_sector);submit_bio_noacct (bio);
Greg Kroah-Hartman
maintainerPATCH 63/200 block: add bio_start_io_acct_time() to control start_time
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit e45c47d1f94e0cc7b6b079fdb4bcce2995e2adc4 upstream.
bio_start_io_acct_time() interface is like bio_start_io_acct() that allows start_time to be passed in. This gives drivers the ability to defer starting accounting until after IO is issued (but possibily not entirely due to bio splitting).
--- block/blk-core.c | 25 +++++++++++++++++++------ include/linux/blkdev.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-)
block/blk-core.c +19 -6
@@ -1258,22 +1258,34 @@ void __blk_account_io_start(struct reque }static unsigned long __part_start_io_acct (struct block_device *part, -unsigned int sectors,unsigned int op) +unsigned int sectors,unsigned int op, +unsigned long start_time) {const int sgrp =op_stat_group (op); -unsigned long now =READ_ONCE (jiffies);part_stat_lock (); -update_io_ticks (part, now, false); +update_io_ticks (part, start_time, false);part_stat_inc (part, ios[sgrp]);part_stat_add (part, sectors[sgrp], sectors);part_stat_local_inc (part, in_flight[op_is_write (op)]);part_stat_unlock (); -return now; +return start_time; }/** +* bio_start_io_acct_time - start I/O accounting for bio based drivers +* @bio: bio to start account for +* @start_time: start time that should be passed back to bio_end_io_acct(). +*/ +void bio_start_io_acct_time (struct bio *bio,unsigned long start_time) +{ +__part_start_io_acct (bio->bi_bdev,bio_sectors (bio), +bio_op (bio), start_time); +} +EXPORT_SYMBOL_GPL (bio_start_io_acct_time); + +/** * bio_start_io_acct - start I/O accounting for bio based drivers * @bio: bio to start account for *
@@ -1281,14 +1293,15 @@ static unsigned long __part_start_io_acc*/ unsigned long bio_start_io_acct (struct bio *bio) { -return __part_start_io_acct (bio->bi_bdev,bio_sectors (bio),bio_op (bio)); +return __part_start_io_acct (bio->bi_bdev,bio_sectors (bio), +bio_op (bio), jiffies); }EXPORT_SYMBOL_GPL (bio_start_io_acct);unsigned long disk_start_io_acct (struct gendisk *disk,unsigned int sectors,unsigned int op) { -return __part_start_io_acct (disk->part0, sectors, op); +return __part_start_io_acct (disk->part0, sectors, op, jiffies); }EXPORT_SYMBOL (disk_start_io_acct);
include/linux/blkdev.h +1 -0
@@ -1254,6 +1254,7 @@ unsigned long disk_start_io_acct(structvoid disk_end_io_acct (struct gendisk *disk,unsigned int op,unsigned long start_time); +void bio_start_io_acct_time (struct bio *bio,unsigned long start_time);unsigned long bio_start_io_acct (struct bio *bio);void bio_end_io_acct_remapped (struct bio *bio,unsigned long start_time,struct block_device *orig_bdev);
Greg Kroah-Hartman
maintainerPATCH 64/200 dm: properly fix redundant bio-based IO accounting
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit b879f915bc48a18d4f4462729192435bb0f17052 upstream.
Record the start_time for a bio but defer the starting block core's IO accounting until after IO is submitted using bio_start_io_acct_time().
This approach avoids the need to mess around with any of the individual IO stats in response to a bio_split() that follows bio submission.
Depends-on: e45c47d1f94e ("block: add bio_start_io_acct_time() to control start_time")
--- drivers/md/dm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/dm.c +3 -2
@@ -489,7 +489,7 @@ static void start_io_acct(struct dm_io *struct mapped_device *md = io->md;struct bio *bio = io->orig_bio; - io->start_time =bio_start_io_acct (bio); +bio_start_io_acct_time (bio, io->start_time);if (unlikely (dm_stats_used (&md->stats))) dm_stats_account_io(&md->stats, bio_data_dir(bio), bio->bi_iter.bi_sector, bio_sectors(bio),
@@ -535,7 +535,7 @@ static struct dm_io *alloc_io(struct map io->md = md;spin_lock_init (&io->endio_lock); -start_io_acct (io); + io->start_time = jiffies;return io; }
@@ -1550,6 +1550,7 @@ static void __split_and_process_bio(strusubmit_bio_noacct (bio); } } +start_io_acct (ci.io);/* drop the extra reference count */ dm_io_dec_pending (ci.io,errno_to_blk_status (error));
Greg Kroah-Hartman
maintainerPATCH 65/200 serial: pl011: Fix incorrect rs485 RTS polarity on set_mctrl
In reply to Greg Kroah-HartmanFrom: Jochen Mades <[email protected]>
commit 62f676ff7898f6c1bd26ce014564773a3dc00601 upstream.
Commit 8d479237727c ("serial: amba-pl011: add RS485 support") sought to keep RTS deasserted on set_mctrl if rs485 is enabled. However it did so only if deasserted RTS polarity is high. Fix it in case it's low.
--- drivers/tty/serial/amba-pl011.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/tty/serial/amba-pl011.c +6 -2
@@ -1615,8 +1615,12 @@ static void pl011_set_mctrl(struct uart_ container_of(port, struct uart_amba_port, port);unsigned int cr; -if (port->rs485.flags &SER_RS485_ENABLED ) - mctrl &= ~TIOCM_RTS ; +if (port->rs485.flags &SER_RS485_ENABLED ) { +if (port->rs485.flags &SER_RS485_RTS_AFTER_SEND ) + mctrl &= ~TIOCM_RTS ; +else + mctrl |=TIOCM_RTS ; + } cr =pl011_read (uap,REG_CR );
Greg Kroah-Hartman
maintainerPATCH 66/200 serial: 8250: of: Fix mapped region size when using reg-offset property
In reply to Greg Kroah-HartmanFrom: Robert Hancock <[email protected]>
commit d06b1cf28297e27127d3da54753a3a01a2fa2f28 upstream.
8250_of supports a reg-offset property which is intended to handle cases where the device registers start at an offset inside the region of memory allocated to the device. The Xilinx 16550 UART, for which this support was initially added, requires this. However, the code did not adjust the overall size of the mapped region accordingly, causing the driver to request an area of memory past the end of the device's allocation. For example, if the UART was allocated an address of 0xb0130000, size of 0x10000 and reg-offset of 0x1000 in the device tree, the region of memory reserved was b0131000-b0140fff, which caused the driver for the region starting at b0140000 to fail to probe.
Fix this by subtracting reg-offset from the mapped region size.
--- drivers/tty/serial/8250/8250_of.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/tty/serial/8250/8250_of.c +10 -1
@@ -83,8 +83,17 @@ static int of_platform_serial_setup(stru port->mapsize =resource_size (&resource);/* Check for shifted address mapping */ -if (of_property_read_u32 (np,"reg-offset" , &prop) ==0 ) +if (of_property_read_u32 (np,"reg-offset" , &prop) ==0 ) { +if (prop >= port->mapsize) { +dev_warn (&ofdev->dev,"reg-offset %u exceeds region size %pa\n" , + prop, &port->mapsize); + ret = -EINVAL ; + goto err_unprepare; + } + port->mapbase += prop; + port->mapsize -= prop; + } port->iotype =UPIO_MEM ;if (of_property_read_u32 (np,"reg-io-width" , &prop) ==0 ) {
Greg Kroah-Hartman
maintainerPATCH 67/200 serial: stm32: fix software flow control transfer
In reply to Greg Kroah-HartmanFrom: Valentin Caron <[email protected]>
commit 037b91ec7729524107982e36ec4b40f9b174f7a2 upstream.
x_char is ignored by stm32_usart_start_tx() when xmit buffer is empty.
Fix start_tx condition to allow x_char to be sent.
--- drivers/tty/serial/stm32-usart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/stm32-usart.c +1 -1
@@ -696,7 +696,7 @@ static void stm32_usart_start_tx(structstruct serial_rs485 *rs485conf = &port->rs485;struct circ_buf *xmit = &port->state->xmit; -if (uart_circ_empty (xmit)) +if (uart_circ_empty (xmit) && !port->x_char)return ;if (rs485conf->flags &SER_RS485_ENABLED ) {
Greg Kroah-Hartman
maintainerPATCH 68/200 tty: rpmsg: Fix race condition releasing tty port
In reply to Greg Kroah-HartmanFrom: Arnaud Pouliquen <[email protected]>
commit db7f19c0aa0abcb751ff0ed694a071363f702b1d upstream.
The tty_port struct is part of the rpmsg_tty_port structure. The issue is that the rpmsg_tty_port structure is freed on rpmsg_tty_remove while it is still referenced in the tty_struct. Its release is not predictable due to workqueues.
For instance following ftrace shows that rpmsg_tty_close is called after rpmsg_tty_release_cport:
nr_test.sh-389 [000] ..... 212.093752: rpmsg_tty_remove <-rpmsg_dev_
remove
cat-1191 [001] ..... 212.095697: tty_release <-__fput
nr_test.sh-389 [000] ..... 212.099166: rpmsg_tty_release_cport <-rpm
sg_tty_remove
cat-1191 [001] ..... 212.115352: rpmsg_tty_close <-tty_release
cat-1191 [001] ..... 212.115371: release_tty <-tty_release_strAs consequence, the port must be free only when user has released the TTY interface.
This path :
- Introduce the .destruct port tty ops function to release the allocated rpmsg_tty_port structure.
- Introduce the .hangup tty ops function to call tty_port_hangup.
- Manages the tty port refcounting to trig the .destruct port ops,
- Introduces the rpmsg_tty_cleanup function to ensure that the TTY is removed before decreasing the port refcount.
--- drivers/tty/rpmsg_tty.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-)
drivers/tty/rpmsg_tty.c +26 -14
@@ -50,10 +50,17 @@ static int rpmsg_tty_cb(struct rpmsg_devstatic int rpmsg_tty_install (struct tty_driver *driver,struct tty_struct *tty) {struct rpmsg_tty_port *cport =idr_find (&tty_idr, tty->index); +struct tty_port *port; tty->driver_data = cport; -return tty_port_install (&cport->port, driver, tty); + port =tty_port_get (&cport->port); +return tty_port_install (port, driver, tty); +} + +static void rpmsg_tty_cleanup (struct tty_struct *tty) +{ +tty_port_put (tty->port); }static int rpmsg_tty_open (struct tty_struct *tty,struct file *filp)
@@ -106,12 +113,19 @@ static unsigned int rpmsg_tty_write_roomreturn size; } +static void rpmsg_tty_hangup (struct tty_struct *tty) +{ +tty_port_hangup (tty->port); +} +static const struct tty_operations rpmsg_tty_ops = { .install = rpmsg_tty_install, .open = rpmsg_tty_open, .close = rpmsg_tty_close, .write = rpmsg_tty_write, .write_room = rpmsg_tty_write_room, + .hangup = rpmsg_tty_hangup, + .cleanup = rpmsg_tty_cleanup, };static struct rpmsg_tty_port *rpmsg_tty_alloc_cport (void )
@@ -137,8 +151,10 @@ static struct rpmsg_tty_port *rpmsg_tty_return cport; } -static void rpmsg_tty_release_cport (struct rpmsg_tty_port *cport) +static void rpmsg_tty_destruct_port (struct tty_port *port) { + struct rpmsg_tty_port *cport = container_of(port, struct rpmsg_tty_port, port); +mutex_lock (&idr_lock);idr_remove (&tty_idr, cport->id);mutex_unlock (&idr_lock);
@@ -146,7 +162,10 @@ static void rpmsg_tty_release_cport(strukfree (cport); } -static const struct tty_port_operations rpmsg_tty_port_ops = { }; +static const struct tty_port_operations rpmsg_tty_port_ops = { + .destruct = rpmsg_tty_destruct_port, +}; +static int rpmsg_tty_probe (struct rpmsg_device *rpdev) {
@@ -166,7 +185,8 @@ static int rpmsg_tty_probe(struct rpmsg_ cport->id, dev);if (IS_ERR (tty_dev)) { ret =dev_err_probe (dev,PTR_ERR (tty_dev),"Failed to register tty port\n" ); - goto err_destroy; +tty_port_put (&cport->port); +return ret; } cport->rpdev = rpdev;
@@ -177,12 +197,6 @@ static int rpmsg_tty_probe(struct rpmsg_ rpdev->src, rpdev->dst, cport->id);return 0 ; - -err_destroy: -tty_port_destroy (&cport->port); -rpmsg_tty_release_cport (cport); - -return ret; }static void rpmsg_tty_remove (struct rpmsg_device *rpdev)
@@ -192,13 +206,11 @@ static void rpmsg_tty_remove(struct rpmsdev_dbg (&rpdev->dev,"Removing rpmsg tty device %d\n" , cport->id);/* User hang up to release the tty */ -if (tty_port_initialized (&cport->port)) -tty_port_tty_hangup (&cport->port, false); +tty_port_tty_hangup (&cport->port, false);tty_unregister_device (rpmsg_tty_driver, cport->id); -tty_port_destroy (&cport->port); -rpmsg_tty_release_cport (cport); +tty_port_put (&cport->port); }static struct rpmsg_device_id rpmsg_driver_tty_id_table[] = {
Greg Kroah-Hartman
maintainerPATCH 69/200 tty: n_gsm: fix SW flow control encoding/handling
In reply to Greg Kroah-HartmanFrom: [email protected] <[email protected]>
commit 8838b2af23caf1ff0610caef2795d6668a013b2d upstream.
n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010.
See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516
The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to
the newer 27.010 here. Chapter 5.2.7.3 states that DC1 (XON) and DC3 (XOFF)
are the control characters defined in ISO/IEC 646. These shall be quoted if
seen in the data stream to avoid interpretation as flow control characters.
ISO/IEC 646 refers to the set of ISO standards described as the ISO 7-bit coded character set for information interchange. Its final version is also known as ITU T.50.
See https://www.itu.int/rec/T-REC-T.50-199209-I/en
To abide the standard it is needed to quote DC1 and DC3 correctly if these are seen as data bytes and not as control characters. The current implementation already tries to enforce this but fails to catch all defined cases. 3GPP 27.010 chapter 5.2.7.3 clearly states that the most significant bit shall be ignored for DC1 and DC3 handling. The current implementation handles only the case with the most significant bit set 0. Cases in which DC1 and DC3 have the most significant bit set 1 are left unhandled.
This patch fixes this by masking the data bytes with ISO_IEC_646_MASK (only the 7 least significant bits set 1) before comparing them with XON (a.k.a. DC1) and XOFF (a.k.a. DC3) when testing which byte values need quotation via byte stuffing.
--- drivers/tty/n_gsm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/tty/n_gsm.c +3 -1
@@ -322,6 +322,7 @@ static int addr_cnt;#define GSM1_ESCAPE_BITS 0x20#define XON 0x11#define XOFF 0x13 +#define ISO_IEC_646_MASK 0x7Fstatic const struct tty_port_operations gsm_port_ops;
@@ -531,7 +532,8 @@ static int gsm_stuff_frame(const u8 *inpint olen =0 ;while (len--) {if (*input ==GSM1_SOF || *input ==GSM1_ESCAPE - || *input ==XON || *input ==XOFF ) { + || (*input &ISO_IEC_646_MASK ) ==XON + || (*input &ISO_IEC_646_MASK ) ==XOFF ) { *output++ =GSM1_ESCAPE ; *output++ = *input++ ^GSM1_ESCAPE_BITS ; olen++;
Greg Kroah-Hartman
maintainerPATCH 70/200 tty: Partially revert the removal of the Cyclades public API
In reply to Greg Kroah-HartmanFrom: Maciej W. Rozycki <[email protected]>
commit f23653fe64479d96910bfda2b700b1af17c991ac upstream.
Fix a user API regression introduced with commit f76edd8f7ce0 ("tty:
cyclades, remove this orphan"), which removed a part of the API and caused compilation errors for user programs using said part, such as GCC 9 in its libsanitizer component[1]:
.../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:160:10: fatal error: linux/cyclades.h: No such file or directory
160 | #include <linux/cyclades.h>
| ^~~~~~~~~~~~~~~~~~
compilation terminated.
make[4]: *** [Makefile:664: sanitizer_platform_limits_posix.lo] Error 1
As the absolute minimum required bring `struct cyclades_monitor' and ioctl numbers back then so as to make the library build again. Add a preprocessor warning as to the obsolescence of the features provided.
[1] GCC PR sanitizer/100379, "cyclades.h is removed from linux kernel
header files", <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100379>
--- include/uapi/linux/cyclades.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 include/uapi/linux/cyclades.h
include/uapi/linux/cyclades.h new file +35 -0
@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + +#ifndef _UAPI_LINUX_CYCLADES_H +#define _UAPI_LINUX_CYCLADES_H + +#warning "Support for features provided by this header has been removed" +#warning "Please consider updating your code" + +struct cyclades_monitor { +unsigned long int_count; +unsigned long char_count; +unsigned long char_max; +unsigned long char_last; +}; + +#define CYGETMON 0x435901 +#define CYGETTHRESH 0x435902 +#define CYSETTHRESH 0x435903 +#define CYGETDEFTHRESH 0x435904 +#define CYSETDEFTHRESH 0x435905 +#define CYGETTIMEOUT 0x435906 +#define CYSETTIMEOUT 0x435907 +#define CYGETDEFTIMEOUT 0x435908 +#define CYSETDEFTIMEOUT 0x435909 +#define CYSETRFLOW 0x43590a +#define CYGETRFLOW 0x43590b +#define CYSETRTSDTR_INV 0x43590c +#define CYGETRTSDTR_INV 0x43590d +#define CYZSETPOLLCYCLE 0x43590e +#define CYZGETPOLLCYCLE 0x43590f +#define CYGETCD1400VER 0x435910 +#define CYSETWAIT 0x435912 +#define CYGETWAIT 0x435913 + +#endif /* _UAPI_LINUX_CYCLADES_H */
Greg Kroah-Hartman
maintainerPATCH 71/200 tty: Add support for Brainboxes UC cards.
In reply to Greg Kroah-HartmanFrom: Cameron Williams <[email protected]>
commit 152d1afa834c84530828ee031cf07a00e0fc0b8c upstream.
This commit adds support for the some of the Brainboxes PCI range of cards, including the UC-101, UC-235/246, UC-257, UC-268, UC-275/279, UC-302, UC-310, UC-313, UC-320/324, UC-346, UC-357, UC-368 and UC-420/431.
--- drivers/tty/serial/8250/8250_pci.c | 100 ++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-)
drivers/tty/serial/8250/8250_pci.c +98 -2
@@ -5174,8 +5174,30 @@ static const struct pci_device_id serial {PCI_VENDOR_ID_INTASHIELD ,PCI_DEVICE_ID_INTASHIELD_IS400 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,/* 135a.0dc0 */ pbn_b2_4_115200 }, +/* Brainboxes Devices */ /* -* BrainBoxes UC-260 +* Brainboxes UC-101 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0BA1, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-235/246 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0AA1, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_1_115200 }, +/* +* Brainboxes UC-257 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0861, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-260/271/701/756 */ { PCI_VENDOR_ID_INTASHIELD, 0x0D21, PCI_ANY_ID, PCI_ANY_ID,
@@ -5183,7 +5205,81 @@ static const struct pci_device_id serial pbn_b2_4_115200 }, {PCI_VENDOR_ID_INTASHIELD ,0x0E34 ,PCI_ANY_ID ,PCI_ANY_ID , -PCI_CLASS_COMMUNICATION_MULTISERIAL <<8 ,0xffff00 , +PCI_CLASS_COMMUNICATION_MULTISERIAL <<8 ,0xffff00 , + pbn_b2_4_115200 }, +/* +* Brainboxes UC-268 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0841, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_4_115200 }, +/* +* Brainboxes UC-275/279 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0881, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_8_115200 }, +/* +* Brainboxes UC-302 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x08E1, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-310 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x08C1, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-313 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x08A3, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-320/324 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0A61, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_1_115200 }, +/* +* Brainboxes UC-346 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0B02, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_4_115200 }, +/* +* Brainboxes UC-357 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0A81, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, + { PCI_VENDOR_ID_INTASHIELD, 0x0A83, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_2_115200 }, +/* +* Brainboxes UC-368 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0C41, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , + pbn_b2_4_115200 }, +/* +* Brainboxes UC-420/431 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0921, +PCI_ANY_ID ,PCI_ANY_ID , +0 ,0 , pbn_b2_4_115200 },/* * Perle PCI-RAS cards
Greg Kroah-Hartman
maintainerPATCH 72/200 kbuild: remove include/linux/cyclades.h from header file check
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
commit d1ad2721b1eb05d54e81393a7ebc332d4a35c68f upstream.
The file now rightfully throws up a big warning that it should never be included, so remove it from the header_check test.
--- usr/include/Makefile | 1 + 1 file changed, 1 insertion(+)
usr/include/Makefile +1 -0
@@ -28,6 +28,7 @@ no-header-test += linux/am437x-vpfe.h no-header-test += linux/android/binder.h no-header-test += linux/android/binderfs.h no-header-test += linux/coda.h +no-header-test += linux/cyclades.h no-header-test += linux/errqueue.h no-header-test += linux/fsmap.h no-header-test += linux/hdlc/ioctl.h
Greg Kroah-Hartman
maintainerPATCH 73/200 usb-storage: Add unusual-devs entry for VL817 USB-SATA bridge
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
commit 5b67b315037250a61861119683e7fcb509deea25 upstream.
Two people have reported (and mentioned numerous other reports on the web) that VIA's VL817 USB-SATA bridge does not work with the uas driver. Typical log messages are:
[ 3606.232149] sd 14:0:0:0: [sdg] tag#2 uas_zap_pending 0 uas-tag 1 inflight: CMD [ 3606.232154] sd 14:0:0:0: [sdg] tag#2 CDB: Write(16) 8a 00 00 00 00 00 18 0c c9 80 00 00 00 80 00 00 [ 3606.306257] usb 4-4.4: reset SuperSpeed Plus Gen 2x1 USB device number 11 using xhci_hcd [ 3606.328584] scsi host14: uas_eh_device_reset_handler success
Surprisingly, the devices do seem to work okay for some other people. The cause of the differing behaviors is not known.
In the hope of getting the devices to work for the most users, even at the possible cost of degraded performance for some, this patch adds an unusual_devs entry for the VL817 to block it from binding to the uas driver by default. Users will be able to override this entry by means of a module parameter, if they want.
--- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/usb/storage/unusual_devs.h +10 -0
@@ -2301,6 +2301,16 @@ UNUSUAL_DEV( 0x2027, 0xa001, 0x0000, 0x USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, US_FL_SCM_MULT_TARG ), +/* +* Reported by DocMAX <[email protected]> +* and Thomas Weißschuh <[email protected]> +*/ +UNUSUAL_DEV (0x2109 ,0x0715 ,0x9999 ,0x9999 , +"VIA Labs, Inc." , +"VL817 SATA Bridge" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_IGNORE_UAS ), + UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001, "ST", "2A",
Greg Kroah-Hartman
maintainerPATCH 74/200 usb: xhci-plat: fix crash when suspend if remote wake enable
In reply to Greg Kroah-HartmanFrom: Frank Li <[email protected]>
commit 9df478463d9feb90dae24f183383961cf123a0ec upstream.
Crashed at i.mx8qm platform when suspend if enable remote wakeup
Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP Modules linked in: CPU: 2 PID: 244 Comm: kworker/u12:6 Not tainted 5.15.5-dirty #12 Hardware name: Freescale i.MX8QM MEK (DT) Workqueue: events_unbound async_run_entry_fn pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : xhci_disable_hub_port_wake.isra.62+0x60/0xf8 lr : xhci_disable_hub_port_wake.isra.62+0x34/0xf8
sp : ffff80001394bbf0
x29: ffff80001394bbf0 x28: 0000000000000000 x27: ffff00081193b578
x26: ffff00081193b570 x25: 0000000000000000 x24: 0000000000000000
x23: ffff00081193a29c x22: 0000000000020001 x21: 0000000000000001
x20: 0000000000000000 x19: ffff800014e90490 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
x14: 0000000000000000 x13: 0000000000000002 x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000960 x9 : ffff80001394baa0 x8 : ffff0008145d1780 x7 : ffff0008f95b8e80 x6 : 000000001853b453 x5 : 0000000000000496 x4 : 0000000000000000 x3 : ffff00081193a29c x2 : 0000000000000001 x1 : 0000000000000000 x0 : ffff000814591620
Call trace: xhci_disable_hub_port_wake.isra.62+0x60/0xf8 xhci_suspend+0x58/0x510 xhci_plat_suspend+0x50/0x78 platform_pm_suspend+0x2c/0x78 dpm_run_callback.isra.25+0x50/0xe8 __device_suspend+0x108/0x3c0
The basic flow:
1. run time suspend call xhci_suspend, xhci parent devices gate the clock.
2. echo mem >/sys/power/state, system _device_suspend call xhci_suspend
3. xhci_suspend call xhci_disable_hub_port_wake, which access register, but clock already gated by run time suspend.
This problem was hidden by power domain driver, which call run time resume before it.
But the below commit remove it and make this issue happen.
commit c1df456d0f06e ("PM: domains: Don't runtime resume devices at genpd_prepare()")
This patch call run time resume before suspend to make sure clock is on before access register.
--- drivers/usb/host/xhci-plat.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/xhci-plat.c +3 -0
@@ -437,6 +437,9 @@ static int __maybe_unused xhci_plat_suspstruct xhci_hcd *xhci =hcd_to_xhci (hcd);int ret; +if (pm_runtime_suspended (dev)) +pm_runtime_resume (dev); + ret =xhci_priv_suspend_quirk (hcd);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 75/200 usb: common: ulpi: Fix crash in ulpi_match()
In reply to Greg Kroah-HartmanFrom: Jon Hunter <[email protected]>
commit 2e3dd4a6246945bf84ea6f478365d116e661554c upstream.
Commit 7495af930835 ("ARM: multi_v7_defconfig: Enable drivers for DragonBoard 410c") enables the CONFIG_PHY_QCOM_USB_HS for the ARM multi_v7_defconfig. Enabling this Kconfig is causing the kernel to crash on the Tegra20 Ventana platform in the ulpi_match() function.
The Qualcomm USB HS PHY driver that is enabled by CONFIG_PHY_QCOM_USB_HS, registers a ulpi_driver but this driver does not provide an 'id_table', so when ulpi_match() is called on the Tegra20 Ventana platform, it crashes when attempting to deference the id_table pointer which is not valid. The Qualcomm USB HS PHY driver uses device-tree for matching the ULPI driver with the device and so fix this crash by using device-tree for matching if the id_table is not valid.
--- drivers/usb/common/ulpi.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/common/ulpi.c +5 -2
@@ -39,8 +39,11 @@ static int ulpi_match(struct device *devstruct ulpi *ulpi =to_ulpi_dev (dev);const struct ulpi_device_id *id; -/* Some ULPI devices don't have a vendor id so rely on OF match */ -if (ulpi->id.vendor ==0 ) +/* +* Some ULPI devices don't have a vendor id +* or provide an id_table so rely on OF match. +*/ +if (ulpi->id.vendor ==0 || !drv->id_table)return of_driver_match_device (dev, driver);for (id = drv->id_table; id->vendor; id++)
Greg Kroah-Hartman
maintainerPATCH 76/200 usb: gadget: f_sourcesink: Fix isoc transfer for USB_SPEED_SUPER_PLUS
In reply to Greg Kroah-HartmanFrom: Pavankumar Kondeti <[email protected]>
commit 904edf8aeb459697129be5fde847e2a502f41fd9 upstream.
Currently when gadget enumerates in super speed plus, the isoc endpoint request buffer size is not calculated correctly. Fix this by checking the gadget speed against USB_SPEED_SUPER_PLUS and update the request buffer size.
--- drivers/usb/gadget/function/f_sourcesink.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/gadget/function/f_sourcesink.c +1 -0
@@ -584,6 +584,7 @@ static int source_sink_start_ep(struct fif (is_iso) {switch (speed) { +case USB_SPEED_SUPER_PLUS :case USB_SPEED_SUPER : size = ss->isoc_maxpacket * (ss->isoc_mult + 1) *
Greg Kroah-Hartman
maintainerPATCH 77/200 usb: cdnsp: Fix segmentation fault in cdns_lost_power function
In reply to Greg Kroah-HartmanFrom: Pawel Laszczak <[email protected]>
commit 79aa3e19fe8f5be30e846df8a436bfe306e8b1a6 upstream.
CDNSP driver read not initialized cdns->otg_v0_regs which lead to segmentation fault. Patch fixes this issue.
--- drivers/usb/cdns3/drd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/cdns3/drd.c +3 -3
@@ -483,11 +483,11 @@ int cdns_drd_exit(struct cdns *cdns)/* Indicate the cdns3 core was power lost before */ bool cdns_power_is_lost (struct cdns *cdns) { -if (cdns->version ==CDNS3_CONTROLLER_V1 ) { -if (!(readl (&cdns->otg_v1_regs->simulate) &BIT (0 ))) +if (cdns->version ==CDNS3_CONTROLLER_V0 ) { +if (!(readl (&cdns->otg_v0_regs->simulate) &BIT (0 )))return true; }else { -if (!(readl (&cdns->otg_v0_regs->simulate) &BIT (0 ))) +if (!(readl (&cdns->otg_v1_regs->simulate) &BIT (0 )))return true; }return false;
Greg Kroah-Hartman
maintainerPATCH 78/200 usb: dwc3: xilinx: Skip resets and USB3 register settings for USB2.0 mode
In reply to Greg Kroah-HartmanFrom: Robert Hancock <[email protected]>
commit 9678f3361afc27a3124cd2824aec0227739986fb upstream.
It appears that the PIPE clock should not be selected when only USB 2.0 is being used in the design and no USB 3.0 reference clock is used. Also, the core resets are not required if a USB3 PHY is not in use, and will break things if USB3 is actually used but the PHY entry is not listed in the device tree.
Skip core resets and register settings that are only required for USB3 mode when no USB3 PHY is specified in the device tree.
--- drivers/usb/dwc3/dwc3-xilinx.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/usb/dwc3/dwc3-xilinx.c +13 -0
@@ -110,6 +110,18 @@ static int dwc3_xlnx_init_zynqmp(struct usb3_phy =NULL ; } +/* +* The following core resets are not required unless a USB3 PHY +* is used, and the subsequent register settings are not required +* unless a core reset is performed (they should be set properly +* by the first-stage boot loader, but may be reverted by a core +* reset). They may also break the configuration if USB3 is actually +* in use but the usb3-phy entry is missing from the device tree. +* Therefore, skip these operations in this case. +*/ +if (!usb3_phy) + goto skip_usb3_phy; + crst =devm_reset_control_get_exclusive (dev,"usb_crst" );if (IS_ERR (crst)) { ret =PTR_ERR (crst);
@@ -188,6 +200,7 @@ static int dwc3_xlnx_init_zynqmp(struct goto err; } +skip_usb3_phy:/* * This routes the USB DMA traffic to go through FPD path instead * of reaching DDR directly. This traffic routing is needed to
Greg Kroah-Hartman
maintainerPATCH 79/200 usb: dwc3: xilinx: Fix error handling when getting USB3 PHY
In reply to Greg Kroah-HartmanFrom: Robert Hancock <[email protected]>
commit 2cc9b1c93b1c4caa2d971856c0780fb5f7d04692 upstream.
The code that looked up the USB3 PHY was ignoring all errors other than EPROBE_DEFER in an attempt to handle the PHY not being present. Fix and simplify the code by using devm_phy_optional_get and dev_err_probe so that a missing PHY is not treated as an error and unexpected errors are handled properly.
--- drivers/usb/dwc3/dwc3-xilinx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/usb/dwc3/dwc3-xilinx.c +5 -5
@@ -102,12 +102,12 @@ static int dwc3_xlnx_init_zynqmp(structint ret;u32 reg; - usb3_phy =devm_phy_get (dev,"usb3-phy" ); -if (PTR_ERR (usb3_phy) == -EPROBE_DEFER ) { - ret = -EPROBE_DEFER ; + usb3_phy =devm_phy_optional_get (dev,"usb3-phy" ); +if (IS_ERR (usb3_phy)) { + ret =PTR_ERR (usb3_phy); +dev_err_probe (dev, ret, +"failed to get USB3 PHY\n" ); goto err; - }else if (IS_ERR (usb3_phy)) { - usb3_phy =NULL ; }/*
Greg Kroah-Hartman
maintainerPATCH 80/200 USB: core: Fix hang in usb_kill_urb by adding memory barriers
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
commit 26fbe9772b8c459687930511444ce443011f86bf upstream.
The syzbot fuzzer has identified a bug in which processes hang waiting for usb_kill_urb() to return. It turns out the issue is not unlinking the URB; that works just fine. Rather, the problem arises when the wakeup notification that the URB has completed is not received.
The reason is memory-access ordering on SMP systems. In outline form, usb_kill_urb() and __usb_hcd_giveback_urb() operating concurrently on different CPUs perform the following actions:
CPU 0 CPU 1
---------------------------- ---------------------------------usb_kill_urb(): __usb_hcd_giveback_urb():
... ...
atomic_inc(&urb->reject); atomic_dec(&urb->use_count);
... ...
wait_event(usb_kill_urb_queue,
atomic_read(&urb->use_count) == 0); if (atomic_read(&urb->reject)) wake_up(&usb_kill_urb_queue);
Confining your attention to urb->reject and urb->use_count, you can see that the overall pattern of accesses on CPU 0 is:
write urb->reject, then read urb->use_count;
whereas the overall pattern of accesses on CPU 1 is:
write urb->use_count, then read urb->reject.
This pattern is referred to in memory-model circles as SB (for "Store Buffering"), and it is well known that without suitable enforcement of the desired order of accesses -- in the form of memory barriers -- it is entirely possible for one or both CPUs to execute their reads ahead of their writes. The end result will be that sometimes CPU 0 sees the old un-decremented value of urb->use_count while CPU 1 sees the old un-incremented value of urb->reject. Consequently CPU 0 ends up on the wait queue and never gets woken up, leading to the observed hang in usb_kill_urb().
The same pattern of accesses occurs in usb_poison_urb() and the failure pathway of usb_hcd_submit_urb().
The problem is fixed by adding suitable memory barriers. To provide proper memory-access ordering in the SB pattern, a full barrier is required on both CPUs. The atomic_inc() and atomic_dec() accesses themselves don't provide any memory ordering, but since they are present, we can use the optimized smp_mb__after_atomic() memory barrier in the various routines to obtain the desired effect.
This patch adds the necessary memory barriers.
--- drivers/usb/core/hcd.c | 14 ++++++++++++++ drivers/usb/core/urb.c | 12 ++++++++++++ 2 files changed, 26 insertions(+)
drivers/usb/core/hcd.c +14 -0
@@ -1563,6 +1563,13 @@ int usb_hcd_submit_urb (struct urb *urb, urb->hcpriv =NULL ;INIT_LIST_HEAD (&urb->urb_list);atomic_dec (&urb->use_count); +/* +* Order the write of urb->use_count above before the read +* of urb->reject below. Pairs with the memory barriers in +* usb_kill_urb() and usb_poison_urb(). +*/ +smp_mb__after_atomic (); +atomic_dec (&urb->dev->urbnum);if (atomic_read (&urb->reject))wake_up (&usb_kill_urb_queue);
@@ -1665,6 +1672,13 @@ static void __usb_hcd_giveback_urb(strucusb_anchor_resume_wakeups (anchor);atomic_dec (&urb->use_count); +/* +* Order the write of urb->use_count above before the read +* of urb->reject below. Pairs with the memory barriers in +* usb_kill_urb() and usb_poison_urb(). +*/ +smp_mb__after_atomic (); +if (unlikely (atomic_read (&urb->reject)))wake_up (&usb_kill_urb_queue);usb_put_urb (urb);
drivers/usb/core/urb.c +12 -0
@@ -715,6 +715,12 @@ void usb_kill_urb(struct urb *urb)if (!(urb && urb->dev && urb->ep))return ;atomic_inc (&urb->reject); +/* +* Order the write of urb->reject above before the read +* of urb->use_count below. Pairs with the barriers in +* __usb_hcd_giveback_urb() and usb_hcd_submit_urb(). +*/ +smp_mb__after_atomic ();usb_hcd_unlink_urb (urb, -ENOENT );wait_event (usb_kill_urb_queue,atomic_read (&urb->use_count) ==0 );
@@ -756,6 +762,12 @@ void usb_poison_urb(struct urb *urb)if (!urb)return ;atomic_inc (&urb->reject); +/* +* Order the write of urb->reject above before the read +* of urb->use_count below. Pairs with the barriers in +* __usb_hcd_giveback_urb() and usb_hcd_submit_urb(). +*/ +smp_mb__after_atomic ();if (!urb->dev || !urb->ep)return ;
Greg Kroah-Hartman
maintainerPATCH 81/200 usb: typec: tcpci: dont touch CC line if its Vconn source
In reply to Greg Kroah-HartmanFrom: Xu Yang <[email protected]>
commit 5638b0dfb6921f69943c705383ff40fb64b987f2 upstream.
With the AMS and Collision Avoidance, tcpm often needs to change the CC's termination. When one CC line is sourcing Vconn, if we still change its termination, the voltage of the another CC line is likely to be fluctuant and unstable.
Therefore, we should verify whether a CC line is sourcing Vconn before changing its termination and only change the termination that is not a Vconn line. This can be done by reading the Vconn Present bit of POWER_ STATUS register. To determine the polarity, we can read the Plug Orientation bit of TCPC_CONTROL register. Since Vconn can only be sourced if Plug Orientation is set.
--- drivers/usb/typec/tcpm/tcpci.c | 26 ++++++++++++++++++++++++++ drivers/usb/typec/tcpm/tcpci.h | 1 + 2 files changed, 27 insertions(+)
drivers/usb/typec/tcpm/tcpci.c +26 -0
@@ -75,9 +75,25 @@ static int tcpci_write16(struct tcpci *tstatic int tcpci_set_cc (struct tcpc_dev *tcpc,enum typec_cc_status cc) {struct tcpci *tcpci =tcpc_to_tcpci (tcpc); +bool vconn_pres; +enum typec_cc_polarity polarity =TYPEC_POLARITY_CC1 ;unsigned int reg;int ret; + ret =regmap_read (tcpci->regmap,TCPC_POWER_STATUS , ®); +if (ret <0 ) +return ret; + + vconn_pres = !!(reg &TCPC_POWER_STATUS_VCONN_PRES ); +if (vconn_pres) { + ret =regmap_read (tcpci->regmap,TCPC_TCPC_CTRL , ®); +if (ret <0 ) +return ret; + +if (reg &TCPC_TCPC_CTRL_ORIENTATION ) + polarity =TYPEC_POLARITY_CC2 ; + } +switch (cc) {case TYPEC_CC_RA : reg = (TCPC_ROLE_CTRL_CC_RA << TCPC_ROLE_CTRL_CC1_SHIFT) |
@@ -112,6 +128,16 @@ static int tcpci_set_cc(struct tcpc_devbreak ; } +if (vconn_pres) { +if (polarity ==TYPEC_POLARITY_CC2 ) { + reg &= ~(TCPC_ROLE_CTRL_CC1_MASK <<TCPC_ROLE_CTRL_CC1_SHIFT ); + reg |= (TCPC_ROLE_CTRL_CC_OPEN <<TCPC_ROLE_CTRL_CC1_SHIFT ); + }else { + reg &= ~(TCPC_ROLE_CTRL_CC2_MASK <<TCPC_ROLE_CTRL_CC2_SHIFT ); + reg |= (TCPC_ROLE_CTRL_CC_OPEN <<TCPC_ROLE_CTRL_CC2_SHIFT ); + } + } + ret =regmap_write (tcpci->regmap,TCPC_ROLE_CTRL , reg);if (ret <0 )return ret;
drivers/usb/typec/tcpm/tcpci.h +1 -0
@@ -98,6 +98,7 @@#define TCPC_POWER_STATUS_SOURCING_VBUS BIT(4)#define TCPC_POWER_STATUS_VBUS_DET BIT(3)#define TCPC_POWER_STATUS_VBUS_PRES BIT(2) +#define TCPC_POWER_STATUS_VCONN_PRES BIT(1)#define TCPC_POWER_STATUS_SINKING_VBUS BIT(0)#define TCPC_FAULT_STATUS 0x1f
Greg Kroah-Hartman
maintainerPATCH 82/200 usb: typec: tcpm: Do not disconnect while receiving VBUS off
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit 90b8aa9f5b09edae6928c0561f933fec9f7a9987 upstream.
With some chargers, vbus might momentarily raise above VSAFE5V and fall back to 0V before tcpm gets to read port->tcpc->get_vbus. This will will report a VBUS off event causing TCPM to transition to SNK_UNATTACHED where it should be waiting in either SNK_ATTACH_WAIT or SNK_DEBOUNCED state. This patch makes TCPM avoid vbus off events while in SNK_ATTACH_WAIT or SNK_DEBOUNCED state.
Stub from the spec:
"4.5.2.2.4.2 Exiting from AttachWait.SNK State
A Sink shall transition to Unattached.SNK when the state of both the CC1 and CC2 pins is SNK.Open for at least tPDDebounce. A DRP shall transition to Unattached.SRC when the state of both the CC1 and CC2 pins is SNK.Open for at least tPDDebounce."
[23.194131] CC1: 0 -> 0, CC2: 0 -> 5 [state SNK_UNATTACHED, polarity 0, connected] [23.201777] state change SNK_UNATTACHED -> SNK_ATTACH_WAIT [rev3 NONE_AMS] [23.209949] pending state change SNK_ATTACH_WAIT -> SNK_DEBOUNCED @ 170 ms [rev3 NONE_AMS] [23.300579] VBUS off [23.300668] state change SNK_ATTACH_WAIT -> SNK_UNATTACHED [rev3 NONE_AMS] [23.301014] VBUS VSAFE0V [23.301111] Start toggling
--- drivers/usb/typec/tcpm/tcpm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/typec/tcpm/tcpm.c +2 -1
@@ -5156,7 +5156,8 @@ static void _tcpm_pd_vbus_off(struct tcpcase SNK_TRYWAIT_DEBOUNCE :break ;case SNK_ATTACH_WAIT : -tcpm_set_state (port,SNK_UNATTACHED ,0 ); +case SNK_DEBOUNCED : +/* Do nothing, as TCPM is still waiting for vbus to reaach VSAFE5V to connect */ break ;case SNK_NEGOTIATE_CAPABILITIES :
Greg Kroah-Hartman
maintainerPATCH 83/200 usb: typec: tcpm: Do not disconnect when receiving VSAFE0V
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit 746f96e7d6f7a276726860f696671766bfb24cf0 upstream.
With some chargers, vbus might momentarily raise above VSAFE5V and fall back to 0V causing VSAFE0V to be triggered. This will
will report a VBUS off event causing TCPM to transition to SNK_UNATTACHED state where it should be waiting in either SNK_ATTACH_WAIT or SNK_DEBOUNCED state. This patch makes TCPM avoid VSAFE0V events while in SNK_ATTACH_WAIT or SNK_DEBOUNCED state.
Stub from the spec:
"4.5.2.2.4.2 Exiting from AttachWait.SNK State
A Sink shall transition to Unattached.SNK when the state of both the CC1 and CC2 pins is SNK.Open for at least tPDDebounce. A DRP shall transition to Unattached.SRC when the state of both the CC1 and CC2 pins is SNK.Open for at least tPDDebounce."
[23.194131] CC1: 0 -> 0, CC2: 0 -> 5 [state SNK_UNATTACHED, polarity 0, connected] [23.201777] state change SNK_UNATTACHED -> SNK_ATTACH_WAIT [rev3 NONE_AMS] [23.209949] pending state change SNK_ATTACH_WAIT -> SNK_DEBOUNCED @ 170 ms [rev3 NONE_AMS] [23.300579] VBUS off [23.300668] state change SNK_ATTACH_WAIT -> SNK_UNATTACHED [rev3 NONE_AMS] [23.301014] VBUS VSAFE0V [23.301111] Start toggling
--- drivers/usb/typec/tcpm/tcpm.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/typec/tcpm/tcpm.c +4 -0
@@ -5264,6 +5264,10 @@ static void _tcpm_pd_vbus_vsafe0v(structcase PR_SWAP_SNK_SRC_SOURCE_ON :/* Do nothing, vsafe0v is expected during transition */ break ; +case SNK_ATTACH_WAIT : +case SNK_DEBOUNCED : +/*Do nothing, still waiting for VSAFE5V for connect */ +break ;default :if (port->pwr_role ==TYPEC_SINK && port->auto_vbus_discharge_enabled)tcpm_set_state (port,SNK_UNATTACHED ,0 );
Greg Kroah-Hartman
maintainerPATCH 84/200 ucsi_ccg: Check DEV_INT bit only when starting CCG4
In reply to Greg Kroah-HartmanFrom: Sing-Han Chen <[email protected]>
commit 825911492eb15bf8bb7fb94bc0c0421fe7a6327d upstream.
CCGx clears Bit 0:Device Interrupt in the INTR_REG if CCGx is reset successfully. However, there might be a chance that other bits in INTR_REG are not cleared due to internal data queued in PPM. This case misleads the driver that CCGx reset failed.
The commit checks bit 0 in INTR_REG and ignores other bits. The ucsi driver would reset PPM later.
--- drivers/usb/typec/ucsi/ucsi_ccg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/typec/ucsi/ucsi_ccg.c +1 -1
@@ -325,7 +325,7 @@ static int ucsi_ccg_init(struct ucsi_ccgif (status <0 )return status; -if (!data) +if (!(data &DEV_INT ))return 0 ; status =ccg_write (uc,CCGX_RAB_INTR_REG , &data,sizeof (data));
Greg Kroah-Hartman
maintainerPATCH 85/200 mt76: connac: introduce MCU_CE_CMD macro
In reply to Greg Kroah-HartmanFrom: Lorenzo Bianconi <[email protected]>
commit 680a2ead741ad9b479a53adf154ed5eee74d2b9a upstream.
Similar to MCU_EXT_CMD, introduce MCU_CE_CMD for CE commands
Stable kernel notes:
Upstream commit 547224024579 (mt76: connac: introduce MCU_UNI_CMD macro, 2021-12-09) introduced a bug by removing MCU_UNI_PREFIX, but not updating MCU_CMD_MASK accordingly, so when commands are compared in mt7921_mcu_parse_response() one has the extra bit __MCU_CMD_FIELD_UNI set and the comparison fails:
if (mcu_cmd != event->cid)
if (20001 != 1)
The fix was sneaked by in the next commit 680a2ead741a (mt76: connac:
introduce MCU_CE_CMD macro, 2021-12-09):
- int mcu_cmd = cmd & MCU_CMD_MASK;
+ int mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
But it was never merged into linux-stable.
We need either both commits, or none.
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 16 +++--- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 47 ++++++++++-------- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h | 48 +++++++++---------- drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 24 ++++----- drivers/net/wireless/mediatek/mt76/mt7921/testmode.c | 4 - 5 files changed, 73 insertions(+), 66 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +8 -8
@@ -145,7 +145,7 @@ void mt7615_mcu_fill_msg(struct mt7615_d mcu_txd->cid = mcu_cmd; mcu_txd->ext_cid =FIELD_GET (__MCU_CMD_FIELD_EXT_ID, cmd); -if (mcu_txd->ext_cid || (cmd &MCU_CE_PREFIX )) { +if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {if (cmd & __MCU_CMD_FIELD_QUERY) mcu_txd->set_query =MCU_Q_QUERY ;else
@@ -193,7 +193,7 @@ int mt7615_mcu_parse_response(struct mt7skb_pull (skb,sizeof (*rxd)); event = (struct mt7615_mcu_uni_event *)skb->data; ret =le32_to_cpu (event->status); - }else if (cmd ==MCU_CMD_REG_READ ) { + }else if (cmd ==MCU_CE_QUERY (REG_READ )) {struct mt7615_mcu_reg_event *event;skb_pull (skb,sizeof (*rxd));
@@ -2737,13 +2737,13 @@ int mt7615_mcu_set_bss_pm(struct mt7615_if (vif->type !=NL80211_IFTYPE_STATION )return 0 ; - err =mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_ABORT , &req_hdr, -sizeof (req_hdr), false); + err =mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_BSS_ABORT ), + &req_hdr,sizeof (req_hdr), false);if (err <0 || !enable)return err; -return mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_CONNECTED , &req, -sizeof (req), false); +return mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_BSS_CONNECTED ), + &req,sizeof (req), false); } int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
@@ -2762,6 +2762,6 @@ int mt7615_mcu_set_roc(struct mt7615_phy phy->roc_grant = false; -return mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_ROC , &req, -sizeof (req), false); +return mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_ROC ), + &req,sizeof (req), false); }
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +26 -21
125 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +25 -23
70 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +12 -12
@@ -163,8 +163,8 @@ mt7921_mcu_parse_eeprom(struct mt76_devint mt7921_mcu_parse_response (struct mt76_dev *mdev,int cmd,struct sk_buff *skb,int seq) { +int mcu_cmd =FIELD_GET (__MCU_CMD_FIELD_ID, cmd);struct mt7921_mcu_rxd *rxd; -int mcu_cmd = cmd &MCU_CMD_MASK ;int ret =0 ;if (!skb) {
@@ -201,7 +201,7 @@ int mt7921_mcu_parse_response(struct mt7/* skip invalid event */ if (mcu_cmd != event->cid) ret = -EAGAIN ; - }else if (cmd ==MCU_CMD_REG_READ ) { + }else if (cmd ==MCU_CE_QUERY (REG_READ )) {struct mt7921_mcu_reg_event *event;skb_pull (skb,sizeof (*rxd));
@@ -274,7 +274,7 @@ int mt7921_mcu_fill_message(struct mt76_ mcu_txd->s2d_index =MCU_S2D_H2N ; mcu_txd->ext_cid =FIELD_GET (__MCU_CMD_FIELD_EXT_ID, cmd); -if (mcu_txd->ext_cid || (cmd &MCU_CE_PREFIX )) { +if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {if (cmd & __MCU_CMD_FIELD_QUERY) mcu_txd->set_query =MCU_Q_QUERY ;else
@@ -883,8 +883,8 @@ int mt7921_mcu_fw_log_2_host(struct mt79 .ctrl_val = ctrl }; -return mt76_mcu_send_msg (&dev->mt76,MCU_CMD_FWLOG_2_HOST , &data, -sizeof (data), false); +return mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (FWLOG_2_HOST ), + &data,sizeof (data), false); }int mt7921_run_firmware (struct mt7921_dev *dev)
@@ -1009,8 +1009,8 @@ int mt7921_mcu_set_tx(struct mt7921_dev e->timer = q->mu_edca_timer; } -return mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_MU_EDCA_PARMS , &req_mu, -sizeof (req_mu), false); +return mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_MU_EDCA_PARMS ), + &req_mu,sizeof (req_mu), false); }int mt7921_mcu_set_chan_info (struct mt7921_phy *phy,int cmd)
@@ -1214,13 +1214,13 @@ mt7921_mcu_set_bss_pm(struct mt7921_devif (vif->type !=NL80211_IFTYPE_STATION )return 0 ; - err =mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_ABORT , &req_hdr, -sizeof (req_hdr), false); + err =mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_BSS_ABORT ), + &req_hdr,sizeof (req_hdr), false);if (err <0 || !enable)return err; -return mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_CONNECTED , &req, -sizeof (req), false); +return mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (SET_BSS_CONNECTED ), + &req,sizeof (req), false); } int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
@@ -1330,7 +1330,7 @@ int mt7921_get_txpwr_info(struct mt7921_struct sk_buff *skb;int ret; - ret =mt76_mcu_send_and_get_msg (&dev->mt76,MCU_CMD_GET_TXPWR , + ret =mt76_mcu_send_and_get_msg (&dev->mt76,MCU_CE_CMD (GET_TXPWR ), &req,sizeof (req), true, &skb);if (ret)return ret;
drivers/net/wireless/mediatek/mt76/mt7921/testmode.c +2 -2
@@ -66,7 +66,7 @@ mt7921_tm_set(struct mt7921_dev *dev, stif (!mt76_testmode_enabled (phy)) goto out; - ret =mt76_mcu_send_msg (&dev->mt76,MCU_CMD_TEST_CTRL , &cmd, + ret =mt76_mcu_send_msg (&dev->mt76,MCU_CE_CMD (TEST_CTRL ), &cmd,sizeof (cmd), false);if (ret) goto out;
@@ -95,7 +95,7 @@ mt7921_tm_query(struct mt7921_dev *dev,struct sk_buff *skb;int ret; - ret =mt76_mcu_send_and_get_msg (&dev->mt76,MCU_CMD_TEST_CTRL , + ret =mt76_mcu_send_and_get_msg (&dev->mt76,MCU_CE_CMD (TEST_CTRL ), &cmd,sizeof (cmd), true, &skb);if (ret) goto out;
Greg Kroah-Hartman
maintainerPATCH 86/200 mm, kasan: use compare-exchange operation to set KASAN page tag
In reply to Greg Kroah-HartmanFrom: Peter Collingbourne <[email protected]>
commit 27fe73394a1c6d0b07fa4d95f1bca116d1cc66e9 upstream.
It has been reported that the tag setting operation on newly-allocated pages can cause the page flags to be corrupted when performed concurrently with other flag updates as a result of the use of non-atomic operations.
Fix the problem by using a compare-exchange loop to update the tag.
--- include/linux/mm.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
include/linux/mm.h +12 -5
@@ -1524,11 +1524,18 @@ static inline u8 page_kasan_tag(const ststatic inline void page_kasan_tag_set (struct page *page,u8 tag) { -if (kasan_enabled ()) { - tag ^=0xff ; - page->flags &= ~(KASAN_TAG_MASK <<KASAN_TAG_PGSHIFT ); - page->flags |= (tag &KASAN_TAG_MASK ) <<KASAN_TAG_PGSHIFT ; - } +unsigned long old_flags, flags; + +if (!kasan_enabled ()) +return ; + + tag ^=0xff ; + old_flags =READ_ONCE (page->flags); +do { + flags = old_flags; + flags &= ~(KASAN_TAG_MASK <<KASAN_TAG_PGSHIFT ); + flags |= (tag &KASAN_TAG_MASK ) <<KASAN_TAG_PGSHIFT ; + }while (unlikely (!try_cmpxchg (&page->flags, &old_flags, flags))); }static inline void page_kasan_tag_reset (struct page *page)
Greg Kroah-Hartman
maintainerPATCH 87/200 jbd2: export jbd2_journal_[grab|put]_journal_head
In reply to Greg Kroah-HartmanFrom: Joseph Qi <[email protected]>
commit 4cd1103d8c66b2cdb7e64385c274edb0ac5e8887 upstream.
Patch series "ocfs2: fix a deadlock case".
This fixes a deadlock case in ocfs2. We firstly export jbd2 symbols jbd2_journal_[grab|put]_journal_head as preparation and later use them in ocfs2 insread of jbd_[lock|unlock]_bh_journal_head to fix the deadlock.
This patch (of 2):
This exports symbols jbd2_journal_[grab|put]_journal_head, which will be used outside modules, e.g. ocfs2.
--- fs/jbd2/journal.c | 2 ++ 1 file changed, 2 insertions(+)
fs/jbd2/journal.c +2 -0
@@ -2970,6 +2970,7 @@ struct journal_head *jbd2_journal_grab_jjbd_unlock_bh_journal_head (bh);return jh; } +EXPORT_SYMBOL (jbd2_journal_grab_journal_head);static void __journal_remove_journal_head (struct buffer_head *bh) {
@@ -3022,6 +3023,7 @@ void jbd2_journal_put_journal_head(strucjbd_unlock_bh_journal_head (bh); } } +EXPORT_SYMBOL (jbd2_journal_put_journal_head);/* * Initialize jbd inode head
Greg Kroah-Hartman
maintainerPATCH 88/200 ocfs2: fix a deadlock when commit trans
In reply to Greg Kroah-HartmanFrom: Joseph Qi <[email protected]>
commit ddf4b773aa40790dfa936bd845c18e735a49c61c upstream.
commit 6f1b228529ae introduces a regression which can deadlock as follows:
Task1: Task2: jbd2_journal_commit_transaction ocfs2_test_bg_bit_allocatable spin_lock(&jh->b_state_lock) jbd_lock_bh_journal_head __jbd2_journal_remove_checkpoint spin_lock(&jh->b_state_lock)
jbd2_journal_put_journal_head
jbd_lock_bh_journal_head
Task1 and Task2 lock bh->b_state and jh->b_state_lock in different order, which finally result in a deadlock.
So use jbd2_journal_[grab|put]_journal_head instead in ocfs2_test_bg_bit_allocatable() to fix it.
--- fs/ocfs2/suballoc.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-)
fs/ocfs2/suballoc.c +11 -14
@@ -1251,26 +1251,23 @@ static int ocfs2_test_bg_bit_allocatable {struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data;struct journal_head *jh; -int ret =1 ; +int ret;if (ocfs2_test_bit (nr, (unsigned long *)bg->bg_bitmap))return 0 ; -if (!buffer_jbd (bg_bh)) + jh =jbd2_journal_grab_journal_head (bg_bh); +if (!jh)return 1 ; -jbd_lock_bh_journal_head (bg_bh); -if (buffer_jbd (bg_bh)) { - jh =bh2jh (bg_bh); -spin_lock (&jh->b_state_lock); - bg = (struct ocfs2_group_desc *) jh->b_committed_data; -if (bg) - ret = !ocfs2_test_bit (nr, (unsigned long *)bg->bg_bitmap); -else - ret =1 ; -spin_unlock (&jh->b_state_lock); - } -jbd_unlock_bh_journal_head (bg_bh); +spin_lock (&jh->b_state_lock); + bg = (struct ocfs2_group_desc *) jh->b_committed_data; +if (bg) + ret = !ocfs2_test_bit (nr, (unsigned long *)bg->bg_bitmap); +else + ret =1 ; +spin_unlock (&jh->b_state_lock); +jbd2_journal_put_journal_head (jh);return ret; }
Greg Kroah-Hartman
maintainerPATCH 89/200 sched/membarrier: Fix membarrier-rseq fence command missing from query bitmask
In reply to Greg Kroah-HartmanFrom: Mathieu Desnoyers <[email protected]>
commit 809232619f5b15e31fb3563985e705454f32621f upstream.
The membarrier command MEMBARRIER_CMD_QUERY allows querying the available membarrier commands. When the membarrier-rseq fence commands were added, a new MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ_BITMASK was introduced with the intent to expose them with the MEMBARRIER_CMD_QUERY command, the but it was never added to MEMBARRIER_CMD_BITMASK.
The membarrier-rseq fence commands are therefore not wired up with the query command.
Rename MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ_BITMASK to MEMBARRIER_PRIVATE_EXPEDITED_RSEQ_BITMASK (the bitmask is not a command per-se), and change the erroneous MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ_BITMASK (which does not actually exist) to MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ.
Wire up MEMBARRIER_PRIVATE_EXPEDITED_RSEQ_BITMASK in MEMBARRIER_CMD_BITMASK. Fixing this allows discovering availability of the membarrier-rseq fence feature.
--- kernel/sched/membarrier.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
kernel/sched/membarrier.c +5 -4
@@ -147,11 +147,11 @@#endif #ifdef CONFIG_RSEQ -#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ_BITMASK \ +#define MEMBARRIER_PRIVATE_EXPEDITED_RSEQ_BITMASK \ (MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ \ - | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ_BITMASK) + | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ)#else -#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ_BITMASK 0 +#define MEMBARRIER_PRIVATE_EXPEDITED_RSEQ_BITMASK 0#endif #define MEMBARRIER_CMD_BITMASK \
@@ -159,7 +159,8 @@ | MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED \ | MEMBARRIER_CMD_PRIVATE_EXPEDITED \ | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED \ - | MEMBARRIER_PRIVATE_EXPEDITED_SYNC_CORE_BITMASK) + | MEMBARRIER_PRIVATE_EXPEDITED_SYNC_CORE_BITMASK \ + | MEMBARRIER_PRIVATE_EXPEDITED_RSEQ_BITMASK)static void ipi_mb (void *info) {
Greg Kroah-Hartman
maintainerPATCH 90/200 PCI/sysfs: Find shadow ROM before static attribute initialization
In reply to Greg Kroah-HartmanFrom: Bjorn Helgaas <[email protected]>
commit 66d28b21fe6b3da8d1e9f0a7ba38bc61b6c547e1 upstream.
Ville reported that the sysfs "rom" file for VGA devices disappeared after 527139d738d7 ("PCI/sysfs: Convert "rom" to static attribute").
Prior to 527139d738d7, FINAL fixups, including pci_fixup_video() where we find shadow ROMs, were run before pci_create_sysfs_dev_files() created the sysfs "rom" file.
After 527139d738d7, "rom" is a static attribute and is created before FINAL fixups are run, so we didn't create "rom" files for shadow ROMs:
acpi_pci_root_add
...
pci_scan_single_device
pci_device_add
pci_fixup_video # <-- new HEADER fixup
device_add
...
if (grp->is_visible())
pci_dev_rom_attr_is_visible # after 527139d738d7
pci_bus_add_devices
pci_bus_add_device
pci_fixup_device(pci_fixup_final)
pci_fixup_video # <-- previous FINAL fixup
pci_create_sysfs_dev_files
if (pci_resource_len(pdev, PCI_ROM_RESOURCE))
sysfs_create_bin_file("rom") # before 527139d738d7Change pci_fixup_video() to be a HEADER fixup so it runs before sysfs static attributes are initialized.
Rename the Loongson pci_fixup_radeon() to pci_fixup_video() and make its dmesg logging identical to the others since it is doing the same job.
--- arch/ia64/pci/fixup.c | 4 ++-- arch/mips/loongson64/vbios_quirk.c | 9 ++++----- arch/x86/pci/fixup.c | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-)
arch/ia64/pci/fixup.c +2 -2
@@ -76,5 +76,5 @@ static void pci_fixup_video(struct pci_d } } } -DECLARE_PCI_FIXUP_CLASS_FINAL (PCI_ANY_ID ,PCI_ANY_ID , -PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_video); +DECLARE_PCI_FIXUP_CLASS_HEADER (PCI_ANY_ID ,PCI_ANY_ID , +PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_video);
arch/mips/loongson64/vbios_quirk.c +4 -5
@@ -3,7 +3,7 @@#include <linux/pci.h> #include <loongson.h> -static void pci_fixup_radeon (struct pci_dev *pdev) +static void pci_fixup_video (struct pci_dev *pdev) {struct resource *res = &pdev->resource[PCI_ROM_RESOURCE ];
@@ -22,8 +22,7 @@ static void pci_fixup_radeon(struct pci_ res->flags =IORESOURCE_MEM |IORESOURCE_ROM_SHADOW |IORESOURCE_PCI_FIXED ; -dev_info (&pdev->dev,"BAR %d: assigned %pR for Radeon ROM\n" , -PCI_ROM_RESOURCE , res); +dev_info (&pdev->dev,"Video device with shadowed ROM at %pR\n" , res); } -DECLARE_PCI_FIXUP_CLASS_FINAL (PCI_VENDOR_ID_ATI ,0x9615 , -PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_radeon); +DECLARE_PCI_FIXUP_CLASS_HEADER (PCI_VENDOR_ID_ATI ,0x9615 , +PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_video);
arch/x86/pci/fixup.c +2 -2
@@ -353,8 +353,8 @@ static void pci_fixup_video(struct pci_d } } } -DECLARE_PCI_FIXUP_CLASS_FINAL (PCI_ANY_ID ,PCI_ANY_ID , -PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_video); +DECLARE_PCI_FIXUP_CLASS_HEADER (PCI_ANY_ID ,PCI_ANY_ID , +PCI_CLASS_DISPLAY_VGA ,8 , pci_fixup_video);static const struct dmi_system_id msi_k8t_dmi_table[] = {
Greg Kroah-Hartman
maintainerPATCH 91/200 x86/MCE/AMD: Allow thresholding interface updates after init
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
commit 1f52b0aba6fd37653416375cb8a1ca673acf8d5f upstream.
Changes to the AMD Thresholding sysfs code prevents sysfs writes from updating the underlying registers once CPU init is completed, i.e. "threshold_banks" is set.
Allow the registers to be updated if the thresholding interface is already initialized or if in the init path. Use the "set_lvt_off" value to indicate if running in the init path, since this value is only set during init.
--- arch/x86/kernel/cpu/mce/amd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/mce/amd.c +1 -1
@@ -401,7 +401,7 @@ static void threshold_restart_bank(voidu32 hi, lo;/* sysfs write might race against an offline operation */ -if (this_cpu_read (threshold_banks)) +if (!this_cpu_read (threshold_banks) && !tr->set_lvt_off)return ;rdmsr (tr->b->address, lo, hi);
Greg Kroah-Hartman
maintainerPATCH 92/200 x86/cpu: Add Xeon Icelake-D to list of CPUs that support PPIN
In reply to Greg Kroah-HartmanFrom: Tony Luck <[email protected]>
commit e464121f2d40eabc7d11823fb26db807ce945df4 upstream.
Missed adding the Icelake-D CPU to the list. It uses the same MSRs to control and read the inventory number as all the other models.
--- arch/x86/kernel/cpu/mce/intel.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kernel/cpu/mce/intel.c +1 -0
@@ -486,6 +486,7 @@ static void intel_ppin_init(struct cpuincase INTEL_FAM6_BROADWELL_X :case INTEL_FAM6_SKYLAKE_X :case INTEL_FAM6_ICELAKE_X : +case INTEL_FAM6_ICELAKE_D :case INTEL_FAM6_SAPPHIRERAPIDS_X :case INTEL_FAM6_XEON_PHI_KNL :case INTEL_FAM6_XEON_PHI_KNM :
Greg Kroah-Hartman
maintainerPATCH 93/200 powerpc/32s: Allocate one 256k IBAT instead of two consecutives 128k IBATs
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit 37eb7ca91b692e8e49e7dd50158349a6c8fb5b09 upstream.
Today we have the following IBATs allocated:
---[ Instruction Block Address Translation ]--- 0: 0xc0000000-0xc03fffff 0x00000000 4M Kernel x m 1: 0xc0400000-0xc05fffff 0x00400000 2M Kernel x m 2: 0xc0600000-0xc06fffff 0x00600000 1M Kernel x m 3: 0xc0700000-0xc077ffff 0x00700000 512K Kernel x m 4: 0xc0780000-0xc079ffff 0x00780000 128K Kernel x m 5: 0xc07a0000-0xc07bffff 0x007a0000 128K Kernel x m 6: - 7: -
The two 128K should be a single 256K instead.
When _etext is not aligned to 128Kbytes, the system will allocate all necessary BATs to the lower 128Kbytes boundary, then allocate an additional 128Kbytes BAT for the remaining block.
Instead, align the top to 128Kbytes so that the function directly allocates a 256Kbytes last block:
---[ Instruction Block Address Translation ]--- 0: 0xc0000000-0xc03fffff 0x00000000 4M Kernel x m 1: 0xc0400000-0xc05fffff 0x00400000 2M Kernel x m 2: 0xc0600000-0xc06fffff 0x00600000 1M Kernel x m 3: 0xc0700000-0xc077ffff 0x00700000 512K Kernel x m 4: 0xc0780000-0xc07bffff 0x00780000 256K Kernel x m 5: - 6: - 7: -
--- arch/powerpc/mm/book3s32/mmu.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/powerpc/mm/book3s32/mmu.c +2 -3
@@ -196,18 +196,17 @@ void mmu_mark_initmem_nx(void)int nb =mmu_has_feature (MMU_FTR_USE_HIGH_BATS ) ?8 :4 ;int i;unsigned long base = (unsigned long )_stext -PAGE_OFFSET ; -unsigned long top = (unsigned long )_etext -PAGE_OFFSET ; +unsigned long top =ALIGN ((unsigned long )_etext -PAGE_OFFSET ,SZ_128K );unsigned long border = (unsigned long )__init_begin -PAGE_OFFSET ;unsigned long size; -for (i =0 ; i < nb -1 && base < top && top - base > (128 <<10 );) { +for (i =0 ; i < nb -1 && base < top;) { size =block_size (base, top);setibat (i++,PAGE_OFFSET + base, base, size,PAGE_KERNEL_TEXT ); base += size; }if (base < top) { size =block_size (base, top); - size =max (size,128UL <<10 );if ((top - base) > size) { size <<=1 ;if (strict_kernel_rwx_enabled () && base + size > border)
Greg Kroah-Hartman
maintainerPATCH 94/200 powerpc/32s: Fix kasan_init_region() for KASAN
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit d37823c3528e5e0705fc7746bcbc2afffb619259 upstream.
It has been reported some configuration where the kernel doesn't boot with KASAN enabled.
This is due to wrong BAT allocation for the KASAN area:
---[ Data Block Address Translation ]--- 0: 0xc0000000-0xcfffffff 0x00000000 256M Kernel rw m 1: 0xd0000000-0xdfffffff 0x10000000 256M Kernel rw m 2: 0xe0000000-0xefffffff 0x20000000 256M Kernel rw m 3: 0xf8000000-0xf9ffffff 0x2a000000 32M Kernel rw m 4: 0xfa000000-0xfdffffff 0x2c000000 64M Kernel rw m
A BAT must have both virtual and physical addresses alignment matching the size of the BAT. This is not the case for BAT 4 above.
Fix kasan_init_region() by using block_size() function that is in book3s32/mmu.c. To be able to reuse it here, make it non static and change its name to bat_block_size() in order to avoid name conflict with block_size() defined in <linux/blkdev.h>
Also reuse find_free_bat() to avoid an error message from setbat() when no BAT is available.
And allocate memory outside of linear memory mapping to avoid wasting that precious space.
With this change we get correct alignment for BATs and KASAN shadow memory is allocated outside the linear memory space.
---[ Data Block Address Translation ]--- 0: 0xc0000000-0xcfffffff 0x00000000 256M Kernel rw 1: 0xd0000000-0xdfffffff 0x10000000 256M Kernel rw 2: 0xe0000000-0xefffffff 0x20000000 256M Kernel rw 3: 0xf8000000-0xfbffffff 0x7c000000 64M Kernel rw 4: 0xfc000000-0xfdffffff 0x7a000000 32M Kernel rw
--- arch/powerpc/include/asm/book3s/32/mmu-hash.h | 2 arch/powerpc/mm/book3s32/mmu.c | 10 ++-- arch/powerpc/mm/kasan/book3s_32.c | 57 +++++++++++++------------- 3 files changed, 37 insertions(+), 32 deletions(-)
arch/powerpc/include/asm/book3s/32/mmu-hash.h +2 -0
@@ -143,6 +143,8 @@ static __always_inline void update_user_ update_user_segment(15, val); } +int __init find_free_bat (void ); +unsigned int bat_block_size (unsigned long base,unsigned long top);#endif /* !__ASSEMBLY__ */ /* We happily ignore the smaller BATs on 601, we don't actually use
arch/powerpc/mm/book3s32/mmu.c +5 -5
@@ -76,7 +76,7 @@ unsigned long p_block_mapped(phys_addr_treturn 0 ; } -static int find_free_bat (void ) +int __init find_free_bat (void ) {int b;int n =mmu_has_feature (MMU_FTR_USE_HIGH_BATS ) ?8 :4 ;
@@ -100,7 +100,7 @@ static int find_free_bat(void)* - block size has to be a power of two. This is calculated by finding the * highest bit set to 1. */ -static unsigned int block_size (unsigned long base,unsigned long top) +unsigned int bat_block_size (unsigned long base,unsigned long top) {unsigned int max_size =SZ_256M ;unsigned int base_shift = (ffs (base) -1 ) &31 ;
@@ -145,7 +145,7 @@ static unsigned long __init __mmu_mapin_int idx;while ((idx =find_free_bat ()) !=-1 && base != top) { -unsigned int size =block_size (base, top); +unsigned int size =bat_block_size (base, top);if (size <128 <<10 )break ;
@@ -201,12 +201,12 @@ void mmu_mark_initmem_nx(void)unsigned long size;for (i =0 ; i < nb -1 && base < top;) { - size =block_size (base, top); + size =bat_block_size (base, top);setibat (i++,PAGE_OFFSET + base, base, size,PAGE_KERNEL_TEXT ); base += size; }if (base < top) { - size =block_size (base, top); + size =bat_block_size (base, top);if ((top - base) > size) { size <<=1 ;if (strict_kernel_rwx_enabled () && base + size > border)
arch/powerpc/mm/kasan/book3s_32.c +30 -27
78 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 95/200 powerpc/32: Fix boot failure with GCC latent entropy plugin
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit bba496656a73fc1d1330b49c7f82843836e9feb1 upstream.
Boot fails with GCC latent entropy plugin enabled.
This is due to early boot functions trying to access 'latent_entropy' global data while the kernel is not relocated at its final destination yet.
As there is no way to tell GCC to use PTRRELOC() to access it, disable latent entropy plugin in early_32.o and feature-fixups.o and code-patching.o
--- arch/powerpc/kernel/Makefile | 1 + arch/powerpc/lib/Makefile | 3 +++ 2 files changed, 4 insertions(+)
arch/powerpc/kernel/Makefile +1 -0
@@ -11,6 +11,7 @@ CFLAGS_prom_init.o += -fPIC CFLAGS_btext.o += -fPIC endif +CFLAGS_early_32.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) CFLAGS_cputable.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) CFLAGS_prom_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) CFLAGS_btext.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
arch/powerpc/lib/Makefile +3 -0
@@ -19,6 +19,9 @@ CFLAGS_code-patching.o += -DDISABLE_BRAN CFLAGS_feature-fixups.o += -DDISABLE_BRANCH_PROFILING endif +CFLAGS_code-patching.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) +CFLAGS_feature-fixups.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) + obj-y += alloc.o code-patching.o feature-fixups.o pmem.o test_code-patching.o ifndef CONFIG_KASAN
Greg Kroah-Hartman
maintainerPATCH 96/200 i40e: Increase delay to 1 s after global EMP reset
In reply to Greg Kroah-HartmanFrom: Jedrzej Jagielski <[email protected]>
commit 9b13bd53134c9ddd544a790125199fdbdb505e67 upstream.
Recently simplified i40e_rebuild causes that FW sometimes is not ready after NVM update, the ping does not return.
Increase the delay in case of EMP reset.
Old delay of 300 ms was introduced for specific cards for 710 series. Now it works for all the cards and delay was increased.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +3 -9
@@ -10574,15 +10574,9 @@ static void i40e_rebuild(struct i40e_pf }i40e_get_oem_version (&pf->hw); -if (test_bit (__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && - ((hw->aq.fw_maj_ver ==4 && hw->aq.fw_min_ver <=33 ) || - hw->aq.fw_maj_ver <4 ) && hw->mac.type ==I40E_MAC_XL710 ) { -/* The following delay is necessary for 4.33 firmware and older -* to recover after EMP reset. 200 ms should suffice but we -* put here 300 ms to be sure that FW is ready to operate -* after reset. -*/ -mdelay (300 ); +if (test_and_clear_bit (__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) { +/* The following delay is necessary for firmware update. */ +mdelay (1000 ); }/* re-verify the eeprom if we just had an EMP reset */
Greg Kroah-Hartman
maintainerPATCH 97/200 i40e: Fix issue when maximum queues is exceeded
In reply to Greg Kroah-HartmanFrom: Jedrzej Jagielski <[email protected]>
commit d701658a50a471591094b3eb3961b4926cc8f104 upstream.
Before this patch VF interface vanished when maximum queue number was exceeded. Driver tried to add next queues even if there was not enough space. PF sent incorrect number of queues to
the VF when there were not enough of them.
Add an additional condition introduced to check available space in 'qp_pile' before proceeding. This condition makes it impossible to add queues if they number is greater than the number resulting from available space.
Also add the search for free space in PF queue pair piles.
Without this patch VF interfaces are not seen
when available space for queues has been
exceeded and following logs appears permanently
in dmesg:
"Unable to get VF config (-32)".
"VF 62 failed opcode 3, retval: -5"
"Unable to get VF config due to PF error condition, not retrying"
--- drivers/net/ethernet/intel/i40e/i40e.h | 1 drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ---- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 59 +++++++++++++++++++++ 3 files changed, 61 insertions(+), 13 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +0 -1
@@ -174,7 +174,6 @@ enum i40e_interrupt_policy {struct i40e_lump_tracking {u16 num_entries; -u16 search_hint;u16 list[0 ];#define I40E_PILE_VALID_BIT 0x8000#define I40E_IWARP_IRQ_PILE_ID (I40E_PILE_VALID_BIT - 2)
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -12
@@ -196,10 +196,6 @@ int i40e_free_virt_mem_d(struct i40e_hw* @id: an owner id to stick on the items assigned * * Returns the base item index of the lump, or negative for error -* -* The search_hint trick and lack of advanced fit-finding only work -* because we're highly likely to have all the same size lump requests. -* Linear search time and any fragmentation should be minimal. **/ static int i40e_get_lump (struct i40e_pf *pf,struct i40e_lump_tracking *pile,u16 needed,u16 id)
@@ -214,8 +210,7 @@ static int i40e_get_lump(struct i40e_pfreturn -EINVAL ; } -/* start the linear search with an imperfect hint */ - i = pile->search_hint; + i =0 ;while (i < pile->num_entries) {/* skip already allocated entries */ if (pile->list[i] &I40E_PILE_VALID_BIT ) {
@@ -234,7 +229,6 @@ static int i40e_get_lump(struct i40e_pffor (j =0 ; j < needed; j++) pile->list[i+j] = id |I40E_PILE_VALID_BIT ; ret = i; - pile->search_hint = i + j;break ; }
@@ -257,7 +251,7 @@ static int i40e_put_lump(struct i40e_lum {int valid_id = (id |I40E_PILE_VALID_BIT );int count =0 ; -int i; +u16 i;if (!pile || index >= pile->num_entries)return -EINVAL ;
@@ -269,8 +263,6 @@ static int i40e_put_lump(struct i40e_lum count++; } -if (count && index < pile->search_hint) - pile->search_hint = index;return count; }
@@ -11786,7 +11778,6 @@ static int i40e_init_interrupt_scheme(streturn -ENOMEM ; pf->irq_pile->num_entries = vectors; - pf->irq_pile->search_hint =0 ;/* track first vector for misc interrupts, ignore return */ (void )i40e_get_lump (pf, pf->irq_pile,1 ,I40E_PILE_VALID_BIT -1 );
@@ -12589,7 +12580,6 @@ static int i40e_sw_init(struct i40e_pf * goto sw_init_done; } pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp; - pf->qp_pile->search_hint =0 ; pf->tx_timeout_recovery_level =1 ;
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +59 -0
71 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 98/200 i40e: Fix queues reservation for XDP
In reply to Greg Kroah-HartmanFrom: Sylwester Dziedziuch <[email protected]>
commit 92947844b8beee988c0ce17082b705c2f75f0742 upstream.
When XDP was configured on a system with large number of CPUs and X722 NIC there was a call trace with NULL pointer dereference.
i40e 0000:87:00.0: failed to get tracking for 256 queues for VSI 0 err -12 i40e 0000:87:00.0: setup of MAIN VSI failed
BUG: kernel NULL pointer dereference, address: 0000000000000000 RIP: 0010:i40e_xdp+0xea/0x1b0 [i40e] Call Trace: ? i40e_reconfig_rss_queues+0x130/0x130 [i40e] dev_xdp_install+0x61/0xe0 dev_xdp_attach+0x18a/0x4c0 dev_change_xdp_fd+0x1e6/0x220 do_setlink+0x616/0x1030 ? ahci_port_stop+0x80/0x80 ? ata_qc_issue+0x107/0x1e0 ? lock_timer_base+0x61/0x80 ? __mod_timer+0x202/0x380 rtnl_setlink+0xe5/0x170 ? bpf_lsm_binder_transaction+0x10/0x10 ? security_capable+0x36/0x50 rtnetlink_rcv_msg+0x121/0x350 ? rtnl_calcit.isra.0+0x100/0x100 netlink_rcv_skb+0x50/0xf0 netlink_unicast+0x1d3/0x2a0 netlink_sendmsg+0x22a/0x440 sock_sendmsg+0x5e/0x60 __sys_sendto+0xf0/0x160 ? __sys_getsockname+0x7e/0xc0 ? _copy_from_user+0x3c/0x80 ? __sys_setsockopt+0xc8/0x1a0 __x64_sys_sendto+0x20/0x30 do_syscall_64+0x33/0x40 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7f83fa7a39e0
This was caused by PF queue pile fragmentation due to flow director VSI queue being placed right after main VSI. Because of this main VSI was not able to resize its queue allocation for XDP resulting in no queues allocated for main VSI when XDP was turned on.
Fix this by always allocating last queue in PF queue pile for a flow director VSI.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_main.c +14 -0
@@ -210,6 +210,20 @@ static int i40e_get_lump(struct i40e_pfreturn -EINVAL ; } +/* Allocate last queue in the pile for FDIR VSI queue +* so it doesn't fragment the qp_pile +*/ +if (pile == pf->qp_pile && pf->vsi[id]->type ==I40E_VSI_FDIR ) { +if (pile->list[pile->num_entries -1 ] &I40E_PILE_VALID_BIT ) { +dev_err (&pf->pdev->dev, +"Cannot allocate queue %d for I40E_VSI_FDIR\n" , + pile->num_entries -1 ); +return -ENOMEM ; + } + pile->list[pile->num_entries -1 ] = id |I40E_PILE_VALID_BIT ; +return pile->num_entries -1 ; + } + i =0 ;while (i < pile->num_entries) {/* skip already allocated entries */
Greg Kroah-Hartman
maintainerPATCH 99/200 i40e: Fix for failed to init adminq while VF reset
In reply to Greg Kroah-HartmanFrom: Karen Sornek <[email protected]>
commit 0f344c8129a5337dae50e31b817dd50a60ff238c upstream.
Fix for failed to init adminq: -53 while VF is resetting via MAC address changing procedure.
Added sync module to avoid reading deadbeef value in reinit adminq during software reset.
Without this patch it is possible to trigger VF reset procedure during reinit adminq. This resulted in an incorrect reading of value from the AQP registers and generated the -53 error.
--- drivers/net/ethernet/intel/i40e/i40e_register.h | 3 + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 44 ++++++++++++++++++++- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 1 3 files changed, 46 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_register.h +3 -0
@@ -413,6 +413,9 @@#define I40E_VFINT_DYN_CTLN (_INTVF) (0x00024800 + ((_INTVF) * 4))/* _i=0...511 */ /* Reset: VFR */ #define I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT 1#define I40E_VFINT_DYN_CTLN_CLEARPBA_MASK I40E_MASK(0x1, I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT) +#define I40E_VFINT_ICR0_ADMINQ_SHIFT 30 +#define I40E_VFINT_ICR0_ADMINQ_MASK I40E_MASK(0x1, I40E_VFINT_ICR0_ADMINQ_SHIFT) +#define I40E_VFINT_ICR0_ENA (_VF) (0x0002C000 + ((_VF) * 4))/* _i=0...127 */ /* Reset: CORER */ #define I40E_VPINT_AEQCTL (_VF) (0x0002B800 + ((_VF) * 4))/* _i=0...127 */ /* Reset: CORER */ #define I40E_VPINT_AEQCTL_MSIX_INDX_SHIFT 0#define I40E_VPINT_AEQCTL_ITR_INDX_SHIFT 11
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +42 -2
64 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +1 -0
@@ -19,6 +19,7 @@#define I40E_MAX_VF_PROMISC_FLAGS 3#define I40E_VF_STATE_WAIT_COUNT 20 +#define I40E_VFR_WAIT_COUNT 100/* Various queue ctrls */ enum i40e_queue_ctrl {
Greg Kroah-Hartman
maintainerPATCH 100/200 i40e: fix unsigned stat widths
In reply to Greg Kroah-HartmanFrom: Joe Damato <[email protected]>
commit 3b8428b84539c78fdc8006c17ebd25afd4722d51 upstream.
Change i40e_update_vsi_stats and struct i40e_vsi to use u64 fields to match the width of the stats counters in struct i40e_rx_queue_stats.
Update debugfs code to use the correct format specifier for u64.
--- drivers/net/ethernet/intel/i40e/i40e.h | 8 ++++---- drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +4 -4
@@ -847,12 +847,12 @@ struct i40e_vsi {struct rtnl_link_stats64 net_stats_offsets;struct i40e_eth_stats eth_stats;struct i40e_eth_stats eth_stats_offsets; -u32 tx_restart; -u32 tx_busy; +u64 tx_restart; +u64 tx_busy;u64 tx_linearize;u64 tx_force_wb; -u32 rx_buf_failed; -u32 rx_page_failed; +u64 rx_buf_failed; +u64 rx_page_failed;/* These are containers of ring pointers, allocated at run-time */ struct i40e_ring **rx_rings;
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +1 -1
@@ -240,7 +240,7 @@ static void i40e_dbg_dump_vsi_seid(struc (unsigned long int )vsi->net_stats_offsets.rx_compressed, (unsigned long int)vsi->net_stats_offsets.tx_compressed);dev_info (&pf->pdev->dev, -" tx_restart = %d, tx_busy = %d, rx_buf_failed = %d, rx_page_failed = %d\n" , +" tx_restart = %llu, tx_busy = %llu, rx_buf_failed = %llu, rx_page_failed = %llu\n" , vsi->tx_restart, vsi->tx_busy, vsi->rx_buf_failed, vsi->rx_page_failed);rcu_read_lock ();
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -2
@@ -778,9 +778,9 @@ static void i40e_update_vsi_stats(structstruct rtnl_link_stats64 *ns;/* netdev stats */ struct i40e_eth_stats *oes;struct i40e_eth_stats *es;/* device's eth stats */ -u32 tx_restart, tx_busy; +u64 tx_restart, tx_busy;struct i40e_ring *p; -u32 rx_page, rx_buf; +u64 rx_page, rx_buf;u64 bytes, packets;unsigned int start;u64 tx_linearize;
Greg Kroah-Hartman
maintainerPATCH 101/200 usb: roles: fix include/linux/usb/role.h compile issue
In reply to Greg Kroah-HartmanFrom: Linyu Yuan <[email protected]>
commit 945c37ed564770c78dfe6b9f08bed57a1b4e60ef upstream.
when CONFIG_USB_ROLE_SWITCH is not defined,
add usb_role_switch_find_by_fwnode() definition which return NULL.
--- include/linux/usb/role.h | 6 ++++++ 1 file changed, 6 insertions(+)
include/linux/usb/role.h +6 -0
@@ -92,6 +92,12 @@ fwnode_usb_role_switch_get(struct fwnodestatic inline void usb_role_switch_put (struct usb_role_switch *sw) { }static inline struct usb_role_switch * +usb_role_switch_find_by_fwnode (const struct fwnode_handle *fwnode) +{ +return NULL ; +} + +static inline struct usb_role_switch *usb_role_switch_register (struct device *parent,const struct usb_role_switch_desc *desc) {
Greg Kroah-Hartman
maintainerPATCH 102/200 rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev
In reply to Greg Kroah-HartmanFrom: Sujit Kautkar <[email protected]>
commit b7fb2dad571d1e21173c06cef0bced77b323990a upstream.
struct rpmsg_ctrldev contains a struct cdev. The current code frees the rpmsg_ctrldev struct in rpmsg_ctrldev_release_device(), but the cdev is a managed object, therefore its release is not predictable and the rpmsg_ctrldev could be freed before the cdev is entirely released, as in the backtrace below.
[ 93.625603] ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x7c [ 93.636115] WARNING: CPU: 0 PID: 12 at lib/debugobjects.c:488 debug_print_object+0x13c/0x1b0 [ 93.644799] Modules linked in: veth xt_cgroup xt_MASQUERADE rfcomm algif_hash algif_skcipher af_alg uinput ip6table_nat fuse uvcvideo videobuf2_vmalloc venus_enc venus_dec videobuf2_dma_contig hci_uart btandroid btqca snd_soc_rt5682_i2c bluetooth qcom_spmi_temp_alarm snd_soc_rt5682v [ 93.715175] CPU: 0 PID: 12 Comm: kworker/0:1 Tainted: G B 5.4.163-lockdep #26 [ 93.723855] Hardware name: Google Lazor (rev3 - 8) with LTE (DT) [ 93.730055] Workqueue: events kobject_delayed_cleanup [ 93.735271] pstate: 60c00009 (nZCv daif +PAN +UAO) [ 93.740216] pc : debug_print_object+0x13c/0x1b0 [ 93.744890] lr : debug_print_object+0x13c/0x1b0 [ 93.749555] sp : ffffffacf5bc7940 [ 93.752978] x29: ffffffacf5bc7940 x28: dfffffd000000000 [ 93.758448] x27: ffffffacdb11a800 x26: dfffffd000000000 [ 93.763916] x25: ffffffd0734f856c x24: dfffffd000000000 [ 93.769389] x23: 0000000000000000 x22: ffffffd0733c35b0 [ 93.774860] x21: ffffffd0751994a0 x20: ffffffd075ec27c0 [ 93.780338] x19: ffffffd075199100 x18: 00000000000276e0 [ 93.785814] x17: 0000000000000000 x16: dfffffd000000000 [ 93.791291] x15: ffffffffffffffff x14: 6e6968207473696c [ 93.796768] x13: 0000000000000000 x12: ffffffd075e2b000 [ 93.802244] x11: 0000000000000001 x10: 0000000000000000 [ 93.807723] x9 : d13400dff1921900 x8 : d13400dff1921900 [ 93.813200] x7 : 0000000000000000 x6 : 0000000000000000 [ 93.818676] x5 : 0000000000000080 x4 : 0000000000000000 [ 93.824152] x3 : ffffffd0732a0fa4 x2 : 0000000000000001 [ 93.829628] x1 : ffffffacf5bc7580 x0 : 0000000000000061 [ 93.835104] Call trace: [ 93.837644] debug_print_object+0x13c/0x1b0 [ 93.841963] __debug_check_no_obj_freed+0x25c/0x3c0 [ 93.846987] debug_check_no_obj_freed+0x18/0x20 [ 93.851669] slab_free_freelist_hook+0xbc/0x1e4 [ 93.856346] kfree+0xfc/0x2f4 [ 93.859416] rpmsg_ctrldev_release_device+0x78/0xb8 [ 93.864445] device_release+0x84/0x168 [ 93.868310] kobject_cleanup+0x12c/0x298 [ 93.872356] kobject_delayed_cleanup+0x10/0x18 [ 93.876948] process_one_work+0x578/0x92c [ 93.881086] worker_thread+0x804/0xcf8 [ 93.884963] kthread+0x2a8/0x314 [ 93.888303] ret_from_fork+0x10/0x18
The cdev_device_add/del() API was created to address this issue (see commit '233ed09d7fda ("chardev: add helper function to register char devs with a struct device")'), use it instead of cdev add/del().
--- drivers/rpmsg/rpmsg_char.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/rpmsg/rpmsg_char.c +2 -9
@@ -459,7 +459,6 @@ static void rpmsg_ctrldev_release_deviceida_simple_remove (&rpmsg_ctrl_ida, dev->id);ida_simple_remove (&rpmsg_minor_ida,MINOR (dev->devt)); -cdev_del (&ctrldev->cdev);kfree (ctrldev); }
@@ -494,19 +493,13 @@ static int rpmsg_chrdev_probe(struct rpm dev->id = ret;dev_set_name (&ctrldev->dev,"rpmsg_ctrl%d" , ret); - ret =cdev_add (&ctrldev->cdev, dev->devt,1 ); + ret =cdev_device_add (&ctrldev->cdev, &ctrldev->dev);if (ret) goto free_ctrl_ida;/* We can now rely on the release function for cleanup */ dev->release = rpmsg_ctrldev_release_device; - ret =device_add (dev); -if (ret) { -dev_err (&rpdev->dev,"device_add failed: %d\n" , ret); -put_device (dev); - } -dev_set_drvdata (&rpdev->dev, ctrldev);return ret;
@@ -532,7 +525,7 @@ static void rpmsg_chrdev_remove(struct rif (ret)dev_warn (&rpdev->dev,"failed to nuke endpoints: %d\n" , ret); -device_del (&ctrldev->dev); +cdev_device_del (&ctrldev->cdev, &ctrldev->dev);put_device (&ctrldev->dev); }
Greg Kroah-Hartman
maintainerPATCH 103/200 rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev
In reply to Greg Kroah-HartmanFrom: Matthias Kaehlcke <[email protected]>
commit 7a534ae89e34e9b51acb5a63dd0f88308178b46a upstream.
struct rpmsg_eptdev contains a struct cdev. The current code frees the rpmsg_eptdev struct in rpmsg_eptdev_destroy(), but the cdev is a managed object, therefore its release is not predictable and the rpmsg_eptdev could be freed before the cdev is entirely released.
The cdev_device_add/del() API was created to address this issue (see commit '233ed09d7fda ("chardev: add helper function to register char devs with a struct device")'), use it instead of cdev add/del().
--- drivers/rpmsg/rpmsg_char.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/rpmsg/rpmsg_char.c +2 -9
@@ -90,7 +90,7 @@ static int rpmsg_eptdev_destroy(struct d/* wake up any blocked readers */ wake_up_interruptible (&eptdev->readq); -device_del (&eptdev->dev); +cdev_device_del (&eptdev->cdev, &eptdev->dev);put_device (&eptdev->dev);return 0 ;
@@ -333,7 +333,6 @@ static void rpmsg_eptdev_release_device(ida_simple_remove (&rpmsg_ept_ida, dev->id);ida_simple_remove (&rpmsg_minor_ida,MINOR (eptdev->dev.devt)); -cdev_del (&eptdev->cdev);kfree (eptdev); }
@@ -378,19 +377,13 @@ static int rpmsg_eptdev_create(struct rp dev->id = ret;dev_set_name (dev,"rpmsg%d" , ret); - ret =cdev_add (&eptdev->cdev, dev->devt,1 ); + ret =cdev_device_add (&eptdev->cdev, &eptdev->dev);if (ret) goto free_ept_ida;/* We can now rely on the release function for cleanup */ dev->release = rpmsg_eptdev_release_device; - ret =device_add (dev); -if (ret) { -dev_err (dev,"device_add failed: %d\n" , ret); -put_device (dev); - } -return ret; free_ept_ida:
Greg Kroah-Hartman
maintainerPATCH 104/200 scsi: elx: efct: Dont use GFP_KERNEL under spin lock
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
commit 61263b3a11a2594b4e898f166c31162236182b5c upstream.
GFP_KERNEL/GFP_DMA can't be used under a spin lock. According the comment, els_ios_lock is used to protect els ios list so we can move down the spin lock to avoid using this flag under the lock.
--- drivers/scsi/elx/libefc/efc_els.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/scsi/elx/libefc/efc_els.c +2 -6
@@ -46,18 +46,14 @@ efc_els_io_alloc_size(struct efc_node *n efc = node->efc; -spin_lock_irqsave (&node->els_ios_lock, flags); -if (!node->els_io_enabled) {efc_log_err (efc,"els io alloc disabled\n" ); -spin_unlock_irqrestore (&node->els_ios_lock, flags);return NULL ; } els =mempool_alloc (efc->els_io_pool,GFP_ATOMIC );if (!els) {atomic_add_return (1 , &efc->els_io_alloc_failed_count); -spin_unlock_irqrestore (&node->els_ios_lock, flags);return NULL ; }
@@ -74,7 +70,6 @@ efc_els_io_alloc_size(struct efc_node *n &els->io.req.phys, GFP_DMA);if (!els->io.req.virt) {mempool_free (els, efc->els_io_pool); -spin_unlock_irqrestore (&node->els_ios_lock, flags);return NULL ; }
@@ -94,10 +89,11 @@ efc_els_io_alloc_size(struct efc_node *n/* add els structure to ELS IO list */ INIT_LIST_HEAD (&els->list_entry); +spin_lock_irqsave (&node->els_ios_lock, flags);list_add_tail (&els->list_entry, &node->els_ios_list); +spin_unlock_irqrestore (&node->els_ios_lock, flags); } -spin_unlock_irqrestore (&node->els_ios_lock, flags);return els; }
Greg Kroah-Hartman
maintainerPATCH 105/200 scsi: bnx2fc: Flush destroy_work queue before calling bnx2fc_interface_put()
In reply to Greg Kroah-HartmanFrom: John Meneghini <[email protected]>
commit 847f9ea4c5186fdb7b84297e3eeed9e340e83fce upstream.
The bnx2fc_destroy() functions are removing the interface before calling destroy_work. This results multiple WARNings from sysfs_remove_group() as the controller rport device attributes are removed too early.
Replace the fcoe_port's destroy_work queue. It's not needed.
The problem is easily reproducible with the following steps.
Example:
$ dmesg -w & $ systemctl enable --now fcoe $ fipvlan -s -c ens2f1 $ fcoeadm -d ens2f1.802 [ 583.464488] host2: libfc: Link down on port (7500a1) [ 583.472651] bnx2fc: 7500a1 - rport not created Yet!! [ 583.490468] ------------[ cut here ]------------ [ 583.538725] sysfs group 'power' not found for kobject 'rport-2:0-0' [ 583.568814] WARNING: CPU: 3 PID: 192 at fs/sysfs/group.c:279 sysfs_remove_group+0x6f/0x80 [ 583.607130] Modules linked in: dm_service_time 8021q garp mrp stp llc bnx2fc cnic uio rpcsec_gss_krb5 auth_rpcgss nfsv4 ... [ 583.942994] CPU: 3 PID: 192 Comm: kworker/3:2 Kdump: loaded Not tainted 5.14.0-39.el9.x86_64 #1 [ 583.984105] Hardware name: HP ProLiant DL120 G7, BIOS J01 07/01/2013 [ 584.016535] Workqueue: fc_wq_2 fc_rport_final_delete [scsi_transport_fc] [ 584.050691] RIP: 0010:sysfs_remove_group+0x6f/0x80 [ 584.074725] Code: ff 5b 48 89 ef 5d 41 5c e9 ee c0 ff ff 48 89 ef e8 f6 b8 ff ff eb d1 49 8b 14 24 48 8b 33 48 c7 c7 ... [ 584.162586] RSP: 0018:ffffb567c15afdc0 EFLAGS: 00010282 [ 584.188225] RAX: 0000000000000000 RBX: ffffffff8eec4220 RCX: 0000000000000000 [ 584.221053] RDX: ffff8c1586ce84c0 RSI: ffff8c1586cd7cc0 RDI: ffff8c1586cd7cc0 [ 584.255089] RBP: 0000000000000000 R08: 0000000000000000 R09: ffffb567c15afc00 [ 584.287954] R10: ffffb567c15afbf8 R11: ffffffff8fbe7f28 R12: ffff8c1486326400 [ 584.322356] R13: ffff8c1486326480 R14: ffff8c1483a4a000 R15: 0000000000000004 [ 584.355379] FS: 0000000000000000(0000) GS:ffff8c1586cc0000(0000) knlGS:0000000000000000 [ 584.394419] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 584.421123] CR2: 00007fe95a6f7840 CR3: 0000000107674002 CR4: 00000000000606e0 [ 584.454888] Call Trace: [ 584.466108] device_del+0xb2/0x3e0 [ 584.481701] device_unregister+0x13/0x60 [ 584.501306] bsg_unregister_queue+0x5b/0x80 [ 584.522029] bsg_remove_queue+0x1c/0x40 [ 584.541884] fc_rport_final_delete+0xf3/0x1d0 [scsi_transport_fc] [ 584.573823] process_one_work+0x1e3/0x3b0 [ 584.592396] worker_thread+0x50/0x3b0 [ 584.609256] ? rescuer_thread+0x370/0x370 [ 584.628877] kthread+0x149/0x170 [ 584.643673] ? set_kthread_struct+0x40/0x40 [ 584.662909] ret_from_fork+0x22/0x30 [ 584.680002] ---[ end trace 53575ecefa942ece ]---
--- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +5 -15
@@ -82,7 +82,7 @@ static int bnx2fc_bind_pcidev(struct bnxstatic void bnx2fc_unbind_pcidev (struct bnx2fc_hba *hba);static struct fc_lport *bnx2fc_if_create (struct bnx2fc_interface *interface,struct device *parent,int npiv); -static void bnx2fc_destroy_work (struct work_struct *work); +static void bnx2fc_port_destroy (struct fcoe_port *port);static struct bnx2fc_hba *bnx2fc_hba_lookup (struct net_device *phys_dev); static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
@@ -907,9 +907,6 @@ static void bnx2fc_indicate_netevent(voi__bnx2fc_destroy (interface); }mutex_unlock (&bnx2fc_dev_lock); - -/* Ensure ALL destroy work has been completed before return */ -flush_workqueue (bnx2fc_wq);return ;default :
@@ -1215,8 +1212,8 @@ static int bnx2fc_vport_destroy(struct fmutex_unlock (&n_port->lp_mutex);bnx2fc_free_vport (interface->hba, port->lport);bnx2fc_port_shutdown (port->lport); +bnx2fc_port_destroy (port);bnx2fc_interface_put (interface); -queue_work (bnx2fc_wq, &port->destroy_work);return 0 ; }
@@ -1525,7 +1522,6 @@ static struct fc_lport *bnx2fc_if_create port->lport = lport; port->priv = interface; port->get_netdev = bnx2fc_netdev; -INIT_WORK (&port->destroy_work, bnx2fc_destroy_work);/* Configure fcoe_port */ rc =bnx2fc_lport_config (lport);
@@ -1653,8 +1649,8 @@ static void __bnx2fc_destroy(struct bnx2bnx2fc_interface_cleanup (interface);bnx2fc_stop (interface);list_del (&interface->list); +bnx2fc_port_destroy (port);bnx2fc_interface_put (interface); -queue_work (bnx2fc_wq, &port->destroy_work); }/**
@@ -1694,15 +1690,12 @@ netdev_err:return rc; } -static void bnx2fc_destroy_work (struct work_struct *work) +static void bnx2fc_port_destroy (struct fcoe_port *port) { -struct fcoe_port *port;struct fc_lport *lport; - port = container_of(work, struct fcoe_port, destroy_work); lport = port->lport; - -BNX2FC_HBA_DBG (lport,"Entered bnx2fc_destroy_work\n" ); +BNX2FC_HBA_DBG (lport,"Entered %s, destroying lport %p\n" , __func__, lport);bnx2fc_if_destroy (lport); }
@@ -2556,9 +2549,6 @@ static void bnx2fc_ulp_exit(struct cnic___bnx2fc_destroy (interface);mutex_unlock (&bnx2fc_dev_lock); -/* Ensure ALL destroy work has been completed before return */ -flush_workqueue (bnx2fc_wq); -bnx2fc_ulp_stop (hba);/* unregister cnic device */ if (test_and_clear_bit (BNX2FC_CNIC_REGISTERED , &hba->reg_with_cnic))
Greg Kroah-Hartman
maintainerPATCH 106/200 ipv6_tunnel: Rate limit warning messages
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
commit 6cee105e7f2ced596373951d9ea08dacc3883c68 upstream.
The warning messages can be invoked from the data path for every packet transmitted through an ip6gre netdev, leading to high CPU utilization.
Fix that by rate limiting the messages.
--- net/ipv6/ip6_tunnel.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ipv6/ip6_tunnel.c +4 -4
@@ -1036,14 +1036,14 @@ int ip6_tnl_xmit_ctl(struct ip6_tnl *t,if (unlikely (!ipv6_chk_addr_and_flags (net, laddr, ldev, false,0 ,IFA_F_TENTATIVE ))) -pr_warn ("%s xmit: Local address not yet configured!\n" , - p->name); +pr_warn_ratelimited ("%s xmit: Local address not yet configured!\n" , + p->name);else if (!(p->flags &IP6_TNL_F_ALLOW_LOCAL_REMOTE ) && !ipv6_addr_is_multicast (raddr) &&unlikely (ipv6_chk_addr_and_flags (net, raddr, ldev, true,0 ,IFA_F_TENTATIVE ))) -pr_warn ("%s xmit: Routing loop! Remote address found on this node!\n" , - p->name); +pr_warn_ratelimited ("%s xmit: Routing loop! Remote address found on this node!\n" , + p->name);else ret =1 ;rcu_read_unlock ();
Greg Kroah-Hartman
maintainerPATCH 107/200 ARM: 9170/1: fix panic when kasan and kprobe are enabled
In reply to Greg Kroah-HartmanFrom: sparkhuang <[email protected]>
commit 8b59b0a53c840921b625378f137e88adfa87647e upstream.
arm32 uses software to simulate the instruction replaced by kprobe. some instructions may be simulated by constructing assembly functions. therefore, before executing instruction simulation, it is necessary to construct assembly function execution environment in C language through binding registers. after kasan is enabled, the register binding relationship will be destroyed, resulting in instruction simulation errors and causing kernel panic.
the kprobe emulate instruction function is distributed in three
files: actions-common.c actions-arm.c actions-thumb.c, so disable KASAN when compiling these files.
for example, use kprobe insert on cap_capable+20 after kasan enabled, the cap_capable assembly code is as follows:
<cap_capable>:e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}e1a05000 mov r5, r0e280006c add r0, r0, #108 ; 0x6ce1a04001 mov r4, r1e1a06002 mov r6, r2e59fa090 ldr sl, [pc, #144] ;ebfc7bf8 bl c03aa4b4 <__asan_load4>e595706c ldr r7, [r5, #108] ; 0x6ce2859014 add r9, r5, #20
......
The emulate_ldr assembly code after enabling kasan is as follows:c06f1384 <emulate_ldr>:e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}e282803c add r8, r2, #60 ; 0x3ce1a05000 mov r5, r0e7e37855 ubfx r7, r5, #16, #4e1a00008 mov r0, r8e1a09001 mov r9, r1e1a04002 mov r4, r2ebf35462 bl c03c6530 <__asan_load4>e357000f cmp r7, #15e7e36655 ubfx r6, r5, #12, #4e205a00f and sl, r5, #150a000001 beq c06f13bc <emulate_ldr+0x38>e0840107 add r0, r4, r7, lsl #2ebf3545c bl c03c6530 <__asan_load4>e084010a add r0, r4, sl, lsl #2ebf3545a bl c03c6530 <__asan_load4>e2890010 add r0, r9, #16ebf35458 bl c03c6530 <__asan_load4>e5990010 ldr r0, [r9, #16]e12fff30 blx r0e356000f cm r6, #151a000014 bne c06f1430 <emulate_ldr+0xac>e1a06000 mov r6, r0e2840040 add r0, r4, #64 ; 0x40
......
when running in emulate_ldr to simulate the ldr instruction, panic occurred, and the log is as follows:
Unable to handle kernel NULL pointer dereference at virtual address 00000090 pgd = ecb46400 [00000090] *pgd=2e0fa003, *pmd=00000000 Internal error: Oops: 206 [#1] SMP ARM PC is at cap_capable+0x14/0xb0 LR is at emulate_ldr+0x50/0xc0
psr: 600d0293 sp : ecd63af8 ip : 00000004 fp : c0a7c30c
r10: 00000000 r9 : c30897f4 r8 : ecd63cd4
r7 : 0000000f r6 : 0000000a r5 : e59fa090 r4 : ecd63c98 r3 : c06ae294 r2 : 00000000 r1 : b7611300 r0 : bf4ec008
Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
Control: 32c5387d Table: 2d546400 DAC: 55555555 Process bash (pid: 1643, stack limit = 0xecd60190) (cap_capable) from (kprobe_handler+0x218/0x340) (kprobe_handler) from (kprobe_trap_handler+0x24/0x48) (kprobe_trap_handler) from (do_undefinstr+0x13c/0x364) (do_undefinstr) from (__und_svc_finish+0x0/0x30) (__und_svc_finish) from (cap_capable+0x18/0xb0) (cap_capable) from (cap_vm_enough_memory+0x38/0x48) (cap_vm_enough_memory) from (security_vm_enough_memory_mm+0x48/0x6c) (security_vm_enough_memory_mm) from (copy_process.constprop.5+0x16b4/0x25c8) (copy_process.constprop.5) from (_do_fork+0xe8/0x55c) (_do_fork) from (SyS_clone+0x1c/0x24)
(SyS_clone) from (__sys_trace_return+0x0/0x10)
Code: 0050a0e1 6c0080e2 0140a0e1 0260a0e1 (f801f0e7)
--- arch/arm/probes/kprobes/Makefile | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/probes/kprobes/Makefile +3 -0
@@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 +KASAN_SANITIZE_actions-common.o := n +KASAN_SANITIZE_actions-arm.o := n +KASAN_SANITIZE_actions-thumb.o := n obj-$(CONFIG_KPROBES) += core.o actions-common.o checkers-common.o obj-$(CONFIG_ARM_KPROBES_TEST) += test-kprobes.o test-kprobes-objs := test-core.o
Greg Kroah-Hartman
maintainerPATCH 108/200 net: fix information leakage in /proc/net/ptype
In reply to Greg Kroah-HartmanFrom: Congyu Liu <[email protected]>
commit 47934e06b65637c88a762d9c98329ae6e3238888 upstream.
In one net namespace, after creating a packet socket without binding it to a device, users in other net namespaces can observe the new packet_type added by this packet socket by reading /proc/net/ptype file. This is minor information leakage as packet socket is namespace aware.
Add a net pointer in packet_type to keep the net namespace of of corresponding packet socket. In ptype_seq_show, this net pointer must be checked when it is not NULL.
--- include/linux/netdevice.h | 1 + net/core/net-procfs.c | 3 ++- net/packet/af_packet.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-)
include/linux/netdevice.h +1 -0
@@ -2636,6 +2636,7 @@ struct packet_type { struct net_device *);bool (*id_match)(struct packet_type *ptype,struct sock *sk); +struct net *af_packet_net;void *af_packet_priv;struct list_head list; };
net/core/net-procfs.c +2 -1
@@ -260,7 +260,8 @@ static int ptype_seq_show(struct seq_filif (v ==SEQ_START_TOKEN )seq_puts (seq,"Type Device Function\n" ); -else if (pt->dev ==NULL ||dev_net (pt->dev) ==seq_file_net (seq)) { +else if ((!pt->af_packet_net ||net_eq (pt->af_packet_net,seq_file_net (seq))) && + (!pt->dev ||net_eq (dev_net (pt->dev),seq_file_net (seq)))) {if (pt->type ==htons (ETH_P_ALL ))seq_puts (seq,"ALL " );else
net/packet/af_packet.c +2 -0
@@ -1773,6 +1773,7 @@ static int fanout_add(struct sock *sk, s match->prot_hook.dev = po->prot_hook.dev; match->prot_hook.func = packet_rcv_fanout; match->prot_hook.af_packet_priv = match; + match->prot_hook.af_packet_net =read_pnet (&match->net); match->prot_hook.id_match = match_fanout_group; match->max_num_members = args->max_num_members;list_add (&match->list, &fanout_list);
@@ -3358,6 +3359,7 @@ static int packet_create(struct net *net po->prot_hook.func = packet_rcv_spkt; po->prot_hook.af_packet_priv = sk; + po->prot_hook.af_packet_net =sock_net (sk);if (proto) { po->prot_hook.type = proto;
Greg Kroah-Hartman
maintainerPATCH 109/200 hwmon: (lm90) Mark alert as broken for MAX6646/6647/6649
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
commit f614629f9c1080dcc844a8430e3fb4c37ebbf05d upstream.
Experiments with MAX6646 and MAX6648 show that the alert function of those chips is broken, similar to other chips supported by the lm90 driver. Mark it accordingly.
--- drivers/hwmon/lm90.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/lm90.c +1 -1
@@ -394,7 +394,7 @@ static const struct lm90_params lm90_par .max_convrate = 9, }, [max6646] = { - .flags = LM90_HAVE_CRIT, + .flags = LM90_HAVE_CRIT | LM90_HAVE_BROKEN_ALERT, .alert_alarms = 0x7c, .max_convrate = 6, .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
Greg Kroah-Hartman
maintainerPATCH 110/200 hwmon: (lm90) Mark alert as broken for MAX6680
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
commit 94746b0ba479743355e0d3cc1cb9cfe3011fb8be upstream.
Experiments with MAX6680 and MAX6681 show that the alert function of those chips is broken, similar to other chips supported by the lm90 driver. Mark it accordingly.
--- drivers/hwmon/lm90.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/lm90.c +1 -1
@@ -418,7 +418,7 @@ static const struct lm90_params lm90_par }, [max6680] = { .flags =LM90_HAVE_OFFSET |LM90_HAVE_CRIT - | LM90_HAVE_CRIT_ALRM_SWP, + | LM90_HAVE_CRIT_ALRM_SWP | LM90_HAVE_BROKEN_ALERT, .alert_alarms = 0x7c, .max_convrate = 7, },
Greg Kroah-Hartman
maintainerPATCH 111/200 ping: fix the sk_bound_dev_if match in ping_lookup
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
commit 2afc3b5a31f9edf3ef0f374f5d70610c79c93a42 upstream.
When 'ping' changes to use PING socket instead of RAW socket by:
# sysctl -w net.ipv4.ping_group_range="0 100"
the selftests 'router_broadcast.sh' will fail, as such command
# ip vrf exec vrf-h1 ping -I veth0 198.51.100.255 -b
can't receive the response skb by the PING socket. It's caused by mismatch of sk_bound_dev_if and dif in ping_rcv() when looking up the PING socket, as dif is vrf-h1 if dif's master was set to vrf-h1.
This patch is to fix this regression by also checking the sk_bound_dev_if against sdif so that the packets can stil be received even if the socket is not bound to the vrf device but to the real iif.
--- net/ipv4/ping.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/ping.c +2 -1
@@ -220,7 +220,8 @@ static struct sock *ping_lookup(struct ncontinue ; } -if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) +if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && + sk->sk_bound_dev_if !=inet_sdif (skb))continue ;sock_hold (sk);
Greg Kroah-Hartman
maintainerPATCH 112/200 ipv4: avoid using shared IP generator for connected sockets
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 23f57406b82de51809d5812afd96f210f8b627f3 upstream.
ip_select_ident_segs() has been very conservative about using the connected socket private generator only for packets with IP_DF set, claiming it was needed for some VJ compression implementations.
As mentioned in this referenced document, this can be abused. (Ref: Off-Path TCP Exploits of the Mixed IPID Assignment)
Before switching to pure random IPID generation and possibly hurt some workloads, lets use the private inet socket generator.
Not only this will remove one vulnerability, this will also improve performance of TCP flows using pmtudisc==IP_PMTUDISC_DONT
--- include/net/ip.h | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
include/net/ip.h +10 -11
@@ -525,19 +525,18 @@ static inline void ip_select_ident_segs( {struct iphdr *iph =ip_hdr (skb); +/* We had many attacks based on IPID, use the private +* generator as much as we can. +*/ +if (sk &&inet_sk (sk)->inet_daddr) { + iph->id =htons (inet_sk (sk)->inet_id); +inet_sk (sk)->inet_id += segs; +return ; + }if ((iph->frag_off &htons (IP_DF )) && !skb->ignore_df) { -/* This is only to work around buggy Windows95/2000 -* VJ compression implementations. If the ID field -* does not change, they drop every other packet in -* a TCP stream using header compression. -*/ -if (sk &&inet_sk (sk)->inet_daddr) { - iph->id =htons (inet_sk (sk)->inet_id); -inet_sk (sk)->inet_id += segs; - }else { - iph->id =0 ; - } + iph->id =0 ; }else { +/* Unfortunately we need the big hammer to get a suitable IPID */ __ip_select_ident (net, iph, segs); } }
Greg Kroah-Hartman
maintainerPATCH 113/200 hwmon: (lm90) Reduce maximum conversion rate for G781
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit a66c5ed539277b9f2363bbace0dba88b85b36c26 ]
According to its datasheet, G781 supports a maximum conversion rate value of 8 (62.5 ms). However, chips labeled G781 and G780 were found to only support a maximum conversion rate value of 7 (125 ms). On the other side, chips labeled G781-1 and G784 were found to support a conversion rate value of 8. There is no known means to distinguish G780 from G781 or G784; all chips report the same manufacturer ID and chip revision. Setting the conversion rate register value to 8 on chips not supporting it causes unexpected behavior since the real conversion rate is set to 0 (16 seconds) if a value of 8 is written into the conversion rate register. Limit the conversion rate register value to 7 for all G78x chips to avoid the problem.
--- drivers/hwmon/lm90.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/lm90.c +1 -1
@@ -373,7 +373,7 @@ static const struct lm90_params lm90_par .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT, .alert_alarms = 0x7c, - .max_convrate = 8, + .max_convrate = 7, }, [lm86] = { .flags =LM90_HAVE_OFFSET |LM90_HAVE_REM_LIMIT_EXT
Greg Kroah-Hartman
maintainerPATCH 114/200 NFSv4: Handle case where the lookup of a directory fails
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit ac795161c93699d600db16c1a8cc23a65a1eceaf upstream.
If the application sets the O_DIRECTORY flag, and tries to open a regular file, nfs_atomic_open() will punt to doing a regular lookup. If the server then returns a regular file, we will happily return a file descriptor with uninitialised open state.
The fix is to return the expected ENOTDIR error in these cases.
--- fs/nfs/dir.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
fs/nfs/dir.c +13 -0
@@ -1967,6 +1967,19 @@ out: no_open: res =nfs_lookup (dir, dentry, lookup_flags); +if (!res) { + inode =d_inode (dentry); +if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && + !S_ISDIR (inode->i_mode)) + res =ERR_PTR (-ENOTDIR ); + }else if (!IS_ERR (res)) { + inode =d_inode (res); +if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && + !S_ISDIR (inode->i_mode)) { +dput (res); + res =ERR_PTR (-ENOTDIR ); + } + }if (switched) {d_lookup_done (dentry);if (!res)
Greg Kroah-Hartman
maintainerPATCH 115/200 NFSv4: nfs_atomic_open() can race when looking up a non-regular file
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 1751fc1db36f6f411709e143d5393f92d12137a9 upstream.
If the file type changes back to being a regular file on the server between the failed OPEN and our LOOKUP, then we need to re-run the OPEN.
--- fs/nfs/dir.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/nfs/dir.c +5 -0
@@ -1972,12 +1972,17 @@ no_open:if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && !S_ISDIR (inode->i_mode)) res =ERR_PTR (-ENOTDIR ); +else if (inode &&S_ISREG (inode->i_mode)) + res =ERR_PTR (-EOPENSTALE ); }else if (!IS_ERR (res)) { inode =d_inode (res);if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && !S_ISDIR (inode->i_mode)) {dput (res); res =ERR_PTR (-ENOTDIR ); + }else if (inode &&S_ISREG (inode->i_mode)) { +dput (res); + res =ERR_PTR (-EOPENSTALE ); } }if (switched) {
Greg Kroah-Hartman
maintainerPATCH 116/200 net-procfs: show net devices bound packet types
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
commit 1d10f8a1f40b965d449e8f2d5ed7b96a7c138b77 upstream.
After commit:7866a621043f ("dev: add per net_device packet type chains"), we can not get packet types that are bound to a specified net device by /proc/net/ptype, this patch fix the regression.
Run "tcpdump -i ens192 udp -nns0" Before and after apply this patch:
Before:
[root@localhost ~]# cat /proc/net/ptype
Type Device Function
0800 ip_rcv 0806 arp_rcv 86dd ipv6_rcv
After:
[root@localhost ~]# cat /proc/net/ptype
Type Device Function
ALL ens192 tpacket_rcv 0800 ip_rcv 0806 arp_rcv 86dd ipv6_rcv
v1 -> v2:
- fix the regression rather than adding new /proc API as suggested by Stephen Hemminger.
--- net/core/net-procfs.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-)
net/core/net-procfs.c +32 -3
@@ -190,12 +190,23 @@ static const struct seq_operations softn .show = softnet_seq_show, }; -static void *ptype_get_idx (loff_t pos) +static void *ptype_get_idx (struct seq_file *seq,loff_t pos) { +struct list_head *ptype_list =NULL ;struct packet_type *pt =NULL ; +struct net_device *dev;loff_t i =0 ;int t; +for_each_netdev_rcu (seq_file_net (seq), dev) { + ptype_list = &dev->ptype_all; +list_for_each_entry_rcu (pt, ptype_list, list) { +if (i == pos) +return pt; + ++i; + } + } +list_for_each_entry_rcu (pt, &ptype_all, list) {if (i == pos)return pt;
@@ -216,22 +227,40 @@ static void *ptype_seq_start(struct seq___acquires (RCU ) {rcu_read_lock (); -return *pos ?ptype_get_idx (*pos -1 ) :SEQ_START_TOKEN ; +return *pos ?ptype_get_idx (seq, *pos -1 ) :SEQ_START_TOKEN ; }static void *ptype_seq_next (struct seq_file *seq,void *v,loff_t *pos) { +struct net_device *dev;struct packet_type *pt;struct list_head *nxt;int hash; ++*pos;if (v ==SEQ_START_TOKEN ) -return ptype_get_idx (0 ); +return ptype_get_idx (seq,0 ); pt = v; nxt = pt->list.next; +if (pt->dev) { +if (nxt != &pt->dev->ptype_all) + goto found; + + dev = pt->dev; +for_each_netdev_continue_rcu (seq_file_net (seq), dev) { +if (!list_empty (&dev->ptype_all)) { + nxt = dev->ptype_all.next; + goto found; + } + } + + nxt = ptype_all.next; + goto ptype_all; + } +if (pt->type ==htons (ETH_P_ALL )) { +ptype_all:if (nxt != &ptype_all) goto found; hash =0 ;
Greg Kroah-Hartman
maintainerPATCH 117/200 drm/msm: Fix wrong size calculation
In reply to Greg Kroah-HartmanFrom: Xianting Tian <[email protected]>
commit 0a727b459ee39bd4c5ced19d6024258ac87b6b2e upstream.
For example, memory-region in .dts as below,
reg = <0x0 0x50000000 0x0 0x20000000>
We can get below values,
struct resource r;
r.start = 0x50000000;
r.end = 0x6fffffff;
So the size should be:
size = r.end - r.start + 1 = 0x20000000
--- drivers/gpu/drm/msm/msm_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_drv.c +1 -1
@@ -466,7 +466,7 @@ static int msm_init_vram(struct drm_deviof_node_put (node);if (ret)return ret; - size = r.end - r.start; + size = r.end - r.start +1 ;DRM_INFO ("using VRAM carveout: %lx@%pa\n" , size, &r.start);/* if we have no IOMMU, then we need to use carveout allocator.
Greg Kroah-Hartman
maintainerPATCH 118/200 drm/msm/dsi: Fix missing put_device() call in dsi_get_phy
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
commit c04c3148ca12227d92f91b355b4538cc333c9922 upstream.
If of_find_device_by_node() succeeds, dsi_get_phy() doesn't a corresponding put_device(). Thus add put_device() to fix the exception handling.
--- drivers/gpu/drm/msm/dsi/dsi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/dsi.c +6 -1
@@ -40,7 +40,12 @@ static int dsi_get_phy(struct msm_dsi *mof_node_put (phy_node); -if (!phy_pdev || !msm_dsi->phy) { +if (!phy_pdev) { +DRM_DEV_ERROR (&pdev->dev,"%s: phy driver is not ready\n" , __func__); +return -EPROBE_DEFER ; + } +if (!msm_dsi->phy) { +put_device (&phy_pdev->dev);DRM_DEV_ERROR (&pdev->dev,"%s: phy driver is not ready\n" , __func__);return -EPROBE_DEFER ; }
Greg Kroah-Hartman
maintainerPATCH 119/200 drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable
In reply to Greg Kroah-HartmanFrom: José Expósito <[email protected]>
commit 5e761a2287234bc402ba7ef07129f5103bcd775c upstream.
The function performs a check on the "phy" input parameter, however, it is used before the check.
Initialize the "dev" variable after the sanity check to avoid a possible NULL pointer dereference.
Addresses-Coverity-ID: 1493860 ("Null pointer dereference")
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +3 -1
@@ -808,12 +808,14 @@ int msm_dsi_phy_enable(struct msm_dsi_phstruct msm_dsi_phy_clk_request *clk_req, struct msm_dsi_phy_shared_timings *shared_timings) { - struct device *dev = &phy->pdev->dev; + struct device *dev;int ret;if (!phy || !phy->cfg->ops.enable)return -EINVAL ; + dev = &phy->pdev->dev; + ret =dsi_phy_enable_resource (phy);if (ret) { DRM_DEV_ERROR(dev, "%s: resource enable failed, %d\n",
Greg Kroah-Hartman
maintainerPATCH 120/200 ipv6: annotate accesses to fn->fn_sernum
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit aafc2e3285c2d7a79b7ee15221c19fbeca7b1509 upstream.
struct fib6_node's fn_sernum field can be
read while other threads change it.
Add READ_ONCE()/WRITE_ONCE() annotations.
Do not change existing smp barriers in fib6_get_cookie_safe() and __fib6_update_sernum_upto_root()
syzbot reported:
BUG: KCSAN: data-race in fib6_clean_node / inet6_csk_route_socket
write to 0xffff88813df62e2c of 4 bytes by task 1920 on cpu 1:
fib6_clean_node+0xc2/0x260 net/ipv6/ip6_fib.c:2178 fib6_walk_continue+0x38e/0x430 net/ipv6/ip6_fib.c:2112 fib6_walk net/ipv6/ip6_fib.c:2160 [inline] fib6_clean_tree net/ipv6/ip6_fib.c:2240 [inline] __fib6_clean_all+0x1a9/0x2e0 net/ipv6/ip6_fib.c:2256 fib6_flush_trees+0x6c/0x80 net/ipv6/ip6_fib.c:2281 rt_genid_bump_ipv6 include/net/net_namespace.h:488 [inline] addrconf_dad_completed+0x57f/0x870 net/ipv6/addrconf.c:4230 addrconf_dad_work+0x908/0x1170 process_one_work+0x3f6/0x960 kernel/workqueue.c:2307 worker_thread+0x616/0xa70 kernel/workqueue.c:2454 kthread+0x1bf/0x1e0 kernel/kthread.c:359 ret_from_fork+0x1f/0x30
read to 0xffff88813df62e2c of 4 bytes by task 15701 on cpu 0:
fib6_get_cookie_safe include/net/ip6_fib.h:285 [inline] rt6_get_cookie include/net/ip6_fib.h:306 [inline] ip6_dst_store include/net/ip6_route.h:234 [inline] inet6_csk_route_socket+0x352/0x3c0 net/ipv6/inet6_connection_sock.c:109 inet6_csk_xmit+0x91/0x1e0 net/ipv6/inet6_connection_sock.c:121 __tcp_transmit_skb+0x1323/0x1840 net/ipv4/tcp_output.c:1402 tcp_transmit_skb net/ipv4/tcp_output.c:1420 [inline] tcp_write_xmit+0x1450/0x4460 net/ipv4/tcp_output.c:2680 __tcp_push_pending_frames+0x68/0x1c0 net/ipv4/tcp_output.c:2864 tcp_push+0x2d9/0x2f0 net/ipv4/tcp.c:725 mptcp_push_release net/mptcp/protocol.c:1491 [inline] __mptcp_push_pending+0x46c/0x490 net/mptcp/protocol.c:1578 mptcp_sendmsg+0x9ec/0xa50 net/mptcp/protocol.c:1764 inet6_sendmsg+0x5f/0x80 net/ipv6/af_inet6.c:643 sock_sendmsg_nosec net/socket.c:705 [inline] sock_sendmsg net/socket.c:725 [inline] kernel_sendmsg+0x97/0xd0 net/socket.c:745 sock_no_sendpage+0x84/0xb0 net/core/sock.c:3086 inet_sendpage+0x9d/0xc0 net/ipv4/af_inet.c:834 kernel_sendpage+0x187/0x200 net/socket.c:3492 sock_sendpage+0x5a/0x70 net/socket.c:1007 pipe_to_sendpage+0x128/0x160 fs/splice.c:364 splice_from_pipe_feed fs/splice.c:418 [inline] __splice_from_pipe+0x207/0x500 fs/splice.c:562 splice_from_pipe fs/splice.c:597 [inline] generic_splice_sendpage+0x94/0xd0 fs/splice.c:746 do_splice_from fs/splice.c:767 [inline] direct_splice_actor+0x80/0xa0 fs/splice.c:936 splice_direct_to_actor+0x345/0x650 fs/splice.c:891 do_splice_direct+0x106/0x190 fs/splice.c:979 do_sendfile+0x675/0xc40 fs/read_write.c:1245 __do_sys_sendfile64 fs/read_write.c:1310 [inline] __se_sys_sendfile64 fs/read_write.c:1296 [inline] __x64_sys_sendfile64+0x102/0x140 fs/read_write.c:1296 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae
value changed: 0x0000026f -> 0x00000271
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 15701 Comm: syz-executor.2 Not tainted 5.16.0-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
The Fixes tag I chose is probably arbitrary, I do not think we need to backport this patch to older kernels.
--- include/net/ip6_fib.h | 2 +- net/ipv6/ip6_fib.c | 23 +++++++++++++---------- net/ipv6/route.c | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-)
include/net/ip6_fib.h +1 -1
@@ -281,7 +281,7 @@ static inline bool fib6_get_cookie_safe( fn =rcu_dereference (f6i->fib6_node);if (fn) { - *cookie = fn->fn_sernum; + *cookie =READ_ONCE (fn->fn_sernum);/* pairs with smp_wmb() in __fib6_update_sernum_upto_root() */ smp_rmb (); status = true;
net/ipv6/ip6_fib.c +13 -10
@@ -111,7 +111,7 @@ void fib6_update_sernum(struct net *net, fn =rcu_dereference_protected (f6i->fib6_node,lockdep_is_held (&f6i->fib6_table->tb6_lock));if (fn) - fn->fn_sernum =fib6_new_sernum (net); +WRITE_ONCE (fn->fn_sernum,fib6_new_sernum (net)); }/*
@@ -589,12 +589,13 @@ static int fib6_dump_table(struct fib6_tspin_unlock_bh (&table->tb6_lock);if (res >0 ) { cb->args[4 ] =1 ; - cb->args[5 ] = w->root->fn_sernum; + cb->args[5 ] =READ_ONCE (w->root->fn_sernum); } }else { -if (cb->args[5 ] != w->root->fn_sernum) { +int sernum =READ_ONCE (w->root->fn_sernum); +if (cb->args[5 ] != sernum) {/* Begin at the root if the tree changed */ - cb->args[5 ] = w->root->fn_sernum; + cb->args[5 ] = sernum; w->state =FWS_INIT ; w->node = w->root; w->skip = w->count;
@@ -1344,7 +1345,7 @@ static void __fib6_update_sernum_upto_ro/* paired with smp_rmb() in fib6_get_cookie_safe() */ smp_wmb ();while (fn) { - fn->fn_sernum = sernum; +WRITE_ONCE (fn->fn_sernum, sernum); fn =rcu_dereference_protected (fn->parent,lockdep_is_held (&rt->fib6_table->tb6_lock)); }
@@ -2173,8 +2174,8 @@ static int fib6_clean_node(struct fib6_w };if (c->sernum !=FIB6_NO_SERNUM_CHANGE && - w->node->fn_sernum != c->sernum) - w->node->fn_sernum = c->sernum; +READ_ONCE (w->node->fn_sernum) != c->sernum) +WRITE_ONCE (w->node->fn_sernum, c->sernum);if (!c->func) {WARN_ON_ONCE (c->sernum ==FIB6_NO_SERNUM_CHANGE );
@@ -2542,7 +2543,7 @@ static void ipv6_route_seq_setup_walk(st iter->w.state =FWS_INIT ; iter->w.node = iter->w.root; iter->w.args = iter; - iter->sernum = iter->w.root->fn_sernum; + iter->sernum =READ_ONCE (iter->w.root->fn_sernum);INIT_LIST_HEAD (&iter->w.lh);fib6_walker_link (net, &iter->w); }
@@ -2570,8 +2571,10 @@ static struct fib6_table *ipv6_route_seqstatic void ipv6_route_check_sernum (struct ipv6_route_iter *iter) { -if (iter->sernum != iter->w.root->fn_sernum) { - iter->sernum = iter->w.root->fn_sernum; +int sernum =READ_ONCE (iter->w.root->fn_sernum); + +if (iter->sernum != sernum) { + iter->sernum = sernum; iter->w.state =FWS_INIT ; iter->w.node = iter->w.root;WARN_ON (iter->w.skip);
net/ipv6/route.c +1 -1
@@ -2802,7 +2802,7 @@ static void ip6_link_failure(struct sk_bif (from) { fn =rcu_dereference (from->fib6_node);if (fn && (rt->rt6i_flags &RTF_DEFAULT )) - fn->fn_sernum =-1 ; +WRITE_ONCE (fn->fn_sernum,-1 ); } }rcu_read_unlock ();
Greg Kroah-Hartman
maintainerPATCH 121/200 NFS: Ensure the server has an up to date ctime before hardlinking
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit 204975036b34f55237bc44c8a302a88468ef21b5 ]
Creating a hard link is required by POSIX to update the file ctime, so ensure that the file data is synced to disk so that we don't clobber the updated ctime by writing back after creating the hard link.
--- fs/nfs/dir.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfs/dir.c +2 -0
@@ -2397,6 +2397,8 @@ nfs_link(struct dentry *old_dentry, strutrace_nfs_link_enter (inode, dir, dentry);d_drop (dentry); +if (S_ISREG (inode->i_mode)) +nfs_sync_inode (inode); error =NFS_PROTO (dir)->link (inode, dir, &dentry->d_name);if (error ==0 ) {nfs_set_verifier (dentry,nfs_save_change_attribute (dir));
Greg Kroah-Hartman
maintainerPATCH 122/200 NFS: Ensure the server has an up to date ctime before renaming
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit 6ff9d99bb88faebf134ca668842349d9718e5464 ]
Renaming a file is required by POSIX to update the file ctime, so ensure that the file data is synced to disk so that we don't clobber the updated ctime by writing back after creating the hard link.
--- fs/nfs/dir.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfs/dir.c +2 -0
@@ -2488,6 +2488,8 @@ int nfs_rename(struct user_namespace *mn } } +if (S_ISREG (old_inode->i_mode)) +nfs_sync_inode (old_inode); task =nfs_async_rename (old_dir, new_dir, old_dentry, new_dentry,NULL );if (IS_ERR (task)) { error =PTR_ERR (task);
Greg Kroah-Hartman
maintainerPATCH 123/200 KVM: arm64: pkvm: Use the mm_ops indirection for cache maintenance
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
[ Upstream commit 094d00f8ca58c5d29b25e23b4daaed1ff1f13b41 ]
CMOs issued from EL2 cannot directly use the kernel helpers, as EL2 doesn't have a mapping of the guest pages. Oops.
Instead, use the mm_ops indirection to use helpers that will perform a mapping at EL2 and allow the CMO to be effective.
--- arch/arm64/kvm/hyp/pgtable.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
arch/arm64/kvm/hyp/pgtable.c +6 -12
@@ -921,13 +921,9 @@ static int stage2_unmap_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,*/ stage2_put_pte (ptep, mmu, addr, level, mm_ops); -if (need_flush) { -kvm_pte_t *pte_follow =kvm_pte_follow (pte, mm_ops); - -dcache_clean_inval_poc ((unsigned long )pte_follow, - (unsigned long )pte_follow + -kvm_granule_size (level)); - } +if (need_flush && mm_ops->dcache_clean_inval_poc) + mm_ops->dcache_clean_inval_poc (kvm_pte_follow (pte, mm_ops), +kvm_granule_size (level));if (childp) mm_ops->put_page (childp);
@@ -1089,15 +1085,13 @@ static int stage2_flush_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,struct kvm_pgtable *pgt = arg;struct kvm_pgtable_mm_ops *mm_ops = pgt->mm_ops;kvm_pte_t pte = *ptep; -kvm_pte_t *pte_follow;if (!kvm_pte_valid (pte) || !stage2_pte_cacheable (pgt, pte))return 0 ; - pte_follow =kvm_pte_follow (pte, mm_ops); -dcache_clean_inval_poc ((unsigned long )pte_follow, - (unsigned long )pte_follow + -kvm_granule_size (level)); +if (mm_ops->dcache_clean_inval_poc) + mm_ops->dcache_clean_inval_poc (kvm_pte_follow (pte, mm_ops), +kvm_granule_size (level));return 0 ; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 124/200 SUNRPC: Dont dereference xprt->snd_task if its a cookie
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit aed28b7a2d620cb5cd0c554cb889075c02e25e8e ]
--- include/trace/events/sunrpc.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
include/trace/events/sunrpc.h +13 -5
@@ -953,7 +953,8 @@ TRACE_EVENT(rpc_socket_nospace, { BIT(XPRT_REMOVE), "REMOVE" }, \ { BIT(XPRT_CONGESTED), "CONGESTED" }, \ { BIT(XPRT_CWND_WAIT), "CWND_WAIT" }, \ - { BIT(XPRT_WRITE_SPACE), "WRITE_SPACE" }) + { BIT(XPRT_WRITE_SPACE), "WRITE_SPACE" }, \ + { BIT(XPRT_SND_IS_COOKIE), "SND_IS_COOKIE" }) DECLARE_EVENT_CLASS(rpc_xprt_lifetime_class, TP_PROTO(
@@ -1150,8 +1151,11 @@ DECLARE_EVENT_CLASS(xprt_writelock_event, __entry->task_id =-1 ; __entry->client_id =-1 ; } - __entry->snd_task_id = xprt->snd_task ? - xprt->snd_task->tk_pid :-1 ; +if (xprt->snd_task && + !test_bit (XPRT_SND_IS_COOKIE , &xprt->state)) + __entry->snd_task_id = xprt->snd_task->tk_pid; +else + __entry->snd_task_id =-1 ; ), TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
@@ -1196,8 +1200,12 @@ DECLARE_EVENT_CLASS(xprt_cong_event, __entry->task_id =-1 ; __entry->client_id =-1 ; } - __entry->snd_task_id = xprt->snd_task ? - xprt->snd_task->tk_pid :-1 ; +if (xprt->snd_task && + !test_bit (XPRT_SND_IS_COOKIE , &xprt->state)) + __entry->snd_task_id = xprt->snd_task->tk_pid; +else + __entry->snd_task_id =-1 ; + __entry->cong = xprt->cong; __entry->cwnd = xprt->cwnd; __entry->wait =test_bit (XPRT_CWND_WAIT , &xprt->state);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 125/200 powerpc64/bpf: Limit ldbrx to processors compliant with ISA v2.06
In reply to Greg Kroah-HartmanFrom: Naveen N. Rao <[email protected]>
[ Upstream commit 3f5f766d5f7f95a69a630da3544a1a0cee1cdddf ]
Johan reported the below crash with test_bpf on ppc64 e5500:
test_bpf: #296 ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301 jited:1
Oops: Exception in kernel mode, sig: 4 [#1] BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500 Modules linked in: test_bpf(+) CPU: 0 PID: 76 Comm: insmod Not tainted 5.14.0-03771-g98c2059e008a-dirty #1 NIP: 8000000000061c3c LR: 80000000006dea64 CTR: 8000000000061c18 REGS: c0000000032d3420 TRAP: 0700 Not tainted (5.14.0-03771-g98c2059e008a-dirty) MSR: 0000000080089000 <EE,ME> CR: 88002822 XER: 20000000 IRQMASK: 0 <...> NIP [8000000000061c3c] 0x8000000000061c3c LR [80000000006dea64] .__run_one+0x104/0x17c [test_bpf] Call Trace: .__run_one+0x60/0x17c [test_bpf] (unreliable) .test_bpf_init+0x6a8/0xdc8 [test_bpf] .do_one_initcall+0x6c/0x28c .do_init_module+0x68/0x28c .load_module+0x2460/0x2abc .__do_sys_init_module+0x120/0x18c .system_call_exception+0x110/0x1b8 system_call_common+0xf0/0x210 --- interrupt: c00 at 0x101d0acc <...> ---[ end trace 47b2bf19090bb3d0 ]---
Illegal instruction
The illegal instruction turned out to be 'ldbrx' emitted for BPF_FROM_[L|B]E, which was only introduced in ISA v2.06. Guard use of the same and implement an alternative approach for older processors.
--- arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/net/bpf_jit_comp64.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-)
arch/powerpc/include/asm/ppc-opcode.h +1 -0
@@ -498,6 +498,7 @@#define PPC_RAW_LDX (r, base, b) (0x7c00002a | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))#define PPC_RAW_LHZ (r, base, i) (0xa0000000 | ___PPC_RT(r) | ___PPC_RA(base) | IMM_L(i))#define PPC_RAW_LHBRX (r, base, b) (0x7c00062c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b)) +#define PPC_RAW_LWBRX (r, base, b) (0x7c00042c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))#define PPC_RAW_LDBRX (r, base, b) (0x7c000428 | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))#define PPC_RAW_STWCX (s, a, b) (0x7c00012d | ___PPC_RS(s) | ___PPC_RA(a) | ___PPC_RB(b))#define PPC_RAW_CMPWI (a, i) (0x2c000000 | ___PPC_RA(a) | IMM_L(i))
arch/powerpc/net/bpf_jit_comp64.c +13 -9
@@ -633,17 +633,21 @@ bpf_alu32_trunc:EMIT (PPC_RAW_MR (dst_reg, b2p[TMP_REG_1 ]));break ;case 64 : -/* -* Way easier and faster(?) to store the value -* into stack and then use ldbrx -* -* ctx->seen will be reliable in pass2, but -* the instructions generated will remain the -* same across all passes -*/ +/* Store the value to stack and then use byte-reverse loads */ PPC_BPF_STL (dst_reg,1 ,bpf_jit_stack_local (ctx));EMIT (PPC_RAW_ADDI (b2p[TMP_REG_1 ],1 ,bpf_jit_stack_local (ctx))); -EMIT (PPC_RAW_LDBRX (dst_reg,0 , b2p[TMP_REG_1 ])); +if (cpu_has_feature (CPU_FTR_ARCH_206 )) { +EMIT (PPC_RAW_LDBRX (dst_reg,0 , b2p[TMP_REG_1 ])); + }else { +EMIT (PPC_RAW_LWBRX (dst_reg,0 , b2p[TMP_REG_1 ])); +if (IS_ENABLED (CONFIG_CPU_LITTLE_ENDIAN )) +EMIT (PPC_RAW_SLDI (dst_reg, dst_reg,32 )); +EMIT (PPC_RAW_LI (b2p[TMP_REG_2 ],4 )); +EMIT (PPC_RAW_LWBRX (b2p[TMP_REG_2 ], b2p[TMP_REG_2 ], b2p[TMP_REG_1 ])); +if (IS_ENABLED (CONFIG_CPU_BIG_ENDIAN )) +EMIT (PPC_RAW_SLDI (b2p[TMP_REG_2 ], b2p[TMP_REG_2 ],32 )); +EMIT (PPC_RAW_OR (dst_reg, dst_reg, b2p[TMP_REG_2 ])); + }break ; }break ;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 126/200 netfilter: conntrack: dont increment invalid counter on NF_REPEAT
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 830af2eba40327abec64325a5b08b1e85c37a2e0 ]
The packet isn't invalid, REPEAT means we're trying again after cleaning out a stale connection, e.g. via tcp tracker.
This caused increases of invalid stat counter in a test case involving frequent connection reuse, even though no packet is actually invalid.
--- net/netfilter/nf_conntrack_core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/netfilter/nf_conntrack_core.c +5 -3
@@ -1922,15 +1922,17 @@ repeat:pr_debug ("nf_conntrack_in: Can't track with proto module\n" );nf_conntrack_put (&ct->ct_general); skb->_nfct =0 ; -NF_CT_STAT_INC_ATOMIC (state->net, invalid); -if (ret == -NF_DROP ) -NF_CT_STAT_INC_ATOMIC (state->net, drop);/* Special case: TCP tracker reports an attempt to reopen a * closed/aborted connection. We have to go back and create a * fresh conntrack. */ if (ret == -NF_REPEAT ) goto repeat; + +NF_CT_STAT_INC_ATOMIC (state->net, invalid); +if (ret == -NF_DROP ) +NF_CT_STAT_INC_ATOMIC (state->net, drop); + ret = -ret; goto out; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 127/200 remoteproc: qcom: q6v5: fix service routines build errors
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit eee412e968f7b950564880bc6a7a9f00f49034da ]
When CONFIG_QCOM_AOSS_QMP=m and CONFIG_QCOM_Q6V5_MSS=y, the builtin driver cannot call into the loadable module's low-level service functions. Trying to build with that config combo causes linker errors.
There are two problems here. First, drivers/remoteproc/qcom_q6v5.c should #include <linux/soc/qcom/qcom_aoss.h> for the definitions of the service functions, depending on whether CONFIG_QCOM_AOSS_QMP is set/enabled or not. Second, the qcom remoteproc drivers should depend on QCOM_AOSS_QMP iff it is enabled (=y or =m) so that the qcom remoteproc drivers can be built properly.
This prevents these build errors:
aarch64-linux-ld: drivers/remoteproc/qcom_q6v5.o: in function `q6v5_load_state_toggle':
qcom_q6v5.c:(.text+0xc4): undefined reference to `qmp_send'
aarch64-linux-ld: drivers/remoteproc/qcom_q6v5.o: in function `qcom_q6v5_deinit':
(.text+0x2e4): undefined reference to `qmp_put'
aarch64-linux-ld: drivers/remoteproc/qcom_q6v5.o: in function `qcom_q6v5_init':
(.text+0x778): undefined reference to `qmp_get'
aarch64-linux-ld: (.text+0x7d8): undefined reference to `qmp_put'
--- drivers/remoteproc/Kconfig | 4 ++++ drivers/remoteproc/qcom_q6v5.c | 1 + 2 files changed, 5 insertions(+)
drivers/remoteproc/Kconfig +4 -0
@@ -180,6 +180,7 @@ config QCOM_Q6V5_ADSP depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n depends on QCOM_SYSMON || QCOM_SYSMON=n depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n + depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n select MFD_SYSCON select QCOM_PIL_INFO select QCOM_MDT_LOADER
@@ -199,6 +200,7 @@ config QCOM_Q6V5_MSS depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n depends on QCOM_SYSMON || QCOM_SYSMON=n depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n + depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n select MFD_SYSCON select QCOM_MDT_LOADER select QCOM_PIL_INFO
@@ -218,6 +220,7 @@ config QCOM_Q6V5_PAS depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n depends on QCOM_SYSMON || QCOM_SYSMON=n depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n + depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n select MFD_SYSCON select QCOM_PIL_INFO select QCOM_MDT_LOADER
@@ -239,6 +242,7 @@ config QCOM_Q6V5_WCSS depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n depends on QCOM_SYSMON || QCOM_SYSMON=n depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n + depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n select MFD_SYSCON select QCOM_MDT_LOADER select QCOM_PIL_INFO
drivers/remoteproc/qcom_q6v5.c +1 -0
@@ -10,6 +10,7 @@#include <linux/platform_device.h> #include <linux/interrupt.h> #include <linux/module.h> +#include <linux/soc/qcom/qcom_aoss.h> #include <linux/soc/qcom/smem.h> #include <linux/soc/qcom/smem_state.h> #include <linux/remoteproc.h>
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 128/200 powerpc/64s: Mask SRR0 before checking against the masked NIP
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit aee101d7b95a03078945681dd7f7ea5e4a1e7686 ]
Commit 314f6c23dd8d ("powerpc/64s: Mask NIP before checking against SRR0") masked off the low 2 bits of the NIP value in the interrupt stack frame in case they are non-zero and mis-compare against a SRR0 register value of a CPU which always reads back 0 from the 2 low bits which are reserved.
This now causes the opposite problem that an implementation which does implement those bits in SRR0 will mis-compare against the masked NIP value in which they have been cleared. QEMU is one such implementation, and this is allowed by the architecture.
This can be triggered by sigfuz by setting low bits of PT_NIP in the signal context.
Fix this for now by masking the SRR0 bits as well. Cleaner is probably to sanitise these values before putting them in registers or stack, but this is the quick and backportable fix.
--- arch/powerpc/kernel/interrupt_64.S | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/kernel/interrupt_64.S +2 -0
@@ -30,6 +30,7 @@ COMPAT_SYS_CALL_TABLE: .ifc \srr,srr mfspr r11,SPRN_SRR0 ld r12,_NIP(r1) + clrrdi r11,r11,2 clrrdi r12,r12,2 100: tdne r11,r12 EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
@@ -40,6 +41,7 @@ COMPAT_SYS_CALL_TABLE: .else mfspr r11,SPRN_HSRR0 ld r12,_NIP(r1) + clrrdi r11,r11,2 clrrdi r12,r12,2 100: tdne r11,r12 EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 129/200 perf: Fix perf_event_read_local() time
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit 09f5e7dc7ad705289e1b1ec065439aa3c42951c4 ]
Time readers that cannot take locks (due to NMI etc..) currently make use of perf_event::shadow_ctx_time, which, for that event gives:
time' = now + (time - timestamp)
or, alternatively arranged:
time' = time + (now - timestamp)
IOW, the progression of time since the last time the shadow_ctx_time was updated.
There's problems with this:
A) the shadow_ctx_time is per-event, even though the ctx_time it reflects is obviously per context. The direct concequence of this is that the context needs to iterate all events all the time to keep the shadow_ctx_time in sync.
B) even with the prior point, the context itself might not be active meaning its time should not advance to begin with.
C) shadow_ctx_time isn't consistently updated when ctx_time is
There are 3 users of this stuff, that suffer differently from this:
- calc_timer_values()
- perf_output_read()
- perf_event_update_userpage() /* A */
- perf_event_read_local() /* A,B */
In particular, perf_output_read() doesn't suffer at all, because it's sample driven and hence only relevant when the event is actually running.
This same was supposed to be true for perf_event_update_userpage(), after all self-monitoring implies the context is active *HOWEVER*, as per commit f79256532682 ("perf/core: fix userpage->time_enabled of inactive events") this goes wrong when combined with counter overcommit, in that case those events that do not get scheduled when the context becomes active (task events typically) miss out on the EVENT_TIME update and ENABLED time is inflated (for a little while) with the time the context was inactive. Once the event gets rotated in, this gets corrected, leading to a non-monotonic timeflow.
perf_event_read_local() made things even worse, it can request time at any point, suffering all the problems perf_event_update_userpage() does and more. Because while perf_event_update_userpage() is limited by the context being active, perf_event_read_local() users have no such constraint.
Therefore, completely overhaul things and do away with perf_event::shadow_ctx_time. Instead have regular context time updates keep track of this offset directly and provide perf_event_time_now() to complement perf_event_time().
perf_event_time_now() will, in adition to being context wide, also take into account if the context is active. For inactive context, it will not advance time.
This latter property means the cgroup perf_cgroup_info context needs to grow addition state to track this.
Additionally, since all this is strictly per-cpu, we can use barrier() to order context activity vs context time.
--- include/linux/perf_event.h | 15 +-- kernel/events/core.c | 246 ++++++++++++++++++++++--------------- 2 files changed, 149 insertions(+), 112 deletions(-)
include/linux/perf_event.h +3 -12
@@ -681,18 +681,6 @@ struct perf_event {u64 total_time_running;u64 tstamp; -/* -* timestamp shadows the actual context timing but it can -* be safely used in NMI interrupt context. It reflects the -* context time as it was when the event was last scheduled in, -* or when ctx_sched_in failed to schedule the event because we -* run out of PMC. -* -* ctx_time already accounts for ctx->timestamp. Therefore to -* compute ctx_time for a sample, simply add perf_clock(). -*/ -u64 shadow_ctx_time; -struct perf_event_attr attr;u16 header_size;u16 id_header_size;
@@ -839,6 +827,7 @@ struct perf_event_context {*/ u64 time;u64 timestamp; +u64 timeoffset;/* * These fields let us detect when two contexts have both
@@ -921,6 +910,8 @@ struct bpf_perf_event_data_kern {struct perf_cgroup_info {u64 time;u64 timestamp; +u64 timeoffset; +int active; };struct perf_cgroup {
kernel/events/core.c +146 -100
420 lines not on this page · raw message
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 130/200 sched/pelt: Relax the sync of util_sum with util_avg
In reply to Greg Kroah-HartmanFrom: Vincent Guittot <[email protected]>
[ Upstream commit 98b0d890220d45418cfbc5157b3382e6da5a12ab ]
Rick reported performance regressions in bugzilla because of cpu frequency being lower than before:
https://bugzilla.kernel.org/show_bug.cgi?id=215045
He bisected the problem to:
commit 1c35b07e6d39 ("sched/fair: Ensure _sum and _avg values stay consistent")
This commit forces util_sum to be synced with the new util_avg after removing the contribution of a task and before the next periodic sync. By doing so util_sum is rounded to its lower bound and might lost up to LOAD_AVG_MAX-1 of accumulated contribution which has not yet been reflected in util_avg.
Instead of always setting util_sum to the low bound of util_avg, which can significantly lower the utilization of root cfs_rq after propagating the change down into the hierarchy, we revert the change of util_sum and propagate the difference.
In addition, we also check that cfs's util_sum always stays above the lower bound for a given util_avg as it has been observed that sched_entity's util_sum is sometimes above cfs one.
--- kernel/sched/fair.c | 16 +++++++++++++--- kernel/sched/pelt.h | 4 +++- 2 files changed, 16 insertions(+), 4 deletions(-)
kernel/sched/fair.c +13 -3
@@ -3382,7 +3382,6 @@ void set_task_rq_fair(struct sched_entity *se, se->avg.last_update_time = n_last_update_time; } -/* * When on migration a sched_entity joins/leaves the PELT hierarchy, we need to * propagate its contribution. The key to this propagation is the invariant
@@ -3450,7 +3449,6 @@ void set_task_rq_fair(struct sched_entity *se,* XXX: only do this for the part of runnable > running ? * */ -static inline void update_tg_cfs_util (struct cfs_rq *cfs_rq,struct sched_entity *se,struct cfs_rq *gcfs_rq) {
@@ -3682,7 +3680,19 @@ update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq) r = removed_util;sub_positive (&sa->util_avg, r); - sa->util_sum = sa->util_avg * divider; +sub_positive (&sa->util_sum, r * divider); +/* +* Because of rounding, se->util_sum might ends up being +1 more than +* cfs->util_sum. Although this is not a problem by itself, detaching +* a lot of tasks with the rounding problem between 2 updates of +* util_avg (~1ms) can make cfs->util_sum becoming null whereas +* cfs_util_avg is not. +* Check that util_sum is still above its lower bound for the new +* util_avg. Given that period_contrib might have moved since the last +* sync, we are only sure that util_sum must be above or equal to +* util_avg * minimum possible divider +*/ + sa->util_sum =max_t (u32, sa->util_sum, sa->util_avg *PELT_MIN_DIVIDER ); r = removed_runnable;sub_positive (&sa->runnable_avg, r);
kernel/sched/pelt.h +3 -1
@@ -37,9 +37,11 @@ update_irq_load_avg(struct rq *rq, u64 running) }#endif +#define PELT_MIN_DIVIDER (LOAD_AVG_MAX - 1024) +static inline u32 get_pelt_divider (struct sched_avg *avg) { -return LOAD_AVG_MAX -1024 + avg->period_contrib; +return PELT_MIN_DIVIDER + avg->period_contrib; }static inline void cfs_se_util_change (struct sched_avg *avg)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 131/200 net: phy: broadcom: hook up soft_reset for BCM54616S
In reply to Greg Kroah-HartmanFrom: Robert Hancock <[email protected]>
[ Upstream commit d15c7e875d44367005370e6a82e8f3a382a04f9b ]
A problem was encountered with the Bel-Fuse 1GBT-SFP05 SFP module (which is a 1 Gbps copper module operating in SGMII mode with an internal BCM54616S PHY device) using the Xilinx AXI Ethernet MAC core, where the module would work properly on the initial insertion or boot of the device, but after the device was rebooted, the link would either only come up at 100 Mbps speeds or go up and down erratically.
I found no meaningful changes in the PHY configuration registers between the working and non-working boots, but the status registers seemed to have a lot of error indications set on the SERDES side of the device on the non-working boot. I suspect the problem is that whatever happens on the SGMII link when the device is rebooted and the FPGA logic gets reloaded ends up putting the module's onboard PHY into a bad state.
Since commit 6e2d85ec0559 ("net: phy: Stop with excessive soft reset") the genphy_soft_reset call is not made automatically by the PHY core unless the callback is explicitly specified in the driver structure. For most of these Broadcom devices, there is probably a hardware reset that gets asserted to reset the PHY during boot, however for SFP modules (where the BCM54616S is commonly found) no such reset line exists, so if the board keeps the SFP cage powered up across a reboot, it will end up with no reset occurring during reboots.
Hook up the genphy_soft_reset callback for BCM54616S to ensure that a PHY reset is performed before the device is initialized. This appears to fix the issue with erratic operation after a reboot with this SFP module.
--- drivers/net/phy/broadcom.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/phy/broadcom.c +1 -0
@@ -854,6 +854,7 @@ static struct phy_driver broadcom_drivers[] = { .phy_id_mask = 0xfffffff0, .name = "Broadcom BCM54616S",/* PHY_GBIT_FEATURES */ + .soft_reset = genphy_soft_reset, .config_init = bcm54xx_config_init, .config_aneg = bcm54616s_config_aneg, .config_intr = bcm_phy_config_intr,
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 132/200 ethtool: Fix link extended state for big endian
In reply to Greg Kroah-HartmanFrom: Moshe Tal <[email protected]>
[ Upstream commit e2f08207c558bc0bc8abaa557cdb29bad776ac7b ]
The link extended sub-states are assigned as enum that is an integer size but read from a union as u8, this is working for small values on little endian systems but for big endian this always give 0. Fix the variable in the union to match the enum size.
--- include/linux/ethtool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/ethtool.h +1 -1
@@ -95,7 +95,7 @@ struct ethtool_link_ext_state_info {enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity;enum ethtool_link_ext_substate_cable_issue cable_issue;enum ethtool_link_ext_substate_module module; -u8 __link_ext_substate; +u32 __link_ext_substate; }; };
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 133/200 net: stmmac: dwmac-visconti: Fix bit definitions for ETHER_CLK_SEL
In reply to Greg Kroah-HartmanFrom: Yuji Ishikawa <[email protected]>
[ Upstream commit 1ba1a4a90fa416a6f389206416c5f488cf8b1543 ]
just 0 should be used to represent cleared bits
* ETHER_CLK_SEL_DIV_SEL_20
* ETHER_CLK_SEL_TX_CLK_EXT_SEL_IN
* ETHER_CLK_SEL_RX_CLK_EXT_SEL_IN
* ETHER_CLK_SEL_TX_CLK_O_TX_I
* ETHER_CLK_SEL_RMII_CLK_SEL_IN
--- drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c +5 -5
@@ -22,21 +22,21 @@#define ETHER_CLK_SEL_RMII_CLK_EN BIT(2)#define ETHER_CLK_SEL_RMII_CLK_RST BIT(3)#define ETHER_CLK_SEL_DIV_SEL_2 BIT(4) -#define ETHER_CLK_SEL_DIV_SEL_20 BIT(0) +#define ETHER_CLK_SEL_DIV_SEL_20 0#define ETHER_CLK_SEL_FREQ_SEL_125M (BIT(9) | BIT(8))#define ETHER_CLK_SEL_FREQ_SEL_50M BIT(9)#define ETHER_CLK_SEL_FREQ_SEL_25M BIT(8)#define ETHER_CLK_SEL_FREQ_SEL_2P5M 0 -#define ETHER_CLK_SEL_TX_CLK_EXT_SEL_IN BIT(0) +#define ETHER_CLK_SEL_TX_CLK_EXT_SEL_IN 0#define ETHER_CLK_SEL_TX_CLK_EXT_SEL_TXC BIT(10)#define ETHER_CLK_SEL_TX_CLK_EXT_SEL_DIV BIT(11) -#define ETHER_CLK_SEL_RX_CLK_EXT_SEL_IN BIT(0) +#define ETHER_CLK_SEL_RX_CLK_EXT_SEL_IN 0#define ETHER_CLK_SEL_RX_CLK_EXT_SEL_RXC BIT(12)#define ETHER_CLK_SEL_RX_CLK_EXT_SEL_DIV BIT(13) -#define ETHER_CLK_SEL_TX_CLK_O_TX_I BIT(0) +#define ETHER_CLK_SEL_TX_CLK_O_TX_I 0#define ETHER_CLK_SEL_TX_CLK_O_RMII_I BIT(14)#define ETHER_CLK_SEL_TX_O_E_N_IN BIT(15) -#define ETHER_CLK_SEL_RMII_CLK_SEL_IN BIT(0) +#define ETHER_CLK_SEL_RMII_CLK_SEL_IN 0#define ETHER_CLK_SEL_RMII_CLK_SEL_RX_C BIT(16)#define ETHER_CLK_SEL_RX_TX_CLK_EN (ETHER_CLK_SEL_RX_CLK_EN | ETHER_CLK_SEL_TX_CLK_EN)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 134/200 net: stmmac: dwmac-visconti: Fix clock configuration for RMII mode
In reply to Greg Kroah-HartmanFrom: Yuji Ishikawa <[email protected]>
[ Upstream commit 0959bc4bd4206433ed101a1332a23e93ad16ec77 ]
Bit pattern of the ETHER_CLOCK_SEL register for RMII/MII mode should be fixed. Also, some control bits should be modified with a specific sequence.
--- .../ethernet/stmicro/stmmac/dwmac-visconti.c | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c +21 -11
@@ -96,31 +96,41 @@ static void visconti_eth_fix_mac_speed(void *priv, unsigned int speed) val |=ETHER_CLK_SEL_TX_O_E_N_IN ;writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); +/* Set Clock-Mux, Start clock, Set TX_O direction */ switch (dwmac->phy_intf_sel) {case ETHER_CONFIG_INTF_RGMII : val = clk_sel_val |ETHER_CLK_SEL_RX_CLK_EXT_SEL_RXC ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); + + val |=ETHER_CLK_SEL_RX_TX_CLK_EN ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); + + val &= ~ETHER_CLK_SEL_TX_O_E_N_IN ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL );break ;case ETHER_CONFIG_INTF_RMII : val = clk_sel_val |ETHER_CLK_SEL_RX_CLK_EXT_SEL_DIV | -ETHER_CLK_SEL_TX_CLK_EXT_SEL_TXC |ETHER_CLK_SEL_TX_O_E_N_IN | +ETHER_CLK_SEL_TX_CLK_EXT_SEL_DIV |ETHER_CLK_SEL_TX_O_E_N_IN |ETHER_CLK_SEL_RMII_CLK_SEL_RX_C ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); + + val |=ETHER_CLK_SEL_RMII_CLK_RST ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); + + val |=ETHER_CLK_SEL_RMII_CLK_EN |ETHER_CLK_SEL_RX_TX_CLK_EN ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL );break ;case ETHER_CONFIG_INTF_MII :default : val = clk_sel_val |ETHER_CLK_SEL_RX_CLK_EXT_SEL_RXC | -ETHER_CLK_SEL_TX_CLK_EXT_SEL_DIV |ETHER_CLK_SEL_TX_O_E_N_IN | -ETHER_CLK_SEL_RMII_CLK_EN ; +ETHER_CLK_SEL_TX_CLK_EXT_SEL_TXC |ETHER_CLK_SEL_TX_O_E_N_IN ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); + + val |=ETHER_CLK_SEL_RX_TX_CLK_EN ; +writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL );break ; } -/* Start clock */ -writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); - val |=ETHER_CLK_SEL_RX_TX_CLK_EN ; -writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); - - val &= ~ETHER_CLK_SEL_TX_O_E_N_IN ; -writel (val, dwmac->reg +REG_ETHER_CLOCK_SEL ); -spin_unlock_irqrestore (&dwmac->lock, flags); }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 135/200 phylib: fix potential use-after-free
In reply to Greg Kroah-HartmanFrom: Marek Behún <[email protected]>
[ Upstream commit cbda1b16687580d5beee38273f6241ae3725960c ]
Commit bafbdd527d56 ("phylib: Add device reset GPIO support") added call to phy_device_reset(phydev) after the put_device() call in phy_detach().
The comment before the put_device() call says that the phydev might go away with put_device().
Fix potential use-after-free by calling phy_device_reset() before put_device().
--- drivers/net/phy/phy_device.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/phy/phy_device.c +3 -3
@@ -1746,6 +1746,9 @@ void phy_detach(struct phy_device *phydev) phy_driver_is_genphy_10g(phydev))device_release_driver (&phydev->mdio.dev); +/* Assert the reset signal */ +phy_device_reset (phydev,1 ); +/* * The phydev might go away on the put_device() below, so avoid * a use-after-free bug by reading the underlying bus first.
@@ -1757,9 +1760,6 @@ void phy_detach(struct phy_device *phydev) ndev_owner = dev->dev.parent->driver->owner;if (ndev_owner != bus->owner)module_put (bus->owner); - -/* Assert the reset signal */ -phy_device_reset (phydev,1 ); }EXPORT_SYMBOL (phy_detach);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 136/200 mptcp: allow changing the "backup" bit by endpoint id
In reply to Greg Kroah-HartmanFrom: Davide Caratti <[email protected]>
[ Upstream commit 602837e8479d20d49559b4b97b79d34c0efe7ecb ]
a non-zero 'id' is sufficient to identify MPTCP endpoints: allow changing the value of 'backup' bit by simply specifying the endpoint id.
--- net/mptcp/pm_netlink.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
net/mptcp/pm_netlink.c +10 -4
@@ -1711,22 +1711,28 @@ next:static int mptcp_nl_cmd_set_flags (struct sk_buff *skb,struct genl_info *info) { +struct mptcp_pm_addr_entry addr = { .addr = { .family =AF_UNSPEC }, }, *entry;struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR ];struct pm_nl_pernet *pernet =genl_info_pm_nl (info); -struct mptcp_pm_addr_entry addr, *entry;struct net *net =sock_net (skb->sk); -u8 bkup =0 ; +u8 bkup =0 , lookup_by_id =0 ;int ret; - ret =mptcp_pm_parse_addr (attr, info, true, &addr); + ret =mptcp_pm_parse_addr (attr, info, false, &addr);if (ret <0 )return ret;if (addr.flags &MPTCP_PM_ADDR_FLAG_BACKUP ) bkup =1 ; +if (addr.addr.family ==AF_UNSPEC ) { + lookup_by_id =1 ; +if (!addr.addr.id) +return -EOPNOTSUPP ; + }list_for_each_entry (entry, &pernet->local_addr_list, list) { -if (addresses_equal (&entry->addr, &addr.addr, true)) { +if ((!lookup_by_id &&addresses_equal (&entry->addr, &addr.addr, true)) || + (lookup_by_id && entry->addr.id == addr.addr.id)) {mptcp_nl_addr_backup (net, &entry->addr, bkup);if (bkup)
Signature · 1 line
2.34.1
Re: [PATCH 5.16 136/200] mptcp: allow changing the "backup" bit by endpoint id
Quoted 4 lines · Greg Kroah-Hartman
From: Davide Caratti <[email protected]>
[ Upstream commit
602837e8479d20d49559b4b97b79d34c0efe7ecb]
Please drop this from both the 5.15 and 5.16 queues. This patch adds a new feature (doesn't appear to meet the stable rules). It is fairly self contained and probably won't break anything, but it wasn't intended to be backported.
Thanks,
Mat
Quoted 55 lines
a non-zero 'id' is sufficient to identify MPTCP endpoints: allow changing the value of 'backup' bit by simply specifying the endpoint id.
Signed-off-by Davide Caratti <[email protected]>Signed-off-by Mat Martineau <[email protected]>Signed-off-by Jakub Kicinski <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
net/mptcp/pm_netlink.c| 14 ++++++++++----1 file changed, 10 insertions(+), 4 deletions(-)net/mptcp/pm_netlink.c +10
-4@@ -1711,22 +1711,28 @@ next:static int mptcp_nl_cmd_set_flags (struct sk_buff *skb,struct genl_info *info) { +struct mptcp_pm_addr_entry addr = { .addr = { .family =AF_UNSPEC }, }, *entry;struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR ];struct pm_nl_pernet *pernet =genl_info_pm_nl (info); -struct mptcp_pm_addr_entry addr, *entry;struct net *net =sock_net (skb->sk); -u8 bkup =0 ; +u8 bkup =0 , lookup_by_id =0 ;int ret; - ret =mptcp_pm_parse_addr (attr, info, true, &addr); + ret =mptcp_pm_parse_addr (attr, info, false, &addr);if (ret <0 )return ret;if (addr.flags &MPTCP_PM_ADDR_FLAG_BACKUP ) bkup =1 ; +if (addr.addr.family ==AF_UNSPEC ) { + lookup_by_id =1 ; +if (!addr.addr.id) +return -EOPNOTSUPP ; + }list_for_each_entry (entry, &pernet->local_addr_list, list) { -if (addresses_equal (&entry->addr, &addr.addr, true)) { +if ((!lookup_by_id &&addresses_equal (&entry->addr, &addr.addr, true)) || + (lookup_by_id && entry->addr.id == addr.addr.id)) {mptcp_nl_addr_backup (net, &entry->addr, bkup);if (bkup)Signature · 1 line
2.34.1
--
Mat Martineau
Intel
Greg Kroah-Hartman
maintainerPATCH 137/200 mptcp: clean up harmless false expressions
In reply to Greg Kroah-HartmanFrom: Jean Sacren <[email protected]>
[ Upstream commit 59060a47ca50bbdb1d863b73667a1065873ecc06 ]
entry->addr.id is u8 with a range from 0 to 255 and MAX_ADDR_ID is 255. We should drop both false expressions of (entry->addr.id > MAX_ADDR_ID).
We should also remove the obsolete parentheses in the first if branch.
Use U8_MAX for MAX_ADDR_ID and add a comment to show the link to mptcp_addr_info.id as suggested by Mr. Matthieu Baerts.
--- net/mptcp/pm_netlink.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/mptcp/pm_netlink.c +4 -4
@@ -38,7 +38,8 @@ struct mptcp_pm_add_entry {u8 retrans_times; }; -#define MAX_ADDR_ID 255 +/* max value of mptcp_addr_info.id */ +#define MAX_ADDR_ID U8_MAX#define BITMAP_SZ DIV_ROUND_UP(MAX_ADDR_ID + 1, BITS_PER_LONG)struct pm_nl_pernet {
@@ -831,14 +832,13 @@ find_next: entry->addr.id =find_next_zero_bit (pernet->id_bitmap,MAX_ADDR_ID +1 , pernet->next_id); -if ((!entry->addr.id || entry->addr.id >MAX_ADDR_ID ) && - pernet->next_id !=1 ) { +if (!entry->addr.id && pernet->next_id !=1 ) { pernet->next_id =1 ; goto find_next; } } -if (!entry->addr.id || entry->addr.id >MAX_ADDR_ID ) +if (!entry->addr.id) goto out;__set_bit (entry->addr.id, pernet->id_bitmap);
Signature · 1 line
2.34.1
Re: [PATCH 5.16 137/200] mptcp: clean up harmless false expressions
Quoted 4 lines · Greg Kroah-Hartman
From: Jean Sacren <[email protected]>
[ Upstream commit
59060a47ca50bbdb1d863b73667a1065873ecc06]
Please drop this from the stable queue for both 5.15 and 5.16. This is a code cleanup (no functional change) patch that was originally merged in net-next and then got selected for stable.
It's pretty harmless to backport this one, but I hope this feedback is useful for tuning your scripts or manual patch review processes. If it's more helpful for me to let something like this slide by, or I'm misunderstanding how this might belong in the stable trees, I am likewise open to feedback!
Thanks,
Mat
Quoted 54 lines
entry->addr.idis u8 with a range from 0 to 255 andMAX_ADDR_IDis 255. We should drop both false expressions of (entry->addr.id>MAX_ADDR_ID).We should also remove the obsolete parentheses in the first if branch.
Use
U8_MAXforMAX_ADDR_IDand add a comment to show the link to mptcp_addr_info.id as suggested by Mr. Matthieu Baerts.Reviewed-by Matthieu Baerts <[email protected]>Signed-off-by Jean Sacren <[email protected]>Signed-off-by Mat Martineau <[email protected]>Signed-off-by Jakub Kicinski <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
net/mptcp/pm_netlink.c| 8 ++++----1 file changed, 4 insertions(+), 4 deletions(-)net/mptcp/pm_netlink.c +4
-4@@ -38,7 +38,8 @@ struct mptcp_pm_add_entry {u8 retrans_times; }; -#define MAX_ADDR_ID 255 +/* max value of mptcp_addr_info.id */ +#define MAX_ADDR_ID U8_MAX#define BITMAP_SZ DIV_ROUND_UP(MAX_ADDR_ID + 1, BITS_PER_LONG)struct pm_nl_pernet {@@ -831,14 +832,13 @@ find_next: entry->addr.id =find_next_zero_bit (pernet->id_bitmap,MAX_ADDR_ID +1 , pernet->next_id); -if ((!entry->addr.id || entry->addr.id >MAX_ADDR_ID ) && - pernet->next_id !=1 ) { +if (!entry->addr.id && pernet->next_id !=1 ) { pernet->next_id =1 ; goto find_next; } } -if (!entry->addr.id || entry->addr.id >MAX_ADDR_ID ) +if (!entry->addr.id) goto out;__set_bit (entry->addr.id, pernet->id_bitmap);Signature · 1 line
2.34.1
--
Mat Martineau
Intel
Greg Kroah-Hartman
maintainerPATCH 138/200 mptcp: keep track of local endpoint still available for each msk
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 86e39e04482b0aadf3ee3ed5fcf2d63816559d36 ]
Include into the path manager status a bitmap tracking the list of local endpoints still available - not yet used - for the relevant mptcp socket.
Keep such map updated at endpoint creation/deletion time, so that we can easily skip already used endpoint at local address selection time.
The endpoint used by the initial subflow is lazyly accounted at subflow creation time: the usage bitmap is be up2date before endpoint selection and we avoid such unneeded task in some relevant scenarios - e.g. busy servers accepting incoming subflows but not creating any additional ones nor annuncing additional addresses.
Overall this allows for fair local endpoints usage in case of subflow failure.
As a side effect, this patch also enforces that each endpoint is used at most once for each mptcp connection.
--- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 125 +++++++++++------- net/mptcp/protocol.c | 3 +- net/mptcp/protocol.h | 12 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 5 +- 5 files changed, 91 insertions(+), 55 deletions(-)
net/mptcp/pm.c +1 -0
@@ -370,6 +370,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)WRITE_ONCE (msk->pm.accept_subflow, false);WRITE_ONCE (msk->pm.remote_deny_join_id0, false); msk->pm.status =0 ; +bitmap_fill (msk->pm.id_avail_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );spin_lock_init (&msk->pm.lock);INIT_LIST_HEAD (&msk->pm.anno_list);
net/mptcp/pm_netlink.c +74 -51
258 lines not on this page · raw message
net/mptcp/protocol.c +1 -2
@@ -2416,8 +2416,7 @@ static void mptcp_worker(struct work_struct *work)mptcp_check_fastclose (msk); -if (msk->pm.status) -mptcp_pm_nl_work (msk); +mptcp_pm_nl_work (msk);if (test_and_clear_bit (MPTCP_WORK_EOF , &msk->flags))mptcp_check_for_eof (msk);
net/mptcp/protocol.h +11 -1
@@ -174,16 +174,25 @@ enum mptcp_pm_status {MPTCP_PM_ADD_ADDR_SEND_ACK ,MPTCP_PM_RM_ADDR_RECEIVED ,MPTCP_PM_ESTABLISHED , -MPTCP_PM_ALREADY_ESTABLISHED ,/* persistent status, set after ESTABLISHED event */ MPTCP_PM_SUBFLOW_ESTABLISHED , +MPTCP_PM_ALREADY_ESTABLISHED ,/* persistent status, set after ESTABLISHED event */ +MPTCP_PM_MPC_ENDPOINT_ACCOUNTED /* persistent status, set after MPC local address is +* accounted int id_avail_bitmap +*/ }; +/* Status bits below MPTCP_PM_ALREADY_ESTABLISHED need pm worker actions */ +#define MPTCP_PM_WORK_MASK ((1 << MPTCP_PM_ALREADY_ESTABLISHED) - 1) +enum mptcp_addr_signal_status {MPTCP_ADD_ADDR_SIGNAL ,MPTCP_ADD_ADDR_ECHO ,MPTCP_RM_ADDR_SIGNAL , }; +/* max value of mptcp_addr_info.id */ +#define MPTCP_PM_MAX_ADDR_ID U8_MAX +struct mptcp_pm_data {struct mptcp_addr_info local;struct mptcp_addr_info remote;
@@ -202,6 +211,7 @@ struct mptcp_pm_data {u8 local_addr_used;u8 subflows;u8 status; +DECLARE_BITMAP (id_avail_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );struct mptcp_rm_list rm_list_tx;struct mptcp_rm_list rm_list_rx; };
tools/testing/selftests/net/mptcp/mptcp_join.sh +4 -1
@@ -1071,7 +1071,10 @@ signal_address_tests() ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags signal ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags signal run_tests $ns1 $ns2 10.0.1.1 - chk_add_nr 4 4 + + # the server will not signal the address terminating + # the MPC subflow + chk_add_nr 3 3 } link_failure_tests()
Signature · 1 line
2.34.1
Re: [PATCH 5.16 138/200] mptcp: keep track of local endpoint still available for each msk
Quoted 3 lines · Greg Kroah-Hartman
From: Paolo Abeni <[email protected]>
[ Upstream commit
86e39e04482b0aadf3ee3ed5fcf2d63816559d36]
Hi Greg -
Please drop this from the stable queue for both 5.16 and 5.15. It wasn't intended for backporting and we haven't checked for dependencies with other changes in this part of MPTCP subsystem.
In the mptcp tree we make sure to add Fixes: tags on every patch we think is eligible for the -stable tree. I know you're sifting through a lot of patches from subsystems that end up with important fixes arriving from the "-next" branches, and it seems like the scripts scooped up several MPTCP patches this time around that don't meet the -stable rules.
Thanks,
Mat
Quoted 399 lines
Include into the path manager status a bitmap tracking the list of local endpoints still available - not yet used - for the relevant mptcp socket.
Keep such map updated at endpoint creation/deletion time, so that we can easily skip already used endpoint at local address selection time.
The endpoint used by the initial subflow is lazyly accounted at subflow creation time: the usage bitmap is be up2date before endpoint selection and we avoid such unneeded task in some relevant scenarios - e.g. busy servers accepting incoming subflows but not creating any additional ones nor annuncing additional addresses.
Overall this allows for fair local endpoints usage in case of subflow failure.
As a side effect, this patch also enforces that each endpoint is used at most once for each mptcp connection.
Signed-off-by Paolo Abeni <[email protected]>Signed-off-by Mat Martineau <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>---
net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 125 +++++++++++------- net/mptcp/protocol.c | 3 +- net/mptcp/protocol.h | 12 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 5 +- 5 files changed, 91 insertions(+), 55 deletions(-)net/mptcp/pm.c +1
-0@@ -370,6 +370,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)WRITE_ONCE (msk->pm.accept_subflow, false);WRITE_ONCE (msk->pm.remote_deny_join_id0, false); msk->pm.status =0 ; +bitmap_fill (msk->pm.id_avail_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );spin_lock_init (&msk->pm.lock);INIT_LIST_HEAD (&msk->pm.anno_list);net/mptcp/pm_netlink.c +7
-13@@ -38,10 +38,6 @@ struct mptcp_pm_add_entry {u8 retrans_times; }; -/* max value of mptcp_addr_info.id */ -#define MAX_ADDR_ID U8_MAX -#define BITMAP_SZ DIV_ROUND_UP(MAX_ADDR_ID + 1, BITS_PER_LONG) -struct pm_nl_pernet {/* protects pernet updates */ spinlock_t lock;@@ -53,14 +49,14 @@ struct pm_nl_pernet {unsigned int local_addr_max;unsigned int subflows_max;unsigned int next_id; -unsigned long id_bitmap[BITMAP_SZ ]; +DECLARE_BITMAP (id_bitmap,MPTCP_PM_MAX_ADDR_ID +1 ); };#define MPTCP_PM_ADDR_MAX 8#define ADD_ADDR_RETRANS_MAX 3static bool addresses_equal (const struct mptcp_addr_info *a, -struct mptcp_addr_info *b,bool use_port) +const struct mptcp_addr_info *b,bool use_port) {bool addr_equals = false;@@ -174,6 +170,9 @@ select_local_address(const struct pm_nl_pernet *pernet,if (!(entry->flags &MPTCP_PM_ADDR_FLAG_SUBFLOW ))continue ; +if (!test_bit (entry->addr.id, msk->pm.id_avail_bitmap)) +continue ; +if (entry->addr.family != sk->sk_family) {#if IS_ENABLED (CONFIG_MPTCP_IPV6 ) if ((entry->addr.family == AF_INET &&@@ -184,23 +183,17 @@ select_local_address(const struct pm_nl_pernet *pernet,continue ; } -/* avoid any address already in use by subflows and -* pending join -*/ -if (!lookup_subflow_by_saddr (&msk->conn_list, &entry->addr)) { - ret = entry; -break ; - } + ret = entry; +break ; }rcu_read_unlock ();return ret; }static struct
mptcp_pm_addr_entry*net/mptcp/pm_netlink.c +1
-1-select_signal_address(struct pm_nl_pernet *pernet, unsigned int pos) +select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk){ struct mptcp_pm_addr_entry *entry, *ret = NULL;net/mptcp/pm_netlink.c +0
-1-int i =0 ;rcu_read_lock(); /* do not keep any additional per socket state, just signalnet/mptcp/pm_netlink.c +63
-21@@ -209,12 +202,14 @@ select_signal_address(struct pm_nl_pernet *pernet, unsigned int pos)* can lead to additional addresses not being announced. */ list_for_each_entry_rcu (entry, &pernet->local_addr_list, list) { +if (!test_bit (entry->addr.id, msk->pm.id_avail_bitmap)) +continue ; +if (!(entry->flags &MPTCP_PM_ADDR_FLAG_SIGNAL ))continue ; -if (i++ == pos) { - ret = entry; -break ; - } + + ret = entry; +break ; }rcu_read_unlock ();return ret;@@ -258,9 +253,11 @@ EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max);static void check_work_pending (struct mptcp_sock *msk) { -if (msk->pm.add_addr_signaled ==mptcp_pm_get_add_addr_signal_max (msk) && - (msk->pm.local_addr_used ==mptcp_pm_get_local_addr_max (msk) || - msk->pm.subflows ==mptcp_pm_get_subflows_max (msk))) +struct pm_nl_pernet *pernet =net_generic (sock_net ((struct sock *)msk), pm_nl_pernet_id); + +if (msk->pm.subflows ==mptcp_pm_get_subflows_max (msk) || + (find_next_and_bit (pernet->id_bitmap, msk->pm.id_avail_bitmap, +MPTCP_PM_MAX_ADDR_ID +1 ,0 ) ==MPTCP_PM_MAX_ADDR_ID +1 ))WRITE_ONCE (msk->pm.work_pending, false); }@@ -460,6 +457,35 @@ static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk, bool fullmreturn i; } +static struct mptcp_pm_addr_entry * +__lookup_addr_by_id (struct pm_nl_pernet *pernet,unsigned int id) +{ +struct mptcp_pm_addr_entry *entry; + +list_for_each_entry (entry, &pernet->local_addr_list, list) { +if (entry->addr.id == id) +return entry; + } +return NULL ; +} + +static int +lookup_id_by_addr (struct pm_nl_pernet *pernet,const struct mptcp_addr_info *addr) +{ +struct mptcp_pm_addr_entry *entry; +int ret =-1 ; + +rcu_read_lock (); +list_for_each_entry (entry, &pernet->local_addr_list, list) { +if (addresses_equal (&entry->addr, addr, entry->addr.port)) { + ret = entry->addr.id; +break ; + } + } +rcu_read_unlock (); +return ret; +} +static void mptcp_pm_create_subflow_or_signal_addr (struct mptcp_sock *msk) {struct sock *sk = (struct sock *)msk;@@ -475,6 +501,19 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) local_addr_max =mptcp_pm_get_local_addr_max (msk); subflows_max =mptcp_pm_get_subflows_max (msk); +/* do lazy endpoint usage accounting for the MPC subflows */ +if (unlikely (!(msk->pm.status &BIT (MPTCP_PM_MPC_ENDPOINT_ACCOUNTED ))) && msk->first) { +struct mptcp_addr_info local; +int mpc_id; + +local_address ((struct sock_common *)msk->first, &local); + mpc_id =lookup_id_by_addr (pernet, &local); +if (mpc_id <0 ) +__clear_bit (mpc_id, msk->pm.id_avail_bitmap); + + msk->pm.status |=BIT (MPTCP_PM_MPC_ENDPOINT_ACCOUNTED ); + } + pr_debug("local %d:%d signal %d:%d subflows %d:%d\n", msk->pm.local_addr_used, local_addr_max, msk->pm.add_addr_signaled, add_addr_signal_max,@@ -482,21 +521,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)/* check first for announce */ if (msk->pm.add_addr_signaled < add_addr_signal_max) { - local =select_signal_address (pernet, - msk->pm.add_addr_signaled); + local =select_signal_address (pernet, msk);if (local) {if (mptcp_pm_alloc_anno_list (msk, local)) { +__clear_bit (local->addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++;mptcp_pm_announce_addr (msk, &local->addr, false);mptcp_pm_nl_addr_send_ack (msk); } - }else { -/* pick failed, avoid fourther attempts later */ - msk->pm.local_addr_used = add_addr_signal_max; } - -check_work_pending (msk); }/* check if should create a new subflow */ @@ -510,19 +544,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)int i, nr; msk->pm.local_addr_used++; -check_work_pending (msk); nr =fill_remote_addresses_vec (msk, fullmesh, addrs); +if (nr) +__clear_bit (local->addr.id, msk->pm.id_avail_bitmap);spin_unlock_bh (&msk->pm.lock);for (i =0 ; i < nr; i++)__mptcp_subflow_connect (sk, &local->addr, &addrs[i]);spin_lock_bh (&msk->pm.lock); -return ; } - -/* lookup failed, avoid fourther attempts later */ - msk->pm.local_addr_used = local_addr_max; -check_work_pending (msk); } +check_work_pending (msk); }static void mptcp_pm_nl_fully_established (struct mptcp_sock *msk)@@ -736,6 +767,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk, msk->pm.subflows--;__MPTCP_INC_STATS (sock_net (sk), rm_type); } +__set_bit (rm_list->ids[1 ], msk->pm.id_avail_bitmap);if (!removed)continue ;@@ -765,6 +797,9 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk)msk_owned_by_me (msk); +if (!(pm->status &MPTCP_PM_WORK_MASK )) +return ; +spin_lock_bh (&msk->pm.lock);pr_debug ("msk=%p status=%x" , msk, pm->status);@@ -810,7 +845,7 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,/* to keep the code simple, don't do IDR-like allocation for address ID, * just bail when we exceed limits */ -if (pernet->next_id ==MAX_ADDR_ID ) +if (pernet->next_id ==MPTCP_PM_MAX_ADDR_ID ) pernet->next_id =1 ;if (pernet->addrs >=MPTCP_PM_ADDR_MAX ) goto out;@@ -830,7 +865,7 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,if (!entry->addr.id) {
find_next:entry->addr.id = find_next_zero_bit(pernet->id_bitmap,net/mptcp/pm_netlink.c +1
-1- MAX_ADDR_ID + 1, + MPTCP_PM_MAX_ADDR_ID + 1,pernet->next_id); if (!entry->addr.id && pernet->next_id != 1) { pernet->next_id = 1;net/mptcp/pm_netlink.c +2
-14@@ -1197,18 +1232,6 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)return 0 ; } -static struct mptcp_pm_addr_entry * -__lookup_addr_by_id (struct pm_nl_pernet *pernet,unsigned int id) -{ -struct mptcp_pm_addr_entry *entry; - -list_for_each_entry (entry, &pernet->local_addr_list, list) { -if (entry->addr.id == id) -return entry; - } -return NULL ; -} -int mptcp_pm_get_flags_and_ifindex_by_id (struct net *net,unsigned int id,u8 *flags,int *ifindex) {@@ -1467,7 +1490,7 @@ static int mptcp_nl_cmd_flush_addrs(struct sk_buff *skb, struct genl_info *info)list_splice_init (&pernet->local_addr_list, &free_list);__reset_counters (pernet); pernet->next_id =1 ; -bitmap_zero (pernet->id_bitmap,MAX_ADDR_ID +1 ); +bitmap_zero (pernet->id_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );spin_unlock_bh (&pernet->lock);mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list);synchronize_rcu ();@@ -1577,7 +1600,7 @@ static int mptcp_nl_cmd_dump_addrs(struct sk_buff *msg, pernet =net_generic (net, pm_nl_pernet_id);spin_lock_bh (&pernet->lock); -for (i = id; i <MAX_ADDR_ID +1 ; i++) { +for (i = id; i <MPTCP_PM_MAX_ADDR_ID +1 ; i++) {if (test_bit (i, pernet->id_bitmap)) { entry =__lookup_addr_by_id (pernet, i);if (!entry)net/mptcp/protocol.c +1
-2@@ -2416,8 +2416,7 @@ static void mptcp_worker(struct work_struct *work)mptcp_check_fastclose (msk); -if (msk->pm.status) -mptcp_pm_nl_work (msk); +mptcp_pm_nl_work (msk);if (test_and_clear_bit (MPTCP_WORK_EOF , &msk->flags))mptcp_check_for_eof (msk);net/mptcp/protocol.h +11
-1@@ -174,16 +174,25 @@ enum mptcp_pm_status {MPTCP_PM_ADD_ADDR_SEND_ACK ,MPTCP_PM_RM_ADDR_RECEIVED ,MPTCP_PM_ESTABLISHED , -MPTCP_PM_ALREADY_ESTABLISHED ,/* persistent status, set after ESTABLISHED event */ MPTCP_PM_SUBFLOW_ESTABLISHED , +MPTCP_PM_ALREADY_ESTABLISHED ,/* persistent status, set after ESTABLISHED event */ +MPTCP_PM_MPC_ENDPOINT_ACCOUNTED /* persistent status, set after MPC local address is +* accounted int id_avail_bitmap +*/ }; +/* Status bits below MPTCP_PM_ALREADY_ESTABLISHED need pm worker actions */ +#define MPTCP_PM_WORK_MASK ((1 << MPTCP_PM_ALREADY_ESTABLISHED) - 1) +enum mptcp_addr_signal_status {MPTCP_ADD_ADDR_SIGNAL ,MPTCP_ADD_ADDR_ECHO ,MPTCP_RM_ADDR_SIGNAL , }; +/* max value of mptcp_addr_info.id */ +#define MPTCP_PM_MAX_ADDR_ID U8_MAX +struct mptcp_pm_data {struct mptcp_addr_info local;struct mptcp_addr_info remote;@@ -202,6 +211,7 @@ struct mptcp_pm_data {u8 local_addr_used;u8 subflows;u8 status; +DECLARE_BITMAP (id_avail_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );struct mptcp_rm_list rm_list_tx;struct mptcp_rm_list rm_list_rx; };tools/testing/selftests/net/mptcp/mptcp_join.sh +4
-1@@ -1071,7 +1071,10 @@ signal_address_tests() ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags signal ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags signal run_tests $ns1 $ns2 10.0.1.1 - chk_add_nr 4 4 + + # the server will not signal the address terminating + # the MPC subflow + chk_add_nr 3 3 } link_failure_tests()Signature · 1 line
2.34.1
--
Mat Martineau
Intel
Greg Kroah-Hartman
maintainerRe: [PATCH 5.16 138/200] mptcp: keep track of local endpoint still available for each msk
Quoted 12 lines · Mat Martineau
Quoted 3 lines · Greg Kroah-Hartman
From: Paolo Abeni <[email protected]>
[ Upstream commit
86e39e04482b0aadf3ee3ed5fcf2d63816559d36]Hi Greg -
Please drop this from the stable queue for both 5.16 and 5.15. It wasn't intended for backporting and we haven't checked for dependencies with other changes in this part of MPTCP subsystem.
Quoted 5 lines
In the mptcp tree we make sure to add Fixes: tags on every patch we think is eligible for the -stable tree. I know you're sifting through a lot of patches from subsystems that end up with important fixes arriving from the "-next" branches, and it seems like the scripts scooped up several MPTCP patches this time around that don't meet the -stable rules.
I think these were needed due to 8e9eacad7ec7 ("mptcp: fix msk traversal in mptcp_nl_cmd_set_flags()") which you did tag with a "Fixes:" tag, right? Without these other commits, that one does not apply and it looks like it should go into 5.15.y and 5.16.y.
Note, just putting a "Fixes:" tag does not guarantee if a commit will go into a stable tree. Please use the correct "Cc: [email protected]" tag as the documentation asks for.
I'll go drop all of these mptcp patches, including 8e9eacad7ec7 ("mptcp:
fix msk traversal in mptcp_nl_cmd_set_flags()") for now. If you want them added back in, please let us know.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerRe: [PATCH 5.16 138/200] mptcp: keep track of local endpoint still available for each msk
Quoted 24 lines · Greg Kroah-Hartman
Quoted 12 lines · Mat Martineau
Quoted 3 lines · Greg Kroah-Hartman
From: Paolo Abeni <[email protected]>
[ Upstream commit
86e39e04482b0aadf3ee3ed5fcf2d63816559d36]Hi Greg -
Please drop this from the stable queue for both 5.16 and 5.15. It wasn't intended for backporting and we haven't checked for dependencies with other changes in this part of MPTCP subsystem.
Quoted 5 lines
In the mptcp tree we make sure to add Fixes: tags on every patch we think is eligible for the -stable tree. I know you're sifting through a lot of patches from subsystems that end up with important fixes arriving from the "-next" branches, and it seems like the scripts scooped up several MPTCP patches this time around that don't meet the -stable rules.
I think these were needed due to
8e9eacad7ec7("mptcp: fix msk traversal inmptcp_nl_cmd_set_flags()") which you did tag with a "Fixes:" tag, right? Without these other commits, that one does not apply and it looks like it should go into 5.15.y and 5.16.y.
Quoted 7 lines
Note, just putting a "Fixes:" tag does not guarantee if a commit will go into a stable tree. Please use the correct "Cc: [email protected]" tag as the documentation asks for.
I'll go drop all of these mptcp patches, including
8e9eacad7ec7("mptcp:
fix msk traversal inmptcp_nl_cmd_set_flags()") for now. If you want them added back in, please let us know.
To be specific, I have dropped the following commits from the queues now, which was more than just these three that you asked:
602837e8479d ("mptcp: allow changing the "backup" bit by endpoint id") 59060a47ca50 ("mptcp: clean up harmless false expressions") 86e39e04482b ("mptcp: keep track of local endpoint still available for each msk") 8e9eacad7ec7 ("mptcp: fix msk traversal in mptcp_nl_cmd_set_flags()") a4c0214fbee9 ("mptcp: fix removing ids bitmap setting")9846921dba49 ("selftests: mptcp: fix ipv6 routing setup")
If you want them back, please let us know.
thanks,
greg k-h
Re: [PATCH 5.16 138/200] mptcp: keep track of local endpoint still available for each msk
Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Greg Kroah-Hartman
Quoted 17 lines · Mat Martineau
Quoted 3 lines · Greg Kroah-Hartman
From: Paolo Abeni <[email protected]>
[ Upstream commit
86e39e04482b0aadf3ee3ed5fcf2d63816559d36]Hi Greg -
Please drop this from the stable queue for both 5.16 and 5.15. It wasn't intended for backporting and we haven't checked for dependencies with other changes in this part of MPTCP subsystem.
In the mptcp tree we make sure to add Fixes: tags on every patch we think is eligible for the -stable tree. I know you're sifting through a lot of patches from subsystems that end up with important fixes arriving from the "-next" branches, and it seems like the scripts scooped up several MPTCP patches this time around that don't meet the -stable rules.
Quoted 5 lines
Quoted 5 lines
I think these were needed due to
8e9eacad7ec7("mptcp: fix msk traversal inmptcp_nl_cmd_set_flags()") which you did tag with a "Fixes:" tag, right? Without these other commits, that one does not apply and it looks like it should go into 5.15.y and 5.16.y.
Ok, I see what happened there (there's a new variable present in 5.17 that's not relevant for the earlier kernels). 8e9eacad7ec7 needs manual backporting, I'll work on that and send to the stable list.
Quoted 2 lines
Quoted 2 lines
Note, just putting a "Fixes:" tag does not guarantee if a commit will go into a stable tree. Please use the correct "Cc:[email protected]" tag as the documentation asks for.
I will make sure to use the Cc:[email protected] tag in the future.
Quoted 7 lines
Quoted 3 lines
I'll go drop all of these mptcp patches, including
8e9eacad7ec7("mptcp:
fix msk traversal inmptcp_nl_cmd_set_flags()") for now. If you want them added back in, please let us know.To be specific, I have dropped the following commits from the queues now, which was more than just these three that you asked:
Quoted 9 lines
602837e8479d("mptcp: allow changing the "backup" bit by endpoint id")59060a47ca50("mptcp: clean up harmless false expressions")86e39e04482b("mptcp: keep track of local endpoint still available for each msk")8e9eacad7ec7("mptcp: fix msk traversal inmptcp_nl_cmd_set_flags()")a4c0214fbee9("mptcp: fix removing ids bitmap setting")9846921dba49("selftests: mptcp: fix ipv6 routing setup")If you want them back, please let us know.
Of the above, there's only one suitable for stable as-is:
9846921dba49 ("selftests: mptcp: fix ipv6 routing setup")
Please add that one to the 5.16 and 5.15 queues.
Thanks!
--
Mat Martineau
Intel
Greg Kroah-Hartman
maintainerRe: [PATCH 5.16 138/200] mptcp: keep track of local endpoint still available for each msk
Quoted 54 lines · Mat Martineau
Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Greg Kroah-Hartman
Quoted 17 lines · Mat Martineau
Quoted 3 lines · Greg Kroah-Hartman
From: Paolo Abeni <[email protected]>
[ Upstream commit
86e39e04482b0aadf3ee3ed5fcf2d63816559d36]Hi Greg -
Please drop this from the stable queue for both 5.16 and 5.15. It wasn't intended for backporting and we haven't checked for dependencies with other changes in this part of MPTCP subsystem.
In the mptcp tree we make sure to add Fixes: tags on every patch we think is eligible for the -stable tree. I know you're sifting through a lot of patches from subsystems that end up with important fixes arriving from the "-next" branches, and it seems like the scripts scooped up several MPTCP patches this time around that don't meet the -stable rules.
Quoted 5 lines
Quoted 5 lines
I think these were needed due to
8e9eacad7ec7("mptcp: fix msk traversal inmptcp_nl_cmd_set_flags()") which you did tag with a "Fixes:" tag, right? Without these other commits, that one does not apply and it looks like it should go into 5.15.y and 5.16.y.Ok, I see what happened there (there's a new variable present in 5.17 that's not relevant for the earlier kernels).
8e9eacad7ec7needs manual backporting, I'll work on that and send to the stable list.Quoted 4 lines
Quoted 4 lines
Note, just putting a "Fixes:" tag does not guarantee if a commit will go into a stable tree. Please use the correct "Cc:[email protected]" tag as the documentation asks for.
I will make sure to use the Cc:[email protected] tag in the future.
Quoted 14 lines
Quoted 3 lines
I'll go drop all of these mptcp patches, including
8e9eacad7ec7("mptcp:
fix msk traversal inmptcp_nl_cmd_set_flags()") for now. If you want them added back in, please let us know.To be specific, I have dropped the following commits from the queues now, which was more than just these three that you asked:
602837e8479d("mptcp: allow changing the "backup" bit by endpoint id")59060a47ca50("mptcp: clean up harmless false expressions")86e39e04482b("mptcp: keep track of local endpoint still available for each msk")8e9eacad7ec7("mptcp: fix msk traversal inmptcp_nl_cmd_set_flags()")a4c0214fbee9("mptcp: fix removing ids bitmap setting")9846921dba49("selftests: mptcp: fix ipv6 routing setup")
Quoted 8 lines
Quoted 2 lines
If you want them back, please let us know.
Of the above, there's only one suitable for stable as-is:
9846921dba49("selftests: mptcp: fix ipv6 routing setup")Please add that one to the 5.16 and 5.15 queues.
Now queued up, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 139/200 mptcp: fix msk traversal in mptcp_nl_cmd_set_flags()
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 8e9eacad7ec7a9cbf262649ebf1fa6e6f6cc7d82 ]
The MPTCP endpoint list is under RCU protection, guarded by the pernet spinlock. mptcp_nl_cmd_set_flags() traverses the list without acquiring the spin-lock nor under the RCU critical section.
This change addresses the issue performing the lookup and the endpoint update under the pernet spinlock.
--- net/mptcp/pm_netlink.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-)
net/mptcp/pm_netlink.c +27 -10
@@ -469,6 +469,20 @@ __lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id)return NULL ; } +static struct mptcp_pm_addr_entry * +__lookup_addr (struct pm_nl_pernet *pernet,const struct mptcp_addr_info *info, +bool lookup_by_id) +{ +struct mptcp_pm_addr_entry *entry; + +list_for_each_entry (entry, &pernet->local_addr_list, list) { +if ((!lookup_by_id &&addresses_equal (&entry->addr, info, true)) || + (lookup_by_id && entry->addr.id == info->id)) +return entry; + } +return NULL ; +} +static int lookup_id_by_addr (struct pm_nl_pernet *pernet,const struct mptcp_addr_info *addr) {
@@ -1753,18 +1767,21 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)return -EOPNOTSUPP ; } -list_for_each_entry (entry, &pernet->local_addr_list, list) { -if ((!lookup_by_id &&addresses_equal (&entry->addr, &addr.addr, true)) || - (lookup_by_id && entry->addr.id == addr.addr.id)) { -mptcp_nl_addr_backup (net, &entry->addr, bkup); - -if (bkup) - entry->flags |=MPTCP_PM_ADDR_FLAG_BACKUP ; -else - entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP ; - } +spin_lock_bh (&pernet->lock); + entry =__lookup_addr (pernet, &addr.addr, lookup_by_id); +if (!entry) { +spin_unlock_bh (&pernet->lock); +return -EINVAL ; } +if (bkup) + entry->flags |=MPTCP_PM_ADDR_FLAG_BACKUP ; +else + entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP ; + addr = *entry; +spin_unlock_bh (&pernet->lock); + +mptcp_nl_addr_backup (net, &addr.addr, bkup);return 0 ; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 140/200 mptcp: fix removing ids bitmap setting
In reply to Greg Kroah-HartmanFrom: Geliang Tang <[email protected]>
[ Upstream commit a4c0214fbee97c46e3f41fee37931d66c0fc3cb1 ]
In mptcp_pm_nl_rm_addr_or_subflow(), the bit of rm_list->ids[i] in the id_avail_bitmap should be set, not rm_list->ids[1]. This patch fixed it.
--- net/mptcp/pm_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mptcp/pm_netlink.c +1 -1
@@ -781,7 +781,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk, msk->pm.subflows--;__MPTCP_INC_STATS (sock_net (sk), rm_type); } -__set_bit (rm_list->ids[1 ], msk->pm.id_avail_bitmap); +__set_bit (rm_list->ids[i], msk->pm.id_avail_bitmap);if (!removed)continue ;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 141/200 selftests: mptcp: fix ipv6 routing setup
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 9846921dba4936d92f7608315b5d1e0a8ec3a538 ]
MPJ ipv6 selftests currently lack per link route to the server net. Additionally, ipv6 subflows endpoints are created without any interface specified. The end-result is that in ipv6 self-tests subflows are created all on the same link, leading to expected delays and sporadic self-tests failures.
Fix the issue by adding the missing setup bits.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +3 -2
@@ -75,6 +75,7 @@ init() # let $ns2 reach any $ns1 address from any interface ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i + ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i done }
@@ -1389,7 +1390,7 @@ ipv6_tests() reset ip netns exec $ns1 ./pm_nl_ctl limits 0 1 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 - ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 dev ns2eth3 flags subflow run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow chk_join_nr "single subflow IPv6" 1 1 1
@@ -1424,7 +1425,7 @@ ipv6_tests() ip netns exec $ns1 ./pm_nl_ctl limits 0 2 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal ip netns exec $ns2 ./pm_nl_ctl limits 1 2 - ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 dev ns2eth3 flags subflow run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow chk_join_nr "remove subflow and signal IPv6" 2 2 2 chk_add_nr 1 1
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 142/200 octeontx2-af: Do not fixup all VF action entries
In reply to Greg Kroah-HartmanFrom: Subbaraya Sundeep <[email protected]>
[ Upstream commit d225c449ab2be25273a3674f476c6c0b57c50254 ]
AF modifies all the rules destined for VF to use the action same as default RSS action. This fixup was needed because AF only installs default rules with RSS action. But the action in rules installed by a PF for its VFs should not be changed by this fixup. This is because action can be drop or direct to queue as specified by user(ntuple filters). This patch fixes that problem.
--- .../ethernet/marvell/octeontx2/af/rvu_npc.c | 22 ++++++++++++++++--- .../marvell/octeontx2/af/rvu_npc_fs.c | 20 ++++++++++------- 2 files changed, 31 insertions(+), 11 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +19 -3
@@ -402,6 +402,7 @@ static void npc_fixup_vf_rule(struct rvu *rvu, struct npc_mcam *mcam, int blkaddr, int index, struct mcam_entry *entry, bool *enable) { + struct rvu_npc_mcam_rule *rule;u16 owner, target_func;struct rvu_pfvf *pfvf;u64 rx_action;
@@ -423,6 +424,12 @@ static void npc_fixup_vf_rule(struct rvu *rvu, struct npc_mcam *mcam, test_bit(NIXLF_INITIALIZED, &pfvf->flags))) *enable = false; +/* fix up not needed for the rules added by user(ntuple filters) */ +list_for_each_entry (rule, &mcam->mcam_rules, list) { +if (rule->entry == index) +return ; + } +/* copy VF default entry action to the VF mcam entry */ rx_action =npc_get_default_entry_action (rvu, mcam, blkaddr, target_func);
@@ -489,8 +496,8 @@ static void npc_config_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam, }/* PF installing VF rule */ -if (intf ==NIX_INTF_RX && actindex < mcam->bmap_entries) -npc_fixup_vf_rule (rvu, mcam, blkaddr, index, entry, &enable); +if (is_npc_intf_rx (intf) && actindex < mcam->bmap_entries) +npc_fixup_vf_rule (rvu, mcam, blkaddr, actindex, entry, &enable);/* Set 'action' */ rvu_write64(rvu, blkaddr,
@@ -916,7 +923,8 @@ static void npc_update_vf_flow_entry(struct rvu *rvu, struct npc_mcam *mcam, int blkaddr, u16 pcifunc, u64 rx_action) { int actindex, index, bank, entry; -bool enable; +struct rvu_npc_mcam_rule *rule; +bool enable, update;if (!(pcifunc &RVU_PFVF_FUNC_MASK ))return ;
@@ -924,6 +932,14 @@ static void npc_update_vf_flow_entry(struct rvu *rvu, struct npc_mcam *mcam,mutex_lock (&mcam->lock);for (index =0 ; index < mcam->bmap_entries; index++) {if (mcam->entry2target_pffunc[index] == pcifunc) { + update = true; +/* update not needed for the rules added via ntuple filters */ +list_for_each_entry (rule, &mcam->mcam_rules, list) { +if (rule->entry == index) + update = false; + } +if (!update) +continue ; bank =npc_get_bank (mcam, index); actindex = index; entry = index & (mcam->banksize -1 );
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c +12 -8
@@ -1098,14 +1098,6 @@ find_rule: write_req.cntr = rule->cntr; } - err =rvu_mbox_handler_npc_mcam_write_entry (rvu, &write_req, - &write_rsp); -if (err) { -rvu_mcam_remove_counter_from_rule (rvu, owner, rule); -if (new) -kfree (rule); -return err; - }/* update rule */ memcpy (&rule->packet, &dummy.packet,sizeof (rule->packet));memcpy (&rule->mask, &dummy.mask,sizeof (rule->mask));
@@ -1132,6 +1124,18 @@ find_rule:if (req->default_rule) pfvf->def_ucast_rule = rule; +/* write to mcam entry registers */ + err =rvu_mbox_handler_npc_mcam_write_entry (rvu, &write_req, + &write_rsp); +if (err) { +rvu_mcam_remove_counter_from_rule (rvu, owner, rule); +if (new) { +list_del (&rule->list); +kfree (rule); + } +return err; + } +/* VF's MAC address is being changed via PF */ if (pf_set_vfs_mac) {ether_addr_copy (pfvf->default_mac, req->packet.dmac);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 143/200 octeontx2-af: Fix LBK backpressure id count
In reply to Greg Kroah-HartmanFrom: Sunil Goutham <[email protected]>
[ Upstream commit 00bfe94e388fe12bfd0d4f6361b1b1343374ff5b ]
In rvu_nix_get_bpid() lbk_bpid_cnt is being read from wrong register. Due to this backpressure enable is failing for LBK VF32 onwards. This patch fixes that.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +3 -3
@@ -512,11 +512,11 @@ static int rvu_nix_get_bpid(struct rvu *rvu, struct nix_bp_cfg_req *req, cfg =rvu_read64 (rvu, blkaddr,NIX_AF_CONST ); lmac_chan_cnt = cfg &0xFF ; - cfg =rvu_read64 (rvu, blkaddr,NIX_AF_CONST1 ); - sdp_chan_cnt = cfg &0xFFF ; - cgx_bpid_cnt = hw->cgx_links * lmac_chan_cnt; lbk_bpid_cnt = hw->lbk_links * ((cfg >>16 ) &0xFF ); + + cfg =rvu_read64 (rvu, blkaddr,NIX_AF_CONST1 ); + sdp_chan_cnt = cfg &0xFFF ; sdp_bpid_cnt = hw->sdp_links * sdp_chan_cnt; pfvf =rvu_get_pfvf (rvu, req->hdr.pcifunc);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 144/200 octeontx2-af: Retry until RVU block reset complete
In reply to Greg Kroah-HartmanFrom: Geetha sowjanya <[email protected]>
[ Upstream commit 03ffbc9914bd1130fba464f0a41c01372e5fc359 ]
Few RVU blocks like SSO require more time for reset on some silicons. Hence retrying the block reset until success.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu.c +5 -2
@@ -520,8 +520,11 @@ static void rvu_block_reset(struct rvu *rvu, int blkaddr, u64 rst_reg)rvu_write64 (rvu, blkaddr, rst_reg,BIT_ULL (0 )); err =rvu_poll_reg (rvu, blkaddr, rst_reg,BIT_ULL (63 ), true); -if (err) -dev_err (rvu->dev,"HW block:%d reset failed\n" , blkaddr); +if (err) { +dev_err (rvu->dev,"HW block:%d reset timeout retrying again\n" , blkaddr); +while (rvu_poll_reg (rvu, blkaddr, rst_reg,BIT_ULL (63 ), true) == -EBUSY ) + ; + } }static void rvu_reset_all_blocks (struct rvu *rvu)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 145/200 octeontx2-af: cn10k: Use appropriate register for LMAC enable
In reply to Greg Kroah-HartmanFrom: Geetha sowjanya <[email protected]>
[ Upstream commit fae80edeafbbba5ef9a0423aa5e5515518626433 ]
CN10K platforms uses RPM(0..2)_MTI_MAC100(0..3)_COMMAND_CONFIG register for lmac TX/RX enable whereas CN9xxx platforms use CGX_CMRX_CONFIG register. This config change was missed when adding support for CN10K RPM.
--- .../net/ethernet/marvell/octeontx2/af/cgx.c | 2 + .../marvell/octeontx2/af/lmac_common.h | 3 ++ .../net/ethernet/marvell/octeontx2/af/rpm.c | 39 +++++++++++++++++++ .../net/ethernet/marvell/octeontx2/af/rpm.h | 4 ++ .../net/ethernet/marvell/octeontx2/af/rvu.h | 1 + .../ethernet/marvell/octeontx2/af/rvu_cgx.c | 14 ++++++- .../ethernet/marvell/octeontx2/af/rvu_nix.c | 10 ++--- 7 files changed, 66 insertions(+), 7 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/cgx.c +2 -0
@@ -1570,6 +1570,8 @@ static struct mac_ops cgx_mac_ops = { .mac_enadis_pause_frm = cgx_lmac_enadis_pause_frm, .mac_pause_frm_config = cgx_lmac_pause_frm_config, .mac_enadis_ptp_config = cgx_lmac_ptp_config, + .mac_rx_tx_enable = cgx_lmac_rx_tx_enable, + .mac_tx_enable = cgx_lmac_tx_enable, };static int cgx_probe (struct pci_dev *pdev,const struct pci_device_id *id)
drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h +3 -0
@@ -107,6 +107,9 @@ struct mac_ops {void (*mac_enadis_ptp_config)(void *cgxd,int lmac_id,bool enable); + +int (*mac_rx_tx_enable)(void *cgxd,int lmac_id,bool enable); +int (*mac_tx_enable)(void *cgxd,int lmac_id,bool enable); };struct cgx {
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +39 -0
@@ -30,6 +30,8 @@ static struct mac_ops rpm_mac_ops = { .mac_enadis_pause_frm = rpm_lmac_enadis_pause_frm, .mac_pause_frm_config = rpm_lmac_pause_frm_config, .mac_enadis_ptp_config = rpm_lmac_ptp_config, + .mac_rx_tx_enable = rpm_lmac_rx_tx_enable, + .mac_tx_enable = rpm_lmac_tx_enable, };struct mac_ops *rpm_get_mac_ops (void )
@@ -54,6 +56,43 @@ int rpm_get_nr_lmacs(void *rpmd)return hweight8 (rpm_read (rpm,0 ,CGXX_CMRX_RX_LMACS ) &0xFULL ); } +int rpm_lmac_tx_enable (void *rpmd,int lmac_id,bool enable) +{ +rpm_t *rpm = rpmd; +u64 cfg, last; + +if (!is_lmac_valid (rpm, lmac_id)) +return -ENODEV ; + + cfg =rpm_read (rpm, lmac_id,RPMX_MTI_MAC100X_COMMAND_CONFIG ); + last = cfg; +if (enable) + cfg |=RPM_TX_EN ; +else + cfg &= ~(RPM_TX_EN ); + +if (cfg != last) +rpm_write (rpm, lmac_id,RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg); +return !!(last &RPM_TX_EN ); +} + +int rpm_lmac_rx_tx_enable (void *rpmd,int lmac_id,bool enable) +{ +rpm_t *rpm = rpmd; +u64 cfg; + +if (!is_lmac_valid (rpm, lmac_id)) +return -ENODEV ; + + cfg =rpm_read (rpm, lmac_id,RPMX_MTI_MAC100X_COMMAND_CONFIG ); +if (enable) + cfg |=RPM_RX_EN |RPM_TX_EN ; +else + cfg &= ~(RPM_RX_EN |RPM_TX_EN ); +rpm_write (rpm, lmac_id,RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg); +return 0 ; +} +void rpm_lmac_enadis_rx_pause_fwding (void *rpmd,int lmac_id,bool enable) {rpm_t *rpm = rpmd;
drivers/net/ethernet/marvell/octeontx2/af/rpm.h +4 -0
@@ -43,6 +43,8 @@#define RPMX_MTI_STAT_DATA_HI_CDC 0x10038#define RPM_LMAC_FWI 0xa +#define RPM_TX_EN BIT_ULL(0) +#define RPM_RX_EN BIT_ULL(1)/* Function Declarations */ int rpm_get_nr_lmacs (void *rpmd);
@@ -57,4 +59,6 @@ int rpm_lmac_enadis_pause_frm(void *rpmd, int lmac_id, u8 tx_pause,int rpm_get_tx_stats (void *rpmd,int lmac_id,int idx,u64 *tx_stat);int rpm_get_rx_stats (void *rpmd,int lmac_id,int idx,u64 *rx_stat);void rpm_lmac_ptp_config (void *rpmd,int lmac_id,bool enable); +int rpm_lmac_rx_tx_enable (void *rpmd,int lmac_id,bool enable); +int rpm_lmac_tx_enable (void *rpmd,int lmac_id,bool enable);#endif /* RPM_H */
drivers/net/ethernet/marvell/octeontx2/af/rvu.h +1 -0
@@ -806,6 +806,7 @@ bool is_mac_feature_supported(struct rvu *rvu, int pf, int feature);u32 rvu_cgx_get_fifolen (struct rvu *rvu);void *rvu_first_cgx_pdata (struct rvu *rvu);int cgxlmac_to_pf (struct rvu *rvu,int cgx_id,int lmac_id); +int rvu_cgx_config_tx (void *cgxd,int lmac_id,bool enable);int npc_get_nixlf_mcam_index (struct npc_mcam *mcam,u16 pcifunc,int nixlf,int type);
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +12 -2
@@ -441,16 +441,26 @@ void rvu_cgx_enadis_rx_bp(struct rvu *rvu, int pf, bool enable)int rvu_cgx_config_rxtx (struct rvu *rvu,u16 pcifunc,bool start) {int pf =rvu_get_pf (pcifunc); +struct mac_ops *mac_ops;u8 cgx_id, lmac_id; +void *cgxd;if (!is_cgx_config_permitted (rvu, pcifunc))return LMAC_AF_ERR_PERM_DENIED ;rvu_get_cgx_lmac_id (rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id); + cgxd =rvu_cgx_pdata (cgx_id, rvu); + mac_ops =get_mac_ops (cgxd); + +return mac_ops->mac_rx_tx_enable (cgxd, lmac_id, start); +} -cgx_lmac_rx_tx_enable (rvu_cgx_pdata (cgx_id, rvu), lmac_id, start); +int rvu_cgx_config_tx (void *cgxd,int lmac_id,bool enable) +{ +struct mac_ops *mac_ops; -return 0 ; + mac_ops =get_mac_ops (cgxd); +return mac_ops->mac_tx_enable (cgxd, lmac_id, enable); }void rvu_cgx_disable_dmac_entries (struct rvu *rvu,u16 pcifunc)
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +5 -5
@@ -2068,8 +2068,8 @@ static int nix_smq_flush(struct rvu *rvu, int blkaddr,/* enable cgx tx if disabled */ if (is_pf_cgxmapped (rvu, pf)) {rvu_get_cgx_lmac_id (rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id); - restore_tx_en = !cgx_lmac_tx_enable (rvu_cgx_pdata (cgx_id, rvu), - lmac_id, true); + restore_tx_en = !rvu_cgx_config_tx (rvu_cgx_pdata (cgx_id, rvu), + lmac_id, true); } cfg =rvu_read64 (rvu, blkaddr,NIX_AF_SMQX_CFG (smq));
@@ -2092,7 +2092,7 @@ static int nix_smq_flush(struct rvu *rvu, int blkaddr,rvu_cgx_enadis_rx_bp (rvu, pf, true);/* restore cgx tx state */ if (restore_tx_en) -cgx_lmac_tx_enable (rvu_cgx_pdata (cgx_id, rvu), lmac_id, false); +rvu_cgx_config_tx (rvu_cgx_pdata (cgx_id, rvu), lmac_id, false);return err; }
@@ -3878,7 +3878,7 @@ nix_config_link_credits(struct rvu *rvu, int blkaddr, int link,/* Enable cgx tx if disabled for credits to be back */ if (is_pf_cgxmapped (rvu, pf)) {rvu_get_cgx_lmac_id (rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id); - restore_tx_en = !cgx_lmac_tx_enable (rvu_cgx_pdata (cgx_id, rvu), + restore_tx_en = !rvu_cgx_config_tx (rvu_cgx_pdata (cgx_id, rvu), lmac_id, true); }
@@ -3918,7 +3918,7 @@ exit:/* Restore state of cgx tx */ if (restore_tx_en) -cgx_lmac_tx_enable (rvu_cgx_pdata (cgx_id, rvu), lmac_id, false); +rvu_cgx_config_tx (rvu_cgx_pdata (cgx_id, rvu), lmac_id, false);mutex_unlock (&rvu->rsrc_lock);return rc;
Signature · 1 line
2.34.1