5.15.64-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.15.64-rc1 review
This is the start of the stable review cycle for the 5.15.64 release. There are 136 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, 31 Aug 2022 10:57:37 +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.15.64-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.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.15.64-rc1
Daniel Borkmann <[email protected]>
bpf: Don't use tnum_range on array range checking for poke descriptors
Saurabh Sengar <[email protected]>
scsi: storvsc: Remove WQ_MEM_RECLAIM from storvsc_error_wq
Kiwoong Kim <[email protected]>
scsi: ufs: core: Enable link lost interrupt
Ian Rogers <[email protected]>
perf stat: Clear evsel->reset_group for each stat run
Stephane Eranian <[email protected]>
perf/x86/intel/ds: Fix precise store latency handling
Stephane Eranian <[email protected]>
perf/x86/intel/uncore: Fix broken read_counter() for SNB IMC PMU
James Clark <[email protected]>
perf python: Fix build when PYTHON_CONFIG is user supplied
Yu Kuai <[email protected]>
blk-mq: fix io hung due to missing commit_rqs
Salvatore Bonaccorso <[email protected]>
Documentation/ABI: Mention retbleed vulnerability info file for sysfs
Peter Zijlstra <[email protected]>
x86/nospec: Fix i386 RSB stuffing
Liam Howlett <[email protected]>
binder_alloc: add missing mmap_lock calls when using the VMA
Zenghui Yu <[email protected]>
arm64: Fix match_list for erratum 1286807 on Arm Cortex-A76
Yonglong Li <[email protected]>
mptcp: Fix crash due to tcp_tsorted_anchor was initialized before release skb
Guoqing Jiang <[email protected]>
md: call __md_stop_writes in md_stop
Guoqing Jiang <[email protected]>
Revert "md-raid: destroy the bitmap after destroying the thread"
David Hildenbrand <[email protected]>
mm/hugetlb: fix hugetlb not supporting softdirty tracking
Greg Kroah-Hartman <[email protected]>
Revert "usbnet: smsc95xx: Forward PHY interrupts to PHY driver to avoid polling"
Greg Kroah-Hartman <[email protected]>
Revert "usbnet: smsc95xx: Fix deadlock on runtime resume"
Jens Axboe <[email protected]>
io_uring: fix issue with io_write() not always undoing sb_start_write()
Conor Dooley <[email protected]>
riscv: traps: add missing prototype
Juergen Gross <[email protected]>
xen/privcmd: fix error exit of privcmd_ioctl_dm_op()
David Howells <[email protected]>
smb3: missing inode locks in punch hole
Karol Herbst <[email protected]>
nouveau: explicitly wait on the fence in nouveau_bo_move_m2mf
Riwen Lu <[email protected]>
ACPI: processor: Remove freq Qos request for all CPUs
Shakeel Butt <[email protected]>
Revert "memcg: cleanup racy sum avoidance code"
Shigeru Yoshida <[email protected]>
fbdev: fbcon: Properly revert changes when vc_resize() failed
Brian Foster <[email protected]>
s390: fix double free of GS and RI CBs on fork() failure
Liu Shixin <[email protected]>
bootmem: remove the vmemmap pages from kmemleak in put_page_bootmem
Gerald Schaefer <[email protected]>
s390/mm: do not trigger write fault when vma does not allow VM_WRITE
Badari Pulavarty <[email protected]>
mm/damon/dbgfs: avoid duplicate context directory creation
Quanyang Wang <[email protected]>
asm-generic: sections: refactor memory_intersects
Khazhismel Kumykov <[email protected]>
writeback: avoid use-after-free after removing device
Siddh Raman Pant <[email protected]>
loop: Check for overflow while configuring loop
Peter Zijlstra <[email protected]>
x86/nospec: Unwreck the RSB stuffing
Pawan Gupta <[email protected]>
x86/bugs: Add "unknown" reporting for MMIO Stale Data
Chen Zhongjin <[email protected]>
x86/unwind/orc: Unwind ftrace trampolines with correct ORC entry
Kan Liang <[email protected]>
perf/x86/lbr: Enable the branch type for the Arch LBR by default
Zixuan Fu <[email protected]>
btrfs: fix possible memory leak in btrfs_get_dev_args_from_path()
Goldwyn Rodrigues <[email protected]>
btrfs: check if root is readonly while setting security xattr
Anand Jain <[email protected]>
btrfs: add info when mount fails due to stale replace target
Anand Jain <[email protected]>
btrfs: replace: drop assert for suspended replace
Filipe Manana <[email protected]>
btrfs: fix silent failure when deleting root reference
Heiner Kallweit <[email protected]>
net: stmmac: work around sporadic tx issue on link-up
R Mohamed Shah <[email protected]>
ionic: VF initial random MAC address if no assigned mac
Shannon Nelson <[email protected]>
ionic: fix up issues with handling EAGAIN on FW cmds
Shannon Nelson <[email protected]>
ionic: clear broken state on generation change
Shannon Nelson <[email protected]>
ionic: widen queue_lock use around lif init and deinit
David Howells <[email protected]>
rxrpc: Fix locking in rxrpc's sendmsg
Sylwester Dziedziuch <[email protected]>
i40e: Fix incorrect address type for IPv6 flow rules
Jacob Keller <[email protected]>
ixgbe: stop resetting SYSTIME in ixgbe_ptp_start_cyclecounter
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around sysctl_somaxconn.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around sysctl_devconf_inherit_init_net.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around sysctl_fb_tunnels_only_for_init_net.
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around netdev_budget_usecs.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around sysctl_max_skb_frags.
Paolo Abeni <[email protected]>
mptcp: stop relying on tcp_tx_skb_cache
Paolo Abeni <[email protected]>
tcp: expose the tcp_mark_push() and tcp_skb_entail() helpers
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around netdev_budget.
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around sysctl_net_busy_read.
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around sysctl_net_busy_poll.
Kuniyuki Iwashima <[email protected]>
net: Fix a data-race around sysctl_tstamp_allow_data.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around sysctl_optmem_max.
Kuniyuki Iwashima <[email protected]>
ratelimit: Fix data-races in ___ratelimit().
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around netdev_tstamp_prequeue.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around netdev_max_backlog.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around weight_p and dev_weight_[rt]x_bias.
Kuniyuki Iwashima <[email protected]>
net: Fix data-races around sysctl_[rw]mem_(max|default).
Pablo Neira Ayuso <[email protected]>
netfilter: flowtable: fix stuck flows on cleanup due to pending work
Pablo Neira Ayuso <[email protected]>
netfilter: flowtable: add function to invoke garbage collection immediately
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: disallow binding to already bound chain
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: disallow jump to implicit chain from set element
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: upfront validation of data via nft_data_init()
Jeremy Sowden <[email protected]>
netfilter: bitwise: improve error goto labels
Pablo Neira Ayuso <[email protected]>
netfilter: nft_cmp: optimize comparison for 16-bytes
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: consolidate rule verdict trace call
Pablo Neira Ayuso <[email protected]>
netfilter: nft_tunnel: restrict it to netdev family
Pablo Neira Ayuso <[email protected]>
netfilter: nft_osf: restrict osf to ipv4, ipv6 and inet families
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: do not leave chain stats enabled on error
Pablo Neira Ayuso <[email protected]>
netfilter: nft_payload: do not truncate csum_offset and csum_type
Pablo Neira Ayuso <[email protected]>
netfilter: nft_payload: report ERANGE for too long offset and length
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: make table handle allocation per-netns friendly
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: disallow updates of implicit chain
Vikas Gupta <[email protected]>
bnxt_en: fix NQ resource accounting during vf creation on 57500 chips
Florian Westphal <[email protected]>
netfilter: ebtables: reject blobs that don't provide all entry points
Maciej Żenczykowski <[email protected]>
net: ipvtap - add __init/__exit annotations to module init/exit funcs
Jonathan Toppins <[email protected]>
bonding: 802.3ad: fix no transmission of LACPDUs
Sergei Antonov <[email protected]>
net: moxa: get rid of asymmetry in DMA mapping/unmapping
Xiaolei Wang <[email protected]>
net: phy: Don't WARN for PHY_READY state in mdio_bus_phy_resume()
Alex Elder <[email protected]>
net: ipa: don't assume SMEM is page-aligned
Maor Dickman <[email protected]>
net/mlx5e: Fix wrong tc flag used when set hw-tc-offload off
Aya Levin <[email protected]>
net/mlx5e: Fix wrong application of the LRO state
Moshe Shemesh <[email protected]>
net/mlx5: Avoid false positive lockdep warning by adding lock_class_key
Vlad Buslov <[email protected]>
net/mlx5e: Properly disable vlan strip on non-UL reps
Maciej Fijalkowski <[email protected]>
ice: xsk: prohibit usage of non-balanced queue id
Maciej Fijalkowski <[email protected]>
ice: xsk: Force rings to be sized to power of 2
Duoming Zhou <[email protected]>
nfc: pn533: Fix use-after-free bugs caused by pn532_cmd_timeout
Hayes Wang <[email protected]>
r8152: fix the RX FIFO settings when suspending
Hayes Wang <[email protected]>
r8152: fix the units of some registers for RTL8156A
Bernard Pidoux <[email protected]>
rose: check NULL rose_loopback_neigh->loopback
Christian Brauner <[email protected]>
ntfs: fix acl handling
Peter Xu <[email protected]>
mm/smaps: don't access young/dirty bit if pte unpresent
Trond Myklebust <[email protected]>
SUNRPC: RPC level errors should set task->tk_rpc_status
Olga Kornievskaia <[email protected]>
NFSv4.2 fix problems with __nfs42_ssc_open
Trond Myklebust <[email protected]>
NFS: Don't allocate nfs_fattr on the stack in __nfs42_ssc_open()
Sabrina Dubroca <[email protected]>
Revert "net: macsec: update SCI upon MAC address change."
Jakub Kicinski <[email protected]>
net: use eth_hw_addr_set() instead of ether_addr_copy()
Seth Forshee <[email protected]>
fs: require CAP_SYS_ADMIN in target namespace for idmapped mounts
Nikolay Aleksandrov <[email protected]>
xfrm: policy: fix metadata dst->dev xmit null pointer dereference
Herbert Xu <[email protected]>
af_key: Do not call xfrm_probe_algs in parallel
Antony Antony <[email protected]>
xfrm: clone missing x->lastused in xfrm_do_migrate
Xin Xiong <[email protected]>
xfrm: fix refcount leak in __xfrm_policy_check()
Chen Lifu <[email protected]>
riscv: lib: uaccess: fix CSR_STATUS SR_SUM bit
Jisheng Zhang <[email protected]>
riscv: lib: uaccess: fold fixups into body
Qu Wenruo <[email protected]>
btrfs: remove unnecessary parameter delalloc_start for writepage_delalloc()
Filipe Manana <[email protected]>
btrfs: pass the dentry to btrfs_log_new_name() instead of the inode
Filipe Manana <[email protected]>
btrfs: put initial index value of a directory in a constant
Quinn Tran <[email protected]>
scsi: qla2xxx: edif: Fix dropped IKE message
Arun Easi <[email protected]>
scsi: qla2xxx: Fix response queue handler reading stale packets
Phil Auld <[email protected]>
drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist
Werner Sembach <[email protected]>
Input: i8042 - add additional TUXEDO devices to i8042 quirk tables
Werner Sembach <[email protected]>
Input: i8042 - add TUXEDO devices to i8042 quirk tables
Werner Sembach <[email protected]>
Input: i8042 - merge quirk tables
Werner Sembach <[email protected]>
Input: i8042 - move __initconst to fix code styling warning
Naohiro Aota <[email protected]>
btrfs: convert count_max_extents() to use fs_info->max_extent_size
Naohiro Aota <[email protected]>
btrfs: replace BTRFS_MAX_EXTENT_SIZE with fs_info->max_extent_size
Naohiro Aota <[email protected]>
btrfs: zoned: revive max_zone_append_bytes
Naohiro Aota <[email protected]>
block: add bdev_max_segments() helper
Christoph Hellwig <[email protected]>
block: add a bdev_max_zone_append_sectors helper
Lai Jiangshan <[email protected]>
x86/entry: Move CLD to the start of the idtentry macro
Randy Dunlap <[email protected]>
kernel/sys_ni: add compat entry for fadvise64_64
Helge Deller <[email protected]>
parisc: Fix exception handler for fldw and fstw instructions
Helge Deller <[email protected]>
parisc: Make CONFIG_64BIT available for ARCH=parisc64 only
Jing-Ting Wu <[email protected]>
cgroup: Fix race condition at rebind_subsystems()
Gaosheng Cui <[email protected]>
audit: fix potential double free on error path from fsnotify_add_inode_mark
Martin Liška <[email protected]>
eth: sun: cassini: remove dead code
Jakub Kicinski <[email protected]>
wifi: rtlwifi: remove always-true condition pointed out by GCC 12
-------------
Diffstat:
Documentation/ABI/testing/sysfs-devices-system-cpu | 1 + .../hw-vuln/processor_mmio_stale_data.rst | 14 + Documentation/admin-guide/sysctl/net.rst | 2 +- Makefile | 4 +- arch/arm64/kernel/cpu_errata.c | 2 + arch/parisc/Kconfig | 21 +- arch/parisc/kernel/unaligned.c | 2 +- arch/riscv/include/asm/thread_info.h | 2 + arch/riscv/kernel/traps.c | 3 +- arch/riscv/lib/uaccess.S | 24 +- arch/s390/kernel/process.c | 22 +- arch/s390/mm/fault.c | 4 +- arch/x86/entry/entry_64.S | 8 +- arch/x86/events/intel/ds.c | 10 +- arch/x86/events/intel/lbr.c | 8 + arch/x86/events/intel/uncore_snb.c | 18 +- arch/x86/include/asm/cpufeatures.h | 5 +- arch/x86/include/asm/nospec-branch.h | 92 +- arch/x86/kernel/cpu/bugs.c | 14 +- arch/x86/kernel/cpu/common.c | 42 +- arch/x86/kernel/unwind_orc.c | 15 +- block/blk-mq.c | 5 +- drivers/acpi/processor_thermal.c | 2 +- drivers/android/binder_alloc.c | 31 +- drivers/base/node.c | 4 +- drivers/base/topology.c | 28 +- drivers/block/loop.c | 5 + drivers/gpu/drm/nouveau/nouveau_bo.c | 9 + drivers/input/serio/i8042-x86ia64io.h | 1251 ++++++++++++-------- drivers/md/md.c | 3 +- drivers/net/bonding/bond_3ad.c | 38 +- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 +- drivers/net/ethernet/intel/ice/ice_xsk.c | 14 + drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 59 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 12 +- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 + drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 + drivers/net/ethernet/moxa/moxart_ether.c | 11 +- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 109 +- drivers/net/ethernet/pensando/ionic/ionic_main.c | 4 +- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 8 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 +- drivers/net/ethernet/sun/cassini.c | 4 +- drivers/net/ipa/ipa_mem.c | 2 +- drivers/net/ipvlan/ipvlan_main.c | 2 +- drivers/net/ipvlan/ipvtap.c | 4 +- drivers/net/macsec.c | 13 +- drivers/net/macvlan.c | 2 +- drivers/net/phy/phy_device.c | 8 +- drivers/net/usb/r8152.c | 27 +- drivers/net/usb/smsc95xx.c | 139 +-- .../net/wireless/realtek/rtlwifi/rtl8192de/phy.c | 5 +- drivers/nfc/pn533/uart.c | 1 + drivers/nvme/target/zns.c | 3 +- drivers/scsi/qla2xxx/qla_gbl.h | 2 + drivers/scsi/qla2xxx/qla_isr.c | 76 +- drivers/scsi/qla2xxx/qla_os.c | 10 + drivers/scsi/storvsc_drv.c | 2 +- drivers/scsi/ufs/ufshci.h | 6 +- drivers/video/fbdev/core/fbcon.c | 27 +- drivers/xen/privcmd.c | 21 +- fs/btrfs/btrfs_inode.h | 12 +- fs/btrfs/ctree.h | 29 +- fs/btrfs/delalloc-space.c | 6 +- fs/btrfs/dev-replace.c | 5 +- fs/btrfs/disk-io.c | 2 + fs/btrfs/extent_io.c | 18 +- fs/btrfs/inode.c | 40 +- fs/btrfs/root-tree.c | 5 +- fs/btrfs/tree-log.c | 19 +- fs/btrfs/tree-log.h | 2 +- fs/btrfs/volumes.c | 5 +- fs/btrfs/xattr.c | 3 + fs/btrfs/zoned.c | 20 + fs/btrfs/zoned.h | 1 + fs/cifs/smb2ops.c | 12 +- fs/fs-writeback.c | 12 +- fs/io_uring.c | 7 +- fs/namespace.c | 7 + fs/nfs/nfs4file.c | 16 +- fs/ntfs3/xattr.c | 16 +- fs/proc/task_mmu.c | 7 +- fs/zonefs/super.c | 3 +- include/asm-generic/sections.h | 7 +- include/linux/blkdev.h | 11 + include/linux/cpumask.h | 18 + include/linux/memcontrol.h | 15 +- include/linux/mlx5/driver.h | 1 + include/linux/netdevice.h | 20 +- include/linux/netfilter_bridge/ebtables.h | 4 - include/net/busy_poll.h | 2 +- include/net/netfilter/nf_flow_table.h | 3 + include/net/netfilter/nf_tables.h | 10 +- include/net/netfilter/nf_tables_core.h | 9 + include/net/tcp.h | 2 + kernel/audit_fsnotify.c | 1 + kernel/bpf/verifier.c | 10 +- kernel/cgroup/cgroup.c | 1 + kernel/sys_ni.c | 1 + lib/ratelimit.c | 12 +- mm/backing-dev.c | 10 +- mm/bootmem_info.c | 2 + mm/damon/dbgfs.c | 3 + mm/mmap.c | 8 +- mm/page-writeback.c | 6 +- net/8021q/vlan_dev.c | 6 +- net/bridge/netfilter/ebtable_broute.c | 8 - net/bridge/netfilter/ebtable_filter.c | 8 - net/bridge/netfilter/ebtable_nat.c | 8 - net/bridge/netfilter/ebtables.c | 8 +- net/core/bpf_sk_storage.c | 5 +- net/core/dev.c | 18 +- net/core/filter.c | 13 +- net/core/gro_cells.c | 2 +- net/core/skbuff.c | 2 +- net/core/sock.c | 18 +- net/core/sysctl_net_core.c | 15 +- net/dsa/slave.c | 4 +- net/hsr/hsr_device.c | 2 +- net/hsr/hsr_main.c | 2 +- net/ipv4/devinet.c | 16 +- net/ipv4/ip_output.c | 2 +- net/ipv4/ip_sockglue.c | 6 +- net/ipv4/tcp.c | 12 +- net/ipv4/tcp_output.c | 2 +- net/ipv6/addrconf.c | 5 +- net/ipv6/ipv6_sockglue.c | 4 +- net/key/af_key.c | 3 + net/mptcp/protocol.c | 138 ++- net/netfilter/ipvs/ip_vs_sync.c | 4 +- net/netfilter/nf_flow_table_core.c | 15 +- net/netfilter/nf_flow_table_offload.c | 8 + net/netfilter/nf_tables_api.c | 96 +- net/netfilter/nf_tables_core.c | 55 +- net/netfilter/nft_bitwise.c | 67 +- net/netfilter/nft_cmp.c | 140 ++- net/netfilter/nft_immediate.c | 22 +- net/netfilter/nft_osf.c | 18 +- net/netfilter/nft_payload.c | 29 +- net/netfilter/nft_range.c | 27 +- net/netfilter/nft_tunnel.c | 1 + net/rose/rose_loopback.c | 3 +- net/rxrpc/call_object.c | 4 +- net/rxrpc/sendmsg.c | 92 +- net/sched/sch_generic.c | 2 +- net/socket.c | 2 +- net/sunrpc/clnt.c | 2 +- net/xfrm/espintcp.c | 2 +- net/xfrm/xfrm_input.c | 2 +- net/xfrm/xfrm_policy.c | 3 +- net/xfrm/xfrm_state.c | 1 + tools/perf/Makefile.config | 2 +- tools/perf/builtin-stat.c | 1 + 154 files changed, 2271 insertions(+), 1316 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/136 wifi: rtlwifi: remove always-true condition pointed out by GCC 12
From: Jakub Kicinski <[email protected]>
commit ee3db469dd317e82f57b13aa3bc61be5cb60c2b4 upstream.
The .value is a two-dim array, not a pointer.
struct iqk_matrix_regs {
bool iqk_done;
long value[1][IQK_MATRIX_REG_NUM];
};--- drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c +1 -4
@@ -2386,10 +2386,7 @@ void rtl92d_phy_reload_iqk_setting(strucrtl_dbg (rtlpriv,COMP_SCAN ,DBG_LOUD ,"Just Read IQK Matrix reg for channel:%d....\n" , channel); -if ((rtlphy->iqk_matrix[indexforchannel]. - value[0 ] !=NULL ) -/*&&(regea4 != 0) */ ) - _rtl92d_phy_patha_fill_iqk_matrix(hw, true, + _rtl92d_phy_patha_fill_iqk_matrix(hw, true, rtlphy->iqk_matrix[ indexforchannel].value, 0, (rtlphy->iqk_matrix[
Greg Kroah-Hartman
maintainerPATCH 2/136 eth: sun: cassini: remove dead code
In reply to Greg Kroah-HartmanFrom: Martin Liška <[email protected]>
commit 32329216ca1d6ee29c41215f18b3053bb6158541 upstream.
Fixes the following GCC warning:
drivers/net/ethernet/sun/cassini.c:1316:29: error: comparison between two arrays [-Werror=array-compare] drivers/net/ethernet/sun/cassini.c:3783:34: error: comparison between two arrays [-Werror=array-compare]
Note that 2 arrays should be compared by comparing of their addresses:
note: use ‘&cas_prog_workaroundtab[0] == &cas_prog_null[0]’ to compare the addresses
--- drivers/net/ethernet/sun/cassini.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/sun/cassini.c +2 -2
@@ -1325,7 +1325,7 @@ static void cas_init_rx_dma(struct cas *writel (val, cp->regs +REG_RX_PAGE_SIZE );/* enable the header parser if desired */ -if (CAS_HP_FIRMWARE == cas_prog_null) +if (&CAS_HP_FIRMWARE [0 ] == &cas_prog_null[0 ])return ; val =CAS_BASE (HP_CFG_NUM_CPU ,CAS_NCPUS >63 ?0 :CAS_NCPUS );
@@ -3794,7 +3794,7 @@ static void cas_reset(struct cas *cp, in/* program header parser */ if ((cp->cas_flags &CAS_FLAG_TARGET_ABORT ) || - (CAS_HP_ALT_FIRMWARE == cas_prog_null)) { + (&CAS_HP_ALT_FIRMWARE [0 ] == &cas_prog_null[0 ])) {cas_load_firmware (cp,CAS_HP_FIRMWARE ); }else {cas_load_firmware (cp,CAS_HP_ALT_FIRMWARE );
Greg Kroah-Hartman
maintainerPATCH 3/136 audit: fix potential double free on error path from fsnotify_add_inode_mark
In reply to Greg Kroah-HartmanFrom: Gaosheng Cui <[email protected]>
commit ad982c3be4e60c7d39c03f782733503cbd88fd2a upstream.
Audit_alloc_mark() assign pathname to audit_mark->path, on error path from fsnotify_add_inode_mark(), fsnotify_put_mark will free memory of audit_mark->path, but the caller of audit_alloc_mark will free the pathname again, so there will be double free problem.
Fix this by resetting audit_mark->path to NULL pointer on error path from fsnotify_add_inode_mark().
--- kernel/audit_fsnotify.c | 1 + 1 file changed, 1 insertion(+)
kernel/audit_fsnotify.c +1 -0
@@ -102,6 +102,7 @@ struct audit_fsnotify_mark *audit_alloc_ ret =fsnotify_add_inode_mark (&audit_mark->mark, inode, true);if (ret <0 ) { + audit_mark->path =NULL ;fsnotify_put_mark (&audit_mark->mark); audit_mark =ERR_PTR (ret); }
Greg Kroah-Hartman
maintainerPATCH 4/136 cgroup: Fix race condition at rebind_subsystems()
In reply to Greg Kroah-HartmanFrom: Jing-Ting Wu <[email protected]>
commit 763f4fb76e24959c370cdaa889b2492ba6175580 upstream.
Root cause:
The rebind_subsystems() is no lock held when move css object from A list to B list,then let B's head be treated as css node at list_for_each_entry_rcu().
Solution:
Add grace period before invalidating the removed rstat_css_node.
--- kernel/cgroup/cgroup.c | 1 + 1 file changed, 1 insertion(+)
kernel/cgroup/cgroup.c +1 -0
@@ -1810,6 +1810,7 @@ int rebind_subsystems(struct cgroup_rootif (ss->css_rstat_flush) {list_del_rcu (&css->rstat_css_node); +synchronize_rcu ();list_add_rcu (&css->rstat_css_node, &dcgrp->rstat_css_list); }
Greg Kroah-Hartman
maintainerPATCH 5/136 parisc: Make CONFIG_64BIT available for ARCH=parisc64 only
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit 3dcfb729b5f4a0c9b50742865cd5e6c4dbcc80dc upstream.
With this patch the ARCH= parameter decides if the CONFIG_64BIT option will be set or not. This means, the ARCH= parameter will give:
ARCH=parisc -> 32-bit kernel ARCH=parisc64 -> 64-bit kernel
This simplifies the usage of the other config options like randconfig, allmodconfig and allyesconfig a lot and produces the output which is expected for parisc64 (64-bit) vs. parisc (32-bit).
--- arch/parisc/Kconfig | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-)
arch/parisc/Kconfig +6 -15
@@ -142,10 +142,10 @@ menu "Processor type and features" choice prompt "Processor type" - default PA7000 + default PA7000 if "$(ARCH)" = "parisc" config PA7000 - bool "PA7000/PA7100" + bool "PA7000/PA7100" if "$(ARCH)" = "parisc" help This is the processor type of your CPU. This information is used for optimizing purposes. In order to compile a kernel
@@ -156,21 +156,21 @@ config PA7000 which is required on some machines. config PA7100LC - bool "PA7100LC" + bool "PA7100LC" if "$(ARCH)" = "parisc" help Select this option for the PCX-L processor, as used in the 712, 715/64, 715/80, 715/100, 715/100XC, 725/100, 743, 748, D200, D210, D300, D310 and E-class config PA7200 - bool "PA7200" + bool "PA7200" if "$(ARCH)" = "parisc" help Select this option for the PCX-T' processor, as used in the C100, C110, J100, J110, J210XC, D250, D260, D350, D360, K100, K200, K210, K220, K400, K410 and K420 config PA7300LC - bool "PA7300LC" + bool "PA7300LC" if "$(ARCH)" = "parisc" help Select this option for the PCX-L2 processor, as used in the 744, A180, B132L, B160L, B180L, C132L, C160L, C180L,
@@ -220,17 +220,8 @@ config MLONGCALLS Enabling this option will probably slow down your kernel. config 64BIT - bool "64-bit kernel" + def_bool "$(ARCH)" = "parisc64" depends on PA8X00 - help - Enable this if you want to support 64bit kernel on PA-RISC platform. - - At the moment, only people willing to use more than 2GB of RAM, - or having a 64bit-only capable PA-RISC machine should say Y here. - - Since there is no 64bit userland on PA-RISC, there is no point to - enable this option otherwise. The 64bit kernel is significantly bigger - and slower than the 32bit one. choice prompt "Kernel page size"
Greg Kroah-Hartman
maintainerPATCH 6/136 parisc: Fix exception handler for fldw and fstw instructions
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit 7ae1f5508d9a33fd58ed3059bd2d569961e3b8bd upstream.
The exception handler is broken for unaligned memory acceses with fldw and fstw instructions, because it trashes or uses randomly some other floating point register than the one specified in the instruction word on loads and stores.
The instruction "fldw 0(addr),%fr22L" (and the other fldw/fstw instructions) encode the target register (%fr22) in the rightmost 5 bits of the instruction word. The 7th rightmost bit of the instruction word defines if the left or right half of %fr22 should be used.
While processing unaligned address accesses, the FR3() define is used to extract the offset into the local floating-point register set. But the calculation in FR3() was buggy, so that for example instead of %fr22, register %fr12 [((22 * 2) & 0x1f) = 12] was used.
This bug has been since forever in the parisc kernel and I wonder why it wasn't detected earlier. Interestingly I noticed this bug just because the libime debian package failed to build on *native* hardware, while it successfully built in qemu.
This patch corrects the bitshift and masking calculation in FR3().
--- arch/parisc/kernel/unaligned.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/parisc/kernel/unaligned.c +1 -1
@@ -107,7 +107,7 @@#define R1 (i) (((i)>>21)&0x1f)#define R2 (i) (((i)>>16)&0x1f)#define R3 (i) ((i)&0x1f) -#define FR3 (i) ((((i)<<1)&0x1f)|(((i)>>6)&1)) +#define FR3 (i) ((((i)&0x1f)<<1)|(((i)>>6)&1))#define IM (i,n) (((i)>>1&((1<<(n-1))-1))|((i)&1?((0-1L)<<(n-1)):0))#define IM5_2 (i) IM((i)>>16,5)#define IM5_3 (i) IM((i),5)
Greg Kroah-Hartman
maintainerPATCH 7/136 kernel/sys_ni: add compat entry for fadvise64_64
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
commit a8faed3a02eeb75857a3b5d660fa80fe79db77a3 upstream.
When CONFIG_ADVISE_SYSCALLS is not set/enabled and CONFIG_COMPAT is set/enabled, the riscv compat_syscall_table references 'compat_sys_fadvise64_64', which is not defined:
riscv64-linux-ld: arch/riscv/kernel/compat_syscall_table.o:(.rodata+0x6f8):
undefined reference to `compat_sys_fadvise64_64'
Add 'fadvise64_64' to kernel/sys_ni.c as a conditional COMPAT function so that when CONFIG_ADVISE_SYSCALLS is not set, there is a fallback function available.
--- kernel/sys_ni.c | 1 + 1 file changed, 1 insertion(+)
kernel/sys_ni.c +1 -0
@@ -276,6 +276,7 @@ COND_SYSCALL(landlock_restrict_self);/* mm/fadvise.c */ COND_SYSCALL (fadvise64_64); +COND_SYSCALL_COMPAT (fadvise64_64);/* mm/, CONFIG_MMU only */ COND_SYSCALL (swapon);
Greg Kroah-Hartman
maintainerPATCH 8/136 x86/entry: Move CLD to the start of the idtentry macro
In reply to Greg Kroah-HartmanFrom: Lai Jiangshan <[email protected]>
commit c64cc2802a784ecfd25d39945e57e7a147854a5b upstream.
Move it after CLAC.
--- arch/x86/entry/entry_64.S | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/x86/entry/entry_64.S +5 -3
@@ -373,6 +373,7 @@ SYM_CODE_END(xen_error_entry) SYM_CODE_START(\asmsym) UNWIND_HINT_IRET_REGS offset=\has_error_code*8 ASM_CLAC + cld .if \has_error_code == 0 pushq $-1 /* ORIG_RAX: no syscall to restart */
@@ -440,6 +441,7 @@ SYM_CODE_END(\asmsym) SYM_CODE_START(\asmsym) UNWIND_HINT_IRET_REGS ASM_CLAC + cld pushq $-1 /* ORIG_RAX: no syscall to restart */
@@ -495,6 +497,7 @@ SYM_CODE_END(\asmsym) SYM_CODE_START(\asmsym) UNWIND_HINT_IRET_REGS ASM_CLAC + cld /* * If the entry is from userspace, switch stacks and treat it as
@@ -557,6 +560,7 @@ SYM_CODE_END(\asmsym) SYM_CODE_START(\asmsym) UNWIND_HINT_IRET_REGS offset=8 ASM_CLAC + cld /* paranoid_entry returns GS information for paranoid_exit in EBX. */ call paranoid_entry
@@ -876,7 +880,6 @@ SYM_CODE_END(xen_failsafe_callback) */ SYM_CODE_START_LOCAL(paranoid_entry) UNWIND_HINT_FUNC - cld PUSH_AND_CLEAR_REGS save_ret=1 ENCODE_FRAME_POINTER 8
@@ -1012,7 +1015,6 @@ SYM_CODE_END(paranoid_exit) */ SYM_CODE_START_LOCAL(error_entry) UNWIND_HINT_FUNC - cld PUSH_AND_CLEAR_REGS save_ret=1 ENCODE_FRAME_POINTER 8
@@ -1155,6 +1157,7 @@ SYM_CODE_START(asm_exc_nmi) */ ASM_CLAC + cld /* Use %rdx as our temp variable throughout */ pushq %rdx
@@ -1174,7 +1177,6 @@ SYM_CODE_START(asm_exc_nmi) */ swapgs - cld FENCE_SWAPGS_USER_ENTRY SWITCH_TO_KERNEL_CR3 scratch_reg=%rdx movq %rsp, %rdx
Greg Kroah-Hartman
maintainerPATCH 9/136 block: add a bdev_max_zone_append_sectors helper
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
commit 2aba0d19f4d8c8929b4b3b94a9cfde2aa20e6ee2 upstream
Add a helper to check the max supported sectors for zone append based on the block_device instead of having to poke into the block layer internal request_queue.
--- drivers/nvme/target/zns.c | 3 +-- fs/zonefs/super.c | 3 +-- include/linux/blkdev.h | 6 ++++++ 3 files changed, 8 insertions(+), 4 deletions(-)
drivers/nvme/target/zns.c +1 -2
@@ -34,8 +34,7 @@ static int validate_conv_zones_cb(structbool nvmet_bdev_zns_enable (struct nvmet_ns *ns) { -struct request_queue *q = ns->bdev->bd_disk->queue; -u8 zasl =nvmet_zasl (queue_max_zone_append_sectors (q)); +u8 zasl =nvmet_zasl (bdev_max_zone_append_sectors (ns->bdev));struct gendisk *bd_disk = ns->bdev->bd_disk;int ret;
fs/zonefs/super.c +1 -2
@@ -723,13 +723,12 @@ static ssize_t zonefs_file_dio_append(ststruct inode *inode =file_inode (iocb->ki_filp);struct zonefs_inode_info *zi =ZONEFS_I (inode);struct block_device *bdev = inode->i_sb->s_bdev; -unsigned int max; +unsigned int max =bdev_max_zone_append_sectors (bdev);struct bio *bio;ssize_t size;int nr_pages;ssize_t ret; - max =queue_max_zone_append_sectors (bdev_get_queue (bdev)); max =ALIGN_DOWN (max <<SECTOR_SHIFT , inode->i_sb->s_blocksize);iov_iter_truncate (from, max);
include/linux/blkdev.h +6 -0
@@ -1387,6 +1387,12 @@ static inline unsigned int queue_max_zonreturn min (l->max_zone_append_sectors, l->max_sectors); } +static inline unsigned int +bdev_max_zone_append_sectors (struct block_device *bdev) +{ +return queue_max_zone_append_sectors (bdev_get_queue (bdev)); +} +static inline unsigned queue_logical_block_size (const struct request_queue *q) {int retval =512 ;
Greg Kroah-Hartman
maintainerPATCH 10/136 block: add bdev_max_segments() helper
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
commit 65ea1b66482f415d51cd46515b02477257330339 upstream
Add bdev_max_segments() like other queue parameters.
--- include/linux/blkdev.h | 5 +++++ 1 file changed, 5 insertions(+)
include/linux/blkdev.h +5 -0
@@ -1393,6 +1393,11 @@ bdev_max_zone_append_sectors(struct blocreturn queue_max_zone_append_sectors (bdev_get_queue (bdev)); } +static inline unsigned int bdev_max_segments (struct block_device *bdev) +{ +return queue_max_segments (bdev_get_queue (bdev)); +} +static inline unsigned queue_logical_block_size (const struct request_queue *q) {int retval =512 ;
Greg Kroah-Hartman
maintainerPATCH 11/136 btrfs: zoned: revive max_zone_append_bytes
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
commit c2ae7b772ef4e86c5ddf3fd47bf59045ae96a414 upstream
This patch is basically a revert of commit 5a80d1c6a270 ("btrfs: zoned:
remove max_zone_append_size logic"), but without unnecessary ASSERT and check. The max_zone_append_size will be used as a hint to estimate the number of extents to cover delalloc/writeback region in the later commits.
The size of a ZONE APPEND bio is also limited by queue_max_segments(), so this commit considers it to calculate max_zone_append_size. Technically, a bio can be larger than queue_max_segments() * PAGE_SIZE if the pages are contiguous. But, it is safe to consider "queue_max_segments() * PAGE_SIZE" as an upper limit of an extent size to calculate the number of extents needed to write data.
--- fs/btrfs/ctree.h | 2 ++ fs/btrfs/zoned.c | 17 +++++++++++++++++ fs/btrfs/zoned.h | 1 + 3 files changed, 20 insertions(+)
fs/btrfs/ctree.h +2 -0
@@ -1017,6 +1017,8 @@ struct btrfs_fs_info {u64 zoned; }; +/* Max size to emit ZONE_APPEND write command */ +u64 max_zone_append_size;struct mutex zoned_meta_io_lock;spinlock_t treelog_bg_lock;u64 treelog_bg;
fs/btrfs/zoned.c +17 -0
@@ -386,6 +386,16 @@ int btrfs_get_dev_zone_info(struct btrfs nr_sectors =bdev_nr_sectors (bdev); zone_info->zone_size_shift =ilog2 (zone_info->zone_size); zone_info->nr_zones = nr_sectors >>ilog2 (zone_sectors); +/* +* We limit max_zone_append_size also by max_segments * +* PAGE_SIZE. Technically, we can have multiple pages per segment. But, +* since btrfs adds the pages one by one to a bio, and btrfs cannot +* increase the metadata reservation even if it increases the number of +* extents, it is safe to stick with the limit. +*/ + zone_info->max_zone_append_size = +min_t (u64, (u64 )bdev_max_zone_append_sectors (bdev) <<SECTOR_SHIFT , + (u64 )bdev_max_segments (bdev) <<PAGE_SHIFT );if (!IS_ALIGNED (nr_sectors, zone_sectors)) zone_info->nr_zones++;
@@ -570,6 +580,7 @@ int btrfs_check_zoned_mode(struct btrfs_u64 zoned_devices =0 ;u64 nr_devices =0 ;u64 zone_size =0 ; +u64 max_zone_append_size =0 ;const bool incompat_zoned =btrfs_fs_incompat (fs_info,ZONED );int ret =0 ;
@@ -605,6 +616,11 @@ int btrfs_check_zoned_mode(struct btrfs_ ret = -EINVAL ; goto out; } +if (!max_zone_append_size || + (zone_info->max_zone_append_size && + zone_info->max_zone_append_size < max_zone_append_size)) + max_zone_append_size = + zone_info->max_zone_append_size; } nr_devices++; }
@@ -654,6 +670,7 @@ int btrfs_check_zoned_mode(struct btrfs_ } fs_info->zone_size = zone_size; + fs_info->max_zone_append_size = max_zone_append_size; fs_info->fs_devices->chunk_alloc_policy =BTRFS_CHUNK_ALLOC_ZONED ;/*
fs/btrfs/zoned.h +1 -0
@@ -23,6 +23,7 @@ struct btrfs_zoned_device_info {*/ u64 zone_size;u8 zone_size_shift; +u64 max_zone_append_size;u32 nr_zones;unsigned long *seq_zones;unsigned long *empty_zones;
Greg Kroah-Hartman
maintainerPATCH 12/136 btrfs: replace BTRFS_MAX_EXTENT_SIZE with fs_info->max_extent_size
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
commit f7b12a62f008a3041f42f2426983e59a6a0a3c59 upstream
On zoned filesystem, data write out is limited by max_zone_append_size, and a large ordered extent is split according the size of a bio. OTOH, the number of extents to be written is calculated using BTRFS_MAX_EXTENT_SIZE, and that estimated number is used to reserve the metadata bytes to update and/or create the metadata items.
The metadata reservation is done at e.g, btrfs_buffered_write() and then released according to the estimation changes. Thus, if the number of extent increases massively, the reserved metadata can run out.
The increase of the number of extents easily occurs on zoned filesystem if BTRFS_MAX_EXTENT_SIZE > max_zone_append_size. And, it causes the following warning on a small RAM environment with disabling metadata over-commit (in the following patch).
[75721.498492] ------------[ cut here ]------------ [75721.505624] BTRFS: block rsv 1 returned -28 [75721.512230] WARNING: CPU: 24 PID: 2327559 at fs/btrfs/block-rsv.c:537 btrfs_use_block_rsv+0x560/0x760 [btrfs] [75721.581854] CPU: 24 PID: 2327559 Comm: kworker/u64:10 Kdump: loaded Tainted: G W 5.18.0-rc2-BTRFS-ZNS+ #109 [75721.597200] Hardware name: Supermicro Super Server/H12SSL-NT, BIOS 2.0 02/22/2021 [75721.607310] Workqueue: btrfs-endio-write btrfs_work_helper [btrfs] [75721.616209] RIP: 0010:btrfs_use_block_rsv+0x560/0x760 [btrfs] [75721.646649] RSP: 0018:ffffc9000fbdf3e0 EFLAGS: 00010286 [75721.654126] RAX: 0000000000000000 RBX: 0000000000004000 RCX: 0000000000000000 [75721.663524] RDX: 0000000000000004 RSI: 0000000000000008 RDI: fffff52001f7be6e [75721.672921] RBP: ffffc9000fbdf420 R08: 0000000000000001 R09: ffff889f8d1fc6c7 [75721.682493] R10: ffffed13f1a3f8d8 R11: 0000000000000001 R12: ffff88980a3c0e28 [75721.692284] R13: ffff889b66590000 R14: ffff88980a3c0e40 R15: ffff88980a3c0e8a [75721.701878] FS: 0000000000000000(0000) GS:ffff889f8d000000(0000) knlGS:0000000000000000 [75721.712601] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [75721.720726] CR2: 000055d12e05c018 CR3: 0000800193594000 CR4: 0000000000350ee0 [75721.730499] Call Trace: [75721.735166] <TASK> [75721.739886] btrfs_alloc_tree_block+0x1e1/0x1100 [btrfs] [75721.747545] ? btrfs_alloc_logged_file_extent+0x550/0x550 [btrfs] [75721.756145] ? btrfs_get_32+0xea/0x2d0 [btrfs] [75721.762852] ? btrfs_get_32+0xea/0x2d0 [btrfs] [75721.769520] ? push_leaf_left+0x420/0x620 [btrfs] [75721.776431] ? memcpy+0x4e/0x60 [75721.781931] split_leaf+0x433/0x12d0 [btrfs] [75721.788392] ? btrfs_get_token_32+0x580/0x580 [btrfs] [75721.795636] ? push_for_double_split.isra.0+0x420/0x420 [btrfs] [75721.803759] ? leaf_space_used+0x15d/0x1a0 [btrfs] [75721.811156] btrfs_search_slot+0x1bc3/0x2790 [btrfs] [75721.818300] ? lock_downgrade+0x7c0/0x7c0 [75721.824411] ? free_extent_buffer.part.0+0x107/0x200 [btrfs] [75721.832456] ? split_leaf+0x12d0/0x12d0 [btrfs] [75721.839149] ? free_extent_buffer.part.0+0x14f/0x200 [btrfs] [75721.846945] ? free_extent_buffer+0x13/0x20 [btrfs] [75721.853960] ? btrfs_release_path+0x4b/0x190 [btrfs] [75721.861429] btrfs_csum_file_blocks+0x85c/0x1500 [btrfs] [75721.869313] ? rcu_read_lock_sched_held+0x16/0x80 [75721.876085] ? lock_release+0x552/0xf80 [75721.881957] ? btrfs_del_csums+0x8c0/0x8c0 [btrfs] [75721.888886] ? __kasan_check_write+0x14/0x20 [75721.895152] ? do_raw_read_unlock+0x44/0x80 [75721.901323] ? _raw_write_lock_irq+0x60/0x80 [75721.907983] ? btrfs_global_root+0xb9/0xe0 [btrfs] [75721.915166] ? btrfs_csum_root+0x12b/0x180 [btrfs] [75721.921918] ? btrfs_get_global_root+0x820/0x820 [btrfs] [75721.929166] ? _raw_write_unlock+0x23/0x40 [75721.935116] ? unpin_extent_cache+0x1e3/0x390 [btrfs] [75721.942041] btrfs_finish_ordered_io.isra.0+0xa0c/0x1dc0 [btrfs] [75721.949906] ? try_to_wake_up+0x30/0x14a0 [75721.955700] ? btrfs_unlink_subvol+0xda0/0xda0 [btrfs] [75721.962661] ? rcu_read_lock_sched_held+0x16/0x80 [75721.969111] ? lock_acquire+0x41b/0x4c0 [75721.974982] finish_ordered_fn+0x15/0x20 [btrfs] [75721.981639] btrfs_work_helper+0x1af/0xa80 [btrfs] [75721.988184] ? _raw_spin_unlock_irq+0x28/0x50 [75721.994643] process_one_work+0x815/0x1460 [75722.000444] ? pwq_dec_nr_in_flight+0x250/0x250 [75722.006643] ? do_raw_spin_trylock+0xbb/0x190 [75722.013086] worker_thread+0x59a/0xeb0 [75722.018511] kthread+0x2ac/0x360 [75722.023428] ? process_one_work+0x1460/0x1460 [75722.029431] ? kthread_complete_and_exit+0x30/0x30 [75722.036044] ret_from_fork+0x22/0x30 [75722.041255] </TASK> [75722.045047] irq event stamp: 0 [75722.049703] hardirqs last enabled at (0): [<0000000000000000>] 0x0 [75722.057610] hardirqs last disabled at (0): [<ffffffff8118a94a>] copy_process+0x1c1a/0x66b0 [75722.067533] softirqs last enabled at (0): [<ffffffff8118a989>] copy_process+0x1c59/0x66b0 [75722.077423] softirqs last disabled at (0): [<0000000000000000>] 0x0 [75722.085335] ---[ end trace 0000000000000000 ]---
To fix the estimation, we need to introduce fs_info->max_extent_size to replace BTRFS_MAX_EXTENT_SIZE, which allow setting the different size for regular vs zoned filesystem.
Set fs_info->max_extent_size to BTRFS_MAX_EXTENT_SIZE by default. On zoned filesystem, it is set to fs_info->max_zone_append_size.
--- fs/btrfs/ctree.h | 6 ++++++ fs/btrfs/disk-io.c | 2 ++ fs/btrfs/extent_io.c | 4 +++- fs/btrfs/inode.c | 6 ++++-- fs/btrfs/zoned.c | 5 ++++- 5 files changed, 19 insertions(+), 4 deletions(-)
fs/btrfs/ctree.h +6 -0
@@ -999,6 +999,12 @@ struct btrfs_fs_info {u32 csums_per_leaf;u32 stripesize; +/* +* Maximum size of an extent. BTRFS_MAX_EXTENT_SIZE on regular +* filesystem, on zoned it depends on the device constraints. +*/ +u64 max_extent_size; +/* Block groups and devices containing active swapfiles. */ spinlock_t swapfile_pins_lock;struct rb_root swapfile_pins;
fs/btrfs/disk-io.c +2 -0
@@ -3006,6 +3006,8 @@ void btrfs_init_fs_info(struct btrfs_fs_ fs_info->sectorsize_bits =ilog2 (4096 ); fs_info->stripesize =4096 ; + fs_info->max_extent_size =BTRFS_MAX_EXTENT_SIZE ; +spin_lock_init (&fs_info->swapfile_pins_lock); fs_info->swapfile_pins =RB_ROOT ;
fs/btrfs/extent_io.c +3 -1
@@ -1985,8 +1985,10 @@ noinline_for_stack bool find_lock_delall struct page *locked_page, u64 *start, u64 *end) { + struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);struct extent_io_tree *tree = &BTRFS_I (inode)->io_tree; -u64 max_bytes =BTRFS_MAX_EXTENT_SIZE ; +/* The sanity tests may not set a valid fs_info. */ +u64 max_bytes = fs_info ? fs_info->max_extent_size :BTRFS_MAX_EXTENT_SIZE ;u64 delalloc_start;u64 delalloc_end;bool found;
fs/btrfs/inode.c +4 -2
@@ -2032,6 +2032,7 @@ int btrfs_run_delalloc_range(struct btrfvoid btrfs_split_delalloc_extent (struct inode *inode,struct extent_state *orig,u64 split) { +struct btrfs_fs_info *fs_info =btrfs_sb (inode->i_sb);u64 size;/* not delalloc, ignore it */
@@ -2039,7 +2040,7 @@ void btrfs_split_delalloc_extent(structreturn ; size = orig->end - orig->start +1 ; -if (size >BTRFS_MAX_EXTENT_SIZE ) { +if (size > fs_info->max_extent_size) {u32 num_extents;u64 new_size;
@@ -2068,6 +2069,7 @@ void btrfs_split_delalloc_extent(structvoid btrfs_merge_delalloc_extent (struct inode *inode,struct extent_state *new,struct extent_state *other) { +struct btrfs_fs_info *fs_info =btrfs_sb (inode->i_sb);u64 new_size, old_size;u32 num_extents;
@@ -2081,7 +2083,7 @@ void btrfs_merge_delalloc_extent(struct new_size = other->end - new->start +1 ;/* we're not bigger than the max, unreserve the space and go */ -if (new_size <=BTRFS_MAX_EXTENT_SIZE ) { +if (new_size <= fs_info->max_extent_size) {spin_lock (&BTRFS_I (inode)->lock);btrfs_mod_outstanding_extents (BTRFS_I (inode),-1 );spin_unlock (&BTRFS_I (inode)->lock);
fs/btrfs/zoned.c +4 -1
@@ -670,8 +670,11 @@ int btrfs_check_zoned_mode(struct btrfs_ } fs_info->zone_size = zone_size; - fs_info->max_zone_append_size = max_zone_append_size; + fs_info->max_zone_append_size =ALIGN_DOWN (max_zone_append_size, + fs_info->sectorsize); fs_info->fs_devices->chunk_alloc_policy =BTRFS_CHUNK_ALLOC_ZONED ; +if (fs_info->max_zone_append_size < fs_info->max_extent_size) + fs_info->max_extent_size = fs_info->max_zone_append_size;/* * Check mount options here, because we might change fs_info->zoned
Greg Kroah-Hartman
maintainerPATCH 13/136 btrfs: convert count_max_extents() to use fs_info->max_extent_size
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
commit 7d7672bc5d1038c745716c397d892d21e29de71c upstream
If count_max_extents() uses BTRFS_MAX_EXTENT_SIZE to calculate the number of extents needed, btrfs release the metadata reservation too much on its way to write out the data.
Now that BTRFS_MAX_EXTENT_SIZE is replaced with fs_info->max_extent_size, convert count_max_extents() to use it instead, and fix the calculation of the metadata reservation.
--- fs/btrfs/ctree.h | 21 +++++++++++++-------- fs/btrfs/delalloc-space.c | 6 +++--- fs/btrfs/inode.c | 16 ++++++++-------- 3 files changed, 24 insertions(+), 19 deletions(-)
fs/btrfs/ctree.h +13 -8
@@ -105,14 +105,6 @@ struct btrfs_ref;#define BTRFS_STAT_CURR 0#define BTRFS_STAT_PREV 1 -/* -* Count how many BTRFS_MAX_EXTENT_SIZE cover the @size -*/ -static inline u32 count_max_extents (u64 size) -{ -return div_u64 (size +BTRFS_MAX_EXTENT_SIZE -1 ,BTRFS_MAX_EXTENT_SIZE ); -} -static inline unsigned long btrfs_chunk_item_size (int num_stripes) {BUG_ON (num_stripes ==0 );
@@ -3878,6 +3870,19 @@ static inline bool btrfs_is_zoned(constreturn fs_info->zoned !=0 ; } +/* +* Count how many fs_info->max_extent_size cover the @size +*/ +static inline u32 count_max_extents (struct btrfs_fs_info *fs_info,u64 size) +{ +#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS +if (!fs_info) +return div_u64 (size +BTRFS_MAX_EXTENT_SIZE -1 ,BTRFS_MAX_EXTENT_SIZE ); +#endif + +return div_u64 (size + fs_info->max_extent_size -1 , fs_info->max_extent_size); +} +static inline bool btrfs_is_data_reloc_root (const struct btrfs_root *root) {return root->root_key.objectid ==BTRFS_DATA_RELOC_TREE_OBJECTID ;
fs/btrfs/delalloc-space.c +3 -3
@@ -273,7 +273,7 @@ static void calc_inode_reservations(stru u64 num_bytes, u64 *meta_reserve, u64 *qgroup_reserve) { - u64 nr_extents = count_max_extents(num_bytes); + u64 nr_extents = count_max_extents(fs_info, num_bytes);u64 csum_leaves =btrfs_csum_bytes_to_leaves (fs_info, num_bytes);u64 inode_update =btrfs_calc_metadata_size (fs_info,1 );
@@ -347,7 +347,7 @@ int btrfs_delalloc_reserve_metadata(stru* needs to free the reservation we just made. */ spin_lock (&inode->lock); - nr_extents =count_max_extents (num_bytes); + nr_extents =count_max_extents (fs_info, num_bytes);btrfs_mod_outstanding_extents (inode, nr_extents); inode->csum_bytes += num_bytes;btrfs_calculate_inode_block_rsv_size (fs_info, inode);
@@ -410,7 +410,7 @@ void btrfs_delalloc_release_extents(struunsigned num_extents;spin_lock (&inode->lock); - num_extents =count_max_extents (num_bytes); + num_extents =count_max_extents (fs_info, num_bytes);btrfs_mod_outstanding_extents (inode, -num_extents);btrfs_calculate_inode_block_rsv_size (fs_info, inode);spin_unlock (&inode->lock);
fs/btrfs/inode.c +8 -8
@@ -2049,10 +2049,10 @@ void btrfs_split_delalloc_extent(struct* applies here, just in reverse. */ new_size = orig->end - split +1 ; - num_extents =count_max_extents (new_size); + num_extents =count_max_extents (fs_info, new_size); new_size = split - orig->start; - num_extents +=count_max_extents (new_size); -if (count_max_extents (size) >= num_extents) + num_extents +=count_max_extents (fs_info, new_size); +if (count_max_extents (fs_info, size) >= num_extents)return ; }
@@ -2109,10 +2109,10 @@ void btrfs_merge_delalloc_extent(struct* this case. */ old_size = other->end - other->start +1 ; - num_extents =count_max_extents (old_size); + num_extents =count_max_extents (fs_info, old_size); old_size = new->end - new->start +1 ; - num_extents +=count_max_extents (old_size); -if (count_max_extents (new_size) >= num_extents) + num_extents +=count_max_extents (fs_info, old_size); +if (count_max_extents (fs_info, new_size) >= num_extents)return ;spin_lock (&BTRFS_I (inode)->lock);
@@ -2191,7 +2191,7 @@ void btrfs_set_delalloc_extent(struct inif (!(state->state &EXTENT_DELALLOC ) && (*bits &EXTENT_DELALLOC )) {struct btrfs_root *root =BTRFS_I (inode)->root;u64 len = state->end +1 - state->start; -u32 num_extents =count_max_extents (len); +u32 num_extents =count_max_extents (fs_info, len);bool do_list = !btrfs_is_free_space_inode (BTRFS_I (inode));spin_lock (&BTRFS_I (inode)->lock);
@@ -2233,7 +2233,7 @@ void btrfs_clear_delalloc_extent(structstruct btrfs_inode *inode =BTRFS_I (vfs_inode);struct btrfs_fs_info *fs_info =btrfs_sb (vfs_inode->i_sb);u64 len = state->end +1 - state->start; -u32 num_extents =count_max_extents (len); +u32 num_extents =count_max_extents (fs_info, len);if ((state->state &EXTENT_DEFRAG ) && (*bits &EXTENT_DEFRAG )) {spin_lock (&inode->lock);
Greg Kroah-Hartman
maintainerPATCH 14/136 Input: i8042 - move __initconst to fix code styling warning
In reply to Greg Kroah-HartmanFrom: Werner Sembach <[email protected]>
[ Upstream commit 95a9916c909f0b1d95e24b4232b4bc38ff755415 ]
Move __intconst from before i8042_dmi_laptop_table[] to after it for consistent code styling.
--- drivers/input/serio/i8042-x86ia64io.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/serio/i8042-x86ia64io.h +1 -1
@@ -791,7 +791,7 @@ static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { { } }; -static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = { +static const struct dmi_system_id i8042_dmi_laptop_table[]__initconst = { { .matches = {DMI_MATCH (DMI_CHASSIS_TYPE ,"8" ),/* Portable */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/136 Input: i8042 - merge quirk tables
In reply to Greg Kroah-HartmanFrom: Werner Sembach <[email protected]>
[ Upstream commit ff946268a0813c35b790dfbe07c3bfaa7bfb869c ]
Merge i8042 quirk tables to reduce code duplication for devices that need more than one quirk. Before every quirk had its own table with devices needing that quirk. If a new quirk needed to be added a new table had to be created. When a device needed multiple quirks, it appeared in multiple tables. Now only one table called i8042_dmi_quirk_table exists. In it every device has one entry and required quirks are coded in the .driver_data field of the struct dmi_system_id used by this table. Multiple quirks for one device can be applied by bitwise-or of the new SERIO_QUIRK_* defines.
Also align quirkable options with command line parameters and make vendor wide quirks per device overwriteable on a per device basis. The first match is honored while following matches are ignored. So when a vendor wide quirk is defined in the table, a device can inserted before and therefore ignoring the vendor wide define.
--- drivers/input/serio/i8042-x86ia64io.h | 1100 +++++++++++++------------ 1 file changed, 595 insertions(+), 505 deletions(-)
drivers/input/serio/i8042-x86ia64io.h +595 -505
@@ -67,654 +67,735 @@ static inline void i8042_write_command(int val)#include <linux/dmi.h> -static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { +#define SERIO_QUIRK_NOKBD BIT(0) +#define SERIO_QUIRK_NOAUX BIT(1) +#define SERIO_QUIRK_NOMUX BIT(2) +#define SERIO_QUIRK_FORCEMUX BIT(3) +#define SERIO_QUIRK_UNLOCK BIT(4) +#define SERIO_QUIRK_PROBE_DEFER BIT(5) +#define SERIO_QUIRK_RESET_ALWAYS BIT(6) +#define SERIO_QUIRK_RESET_NEVER BIT(7) +#define SERIO_QUIRK_DIECT BIT(8) +#define SERIO_QUIRK_DUMBKBD BIT(9) +#define SERIO_QUIRK_NOLOOP BIT(10) +#define SERIO_QUIRK_NOTIMEOUT BIT(11) +#define SERIO_QUIRK_KBDRESET BIT(12) +#define SERIO_QUIRK_DRITEK BIT(13) +#define SERIO_QUIRK_NOPNP BIT(14) + +/* Quirk table for different mainboards. Options similar or identical to i8042 +* module parameters. +* ORDERING IS IMPORTANT! The first match will be apllied and the rest ignored. +* This allows entries to overwrite vendor wide quirks on a per device basis. +* Where this is irrelevant, entries are sorted case sensitive by DMI_SYS_VENDOR +* and/or DMI_BOARD_VENDOR to make it easier to avoid dublicate entries. +*/ +static const struct dmi_system_id i8042_dmi_quirk_table[]__initconst = { { -/* -* Arima-Rioworks HDAMB - -* AUX LOOP command does not raise AUX IRQ -*/ .matches = { -DMI_MATCH (DMI_BOARD_VENDOR ,"RIOWORKS" ), -DMI_MATCH (DMI_BOARD_NAME ,"HDAMB" ), -DMI_MATCH (DMI_BOARD_VERSION ,"Rev E" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ALIENWARE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Sentia" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* ASUS G1S */ .matches = { -DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK Computer Inc." ), -DMI_MATCH (DMI_BOARD_NAME ,"G1S" ), -DMI_MATCH (DMI_BOARD_VERSION ,"1.0" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"X750LN" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */ +/* Asus X450LCP */ .matches = { -DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK Computer INC." ), -DMI_MATCH (DMI_BOARD_NAME ,"P/I-P65UP5" ), -DMI_MATCH (DMI_BOARD_VERSION ,"REV 2.X" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"X450LCP" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_NEVER ) }, { +/* ASUS ZenBook UX425UA */ .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"X750LN" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ZenBook UX425UA" ), }, + .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER |SERIO_QUIRK_RESET_NEVER ) }, { +/* ASUS ZenBook UM325UA */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Compaq" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ProLiant" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"8500" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ZenBook UX325UA_UM325UA" ), }, + .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER |SERIO_QUIRK_RESET_NEVER ) }, +/* +* On some Asus laptops, just running self tests cause problems. +*/ { .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Compaq" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ProLiant" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"DL760" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"10" ),/* Notebook */ }, + .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER ) }, { -/* Dell Embedded Box PC 3000 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Embedded Box PC 3000" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"31" ),/* Convertible Notebook */ }, + .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER ) }, { -/* OQO Model 01 */ +/* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"OQO" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ZEPTO" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"00" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK Computer INC." ), +DMI_MATCH (DMI_BOARD_NAME ,"P/I-P65UP5" ), +DMI_MATCH (DMI_BOARD_VERSION ,"REV 2.X" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* ULI EV4873 - AUX LOOP does not work properly */ +/* ASUS G1S */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ULI" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"EV4873" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"5a" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK Computer Inc." ), +DMI_MATCH (DMI_BOARD_NAME ,"G1S" ), +DMI_MATCH (DMI_BOARD_VERSION ,"1.0" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Microsoft Virtual Machine */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Microsoft Corporation" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Virtual Machine" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"VS2005R2" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 1360" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Medion MAM 2070 */ +/* Acer Aspire 5710 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"MAM 2070" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"5a" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5710" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Medion Akoya E7225 */ +/* Acer Aspire 7738 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Medion" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Akoya E7225" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"1.0" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 7738" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Blue FB5601 */ +/* Acer Aspire 5536 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"blue" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"FB5601" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"M606" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5536" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"0100" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Gigabyte M912 */ +/* +* Acer Aspire 5738z +* Touchpad stops working in mux mode when dis- + re-enabled +* with the touchpad enable/disable toggle hotkey +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"M912" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"01" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5738" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Gigabyte M1022M netbook */ +/* Acer Aspire One 150 */ .matches = { -DMI_MATCH (DMI_BOARD_VENDOR ,"Gigabyte Technology Co.,Ltd." ), -DMI_MATCH (DMI_BOARD_NAME ,"M1022E" ), -DMI_MATCH (DMI_BOARD_VERSION ,"1.02" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"AOA150" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Gigabyte Spring Peak - defines wrong chassis type */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Spring Peak" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A114-31" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Gigabyte T1005 - defines wrong chassis type ("Other") */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"T1005" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A314-31" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"T1005M/P" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A315-31" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion dv9700" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"Rev 1" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-132" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"PEGATRON CORPORATION" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"C15B" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-332" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ByteSpeed LLC" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ByteSpeed Laptop C15B" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-432" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, - { } -}; - -/* -* Some Fujitsu notebooks are having trouble with touchpads if -* active multiplexing mode is activated. Luckily they don't have -* external PS/2 ports so we can safely disable it. -* ... apparently some Toshibas don't like MUX mode either and -* die horrible death on reboot. -*/ -static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { { -/* Fujitsu Lifebook P7010/P7010D */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"P7010" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate Spin B118-RN" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, +/* +* Some Wistron based laptops need us to explicitly enable the 'Dritek +* keyboard extension' to make their extra keys start generating scancodes. +* Originally, this was just confined to older laptops, but a few Acer laptops +* have turned up in 2007 that also need this again. +*/ { -/* Fujitsu Lifebook P7010 */ +/* Acer Aspire 5100 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"0000000000" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5100" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu Lifebook P5020D */ +/* Acer Aspire 5610 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook P Series" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5610" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu Lifebook S2000 */ +/* Acer Aspire 5630 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook S Series" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5630" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu Lifebook S6230 */ +/* Acer Aspire 5650 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook S6230" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5650" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu Lifebook T725 laptop */ +/* Acer Aspire 5680 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK T725" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5680" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu Lifebook U745 */ +/* Acer Aspire 5720 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK U745" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5720" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu T70H */ +/* Acer Aspire 9110 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"FMVLT70H" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 9110" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu-Siemens Lifebook T3010 */ +/* Acer TravelMate 660 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK T3010" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 660" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu-Siemens Lifebook E4010 */ +/* Acer TravelMate 2490 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK E4010" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 2490" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu-Siemens Amilo Pro 2010 */ +/* Acer TravelMate 4280 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"AMILO Pro V2010" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 4280" ), }, + .driver_data = (void *)(SERIO_QUIRK_DRITEK ) }, { -/* Fujitsu-Siemens Amilo Pro 2030 */ +/* Amoi M636/A737 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"AMILO PRO V2030" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Amoi Electronics CO.,LTD." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"M636/A737 platform" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* -* No data is coming from the touchscreen unless KBC -* is in legacy mode. -*/ -/* Panasonic CF-29 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Matsushita" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"CF-29" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ByteSpeed LLC" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ByteSpeed Laptop C15B" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* -* HP Pavilion DV4017EA - -* errors on MUX ports are reported without raising AUXDATA -* causing "spurious NAK" messages. -*/ +/* Compal HEL80I */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Pavilion dv4000 (EA032EA#ABF)" ), +DMI_MATCH (DMI_SYS_VENDOR ,"COMPAL" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"HEL80I" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* -* HP Pavilion ZT1000 - -* like DV4017EA does not raise AUXERR for errors on MUX ports. -*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion Notebook PC" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"HP Pavilion Notebook ZT1000" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Compaq" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ProLiant" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"8500" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* -* HP Pavilion DV4270ca - -* like DV4017EA does not raise AUXERR for errors on MUX ports. -*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Pavilion dv4000 (EH476UA#ABL)" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Compaq" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ProLiant" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"DL760" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { +/* Advent 4211 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Satellite P10" ), +DMI_MATCH (DMI_SYS_VENDOR ,"DIXONSXP" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Advent 4211" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { +/* Dell Embedded Box PC 3000 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"EQUIUM A110" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Embedded Box PC 3000" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { +/* Dell XPS M1530 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"SATELLITE C850D" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"XPS M1530" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* Dell Vostro 1510 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ALIENWARE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Sentia" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro1510" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Sharp Actius MM20 */ +/* Dell Vostro V13 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"SHARP" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"PC-MM20 Series" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro V13" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_NOTIMEOUT ) }, { -/* Sony Vaio FS-115b */ +/* Dell Vostro 1320 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"VGN-FS115B" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1320" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* -* Sony Vaio FZ-240E - -* reset and GET ID commands issued via KBD port are -* sometimes being delivered to AUX3. -*/ +/* Dell Vostro 1520 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"VGN-FZ240E" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1520" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* -* Most (all?) VAIOs do not have external PS/2 ports nor -* they implement active multiplexing properly, and -* MUX discovery usually messes up keyboard/touchpad. -*/ +/* Dell Vostro 1720 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), -DMI_MATCH (DMI_BOARD_NAME ,"VAIO" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1720" ), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Amoi M636/A737 */ +/* Entroware Proteus */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Amoi Electronics CO.,LTD." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"M636/A737 platform" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Entroware" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Proteus" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"EL07R4" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS ) }, +/* +* Some Fujitsu notebooks are having trouble with touchpads if +* active multiplexing mode is activated. Luckily they don't have +* external PS/2 ports so we can safely disable it. +* ... apparently some Toshibas don't like MUX mode either and +* die horrible death on reboot. +*/ { -/* Lenovo 3000 n100 */ +/* Fujitsu Lifebook P7010/P7010D */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"076804U" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"P7010" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Lenovo XiaoXin Air 12 */ +/* Fujitsu Lifebook P5020D */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"80UN" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook P Series" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* Fujitsu Lifebook S2000 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 1360" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook S Series" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 5710 */ +/* Fujitsu Lifebook S6230 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5710" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LifeBook S6230" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 7738 */ +/* Fujitsu Lifebook T725 laptop */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 7738" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK T725" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_NOTIMEOUT ) }, { -/* Gericom Bellagio */ +/* Fujitsu Lifebook U745 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Gericom" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"N34AS6" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK U745" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* IBM 2656 */ +/* Fujitsu T70H */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"IBM" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"2656" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"FMVLT70H" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Dell XPS M1530 */ +/* Fujitsu A544 laptop */ +/* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"XPS M1530" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK A544" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT ) }, { -/* Compal HEL80I */ +/* Fujitsu AH544 laptop */ +/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"COMPAL" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"HEL80I" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK AH544" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT ) }, { -/* Dell Vostro 1510 */ +/* Fujitsu U574 laptop */ +/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro1510" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK U574" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT ) }, { -/* Acer Aspire 5536 */ +/* Fujitsu UH554 laptop */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5536" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"0100" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK UH544" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT ) }, { -/* Dell Vostro V13 */ +/* Fujitsu Lifebook P7010 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro V13" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"0000000000" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Newer HP Pavilion dv4 models */ +/* Fujitsu-Siemens Lifebook T3010 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion dv4 Notebook PC" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK T3010" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Asus X450LCP */ +/* Fujitsu-Siemens Lifebook E4010 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"X450LCP" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK E4010" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Avatar AVIU-145A6 */ +/* Fujitsu-Siemens Amilo Pro 2010 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Intel" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"IC4I" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"AMILO Pro V2010" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* TUXEDO BU1406 */ +/* Fujitsu-Siemens Amilo Pro 2030 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"N24_25BU" ), +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"AMILO PRO V2030" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Lenovo LaVie Z */ +/* Gigabyte M912 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"Lenovo LaVie Z" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"M912" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"01" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* -* Acer Aspire 5738z -* Touchpad stops working in mux mode when dis- + re-enabled -* with the touchpad enable/disable toggle hotkey -*/ +/* Gigabyte Spring Peak - defines wrong chassis type */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5738" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Spring Peak" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Entroware Proteus */ +/* Gigabyte T1005 - defines wrong chassis type ("Other") */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Entroware" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Proteus" ), -DMI_MATCH (DMI_PRODUCT_VERSION ,"EL07R4" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"T1005" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, - { } -}; - -static const struct dmi_system_id i8042_dmi_forcemux_table[]__initconst = { { -/* -* Sony Vaio VGN-CS series require MUX or the touch sensor -* buttons will disturb touchpad operation -*/ +/* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"VGN-CS" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"T1005M/P" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, - { } -}; - -/* -* On some Asus laptops, just running self tests cause problems. -*/ -static const struct dmi_system_id i8042_dmi_noselftest_table[] = { +/* +* Some laptops need keyboard reset before probing for the trackpad to get +* it detected, initialised & finally work. +*/ { +/* Gigabyte P35 v2 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_CHASSIS_TYPE ,"10" ),/* Notebook */ - }, - }, { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_CHASSIS_TYPE ,"31" ),/* Convertible Notebook */ +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"P35V2" ), }, + .driver_data = (void *)(SERIO_QUIRK_KBDRESET ) }, - { } -}; -static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { - { -/* MSI Wind U-100 */ + { +/* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"U-100" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"MICRO-STAR INTERNATIONAL CO., LTD" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"X3" ), }, + .driver_data = (void *)(SERIO_QUIRK_KBDRESET ) }, { -/* LG Electronics X110 */ +/* Gigabyte P34 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"X110" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"LG Electronics Inc." ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"P34" ), }, + .driver_data = (void *)(SERIO_QUIRK_KBDRESET ) }, { -/* Acer Aspire One 150 */ +/* Gigabyte P57 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"AOA150" ), +DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"P57" ), }, + .driver_data = (void *)(SERIO_QUIRK_KBDRESET ) }, { +/* Gericom Bellagio */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A114-31" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Gericom" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"N34AS6" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* Gigabyte M1022M netbook */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A314-31" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"Gigabyte Technology Co.,Ltd." ), +DMI_MATCH (DMI_BOARD_NAME ,"M1022E" ), +DMI_MATCH (DMI_BOARD_VERSION ,"1.02" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire A315-31" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion dv9700" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"Rev 1" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { +/* +* HP Pavilion DV4017EA - +* errors on MUX ports are reported without raising AUXDATA +* causing "spurious NAK" messages. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-132" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Pavilion dv4000 (EA032EA#ABF)" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* +* HP Pavilion ZT1000 - +* like DV4017EA does not raise AUXERR for errors on MUX ports. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-332" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion Notebook PC" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"HP Pavilion Notebook ZT1000" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* +* HP Pavilion DV4270ca - +* like DV4017EA does not raise AUXERR for errors on MUX ports. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire ES1-432" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Pavilion dv4000 (EH476UA#ABL)" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* Newer HP Pavilion dv4 models */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate Spin B118-RN" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion dv4 Notebook PC" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_NOTIMEOUT ) }, { -/* Advent 4211 */ +/* IBM 2656 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"DIXONSXP" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Advent 4211" ), +DMI_MATCH (DMI_SYS_VENDOR ,"IBM" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"2656" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Medion Akoya Mini E1210 */ +/* Avatar AVIU-145A6 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"MEDION" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"E1210" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Intel" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"IC4I" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Medion Akoya E1222 */ +/* Intel MBO Desktop D845PESV */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"MEDION" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"E122X" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"Intel Corporation" ), +DMI_MATCH (DMI_BOARD_NAME ,"D845PESV" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOPNP ) }, { -/* Mivvy M310 */ +/* +* Intel NUC D54250WYK - does not have i8042 controller but +* declares PS/2 devices in DSDT. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"VIOOO" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"N10" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"Intel Corporation" ), +DMI_MATCH (DMI_BOARD_NAME ,"D54250WYK" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOPNP ) }, { -/* Dell Vostro 1320 */ +/* Lenovo 3000 n100 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1320" ), +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"076804U" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Dell Vostro 1520 */ +/* Lenovo XiaoXin Air 12 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1520" ), +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"80UN" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Dell Vostro 1720 */ +/* Lenovo LaVie Z */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1720" ), +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"Lenovo LaVie Z" ), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, {/* Lenovo Ideapad U455 */
@@ -722,6 +803,7 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), DMI_MATCH(DMI_PRODUCT_NAME, "20046"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, {/* Lenovo ThinkPad L460 */
@@ -729,13 +811,7 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"), }, - }, - { -/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), - DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), - }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, {/* Lenovo ThinkPad Twist S230u */
@@ -743,275 +819,269 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Entroware Proteus */ +/* LG Electronics X110 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Entroware" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Proteus" ), - DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"), +DMI_MATCH (DMI_BOARD_VENDOR ,"LG Electronics Inc." ), + DMI_MATCH(DMI_BOARD_NAME, "X110"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, - { } -}; - -#ifdef CONFIG_PNP -static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { { -/* Intel MBO Desktop D845PESV */ +/* Medion Akoya Mini E1210 */ .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"D845PESV" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"Intel Corporation" ), +DMI_MATCH (DMI_SYS_VENDOR ,"MEDION" ), + DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* -* Intel NUC D54250WYK - does not have i8042 controller but -* declares PS/2 devices in DSDT. -*/ +/* Medion Akoya E1222 */ .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"D54250WYK" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"Intel Corporation" ), +DMI_MATCH (DMI_SYS_VENDOR ,"MEDION" ), + DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, {/* MSI Wind U-100 */ .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"U-100" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"MICRO-STAR INTERNATIONAL CO., LTD" ), - }, - }, - { -/* Acer Aspire 5 A515 */ - .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"Grumpy_PK" ), -DMI_MATCH (DMI_BOARD_VENDOR ,"PK" ), - }, - }, - { } -}; - -static const struct dmi_system_id i8042_dmi_laptop_table[]__initconst = { - { - .matches = { -DMI_MATCH (DMI_CHASSIS_TYPE ,"8" ),/* Portable */ - }, - }, - { - .matches = { -DMI_MATCH (DMI_CHASSIS_TYPE ,"9" ),/* Laptop */ +DMI_MATCH (DMI_BOARD_VENDOR ,"MICRO-STAR INTERNATIONAL CO., LTD" ), + DMI_MATCH(DMI_BOARD_NAME, "U-100"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS |SERIO_QUIRK_NOPNP ) }, { +/* +* No data is coming from the touchscreen unless KBC +* is in legacy mode. +*/ +/* Panasonic CF-29 */ .matches = { -DMI_MATCH (DMI_CHASSIS_TYPE ,"10" ),/* Notebook */ +DMI_MATCH (DMI_SYS_VENDOR ,"Matsushita" ), + DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { +/* Medion Akoya E7225 */ .matches = { -DMI_MATCH (DMI_CHASSIS_TYPE ,"14" ),/* Sub-Notebook */ +DMI_MATCH (DMI_SYS_VENDOR ,"Medion" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Akoya E7225" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, - { } -}; -#endif - -static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { { -/* Dell Vostro V13 */ +/* Microsoft Virtual Machine */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro V13" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Microsoft Corporation" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Virtual Machine" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Newer HP Pavilion dv4 models */ +/* Medion MAM 2070 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"HP Pavilion dv4 Notebook PC" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"MAM 2070" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Fujitsu A544 laptop */ -/* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ +/* TUXEDO BU1406 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK A544" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), + DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Fujitsu AH544 laptop */ -/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ +/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK AH544" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), + DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, { -/* Fujitsu Lifebook T725 laptop */ +/* OQO Model 01 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK T725" ), +DMI_MATCH (DMI_SYS_VENDOR ,"OQO" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ZEPTO" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "00"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Fujitsu U574 laptop */ -/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK U574" ), +DMI_MATCH (DMI_SYS_VENDOR ,"PEGATRON CORPORATION" ), + DMI_MATCH(DMI_PRODUCT_NAME, "C15B"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Fujitsu UH554 laptop */ +/* Acer Aspire 5 A515 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"LIFEBOOK UH544" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"PK" ), + DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"), }, + .driver_data = (void *)(SERIO_QUIRK_NOPNP ) }, - { } -}; - -/* -* Some Wistron based laptops need us to explicitly enable the 'Dritek -* keyboard extension' to make their extra keys start generating scancodes. -* Originally, this was just confined to older laptops, but a few Acer laptops -* have turned up in 2007 that also need this again. -*/ -static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { { -/* Acer Aspire 5100 */ +/* ULI EV4873 - AUX LOOP does not work properly */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5100" ), +DMI_MATCH (DMI_SYS_VENDOR ,"ULI" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"EV4873" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Acer Aspire 5610 */ +/* +* Arima-Rioworks HDAMB - +* AUX LOOP command does not raise AUX IRQ +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5610" ), +DMI_MATCH (DMI_BOARD_VENDOR ,"RIOWORKS" ), +DMI_MATCH (DMI_BOARD_NAME ,"HDAMB" ), + DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, { -/* Acer Aspire 5630 */ +/* Sharp Actius MM20 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5630" ), +DMI_MATCH (DMI_SYS_VENDOR ,"SHARP" ), + DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 5650 */ +/* +* Sony Vaio FZ-240E - +* reset and GET ID commands issued via KBD port are +* sometimes being delivered to AUX3. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5650" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 5680 */ +/* +* Most (all?) VAIOs do not have external PS/2 ports nor +* they implement active multiplexing properly, and +* MUX discovery usually messes up keyboard/touchpad. +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5680" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), + DMI_MATCH(DMI_BOARD_NAME, "VAIO"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 5720 */ +/* Sony Vaio FS-115b */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 5720" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer Aspire 9110 */ +/* +* Sony Vaio VGN-CS series require MUX or the touch sensor +* buttons will disturb touchpad operation +*/ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Aspire 9110" ), +DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"), }, + .driver_data = (void *)(SERIO_QUIRK_FORCEMUX ) }, { -/* Acer TravelMate 660 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 660" ), +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer TravelMate 2490 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 2490" ), +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, { -/* Acer TravelMate 4280 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"TravelMate 4280" ), +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX ) }, - { } -}; - -/* -* Some laptops need keyboard reset before probing for the trackpad to get -* it detected, initialised & finally work. -*/ -static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { { -/* Gigabyte P35 v2 - Elantech touchpad */ +/* Mivvy M310 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"P35V2" ), +DMI_MATCH (DMI_SYS_VENDOR ,"VIOOO" ), + DMI_MATCH(DMI_PRODUCT_NAME, "N10"), }, + .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) }, - { -/* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ + /* + * Some laptops need keyboard reset before probing for the trackpad to get + * it detected, initialised & finally work. + */ + { +/* Schenker XMG C504 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"X3" ), +DMI_MATCH (DMI_SYS_VENDOR ,"XMG" ), + DMI_MATCH(DMI_PRODUCT_NAME, "C504"), }, + .driver_data = (void *)(SERIO_QUIRK_KBDRESET ) }, { -/* Gigabyte P34 - Elantech touchpad */ +/* Blue FB5601 */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"P34" ), +DMI_MATCH (DMI_SYS_VENDOR ,"blue" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"FB5601" ), + DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), }, + .driver_data = (void *)(SERIO_QUIRK_NOLOOP ) }, + { } +}; + +#ifdef CONFIG_PNP +static const struct dmi_system_id i8042_dmi_laptop_table[]__initconst = { { -/* Gigabyte P57 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"GIGABYTE" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"P57" ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"8" ),/* Portable */ }, }, { -/* Schenker XMG C504 - Elantech touchpad */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"XMG" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"C504" ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"9" ),/* Laptop */ }, }, - { } -}; - -static const struct dmi_system_id i8042_dmi_probe_defer_table[]__initconst = { { -/* ASUS ZenBook UX425UA */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ZenBook UX425UA" ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"10" ),/* Notebook */ }, }, { -/* ASUS ZenBook UM325UA */ .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ZenBook UX325UA_UM325UA" ), +DMI_MATCH (DMI_CHASSIS_TYPE ,"14" ),/* Sub-Notebook */ }, }, { } }; +#endif #endif /* CONFIG_X86 */
@@ -1167,11 +1237,6 @@ static int __init i8042_pnp_init(void)bool pnp_data_busted = false;int err; -#ifdef CONFIG_X86 -if (dmi_check_system (i8042_dmi_nopnp_table)) - i8042_nopnp = true; -#endif -if (i8042_nopnp) {pr_info ("PNP detection disabled\n" );return 0 ;
@@ -1275,6 +1340,59 @@ static inline int i8042_pnp_init(void) { return 0; }static inline void i8042_pnp_exit (void ) { }#endif /* CONFIG_PNP */ + +#ifdef CONFIG_X86 +static void __init i8042_check_quirks (void ) +{ +const struct dmi_system_id *device_quirk_info; +uintptr_t quirks; + + device_quirk_info =dmi_first_match (i8042_dmi_quirk_table); +if (!device_quirk_info) +return ; + + quirks = (uintptr_t )device_quirk_info->driver_data; + +if (quirks &SERIO_QUIRK_NOKBD ) + i8042_nokbd = true; +if (quirks &SERIO_QUIRK_NOAUX ) + i8042_noaux = true; +if (quirks &SERIO_QUIRK_NOMUX ) + i8042_nomux = true; +if (quirks &SERIO_QUIRK_FORCEMUX ) + i8042_nomux = false; +if (quirks &SERIO_QUIRK_UNLOCK ) + i8042_unlock = true; +if (quirks &SERIO_QUIRK_PROBE_DEFER ) + i8042_probe_defer = true; +/* Honor module parameter when value is not default */ +if (i8042_reset ==I8042_RESET_DEFAULT ) { +if (quirks &SERIO_QUIRK_RESET_ALWAYS ) + i8042_reset =I8042_RESET_ALWAYS ; +if (quirks &SERIO_QUIRK_RESET_NEVER ) + i8042_reset =I8042_RESET_NEVER ; + } +if (quirks &SERIO_QUIRK_DIECT ) + i8042_direct = true; +if (quirks &SERIO_QUIRK_DUMBKBD ) + i8042_dumbkbd = true; +if (quirks &SERIO_QUIRK_NOLOOP ) + i8042_noloop = true; +if (quirks &SERIO_QUIRK_NOTIMEOUT ) + i8042_notimeout = true; +if (quirks &SERIO_QUIRK_KBDRESET ) + i8042_kbdreset = true; +if (quirks &SERIO_QUIRK_DRITEK ) + i8042_dritek = true; +#ifdef CONFIG_PNP +if (quirks &SERIO_QUIRK_NOPNP ) + i8042_nopnp = true; +#endif +} +#else +static inline void i8042_check_quirks (void ) {} +#endif +static int __init i8042_platform_init (void ) {int retval;
@@ -1297,45 +1415,17 @@ static int __init i8042_platform_init(void) i8042_kbd_irq =I8042_MAP_IRQ (1 ); i8042_aux_irq =I8042_MAP_IRQ (12 ); - retval =i8042_pnp_init (); -if (retval) -return retval; -#if defined(__ia64__) - i8042_reset =I8042_RESET_ALWAYS ; + i8042_reset =I8042_RESET_ALWAYS ;#endif -#ifdef CONFIG_X86 -/* Honor module parameter when value is not default */ -if (i8042_reset ==I8042_RESET_DEFAULT ) { -if (dmi_check_system (i8042_dmi_reset_table)) - i8042_reset =I8042_RESET_ALWAYS ; - -if (dmi_check_system (i8042_dmi_noselftest_table)) - i8042_reset =I8042_RESET_NEVER ; - } - -if (dmi_check_system (i8042_dmi_noloop_table)) - i8042_noloop = true; - -if (dmi_check_system (i8042_dmi_nomux_table)) - i8042_nomux = true; - -if (dmi_check_system (i8042_dmi_forcemux_table)) - i8042_nomux = false; - -if (dmi_check_system (i8042_dmi_notimeout_table)) - i8042_notimeout = true; - -if (dmi_check_system (i8042_dmi_dritek_table)) - i8042_dritek = true; - -if (dmi_check_system (i8042_dmi_kbdreset_table)) - i8042_kbdreset = true; +i8042_check_quirks (); -if (dmi_check_system (i8042_dmi_probe_defer_table)) - i8042_probe_defer = true; + retval =i8042_pnp_init (); +if (retval) +return retval; +#ifdef CONFIG_X86 /* * A20 was already enabled during early kernel init. But some buggy * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/136 Input: i8042 - add TUXEDO devices to i8042 quirk tables
In reply to Greg Kroah-HartmanFrom: Werner Sembach <[email protected]>
[ Upstream commit a6a87c36165e6791eeaed88025cde270536c3198 ]
A lot of modern Clevo barebones have touchpad and/or keyboard issues after suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of them have an external PS/2 port so this can safely be set for all of them.
I'm not entirely sure if every device listed really needs all four quirks, but after testing and production use. No negative effects could be observed when setting all four.
The list is quite massive as neither the TUXEDO nor the Clevo dmi strings have been very consistent historically. I tried to keep the list as short as possible without risking on missing an affected device.
This is revision 3. The Clevo N150CU barebone is still removed as it might have problems with the fix and needs further investigations. The SchenkerTechnologiesGmbH System-/Board-Vendor string variations are added. This is now based in the quirk table refactor. This now also includes the additional noaux flag for the NS7xMU.
--- drivers/input/serio/i8042-x86ia64io.h | 129 ++++++++++++++++++++++++++ 1 file changed, 129 insertions(+)
drivers/input/serio/i8042-x86ia64io.h +129 -0
@@ -1025,6 +1025,29 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { }, .driver_data = (void *)(SERIO_QUIRK_NOMUX) }, +/* +* A lot of modern Clevo barebones have touchpad and/or keyboard issues +* after suspend fixable with nomux + reset + noloop + nopnp. Luckily, +* none of them have an external PS/2 port so this can safely be set for +* all of them. These two are based on a Clevo design, but have the +* board_name changed. +*/ + { + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"TUXEDO" ), + DMI_MATCH(DMI_BOARD_NAME, "AURA1501"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"TUXEDO" ), + DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, {/* Mivvy M310 */ .matches = {
@@ -1054,6 +1077,112 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { }, .driver_data = (void *)(SERIO_QUIRK_NOLOOP) }, +/* +* A lot of modern Clevo barebones have touchpad and/or keyboard issues +* after suspend fixable with nomux + reset + noloop + nopnp. Luckily, +* none of them have an external PS/2 port so this can safely be set for +* all of them. +* Clevo barebones come with board_vendor and/or system_vendor set to +* either the very generic string "Notebook" and/or a different value +* for each individual reseller. The only somewhat universal way to +* identify them is by board_name. +*/ + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "N140CU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "N141CU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + /* + * At least one modern Clevo barebone has the touchpad connected both + * via PS/2 and i2c interface. This causes a race condition between the + * psmouse and i2c-hid driver. Since the full capability of the touchpad + * is available via the i2c interface and the device has no external + * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid + * this issue. The known affected device is the + * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of + * the two different dmi strings below. NS50MU is not a typo! + */ + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "NS50MU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | + SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | + SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | + SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | + SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "X170SM"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, { } };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/136 Input: i8042 - add additional TUXEDO devices to i8042 quirk tables
In reply to Greg Kroah-HartmanFrom: Werner Sembach <[email protected]>
[ Upstream commit 436d219069628f0f0ed27f606224d4ee02a0ca17 ]
A lot of modern Clevo barebones have touchpad and/or keyboard issues after suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of them have an external PS/2 port so this can safely be set for all of them.
I'm not entirely sure if every device listed really needs all four quirks, but after testing and production use. No negative effects could be observed when setting all four.
--- drivers/input/serio/i8042-x86ia64io.h | 76 ++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 8 deletions(-)
drivers/input/serio/i8042-x86ia64io.h +68 -8
@@ -900,14 +900,6 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { }, .driver_data = (void *)(SERIO_QUIRK_NOMUX) }, - { -/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Notebook" ), - DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), - }, - .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS ) - }, {/* OQO Model 01 */ .matches = {
@@ -1162,6 +1154,74 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) }, + { +/* +* This is only a partial board_name and might be followed by +* another letter or number. DMI_MATCH however does do partial +* matching. +*/ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P65xH"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { +/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { +/* +* This is only a partial board_name and might be followed by +* another letter or number. DMI_MATCH however does do partial +* matching. +*/ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P65_P67H"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { +/* +* This is only a partial board_name and might be followed by +* another letter or number. DMI_MATCH however does do partial +* matching. +*/ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RP"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { +/* +* This is only a partial board_name and might be followed by +* another letter or number. DMI_MATCH however does do partial +* matching. +*/ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RS"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { +/* +* This is only a partial board_name and might be followed by +* another letter or number. DMI_MATCH however does do partial +* matching. +*/ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "P67xRP"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, { .matches = { DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/136 drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist
In reply to Greg Kroah-HartmanFrom: Phil Auld <[email protected]>
[ Upstream commit 7ee951acd31a88f941fd6535fbdee3a1567f1d63 ]
Using bin_attributes with a 0 size causes fstat and friends to return that 0 size. This breaks userspace code that retrieves the size before reading the file. Rather than reverting 75bd50fa841 ("drivers/base/node.c: use bin_attribute to break the size limitation of cpumap ABI") let's put in a size value at compile time.
For cpulist the maximum size is on the order of
NR_CPUS * (ceil(log10(NR_CPUS)) + 1)/2
which for 8192 is 20480 (8192 * 5)/2. In order to get near that you'd need a system with every other CPU on one node. For example: (0,2,4,8, ... ). To simplify the math and support larger NR_CPUS in the future we are using (NR_CPUS * 7)/2. We also set it to a min of PAGE_SIZE to retain the older behavior for smaller NR_CPUS.
The cpumap file the size works out to be NR_CPUS/4 + NR_CPUS/32 - 1 (or NR_CPUS * 9/32 - 1) including the ","s.
Add a set of macros for these values to cpumask.h so they can be used in multiple places. Apply these to the handful of such files in drivers/base/topology.c as well as node.c.
As an example, on an 80 cpu 4-node system (NR_CPUS == 8192):
before:
-r--r--r--. 1 root root 0 Jul 12 14:08 system/node/node0/cpulist -r--r--r--. 1 root root 0 Jul 11 17:25 system/node/node0/cpumap
after:
-r--r--r--. 1 root root 28672 Jul 13 11:32 system/node/node0/cpulist -r--r--r--. 1 root root 4096 Jul 13 11:31 system/node/node0/cpumap
CONFIG_NR_CPUS = 16384
-r--r--r--. 1 root root 57344 Jul 13 14:03 system/node/node0/cpulist -r--r--r--. 1 root root 4607 Jul 13 14:02 system/node/node0/cpumap
The actual number of cpus doesn't matter for the reported size since they are based on NR_CPUS.
--- drivers/base/node.c | 4 ++-- drivers/base/topology.c | 28 ++++++++++++++-------------- include/linux/cpumask.h | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 16 deletions(-)
drivers/base/node.c +2 -2
@@ -45,7 +45,7 @@ static inline ssize_t cpumap_read(struct file *file, struct kobject *kobj,return n; } -static BIN_ATTR_RO(cpumap, 0); +static BIN_ATTR_RO(cpumap, CPUMAP_FILE_MAX_BYTES); static inline ssize_t cpulist_read(struct file *file, struct kobject *kobj, struct bin_attribute *attr, char *buf,
@@ -66,7 +66,7 @@ static inline ssize_t cpulist_read(struct file *file, struct kobject *kobj,return n; } -static BIN_ATTR_RO(cpulist, 0); +static BIN_ATTR_RO(cpulist, CPULIST_FILE_MAX_BYTES);/** * struct node_access_nodes - Access class device to hold user visible
drivers/base/topology.c +14 -14
@@ -52,39 +52,39 @@ define_id_show_func(core_id);static DEVICE_ATTR_RO (core_id);define_siblings_read_func (thread_siblings, sibling_cpumask); -static BIN_ATTR_RO(thread_siblings, 0); -static BIN_ATTR_RO(thread_siblings_list, 0); +static BIN_ATTR_RO(thread_siblings, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(thread_siblings_list, CPULIST_FILE_MAX_BYTES);define_siblings_read_func (core_cpus, sibling_cpumask); -static BIN_ATTR_RO(core_cpus, 0); -static BIN_ATTR_RO(core_cpus_list, 0); +static BIN_ATTR_RO(core_cpus, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(core_cpus_list, CPULIST_FILE_MAX_BYTES);define_siblings_read_func (core_siblings, core_cpumask); -static BIN_ATTR_RO(core_siblings, 0); -static BIN_ATTR_RO(core_siblings_list, 0); +static BIN_ATTR_RO(core_siblings, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(core_siblings_list, CPULIST_FILE_MAX_BYTES);define_siblings_read_func (die_cpus, die_cpumask); -static BIN_ATTR_RO(die_cpus, 0); -static BIN_ATTR_RO(die_cpus_list, 0); +static BIN_ATTR_RO(die_cpus, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(die_cpus_list, CPULIST_FILE_MAX_BYTES);define_siblings_read_func (package_cpus, core_cpumask); -static BIN_ATTR_RO(package_cpus, 0); -static BIN_ATTR_RO(package_cpus_list, 0); +static BIN_ATTR_RO(package_cpus, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(package_cpus_list, CPULIST_FILE_MAX_BYTES);#ifdef CONFIG_SCHED_BOOK define_id_show_func (book_id);static DEVICE_ATTR_RO (book_id);define_siblings_read_func (book_siblings, book_cpumask); -static BIN_ATTR_RO(book_siblings, 0); -static BIN_ATTR_RO(book_siblings_list, 0); +static BIN_ATTR_RO(book_siblings, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(book_siblings_list, CPULIST_FILE_MAX_BYTES);#endif #ifdef CONFIG_SCHED_DRAWER define_id_show_func (drawer_id);static DEVICE_ATTR_RO (drawer_id);define_siblings_read_func (drawer_siblings, drawer_cpumask); -static BIN_ATTR_RO(drawer_siblings, 0); -static BIN_ATTR_RO(drawer_siblings_list, 0); +static BIN_ATTR_RO(drawer_siblings, CPUMAP_FILE_MAX_BYTES); +static BIN_ATTR_RO(drawer_siblings_list, CPULIST_FILE_MAX_BYTES);#endif static struct bin_attribute *bin_attrs[] = {
include/linux/cpumask.h +18 -0
@@ -1045,4 +1045,22 @@ cpumap_print_list_to_buf(char *buf, const struct cpumask *mask, [0] = 1UL \ } } +/* +* Provide a valid theoretical max size for cpumap and cpulist sysfs files +* to avoid breaking userspace which may allocate a buffer based on the size +* reported by e.g. fstat. +* +* for cpumap NR_CPUS * 9/32 - 1 should be an exact length. +* +* For cpulist 7 is (ceil(log10(NR_CPUS)) + 1) allowing for NR_CPUS to be up +* to 2 orders of magnitude larger than 8192. And then we divide by 2 to +* cover a worst-case of every other cpu being on one of two nodes for a +* very large NR_CPUS. +* +* Use PAGE_SIZE as a minimum for smaller configurations. +*/ +#define CPUMAP_FILE_MAX_BYTES ((((NR_CPUS * 9)/32 - 1) > PAGE_SIZE) \ + ? (NR_CPUS * 9)/32 - 1 : PAGE_SIZE) +#define CPULIST_FILE_MAX_BYTES (((NR_CPUS * 7)/2 > PAGE_SIZE) ? (NR_CPUS * 7)/2 : PAGE_SIZE) +#endif /* __LINUX_CPUMASK_H */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/136 scsi: qla2xxx: Fix response queue handler reading stale packets
In reply to Greg Kroah-HartmanFrom: Arun Easi <[email protected]>
[ Upstream commit b1f707146923335849fb70237eec27d4d1ae7d62 ]
On some platforms, the current logic of relying on finding new packet solely based on signature pattern can lead to driver reading stale packets. Though this is a bug in those platforms, reduce such exposures by limiting reading packets until the IN pointer.
Two module parameters are introduced:
ql2xrspq_follow_inptr:
When set, on newer adapters that has queue pointer shadowing, look for response packets only until response queue in pointer.
When reset, response packets are read based on a signature pattern logic (old way).
ql2xrspq_follow_inptr_legacy:
Like ql2xrspq_follow_inptr, but for those adapters where there is no queue pointer shadowing.
--- drivers/scsi/qla2xxx/qla_gbl.h | 2 ++ drivers/scsi/qla2xxx/qla_isr.c | 24 +++++++++++++++++++++++- drivers/scsi/qla2xxx/qla_os.c | 10 ++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_gbl.h +2 -0
@@ -192,6 +192,8 @@ extern int ql2xfulldump_on_mpifail;extern int ql2xsecenable;extern int ql2xenforce_iocb_limit;extern int ql2xabts_wait_nvme; +extern int ql2xrspq_follow_inptr; +extern int ql2xrspq_follow_inptr_legacy;extern int qla2x00_loop_reset (scsi_qla_host_t *);extern void qla2x00_abort_all_cmds (scsi_qla_host_t *,int );
drivers/scsi/qla2xxx/qla_isr.c +23 -1
@@ -3767,6 +3767,8 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,struct qla_hw_data *ha = vha->hw;struct purex_entry_24xx *purex_entry;struct purex_item *pure_item; +u16 rsp_in =0 ; +int follow_inptr, is_shadow_hba;if (!ha->flags.fw_started)return ;
@@ -3776,7 +3778,25 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,qla_cpu_update (rsp->qpair,smp_processor_id ()); } -while (rsp->ring_ptr->signature !=RESPONSE_PROCESSED ) { +#define __update_rsp_in (_update, _is_shadow_hba, _rsp, _rsp_in) \ + do { \ + if (_update) { \ + _rsp_in = _is_shadow_hba ? *(_rsp)->in_ptr : \ + rd_reg_dword_relaxed((_rsp)->rsp_q_in); \ + } \ + } while (0) + + is_shadow_hba =IS_SHADOW_REG_CAPABLE (ha); + follow_inptr = is_shadow_hba ? ql2xrspq_follow_inptr : + ql2xrspq_follow_inptr_legacy; + +__update_rsp_in (follow_inptr, is_shadow_hba, rsp, rsp_in); + +while ((likely (follow_inptr && + rsp->ring_index != rsp_in && + rsp->ring_ptr->signature !=RESPONSE_PROCESSED )) || + (!follow_inptr && + rsp->ring_ptr->signature !=RESPONSE_PROCESSED )) { pkt = (struct sts_entry_24xx *)rsp->ring_ptr; rsp->ring_index++;
@@ -3889,6 +3909,8 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, } pure_item =qla27xx_copy_fpin_pkt (vha, (void **)&pkt, &rsp); +__update_rsp_in (follow_inptr, is_shadow_hba, + rsp, rsp_in);if (!pure_item)break ; qla24xx_queue_purex_item(vha, pure_item,
drivers/scsi/qla2xxx/qla_os.c +10 -0
@@ -338,6 +338,16 @@ module_param(ql2xdelay_before_pci_error_handling, uint, 0644);MODULE_PARM_DESC (ql2xdelay_before_pci_error_handling,"Number of seconds delayed before qla begin PCI error self-handling (default: 5).\n" ); +int ql2xrspq_follow_inptr =1 ; +module_param (ql2xrspq_follow_inptr, int,0644 ); +MODULE_PARM_DESC (ql2xrspq_follow_inptr, +"Follow RSP IN pointer for RSP updates for HBAs 27xx and newer (default: 1)." ); + +int ql2xrspq_follow_inptr_legacy =1 ; +module_param (ql2xrspq_follow_inptr_legacy, int,0644 ); +MODULE_PARM_DESC (ql2xrspq_follow_inptr_legacy, +"Follow RSP IN pointer for RSP updates for HBAs older than 27XX. (default: 1)." ); +static void qla2x00_clear_drv_active (struct qla_hw_data *);static void qla2x00_free_device (scsi_qla_host_t *);static int qla2xxx_map_queues (struct Scsi_Host *shost);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/136 scsi: qla2xxx: edif: Fix dropped IKE message
In reply to Greg Kroah-HartmanFrom: Quinn Tran <[email protected]>
[ Upstream commit c019cd656e717349ff22d0c41d6fbfc773f48c52 ]
This patch fixes IKE message being dropped due to error in processing Purex IOCB and Continuation IOCBs.
--- drivers/scsi/qla2xxx/qla_isr.c | 54 +++++++++++++++------------------- 1 file changed, 24 insertions(+), 30 deletions(-)
drivers/scsi/qla2xxx/qla_isr.c +24 -30
@@ -3707,12 +3707,11 @@ void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *vha,* Return: 0 all iocbs has arrived, xx- all iocbs have not arrived. */ static int qla_chk_cont_iocb_avail (struct scsi_qla_host *vha, -struct rsp_que *rsp,response_t *pkt) +struct rsp_que *rsp,response_t *pkt,u32 rsp_q_in) { -int start_pkt_ring_index, end_pkt_ring_index, n_ring_index; -response_t *end_pkt; +int start_pkt_ring_index; +u32 iocb_cnt =0 ;int rc =0 ; -u32 rsp_q_in;if (pkt->entry_count ==1 )return rc;
@@ -3723,34 +3722,18 @@ static int qla_chk_cont_iocb_avail(struct scsi_qla_host *vha,else start_pkt_ring_index = rsp->ring_index -1 ; -if ((start_pkt_ring_index + pkt->entry_count) >= rsp->length) - end_pkt_ring_index = start_pkt_ring_index + pkt->entry_count - - rsp->length -1 ; +if (rsp_q_in < start_pkt_ring_index) +/* q in ptr is wrapped */ + iocb_cnt = rsp->length - start_pkt_ring_index + rsp_q_in;else - end_pkt_ring_index = start_pkt_ring_index + pkt->entry_count -1 ; + iocb_cnt = rsp_q_in - start_pkt_ring_index; - end_pkt = rsp->ring + end_pkt_ring_index; - -/* next pkt = end_pkt + 1 */ - n_ring_index = end_pkt_ring_index +1 ; -if (n_ring_index >= rsp->length) - n_ring_index =0 ; - - rsp_q_in = rsp->qpair->use_shadow_reg ? *rsp->in_ptr : -rd_reg_dword (rsp->rsp_q_in); - -/* rsp_q_in is either wrapped or pointing beyond endpkt */ -if ((rsp_q_in < start_pkt_ring_index && rsp_q_in < n_ring_index) || - rsp_q_in >= n_ring_index) -/* all IOCBs arrived. */ - rc =0 ; -else +if (iocb_cnt < pkt->entry_count) rc = -EIO ; -ql_dbg (ql_dbg_init + ql_dbg_verbose, vha,0x5091 , -"%s - ring %p pkt %p end pkt %p entry count %#x rsp_q_in %d rc %d\n" , - __func__, rsp->ring, pkt, end_pkt, pkt->entry_count, - rsp_q_in, rc); +ql_dbg (ql_dbg_init, vha,0x5091 , +"%s - ring %p pkt %p entry count %d iocb_cnt %d rsp_q_in %d rc %d\n" , + __func__, rsp->ring, pkt, pkt->entry_count, iocb_cnt, rsp_q_in, rc);return rc; }
@@ -3767,7 +3750,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,struct qla_hw_data *ha = vha->hw;struct purex_entry_24xx *purex_entry;struct purex_item *pure_item; -u16 rsp_in =0 ; +u16 rsp_in =0 , cur_ring_index;int follow_inptr, is_shadow_hba;if (!ha->flags.fw_started)
@@ -3798,6 +3781,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, (!follow_inptr && rsp->ring_ptr->signature != RESPONSE_PROCESSED)) { pkt = (struct sts_entry_24xx *)rsp->ring_ptr; + cur_ring_index = rsp->ring_index; rsp->ring_index++;if (rsp->ring_index == rsp->length) {
@@ -3918,7 +3902,17 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,break ;case ELS_AUTH_ELS : -if (qla_chk_cont_iocb_avail (vha, rsp, (response_t *)pkt)) { +if (qla_chk_cont_iocb_avail (vha, rsp, (response_t *)pkt, rsp_in)) { +/* +* ring_ptr and ring_index were +* pre-incremented above. Reset them +* back to current. Wait for next +* interrupt with all IOCBs to arrive +* and re-process. +*/ + rsp->ring_ptr = (response_t *)pkt; + rsp->ring_index = cur_ring_index; +ql_dbg (ql_dbg_init, vha,0x5091 ,"Defer processing ELS opcode %#x...\n" , purex_entry->els_frame_payload[3 ]);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/136 btrfs: put initial index value of a directory in a constant
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 528ee697126fddaff448897c2d649bd756153c79 ]
At btrfs_set_inode_index_count() we refer twice to the number 2 as the initial index value for a directory (when it's empty), with a proper comment explaining the reason for that value. In the next patch I'll have to use that magic value in the directory logging code, so put the value in a #define at btrfs_inode.h, to avoid hardcoding the magic value again at tree-log.c.
--- fs/btrfs/btrfs_inode.h | 12 ++++++++++-- fs/btrfs/inode.c | 10 ++-------- 2 files changed, 12 insertions(+), 10 deletions(-)
fs/btrfs/btrfs_inode.h +10 -2
@@ -13,6 +13,13 @@#include "ordered-data.h" #include "delayed-inode.h" +/* +* Since we search a directory based on f_pos (struct dir_context::pos) we have +* to start at 2 since '.' and '..' have f_pos of 0 and 1 respectively, so +* everybody else has to start at 2 (see btrfs_real_readdir() and dir_emit_dots()). +*/ +#define BTRFS_DIR_START_INDEX 2 +/* * ordered_data_close is set by truncate when a file that used * to have good data has been truncated to zero. When it is set
@@ -164,8 +171,9 @@ struct btrfs_inode {u64 disk_i_size;/* -* if this is a directory then index_cnt is the counter for the index -* number for new files that are created +* If this is a directory then index_cnt is the counter for the index +* number for new files that are created. For an empty directory, this +* must be initialized to BTRFS_DIR_START_INDEX. */ u64 index_cnt;
fs/btrfs/inode.c +2 -8
@@ -6396,14 +6396,8 @@ static int btrfs_set_inode_index_count(struct btrfs_inode *inode) goto out; ret =0 ; -/* -* MAGIC NUMBER EXPLANATION: -* since we search a directory based on f_pos we have to start at 2 -* since '.' and '..' have f_pos of 0 and 1 respectively, so everybody -* else has to start at 2 -*/ if (path->slots[0 ] ==0 ) { - inode->index_cnt =2 ; + inode->index_cnt =BTRFS_DIR_START_INDEX ; goto out; }
@@ -6414,7 +6408,7 @@ static int btrfs_set_inode_index_count(struct btrfs_inode *inode)if (found_key.objectid !=btrfs_ino (inode) || found_key.type !=BTRFS_DIR_INDEX_KEY ) { - inode->index_cnt =2 ; + inode->index_cnt =BTRFS_DIR_START_INDEX ; goto out; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/136 btrfs: pass the dentry to btrfs_log_new_name() instead of the inode
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit d5f5bd546552a94eefd68c42f40f778c40a89d2c ]
In the next patch in the series, there will be the need to access the old name, and its length, of an inode when logging the inode during a rename. So instead of passing the inode to btrfs_log_new_name() pass the dentry, because from the dentry we can get the inode, the name and its length.
This will avoid passing 3 new parameters to btrfs_log_new_name() in the next patch - the name, its length and an index number. This way we end up passing only 1 new parameter, the index number.
--- fs/btrfs/inode.c | 8 ++++---- fs/btrfs/tree-log.c | 19 +++++++++++++++---- fs/btrfs/tree-log.h | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-)
fs/btrfs/inode.c +4 -4
@@ -6952,7 +6952,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, goto fail; }d_instantiate (dentry, inode); -btrfs_log_new_name (trans,BTRFS_I (inode),NULL , parent); +btrfs_log_new_name (trans, old_dentry,NULL , parent); } fail:
@@ -9621,13 +9621,13 @@ static int btrfs_rename_exchange(struct inode *old_dir,BTRFS_I (new_inode)->dir_index = new_idx;if (root_log_pinned) { -btrfs_log_new_name (trans,BTRFS_I (old_inode),BTRFS_I (old_dir), +btrfs_log_new_name (trans, old_dentry,BTRFS_I (old_dir), new_dentry->d_parent);btrfs_end_log_trans (root); root_log_pinned = false; }if (dest_log_pinned) { -btrfs_log_new_name (trans,BTRFS_I (new_inode),BTRFS_I (new_dir), +btrfs_log_new_name (trans, new_dentry,BTRFS_I (new_dir), old_dentry->d_parent);btrfs_end_log_trans (dest); dest_log_pinned = false;
@@ -9908,7 +9908,7 @@ static int btrfs_rename(struct user_namespace *mnt_userns,BTRFS_I (old_inode)->dir_index = index;if (log_pinned) { -btrfs_log_new_name (trans,BTRFS_I (old_inode),BTRFS_I (old_dir), +btrfs_log_new_name (trans, old_dentry,BTRFS_I (old_dir), new_dentry->d_parent);btrfs_end_log_trans (root); log_pinned = false;
fs/btrfs/tree-log.c +15 -4
@@ -6628,14 +6628,25 @@ void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans,mutex_unlock (&dir->log_mutex); } -/* -* Call this after adding a new name for a file and it will properly -* update the log to reflect the new name. +/** +* Update the log after adding a new name for an inode. +* +* @trans: Transaction handle. +* @old_dentry: The dentry associated with the old name and the old +* parent directory. +* @old_dir: The inode of the previous parent directory for the case +* of a rename. For a link operation, it must be NULL. +* @parent: The dentry associated with the directory under which the +* new name is located. +* +* Call this after adding a new name for an inode, as a result of a link or +* rename operation, and it will properly update the log to reflect the new name. */ void btrfs_log_new_name (struct btrfs_trans_handle *trans, -struct btrfs_inode *inode,struct btrfs_inode *old_dir, +struct dentry *old_dentry,struct btrfs_inode *old_dir,struct dentry *parent) { +struct btrfs_inode *inode =BTRFS_I (d_inode (old_dentry));struct btrfs_log_ctx ctx;/*
fs/btrfs/tree-log.h +1 -1
@@ -84,7 +84,7 @@ void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,void btrfs_record_snapshot_destroy (struct btrfs_trans_handle *trans,struct btrfs_inode *dir);void btrfs_log_new_name (struct btrfs_trans_handle *trans, -struct btrfs_inode *inode,struct btrfs_inode *old_dir, +struct dentry *old_dentry,struct btrfs_inode *old_dir,struct dentry *parent);#endif
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/136 btrfs: remove unnecessary parameter delalloc_start for writepage_delalloc()
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit cf3075fb36c6a98ea890f4a50b4419ff2fff9a2f ]
In function __extent_writepage() we always pass page start to @delalloc_start for writepage_delalloc().
Thus we don't really need @delalloc_start parameter as we can extract it from @page.
Remove @delalloc_start parameter and make __extent_writepage() to declare @page_start and @page_end as const.
--- fs/btrfs/extent_io.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
fs/btrfs/extent_io.c +7 -7
@@ -3780,10 +3780,11 @@ static void update_nr_written(struct writeback_control *wbc,*/ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,struct page *page,struct writeback_control *wbc, -u64 delalloc_start,unsigned long *nr_written) +unsigned long *nr_written) { -u64 page_end = delalloc_start +PAGE_SIZE -1 ; +u64 page_end =page_offset (page) +PAGE_SIZE -1 ;bool found; +u64 delalloc_start =page_offset (page);u64 delalloc_to_write =0 ;u64 delalloc_end =0 ;int ret;
@@ -4068,8 +4069,8 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, struct extent_page_data *epd) {struct inode *inode = page->mapping->host; -u64 start =page_offset (page); -u64 page_end = start +PAGE_SIZE -1 ; +const u64 page_start =page_offset (page); +const u64 page_end = page_start +PAGE_SIZE -1 ;int ret;int nr =0 ;size_t pg_offset;
@@ -4104,8 +4105,7 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, }if (!epd->extent_locked) { - ret =writepage_delalloc (BTRFS_I (inode), page, wbc, start, - &nr_written); + ret =writepage_delalloc (BTRFS_I (inode), page, wbc, &nr_written);if (ret ==1 )return 0 ;if (ret)
@@ -4155,7 +4155,7 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,* capable of that. */ if (PageError (page)) -end_extent_writepage (page, ret, start, page_end); +end_extent_writepage (page, ret, page_start, page_end);unlock_page (page);ASSERT (ret <=0 );return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/136 riscv: lib: uaccess: fold fixups into body
In reply to Greg Kroah-HartmanFrom: Jisheng Zhang <[email protected]>
[ Upstream commit 9d504f9aa5c1b76673018da9503e76b351a24b8c ]
uaccess functions such __asm_copy_to_user(), __arch_copy_from_user() and __clear_user() place their exception fixups in the .fixup section without any clear association with themselves. If we backtrace the fixup code, it will be symbolized as an offset from the nearest prior symbol.
Similar as arm64 does, we must move fixups into the body of the functions themselves, after the usual fast-path returns.
--- arch/riscv/lib/uaccess.S | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
arch/riscv/lib/uaccess.S +11 -11
@@ -173,6 +173,13 @@ ENTRY(__asm_copy_from_user) csrc CSR_STATUS, t6 li a0, 0 ret + + /* Exception fixup code */ +10: + /* Disable access to user memory */ + csrs CSR_STATUS, t6 + mv a0, t5 + ret ENDPROC(__asm_copy_to_user) ENDPROC(__asm_copy_from_user) EXPORT_SYMBOL(__asm_copy_to_user)
@@ -218,19 +225,12 @@ ENTRY(__clear_user) addi a0, a0, 1 bltu a0, a3, 5b j 3b -ENDPROC(__clear_user) -EXPORT_SYMBOL(__clear_user) - .section .fixup,"ax" - .balign 4 - /* Fixup code for __copy_user(10) and __clear_user(11) */ -10: - /* Disable access to user memory */ - csrs CSR_STATUS, t6 - mv a0, t5 - ret + /* Exception fixup code */ 11: + /* Disable access to user memory */ csrs CSR_STATUS, t6 mv a0, a1 ret - .previous +ENDPROC(__clear_user) +EXPORT_SYMBOL(__clear_user)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 25/136 riscv: lib: uaccess: fix CSR_STATUS SR_SUM bit
In reply to Greg Kroah-HartmanFrom: Chen Lifu <[email protected]>
[ Upstream commit c08b4848f596fd95543197463b5162bd7bab2442 ]
Since commit 5d8544e2d007 ("RISC-V: Generic library routines and assembly") and commit ebcbd75e3962 ("riscv: Fix the bug in memory access fixup code"), if __clear_user and __copy_user return from an fixup branch, CSR_STATUS SR_SUM bit will be set, it is a vulnerability, so that S-mode memory accesses to pages that are accessible by U-mode will success. Disable S-mode access to U-mode memory should clear SR_SUM bit.
--- arch/riscv/lib/uaccess.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/lib/uaccess.S +2 -2
@@ -177,7 +177,7 @@ ENTRY(__asm_copy_from_user) /* Exception fixup code */ 10: /* Disable access to user memory */ - csrs CSR_STATUS, t6 + csrc CSR_STATUS, t6 mv a0, t5 ret ENDPROC(__asm_copy_to_user)
@@ -229,7 +229,7 @@ ENTRY(__clear_user) /* Exception fixup code */ 11: /* Disable access to user memory */ - csrs CSR_STATUS, t6 + csrc CSR_STATUS, t6 mv a0, a1 ret ENDPROC(__clear_user)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 26/136 xfrm: fix refcount leak in __xfrm_policy_check()
In reply to Greg Kroah-HartmanFrom: Xin Xiong <[email protected]>
[ Upstream commit 9c9cb23e00ddf45679b21b4dacc11d1ae7961ebe ]
The issue happens on an error path in __xfrm_policy_check(). When the fetching process of the object pols[1] fails, the function simply returns 0, forgetting to decrement the reference count of pols[0], which is incremented earlier by either xfrm_sk_policy_lookup() or xfrm_policy_lookup(). This may result in memory leaks.
Fix it by decreasing the reference count of pols[0] in that path.
--- net/xfrm/xfrm_policy.c | 1 + 1 file changed, 1 insertion(+)
net/xfrm/xfrm_policy.c +1 -0
@@ -3600,6 +3600,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,if (pols[1 ]) {if (IS_ERR (pols[1 ])) {XFRM_INC_STATS (net,LINUX_MIB_XFRMINPOLERROR ); +xfrm_pol_put (pols[0 ]);return 0 ; } pols[1 ]->curlft.use_time =ktime_get_real_seconds ();
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 27/136 xfrm: clone missing x->lastused in xfrm_do_migrate
In reply to Greg Kroah-HartmanFrom: Antony Antony <[email protected]>
[ Upstream commit 6aa811acdb76facca0b705f4e4c1d948ccb6af8b ]
x->lastused was not cloned in xfrm_do_migrate. Add it to clone during migrate.
--- net/xfrm/xfrm_state.c | 1 + 1 file changed, 1 insertion(+)
net/xfrm/xfrm_state.c +1 -0
@@ -1591,6 +1591,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, x->replay = orig->replay; x->preplay = orig->preplay; x->mapping_maxage = orig->mapping_maxage; + x->lastused = orig->lastused; x->new_mapping =0 ; x->new_mapping_sport =0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 28/136 af_key: Do not call xfrm_probe_algs in parallel
In reply to Greg Kroah-HartmanFrom: Herbert Xu <[email protected]>
[ Upstream commit ba953a9d89a00c078b85f4b190bc1dde66fe16b5 ]
When namespace support was added to xfrm/afkey, it caused the previously single-threaded call to xfrm_probe_algs to become multi-threaded. This is buggy and needs to be fixed with a mutex.
--- net/key/af_key.c | 3 +++ 1 file changed, 3 insertions(+)
net/key/af_key.c +3 -0
@@ -1697,9 +1697,12 @@ static int pfkey_register(struct sock *sk, struct sk_buff *skb, const struct sad pfk->registered |= (1 <<hdr->sadb_msg_satype); } +mutex_lock (&pfkey_mutex);xfrm_probe_algs (); supp_skb =compose_sadb_supported (hdr,GFP_KERNEL | __GFP_ZERO); +mutex_unlock (&pfkey_mutex); +if (!supp_skb) {if (hdr->sadb_msg_satype !=SADB_SATYPE_UNSPEC ) pfk->registered &= ~(1 <<hdr->sadb_msg_satype);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 29/136 xfrm: policy: fix metadata dst->dev xmit null pointer dereference
In reply to Greg Kroah-HartmanFrom: Nikolay Aleksandrov <[email protected]>
[ Upstream commit 17ecd4a4db4783392edd4944f5e8268205083f70 ]
When we try to transmit an skb with metadata_dst attached (i.e. dst->dev == NULL) through xfrm interface we can hit a null pointer dereference[1] in xfrmi_xmit2() -> xfrm_lookup_with_ifid() due to the check for a loopback skb device when there's no policy which dereferences dst->dev unconditionally. Not having dst->dev can be interepreted as it not being a loopback device, so just add a check for a null dst_orig->dev.
With this fix xfrm interface's Tx error counters go up as usual.
[1] net-next calltrace captured via netconsole:
BUG: kernel NULL pointer dereference, address: 00000000000000c0 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP CPU: 1 PID: 7231 Comm: ping Kdump: loaded Not tainted 5.19.0+ #24 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.0-1.fc36 04/01/2014 RIP: 0010:xfrm_lookup_with_ifid+0x5eb/0xa60 Code: 8d 74 24 38 e8 26 a4 37 00 48 89 c1 e9 12 fc ff ff 49 63 ed 41 83 fd be 0f 85 be 01 00 00 41 be ff ff ff ff 45 31 ed 48 8b 03 <f6> 80 c0 00 00 00 08 75 0f 41 80 bc 24 19 0d 00 00 01 0f 84 1e 02 RSP: 0018:ffffb0db82c679f0 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffffd0db7fcad430 RCX: ffffb0db82c67a10 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffb0db82c67a80 RBP: ffffb0db82c67a80 R08: ffffb0db82c67a14 R09: 0000000000000000 R10: 0000000000000000 R11: ffff8fa449667dc8 R12: ffffffff966db880 R13: 0000000000000000 R14: 00000000ffffffff R15: 0000000000000000 FS: 00007ff35c83f000(0000) GS:ffff8fa478480000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000000c0 CR3: 000000001ebb7000 CR4: 0000000000350ee0 Call Trace: <TASK> xfrmi_xmit+0xde/0x460 ? tcf_bpf_act+0x13d/0x2a0 dev_hard_start_xmit+0x72/0x1e0 __dev_queue_xmit+0x251/0xd30 ip_finish_output2+0x140/0x550 ip_push_pending_frames+0x56/0x80 raw_sendmsg+0x663/0x10a0 ? try_charge_memcg+0x3fd/0x7a0 ? __mod_memcg_lruvec_state+0x93/0x110 ? sock_sendmsg+0x30/0x40 sock_sendmsg+0x30/0x40 __sys_sendto+0xeb/0x130 ? handle_mm_fault+0xae/0x280 ? do_user_addr_fault+0x1e7/0x680 ? kvm_read_and_reset_apf_flags+0x3b/0x50 __x64_sys_sendto+0x20/0x30 do_syscall_64+0x34/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7ff35cac1366 Code: eb 0b 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 11 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 72 c3 90 55 48 83 ec 30 44 89 4c 24 2c 4c 89 RSP: 002b:00007fff738e4028 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 00007fff738e57b0 RCX: 00007ff35cac1366 RDX: 0000000000000040 RSI: 0000557164e4b450 RDI: 0000000000000003 RBP: 0000557164e4b450 R08: 00007fff738e7a2c R09: 0000000000000010 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000040 R13: 00007fff738e5770 R14: 00007fff738e4030 R15: 0000001d00000001 </TASK> Modules linked in: netconsole veth br_netfilter bridge bonding virtio_net [last unloaded: netconsole] CR2: 00000000000000c0
--- net/xfrm/xfrm_policy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_policy.c +1 -1
@@ -3162,7 +3162,7 @@ struct dst_entry *xfrm_lookup_with_ifid(struct net *net,return dst; nopol: -if (!(dst_orig->dev->flags &IFF_LOOPBACK ) && +if ((!dst_orig->dev || !(dst_orig->dev->flags &IFF_LOOPBACK )) && net->xfrm.policy_default[dir] ==XFRM_USERPOLICY_BLOCK ) { err = -EPERM ; goto error;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 30/136 fs: require CAP_SYS_ADMIN in target namespace for idmapped mounts
In reply to Greg Kroah-HartmanFrom: Seth Forshee <[email protected]>
[ Upstream commit bf1ac16edf6770a92bc75cf2373f1f9feea398a4 ]
Idmapped mounts should not allow a user to map file ownsership into a range of ids which is not under the control of that user. However, we currently don't check whether the mounter is privileged wrt to the target user namespace.
Currently no FS_USERNS_MOUNT filesystems support idmapped mounts, thus this is not a problem as only CAP_SYS_ADMIN in init_user_ns is allowed to set up idmapped mounts. But this could change in the future, so add a check to refuse to create idmapped mounts when the mounter does not have CAP_SYS_ADMIN in the target user namespace.
--- fs/namespace.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/namespace.c +7 -0
@@ -4168,6 +4168,13 @@ static int build_mount_idmapped(const struct mount_attr *attr, size_t usize, err = -EPERM ; goto out_fput; } + +/* We're not controlling the target namespace. */ +if (!ns_capable (mnt_userns,CAP_SYS_ADMIN )) { + err = -EPERM ; + goto out_fput; + } + kattr->mnt_userns =get_user_ns (mnt_userns); out_fput:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 31/136 net: use eth_hw_addr_set() instead of ether_addr_copy()
In reply to Greg Kroah-HartmanFrom: Jakub Kicinski <[email protected]>
[ Upstream commit e35b8d7dbb094c79daf920797c372911edc2d525 ]
Convert from ether_addr_copy() to eth_hw_addr_set():
@@
expression dev, np;
@@
- ether_addr_copy(dev->dev_addr, np)
+ eth_hw_addr_set(dev, np)
--- drivers/net/ipvlan/ipvlan_main.c | 2 +- drivers/net/macsec.c | 2 +- drivers/net/macvlan.c | 2 +- net/8021q/vlan_dev.c | 6 +++--- net/dsa/slave.c | 4 ++-- net/hsr/hsr_device.c | 2 +- net/hsr/hsr_main.c | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-)
drivers/net/ipvlan/ipvlan_main.c +1 -1
@@ -787,7 +787,7 @@ static int ipvlan_device_event(struct notifier_block *unused,case NETDEV_CHANGEADDR :list_for_each_entry (ipvlan, &port->ipvlans, pnode) { -ether_addr_copy (ipvlan->dev->dev_addr, dev->dev_addr); +eth_hw_addr_set (ipvlan->dev, dev->dev_addr);call_netdevice_notifiers (NETDEV_CHANGEADDR , ipvlan->dev); }break ;
drivers/net/macsec.c +1 -1
@@ -3616,7 +3616,7 @@ static int macsec_set_mac_address(struct net_device *dev, void *p)dev_uc_del (real_dev, dev->dev_addr); out: -ether_addr_copy (dev->dev_addr, addr->sa_data); +eth_hw_addr_set (dev, addr->sa_data); macsec->secy.sci =dev_to_sci (dev,MACSEC_PORT_ES );/* If h/w offloading is available, propagate to the device */
drivers/net/macvlan.c +1 -1
@@ -711,7 +711,7 @@ static int macvlan_sync_address(struct net_device *dev, unsigned char *addr)if (!(dev->flags &IFF_UP )) {/* Just copy in the new address */ -ether_addr_copy (dev->dev_addr, addr); +eth_hw_addr_set (dev, addr); }else {/* Rehash and update the device filters */ if (macvlan_addr_busy (vlan->port, addr))
net/8021q/vlan_dev.c +3 -3
@@ -250,7 +250,7 @@ bool vlan_dev_inherit_address(struct net_device *dev,if (dev->addr_assign_type !=NET_ADDR_STOLEN )return false; -ether_addr_copy (dev->dev_addr, real_dev->dev_addr); +eth_hw_addr_set (dev, real_dev->dev_addr);call_netdevice_notifiers (NETDEV_CHANGEADDR , dev);return true; }
@@ -349,7 +349,7 @@ static int vlan_dev_set_mac_address(struct net_device *dev, void *p)dev_uc_del (real_dev, dev->dev_addr); out: -ether_addr_copy (dev->dev_addr, addr->sa_data); +eth_hw_addr_set (dev, addr->sa_data);return 0 ; }
@@ -586,7 +586,7 @@ static int vlan_dev_init(struct net_device *dev) dev->dev_id = real_dev->dev_id;if (is_zero_ether_addr (dev->dev_addr)) { -ether_addr_copy (dev->dev_addr, real_dev->dev_addr); +eth_hw_addr_set (dev, real_dev->dev_addr); dev->addr_assign_type =NET_ADDR_STOLEN ; }if (is_zero_ether_addr (dev->broadcast))
net/dsa/slave.c +2 -2
@@ -174,7 +174,7 @@ static int dsa_slave_set_mac_address(struct net_device *dev, void *a)dev_uc_del (master, dev->dev_addr); out: -ether_addr_copy (dev->dev_addr, addr->sa_data); +eth_hw_addr_set (dev, addr->sa_data);return 0 ; }
@@ -1954,7 +1954,7 @@ int dsa_slave_create(struct dsa_port *port) slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;if (!is_zero_ether_addr (port->mac)) -ether_addr_copy (slave_dev->dev_addr, port->mac); +eth_hw_addr_set (slave_dev, port->mac);else eth_hw_addr_inherit (slave_dev, master); slave_dev->priv_flags |=IFF_NO_QUEUE ;
net/hsr/hsr_device.c +1 -1
@@ -493,7 +493,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],INIT_LIST_HEAD (&hsr->self_node_db);spin_lock_init (&hsr->list_lock); -ether_addr_copy (hsr_dev->dev_addr, slave[0 ]->dev_addr); +eth_hw_addr_set (hsr_dev, slave[0 ]->dev_addr);/* initialize protocol specific functions */ if (protocol_version ==PRP_V1 ) {
net/hsr/hsr_main.c +1 -1
@@ -75,7 +75,7 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, master =hsr_port_get_hsr (hsr,HSR_PT_MASTER );if (port->type ==HSR_PT_SLAVE_A ) { -ether_addr_copy (master->dev->dev_addr, dev->dev_addr); +eth_hw_addr_set (master->dev, dev->dev_addr);call_netdevice_notifiers (NETDEV_CHANGEADDR , master->dev); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/136 Revert "net: macsec: update SCI upon MAC address change."
In reply to Greg Kroah-HartmanFrom: Sabrina Dubroca <[email protected]>
[ Upstream commit e82c649e851c9c25367fb7a2a6cf3479187de467 ]
This reverts commit 6fc498bc82929ee23aa2f35a828c6178dfd3f823.
Commit 6fc498bc8292 states:
SCI should be updated, because it contains MAC in its first 6 octets.
That's not entirely correct. The SCI can be based on the MAC address, but doesn't have to be. We can also use any 64-bit number as the SCI. When the SCI based on the MAC address, it uses a 16-bit "port number" provided by userspace, which commit 6fc498bc8292 overwrites with 1.
In addition, changing the SCI after macsec has been setup can just confuse the receiver. If we configure the RXSC on the peer based on the original SCI, we should keep the same SCI on TX.
When the macsec device is being managed by a userspace key negotiation daemon such as wpa_supplicant, commit 6fc498bc8292 would also overwrite the SCI defined by userspace.
--- drivers/net/macsec.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/net/macsec.c +5 -6
@@ -447,11 +447,6 @@ static struct macsec_eth_header *macsec_ethhdr(struct sk_buff *skb)return (struct macsec_eth_header *)skb_mac_header (skb); } -static sci_t dev_to_sci (struct net_device *dev,__be16 port) -{ -return make_sci (dev->dev_addr, port); -} -static void __macsec_pn_wrapped (struct macsec_secy *secy,struct macsec_tx_sa *tx_sa) {
@@ -3617,7 +3612,6 @@ static int macsec_set_mac_address(struct net_device *dev, void *p) out:eth_hw_addr_set (dev, addr->sa_data); - macsec->secy.sci =dev_to_sci (dev,MACSEC_PORT_ES );/* If h/w offloading is available, propagate to the device */ if (macsec_is_offloaded (macsec)) {
@@ -3953,6 +3947,11 @@ static bool sci_exists(struct net_device *dev, sci_t sci)return false; } +static sci_t dev_to_sci (struct net_device *dev,__be16 port) +{ +return make_sci (dev->dev_addr, port); +} +static int macsec_add_dev (struct net_device *dev,sci_t sci,u8 icv_len) {struct macsec_dev *macsec =macsec_priv (dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/136 NFS: Dont allocate nfs_fattr on the stack in __nfs42_ssc_open()
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit 156cd28562a4e8ca454d11b234d9f634a45d6390 ]
The preferred behaviour is always to allocate struct nfs_fattr from the slab.
--- fs/nfs/nfs4file.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/nfs/nfs4file.c +6 -4
@@ -319,7 +319,7 @@ static int read_name_gen = 1;static struct file *__nfs42_ssc_open (struct vfsmount *ss_mnt,struct nfs_fh *src_fh,nfs4_stateid *stateid) { -struct nfs_fattr fattr; +struct nfs_fattr *fattr =nfs_alloc_fattr ();struct file *filep, *res;struct nfs_server *server;struct inode *r_ino =NULL ;
@@ -330,9 +330,10 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt, server =NFS_SERVER (ss_mnt->mnt_root->d_inode); -nfs_fattr_init (&fattr); +if (!fattr) +return ERR_PTR (-ENOMEM ); - status =nfs4_proc_getattr (server, src_fh, &fattr,NULL ,NULL ); + status =nfs4_proc_getattr (server, src_fh, fattr,NULL ,NULL );if (status <0 ) { res =ERR_PTR (status); goto out;
@@ -345,7 +346,7 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt, goto out;snprintf (read_name, len,SSC_READ_NAME_BODY , read_name_gen++); - r_ino =nfs_fhget (ss_mnt->mnt_root->d_inode->i_sb, src_fh, &fattr, + r_ino =nfs_fhget (ss_mnt->mnt_root->d_inode->i_sb, src_fh, fattr,NULL );if (IS_ERR (r_ino)) { res =ERR_CAST (r_ino);
@@ -390,6 +391,7 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt, out_free_name:kfree (read_name); out: +nfs_free_fattr (fattr);return res; out_stateowner:nfs4_put_state_owner (sp);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/136 NFSv4.2 fix problems with __nfs42_ssc_open
In reply to Greg Kroah-HartmanFrom: Olga Kornievskaia <[email protected]>
[ Upstream commit fcfc8be1e9cf2f12b50dce8b579b3ae54443a014 ]
A destination server while doing a COPY shouldn't accept using the passed in filehandle if its not a regular filehandle.
If alloc_file_pseudo() has failed, we need to decrement a reference on the newly created inode, otherwise it leaks.
--- fs/nfs/nfs4file.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/nfs/nfs4file.c +6 -0
@@ -339,6 +339,11 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt, goto out; } +if (!S_ISREG (fattr->mode)) { + res =ERR_PTR (-EBADF ); + goto out; + } + res =ERR_PTR (-ENOMEM ); len =strlen (SSC_READ_NAME_BODY ) +16 ; read_name =kzalloc (len,GFP_NOFS );
@@ -357,6 +362,7 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt, r_ino->i_fop);if (IS_ERR (filep)) { res =ERR_CAST (filep); +iput (r_ino); goto out_free_name; } filep->f_mode |=FMODE_READ ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/136 SUNRPC: RPC level errors should set task->tk_rpc_status
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit ed06fce0b034b2e25bd93430f5c4cbb28036cc1a ]
Fix up a case in call_encode() where we're failing to set task->tk_rpc_status when an RPC level error occurred.
--- net/sunrpc/clnt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sunrpc/clnt.c +1 -1
@@ -1881,7 +1881,7 @@ call_encode(struct rpc_task *task)break ;case -EKEYEXPIRED :if (!task->tk_cred_retry) { -rpc_exit (task, task->tk_status); +rpc_call_rpcerror (task, task->tk_status); }else { task->tk_action = call_refresh; task->tk_cred_retry--;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/136 mm/smaps: dont access young/dirty bit if pte unpresent
In reply to Greg Kroah-HartmanFrom: Peter Xu <[email protected]>
[ Upstream commit efd4149342db2df41b1bbe68972ead853b30e444 ]
These bits should only be valid when the ptes are present. Introducing two booleans for it and set it to false when !pte_present() for both pte and pmd accountings.
The bug is found during code reading and no real world issue reported, but logically such an error can cause incorrect readings for either smaps or smaps_rollup output on quite a few fields.
For example, it could cause over-estimate on values like Shared_Dirty, Private_Dirty, Referenced. Or it could also cause under-estimate on values like LazyFree, Shared_Clean, Private_Clean.
--- fs/proc/task_mmu.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/proc/task_mmu.c +4 -3
@@ -503,10 +503,12 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr,struct vm_area_struct *vma = walk->vma;bool locked = !!(vma->vm_flags &VM_LOCKED );struct page *page =NULL ; -bool migration = false; +bool migration = false, young = false, dirty = false;if (pte_present (*pte)) { page =vm_normal_page (vma, addr, *pte); + young =pte_young (*pte); + dirty =pte_dirty (*pte); }else if (is_swap_pte (*pte)) {swp_entry_t swpent =pte_to_swp_entry (*pte);
@@ -540,8 +542,7 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr,if (!page)return ; -smaps_account (mss, page, false,pte_young (*pte),pte_dirty (*pte), - locked, migration); +smaps_account (mss, page, false, young, dirty, locked, migration); }#ifdef CONFIG_TRANSPARENT_HUGEPAGE
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/136 ntfs: fix acl handling
In reply to Greg Kroah-HartmanFrom: Christian Brauner <[email protected]>
[ Upstream commit 0c3bc7899e6dfb52df1c46118a5a670ae619645f ]
While looking at our current POSIX ACL handling in the context of some overlayfs work I went through a range of other filesystems checking how they handle them currently and encountered ntfs3.
The posic_acl_{from,to}_xattr() helpers always need to operate on the filesystem idmapping. Since ntfs3 can only be mounted in the initial user namespace the relevant idmapping is init_user_ns.
The posix_acl_{from,to}_xattr() helpers are concerned with translating between the kernel internal struct posix_acl{_entry} and the uapi struct posix_acl_xattr_{header,entry} and the kernel internal data structure is cached filesystem wide.
Additional idmappings such as the caller's idmapping or the mount's idmapping are handled higher up in the VFS. Individual filesystems usually do not need to concern themselves with these.
The posix_acl_valid() helper is concerned with checking whether the values in the kernel internal struct posix_acl can be represented in the filesystem's idmapping. IOW, if they can be written to disk. So this helper too needs to take the filesystem's idmapping.
--- fs/ntfs3/xattr.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
fs/ntfs3/xattr.c +7 -9
@@ -476,8 +476,7 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name, }#ifdef CONFIG_NTFS3_FS_POSIX_ACL -static struct posix_acl *ntfs_get_acl_ex (struct user_namespace *mnt_userns, -struct inode *inode,int type, +static struct posix_acl *ntfs_get_acl_ex (struct inode *inode,int type,int locked) {struct ntfs_inode *ni =ntfs_i (inode);
@@ -512,7 +511,7 @@ static struct posix_acl *ntfs_get_acl_ex(struct user_namespace *mnt_userns,/* Translate extended attribute to acl. */ if (err >=0 ) { - acl =posix_acl_from_xattr (mnt_userns, buf, err); + acl =posix_acl_from_xattr (&init_user_ns, buf, err); }else if (err == -ENODATA ) { acl =NULL ; }else {
@@ -535,8 +534,7 @@ struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu)if (rcu)return ERR_PTR (-ECHILD ); -/* TODO: init_user_ns? */ -return ntfs_get_acl_ex (&init_user_ns, inode, type,0 ); +return ntfs_get_acl_ex (inode, type,0 ); } static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
@@ -588,7 +586,7 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns, value =kmalloc (size,GFP_NOFS );if (!value)return -ENOMEM ; - err =posix_acl_to_xattr (mnt_userns, acl, value, size); + err =posix_acl_to_xattr (&init_user_ns, acl, value, size);if (err <0 ) goto out; flags =0 ;
@@ -639,7 +637,7 @@ static int ntfs_xattr_get_acl(struct user_namespace *mnt_userns,if (!acl)return -ENODATA ; - err =posix_acl_to_xattr (mnt_userns, acl, buffer, size); + err =posix_acl_to_xattr (&init_user_ns, acl, buffer, size);posix_acl_release (acl);return err;
@@ -663,12 +661,12 @@ static int ntfs_xattr_set_acl(struct user_namespace *mnt_userns,if (!value) { acl =NULL ; }else { - acl =posix_acl_from_xattr (mnt_userns, value, size); + acl =posix_acl_from_xattr (&init_user_ns, value, size);if (IS_ERR (acl))return PTR_ERR (acl);if (acl) { - err =posix_acl_valid (mnt_userns, acl); + err =posix_acl_valid (&init_user_ns, acl);if (err) goto release_and_out; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/136 rose: check NULL rose_loopback_neigh->loopback
In reply to Greg Kroah-HartmanFrom: Bernard Pidoux <[email protected]>
[ Upstream commit 3c53cd65dece47dd1f9d3a809f32e59d1d87b2b8 ]
Commit 3b3fd068c56e3fbea30090859216a368398e39bf added NULL check for rose_loopback_neigh->dev in rose_loopback_timer() but omitted to check rose_loopback_neigh->loopback.
It thus prevents *all* rose connect.
The reason is that a special rose_neigh loopback has a NULL device.
/proc/net/rose_neigh illustrates it via rose_neigh_show() function :
[...]
seq_printf(seq, "%05d %-9s %-4s %3d %3d %3s %3s %3lu %3lu",
rose_neigh->number, (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, &rose_neigh->callsign), rose_neigh->dev ? rose_neigh->dev->name : "???", rose_neigh->count,
/proc/net/rose_neigh displays special rose_loopback_neigh->loopback as callsign RSLOOP-0:
addr callsign dev count use mode restart t0 tf digipeaters
00001 RSLOOP-0 ??? 1 2 DCE yes 0 0
By checking rose_loopback_neigh->loopback, rose_rx_call_request() is called even in case rose_loopback_neigh->dev is NULL. This repairs rose connections.
Verification with rose client application FPAC:
FPAC-Node v 4.1.3 (built Aug 5 2022) for LINUX (help = h) F6BVP-4 (Commands = ?) : u
Users - AX.25 Level 2 sessions :
Port Callsign Callsign AX.25 state ROSE state NetRom status axudp F6BVP-5 -> F6BVP-9 Connected Connected ---------
--- net/rose/rose_loopback.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/rose/rose_loopback.c +2 -1
@@ -96,7 +96,8 @@ static void rose_loopback_timer(struct timer_list *unused) }if (frametype ==ROSE_CALL_REQUEST ) { -if (!rose_loopback_neigh->dev) { +if (!rose_loopback_neigh->dev && + !rose_loopback_neigh->loopback) {kfree_skb (skb);continue ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 39/136 r8152: fix the units of some registers for RTL8156A
In reply to Greg Kroah-HartmanFrom: Hayes Wang <[email protected]>
[ Upstream commit 6dc4df12d741c0fe8f885778a43039e0619b9cd9 ]
The units of PLA_RX_FIFO_FULL and PLA_RX_FIFO_EMPTY are 16 bytes.
--- drivers/net/usb/r8152.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-)
drivers/net/usb/r8152.c +2 -15
@@ -6429,21 +6429,8 @@ static void r8156_fc_parameter(struct r8152 *tp)u32 pause_on = tp->fc_pause_on ? tp->fc_pause_on :fc_pause_on_auto (tp);u32 pause_off = tp->fc_pause_off ? tp->fc_pause_off :fc_pause_off_auto (tp); -switch (tp->version) { -case RTL_VER_10 : -case RTL_VER_11 : -ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_FULL , pause_on /8 ); -ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_EMPTY , pause_off /8 ); -break ; -case RTL_VER_12 : -case RTL_VER_13 : -case RTL_VER_15 : -ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_FULL , pause_on /16 ); -ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_EMPTY , pause_off /16 ); -break ; -default : -break ; - } +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_FULL , pause_on /16 ); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_EMPTY , pause_off /16 ); }static void rtl8156_change_mtu (struct r8152 *tp)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/136 r8152: fix the RX FIFO settings when suspending
In reply to Greg Kroah-HartmanFrom: Hayes Wang <[email protected]>
[ Upstream commit b75d612014447e04abdf0e37ffb8f2fd8b0b49d6 ]
The RX FIFO would be changed when suspending, so the related settings have to be modified, too. Otherwise, the flow control would work abnormally.
--- drivers/net/usb/r8152.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/usb/r8152.c +10 -0
@@ -5904,6 +5904,11 @@ static void r8153_enter_oob(struct r8152 *tp) ocp_data &= ~NOW_IS_OOB ;ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_OOB_CTRL , ocp_data); +/* RX FIFO settings for OOB */ +ocp_write_dword (tp,MCU_TYPE_PLA ,PLA_RXFIFO_CTRL0 ,RXFIFO_THR1_OOB ); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RXFIFO_CTRL1 ,RXFIFO_THR2_OOB ); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RXFIFO_CTRL2 ,RXFIFO_THR3_OOB ); +rtl_disable (tp);rtl_reset_bmu (tp);
@@ -6542,6 +6547,11 @@ static void rtl8156_down(struct r8152 *tp) ocp_data &= ~NOW_IS_OOB ;ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_OOB_CTRL , ocp_data); +/* RX FIFO settings for OOB */ +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RXFIFO_FULL ,64 /16 ); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_FULL ,1024 /16 ); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RX_FIFO_EMPTY ,4096 /16 ); +rtl_disable (tp);rtl_reset_bmu (tp);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 41/136 nfc: pn533: Fix use-after-free bugs caused by pn532_cmd_timeout
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit f1e941dbf80a9b8bab0bffbc4cbe41cc7f4c6fb6 ]
When the pn532 uart device is detaching, the pn532_uart_remove() is called. But there are no functions in pn532_uart_remove() that could delete the cmd_timeout timer, which will cause use-after-free bugs. The process is shown below:
(thread 1) | (thread 2)
| pn532_uart_send_frame
pn532_uart_remove | mod_timer(&pn532->cmd_timeout,...)
... | (wait a time)
kfree(pn532) //FREE | pn532_cmd_timeout
| pn532_uart_send_frame
| pn532->... //USEThis patch adds del_timer_sync() in pn532_uart_remove() in order to prevent the use-after-free bugs. What's more, the pn53x_unregister_nfc() is well synchronized, it sets nfc_dev->shutting_down to true and there are no syscalls could restart the cmd_timeout timer.
--- drivers/nfc/pn533/uart.c | 1 + 1 file changed, 1 insertion(+)
drivers/nfc/pn533/uart.c +1 -0
@@ -310,6 +310,7 @@ static void pn532_uart_remove(struct serdev_device *serdev)pn53x_unregister_nfc (pn532->priv);serdev_device_close (serdev);pn53x_common_clean (pn532->priv); +del_timer_sync (&pn532->cmd_timeout);kfree_skb (pn532->recv_skb);kfree (pn532); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/136 ice: xsk: Force rings to be sized to power of 2
In reply to Greg Kroah-HartmanFrom: Maciej Fijalkowski <[email protected]>
[ Upstream commit 296f13ff3854535009a185aaf8e3603266d39d94 ]
With the upcoming introduction of batching to XSK data path, performance wise it will be the best to have the ring descriptor count to be aligned to power of 2.
Check if ring sizes that user is going to attach the XSK socket fulfill the condition above. For Tx side, although check is being done against the Tx queue and in the end the socket will be attached to the XDP queue, it is fine since XDP queues get the ring->count setting from Tx queues.
--- drivers/net/ethernet/intel/ice/ice_xsk.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/intel/ice/ice_xsk.c +8 -0
@@ -321,6 +321,13 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)bool if_running, pool_present = !!pool;int ret =0 , pool_failure =0 ; +if (!is_power_of_2 (vsi->rx_rings[qid]->count) || + !is_power_of_2 (vsi->tx_rings[qid]->count)) { +netdev_err (vsi->netdev,"Please align ring sizes to power of 2\n" ); + pool_failure = -EINVAL ; + goto failure; + } + if_running =netif_running (vsi->netdev) &&ice_is_xdp_ena_vsi (vsi);if (if_running) {
@@ -343,6 +350,7 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)netdev_err (vsi->netdev,"ice_qp_ena error = %d\n" , ret); } +failure:if (pool_failure) {netdev_err (vsi->netdev,"Could not %sable buffer pool, error = %d\n" , pool_present ?"en" :"dis" , pool_failure);
Signature · 1 line
2.35.1
Re: [PATCH 5.15 042/136] ice: xsk: Force rings to be sized to power of 2
Quoted 8 lines · Greg Kroah-Hartman
From: Maciej Fijalkowski <[email protected]>
[ Upstream commit
296f13ff3854535009a185aaf8e3603266d39d94]With the upcoming introduction of batching to XSK data path, performance wise it will be the best to have the ring descriptor count to be aligned to power of 2.
Quoted 5 lines
Check if ring sizes that user is going to attach the XSK socket fulfill the condition above. For Tx side, although check is being done against the Tx queue and in the end the socket will be attached to the XDP queue, it is fine since XDP queues get the
ring->countsetting from Tx queues.
Hi Greg,
We had multiple customers reporting that this change makes them unable to use max ring size which is 8160 for this particular driver (which is not a power of 2 obviously) so we are about to send a patch that will drop this limitation.
To avoid the double work, can you please not proceed with this one? The other two:
ice: xsk: prohibit usage of non-balanced queue id
ice: xsk: use Rx rings XDP ring when picking NAPI context
are valid and needed.
FWIW this was a part of -next patch set, so I suppose you picked this due to some dependency?
Thanks,
Maciej
Quoted 43 lines
Suggested-by Alexander Lobakin <[email protected]>Signed-off-by Maciej Fijalkowski <[email protected]>Signed-off-by Daniel Borkmann <[email protected]>Reviewed-by Alexander Lobakin <[email protected]>Acked-by Magnus Karlsson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/intel/ice/ice_xsk.c | 8 ++++++++ 1 file changed, 8 insertions(+)drivers/net/ethernet/intel/ice/ice_xsk.c +8
-0@@ -321,6 +321,13 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)bool if_running, pool_present = !!pool;int ret =0 , pool_failure =0 ; +if (!is_power_of_2 (vsi->rx_rings[qid]->count) || + !is_power_of_2 (vsi->tx_rings[qid]->count)) { +netdev_err (vsi->netdev,"Please align ring sizes to power of 2\n" ); + pool_failure = -EINVAL ; + goto failure; + } + if_running =netif_running (vsi->netdev) &&ice_is_xdp_ena_vsi (vsi);if (if_running) {@@ -343,6 +350,7 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)netdev_err (vsi->netdev,"ice_qp_ena error = %d\n" , ret); } +failure:if (pool_failure) {netdev_err (vsi->netdev,"Could not %sable buffer pool, error = %d\n" , pool_present ?"en" :"dis" , pool_failure);Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerRe: [PATCH 5.15 042/136] ice: xsk: Force rings to be sized to power of 2
Quoted 22 lines · Maciej Fijalkowski
Quoted 8 lines · Greg Kroah-Hartman
From: Maciej Fijalkowski <[email protected]>
[ Upstream commit
296f13ff3854535009a185aaf8e3603266d39d94]With the upcoming introduction of batching to XSK data path, performance wise it will be the best to have the ring descriptor count to be aligned to power of 2.
Quoted 5 lines
Check if ring sizes that user is going to attach the XSK socket fulfill the condition above. For Tx side, although check is being done against the Tx queue and in the end the socket will be attached to the XDP queue, it is fine since XDP queues get the
ring->countsetting from Tx queues.Hi Greg,
We had multiple customers reporting that this change makes them unable to use max ring size which is 8160 for this particular driver (which is not a power of 2 obviously) so we are about to send a patch that will drop this limitation.
Quoted 6 lines
To avoid the double work, can you please not proceed with this one? The other two:
ice: xsk: prohibit usage of non-balanced queue id
ice: xsk: use Rx rings XDP ring when picking NAPI contextare valid and needed.
This is in the 5.18 kernel release, which has been out for a while.
We will be glad to pick up the fixed commit when it hits Linus's tree.
Quoted 2 lines
FWIW this was a part of -next patch set, so I suppose you picked this due to some dependency?
I think it was, for a later patch in the series, 5a42f112d367 ("ice:
xsk: prohibit usage of non-balanced queue id").
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 43/136 ice: xsk: prohibit usage of non-balanced queue id
In reply to Greg Kroah-HartmanFrom: Maciej Fijalkowski <[email protected]>
[ Upstream commit 5a42f112d367bb4700a8a41f5c12724fde6bfbb9 ]
Fix the following scenario:
1. ethtool -L $IFACE rx 8 tx 96
2. xdpsock -q 10 -t -z
Above refers to a case where user would like to attach XSK socket in txonly mode at a queue id that does not have a corresponding Rx queue. At this moment ice's XSK logic is tightly bound to act on a "queue pair", e.g. both Tx and Rx queues at a given queue id are disabled/enabled and both of them will get XSK pool assigned, which is broken for the presented queue configuration. This results in the splat included at the bottom, which is basically an OOB access to Rx ring array.
To fix this, allow using the ids only in scope of "combined" queues reported by ethtool. However, logic should be rewritten to allow such configurations later on, which would end up as a complete rewrite of the control path, so let us go with this temporary fix.
[420160.558008] BUG: kernel NULL pointer dereference, address: 0000000000000082 [420160.566359] #PF: supervisor read access in kernel mode [420160.572657] #PF: error_code(0x0000) - not-present page [420160.579002] PGD 0 P4D 0 [420160.582756] Oops: 0000 [#1] PREEMPT SMP NOPTI [420160.588396] CPU: 10 PID: 21232 Comm: xdpsock Tainted: G OE 5.19.0-rc7+ #10 [420160.597893] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0008.031920191559 03/19/2019 [420160.609894] RIP: 0010:ice_xsk_pool_setup+0x44/0x7d0 [ice] [420160.616968] Code: f3 48 83 ec 40 48 8b 4f 20 48 8b 3f 65 48 8b 04 25 28 00 00 00 48 89 44 24 38 31 c0 48 8d 04 ed 00 00 00 00 48 01 c1 48 8b 11 <0f> b7 92 82 00 00 00 48 85 d2 0f 84 2d 75 00 00 48 8d 72 ff 48 85 [420160.639421] RSP: 0018:ffffc9002d2afd48 EFLAGS: 00010282 [420160.646650] RAX: 0000000000000050 RBX: ffff88811d8bdd00 RCX: ffff888112c14ff8 [420160.655893] RDX: 0000000000000000 RSI: ffff88811d8bdd00 RDI: ffff888109861000 [420160.665166] RBP: 000000000000000a R08: 000000000000000a R09: 0000000000000000 [420160.674493] R10: 000000000000889f R11: 0000000000000000 R12: 000000000000000a [420160.683833] R13: 000000000000000a R14: 0000000000000000 R15: ffff888117611828 [420160.693211] FS: 00007fa869fc1f80(0000) GS:ffff8897e0880000(0000) knlGS:0000000000000000 [420160.703645] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [420160.711783] CR2: 0000000000000082 CR3: 00000001d076c001 CR4: 00000000007706e0 [420160.721399] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [420160.731045] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [420160.740707] PKRU: 55555554 [420160.745960] Call Trace: [420160.750962] <TASK> [420160.755597] ? kmalloc_large_node+0x79/0x90 [420160.762703] ? __kmalloc_node+0x3f5/0x4b0 [420160.769341] xp_assign_dev+0xfd/0x210 [420160.775661] ? shmem_file_read_iter+0x29a/0x420 [420160.782896] xsk_bind+0x152/0x490 [420160.788943] __sys_bind+0xd0/0x100 [420160.795097] ? exit_to_user_mode_prepare+0x20/0x120 [420160.802801] __x64_sys_bind+0x16/0x20 [420160.809298] do_syscall_64+0x38/0x90 [420160.815741] entry_SYSCALL_64_after_hwframe+0x63/0xcd [420160.823731] RIP: 0033:0x7fa86a0dd2fb [420160.830264] Code: c3 66 0f 1f 44 00 00 48 8b 15 69 8b 0c 00 f7 d8 64 89 02 b8 ff ff ff ff eb bc 0f 1f 44 00 00 f3 0f 1e fa b8 31 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 3d 8b 0c 00 f7 d8 64 89 01 48 [420160.855410] RSP: 002b:00007ffc1146f618 EFLAGS: 00000246 ORIG_RAX: 0000000000000031 [420160.866366] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fa86a0dd2fb [420160.876957] RDX: 0000000000000010 RSI: 00007ffc1146f680 RDI: 0000000000000003 [420160.887604] RBP: 000055d7113a0520 R08: 00007fa868fb8000 R09: 0000000080000000 [420160.898293] R10: 0000000000008001 R11: 0000000000000246 R12: 000055d7113a04e0 [420160.909038] R13: 000055d7113a0320 R14: 000000000000000a R15: 0000000000000000 [420160.919817] </TASK> [420160.925659] Modules linked in: ice(OE) af_packet binfmt_misc nls_iso8859_1 ipmi_ssif intel_rapl_msr intel_rapl_common x86_pkg_temp_thermal intel_powerclamp mei_me coretemp ioatdma mei ipmi_si wmi ipmi_msghandler acpi_pad acpi_power_meter ip_tables x_tables autofs4 ixgbe i40e crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd ahci mdio dca libahci lpc_ich [last unloaded: ice] [420160.977576] CR2: 0000000000000082 [420160.985037] ---[ end trace 0000000000000000 ]--- [420161.097724] RIP: 0010:ice_xsk_pool_setup+0x44/0x7d0 [ice] [420161.107341] Code: f3 48 83 ec 40 48 8b 4f 20 48 8b 3f 65 48 8b 04 25 28 00 00 00 48 89 44 24 38 31 c0 48 8d 04 ed 00 00 00 00 48 01 c1 48 8b 11 <0f> b7 92 82 00 00 00 48 85 d2 0f 84 2d 75 00 00 48 8d 72 ff 48 85 [420161.134741] RSP: 0018:ffffc9002d2afd48 EFLAGS: 00010282 [420161.144274] RAX: 0000000000000050 RBX: ffff88811d8bdd00 RCX: ffff888112c14ff8 [420161.155690] RDX: 0000000000000000 RSI: ffff88811d8bdd00 RDI: ffff888109861000 [420161.168088] RBP: 000000000000000a R08: 000000000000000a R09: 0000000000000000 [420161.179295] R10: 000000000000889f R11: 0000000000000000 R12: 000000000000000a [420161.190420] R13: 000000000000000a R14: 0000000000000000 R15: ffff888117611828 [420161.201505] FS: 00007fa869fc1f80(0000) GS:ffff8897e0880000(0000) knlGS:0000000000000000 [420161.213628] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [420161.223413] CR2: 0000000000000082 CR3: 00000001d076c001 CR4: 00000000007706e0 [420161.234653] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [420161.245893] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [420161.257052] PKRU: 55555554
--- drivers/net/ethernet/intel/ice/ice_xsk.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/intel/ice/ice_xsk.c +6 -0
@@ -321,6 +321,12 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)bool if_running, pool_present = !!pool;int ret =0 , pool_failure =0 ; +if (qid >= vsi->num_rxq || qid >= vsi->num_txq) { +netdev_err (vsi->netdev,"Please use queue id in scope of combined queues count\n" ); + pool_failure = -EINVAL ; + goto failure; + } +if (!is_power_of_2 (vsi->rx_rings[qid]->count) || !is_power_of_2 (vsi->tx_rings[qid]->count)) {netdev_err (vsi->netdev,"Please align ring sizes to power of 2\n" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/136 net/mlx5e: Properly disable vlan strip on non-UL reps
In reply to Greg Kroah-HartmanFrom: Vlad Buslov <[email protected]>
[ Upstream commit f37044fd759b6bc40b6398a978e0b1acdf717372 ]
When querying mlx5 non-uplink representors capabilities with ethtool rx-vlan-offload is marked as "off [fixed]". However, it is actually always enabled because mlx5e_params->vlan_strip_disable is 0 by default when initializing struct mlx5e_params instance. Fix the issue by explicitly setting the vlan_strip_disable to 'true' for non-uplink representors.
--- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +2 -0
@@ -618,6 +618,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev) params->mqprio.num_tc =1 ; params->tunneled_offload_en = false; +if (rep->vport !=MLX5_VPORT_UPLINK ) + params->vlan_strip_disable = true;/* Set an initial non-zero value, so that mlx5e_select_queue won't * divide by zero if called before first activating channels.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/136 net/mlx5: Avoid false positive lockdep warning by adding lock_class_key
In reply to Greg Kroah-HartmanFrom: Moshe Shemesh <[email protected]>
[ Upstream commit d59b73a66e5e0682442b6d7b4965364e57078b80 ]
Add a lock_class_key per mlx5 device to avoid a false positive "possible circular locking dependency" warning by lockdep, on flows which lock more than one mlx5 device, such as adding SF.
kernel log:
======================================================
WARNING: possible circular locking dependency detected
5.19.0-rc8+ #2 Not tainted
------------------------------------------------------
kworker/u20:0/8 is trying to acquire lock:
ffff88812dfe0d98 (&dev->intf_state_mutex){+.+.}-{3:3}, at: mlx5_init_one+0x2e/0x490 [mlx5_core]
but task is already holding lock:
ffff888101aa7898 (&(¬ifier->n_head)->rwsem){++++}-{3:3}, at: blocking_notifier_call_chain+0x5a/0x130
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&(¬ifier->n_head)->rwsem){++++}-{3:3}:
down_write+0x90/0x150
blocking_notifier_chain_register+0x53/0xa0
mlx5_sf_table_init+0x369/0x4a0 [mlx5_core]
mlx5_init_one+0x261/0x490 [mlx5_core]
probe_one+0x430/0x680 [mlx5_core]
local_pci_probe+0xd6/0x170
work_for_cpu_fn+0x4e/0xa0
process_one_work+0x7c2/0x1340
worker_thread+0x6f6/0xec0
kthread+0x28f/0x330
ret_from_fork+0x1f/0x30-> #0 (&dev->intf_state_mutex){+.+.}-{3:3}:
__lock_acquire+0x2fc7/0x6720
lock_acquire+0x1c1/0x550
__mutex_lock+0x12c/0x14b0
mlx5_init_one+0x2e/0x490 [mlx5_core]
mlx5_sf_dev_probe+0x29c/0x370 [mlx5_core]
auxiliary_bus_probe+0x9d/0xe0
really_probe+0x1e0/0xaa0
__driver_probe_device+0x219/0x480
driver_probe_device+0x49/0x130
__device_attach_driver+0x1b8/0x280
bus_for_each_drv+0x123/0x1a0
__device_attach+0x1a3/0x460
bus_probe_device+0x1a2/0x260
device_add+0x9b1/0x1b40
__auxiliary_device_add+0x88/0xc0
mlx5_sf_dev_state_change_handler+0x67e/0x9d0 [mlx5_core]
blocking_notifier_call_chain+0xd5/0x130
mlx5_vhca_state_work_handler+0x2b0/0x3f0 [mlx5_core]
process_one_work+0x7c2/0x1340
worker_thread+0x59d/0xec0
kthread+0x28f/0x330
ret_from_fork+0x1f/0x30other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&(¬ifier->n_head)->rwsem);
lock(&dev->intf_state_mutex);
lock(&(¬ifier->n_head)->rwsem); lock(&dev->intf_state_mutex);
*** DEADLOCK ***
4 locks held by kworker/u20:0/8:
#0: ffff888150612938 ((wq_completion)mlx5_events){+.+.}-{0:0}, at: process_one_work+0x6e2/0x1340 #1: ffff888100cafdb8 ((work_completion)(&work->work)#3){+.+.}-{0:0}, at: process_one_work+0x70f/0x1340 #2: ffff888101aa7898 (&(¬ifier->n_head)->rwsem){++++}-{3:3}, at: blocking_notifier_call_chain+0x5a/0x130 #3: ffff88813682d0e8 (&dev->mutex){....}-{3:3}, at:__device_attach+0x76/0x460
stack backtrace: CPU: 6 PID: 8 Comm: kworker/u20:0 Not tainted 5.19.0-rc8+ Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Workqueue: mlx5_events mlx5_vhca_state_work_handler [mlx5_core] Call Trace: <TASK> dump_stack_lvl+0x57/0x7d check_noncircular+0x278/0x300 ? print_circular_bug+0x460/0x460 ? lock_chain_count+0x20/0x20 ? register_lock_class+0x1880/0x1880 __lock_acquire+0x2fc7/0x6720 ? register_lock_class+0x1880/0x1880 ? register_lock_class+0x1880/0x1880 lock_acquire+0x1c1/0x550 ? mlx5_init_one+0x2e/0x490 [mlx5_core] ? lockdep_hardirqs_on_prepare+0x400/0x400 __mutex_lock+0x12c/0x14b0 ? mlx5_init_one+0x2e/0x490 [mlx5_core] ? mlx5_init_one+0x2e/0x490 [mlx5_core] ? _raw_read_unlock+0x1f/0x30 ? mutex_lock_io_nested+0x1320/0x1320 ? __ioremap_caller.constprop.0+0x306/0x490 ? mlx5_sf_dev_probe+0x269/0x370 [mlx5_core] ? iounmap+0x160/0x160 mlx5_init_one+0x2e/0x490 [mlx5_core] mlx5_sf_dev_probe+0x29c/0x370 [mlx5_core] ? mlx5_sf_dev_remove+0x130/0x130 [mlx5_core] auxiliary_bus_probe+0x9d/0xe0 really_probe+0x1e0/0xaa0 __driver_probe_device+0x219/0x480 ? auxiliary_match_id+0xe9/0x140 driver_probe_device+0x49/0x130 __device_attach_driver+0x1b8/0x280 ? driver_allows_async_probing+0x140/0x140 bus_for_each_drv+0x123/0x1a0 ? bus_for_each_dev+0x1a0/0x1a0 ? lockdep_hardirqs_on_prepare+0x286/0x400 ? trace_hardirqs_on+0x2d/0x100 __device_attach+0x1a3/0x460 ? device_driver_attach+0x1e0/0x1e0 ? kobject_uevent_env+0x22d/0xf10 bus_probe_device+0x1a2/0x260 device_add+0x9b1/0x1b40 ? dev_set_name+0xab/0xe0 ? __fw_devlink_link_to_suppliers+0x260/0x260 ? memset+0x20/0x40 ? lockdep_init_map_type+0x21a/0x7d0 __auxiliary_device_add+0x88/0xc0 ? auxiliary_device_init+0x86/0xa0 mlx5_sf_dev_state_change_handler+0x67e/0x9d0 [mlx5_core] blocking_notifier_call_chain+0xd5/0x130 mlx5_vhca_state_work_handler+0x2b0/0x3f0 [mlx5_core] ? mlx5_vhca_event_arm+0x100/0x100 [mlx5_core] ? lock_downgrade+0x6e0/0x6e0 ? lockdep_hardirqs_on_prepare+0x286/0x400 process_one_work+0x7c2/0x1340 ? lockdep_hardirqs_on_prepare+0x400/0x400 ? pwq_dec_nr_in_flight+0x230/0x230 ? rwlock_bug.part.0+0x90/0x90 worker_thread+0x59d/0xec0 ? process_one_work+0x1340/0x1340 kthread+0x28f/0x330 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork+0x1f/0x30 </TASK>
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 ++++ include/linux/mlx5/driver.h | 1 + 2 files changed, 5 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/main.c +4 -0
@@ -1427,7 +1427,9 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)memcpy (&dev->profile, &profile[profile_idx],sizeof (dev->profile));INIT_LIST_HEAD (&priv->ctx_list);spin_lock_init (&priv->ctx_lock); +lockdep_register_key (&dev->lock_key);mutex_init (&dev->intf_state_mutex); +lockdep_set_class (&dev->intf_state_mutex, &dev->lock_key);mutex_init (&priv->bfregs.reg_head.lock);mutex_init (&priv->bfregs.wc_head.lock);
@@ -1474,6 +1476,7 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)mutex_destroy (&priv->bfregs.wc_head.lock);mutex_destroy (&priv->bfregs.reg_head.lock);mutex_destroy (&dev->intf_state_mutex); +lockdep_unregister_key (&dev->lock_key);return err; }
@@ -1491,6 +1494,7 @@ void mlx5_mdev_uninit(struct mlx5_core_dev *dev)mutex_destroy (&priv->bfregs.wc_head.lock);mutex_destroy (&priv->bfregs.reg_head.lock);mutex_destroy (&dev->intf_state_mutex); +lockdep_unregister_key (&dev->lock_key); }static int probe_one (struct pci_dev *pdev,const struct pci_device_id *id)
include/linux/mlx5/driver.h +1 -0
@@ -759,6 +759,7 @@ struct mlx5_core_dev {enum mlx5_device_state state;/* sync interface state */ struct mutex intf_state_mutex; +struct lock_class_key lock_key;unsigned long intf_state;struct mlx5_priv priv;struct mlx5_profile profile;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/136 net/mlx5e: Fix wrong application of the LRO state
In reply to Greg Kroah-HartmanFrom: Aya Levin <[email protected]>
[ Upstream commit 7b3707fc79044871ab8f3d5fa5e9603155bb5577 ]
Driver caches packet merge type in mlx5e_params instance which must be in perfect sync with the netdev_feature's bit.
Prior to this patch, in certain conditions (*) LRO state was set in mlx5e_params, while netdev_feature's bit was off. Causing the LRO to be applied on the RQs (HW level).
(*) This can happen only on profile init (mlx5e_build_nic_params()), when RQ expect non-linear SKB and PCI is fast enough in comparison to link width.
Solution: remove setting of packet merge type from mlx5e_build_nic_params() as netdev features are not updated.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 8 -------- 1 file changed, 8 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +0 -8
@@ -4350,14 +4350,6 @@ void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16/* RQ */ mlx5e_build_rq_params (mdev, params); -/* HW LRO */ -if (MLX5_CAP_ETH (mdev, lro_cap) && - params->rq_wq_type ==MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ ) { -/* No XSK params: checking the availability of striding RQ in general. */ -if (!mlx5e_rx_mpwqe_is_linear_skb (mdev, params,NULL )) - params->packet_merge.type =slow_pci_heuristic (mdev) ? -MLX5E_PACKET_MERGE_NONE :MLX5E_PACKET_MERGE_LRO ; - } params->packet_merge.timeout =mlx5e_choose_lro_timeout (mdev,MLX5E_DEFAULT_LRO_TIMEOUT );/* CQ moderation params */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/136 net/mlx5e: Fix wrong tc flag used when set hw-tc-offload off
In reply to Greg Kroah-HartmanFrom: Maor Dickman <[email protected]>
[ Upstream commit 550f96432e6f6770efdaee0e65239d61431062a1 ]
The cited commit reintroduced the ability to set hw-tc-offload in switchdev mode by reusing NIC mode calls without modifying it to support both modes, this can cause an illegal memory access when trying to turn hw-tc-offload off.
Fix this by using the right TC_FLAG when checking if tc rules are installed while disabling hw-tc-offload.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +3 -1
@@ -3325,7 +3325,9 @@ static int set_feature_hw_tc(struct net_device *netdev, bool enable)struct mlx5e_priv *priv =netdev_priv (netdev);#if IS_ENABLED (CONFIG_MLX5_CLS_ACT ) -if (!enable &&mlx5e_tc_num_filters (priv,MLX5_TC_FLAG (NIC_OFFLOAD ))) { +int tc_flag =mlx5e_is_uplink_rep (priv) ?MLX5_TC_FLAG (ESW_OFFLOAD ) : +MLX5_TC_FLAG (NIC_OFFLOAD ); +if (!enable &&mlx5e_tc_num_filters (priv, tc_flag)) {netdev_err (netdev,"Active offloaded tc filters, can't turn hw_tc_offload off\n" );return -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/136 net: ipa: dont assume SMEM is page-aligned
In reply to Greg Kroah-HartmanFrom: Alex Elder <[email protected]>
[ Upstream commit b8d4380365c515d8e0351f2f46d371738dd19be1 ]
In ipa_smem_init(), a Qualcomm SMEM region is allocated (if needed) and then its virtual address is fetched using qcom_smem_get(). The physical address associated with that region is also fetched.
The physical address is adjusted so that it is page-aligned, and an attempt is made to update the size of the region to compensate for any non-zero adjustment.
But that adjustment isn't done properly. The physical address is aligned twice, and as a result the size is never actually adjusted.
Fix this by *not* aligning the "addr" local variable, and instead making the "phys" local variable be the adjusted "addr" value.
--- drivers/net/ipa/ipa_mem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ipa/ipa_mem.c +1 -1
@@ -570,7 +570,7 @@ static int ipa_smem_init(struct ipa *ipa, u32 item, size_t size) }/* Align the address down and the size up to a page boundary */ - addr =qcom_smem_virt_to_phys (virt) &PAGE_MASK ; + addr =qcom_smem_virt_to_phys (virt); phys = addr &PAGE_MASK ; size =PAGE_ALIGN (size + addr - phys); iova = phys;/* We just want a direct mapping */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/136 net: phy: Dont WARN for PHY_READY state in mdio_bus_phy_resume()
In reply to Greg Kroah-HartmanFrom: Xiaolei Wang <[email protected]>
[ Upstream commit 6dbe852c379ff032a70a6b13a91914918c82cb07 ]
For some MAC drivers, they set the mac_managed_pm to true in its ->ndo_open() callback. So before the mac_managed_pm is set to true, we still want to leverage the mdio_bus_phy_suspend()/resume() for the phy device suspend and resume. In this case, the phy device is in PHY_READY, and we shouldn't warn about this. It also seems that the check of mac_managed_pm in WARN_ON is redundant since we already check this in the entry of mdio_bus_phy_resume(), so drop it.
--- drivers/net/phy/phy_device.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/phy/phy_device.c +4 -4
@@ -315,11 +315,11 @@ static __maybe_unused int mdio_bus_phy_resume(struct device *dev) phydev->suspended_by_mdio_bus =0 ; -/* If we managed to get here with the PHY state machine in a state other -* than PHY_HALTED this is an indication that something went wrong and -* we should most likely be using MAC managed PM and we are not. +/* If we manged to get here with the PHY state machine in a state neither +* PHY_HALTED nor PHY_READY this is an indication that something went wrong +* and we should most likely be using MAC managed PM and we are not. */ -WARN_ON (phydev->state !=PHY_HALTED && !phydev->mac_managed_pm); +WARN_ON (phydev->state !=PHY_HALTED && phydev->state !=PHY_READY ); ret =phy_init_hw (phydev);if (ret <0 )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/136 net: moxa: get rid of asymmetry in DMA mapping/unmapping
In reply to Greg Kroah-HartmanFrom: Sergei Antonov <[email protected]>
[ Upstream commit 0ee7828dfc56e97d71e51e6374dc7b4eb2b6e081 ]
Since priv->rx_mapping[i] is maped in moxart_mac_open(), we should unmap it from moxart_mac_stop(). Fixes 2 warnings.
1. During error unwinding in moxart_mac_probe(): "goto init_fail;", then moxart_mac_free_memory() calls dma_unmap_single() with priv->rx_mapping[i] pointers zeroed.
WARNING: CPU: 0 PID: 1 at kernel/dma/debug.c:963 check_unmap+0x704/0x980 DMA-API: moxart-ethernet 92000000.mac: device driver tries to free DMA memory it has not allocated [device address=0x0000000000000000] [size=1600 bytes] CPU: 0 PID: 1 Comm: swapper Not tainted 5.19.0+ #60 Hardware name: Generic DT based system unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x34/0x44 dump_stack_lvl from __warn+0xbc/0x1f0 __warn from warn_slowpath_fmt+0x94/0xc8 warn_slowpath_fmt from check_unmap+0x704/0x980 check_unmap from debug_dma_unmap_page+0x8c/0x9c debug_dma_unmap_page from moxart_mac_free_memory+0x3c/0xa8 moxart_mac_free_memory from moxart_mac_probe+0x190/0x218 moxart_mac_probe from platform_probe+0x48/0x88 platform_probe from really_probe+0xc0/0x2e4
2. After commands:
ip link set dev eth0 down
ip link set dev eth0 up
WARNING: CPU: 0 PID: 55 at kernel/dma/debug.c:570 add_dma_entry+0x204/0x2ec DMA-API: moxart-ethernet 92000000.mac: cacheline tracking EEXIST, overlapping mappings aren't supported CPU: 0 PID: 55 Comm: ip Not tainted 5.19.0+ #57 Hardware name: Generic DT based system unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x34/0x44 dump_stack_lvl from __warn+0xbc/0x1f0 __warn from warn_slowpath_fmt+0x94/0xc8 warn_slowpath_fmt from add_dma_entry+0x204/0x2ec add_dma_entry from dma_map_page_attrs+0x110/0x328 dma_map_page_attrs from moxart_mac_open+0x134/0x320 moxart_mac_open from __dev_open+0x11c/0x1ec __dev_open from __dev_change_flags+0x194/0x22c __dev_change_flags from dev_change_flags+0x14/0x44 dev_change_flags from devinet_ioctl+0x6d4/0x93c devinet_ioctl from inet_ioctl+0x1ac/0x25c
v1 -> v2:
Extraneous change removed.
--- drivers/net/ethernet/moxa/moxart_ether.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/net/ethernet/moxa/moxart_ether.c +6 -5
@@ -74,11 +74,6 @@ static int moxart_set_mac_address(struct net_device *ndev, void *addr)static void moxart_mac_free_memory (struct net_device *ndev) {struct moxart_mac_priv_t *priv =netdev_priv (ndev); -int i; - -for (i =0 ; i <RX_DESC_NUM ; i++) -dma_unmap_single (&priv->pdev->dev, priv->rx_mapping[i], - priv->rx_buf_size,DMA_FROM_DEVICE );if (priv->tx_desc_base) dma_free_coherent(&priv->pdev->dev,
@@ -193,6 +188,7 @@ static int moxart_mac_open(struct net_device *ndev)static int moxart_mac_stop (struct net_device *ndev) {struct moxart_mac_priv_t *priv =netdev_priv (ndev); +int i;napi_disable (&priv->napi);
@@ -204,6 +200,11 @@ static int moxart_mac_stop(struct net_device *ndev)/* disable all functions */ writel (0 , priv->base +REG_MAC_CTRL ); +/* unmap areas mapped in moxart_mac_setup_desc_ring() */ +for (i =0 ; i <RX_DESC_NUM ; i++) +dma_unmap_single (&priv->pdev->dev, priv->rx_mapping[i], + priv->rx_buf_size,DMA_FROM_DEVICE ); +return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/136 bonding: 802.3ad: fix no transmission of LACPDUs
In reply to Greg Kroah-HartmanFrom: Jonathan Toppins <[email protected]>
[ Upstream commit d745b5062ad2b5da90a5e728d7ca884fc07315fd ]
This is caused by the global variable ad_ticks_per_sec being zero as demonstrated by the reproducer script discussed below. This causes all timer values in __ad_timer_to_ticks to be zero, resulting in the periodic timer to never fire.
To reproduce:
Run the script in tools/testing/selftests/drivers/net/bonding/bond-break-lacpdu-tx.sh which puts bonding into a state where it never transmits LACPDUs.
line 44: ip link add fbond type bond mode 4 miimon 200 \
xmit_hash_policy 1 ad_actor_sys_prio 65535 lacp_rate fast
setting bond param: ad_actor_sys_prio
given:
params.ad_actor_system = 0
call stack:
bond_option_ad_actor_sys_prio()
-> bond_3ad_update_ad_actor_settings()
-> set ad.system.sys_priority = bond->params.ad_actor_sys_prio
-> ad.system.sys_mac_addr = bond->dev->dev_addr; because
params.ad_actor_system == 0
results:
ad.system.sys_mac_addr = bond->dev->dev_addrline 48: ip link set fbond address 52:54:00:3B:7C:A6 setting bond MAC addr
call stack:
bond->dev->dev_addr = new_mac
line 52: ip link set fbond type bond ad_actor_sys_prio 65535 setting bond param: ad_actor_sys_prio
given:
params.ad_actor_system = 0
call stack:
bond_option_ad_actor_sys_prio()
-> bond_3ad_update_ad_actor_settings()
-> set ad.system.sys_priority = bond->params.ad_actor_sys_prio
-> ad.system.sys_mac_addr = bond->dev->dev_addr; because
params.ad_actor_system == 0
results:
ad.system.sys_mac_addr = bond->dev->dev_addrline 60: ip link set veth1-bond down master fbond
given:
params.ad_actor_system = 0
params.mode = BOND_MODE_8023AD
ad.system.sys_mac_addr == bond->dev->dev_addr
call stack:
bond_enslave
-> bond_3ad_initialize(); because first slave
-> if ad.system.sys_mac_addr != bond->dev->dev_addr
returnresults:
Nothing is run in bond_3ad_initialize() because dev_addr equals sys_mac_addr leaving the global ad_ticks_per_sec zero as it is never initialized anywhere else.
The if check around the contents of bond_3ad_initialize() is no longer needed due to commit 5ee14e6d336f ("bonding: 3ad: apply ad_actor settings changes immediately") which sets ad.system.sys_mac_addr if any one of the bonding parameters whos set function calls bond_3ad_update_ad_actor_settings(). This is because if ad.system.sys_mac_addr is zero it will be set to the current bond mac address, this causes the if check to never be true.
--- drivers/net/bonding/bond_3ad.c | 38 ++++++++++++++-------------------- 1 file changed, 16 insertions(+), 22 deletions(-)
drivers/net/bonding/bond_3ad.c +16 -22
@@ -2007,30 +2007,24 @@ void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)*/ void bond_3ad_initialize (struct bonding *bond,u16 tick_resolution) { -/* check that the bond is not initialized yet */ -if (!MAC_ADDRESS_EQUAL (&(BOND_AD_INFO (bond).system.sys_mac_addr), - bond->dev->dev_addr)) { - -BOND_AD_INFO (bond).aggregator_identifier =0 ; - -BOND_AD_INFO (bond).system.sys_priority = - bond->params.ad_actor_sys_prio; -if (is_zero_ether_addr (bond->params.ad_actor_system)) -BOND_AD_INFO (bond).system.sys_mac_addr = - *((struct mac_addr *)bond->dev->dev_addr); -else -BOND_AD_INFO (bond).system.sys_mac_addr = - *((struct mac_addr *)bond->params.ad_actor_system); +BOND_AD_INFO (bond).aggregator_identifier =0 ; +BOND_AD_INFO (bond).system.sys_priority = + bond->params.ad_actor_sys_prio; +if (is_zero_ether_addr (bond->params.ad_actor_system)) +BOND_AD_INFO (bond).system.sys_mac_addr = + *((struct mac_addr *)bond->dev->dev_addr); +else +BOND_AD_INFO (bond).system.sys_mac_addr = + *((struct mac_addr *)bond->params.ad_actor_system); -/* initialize how many times this module is called in one -* second (should be about every 100ms) -*/ - ad_ticks_per_sec = tick_resolution; +/* initialize how many times this module is called in one +* second (should be about every 100ms) +*/ + ad_ticks_per_sec = tick_resolution; -bond_3ad_initiate_agg_selection (bond, -AD_AGGREGATOR_SELECTION_TIMER * - ad_ticks_per_sec); - } +bond_3ad_initiate_agg_selection (bond, +AD_AGGREGATOR_SELECTION_TIMER * + ad_ticks_per_sec); }/**
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/136 net: ipvtap - add __init/__exit annotations to module init/exit funcs
In reply to Greg Kroah-HartmanFrom: Maciej Żenczykowski <[email protected]>
[ Upstream commit 4b2e3a17e9f279325712b79fb01d1493f9e3e005 ]
Looks to have been left out in an oversight.
--- drivers/net/ipvlan/ipvtap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ipvlan/ipvtap.c +2 -2
@@ -194,7 +194,7 @@ static struct notifier_block ipvtap_notifier_block __read_mostly = { .notifier_call = ipvtap_device_event, }; -static int ipvtap_init (void ) +static int __init ipvtap_init (void ) {int err;
@@ -228,7 +228,7 @@ static int ipvtap_init(void) }module_init (ipvtap_init); -static void ipvtap_exit (void ) +static void __exit ipvtap_exit(void) {rtnl_link_unregister (&ipvtap_link_ops);unregister_netdevice_notifier (&ipvtap_notifier_block);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/136 netfilter: ebtables: reject blobs that dont provide all entry points
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 7997eff82828304b780dc0a39707e1946d6f1ebf ]
Harshit Mogalapalli says:
In ebt_do_table() function dereferencing 'private->hook_entry[hook]' can lead to NULL pointer dereference. [..] Kernel panic:
general protection fault, probably for non-canonical address 0xdffffc0000000005: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f] [..] RIP: 0010:ebt_do_table+0x1dc/0x1ce0 Code: 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 5c 16 00 00 48 b8 00 00 00 00 00 fc ff df 49 8b 6c df 08 48 8d 7d 2c 48 89 fa 48 c1 ea 03 <0f> b6 14 02 48 89 f8 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 88 [..] Call Trace: nf_hook_slow+0xb1/0x170 __br_forward+0x289/0x730 maybe_deliver+0x24b/0x380 br_flood+0xc6/0x390 br_dev_xmit+0xa2e/0x12c0
For some reason ebtables rejects blobs that provide entry points that are not supported by the table, but what it should instead reject is the
opposite: blobs that DO NOT provide an entry point supported by the table.
t->valid_hooks is the bitmask of hooks (input, forward ...) that will see packets. Providing an entry point that is not support is harmless (never called/used), but the inverse isn't: it results in a crash because the ebtables traverser doesn't expect a NULL blob for a location its receiving packets for.
Instead of fixing all the individual checks, do what iptables is doing and reject all blobs that differ from the expected hooks.
--- include/linux/netfilter_bridge/ebtables.h | 4 ---- net/bridge/netfilter/ebtable_broute.c | 8 -------- net/bridge/netfilter/ebtable_filter.c | 8 -------- net/bridge/netfilter/ebtable_nat.c | 8 -------- net/bridge/netfilter/ebtables.c | 8 +------- 5 files changed, 1 insertion(+), 35 deletions(-)
include/linux/netfilter_bridge/ebtables.h +0 -4
@@ -94,10 +94,6 @@ struct ebt_table {struct ebt_replace_kernel *table;unsigned int valid_hooks;rwlock_t lock; -/* e.g. could be the table explicitly only allows certain -* matches, targets, ... 0 == let it in */ -int (*check)(const struct ebt_table_info *info, -unsigned int valid_hooks);/* the data used by the kernel */ struct ebt_table_info *private;struct nf_hook_ops *ops;
net/bridge/netfilter/ebtable_broute.c +0 -8
@@ -36,18 +36,10 @@ static struct ebt_replace_kernel initial_table = { .entries = (char *)&initial_chain, }; -static int check (const struct ebt_table_info *info,unsigned int valid_hooks) -{ -if (valid_hooks & ~(1 <<NF_BR_BROUTING )) -return -EINVAL ; -return 0 ; -} -static const struct ebt_table broute_table = { .name ="broute" , .table = &initial_table, .valid_hooks =1 <<NF_BR_BROUTING , - .check = check, .me =THIS_MODULE , };
net/bridge/netfilter/ebtable_filter.c +0 -8
@@ -43,18 +43,10 @@ static struct ebt_replace_kernel initial_table = { .entries = (char *)initial_chains, }; -static int check (const struct ebt_table_info *info,unsigned int valid_hooks) -{ -if (valid_hooks & ~FILTER_VALID_HOOKS ) -return -EINVAL ; -return 0 ; -} -static const struct ebt_table frame_filter = { .name ="filter" , .table = &initial_table, .valid_hooks =FILTER_VALID_HOOKS , - .check = check, .me =THIS_MODULE , };
net/bridge/netfilter/ebtable_nat.c +0 -8
@@ -43,18 +43,10 @@ static struct ebt_replace_kernel initial_table = { .entries = (char *)initial_chains, }; -static int check (const struct ebt_table_info *info,unsigned int valid_hooks) -{ -if (valid_hooks & ~NAT_VALID_HOOKS ) -return -EINVAL ; -return 0 ; -} -static const struct ebt_table frame_nat = { .name ="nat" , .table = &initial_table, .valid_hooks =NAT_VALID_HOOKS , - .check = check, .me =THIS_MODULE , };
net/bridge/netfilter/ebtables.c +1 -7
@@ -1040,8 +1040,7 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl, goto free_iterate; } -/* the table doesn't like it */ -if (t->check && (ret = t->check (newinfo, repl->valid_hooks))) +if (repl->valid_hooks != t->valid_hooks) goto free_unlock;if (repl->num_counters && repl->num_counters != t->private->nentries) {
@@ -1231,11 +1230,6 @@ int ebt_register_table(struct net *net, const struct ebt_table *input_table,if (ret !=0 ) goto free_chainstack; -if (table->check && table->check (newinfo, table->valid_hooks)) { - ret = -EINVAL ; - goto free_chainstack; - } - table->private = newinfo;rwlock_init (&table->lock);mutex_lock (&ebt_mutex);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/136 bnxt_en: fix NQ resource accounting during vf creation on 57500 chips
In reply to Greg Kroah-HartmanFrom: Vikas Gupta <[email protected]>
[ Upstream commit 09a89cc59ad67794a11e1d3dd13c5b3172adcc51 ]
There are 2 issues:
1. We should decrement hw_resc->max_nqs instead of hw_resc->max_irqs with the number of NQs assigned to the VFs. The IRQs are fixed on each function and cannot be re-assigned. Only the NQs are being assigned to the VFs.
2. vf_msix is the total number of NQs to be assigned to the VFs. So we should decrement vf_msix from hw_resc->max_nqs.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +1 -1
@@ -623,7 +623,7 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs, bool reset) hw_resc->max_stat_ctxs -=le16_to_cpu (req->min_stat_ctx) * n; hw_resc->max_vnics -=le16_to_cpu (req->min_vnics) * n;if (bp->flags &BNXT_FLAG_CHIP_P5 ) - hw_resc->max_irqs -= vf_msix * n; + hw_resc->max_nqs -= vf_msix; rc = pf->active_vfs; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/136 netfilter: nf_tables: disallow updates of implicit chain
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 5dc52d83baac30decf5f3b371d5eb41dfa1d1412 ]
Updates on existing implicit chain make no sense, disallow this.
--- net/netfilter/nf_tables_api.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/nf_tables_api.c +3 -0
@@ -2479,6 +2479,9 @@ static int nf_tables_newchain(struct sk_buff *skb, const struct nfnl_info *info,nft_ctx_init (&ctx, net, skb, info->nlh, family, table, chain, nla);if (chain !=NULL ) { +if (chain->flags &NFT_CHAIN_BINDING ) +return -EINVAL ; +if (info->nlh->nlmsg_flags &NLM_F_EXCL ) {NL_SET_BAD_ATTR (extack, attr);return -EEXIST ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/136 netfilter: nf_tables: make table handle allocation per-netns friendly
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit ab482c6b66a4a8c0a8c0b0f577a785cf9ff1c2e2 ]
mutex is per-netns, move table_netns to the pernet area.
*read-write* to 0xffffffff883a01e8 of 8 bytes by task 6542 on cpu 0:
nf_tables_newtable+0x6dc/0xc00 net/netfilter/nf_tables_api.c:1221 nfnetlink_rcv_batch net/netfilter/nfnetlink.c:513 [inline] nfnetlink_rcv_skb_batch net/netfilter/nfnetlink.c:634 [inline] nfnetlink_rcv+0xa6a/0x13a0 net/netfilter/nfnetlink.c:652 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x652/0x730 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x643/0x740 net/netlink/af_netlink.c:1921
--- include/net/netfilter/nf_tables.h | 1 + net/netfilter/nf_tables_api.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/netfilter/nf_tables.h +1 -0
@@ -1595,6 +1595,7 @@ struct nftables_pernet {struct list_head module_list;struct list_head notify_list;struct mutex commit_mutex; +u64 table_handle;unsigned int base_seq;u8 validate_state; };
net/netfilter/nf_tables_api.c +1 -2
@@ -32,7 +32,6 @@ static LIST_HEAD(nf_tables_objects);static LIST_HEAD (nf_tables_flowtables);static LIST_HEAD (nf_tables_destroy_list);static DEFINE_SPINLOCK (nf_tables_destroy_list_lock); -static u64 table_handle;enum {NFT_VALIDATE_SKIP =0 ,
@@ -1156,7 +1155,7 @@ static int nf_tables_newtable(struct sk_buff *skb, const struct nfnl_info *info,INIT_LIST_HEAD (&table->flowtables); table->family = family; table->flags = flags; - table->handle = ++table_handle; + table->handle = ++nft_net->table_handle;if (table->flags &NFT_TABLE_F_OWNER ) table->nlpid =NETLINK_CB (skb).portid;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/136 netfilter: nft_payload: report ERANGE for too long offset and length
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 94254f990c07e9ddf1634e0b727fab821c3b5bf9 ]
Instead of offset and length are truncation to u8, report ERANGE.
--- net/netfilter/nft_payload.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
net/netfilter/nft_payload.c +8 -2
@@ -785,6 +785,7 @@ nft_payload_select_ops(const struct nft_ctx *ctx, {enum nft_payload_bases base;unsigned int offset, len; +int err; if (tb[NFTA_PAYLOAD_BASE] == NULL || tb[NFTA_PAYLOAD_OFFSET] == NULL ||
@@ -811,8 +812,13 @@ nft_payload_select_ops(const struct nft_ctx *ctx,if (tb[NFTA_PAYLOAD_DREG ] ==NULL )return ERR_PTR (-EINVAL ); - offset =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_OFFSET ])); - len =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_LEN ])); + err =nft_parse_u32_check (tb[NFTA_PAYLOAD_OFFSET ],U8_MAX , &offset); +if (err <0 ) +return ERR_PTR (err); + + err =nft_parse_u32_check (tb[NFTA_PAYLOAD_LEN ],U8_MAX , &len); +if (err <0 ) +return ERR_PTR (err);if (len <=4 &&is_power_of_2 (len) &&IS_ALIGNED (offset, len) && base !=NFT_PAYLOAD_LL_HEADER && base !=NFT_PAYLOAD_INNER_HEADER )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/136 netfilter: nft_payload: do not truncate csum_offset and csum_type
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 7044ab281febae9e2fa9b0b247693d6026166293 ]
Instead report ERANGE if csum_offset is too long, and EOPNOTSUPP if type is not support.
--- net/netfilter/nft_payload.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
net/netfilter/nft_payload.c +13 -6
@@ -712,17 +712,23 @@ static int nft_payload_set_init(const struct nft_ctx *ctx, const struct nlattr * const tb[]) {struct nft_payload_set *priv =nft_expr_priv (expr); +u32 csum_offset, csum_type =NFT_PAYLOAD_CSUM_NONE ; +int err; priv->base =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_BASE ])); priv->offset =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_OFFSET ])); priv->len =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_LEN ]));if (tb[NFTA_PAYLOAD_CSUM_TYPE ]) - priv->csum_type = -ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_CSUM_TYPE ])); -if (tb[NFTA_PAYLOAD_CSUM_OFFSET ]) - priv->csum_offset = -ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_CSUM_OFFSET ])); + csum_type =ntohl (nla_get_be32 (tb[NFTA_PAYLOAD_CSUM_TYPE ])); +if (tb[NFTA_PAYLOAD_CSUM_OFFSET ]) { + err =nft_parse_u32_check (tb[NFTA_PAYLOAD_CSUM_OFFSET ],U8_MAX , + &csum_offset); +if (err <0 ) +return err; + + priv->csum_offset = csum_offset; + }if (tb[NFTA_PAYLOAD_CSUM_FLAGS ]) {u32 flags;
@@ -733,7 +739,7 @@ static int nft_payload_set_init(const struct nft_ctx *ctx, priv->csum_flags = flags; } -switch (priv->csum_type) { +switch (csum_type) {case NFT_PAYLOAD_CSUM_NONE :case NFT_PAYLOAD_CSUM_INET :break ;
@@ -747,6 +753,7 @@ static int nft_payload_set_init(const struct nft_ctx *ctx,default :return -EOPNOTSUPP ; } + priv->csum_type = csum_type;return nft_parse_register_load (tb[NFTA_PAYLOAD_SREG ], &priv->sreg, priv->len);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/136 netfilter: nf_tables: do not leave chain stats enabled on error
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 43eb8949cfdffa764b92bc6c54b87cbe5b0003fe ]
Error might occur later in the nf_tables_addchain() codepath, enable static key only after transaction has been created.
--- net/netfilter/nf_tables_api.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +4 -2
@@ -2101,9 +2101,9 @@ static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, struct netlink_ext_ack *extack) {const struct nlattr *const *nla = ctx->nla; +struct nft_stats __percpu *stats =NULL ;struct nft_table *table = ctx->table;struct nft_base_chain *basechain; -struct nft_stats __percpu *stats;struct net *net = ctx->net;char name[NFT_NAME_MAXLEN ];struct nft_trans *trans;
@@ -2140,7 +2140,6 @@ static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask,return PTR_ERR (stats); }rcu_assign_pointer (basechain->stats, stats); -static_branch_inc (&nft_counters_enabled); } err =nft_basechain_init (basechain, family, &hook, flags);
@@ -2223,6 +2222,9 @@ static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, goto err_unregister_hook; } +if (stats) +static_branch_inc (&nft_counters_enabled); + table->use++;return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/136 netfilter: nft_osf: restrict osf to ipv4, ipv6 and inet families
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 5f3b7aae14a706d0d7da9f9e39def52ff5fc3d39 ]
As it was originally intended, restrict extension to supported families.
--- net/netfilter/nft_osf.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
net/netfilter/nft_osf.c +15 -3
@@ -115,9 +115,21 @@ static int nft_osf_validate(const struct nft_ctx *ctx,const struct nft_expr *expr, const struct nft_data **data) { - return nft_chain_validate_hooks(ctx->chain, (1 << NF_INET_LOCAL_IN) | - (1 << NF_INET_PRE_ROUTING) | - (1 << NF_INET_FORWARD)); + unsigned int hooks; + +switch (ctx->family) { +case NFPROTO_IPV4 : +case NFPROTO_IPV6 : +case NFPROTO_INET : + hooks = (1 <<NF_INET_LOCAL_IN ) | + (1 <<NF_INET_PRE_ROUTING ) | + (1 <<NF_INET_FORWARD ); +break ; +default : +return -EOPNOTSUPP ; + } + +return nft_chain_validate_hooks (ctx->chain, hooks); }static struct nft_expr_type nft_osf_type;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 61/136 netfilter: nft_tunnel: restrict it to netdev family
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 01e4092d53bc4fe122a6e4b6d664adbd57528ca3 ]
Only allow to use this expression from NFPROTO_NETDEV family.
--- net/netfilter/nft_tunnel.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nft_tunnel.c +1 -0
@@ -133,6 +133,7 @@ static const struct nft_expr_ops nft_tunnel_get_ops = {static struct nft_expr_type nft_tunnel_type__read_mostly = { .name ="tunnel" , + .family =NFPROTO_NETDEV , .ops = &nft_tunnel_get_ops, .policy = nft_tunnel_policy, .maxattr =NFTA_TUNNEL_MAX ,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 62/136 netfilter: nf_tables: consolidate rule verdict trace call
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 4765473fefd4403b5eeca371637065b561522c50 ]
Add function to consolidate verdict tracing.
--- net/netfilter/nf_tables_core.c | 39 ++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-)
net/netfilter/nf_tables_core.c +32 -7
@@ -67,6 +67,36 @@ static void nft_cmp_fast_eval(const struct nft_expr *expr, regs->verdict.code =NFT_BREAK ; } +static noinline void __nft_trace_verdict(struct nft_traceinfo *info, +const struct nft_chain *chain, +const struct nft_regs *regs) +{ +enum nft_trace_types type; + +switch (regs->verdict.code) { +case NFT_CONTINUE : +case NFT_RETURN : + type =NFT_TRACETYPE_RETURN ; +break ; +default : + type =NFT_TRACETYPE_RULE ; +break ; + } + +__nft_trace_packet (info, chain, type); +} + +static inline void nft_trace_verdict (struct nft_traceinfo *info, +const struct nft_chain *chain, +const struct nft_rule *rule, +const struct nft_regs *regs) +{ +if (static_branch_unlikely (&nft_trace_enabled)) { + info->rule = rule; +__nft_trace_verdict (info, chain, regs); + } +} +static bool nft_payload_fast_eval (const struct nft_expr *expr,struct nft_regs *regs,const struct nft_pktinfo *pkt)
@@ -207,13 +237,13 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)break ; } +nft_trace_verdict (&info, chain, rule, ®s); +switch (regs.verdict.code &NF_VERDICT_MASK ) {case NF_ACCEPT :case NF_DROP :case NF_QUEUE :case NF_STOLEN : -nft_trace_packet (&info, chain, rule, -NFT_TRACETYPE_RULE );return regs.verdict.code; }
@@ -226,15 +256,10 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv) stackptr++; fallthrough;case NFT_GOTO : -nft_trace_packet (&info, chain, rule, -NFT_TRACETYPE_RULE ); - chain = regs.verdict.chain; goto do_chain;case NFT_CONTINUE :case NFT_RETURN : -nft_trace_packet (&info, chain, rule, -NFT_TRACETYPE_RETURN );break ;default :WARN_ON (1 );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 63/136 netfilter: nft_cmp: optimize comparison for 16-bytes
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 23f68d462984bfda47c7bf663dca347e8e3df549 ]
Allow up to 16-byte comparisons with a new cmp fast version. Use two 64-bit words and calculate the mask representing the bits to be compared. Make sure the comparison is 64-bit aligned and avoid out-of-bound memory access on registers.
--- include/net/netfilter/nf_tables_core.h | 9 +++ net/netfilter/nf_tables_core.c | 16 ++++ net/netfilter/nft_cmp.c | 102 ++++++++++++++++++++++++- 3 files changed, 125 insertions(+), 2 deletions(-)
include/net/netfilter/nf_tables_core.h +9 -0
@@ -40,6 +40,14 @@ struct nft_cmp_fast_expr {bool inv; }; +struct nft_cmp16_fast_expr { +struct nft_data data; +struct nft_data mask; +u8 sreg; +u8 len; +bool inv; +}; +struct nft_immediate_expr {struct nft_data data;u8 dreg;
@@ -57,6 +65,7 @@ static inline u32 nft_cmp_fast_mask(unsigned int len) }extern const struct nft_expr_ops nft_cmp_fast_ops; +extern const struct nft_expr_ops nft_cmp16_fast_ops;struct nft_payload {enum nft_payload_bases base:8 ;
net/netfilter/nf_tables_core.c +16 -0
@@ -67,6 +67,20 @@ static void nft_cmp_fast_eval(const struct nft_expr *expr, regs->verdict.code =NFT_BREAK ; } +static void nft_cmp16_fast_eval (const struct nft_expr *expr, +struct nft_regs *regs) +{ +const struct nft_cmp16_fast_expr *priv =nft_expr_priv (expr); +const u64 *reg_data = (const u64 *)®s->data[priv->sreg]; +const u64 *mask = (const u64 *)&priv->mask; +const u64 *data = (const u64 *)&priv->data; + +if (((reg_data[0 ] & mask[0 ]) == data[0 ] && + ((reg_data[1 ] & mask[1 ]) == data[1 ])) ^ priv->inv) +return ; + regs->verdict.code =NFT_BREAK ; +} + static noinline void __nft_trace_verdict(struct nft_traceinfo *info,const struct nft_chain *chain,const struct nft_regs *regs)
@@ -215,6 +229,8 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)nft_rule_for_each_expr (expr, last, rule) {if (expr->ops == &nft_cmp_fast_ops)nft_cmp_fast_eval (expr, ®s); +else if (expr->ops == &nft_cmp16_fast_ops) +nft_cmp16_fast_eval (expr, ®s);else if (expr->ops == &nft_bitwise_fast_ops)nft_bitwise_fast_eval (expr, ®s); else if (expr->ops != &nft_payload_fast_ops ||
net/netfilter/nft_cmp.c +100 -2
121 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 64/136 netfilter: bitwise: improve error goto labels
In reply to Greg Kroah-HartmanFrom: Jeremy Sowden <[email protected]>
[ Upstream commit 00bd435208e5201eb935d273052930bd3b272b6f ]
Replace two labels (err1 and err2) with more informative ones.
--- net/netfilter/nft_bitwise.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
net/netfilter/nft_bitwise.c +6 -5
@@ -109,22 +109,23 @@ static int nft_bitwise_init_bool(struct nft_bitwise *priv,return err;if (mask.type !=NFT_DATA_VALUE || mask.len != priv->len) { err = -EINVAL ; - goto err1; + goto err_mask_release; } err =nft_data_init (NULL , &priv->xor,sizeof (priv->xor), &xor, tb[NFTA_BITWISE_XOR ]);if (err <0 ) - goto err1; + goto err_mask_release;if (xor.type !=NFT_DATA_VALUE || xor.len != priv->len) { err = -EINVAL ; - goto err2; + goto err_xor_release; }return 0 ; -err2: + +err_xor_release:nft_data_release (&priv->xor, xor.type); -err1: +err_mask_release:nft_data_release (&priv->mask, mask.type);return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 65/136 netfilter: nf_tables: upfront validation of data via nft_data_init()
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 341b6941608762d8235f3fd1e45e4d7114ed8c2c ]
Instead of parsing the data and then validate that type and length are correct, pass a description of the expected data so it can be validated upfront before parsing it to bail out earlier.
This patch adds a new .size field to specify the maximum size of the data area. The .len field is optional and it is used as an input/output field, it provides the specific length of the expected data in the input path. If then .len field is not specified, then obtained length from the netlink attribute is stored. This is required by cmp, bitwise, range and immediate, which provide no netlink attribute that describes the data length. The immediate expression uses the destination register type to infer the expected data type.
Relying on opencoded validation of the expected data might lead to subtle bugs as described in 7e6bc1f6cabc ("netfilter: nf_tables:
stricter validation of element data").
--- include/net/netfilter/nf_tables.h | 4 +- net/netfilter/nf_tables_api.c | 78 ++++++++++++++++--------------- net/netfilter/nft_bitwise.c | 66 +++++++++++++------------- net/netfilter/nft_cmp.c | 44 ++++++++--------- net/netfilter/nft_immediate.c | 22 +++++++-- net/netfilter/nft_range.c | 27 +++++------ 6 files changed, 126 insertions(+), 115 deletions(-)
include/net/netfilter/nf_tables.h +2 -2
@@ -195,11 +195,11 @@ struct nft_ctx {struct nft_data_desc {enum nft_data_types type; +unsigned int size;unsigned int len; }; -int nft_data_init (const struct nft_ctx *ctx, -struct nft_data *data,unsigned int size, +int nft_data_init (const struct nft_ctx *ctx,struct nft_data *data,struct nft_data_desc *desc,const struct nlattr *nla);void nft_data_hold (const struct nft_data *data,enum nft_data_types type);void nft_data_release (const struct nft_data *data,enum nft_data_types type);
net/netfilter/nf_tables_api.c +40 -38
141 lines not on this page · raw message
net/netfilter/nft_bitwise.c +33 -33
112 lines not on this page · raw message
net/netfilter/nft_cmp.c +20 -24
94 lines not on this page · raw message
net/netfilter/nft_immediate.c +19 -3
@@ -29,20 +29,36 @@ static const struct nla_policy nft_immediate_policy[NFTA_IMMEDIATE_MAX + 1] = { [NFTA_IMMEDIATE_DATA] = { .type = NLA_NESTED }, }; +static enum nft_data_types nft_reg_to_type (const struct nlattr *nla) +{ +enum nft_data_types type; +u8 reg; + + reg =ntohl (nla_get_be32 (nla)); +if (reg ==NFT_REG_VERDICT ) + type =NFT_DATA_VERDICT ; +else + type =NFT_DATA_VALUE ; + +return type; +} +static int nft_immediate_init (const struct nft_ctx *ctx,const struct nft_expr *expr,const struct nlattr *const tb[]) {struct nft_immediate_expr *priv =nft_expr_priv (expr); -struct nft_data_desc desc; +struct nft_data_desc desc = { + .size =sizeof (priv->data), + };int err;if (tb[NFTA_IMMEDIATE_DREG ] ==NULL || tb[NFTA_IMMEDIATE_DATA ] ==NULL )return -EINVAL ; - err =nft_data_init (ctx, &priv->data,sizeof (priv->data), &desc, - tb[NFTA_IMMEDIATE_DATA ]); + desc.type =nft_reg_to_type (tb[NFTA_IMMEDIATE_DREG ]); + err =nft_data_init (ctx, &priv->data, &desc, tb[NFTA_IMMEDIATE_DATA ]);if (err <0 )return err;
net/netfilter/nft_range.c +12 -15
@@ -51,7 +51,14 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr const struct nlattr * const tb[]) {struct nft_range_expr *priv =nft_expr_priv (expr); -struct nft_data_desc desc_from, desc_to; +struct nft_data_desc desc_from = { + .type =NFT_DATA_VALUE , + .size =sizeof (priv->data_from), + }; +struct nft_data_desc desc_to = { + .type =NFT_DATA_VALUE , + .size =sizeof (priv->data_to), + };int err;u32 op;
@@ -61,26 +68,16 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr !tb[NFTA_RANGE_TO_DATA])return -EINVAL ; - err =nft_data_init (NULL , &priv->data_from,sizeof (priv->data_from), - &desc_from, tb[NFTA_RANGE_FROM_DATA ]); + err =nft_data_init (NULL , &priv->data_from, &desc_from, + tb[NFTA_RANGE_FROM_DATA ]);if (err <0 )return err; -if (desc_from.type !=NFT_DATA_VALUE ) { - err = -EINVAL ; - goto err1; - } - - err =nft_data_init (NULL , &priv->data_to,sizeof (priv->data_to), - &desc_to, tb[NFTA_RANGE_TO_DATA ]); + err =nft_data_init (NULL , &priv->data_to, &desc_to, + tb[NFTA_RANGE_TO_DATA ]);if (err <0 ) goto err1; -if (desc_to.type !=NFT_DATA_VALUE ) { - err = -EINVAL ; - goto err2; - } -if (desc_from.len != desc_to.len) { err = -EINVAL ; goto err2;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 66/136 netfilter: nf_tables: disallow jump to implicit chain from set element
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit f323ef3a0d49e147365284bc1f02212e617b7f09 ]
Extend struct nft_data_desc to add a flag field that specifies nft_data_init() is being called for set element data.
Use it to disallow jump to implicit chain from set element, only jump to chain via immediate expression is allowed.
--- include/net/netfilter/nf_tables.h | 5 +++++ net/netfilter/nf_tables_api.c | 4 ++++ 2 files changed, 9 insertions(+)
include/net/netfilter/nf_tables.h +5 -0
@@ -193,10 +193,15 @@ struct nft_ctx {bool report; }; +enum nft_data_desc_flags { +NFT_DATA_DESC_SETELEM = (1 <<0 ), +}; +struct nft_data_desc {enum nft_data_types type;unsigned int size;unsigned int len; +unsigned int flags; }; int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data,
net/netfilter/nf_tables_api.c +4 -0
@@ -5144,6 +5144,7 @@ static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set, desc->type = dtype; desc->size =NFT_DATA_VALUE_MAXLEN ; desc->len = set->dlen; + desc->flags =NFT_DATA_DESC_SETELEM ;return nft_data_init (ctx, data, desc, attr); }
@@ -9504,6 +9505,9 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,return PTR_ERR (chain);if (nft_is_base_chain (chain))return -EOPNOTSUPP ; +if (desc->flags &NFT_DATA_DESC_SETELEM && + chain->flags &NFT_CHAIN_BINDING ) +return -EINVAL ; chain->use++; data->verdict.chain = chain;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 67/136 netfilter: nf_tables: disallow binding to already bound chain
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit e02f0d3970404bfea385b6edb86f2d936db0ea2b ]
Update nft_data_init() to report EINVAL if chain is already bound.
--- net/netfilter/nf_tables_api.c | 2 ++ 1 file changed, 2 insertions(+)
net/netfilter/nf_tables_api.c +2 -0
@@ -9505,6 +9505,8 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,return PTR_ERR (chain);if (nft_is_base_chain (chain))return -EOPNOTSUPP ; +if (nft_chain_is_bound (chain)) +return -EINVAL ;if (desc->flags &NFT_DATA_DESC_SETELEM && chain->flags &NFT_CHAIN_BINDING )return -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 68/136 netfilter: flowtable: add function to invoke garbage collection immediately
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 759eebbcfafcefa23b59e912396306543764bd3c ]
Expose nf_flow_table_gc_run() to force a garbage collector run from the offload infrastructure.
--- include/net/netfilter/nf_flow_table.h | 1 + net/netfilter/nf_flow_table_core.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-)
include/net/netfilter/nf_flow_table.h +1 -0
@@ -266,6 +266,7 @@ void flow_offload_refresh(struct nf_flowtable *flow_table,struct flow_offload_tuple_rhash *flow_offload_lookup (struct nf_flowtable *flow_table,struct flow_offload_tuple *tuple); +void nf_flow_table_gc_run (struct nf_flowtable *flow_table);void nf_flow_table_gc_cleanup (struct nf_flowtable *flowtable,struct net_device *dev);void nf_flow_table_cleanup (struct net_device *dev);
net/netfilter/nf_flow_table_core.c +9 -3
@@ -436,12 +436,17 @@ static void nf_flow_offload_gc_step(struct nf_flowtable *flow_table, } } +void nf_flow_table_gc_run (struct nf_flowtable *flow_table) +{ +nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step,NULL ); +} +static void nf_flow_offload_work_gc (struct work_struct *work) {struct nf_flowtable *flow_table; flow_table = container_of(work, struct nf_flowtable, gc_work.work); -nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step,NULL ); +nf_flow_table_gc_run (flow_table);queue_delayed_work (system_power_efficient_wq, &flow_table->gc_work,HZ ); }
@@ -600,10 +605,11 @@ void nf_flow_table_free(struct nf_flowtable *flow_table)cancel_delayed_work_sync (&flow_table->gc_work);nf_flow_table_iterate (flow_table, nf_flow_table_do_cleanup,NULL ); -nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step,NULL ); +nf_flow_table_gc_run (flow_table);nf_flow_table_offload_flush (flow_table);if (nf_flowtable_hw_offload (flow_table)) -nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step,NULL ); +nf_flow_table_gc_run (flow_table); +rhashtable_destroy (&flow_table->rhashtable); }EXPORT_SYMBOL_GPL (nf_flow_table_free);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 69/136 netfilter: flowtable: fix stuck flows on cleanup due to pending work
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 9afb4b27349a499483ae0134282cefd0c90f480f ]
To clear the flow table on flow table free, the following sequence normally happens in order:
1) gc_step work is stopped to disable any further stats/del requests.
2) All flow table entries are set to teardown state.
3) Run gc_step which will queue HW del work for each flow table entry.
4) Waiting for the above del work to finish (flush).
5) Run gc_step again, deleting all entries from the flow table.
6) Flow table is freed.
But if a flow table entry already has pending HW stats or HW add work step 3 will not queue HW del work (it will be skipped), step 4 will wait for the pending add/stats to finish, and step 5 will queue HW del work which might execute after freeing of the flow table.
To fix the above, this patch flushes the pending work, then it sets the teardown flag to all flows in the flowtable and it forces a garbage collector run to queue work to remove the flows from hardware, then it flushes this new pending work and (finally) it forces another garbage collector run to remove the entry from the software flowtable.
Stack trace:
[47773.882335] BUG: KASAN: use-after-free in down_read+0x99/0x460 [47773.883634] Write of size 8 at addr ffff888103b45aa8 by task kworker/u20:6/543704 [47773.885634] CPU: 3 PID: 543704 Comm: kworker/u20:6 Not tainted 5.12.0-rc7+ #2 [47773.886745] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009) [47773.888438] Workqueue: nf_ft_offload_del flow_offload_work_handler [nf_flow_table] [47773.889727] Call Trace: [47773.890214] dump_stack+0xbb/0x107 [47773.890818] print_address_description.constprop.0+0x18/0x140 [47773.892990] kasan_report.cold+0x7c/0xd8 [47773.894459] kasan_check_range+0x145/0x1a0 [47773.895174] down_read+0x99/0x460 [47773.899706] nf_flow_offload_tuple+0x24f/0x3c0 [nf_flow_table] [47773.907137] flow_offload_work_handler+0x72d/0xbe0 [nf_flow_table] [47773.913372] process_one_work+0x8ac/0x14e0 [47773.921325] [47773.921325] Allocated by task 592159: [47773.922031] kasan_save_stack+0x1b/0x40 [47773.922730] __kasan_kmalloc+0x7a/0x90 [47773.923411] tcf_ct_flow_table_get+0x3cb/0x1230 [act_ct] [47773.924363] tcf_ct_init+0x71c/0x1156 [act_ct] [47773.925207] tcf_action_init_1+0x45b/0x700 [47773.925987] tcf_action_init+0x453/0x6b0 [47773.926692] tcf_exts_validate+0x3d0/0x600 [47773.927419] fl_change+0x757/0x4a51 [cls_flower] [47773.928227] tc_new_tfilter+0x89a/0x2070 [47773.936652] [47773.936652] Freed by task 543704: [47773.937303] kasan_save_stack+0x1b/0x40 [47773.938039] kasan_set_track+0x1c/0x30 [47773.938731] kasan_set_free_info+0x20/0x30 [47773.939467] __kasan_slab_free+0xe7/0x120 [47773.940194] slab_free_freelist_hook+0x86/0x190 [47773.941038] kfree+0xce/0x3a0 [47773.941644] tcf_ct_flow_table_cleanup_work
Original patch description and stack trace by Paul Blakey.
--- include/net/netfilter/nf_flow_table.h | 2 ++ net/netfilter/nf_flow_table_core.c | 7 +++---- net/netfilter/nf_flow_table_offload.c | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-)
include/net/netfilter/nf_flow_table.h +2 -0
@@ -303,6 +303,8 @@ void nf_flow_offload_stats(struct nf_flowtable *flowtable, struct flow_offload *flow);void nf_flow_table_offload_flush (struct nf_flowtable *flowtable); +void nf_flow_table_offload_flush_cleanup (struct nf_flowtable *flowtable); +int nf_flow_table_offload_setup (struct nf_flowtable *flowtable,struct net_device *dev,enum flow_block_command cmd);
net/netfilter/nf_flow_table_core.c +3 -4
@@ -604,12 +604,11 @@ void nf_flow_table_free(struct nf_flowtable *flow_table)mutex_unlock (&flowtable_lock);cancel_delayed_work_sync (&flow_table->gc_work); +nf_flow_table_offload_flush (flow_table); +/* ... no more pending work after this stage ... */ nf_flow_table_iterate (flow_table, nf_flow_table_do_cleanup,NULL );nf_flow_table_gc_run (flow_table); -nf_flow_table_offload_flush (flow_table); -if (nf_flowtable_hw_offload (flow_table)) -nf_flow_table_gc_run (flow_table); - +nf_flow_table_offload_flush_cleanup (flow_table);rhashtable_destroy (&flow_table->rhashtable); }EXPORT_SYMBOL_GPL (nf_flow_table_free);
net/netfilter/nf_flow_table_offload.c +8 -0
@@ -1050,6 +1050,14 @@ void nf_flow_offload_stats(struct nf_flowtable *flowtable,flow_offload_queue_work (offload); } +void nf_flow_table_offload_flush_cleanup (struct nf_flowtable *flowtable) +{ +if (nf_flowtable_hw_offload (flowtable)) { +flush_workqueue (nf_flow_offload_del_wq); +nf_flow_table_gc_run (flowtable); + } +} +void nf_flow_table_offload_flush (struct nf_flowtable *flowtable) {if (nf_flowtable_hw_offload (flowtable)) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 70/136 net: Fix data-races around sysctl_[rw]mem_(max|default).
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 1227c1771dd2ad44318aa3ab9e3a293b3f34ff2a ]
While reading sysctl_[rw]mem_(max|default), they can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/core/filter.c | 4 ++-- net/core/sock.c | 8 ++++---- net/ipv4/ip_output.c | 2 +- net/ipv4/tcp_output.c | 2 +- net/netfilter/ipvs/ip_vs_sync.c | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-)
net/core/filter.c +2 -2
@@ -4744,14 +4744,14 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname,/* Only some socketops are supported */ switch (optname) {case SO_RCVBUF : - val =min_t (u32, val, sysctl_rmem_max); + val =min_t (u32, val,READ_ONCE (sysctl_rmem_max)); val =min_t (int, val,INT_MAX /2 ); sk->sk_userlocks |=SOCK_RCVBUF_LOCK ;WRITE_ONCE (sk->sk_rcvbuf,max_t (int, val *2 ,SOCK_MIN_RCVBUF ));break ;case SO_SNDBUF : - val =min_t (u32, val, sysctl_wmem_max); + val =min_t (u32, val,READ_ONCE (sysctl_wmem_max)); val =min_t (int, val,INT_MAX /2 ); sk->sk_userlocks |=SOCK_SNDBUF_LOCK ; WRITE_ONCE(sk->sk_sndbuf,
net/core/sock.c +4 -4
@@ -1014,7 +1014,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,* play 'guess the biggest size' games. RCVBUF/SNDBUF * are treated in BSD as hints */ - val =min_t (u32, val, sysctl_wmem_max); + val =min_t (u32, val,READ_ONCE (sysctl_wmem_max)); set_sndbuf:/* Ensure val * 2 fits into an int, to prevent max_t() * from treating it as a negative value.
@@ -1046,7 +1046,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,* play 'guess the biggest size' games. RCVBUF/SNDBUF * are treated in BSD as hints */ -__sock_set_rcvbuf (sk,min_t (u32, val, sysctl_rmem_max)); +__sock_set_rcvbuf (sk,min_t (u32, val,READ_ONCE (sysctl_rmem_max)));break ;case SO_RCVBUFFORCE :
@@ -3124,8 +3124,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)timer_setup (&sk->sk_timer,NULL ,0 ); sk->sk_allocation =GFP_KERNEL ; - sk->sk_rcvbuf = sysctl_rmem_default; - sk->sk_sndbuf = sysctl_wmem_default; + sk->sk_rcvbuf =READ_ONCE (sysctl_rmem_default); + sk->sk_sndbuf =READ_ONCE (sysctl_wmem_default); sk->sk_state =TCP_CLOSE ;sk_set_socket (sk, sock);
net/ipv4/ip_output.c +1 -1
@@ -1712,7 +1712,7 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, sk->sk_protocol =ip_hdr (skb)->protocol; sk->sk_bound_dev_if = arg->bound_dev_if; - sk->sk_sndbuf = sysctl_wmem_default; + sk->sk_sndbuf =READ_ONCE (sysctl_wmem_default); ipc.sockc.mark = fl4.flowi4_mark; err =ip_append_data (sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, len,0 , &ipc, &rt,MSG_DONTWAIT );
net/ipv4/tcp_output.c +1 -1
@@ -239,7 +239,7 @@ void tcp_select_initial_window(const struct sock *sk, int __space, __u32 mss,if (wscale_ok) {/* Set window scaling on max possible window */ space =max_t (u32, space,READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ])); - space =max_t (u32, space, sysctl_rmem_max); + space =max_t (u32, space,READ_ONCE (sysctl_rmem_max)); space =min_t (u32, space, *window_clamp); *rcv_wscale =clamp_t (int,ilog2 (space) -15 ,0 ,TCP_MAX_WSCALE );
net/netfilter/ipvs/ip_vs_sync.c +2 -2
@@ -1280,12 +1280,12 @@ static void set_sock_size(struct sock *sk, int mode, int val)lock_sock (sk);if (mode) { val =clamp_t (int, val, (SOCK_MIN_SNDBUF +1 ) /2 , - sysctl_wmem_max); +READ_ONCE (sysctl_wmem_max)); sk->sk_sndbuf = val *2 ; sk->sk_userlocks |=SOCK_SNDBUF_LOCK ; }else { val =clamp_t (int, val, (SOCK_MIN_RCVBUF +1 ) /2 , - sysctl_rmem_max); +READ_ONCE (sysctl_rmem_max)); sk->sk_rcvbuf = val *2 ; sk->sk_userlocks |=SOCK_RCVBUF_LOCK ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 71/136 net: Fix data-races around weight_p and dev_weight_[rt]x_bias.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit bf955b5ab8f6f7b0632cdef8e36b14e4f6e77829 ]
While reading weight_p, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
Also, dev_[rt]x_weight can be read/written at the same time. So, we need to use READ_ONCE() and WRITE_ONCE() for its access. Moreover, to use the same weight_p while changing dev_[rt]x_weight, we add a mutex in proc_do_dev_weight().
--- net/core/dev.c | 2 +- net/core/sysctl_net_core.c | 15 +++++++++------ net/sched/sch_generic.c | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-)
net/core/dev.c +1 -1
@@ -6437,7 +6437,7 @@ static int process_backlog(struct napi_struct *napi, int quota)net_rps_action_and_irq_enable (sd); } - napi->weight = dev_rx_weight; + napi->weight =READ_ONCE (dev_rx_weight);while (again) {struct sk_buff *skb;
net/core/sysctl_net_core.c +9 -6
@@ -236,14 +236,17 @@ static int set_default_qdisc(struct ctl_table *table, int write,static int proc_do_dev_weight (struct ctl_table *table,int write,void *buffer,size_t *lenp,loff_t *ppos) { -int ret; +static DEFINE_MUTEX (dev_weight_mutex); +int ret, weight; +mutex_lock (&dev_weight_mutex); ret =proc_dointvec (table, write, buffer, lenp, ppos); -if (ret !=0 ) -return ret; - - dev_rx_weight = weight_p * dev_weight_rx_bias; - dev_tx_weight = weight_p * dev_weight_tx_bias; +if (!ret && write) { + weight =READ_ONCE (weight_p); +WRITE_ONCE (dev_rx_weight, weight * dev_weight_rx_bias); +WRITE_ONCE (dev_tx_weight, weight * dev_weight_tx_bias); + } +mutex_unlock (&dev_weight_mutex);return ret; }
net/sched/sch_generic.c +1 -1
@@ -409,7 +409,7 @@ static inline bool qdisc_restart(struct Qdisc *q, int *packets)void __qdisc_run (struct Qdisc *q) { -int quota = dev_tx_weight; +int quota =READ_ONCE (dev_tx_weight);int packets;while (qdisc_restart (q, &packets)) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 72/136 net: Fix data-races around netdev_max_backlog.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 5dcd08cd19912892586c6082d56718333e2d19db ]
While reading netdev_max_backlog, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
While at it, we remove the unnecessary spaces in the doc.
--- Documentation/admin-guide/sysctl/net.rst | 2 +- net/core/dev.c | 4 ++-- net/core/gro_cells.c | 2 +- net/xfrm/espintcp.c | 2 +- net/xfrm/xfrm_input.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-)
Documentation/admin-guide/sysctl/net.rst +1 -1
@@ -271,7 +271,7 @@ poll cycle or the number of packets processed reaches netdev_budget. netdev_max_backlog ------------------ -Maximum number of packets, queued on the INPUT side, when the interface +Maximum number of packets, queued on the INPUT side, when the interface receives packets faster than kernel can process them. netdev_rss_key
net/core/dev.c +2 -2
@@ -4589,7 +4589,7 @@ static bool skb_flow_limit(struct sk_buff *skb, unsigned int qlen)struct softnet_data *sd;unsigned int old_flow, new_flow; -if (qlen < (netdev_max_backlog >>1 )) +if (qlen < (READ_ONCE (netdev_max_backlog) >>1 ))return false; sd =this_cpu_ptr (&softnet_data);
@@ -4637,7 +4637,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu,if (!netif_running (skb->dev)) goto drop; qlen =skb_queue_len (&sd->input_pkt_queue); -if (qlen <= netdev_max_backlog && !skb_flow_limit (skb, qlen)) { +if (qlen <=READ_ONCE (netdev_max_backlog) && !skb_flow_limit (skb, qlen)) {if (qlen) { enqueue:__skb_queue_tail (&sd->input_pkt_queue, skb);
net/core/gro_cells.c +1 -1
@@ -26,7 +26,7 @@ int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) cell =this_cpu_ptr (gcells->cells); -if (skb_queue_len (&cell->napi_skbs) > netdev_max_backlog) { +if (skb_queue_len (&cell->napi_skbs) >READ_ONCE (netdev_max_backlog)) { drop:atomic_long_inc (&dev->rx_dropped);kfree_skb (skb);
net/xfrm/espintcp.c +1 -1
@@ -170,7 +170,7 @@ int espintcp_queue_out(struct sock *sk, struct sk_buff *skb) {struct espintcp_ctx *ctx =espintcp_getctx (sk); -if (skb_queue_len (&ctx->out_queue) >= netdev_max_backlog) +if (skb_queue_len (&ctx->out_queue) >=READ_ONCE (netdev_max_backlog))return -ENOBUFS ;__skb_queue_tail (&ctx->out_queue, skb);
net/xfrm/xfrm_input.c +1 -1
@@ -782,7 +782,7 @@ int xfrm_trans_queue_net(struct net *net, struct sk_buff *skb, trans =this_cpu_ptr (&xfrm_trans_tasklet); -if (skb_queue_len (&trans->queue) >= netdev_max_backlog) +if (skb_queue_len (&trans->queue) >=READ_ONCE (netdev_max_backlog))return -ENOBUFS ;BUILD_BUG_ON (sizeof (struct xfrm_trans_cb ) >sizeof (skb->cb));
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 73/136 net: Fix data-races around netdev_tstamp_prequeue.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 61adf447e38664447526698872e21c04623afb8e ]
While reading netdev_tstamp_prequeue, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/core/dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/core/dev.c +4 -4
@@ -4893,7 +4893,7 @@ static int netif_rx_internal(struct sk_buff *skb) {int ret; -net_timestamp_check (netdev_tstamp_prequeue, skb); +net_timestamp_check (READ_ONCE (netdev_tstamp_prequeue), skb);trace_netif_rx (skb);
@@ -5253,7 +5253,7 @@ static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,int ret =NET_RX_DROP ;__be16 type; -net_timestamp_check (!netdev_tstamp_prequeue, skb); +net_timestamp_check (!READ_ONCE (netdev_tstamp_prequeue), skb);trace_netif_receive_skb (skb);
@@ -5634,7 +5634,7 @@ static int netif_receive_skb_internal(struct sk_buff *skb) {int ret; -net_timestamp_check (netdev_tstamp_prequeue, skb); +net_timestamp_check (READ_ONCE (netdev_tstamp_prequeue), skb);if (skb_defer_rx_timestamp (skb))return NET_RX_SUCCESS ;
@@ -5664,7 +5664,7 @@ static void netif_receive_skb_list_internal(struct list_head *head)INIT_LIST_HEAD (&sublist);list_for_each_entry_safe (skb, next, head, list) { -net_timestamp_check (netdev_tstamp_prequeue, skb); +net_timestamp_check (READ_ONCE (netdev_tstamp_prequeue), skb);skb_list_del_init (skb);if (!skb_defer_rx_timestamp (skb))list_add_tail (&skb->list, &sublist);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 74/136 ratelimit: Fix data-races in ___ratelimit().
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 6bae8ceb90ba76cdba39496db936164fa672b9be ]
While reading rs->interval and rs->burst, they can be changed concurrently via sysctl (e.g. net_ratelimit_state). Thus, we need to add READ_ONCE() to their readers.
--- lib/ratelimit.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
lib/ratelimit.c +9 -3
@@ -26,10 +26,16 @@*/ int ___ratelimit (struct ratelimit_state *rs,const char *func) { +/* Paired with WRITE_ONCE() in .proc_handler(). +* Changing two values seperately could be inconsistent +* and some message could be lost. (See: net_ratelimit_state). +*/ +int interval =READ_ONCE (rs->interval); +int burst =READ_ONCE (rs->burst);unsigned long flags;int ret; -if (!rs->interval) +if (!interval)return 1 ;/*
@@ -44,7 +50,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)if (!rs->begin) rs->begin = jiffies; -if (time_is_before_jiffies (rs->begin + rs->interval)) { +if (time_is_before_jiffies (rs->begin + interval)) {if (rs->missed) {if (!(rs->flags &RATELIMIT_MSG_ON_RELEASE )) { printk_deferred(KERN_WARNING
@@ -56,7 +62,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func) rs->begin = jiffies; rs->printed =0 ; } -if (rs->burst && rs->burst > rs->printed) { +if (burst && burst > rs->printed) { rs->printed++; ret =1 ; }else {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 75/136 net: Fix data-races around sysctl_optmem_max.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 7de6d09f51917c829af2b835aba8bb5040f8e86a ]
While reading sysctl_optmem_max, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/core/bpf_sk_storage.c | 5 +++-- net/core/filter.c | 9 +++++---- net/core/sock.c | 8 +++++--- net/ipv4/ip_sockglue.c | 6 +++--- net/ipv6/ipv6_sockglue.c | 4 ++-- 5 files changed, 18 insertions(+), 14 deletions(-)
net/core/bpf_sk_storage.c +3 -2
@@ -305,11 +305,12 @@ BPF_CALL_2(bpf_sk_storage_delete, struct bpf_map *, map, struct sock *, sk)static int bpf_sk_storage_charge (struct bpf_local_storage_map *smap,void *owner,u32 size) { +int optmem_max =READ_ONCE (sysctl_optmem_max);struct sock *sk = (struct sock *)owner;/* same check as in sock_kmalloc() */ -if (size <= sysctl_optmem_max && -atomic_read (&sk->sk_omem_alloc) + size < sysctl_optmem_max) { +if (size <= optmem_max && +atomic_read (&sk->sk_omem_alloc) + size < optmem_max) {atomic_add (size, &sk->sk_omem_alloc);return 0 ; }
net/core/filter.c +5 -4
@@ -1213,10 +1213,11 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)static bool __sk_filter_charge (struct sock *sk,struct sk_filter *fp) {u32 filter_size =bpf_prog_size (fp->prog->len); +int optmem_max =READ_ONCE (sysctl_optmem_max);/* same check as in sock_kmalloc() */ -if (filter_size <= sysctl_optmem_max && -atomic_read (&sk->sk_omem_alloc) + filter_size < sysctl_optmem_max) { +if (filter_size <= optmem_max && +atomic_read (&sk->sk_omem_alloc) + filter_size < optmem_max) {atomic_add (filter_size, &sk->sk_omem_alloc);return true; }
@@ -1548,7 +1549,7 @@ int sk_reuseport_attach_filter(struct sock_fprog *fprog, struct sock *sk)if (IS_ERR (prog))return PTR_ERR (prog); -if (bpf_prog_size (prog->len) > sysctl_optmem_max) +if (bpf_prog_size (prog->len) >READ_ONCE (sysctl_optmem_max)) err = -ENOMEM ;else err =reuseport_attach_prog (sk, prog);
@@ -1615,7 +1616,7 @@ int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk) } }else {/* BPF_PROG_TYPE_SOCKET_FILTER */ -if (bpf_prog_size (prog->len) > sysctl_optmem_max) { +if (bpf_prog_size (prog->len) >READ_ONCE (sysctl_optmem_max)) { err = -ENOMEM ; goto err_prog_put; }
net/core/sock.c +5 -3
@@ -2368,7 +2368,7 @@ struct sk_buff *sock_omalloc(struct sock *sk, unsigned long size,/* small safe race: SKB_TRUESIZE may differ from final skb->truesize */ if (atomic_read (&sk->sk_omem_alloc) +SKB_TRUESIZE (size) > - sysctl_optmem_max) +READ_ONCE (sysctl_optmem_max))return NULL ; skb =alloc_skb (size, priority);
@@ -2386,8 +2386,10 @@ struct sk_buff *sock_omalloc(struct sock *sk, unsigned long size,*/ void *sock_kmalloc (struct sock *sk,int size,gfp_t priority) { -if ((unsigned int )size <= sysctl_optmem_max && -atomic_read (&sk->sk_omem_alloc) + size < sysctl_optmem_max) { +int optmem_max =READ_ONCE (sysctl_optmem_max); + +if ((unsigned int )size <= optmem_max && +atomic_read (&sk->sk_omem_alloc) + size < optmem_max) {void *mem;/* First do the add, to avoid the race if kmalloc * might sleep.
net/ipv4/ip_sockglue.c +3 -3
@@ -772,7 +772,7 @@ static int ip_set_mcast_msfilter(struct sock *sk, sockptr_t optval, int optlen)if (optlen <GROUP_FILTER_SIZE (0 ))return -EINVAL ; -if (optlen > sysctl_optmem_max) +if (optlen >READ_ONCE (sysctl_optmem_max))return -ENOBUFS ; gsf =memdup_sockptr (optval, optlen);
@@ -808,7 +808,7 @@ static int compat_ip_set_mcast_msfilter(struct sock *sk, sockptr_t optval,if (optlen < size0)return -EINVAL ; -if (optlen > sysctl_optmem_max -4 ) +if (optlen >READ_ONCE (sysctl_optmem_max) -4 )return -ENOBUFS ; p =kmalloc (optlen +4 ,GFP_KERNEL );
@@ -1231,7 +1231,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, int optname,if (optlen <IP_MSFILTER_SIZE (0 )) goto e_inval; -if (optlen > sysctl_optmem_max) { +if (optlen >READ_ONCE (sysctl_optmem_max)) { err = -ENOBUFS ;break ; }
net/ipv6/ipv6_sockglue.c +2 -2
@@ -208,7 +208,7 @@ static int ipv6_set_mcast_msfilter(struct sock *sk, sockptr_t optval,if (optlen <GROUP_FILTER_SIZE (0 ))return -EINVAL ; -if (optlen > sysctl_optmem_max) +if (optlen >READ_ONCE (sysctl_optmem_max))return -ENOBUFS ; gsf =memdup_sockptr (optval, optlen);
@@ -242,7 +242,7 @@ static int compat_ipv6_set_mcast_msfilter(struct sock *sk, sockptr_t optval,if (optlen < size0)return -EINVAL ; -if (optlen > sysctl_optmem_max -4 ) +if (optlen >READ_ONCE (sysctl_optmem_max) -4 )return -ENOBUFS ; p =kmalloc (optlen +4 ,GFP_KERNEL );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 76/136 net: Fix a data-race around sysctl_tstamp_allow_data.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit d2154b0afa73c0159b2856f875c6b4fe7cf6a95e ]
While reading sysctl_tstamp_allow_data, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/core/skbuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/skbuff.c +1 -1
@@ -4892,7 +4892,7 @@ static bool skb_may_tx_timestamp(struct sock *sk, bool tsonly) {bool ret; -if (likely (sysctl_tstamp_allow_data || tsonly)) +if (likely (READ_ONCE (sysctl_tstamp_allow_data) || tsonly))return true;read_lock_bh (&sk->sk_callback_lock);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 77/136 net: Fix a data-race around sysctl_net_busy_poll.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit c42b7cddea47503411bfb5f2f93a4154aaffa2d9 ]
While reading sysctl_net_busy_poll, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- include/net/busy_poll.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/busy_poll.h +1 -1
@@ -33,7 +33,7 @@ extern unsigned int sysctl_net_busy_poll __read_mostly;static inline bool net_busy_loop_on (void ) { -return sysctl_net_busy_poll; +return READ_ONCE (sysctl_net_busy_poll); }static inline bool sk_can_busy_loop (const struct sock *sk)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 78/136 net: Fix a data-race around sysctl_net_busy_read.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit e59ef36f0795696ab229569c153936bfd068d21c ]
While reading sysctl_net_busy_read, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/core/sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/sock.c +1 -1
@@ -3182,7 +3182,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)#ifdef CONFIG_NET_RX_BUSY_POLL sk->sk_napi_id =0 ; - sk->sk_ll_usec = sysctl_net_busy_read; + sk->sk_ll_usec =READ_ONCE (sysctl_net_busy_read);#endif sk->sk_max_pacing_rate = ~0UL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 79/136 net: Fix a data-race around netdev_budget.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 2e0c42374ee32e72948559d2ae2f7ba3dc6b977c ]
While reading netdev_budget, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -7138,7 +7138,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)struct softnet_data *sd =this_cpu_ptr (&softnet_data);unsigned long time_limit = jiffies +usecs_to_jiffies (netdev_budget_usecs); -int budget = netdev_budget; +int budget =READ_ONCE (netdev_budget);LIST_HEAD (list);LIST_HEAD (repoll);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 80/136 tcp: expose the tcp_mark_push() and tcp_skb_entail() helpers
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 04d8825c30b718781197c8f07b1915a11bfb8685 ]
the tcp_skb_entail() helper is actually skb_entail(), renamed to provide proper scope.
The two helper will be used by the next patch.
RFC -> v1:
- rename skb_entail to tcp_skb_entail (Eric)
--- include/net/tcp.h | 2 ++ net/ipv4/tcp.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-)
include/net/tcp.h +2 -0
@@ -571,6 +571,8 @@ __u32 cookie_v6_init_sequence(const struct sk_buff *skb, __u16 *mss);#endif /* tcp_output.c */ +void tcp_skb_entail (struct sock *sk,struct sk_buff *skb); +void tcp_mark_push (struct tcp_sock *tp,struct sk_buff *skb);void __tcp_push_pending_frames (struct sock *sk,unsigned int cur_mss,int nonagle);int __tcp_retransmit_skb (struct sock *sk,struct sk_buff *skb,int segs);
net/ipv4/tcp.c +4 -4
@@ -644,7 +644,7 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) }EXPORT_SYMBOL (tcp_ioctl); -static inline void tcp_mark_push (struct tcp_sock *tp,struct sk_buff *skb) +void tcp_mark_push (struct tcp_sock *tp,struct sk_buff *skb) {TCP_SKB_CB (skb)->tcp_flags |=TCPHDR_PSH ; tp->pushed_seq = tp->write_seq;
@@ -655,7 +655,7 @@ static inline bool forced_push(const struct tcp_sock *tp)return after (tp->write_seq, tp->pushed_seq + (tp->max_window >>1 )); } -static void skb_entail (struct sock *sk,struct sk_buff *skb) +void tcp_skb_entail (struct sock *sk,struct sk_buff *skb) {struct tcp_sock *tp =tcp_sk (sk);struct tcp_skb_cb *tcb =TCP_SKB_CB (skb);
@@ -982,7 +982,7 @@ struct sk_buff *tcp_build_frag(struct sock *sk, int size_goal, int flags,#ifdef CONFIG_TLS_DEVICE skb->decrypted = !!(flags &MSG_SENDPAGE_DECRYPTED );#endif -skb_entail (sk, skb); +tcp_skb_entail (sk, skb); copy = size_goal; }
@@ -1312,7 +1312,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) process_backlog++; skb->ip_summed =CHECKSUM_PARTIAL ; -skb_entail (sk, skb); +tcp_skb_entail (sk, skb); copy = size_goal;/* All packets are restored as if they have
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 81/136 mptcp: stop relying on tcp_tx_skb_cache
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit f70cad1085d1e01d3ec73c1078405f906237feee ]
We want to revert the skb TX cache, but MPTCP is currently using it unconditionally.
Rework the MPTCP tx code, so that tcp_tx_skb_cache is not needed anymore: do the whole coalescing check, skb allocation skb initialization/update inside mptcp_sendmsg_frag(), quite alike the current TCP code.
--- net/mptcp/protocol.c | 137 ++++++++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 60 deletions(-)
net/mptcp/protocol.c +77 -60
@@ -1224,6 +1224,7 @@ static struct sk_buff *__mptcp_do_alloc_tx_skb(struct sock *sk, gfp_t gfp)if (likely (__mptcp_add_ext (skb, gfp))) {skb_reserve (skb,MAX_TCP_HEADER ); skb->reserved_tailroom = skb->end - skb->tail; +INIT_LIST_HEAD (&skb->tcp_tsorted_anchor);return skb; }__kfree_skb (skb);
@@ -1233,31 +1234,23 @@ static struct sk_buff *__mptcp_do_alloc_tx_skb(struct sock *sk, gfp_t gfp)return NULL ; } -static bool __mptcp_alloc_tx_skb (struct sock *sk,struct sock *ssk,gfp_t gfp) +static struct sk_buff *__mptcp_alloc_tx_skb (struct sock *sk,struct sock *ssk,gfp_t gfp) {struct sk_buff *skb; -if (ssk->sk_tx_skb_cache) { - skb = ssk->sk_tx_skb_cache; -if (unlikely (!skb_ext_find (skb,SKB_EXT_MPTCP ) && - !__mptcp_add_ext (skb, gfp))) -return false; -return true; - } - skb =__mptcp_do_alloc_tx_skb (sk, gfp);if (!skb) -return false; +return NULL ;if (likely (sk_wmem_schedule (ssk, skb->truesize))) { - ssk->sk_tx_skb_cache = skb; -return true; +tcp_skb_entail (ssk, skb); +return skb; }kfree_skb (skb); -return false; +return NULL ; } -static bool mptcp_alloc_tx_skb (struct sock *sk,struct sock *ssk,bool data_lock_held) +static struct sk_buff *mptcp_alloc_tx_skb (struct sock *sk,struct sock *ssk,bool data_lock_held) {gfp_t gfp = data_lock_held ?GFP_ATOMIC : sk->sk_allocation;
@@ -1287,23 +1280,29 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, struct mptcp_sendmsg_info *info) {u64 data_seq = dfrag->data_seq + info->sent; +int offset = dfrag->offset + info->sent;struct mptcp_sock *msk =mptcp_sk (sk);bool zero_window_probe = false;struct mptcp_ext *mpext =NULL ; -struct sk_buff *skb, *tail; -bool must_collapse = false; -int size_bias =0 ; -int avail_size; -size_t ret =0 ; +bool can_coalesce = false; +bool reuse_skb = true; +struct sk_buff *skb; +size_t copy; +int i;pr_debug ("msk=%p ssk=%p sending dfrag at seq=%llu len=%u already sent=%u" , msk, ssk, dfrag->data_seq, dfrag->data_len, info->sent); +if (WARN_ON_ONCE (info->sent > info->limit || + info->limit > dfrag->data_len)) +return 0 ; +/* compute send limit */ info->mss_now =tcp_send_mss (ssk, &info->size_goal, info->flags); - avail_size = info->size_goal; + copy = info->size_goal; + skb =tcp_write_queue_tail (ssk); -if (skb) { +if (skb && copy > skb->len) {/* Limit the write to the size available in the * current skb, if any, so that we create at most a new skb. * Explicitly tells TCP internals to avoid collapsing on later
@@ -1316,62 +1315,80 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, goto alloc_skb; } - must_collapse = (info->size_goal > skb->len) && - (skb_shinfo (skb)->nr_frags < sysctl_max_skb_frags); -if (must_collapse) { - size_bias = skb->len; - avail_size = info->size_goal - skb->len; + i =skb_shinfo (skb)->nr_frags; + can_coalesce =skb_can_coalesce (skb, i, dfrag->page, offset); +if (!can_coalesce && i >= sysctl_max_skb_frags) { +tcp_mark_push (tcp_sk (ssk), skb); + goto alloc_skb; } - } + copy -= skb->len; + }else { alloc_skb: -if (!must_collapse && - !mptcp_alloc_tx_skb (sk, ssk, info->data_lock_held)) -return 0 ; + skb =mptcp_alloc_tx_skb (sk, ssk, info->data_lock_held); +if (!skb) +return -ENOMEM ; + + i =skb_shinfo (skb)->nr_frags; + reuse_skb = false; + mpext =skb_ext_find (skb,SKB_EXT_MPTCP ); + }/* Zero window and all data acked? Probe. */ - avail_size =mptcp_check_allowed_size (msk, data_seq, avail_size); -if (avail_size ==0 ) { + copy =mptcp_check_allowed_size (msk, data_seq, copy); +if (copy ==0 ) {u64 snd_una =READ_ONCE (msk->snd_una); -if (skb || snd_una != msk->snd_nxt) +if (snd_una != msk->snd_nxt) { +tcp_remove_empty_skb (ssk,tcp_write_queue_tail (ssk));return 0 ; + } + zero_window_probe = true; data_seq = snd_una -1 ; - avail_size =1 ; - } + copy =1 ; -if (WARN_ON_ONCE (info->sent > info->limit || - info->limit > dfrag->data_len)) -return 0 ; +/* all mptcp-level data is acked, no skbs should be present into the +* ssk write queue +*/ +WARN_ON_ONCE (reuse_skb); + } - ret = info->limit - info->sent; - tail =tcp_build_frag (ssk, avail_size + size_bias, info->flags, - dfrag->page, dfrag->offset + info->sent, &ret); -if (!tail) { -tcp_remove_empty_skb (sk,tcp_write_queue_tail (ssk)); + copy =min_t (size_t, copy, info->limit - info->sent); +if (!sk_wmem_schedule (ssk, copy)) { +tcp_remove_empty_skb (ssk,tcp_write_queue_tail (ssk));return -ENOMEM ; } -/* if the tail skb is still the cached one, collapsing really happened. -*/ -if (skb == tail) { -TCP_SKB_CB (tail)->tcp_flags &= ~TCPHDR_PSH ; - mpext->data_len += ret; +if (can_coalesce) { +skb_frag_size_add (&skb_shinfo (skb)->frags[i -1 ], copy); + }else { +get_page (dfrag->page); +skb_fill_page_desc (skb, i, dfrag->page, offset, copy); + } + + skb->len += copy; + skb->data_len += copy; + skb->truesize += copy; +sk_wmem_queued_add (ssk, copy); +sk_mem_charge (ssk, copy); + skb->ip_summed =CHECKSUM_PARTIAL ; +WRITE_ONCE (tcp_sk (ssk)->write_seq,tcp_sk (ssk)->write_seq + copy); +TCP_SKB_CB (skb)->end_seq += copy; +tcp_skb_pcount_set (skb,0 ); + +/* on skb reuse we just need to update the DSS len */ +if (reuse_skb) { +TCP_SKB_CB (skb)->tcp_flags &= ~TCPHDR_PSH ; + mpext->data_len += copy;WARN_ON_ONCE (zero_window_probe); goto out; } - mpext =skb_ext_find (tail,SKB_EXT_MPTCP ); -if (WARN_ON_ONCE (!mpext)) { -/* should never reach here, stream corrupted */ -return -EINVAL ; - } -memset (mpext,0 ,sizeof (*mpext)); mpext->data_seq = data_seq; mpext->subflow_seq =mptcp_subflow_ctx (ssk)->rel_write_seq; - mpext->data_len = ret; + mpext->data_len = copy; mpext->use_map =1 ; mpext->dsn64 =1 ;
@@ -1380,18 +1397,18 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, mpext->dsn64);if (zero_window_probe) { -mptcp_subflow_ctx (ssk)->rel_write_seq += ret; +mptcp_subflow_ctx (ssk)->rel_write_seq += copy; mpext->frozen =1 ;if (READ_ONCE (msk->csum_enabled)) -mptcp_update_data_checksum (tail, ret); +mptcp_update_data_checksum (skb, copy);tcp_push_pending_frames (ssk);return 0 ; } out:if (READ_ONCE (msk->csum_enabled)) -mptcp_update_data_checksum (tail, ret); -mptcp_subflow_ctx (ssk)->rel_write_seq += ret; -return ret; +mptcp_update_data_checksum (skb, copy); +mptcp_subflow_ctx (ssk)->rel_write_seq += copy; +return copy; }#define MPTCP_SEND_BURST_SIZE ((1 << 16) - \
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 82/136 net: Fix data-races around sysctl_max_skb_frags.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 657b991afb89d25fe6c4783b1b75a8ad4563670d ]
While reading sysctl_max_skb_frags, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp.c | 4 ++-- net/mptcp/protocol.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
net/ipv4/tcp.c +2 -2
@@ -991,7 +991,7 @@ struct sk_buff *tcp_build_frag(struct sock *sk, int size_goal, int flags, i =skb_shinfo (skb)->nr_frags; can_coalesce =skb_can_coalesce (skb, i, page, offset); -if (!can_coalesce && i >= sysctl_max_skb_frags) { +if (!can_coalesce && i >=READ_ONCE (sysctl_max_skb_frags)) {tcp_mark_push (tp, skb); goto new_segment; }
@@ -1344,7 +1344,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)if (!skb_can_coalesce (skb, i, pfrag->page, pfrag->offset)) { -if (i >= sysctl_max_skb_frags) { +if (i >=READ_ONCE (sysctl_max_skb_frags)) {tcp_mark_push (tp, skb); goto new_segment; }
net/mptcp/protocol.c +1 -1
@@ -1317,7 +1317,7 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, i =skb_shinfo (skb)->nr_frags; can_coalesce =skb_can_coalesce (skb, i, dfrag->page, offset); -if (!can_coalesce && i >= sysctl_max_skb_frags) { +if (!can_coalesce && i >=READ_ONCE (sysctl_max_skb_frags)) {tcp_mark_push (tcp_sk (ssk), skb); goto alloc_skb; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 83/136 net: Fix a data-race around netdev_budget_usecs.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit fa45d484c52c73f79db2c23b0cdfc6c6455093ad ]
While reading netdev_budget_usecs, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -7137,7 +7137,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h) {struct softnet_data *sd =this_cpu_ptr (&softnet_data);unsigned long time_limit = jiffies + -usecs_to_jiffies (netdev_budget_usecs); +usecs_to_jiffies (READ_ONCE (netdev_budget_usecs));int budget =READ_ONCE (netdev_budget);LIST_HEAD (list);LIST_HEAD (repoll);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 84/136 net: Fix data-races around sysctl_fb_tunnels_only_for_init_net.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit af67508ea6cbf0e4ea27f8120056fa2efce127dd ]
While reading sysctl_fb_tunnels_only_for_init_net, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/linux/netdevice.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
include/linux/netdevice.h +8 -3
@@ -626,9 +626,14 @@ extern int sysctl_devconf_inherit_init_net;*/ static inline bool net_has_fallback_tunnels (const struct net *net) { -return !IS_ENABLED (CONFIG_SYSCTL ) || - !sysctl_fb_tunnels_only_for_init_net || - (net == &init_net && sysctl_fb_tunnels_only_for_init_net ==1 ); +#if IS_ENABLED (CONFIG_SYSCTL ) +int fb_tunnels_only_for_init_net =READ_ONCE (sysctl_fb_tunnels_only_for_init_net); + +return !fb_tunnels_only_for_init_net || + (net_eq (net, &init_net) && fb_tunnels_only_for_init_net ==1 ); +#else +return true; +#endif }static inline int netdev_queue_numa_node_read (const struct netdev_queue *q)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 85/136 net: Fix data-races around sysctl_devconf_inherit_init_net.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit a5612ca10d1aa05624ebe72633e0c8c792970833 ]
While reading sysctl_devconf_inherit_init_net, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/linux/netdevice.h | 9 +++++++++ net/ipv4/devinet.c | 16 ++++++++++------ net/ipv6/addrconf.c | 5 ++--- 3 files changed, 21 insertions(+), 9 deletions(-)
include/linux/netdevice.h +9 -0
@@ -636,6 +636,15 @@ static inline bool net_has_fallback_tunnels(const struct net *net)#endif } +static inline int net_inherit_devconf (void ) +{ +#if IS_ENABLED (CONFIG_SYSCTL ) +return READ_ONCE (sysctl_devconf_inherit_init_net); +#else +return 0 ; +#endif +} +static inline int netdev_queue_numa_node_read (const struct netdev_queue *q) {#if defined(CONFIG_XPS ) && defined(CONFIG_NUMA )
net/ipv4/devinet.c +10 -6
@@ -2673,23 +2673,27 @@ static __net_init int devinet_init_net(struct net *net)#endif if (!net_eq (net, &init_net)) { -if (IS_ENABLED (CONFIG_SYSCTL ) && - sysctl_devconf_inherit_init_net ==3 ) { +switch (net_inherit_devconf ()) { +case 3 :/* copy from the current netns */ memcpy (all, current->nsproxy->net_ns->ipv4.devconf_all,sizeof (ipv4_devconf));memcpy (dflt, current->nsproxy->net_ns->ipv4.devconf_dflt,sizeof (ipv4_devconf_dflt)); - }else if (!IS_ENABLED (CONFIG_SYSCTL ) || - sysctl_devconf_inherit_init_net !=2 ) { -/* inherit == 0 or 1: copy from init_net */ +break ; +case 0 : +case 1 : +/* copy from init_net */ memcpy (all, init_net.ipv4.devconf_all,sizeof (ipv4_devconf));memcpy (dflt, init_net.ipv4.devconf_dflt,sizeof (ipv4_devconf_dflt)); +break ; +case 2 : +/* use compiled values */ +break ; } -/* else inherit == 2: use compiled values */ }#ifdef CONFIG_SYSCTL
net/ipv6/addrconf.c +2 -3
@@ -7128,9 +7128,8 @@ static int __net_init addrconf_init_net(struct net *net)if (!dflt) goto err_alloc_dflt; -if (IS_ENABLED (CONFIG_SYSCTL ) && - !net_eq (net, &init_net)) { -switch (sysctl_devconf_inherit_init_net) { +if (!net_eq (net, &init_net)) { +switch (net_inherit_devconf ()) {case 1 :/* copy from init_net */ memcpy (all, init_net.ipv6.devconf_all,sizeof (ipv6_devconf));
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 86/136 net: Fix a data-race around sysctl_somaxconn.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 3c9ba81d72047f2e81bb535d42856517b613aba7 ]
While reading sysctl_somaxconn, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/socket.c +1 -1
@@ -1721,7 +1721,7 @@ int __sys_listen(int fd, int backlog) sock =sockfd_lookup_light (fd, &err, &fput_needed);if (sock) { - somaxconn =sock_net (sock->sk)->core.sysctl_somaxconn; + somaxconn =READ_ONCE (sock_net (sock->sk)->core.sysctl_somaxconn);if ((unsigned int )backlog > somaxconn) backlog = somaxconn;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 87/136 ixgbe: stop resetting SYSTIME in ixgbe_ptp_start_cyclecounter
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 25d7a5f5a6bb15a2dae0a3f39ea5dda215024726 ]
The ixgbe_ptp_start_cyclecounter is intended to be called whenever the cyclecounter parameters need to be changed.
Since commit a9763f3cb54c ("ixgbe: Update PTP to support X550EM_x devices"), this function has cleared the SYSTIME registers and reset the TSAUXC DISABLE_SYSTIME bit.
While these need to be cleared during ixgbe_ptp_reset, it is wrong to clear them during ixgbe_ptp_start_cyclecounter. This function may be called during both reset and link status change. When link changes, the SYSTIME counter is still operating normally, but the cyclecounter should be updated to account for the possibly changed parameters.
Clearing SYSTIME when link changes causes the timecounter to jump because the cycle counter now reads zero.
Extract the SYSTIME initialization out to a new function and call this during ixgbe_ptp_reset. This prevents the timecounter adjustment and avoids an unnecessary reset of the current time.
This also restores the original SYSTIME clearing that occurred during ixgbe_ptp_reset before the commit above.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 59 +++++++++++++++----- 1 file changed, 46 insertions(+), 13 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +46 -13
@@ -1212,7 +1212,6 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)struct cyclecounter cc;unsigned long flags;u32 incval =0 ; -u32 tsauxc =0 ;u32 fuse0 =0 ;/* For some of the boards below this mask is technically incorrect.
@@ -1247,18 +1246,6 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)case ixgbe_mac_x550em_a:case ixgbe_mac_X550: cc.read = ixgbe_ptp_read_X550; - -/* enable SYSTIME counter */ -IXGBE_WRITE_REG (hw,IXGBE_SYSTIMR ,0 ); -IXGBE_WRITE_REG (hw,IXGBE_SYSTIML ,0 ); -IXGBE_WRITE_REG (hw,IXGBE_SYSTIMH ,0 ); - tsauxc =IXGBE_READ_REG (hw,IXGBE_TSAUXC ); -IXGBE_WRITE_REG (hw,IXGBE_TSAUXC , - tsauxc & ~IXGBE_TSAUXC_DISABLE_SYSTIME ); -IXGBE_WRITE_REG (hw,IXGBE_TSIM ,IXGBE_TSIM_TXTS ); -IXGBE_WRITE_REG (hw,IXGBE_EIMS ,IXGBE_EIMS_TIMESYNC ); - -IXGBE_WRITE_FLUSH (hw);break ;case ixgbe_mac_X540: cc.read = ixgbe_ptp_read_82599;
@@ -1290,6 +1277,50 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)spin_unlock_irqrestore (&adapter->tmreg_lock, flags); } +/** +* ixgbe_ptp_init_systime - Initialize SYSTIME registers +* @adapter: the ixgbe private board structure +* +* Initialize and start the SYSTIME registers. +*/ +static void ixgbe_ptp_init_systime (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +u32 tsauxc; + +switch (hw->mac.type) { +case ixgbe_mac_X550EM_x: +case ixgbe_mac_x550em_a: +case ixgbe_mac_X550: + tsauxc =IXGBE_READ_REG (hw,IXGBE_TSAUXC ); + +/* Reset SYSTIME registers to 0 */ +IXGBE_WRITE_REG (hw,IXGBE_SYSTIMR ,0 ); +IXGBE_WRITE_REG (hw,IXGBE_SYSTIML ,0 ); +IXGBE_WRITE_REG (hw,IXGBE_SYSTIMH ,0 ); + +/* Reset interrupt settings */ +IXGBE_WRITE_REG (hw,IXGBE_TSIM ,IXGBE_TSIM_TXTS ); +IXGBE_WRITE_REG (hw,IXGBE_EIMS ,IXGBE_EIMS_TIMESYNC ); + +/* Activate the SYSTIME counter */ +IXGBE_WRITE_REG (hw,IXGBE_TSAUXC , + tsauxc & ~IXGBE_TSAUXC_DISABLE_SYSTIME ); +break ; +case ixgbe_mac_X540: +case ixgbe_mac_82599EB: +/* Reset SYSTIME registers to 0 */ +IXGBE_WRITE_REG (hw,IXGBE_SYSTIML ,0 ); +IXGBE_WRITE_REG (hw,IXGBE_SYSTIMH ,0 ); +break ; +default : +/* Other devices aren't supported */ +return ; + }; + +IXGBE_WRITE_FLUSH (hw); +} +/** * ixgbe_ptp_reset * @adapter: the ixgbe private board structure
@@ -1316,6 +1347,8 @@ void ixgbe_ptp_reset(struct ixgbe_adapter *adapter)ixgbe_ptp_start_cyclecounter (adapter); +ixgbe_ptp_init_systime (adapter); +spin_lock_irqsave (&adapter->tmreg_lock, flags);timecounter_init (&adapter->hw_tc, &adapter->hw_cc,ktime_to_ns (ktime_get_real ()));
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 88/136 i40e: Fix incorrect address type for IPv6 flow rules
In reply to Greg Kroah-HartmanFrom: Sylwester Dziedziuch <[email protected]>
[ Upstream commit bcf3a156429306070afbfda5544f2b492d25e75b ]
It was not possible to create 1-tuple flow director rule for IPv6 flow type. It was caused by incorrectly checking for source IP address when validating user provided destination IP address.
Fix this by changing ip6src to correct ip6dst address in destination IP address validation for IPv6 flow type.
--- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +1 -1
@@ -4385,7 +4385,7 @@ static int i40e_check_fdir_input_set(struct i40e_vsi *vsi, (struct in6_addr *)&ipv6_full_mask)) new_mask |=I40E_L3_V6_DST_MASK ; else if (ipv6_addr_any((struct in6_addr *) - &usr_ip6_spec->ip6src)) + &usr_ip6_spec->ip6dst)) new_mask &= ~I40E_L3_V6_DST_MASK; else return -EOPNOTSUPP;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 89/136 rxrpc: Fix locking in rxrpcs sendmsg
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit b0f571ecd7943423c25947439045f0d352ca3dbf ]
Fix three bugs in the rxrpc's sendmsg implementation:
(1) rxrpc_new_client_call() should release the socket lock when returning an error from rxrpc_get_call_slot().
(2) rxrpc_wait_for_tx_window_intr() will return without the call mutex held in the event that we're interrupted by a signal whilst waiting for tx space on the socket or relocking the call mutex afterwards.
Fix this by: (a) moving the unlock/lock of the call mutex up to rxrpc_send_data() such that the lock is not held around all of rxrpc_wait_for_tx_window*() and (b) indicating to higher callers whether we're return with the lock dropped. Note that this means recvmsg() will not block on this call whilst we're waiting.
(3) After dropping and regaining the call mutex, rxrpc_send_data() needs to go and recheck the state of the tx_pending buffer and the tx_total_len check in case we raced with another sendmsg() on the same call.
Thinking on this some more, it might make sense to have different locks for sendmsg() and recvmsg(). There's probably no need to make recvmsg() wait for sendmsg(). It does mean that recvmsg() can return MSG_EOR indicating that a call is dead before a sendmsg() to that call returns - but that can currently happen anyway.
Without fix (2), something like the following can be induced:
WARNING: bad unlock balance detected! 5.16.0-rc6-syzkaller #0 Not tainted ------------------------------------- syz-executor011/3597 is trying to release lock (&call->user_mutex) at: [<ffffffff885163a3>] rxrpc_do_sendmsg+0xc13/0x1350 net/rxrpc/sendmsg.c:748 but there are no more locks to release! other info that might help us debug this: no locks held by syz-executor011/3597. ... Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106 print_unlock_imbalance_bug include/trace/events/lock.h:58 [inline] __lock_release kernel/locking/lockdep.c:5306 [inline] lock_release.cold+0x49/0x4e kernel/locking/lockdep.c:5657 __mutex_unlock_slowpath+0x99/0x5e0 kernel/locking/mutex.c:900 rxrpc_do_sendmsg+0xc13/0x1350 net/rxrpc/sendmsg.c:748 rxrpc_sendmsg+0x420/0x630 net/rxrpc/af_rxrpc.c:561 sock_sendmsg_nosec net/socket.c:704 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:724 ____sys_sendmsg+0x6e8/0x810 net/socket.c:2409 ___sys_sendmsg+0xf3/0x170 net/socket.c:2463 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2492 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae
[Thanks to Hawkins Jiawei and Khalid Masum for their attempts to fix this]
--- net/rxrpc/call_object.c | 4 +- net/rxrpc/sendmsg.c | 92 ++++++++++++++++++++++++----------------- 2 files changed, 57 insertions(+), 39 deletions(-)
net/rxrpc/call_object.c +3 -1
@@ -285,8 +285,10 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,_enter ("%p,%lx" , rx, p->user_call_ID); limiter =rxrpc_get_call_slot (p, gfp); -if (!limiter) +if (!limiter) { +release_sock (&rx->sk);return ERR_PTR (-ERESTARTSYS ); + } call =rxrpc_alloc_client_call (rx, srx, gfp, debug_id);if (IS_ERR (call)) {
net/rxrpc/sendmsg.c +54 -38
170 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 90/136 ionic: widen queue_lock use around lif init and deinit
In reply to Greg Kroah-HartmanFrom: Shannon Nelson <[email protected]>
[ Upstream commit 2624d95972dbebe5f226361bfc51a83bdb68c93b ]
Widen the coverage of the queue_lock to be sure the lif init and lif deinit actions are protected. This addresses a hang seen when a Tx Timeout action was attempted at the same time as a FW Reset was started.
--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +11 -3
@@ -2974,11 +2974,10 @@ static void ionic_lif_handle_fw_down(struct ionic_lif *lif)netif_device_detach (lif->netdev); +mutex_lock (&lif->queue_lock);if (test_bit (IONIC_LIF_F_UP , lif->state)) {dev_info (ionic->dev,"Surprise FW stop, stopping queues\n" ); -mutex_lock (&lif->queue_lock);ionic_stop_queues (lif); -mutex_unlock (&lif->queue_lock); }if (netif_running (lif->netdev)) {
@@ -2989,6 +2988,8 @@ static void ionic_lif_handle_fw_down(struct ionic_lif *lif)ionic_reset (ionic);ionic_qcqs_free (lif); +mutex_unlock (&lif->queue_lock); +dev_info (ionic->dev,"FW Down: LIFs stopped\n" ); }
@@ -3012,9 +3013,12 @@ static void ionic_lif_handle_fw_up(struct ionic_lif *lif) err =ionic_port_init (ionic);if (err) goto err_out; + +mutex_lock (&lif->queue_lock); + err =ionic_qcqs_alloc (lif);if (err) - goto err_out; + goto err_unlock; err =ionic_lif_init (lif);if (err)
@@ -3035,6 +3039,8 @@ static void ionic_lif_handle_fw_up(struct ionic_lif *lif) goto err_txrx_free; } +mutex_unlock (&lif->queue_lock); +clear_bit (IONIC_LIF_F_FW_RESET , lif->state);ionic_link_status_check_request (lif,CAN_SLEEP );netif_device_attach (lif->netdev);
@@ -3051,6 +3057,8 @@ static void ionic_lif_handle_fw_up(struct ionic_lif *lif)ionic_lif_deinit (lif); err_qcqs_free:ionic_qcqs_free (lif); +err_unlock: +mutex_unlock (&lif->queue_lock); err_out:dev_err (ionic->dev,"FW Up: LIFs restart failed - err %d\n" , err); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 91/136 ionic: clear broken state on generation change
In reply to Greg Kroah-HartmanFrom: Shannon Nelson <[email protected]>
[ Upstream commit 9cb9dadb8f45c67e4310e002c2f221b70312b293 ]
There is a case found in heavy testing where a link flap happens just before a firmware Recovery event and the driver gets stuck in the BROKEN state. This comes from the driver getting interrupted by a FW generation change when coming back up from the link flap, and the call to ionic_start_queues() in ionic_link_status_check() fails. This can be addressed by having the fw_up code clear the BROKEN bit if seen, rather than waiting for a user to manually force the interface down and then back up.
--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +3 -0
@@ -3016,6 +3016,9 @@ static void ionic_lif_handle_fw_up(struct ionic_lif *lif)mutex_lock (&lif->queue_lock); +if (test_and_clear_bit (IONIC_LIF_F_BROKEN , lif->state)) +dev_info (ionic->dev,"FW Up: clearing broken state\n" ); + err =ionic_qcqs_alloc (lif);if (err) goto err_unlock;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 92/136 ionic: fix up issues with handling EAGAIN on FW cmds
In reply to Greg Kroah-HartmanFrom: Shannon Nelson <[email protected]>
[ Upstream commit 0fc4dd452d6c14828eed6369155c75c0ac15bab3 ]
In looping on FW update tests we occasionally see the FW_ACTIVATE_STATUS command fail while it is in its EAGAIN loop waiting for the FW activate step to finsh inside the FW. The firmware is complaining that the done bit is set when a new dev_cmd is going to be processed.
Doing a clean on the cmd registers and doorbell before exiting the wait-for-done and cleaning the done bit before the sleep prevents this from occurring.
--- drivers/net/ethernet/pensando/ionic/ionic_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/pensando/ionic/ionic_main.c +3 -1
@@ -395,8 +395,8 @@ int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds)ionic_opcode_to_str (opcode), opcode, ionic_error_to_str(err), err); -msleep (1000 );iowrite32 (0 , &idev->dev_cmd_regs->done); +msleep (1000 );iowrite32 (1 , &idev->dev_cmd_regs->doorbell); goto try_again; }
@@ -409,6 +409,8 @@ int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds)return ionic_error_to_errno (err); } +ionic_dev_cmd_clean (ionic); +return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 93/136 ionic: VF initial random MAC address if no assigned mac
In reply to Greg Kroah-HartmanFrom: R Mohamed Shah <[email protected]>
[ Upstream commit 19058be7c48ceb3e60fa3948e24da1059bd68ee4 ]
Assign a random mac address to the VF interface station address if it boots with a zero mac address in order to match similar behavior seen in other VF drivers. Handle the errors where the older firmware does not allow the VF to set its own station address.
Newer firmware will allow the VF to set the station mac address if it hasn't already been set administratively through the PF. Setting it will also be allowed if the VF has trust.
--- .../net/ethernet/pensando/ionic/ionic_lif.c | 92 ++++++++++++++++++- 1 file changed, 87 insertions(+), 5 deletions(-)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +87 -5
@@ -1692,8 +1692,67 @@ static int ionic_set_features(struct net_device *netdev,return err; } +static int ionic_set_attr_mac (struct ionic_lif *lif,u8 *mac) +{ +struct ionic_admin_ctx ctx = { + .work =COMPLETION_INITIALIZER_ONSTACK (ctx.work), + .cmd.lif_setattr = { + .opcode =IONIC_CMD_LIF_SETATTR , + .index =cpu_to_le16 (lif->index), + .attr =IONIC_LIF_ATTR_MAC , + }, + }; + +ether_addr_copy (ctx.cmd.lif_setattr.mac, mac); +return ionic_adminq_post_wait (lif, &ctx); +} + +static int ionic_get_attr_mac (struct ionic_lif *lif,u8 *mac_addr) +{ +struct ionic_admin_ctx ctx = { + .work =COMPLETION_INITIALIZER_ONSTACK (ctx.work), + .cmd.lif_getattr = { + .opcode =IONIC_CMD_LIF_GETATTR , + .index =cpu_to_le16 (lif->index), + .attr =IONIC_LIF_ATTR_MAC , + }, + }; +int err; + + err =ionic_adminq_post_wait (lif, &ctx); +if (err) +return err; + +ether_addr_copy (mac_addr, ctx.comp.lif_getattr.mac); +return 0 ; +} + +static int ionic_program_mac (struct ionic_lif *lif,u8 *mac) +{ +u8 get_mac[ETH_ALEN ]; +int err; + + err =ionic_set_attr_mac (lif, mac); +if (err) +return err; + + err =ionic_get_attr_mac (lif, get_mac); +if (err) +return err; + +/* To deal with older firmware that silently ignores the set attr mac: +* doesn't actually change the mac and doesn't return an error, so we +* do the get attr to verify whether or not the set actually happened +*/ +if (!ether_addr_equal (get_mac, mac)) +return 1 ; + +return 0 ; +} +static int ionic_set_mac_address (struct net_device *netdev,void *sa) { +struct ionic_lif *lif =netdev_priv (netdev);struct sockaddr *addr = sa;u8 *mac;int err;
@@ -1702,6 +1761,14 @@ static int ionic_set_mac_address(struct net_device *netdev, void *sa)if (ether_addr_equal (netdev->dev_addr, mac))return 0 ; + err =ionic_program_mac (lif, mac); +if (err <0 ) +return err; + +if (err >0 ) +netdev_dbg (netdev,"%s: SET and GET ATTR Mac are not equal-due to old FW running\n" , + __func__); + err =eth_prepare_mac_addr_change (netdev, addr);if (err)return err;
@@ -3226,6 +3293,7 @@ static int ionic_station_set(struct ionic_lif *lif) .attr = IONIC_LIF_ATTR_MAC, }, }; +u8 mac_address[ETH_ALEN ];struct sockaddr addr;int err;
@@ -3234,8 +3302,23 @@ static int ionic_station_set(struct ionic_lif *lif)return err;netdev_dbg (lif->netdev,"found initial MAC addr %pM\n" , ctx.comp.lif_getattr.mac); -if (is_zero_ether_addr (ctx.comp.lif_getattr.mac)) -return 0 ; +ether_addr_copy (mac_address, ctx.comp.lif_getattr.mac); + +if (is_zero_ether_addr (mac_address)) { +eth_hw_addr_random (netdev); +netdev_dbg (netdev,"Random Mac generated: %pM\n" , netdev->dev_addr); +ether_addr_copy (mac_address, netdev->dev_addr); + + err =ionic_program_mac (lif, mac_address); +if (err <0 ) +return err; + +if (err >0 ) { +netdev_dbg (netdev,"%s:SET/GET ATTR Mac are not same-due to old FW running\n" , + __func__); +return 0 ; + } + }if (!is_zero_ether_addr (netdev->dev_addr)) {/* If the netdev mac is non-zero and doesn't match the default
@@ -3243,12 +3326,11 @@ static int ionic_station_set(struct ionic_lif *lif)* likely here again after a fw-upgrade reset. We need to be * sure the netdev mac is in our filter list. */ -if (!ether_addr_equal (ctx.comp.lif_getattr.mac, - netdev->dev_addr)) +if (!ether_addr_equal (mac_address, netdev->dev_addr))ionic_lif_addr_add (lif, netdev->dev_addr); }else {/* Update the netdev mac with the device's mac */ -memcpy (addr.sa_data, ctx.comp.lif_getattr.mac, netdev->addr_len); +ether_addr_copy (addr.sa_data, mac_address); addr.sa_family =AF_INET ; err =eth_prepare_mac_addr_change (netdev, &addr);if (err) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 94/136 net: stmmac: work around sporadic tx issue on link-up
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
[ Upstream commit a3a57bf07de23fe1ff779e0fdf710aa581c3ff73 ]
This is a follow-up to the discussion in [0]. It seems to me that at least the IP version used on Amlogic SoC's sometimes has a problem if register MAC_CTRL_REG is written whilst the chip is still processing a previous write. But that's just a guess.
Adding a delay between two writes to this register helps, but we can also simply omit the offending second write. This patch uses the second approach and is based on a suggestion from Qi Duan.
Benefit of this approach is that we can save few register writes, also on not affected chip versions.
[0] https://www.spinics.net/lists/netdev/msg831526.html
--- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 8 ++++++-- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 +++++---- 2 files changed, 11 insertions(+), 6 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +6 -2
@@ -258,14 +258,18 @@ EXPORT_SYMBOL_GPL(stmmac_set_mac_addr);/* Enable disable MAC RX/TX */ void stmmac_set_mac (void __iomem *ioaddr,bool enable) { -u32 value =readl (ioaddr +MAC_CTRL_REG ); +u32 old_val, value; + + old_val =readl (ioaddr +MAC_CTRL_REG ); + value = old_val;if (enable) value |=MAC_ENABLE_RX |MAC_ENABLE_TX ;else value &= ~(MAC_ENABLE_TX |MAC_ENABLE_RX ); -writel (value, ioaddr +MAC_CTRL_REG ); +if (value != old_val) +writel (value, ioaddr +MAC_CTRL_REG ); } void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +5 -4
@@ -1083,10 +1083,10 @@ static void stmmac_mac_link_up(struct phylink_config *config, bool tx_pause, bool rx_pause) {struct stmmac_priv *priv =netdev_priv (to_net_dev (config->dev)); -u32 ctrl; +u32 old_ctrl, ctrl; - ctrl =readl (priv->ioaddr +MAC_CTRL_REG ); - ctrl &= ~priv->hw->link.speed_mask; + old_ctrl =readl (priv->ioaddr +MAC_CTRL_REG ); + ctrl = old_ctrl & ~priv->hw->link.speed_mask;if (interface ==PHY_INTERFACE_MODE_USXGMII ) {switch (speed) {
@@ -1161,7 +1161,8 @@ static void stmmac_mac_link_up(struct phylink_config *config,if (tx_pause && rx_pause)stmmac_mac_flow_ctrl (priv, duplex); -writel (ctrl, priv->ioaddr +MAC_CTRL_REG ); +if (ctrl != old_ctrl) +writel (ctrl, priv->ioaddr +MAC_CTRL_REG );stmmac_mac_set (priv, priv->ioaddr, true);if (phy && priv->dma_cap.eee) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 95/136 btrfs: fix silent failure when deleting root reference
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 47bf225a8d2cccb15f7e8d4a1ed9b757dd86afd7 upstream.
At btrfs_del_root_ref(), if btrfs_search_slot() returns an error, we end up returning from the function with a value of 0 (success). This happens because the function returns the value stored in the variable 'err', which is 0, while the error value we got from btrfs_search_slot() is stored in the 'ret' variable.
So fix it by setting 'err' with the error value.
--- fs/btrfs/root-tree.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/btrfs/root-tree.c +3 -2
@@ -351,9 +351,10 @@ int btrfs_del_root_ref(struct btrfs_tran key.offset = ref_id; again: ret =btrfs_search_slot (trans, tree_root, &key, path,-1 ,1 ); -if (ret <0 ) +if (ret <0 ) { + err = ret; goto out; -if (ret ==0 ) { + }else if (ret ==0 ) { leaf = path->nodes[0 ]; ref =btrfs_item_ptr (leaf, path->slots[0 ], struct btrfs_root_ref);
Greg Kroah-Hartman
maintainerPATCH 96/136 btrfs: replace: drop assert for suspended replace
In reply to Greg Kroah-HartmanFrom: Anand Jain <[email protected]>
commit 59a3991984dbc1fc47e5651a265c5200bd85464e upstream.
If the filesystem mounts with the replace-operation in a suspended state and try to cancel the suspended replace-operation, we hit the assert. The assert came from the commit fe97e2e173af ("btrfs: dev-replace: replace's scrub must not be running in suspended state") that was actually not required. So just remove it.
$ mount /dev/sda5 /btrfs
BTRFS info (device sda5): cannot continue dev_replace, tgtdev is missing BTRFS info (device sda5): you may cancel the operation after 'mount -o degraded'
$ mount -o degraded /dev/sda5 /btrfs <-- success.
$ btrfs replace cancel /btrfs
kernel: assertion failed: ret != -ENOTCONN, in fs/btrfs/dev-replace.c:1131
kernel: ------------[ cut here ]------------
kernel: kernel BUG at fs/btrfs/ctree.h:3750!After the patch:
$ btrfs replace cancel /btrfs
BTRFS info (device sda5): suspended dev_replace from /dev/sda5 (devid 1) to <missing disk> canceled
--- fs/btrfs/dev-replace.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/btrfs/dev-replace.c +1 -2
@@ -1151,8 +1151,7 @@ int btrfs_dev_replace_cancel(struct btrfup_write (&dev_replace->rwsem);/* Scrub for replace must not be running in suspended state */ - ret =btrfs_scrub_cancel (fs_info); -ASSERT (ret != -ENOTCONN ); +btrfs_scrub_cancel (fs_info); trans =btrfs_start_transaction (root,0 );if (IS_ERR (trans)) {
Greg Kroah-Hartman
maintainerPATCH 97/136 btrfs: add info when mount fails due to stale replace target
In reply to Greg Kroah-HartmanFrom: Anand Jain <[email protected]>
commit f2c3bec215694fb8bc0ef5010f2a758d1906fc2d upstream.
If the replace target device reappears after the suspended replace is cancelled, it blocks the mount operation as it can't find the matching replace-item in the metadata. As shown below,
BTRFS error (device sda5): replace devid present without an active replace item
To overcome this situation, the user can run the command
btrfs device scan --forget <replace target device>
and try the mount command again. And also, to avoid repeating the issue, superblock on the devid=0 must be wiped.
wipefs -a device-path-to-devid=0.
This patch adds some info when this situation occurs.
--- fs/btrfs/dev-replace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/dev-replace.c +1 -1
@@ -165,7 +165,7 @@ no_valid_dev_replace_entry_found:*/ if (btrfs_find_device (fs_info->fs_devices, &args)) {btrfs_err (fs_info, -"replace devid present without an active replace item" ); +"replace without active item, run 'device scan --forget' on the target device" ); ret = -EUCLEAN ; }else { dev_replace->srcdev =NULL ;
Greg Kroah-Hartman
maintainerPATCH 98/136 btrfs: check if root is readonly while setting security xattr
In reply to Greg Kroah-HartmanFrom: Goldwyn Rodrigues <[email protected]>
commit b51111271b0352aa596c5ae8faf06939e91b3b68 upstream.
For a filesystem which has btrfs read-only property set to true, all write operations including xattr should be denied. However, security xattr can still be changed even if btrfs ro property is true.
This happens because xattr_permission() does not have any restrictions on security.*, system.* and in some cases trusted.* from VFS and the decision is left to the underlying filesystem. See comments in xattr_permission() for more details.
This patch checks if the root is read-only before performing the set xattr operation.
Testcase:
DEV=/dev/vdb
MNT=/mnt
mkfs.btrfs -f $DEV
mount $DEV $MNT
echo "file one" > $MNT/f1
setfattr -n "security.one" -v 2 $MNT/f1
btrfs property set /mnt ro true
setfattr -n "security.one" -v 1 $MNT/f1
umount $MNT
--- fs/btrfs/xattr.c | 3 +++ 1 file changed, 3 insertions(+)
fs/btrfs/xattr.c +3 -0
@@ -391,6 +391,9 @@ static int btrfs_xattr_handler_set(const const char *name, const void *buffer, size_t size, int flags) { + if (btrfs_root_readonly(BTRFS_I(inode)->root)) + return -EROFS; + name =xattr_full_name (handler, name);return btrfs_setxattr_trans (inode, name, buffer, size, flags); }
Greg Kroah-Hartman
maintainerPATCH 99/136 btrfs: fix possible memory leak in btrfs_get_dev_args_from_path()
In reply to Greg Kroah-HartmanFrom: Zixuan Fu <[email protected]>
commit 9ea0106a7a3d8116860712e3f17cd52ce99f6707 upstream.
In btrfs_get_dev_args_from_path(), btrfs_get_bdev_and_sb() can fail if the path is invalid. In this case, btrfs_get_dev_args_from_path() returns directly without freeing args->uuid and args->fsid allocated before, which causes memory leak.
To fix these possible leaks, when btrfs_get_bdev_and_sb() fails, btrfs_put_dev_args_from_path() is called to clean up the memory.
--- fs/btrfs/volumes.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/btrfs/volumes.c +4 -1
@@ -2392,8 +2392,11 @@ int btrfs_get_dev_args_from_path(struct ret =btrfs_get_bdev_and_sb (path,FMODE_READ , fs_info->bdev_holder,0 , &bdev, &disk_super); -if (ret) +if (ret) { +btrfs_put_dev_args_from_path (args);return ret; + } + args->devid =btrfs_stack_device_id (&disk_super->dev_item);memcpy (args->uuid, disk_super->dev_item.uuid,BTRFS_UUID_SIZE );if (btrfs_fs_incompat (fs_info,METADATA_UUID ))
Greg Kroah-Hartman
maintainerPATCH 100/136 perf/x86/lbr: Enable the branch type for the Arch LBR by default
In reply to Greg Kroah-HartmanFrom: Kan Liang <[email protected]>
commit 32ba156df1b1c8804a4e5be5339616945eafea22 upstream.
On the platform with Arch LBR, the HW raw branch type encoding may leak to the perf tool when the SAVE_TYPE option is not set.
In the intel_pmu_store_lbr(), the HW raw branch type is stored in lbr_entries[].type. If the SAVE_TYPE option is set, the lbr_entries[].type will be converted into the generic PERF_BR_* type in the intel_pmu_lbr_filter() and exposed to the user tools. But if the SAVE_TYPE option is NOT set by the user, the current perf kernel doesn't clear the field. The HW raw branch type leaks.
There are two solutions to fix the issue for the Arch LBR. One is to clear the field if the SAVE_TYPE option is NOT set. The other solution is to unconditionally convert the branch type and expose the generic type to the user tools.
The latter is implemented here, because
- The branch type is valuable information. I don't see a case where you would not benefit from the branch type. (Stephane Eranian)
- Not having the branch type DOES NOT save any space in the branch record (Stephane Eranian)
- The Arch LBR HW can retrieve the common branch types from the LBR_INFO. It doesn't require the high overhead SW disassemble.
--- arch/x86/events/intel/lbr.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/events/intel/lbr.c +8 -0
@@ -1114,6 +1114,14 @@ static int intel_pmu_setup_hw_lbr_filterif (static_cpu_has (X86_FEATURE_ARCH_LBR )) { reg->config = mask; + +/* +* The Arch LBR HW can retrieve the common branch types +* from the LBR_INFO. It doesn't require the high overhead +* SW disassemble. +* Enable the branch type by default for the Arch LBR. +*/ + reg->reg |=X86_BR_TYPE_SAVE ;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 101/136 x86/unwind/orc: Unwind ftrace trampolines with correct ORC entry
In reply to Greg Kroah-HartmanFrom: Chen Zhongjin <[email protected]>
commit fc2e426b1161761561624ebd43ce8c8d2fa058da upstream.
When meeting ftrace trampolines in ORC unwinding, unwinder uses address of ftrace_{regs_}call address to find the ORC entry, which gets next frame at sp+176.
If there is an IRQ hitting at sub $0xa8,%rsp, the next frame should be sp+8 instead of 176. It makes unwinder skip correct frame and throw warnings such as "wrong direction" or "can't access registers", etc, depending on the content of the incorrect frame address.
By adding the base address ftrace_{regs_}caller with the offset *ip - ops->trampoline*, we can get the correct address to find the ORC entry.
Also change "caller" to "tramp_addr" to make variable name conform to its content.
[ mingo: Clarified the changelog a bit. ]
--- arch/x86/kernel/unwind_orc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
arch/x86/kernel/unwind_orc.c +10 -5
@@ -93,22 +93,27 @@ static struct orc_entry *orc_find(unsignstatic struct orc_entry *orc_ftrace_find (unsigned long ip) {struct ftrace_ops *ops; -unsigned long caller; +unsigned long tramp_addr, offset; ops =ftrace_ops_trampoline (ip);if (!ops)return NULL ; +/* Set tramp_addr to the start of the code copied by the trampoline */ if (ops->flags &FTRACE_OPS_FL_SAVE_REGS ) - caller = (unsigned long )ftrace_regs_call; + tramp_addr = (unsigned long )ftrace_regs_caller;else - caller = (unsigned long )ftrace_call; + tramp_addr = (unsigned long )ftrace_caller; + +/* Now place tramp_addr to the location within the trampoline ip is at */ + offset = ip - ops->trampoline; + tramp_addr += offset;/* Prevent unlikely recursion */ -if (ip == caller) +if (ip == tramp_addr)return NULL ; -return orc_find (caller); +return orc_find (tramp_addr); }#else static struct orc_entry *orc_ftrace_find (unsigned long ip)
Greg Kroah-Hartman
maintainerPATCH 102/136 x86/bugs: Add "unknown" reporting for MMIO Stale Data
In reply to Greg Kroah-HartmanFrom: Pawan Gupta <[email protected]>
commit 7df548840c496b0141fb2404b889c346380c2b22 upstream.
Older Intel CPUs that are not in the affected processor list for MMIO Stale Data vulnerabilities currently report "Not affected" in sysfs, which may not be correct. Vulnerability status for these older CPUs is unknown.
Add known-not-affected CPUs to the whitelist. Report "unknown" mitigation status for CPUs that are not in blacklist, whitelist and also don't enumerate MSR ARCH_CAPABILITIES bits that reflect hardware immunity to MMIO Stale Data vulnerabilities.
Mitigation is not deployed when the status is unknown.
[ bp: Massage, fixup. ]
--- Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst | 14 +++ arch/x86/include/asm/cpufeatures.h | 5 - arch/x86/kernel/cpu/bugs.c | 14 ++- arch/x86/kernel/cpu/common.c | 42 ++++++---- 4 files changed, 56 insertions(+), 19 deletions(-)
Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst +14 -0
@@ -230,6 +230,20 @@ The possible values in this file are: * - 'Mitigation: Clear CPU buffers' - The processor is vulnerable and the CPU buffer clearing mitigation is enabled. + * - 'Unknown: No mitigations' + - The processor vulnerability status is unknown because it is + out of Servicing period. Mitigation is not attempted. + +Definitions: +------------ + +Servicing period: The process of providing functional and security updates to +Intel processors or platforms, utilizing the Intel Platform Update (IPU) +process or other similar mechanisms. + +End of Servicing Updates (ESU): ESU is the date at which Intel will no +longer provide Servicing, such as through IPU or other similar update +processes. ESU dates will typically be aligned to end of quarter. If the processor is vulnerable then the following information is appended to the above information:
arch/x86/include/asm/cpufeatures.h +3 -2
@@ -446,7 +446,8 @@#define X86_BUG_ITLB_MULTIHIT X86_BUG(23)/* CPU may incur MCE during certain page attribute changes */ #define X86_BUG_SRBDS X86_BUG(24)/* CPU may leak RNG bits if not mitigated */ #define X86_BUG_MMIO_STALE_DATA X86_BUG(25)/* CPU is affected by Processor MMIO Stale Data vulnerabilities */ -#define X86_BUG_RETBLEED X86_BUG(26)/* CPU is affected by RETBleed */ -#define X86_BUG_EIBRS_PBRSB X86_BUG(27)/* EIBRS is vulnerable to Post Barrier RSB Predictions */ +#define X86_BUG_MMIO_UNKNOWN X86_BUG(26)/* CPU is too old and its MMIO Stale Data status is unknown */ +#define X86_BUG_RETBLEED X86_BUG(27)/* CPU is affected by RETBleed */ +#define X86_BUG_EIBRS_PBRSB X86_BUG(28)/* EIBRS is vulnerable to Post Barrier RSB Predictions */ #endif /* _ASM_X86_CPUFEATURES_H */
arch/x86/kernel/cpu/bugs.c +12 -2
@@ -433,7 +433,8 @@ static void __init mmio_select_mitigatiou64 ia32_cap;if (!boot_cpu_has_bug (X86_BUG_MMIO_STALE_DATA ) || -cpu_mitigations_off ()) { +boot_cpu_has_bug (X86_BUG_MMIO_UNKNOWN ) || +cpu_mitigations_off ()) { mmio_mitigation =MMIO_MITIGATION_OFF ;return ; }
@@ -538,6 +539,8 @@ out:pr_info ("TAA: %s\n" , taa_strings[taa_mitigation]);if (boot_cpu_has_bug (X86_BUG_MMIO_STALE_DATA ))pr_info ("MMIO Stale Data: %s\n" , mmio_strings[mmio_mitigation]); +else if (boot_cpu_has_bug (X86_BUG_MMIO_UNKNOWN )) +pr_info ("MMIO Stale Data: Unknown: No mitigations\n" ); }static void __init md_clear_select_mitigation (void )
@@ -2268,6 +2271,9 @@ static ssize_t tsx_async_abort_show_statstatic ssize_t mmio_stale_data_show_state (char *buf) { +if (boot_cpu_has_bug (X86_BUG_MMIO_UNKNOWN )) +return sysfs_emit (buf,"Unknown: No mitigations\n" ); +if (mmio_mitigation ==MMIO_MITIGATION_OFF )return sysfs_emit (buf,"%s\n" , mmio_strings[mmio_mitigation]);
@@ -2414,6 +2420,7 @@ static ssize_t cpu_show_common(struct dereturn srbds_show_state (buf);case X86_BUG_MMIO_STALE_DATA : +case X86_BUG_MMIO_UNKNOWN :return mmio_stale_data_show_state (buf);case X86_BUG_RETBLEED :
@@ -2473,7 +2480,10 @@ ssize_t cpu_show_srbds(struct device *dessize_t cpu_show_mmio_stale_data (struct device *dev,struct device_attribute *attr,char *buf) { -return cpu_show_common (dev, attr, buf,X86_BUG_MMIO_STALE_DATA ); +if (boot_cpu_has_bug (X86_BUG_MMIO_UNKNOWN )) +return cpu_show_common (dev, attr, buf,X86_BUG_MMIO_UNKNOWN ); +else +return cpu_show_common (dev, attr, buf,X86_BUG_MMIO_STALE_DATA ); }ssize_t cpu_show_retbleed (struct device *dev,struct device_attribute *attr,char *buf)
arch/x86/kernel/cpu/common.c +27 -15
77 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 103/136 x86/nospec: Unwreck the RSB stuffing
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 4e3aa9238277597c6c7624f302d81a7b568b6f2d upstream.
Commit 2b1299322016 ("x86/speculation: Add RSB VM Exit protections") made a right mess of the RSB stuffing, rewrite the whole thing to not suck.
Thanks to Andrew for the enlightening comment about Post-Barrier RSB things so we can make this code less magical.
--- arch/x86/include/asm/nospec-branch.h | 80 +++++++++++++++++------------------ 1 file changed, 39 insertions(+), 41 deletions(-)
arch/x86/include/asm/nospec-branch.h +39 -41
@@ -35,33 +35,44 @@#define RSB_CLEAR_LOOPS 32/* To forcibly overwrite all entries */ /* +* Common helper for __FILL_RETURN_BUFFER and __FILL_ONE_RETURN. +*/ +#define __FILL_RETURN_SLOT \ + ANNOTATE_INTRA_FUNCTION_CALL; \ + call 772f; \ + int3; \ +772: + +/* +* Stuff the entire RSB. +* * Google experimented with loop-unrolling and this turned out to be * the optimal version - two calls, each with their own speculation * trap should their return address end up getting used, in a loop. */ -#define __FILL_RETURN_BUFFER (reg, nr, sp) \ - mov $(nr/2), reg; \ -771: \ - ANNOTATE_INTRA_FUNCTION_CALL; \ - call 772f; \ -773:/* speculation trap */ \ -UNWIND_HINT_EMPTY ; \ - pause; \ - lfence; \ - jmp 773b; \ -772: \ -ANNOTATE_INTRA_FUNCTION_CALL ; \ - call 774f; \ -775: /* speculation trap */ \ -UNWIND_HINT_EMPTY ; \ - pause; \ - lfence; \ - jmp 775b; \ -774: \ - add $(BITS_PER_LONG/8) * 2, sp; \ -dec reg; \ - jnz 771b; \ -/* barrier for jnz misprediction */ \ +#define __FILL_RETURN_BUFFER (reg, nr) \ + mov $(nr/2), reg; \ +771: \ + __FILL_RETURN_SLOT \ + __FILL_RETURN_SLOT \ + add $(BITS_PER_LONG/8) * 2, %_ASM_SP; \ + dec reg; \ + jnz 771b; \ +/* barrier for jnz misprediction */ \ + lfence; + +/* +* Stuff a single RSB slot. +* +* To mitigate Post-Barrier RSB speculation, one CALL instruction must be +* forced to retire before letting a RET instruction execute. +* +* On PBRSB-vulnerable CPUs, it is not safe for a RET to be executed +* before this point. +*/ +#define __FILL_ONE_RETURN \ + __FILL_RETURN_SLOT \ + add $(BITS_PER_LONG/8), %_ASM_SP; \ lfence;#ifdef __ASSEMBLY__
@@ -120,28 +131,15 @@#endif .endm -.macro ISSUE_UNBALANCED_RET_GUARD - ANNOTATE_INTRA_FUNCTION_CALL - call .Lunbalanced_ret_guard_\@ - int3 -.Lunbalanced_ret_guard_\@: - add $(BITS_PER_LONG/8), %_ASM_SP - lfence -.endm - /* * A simpler FILL_RETURN_BUFFER macro. Don't make people use the CPP * monstrosity above, manually. */ -.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req ftr2 -.ifb \ftr2 - ALTERNATIVE "jmp .Lskip_rsb_\@", "", \ftr -.else - ALTERNATIVE_2 "jmp .Lskip_rsb_\@", "", \ftr, "jmp .Lunbalanced_\@", \ftr2 -.endif - __FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP) -.Lunbalanced_\@: -ISSUE_UNBALANCED_RET_GUARD +.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req ftr2=ALT_NOT(X86_FEATURE_ALWAYS) +ALTERNATIVE_2 "jmp .Lskip_rsb_\@" , \ + __stringify(__FILL_RETURN_BUFFER(\reg,\nr)), \ftr, \ + __stringify(__FILL_ONE_RETURN), \ftr2 + .Lskip_rsb_\@: .endm
Greg Kroah-Hartman
maintainerPATCH 104/136 loop: Check for overflow while configuring loop
In reply to Greg Kroah-HartmanFrom: Siddh Raman Pant <[email protected]>
commit c490a0b5a4f36da3918181a8acdc6991d967c5f3 upstream.
The userspace can configure a loop using an ioctl call, wherein a configuration of type loop_config is passed (see lo_ioctl()'s case on line 1550 of drivers/block/loop.c). This proceeds to call loop_configure() which in turn calls loop_set_status_from_info() (see line 1050 of loop.c), passing &config->info which is of type loop_info64*. This function then sets the appropriate values, like the offset.
loop_device has lo_offset of type loff_t (see line 52 of loop.c), which is typdef-chained to long long, whereas loop_info64 has lo_offset of type __u64 (see line 56 of include/uapi/linux/loop.h).
The function directly copies offset from info to the device as follows (See line 980 of loop.c):
lo->lo_offset = info->lo_offset;
This results in an overflow, which triggers a warning in iomap_iter() due to a call to iomap_iter_done() which has:
WARN_ON_ONCE(iter->iomap.offset > iter->pos);
Thus, check for negative value during loop_set_status_from_info().
Bug report: https://syzkaller.appspot.com/bug?id=c620fe14aac810396d3c3edc9ad73848bf69a29e
--- drivers/block/loop.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/block/loop.c +5 -0
@@ -1154,6 +1154,11 @@ loop_set_status_from_info(struct loop_de lo->lo_offset = info->lo_offset; lo->lo_sizelimit = info->lo_sizelimit; + +/* loff_t vars have been assigned __u64 */ +if (lo->lo_offset <0 || lo->lo_sizelimit <0 ) +return -EOVERFLOW ; +memcpy (lo->lo_file_name, info->lo_file_name,LO_NAME_SIZE );memcpy (lo->lo_crypt_name, info->lo_crypt_name,LO_NAME_SIZE ); lo->lo_file_name[LO_NAME_SIZE -1 ] =0 ;
Greg Kroah-Hartman
maintainerPATCH 105/136 writeback: avoid use-after-free after removing device
In reply to Greg Kroah-HartmanFrom: Khazhismel Kumykov <[email protected]>
commit f87904c075515f3e1d8f4a7115869d3b914674fd upstream.
When a disk is removed, bdi_unregister gets called to stop further writeback and wait for associated delayed work to complete. However, wb_inode_writeback_end() may schedule bandwidth estimation dwork after this has completed, which can result in the timer attempting to access the just freed bdi_writeback.
Fix this by checking if the bdi_writeback is alive, similar to when scheduling writeback work.
Since this requires wb->work_lock, and wb_inode_writeback_end() may get called from interrupt, switch wb->work_lock to an irqsafe lock.
--- fs/fs-writeback.c | 12 ++++++------ mm/backing-dev.c | 10 +++++----- mm/page-writeback.c | 6 +++++- 3 files changed, 16 insertions(+), 12 deletions(-)
fs/fs-writeback.c +6 -6
@@ -134,10 +134,10 @@ static bool inode_io_list_move_locked(ststatic void wb_wakeup (struct bdi_writeback *wb) { -spin_lock_bh (&wb->work_lock); +spin_lock_irq (&wb->work_lock);if (test_bit (WB_registered, &wb->state))mod_delayed_work (bdi_wq, &wb->dwork,0 ); -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock); } static void finish_writeback_work(struct bdi_writeback *wb,
@@ -164,7 +164,7 @@ static void wb_queue_work(struct bdi_wriif (work->done)atomic_inc (&work->done->cnt); -spin_lock_bh (&wb->work_lock); +spin_lock_irq (&wb->work_lock);if (test_bit (WB_registered, &wb->state)) {list_add_tail (&work->list, &wb->work_list);
@@ -172,7 +172,7 @@ static void wb_queue_work(struct bdi_wri }else finish_writeback_work (wb, work); -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock); }/**
@@ -2109,13 +2109,13 @@ static struct wb_writeback_work *get_nex {struct wb_writeback_work *work =NULL ; -spin_lock_bh (&wb->work_lock); +spin_lock_irq (&wb->work_lock);if (!list_empty (&wb->work_list)) { work =list_entry (wb->work_list.next, struct wb_writeback_work, list);list_del_init (&work->list); } -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock);return work; }
mm/backing-dev.c +5 -5
@@ -258,10 +258,10 @@ void wb_wakeup_delayed(struct bdi_writebunsigned long timeout; timeout =msecs_to_jiffies (dirty_writeback_interval *10 ); -spin_lock_bh (&wb->work_lock); +spin_lock_irq (&wb->work_lock);if (test_bit (WB_registered, &wb->state))queue_delayed_work (bdi_wq, &wb->dwork, timeout); -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock); }static void wb_update_bandwidth_workfn (struct work_struct *work)
@@ -337,12 +337,12 @@ static void cgwb_remove_from_bdi_list(ststatic void wb_shutdown (struct bdi_writeback *wb) {/* Make sure nobody queues further work */ -spin_lock_bh (&wb->work_lock); +spin_lock_irq (&wb->work_lock);if (!test_and_clear_bit (WB_registered, &wb->state)) { -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock);return ; } -spin_unlock_bh (&wb->work_lock); +spin_unlock_irq (&wb->work_lock);cgwb_remove_from_bdi_list (wb);/*
mm/page-writeback.c +5 -1
@@ -2755,6 +2755,7 @@ static void wb_inode_writeback_start(strstatic void wb_inode_writeback_end (struct bdi_writeback *wb) { +unsigned long flags;atomic_dec (&wb->writeback_inodes);/* * Make sure estimate of writeback throughput gets updated after
@@ -2763,7 +2764,10 @@ static void wb_inode_writeback_end(struc* that if multiple inodes end writeback at a similar time, they get * batched into one bandwidth update. */ -queue_delayed_work (bdi_wq, &wb->bw_dwork,BANDWIDTH_INTERVAL ); +spin_lock_irqsave (&wb->work_lock, flags); +if (test_bit (WB_registered, &wb->state)) +queue_delayed_work (bdi_wq, &wb->bw_dwork,BANDWIDTH_INTERVAL ); +spin_unlock_irqrestore (&wb->work_lock, flags); }int test_clear_page_writeback (struct page *page)
Greg Kroah-Hartman
maintainerPATCH 106/136 asm-generic: sections: refactor memory_intersects
In reply to Greg Kroah-HartmanFrom: Quanyang Wang <[email protected]>
commit 0c7d7cc2b4fe2e74ef8728f030f0f1674f9f6aee upstream.
There are two problems with the current code of memory_intersects:
First, it doesn't check whether the region (begin, end) falls inside the region (virt, vend), that is (virt < begin && vend > end).
The second problem is if vend is equal to begin, it will return true but this is wrong since vend (virt + size) is not the last address of the memory region but (virt + size -1) is. The wrong determination will trigger the misreporting when the function check_for_illegal_area calls memory_intersects to check if the dma region intersects with stext region.
The misreporting is as below (stext is at 0x80100000):
WARNING: CPU: 0 PID: 77 at kernel/dma/debug.c:1073 check_for_illegal_area+0x130/0x168 DMA-API: chipidea-usb2 e0002000.usb: device driver maps memory from kernel text or rodata [addr=800f0000] [len=65536] Modules linked in: CPU: 1 PID: 77 Comm: usb-storage Not tainted 5.19.0-yocto-standard #5 Hardware name: Xilinx Zynq Platform unwind_backtrace from show_stack+0x18/0x1c show_stack from dump_stack_lvl+0x58/0x70 dump_stack_lvl from __warn+0xb0/0x198 __warn from warn_slowpath_fmt+0x80/0xb4 warn_slowpath_fmt from check_for_illegal_area+0x130/0x168 check_for_illegal_area from debug_dma_map_sg+0x94/0x368 debug_dma_map_sg from __dma_map_sg_attrs+0x114/0x128 __dma_map_sg_attrs from dma_map_sg_attrs+0x18/0x24 dma_map_sg_attrs from usb_hcd_map_urb_for_dma+0x250/0x3b4 usb_hcd_map_urb_for_dma from usb_hcd_submit_urb+0x194/0x214 usb_hcd_submit_urb from usb_sg_wait+0xa4/0x118 usb_sg_wait from usb_stor_bulk_transfer_sglist+0xa0/0xec usb_stor_bulk_transfer_sglist from usb_stor_bulk_srb+0x38/0x70 usb_stor_bulk_srb from usb_stor_Bulk_transport+0x150/0x360 usb_stor_Bulk_transport from usb_stor_invoke_transport+0x38/0x440 usb_stor_invoke_transport from usb_stor_control_thread+0x1e0/0x238 usb_stor_control_thread from kthread+0xf8/0x104 kthread from ret_from_fork+0x14/0x2c
Refactor memory_intersects to fix the two problems above.
Before the 1d7db834a027e ("dma-debug: use memory_intersects() directly"), memory_intersects is called only by printk_late_init:
printk_late_init -> init_section_intersects ->memory_intersects.
There were few places where memory_intersects was called.
When commit 1d7db834a027e ("dma-debug: use memory_intersects() directly") was merged and CONFIG_DMA_API_DEBUG is enabled, the DMA subsystem uses it to check for an illegal area and the calltrace above is triggered.
--- include/asm-generic/sections.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
include/asm-generic/sections.h +5 -2
@@ -114,7 +114,7 @@ static inline bool memory_contains(void/** * memory_intersects - checks if the region occupied by an object intersects * with another memory region -* @begin: virtual address of the beginning of the memory regien +* @begin: virtual address of the beginning of the memory region * @end: virtual address of the end of the memory region * @virt: virtual address of the memory object * @size: size of the memory object
@@ -127,7 +127,10 @@ static inline bool memory_intersects(voi {void *vend = virt + size; -return (virt >= begin && virt < end) || (vend >= begin && vend < end); +if (virt < end && vend > begin) +return true; + +return false; }/**
Greg Kroah-Hartman
maintainerPATCH 107/136 mm/damon/dbgfs: avoid duplicate context directory creation
In reply to Greg Kroah-HartmanFrom: Badari Pulavarty <[email protected]>
commit d26f60703606ab425eee9882b32a1781a8bed74d upstream.
When user tries to create a DAMON context via the DAMON debugfs interface with a name of an already existing context, the context directory creation fails but a new context is created and added in the internal data structure, due to absence of the directory creation success check. As a result, memory could leak and DAMON cannot be turned on. An example test case is as below:
# cd /sys/kernel/debug/damon/
# echo "off" > monitor_on
# echo paddr > target_ids
# echo "abc" > mk_context
# echo "abc" > mk_context
# echo $$ > abc/target_ids
# echo "on" > monitor_on <<< failsReturn value of 'debugfs_create_dir()' is expected to be ignored in general, but this is an exceptional case as DAMON feature is depending on the debugfs functionality and it has the potential duplicate name issue. This commit therefore fixes the issue by checking the directory creation failure and immediately return the error in the case.
--- mm/damon/dbgfs.c | 3 +++ 1 file changed, 3 insertions(+)
mm/damon/dbgfs.c +3 -0
@@ -376,6 +376,9 @@ static int dbgfs_mk_context(char *name)return -ENOENT ; new_dir =debugfs_create_dir (name, root); +/* Below check is required for a potential duplicated name case */ +if (IS_ERR (new_dir)) +return PTR_ERR (new_dir); dbgfs_dirs[dbgfs_nr_ctxs] = new_dir; new_ctx =dbgfs_new_ctx ();
Greg Kroah-Hartman
maintainerPATCH 108/136 s390/mm: do not trigger write fault when vma does not allow VM_WRITE
In reply to Greg Kroah-HartmanFrom: Gerald Schaefer <[email protected]>
commit 41ac42f137080bc230b5882e3c88c392ab7f2d32 upstream.
For non-protection pXd_none() page faults in do_dat_exception(), we call do_exception() with access == (VM_READ | VM_WRITE | VM_EXEC). In do_exception(), vma->vm_flags is checked against that before calling handle_mm_fault().
Since commit 92f842eac7ee3 ("[S390] store indication fault optimization"), we call handle_mm_fault() with FAULT_FLAG_WRITE, when recognizing that it was a write access. However, the vma flags check is still only checking against (VM_READ | VM_WRITE | VM_EXEC), and therefore also calling handle_mm_fault() with FAULT_FLAG_WRITE in cases where the vma does not allow VM_WRITE.
Fix this by changing access check in do_exception() to VM_WRITE only, when recognizing write access.
--- arch/s390/mm/fault.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/s390/mm/fault.c +3 -1
@@ -397,7 +397,9 @@ static inline vm_fault_t do_exception(st flags =FAULT_FLAG_DEFAULT ;if (user_mode (regs)) flags |=FAULT_FLAG_USER ; -if (access ==VM_WRITE || is_write) +if (is_write) + access =VM_WRITE ; +if (access ==VM_WRITE ) flags |=FAULT_FLAG_WRITE ;mmap_read_lock (mm);
Greg Kroah-Hartman
maintainerPATCH 109/136 bootmem: remove the vmemmap pages from kmemleak in put_page_bootmem
In reply to Greg Kroah-HartmanFrom: Liu Shixin <[email protected]>
commit dd0ff4d12dd284c334f7e9b07f8f335af856ac78 upstream.
The vmemmap pages is marked by kmemleak when allocated from memblock. Remove it from kmemleak when freeing the page. Otherwise, when we reuse the page, kmemleak may report such an error and then stop working.
kmemleak: Cannot insert 0xffff98fb6eab3d40 into the object search tree (overlaps existing)
kmemleak: Kernel memory leak detector disabled
kmemleak: Object 0xffff98fb6be00000 (size 335544320):
kmemleak: comm "swapper", pid 0, jiffies 4294892296 kmemleak: min_count = 0 kmemleak: count = 0 kmemleak: flags = 0x1 kmemleak: checksum = 0 kmemleak: backtrace:
--- mm/bootmem_info.c | 2 ++ 1 file changed, 2 insertions(+)
mm/bootmem_info.c +2 -0
@@ -12,6 +12,7 @@#include <linux/memblock.h> #include <linux/bootmem_info.h> #include <linux/memory_hotplug.h> +#include <linux/kmemleak.h> void get_page_bootmem (unsigned long info,struct page *page,unsigned long type) {
@@ -34,6 +35,7 @@ void put_page_bootmem(struct page *page)ClearPagePrivate (page);set_page_private (page,0 );INIT_LIST_HEAD (&page->lru); +kmemleak_free_part (page_to_virt (page),PAGE_SIZE );free_reserved_page (page); } }
Greg Kroah-Hartman
maintainerPATCH 110/136 s390: fix double free of GS and RI CBs on fork() failure
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
commit 13cccafe0edcd03bf1c841de8ab8a1c8e34f77d9 upstream.
The pointers for guarded storage and runtime instrumentation control blocks are stored in the thread_struct of the associated task. These pointers are initially copied on fork() via arch_dup_task_struct() and then cleared via copy_thread() before fork() returns. If fork() happens to fail after the initial task dup and before copy_thread(), the newly allocated task and associated thread_struct memory are freed via free_task() -> arch_release_task_struct(). This results in a double free of the guarded storage and runtime info structs because the fields in the failed task still refer to memory associated with the source task.
This problem can manifest as a BUG_ON() in set_freepointer() (with CONFIG_SLAB_FREELIST_HARDENED enabled) or KASAN splat (if enabled) when running trinity syscall fuzz tests on s390x. To avoid this problem, clear the associated pointer fields in arch_dup_task_struct() immediately after the new task is copied. Note that the RI flag is still cleared in copy_thread() because it resides in thread stack memory and that is where stack info is copied.
--- arch/s390/kernel/process.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
arch/s390/kernel/process.c +16 -6
@@ -91,6 +91,18 @@ int arch_dup_task_struct(struct task_strmemcpy (dst, src, arch_task_struct_size); dst->thread.fpu.regs = dst->thread.fpu.fprs; + +/* +* Don't transfer over the runtime instrumentation or the guarded +* storage control block pointers. These fields are cleared here instead +* of in copy_thread() to avoid premature freeing of associated memory +* on fork() failure. Wait to clear the RI flag because ->stack still +* refers to the source thread. +*/ + dst->thread.ri_cb =NULL ; + dst->thread.gs_cb =NULL ; + dst->thread.gs_bc_cb =NULL ; +return 0 ; }
@@ -149,13 +161,11 @@ int copy_thread(unsigned long clone_flag frame->childregs.flags =0 ;if (new_stackp) frame->childregs.gprs[15 ] = new_stackp; - -/* Don't copy runtime instrumentation info */ - p->thread.ri_cb =NULL ; +/* +* Clear the runtime instrumentation flag after the above childregs +* copy. The CB pointer was already cleared in arch_dup_task_struct(). +*/ frame->childregs.psw.mask &= ~PSW_MASK_RI ; -/* Don't copy guarded storage control block */ - p->thread.gs_cb =NULL ; - p->thread.gs_bc_cb =NULL ;/* Set a new TLS ? */ if (clone_flags &CLONE_SETTLS ) {
Greg Kroah-Hartman
maintainerPATCH 111/136 fbdev: fbcon: Properly revert changes when vc_resize() failed
In reply to Greg Kroah-HartmanFrom: Shigeru Yoshida <[email protected]>
commit a5a923038d70d2d4a86cb4e3f32625a5ee6e7e24 upstream.
fbcon_do_set_font() calls vc_resize() when font size is changed. However, if if vc_resize() failed, current implementation doesn't revert changes for font size, and this causes inconsistent state.
syzbot reported unable to handle page fault due to this issue [1]. syzbot's repro uses fault injection which cause failure for memory allocation, so vc_resize() failed.
This patch fixes this issue by properly revert changes for font related date when vc_resize() failed.
--- drivers/video/fbdev/core/fbcon.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
drivers/video/fbdev/core/fbcon.c +25 -2
@@ -2413,15 +2413,21 @@ static int fbcon_do_set_font(struct vc_dstruct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];struct fbcon_ops *ops = info->fbcon_par;struct fbcon_display *p = &fb_display[vc->vc_num]; -int resize; +int resize, ret, old_userfont, old_width, old_height, old_charcount;char *old_data =NULL ; resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);if (p->userfont) old_data = vc->vc_font.data; vc->vc_font.data = (void *)(p->fontdata = data); + old_userfont = p->userfont;if ((p->userfont = userfont))REFCOUNT (data)++; + + old_width = vc->vc_font.width; + old_height = vc->vc_font.height; + old_charcount = vc->vc_font.charcount; + vc->vc_font.width = w; vc->vc_font.height = h; vc->vc_font.charcount = charcount;
@@ -2437,7 +2443,9 @@ static int fbcon_do_set_font(struct vc_d rows =FBCON_SWAP (ops->rotate, info->var.yres, info->var.xres); cols /= w; rows /= h; -vc_resize (vc, cols, rows); + ret =vc_resize (vc, cols, rows); +if (ret) + goto err_out; }else if (con_is_visible (vc) && vc->vc_mode ==KD_TEXT ) {fbcon_clear_margins (vc,0 );
@@ -2447,6 +2455,21 @@ static int fbcon_do_set_font(struct vc_dif (old_data && (--REFCOUNT (old_data) ==0 ))kfree (old_data -FONT_EXTRA_WORDS *sizeof (int ));return 0 ; + +err_out: + p->fontdata = old_data; + vc->vc_font.data = (void *)old_data; + +if (userfont) { + p->userfont = old_userfont; +REFCOUNT (data)--; + } + + vc->vc_font.width = old_width; + vc->vc_font.height = old_height; + vc->vc_font.charcount = old_charcount; + +return ret; }/*
Greg Kroah-Hartman
maintainerPATCH 112/136 Revert "memcg: cleanup racy sum avoidance code"
In reply to Greg Kroah-HartmanFrom: Shakeel Butt <[email protected]>
commit dbb16df6443c59e8a1ef21c2272fcf387d600ddf upstream.
This reverts commit 96e51ccf1af33e82f429a0d6baebba29c6448d0f.
Recently we started running the kernel with rstat infrastructure on production traffic and begin to see negative memcg stats values. Particularly the 'sock' stat is the one which we observed having negative value.
$ grep "sock " /mnt/memory/job/memory.stat sock 253952 total_sock 18446744073708724224
Re-run after couple of seconds
$ grep "sock " /mnt/memory/job/memory.stat sock 253952 total_sock 53248
For now we are only seeing this issue on large machines (256 CPUs) and only with 'sock' stat. I think the networking stack increase the stat on one cpu and decrease it on another cpu much more often. So, this negative sock is due to rstat flusher flushing the stats on the CPU that has seen the decrement of sock but missed the CPU that has increments. A typical race condition.
For easy stable backport, revert is the most simple solution. For long term solution, I am thinking of two directions. First is just reduce the race window by optimizing the rstat flusher. Second is if the reader sees a negative stat value, force flush and restart the stat collection. Basically retry but limited.
--- include/linux/memcontrol.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
include/linux/memcontrol.h +13 -2
@@ -966,19 +966,30 @@ static inline void mod_memcg_state(strucstatic inline unsigned long memcg_page_state (struct mem_cgroup *memcg,int idx) { -return READ_ONCE (memcg->vmstats.state[idx]); +long x =READ_ONCE (memcg->vmstats.state[idx]); +#ifdef CONFIG_SMP +if (x <0 ) + x =0 ; +#endif +return x; }static inline unsigned long lruvec_page_state (struct lruvec *lruvec,enum node_stat_item idx) {struct mem_cgroup_per_node *pn; +long x;if (mem_cgroup_disabled ())return node_page_state (lruvec_pgdat (lruvec), idx); pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); -return READ_ONCE (pn->lruvec_stats.state[idx]); + x =READ_ONCE (pn->lruvec_stats.state[idx]); +#ifdef CONFIG_SMP +if (x <0 ) + x =0 ; +#endif +return x; } static inline unsigned long lruvec_page_state_local(struct lruvec *lruvec,
Greg Kroah-Hartman
maintainerPATCH 113/136 ACPI: processor: Remove freq Qos request for all CPUs
In reply to Greg Kroah-HartmanFrom: Riwen Lu <[email protected]>
commit 36527b9d882362567ceb4eea8666813280f30e6f upstream.
The freq Qos request would be removed repeatedly if the cpufreq policy relates to more than one CPU. Then, it would cause the "called for unknown object" warning.
Remove the freq Qos request for each CPU relates to the cpufreq policy, instead of removing repeatedly for the last CPU of it.
--- drivers/acpi/processor_thermal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/processor_thermal.c +1 -1
@@ -144,7 +144,7 @@ void acpi_thermal_cpufreq_exit(struct cpunsigned int cpu;for_each_cpu (cpu, policy->related_cpus) { -struct acpi_processor *pr =per_cpu (processors, policy->cpu); +struct acpi_processor *pr =per_cpu (processors, cpu);if (pr)freq_qos_remove_request (&pr->thermal_req);
Greg Kroah-Hartman
maintainerPATCH 114/136 nouveau: explicitly wait on the fence in nouveau_bo_move_m2mf
In reply to Greg Kroah-HartmanFrom: Karol Herbst <[email protected]>
commit 6b04ce966a738ecdd9294c9593e48513c0dc90aa upstream.
It is a bit unlcear to us why that's helping, but it does and unbreaks suspend/resume on a lot of GPUs without any known drawbacks.
--- drivers/gpu/drm/nouveau/nouveau_bo.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/gpu/drm/nouveau/nouveau_bo.c +9 -0
@@ -820,6 +820,15 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict,if (ret ==0 ) { ret =nouveau_fence_new (chan, false, &fence);if (ret ==0 ) { +/* TODO: figure out a better solution here +* +* wait on the fence here explicitly as going through +* ttm_bo_move_accel_cleanup somehow doesn't seem to do it. +* +* Without this the operation can timeout and we'll fallback to a +* software copy, which might take several minutes to finish. +*/ +nouveau_fence_wait (fence, false, false); ret = ttm_bo_move_accel_cleanup(bo, &fence->base, evict, false,
Signature · 1 line
2.37.2
Greg Kroah-Hartman
maintainerPATCH 115/136 smb3: missing inode locks in punch hole
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
commit ba0803050d610d5072666be727bca5e03e55b242 upstream.
smb3 fallocate punch hole was not grabbing the inode or filemap_invalidate locks so could have race with pagemap reinstantiating the page.
--- fs/cifs/smb2ops.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/cifs/smb2ops.c +6 -6
@@ -3599,7 +3599,7 @@ static long smb3_zero_range(struct filestatic long smb3_punch_hole (struct file *file,struct cifs_tcon *tcon,loff_t offset,loff_t len) { -struct inode *inode; +struct inode *inode =file_inode (file);struct cifsFileInfo *cfile = file->private_data;struct file_zero_data_information fsctl_buf;long rc;
@@ -3608,14 +3608,12 @@ static long smb3_punch_hole(struct file xid =get_xid (); - inode =d_inode (cfile->dentry); - +inode_lock (inode);/* Need to make file sparse, if not already, before freeing range. */ /* Consider adding equivalent for compressed since it could also work */ if (!smb2_set_sparse (xid, tcon, cfile, inode, set_sparse)) { rc = -EOPNOTSUPP ; -free_xid (xid); -return rc; + goto out; }filemap_invalidate_lock (inode->i_mapping);
@@ -3635,8 +3633,10 @@ static long smb3_punch_hole(struct file true/* is_fctl */ , (char *)&fsctl_buf,sizeof (struct file_zero_data_information ), CIFSMaxBufSize, NULL, NULL); -free_xid (xid);filemap_invalidate_unlock (inode->i_mapping); +out: +inode_unlock (inode); +free_xid (xid);return rc; }
Greg Kroah-Hartman
maintainerPATCH 116/136 xen/privcmd: fix error exit of privcmd_ioctl_dm_op()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
commit c5deb27895e017a0267de0a20d140ad5fcc55a54 upstream.
The error exit of privcmd_ioctl_dm_op() is calling unlock_pages() potentially with pages being NULL, leading to a NULL dereference.
Additionally lock_pages() doesn't check for pin_user_pages_fast() having been completely successful, resulting in potentially not locking all pages into memory. This could result in sporadic failures when using the related memory in user mode.
Fix all of that by calling unlock_pages() always with the real number of pinned pages, which will be zero in case pages being NULL, and by checking the number of pages pinned by pin_user_pages_fast() matching the expected number of pages.
--- drivers/xen/privcmd.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/xen/privcmd.c +11 -10
@@ -581,27 +581,30 @@ static int lock_pages( struct privcmd_dm_op_buf kbufs[], unsigned int num, struct page *pages[], unsigned int nr_pages, unsigned int *pinned) { - unsigned int i; + unsigned int i, off = 0; -for (i =0 ; i < num; i++) { +for (i =0 ; i < num; ) {unsigned int requested;int page_count; requested =DIV_ROUND_UP (offset_in_page (kbufs[i].uptr) + kbufs[i].size, -PAGE_SIZE ); +PAGE_SIZE ) - off;if (requested > nr_pages)return -ENOSPC ; page_count =pin_user_pages_fast ( - (unsigned long ) kbufs[i].uptr, + (unsigned long )kbufs[i].uptr + off *PAGE_SIZE , requested,FOLL_WRITE , pages); -if (page_count <0 ) -return page_count; +if (page_count <=0 ) +return page_count ? : -EFAULT ; *pinned += page_count; nr_pages -= page_count; pages += page_count; + + off = (requested == page_count) ?0 : off + page_count; + i += !off; }return 0 ;
@@ -677,10 +680,8 @@ static long privcmd_ioctl_dm_op(struct f } rc =lock_pages (kbufs, kdata.num, pages, nr_pages, &pinned); -if (rc <0 ) { - nr_pages = pinned; +if (rc <0 ) goto out; - }for (i =0 ; i < kdata.num; i++) {set_xen_guest_handle (xbufs[i].h, kbufs[i].uptr);
@@ -692,7 +693,7 @@ static long privcmd_ioctl_dm_op(struct fxen_preemptible_hcall_end (); out: -unlock_pages (pages, nr_pages); +unlock_pages (pages, pinned);kfree (xbufs);kfree (pages);kfree (kbufs);
Greg Kroah-Hartman
maintainerPATCH 117/136 riscv: traps: add missing prototype
In reply to Greg Kroah-HartmanFrom: Conor Dooley <[email protected]>
commit d951b20b9def73dcc39a5379831525d0d2a537e9 upstream.
Sparse complains:arch/riscv/kernel/traps.c:213:6: warning: symbol 'shadow_stack' was not declared. Should it be static?
The variable is used in entry.S, so declare shadow_stack there alongside SHADOW_OVERFLOW_STACK_SIZE.
--- arch/riscv/include/asm/thread_info.h | 2 ++ arch/riscv/kernel/traps.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-)
arch/riscv/include/asm/thread_info.h +2 -0
@@ -42,6 +42,8 @@#ifndef __ASSEMBLY__ +extern long shadow_stack[SHADOW_OVERFLOW_STACK_SIZE /sizeof (long )]; +#include <asm/processor.h> #include <asm/csr.h>
arch/riscv/kernel/traps.c +2 -1
@@ -20,9 +20,10 @@#include <asm/asm-prototypes.h> #include <asm/bug.h> +#include <asm/csr.h> #include <asm/processor.h> #include <asm/ptrace.h> -#include <asm/csr.h> +#include <asm/thread_info.h> int show_unhandled_signals =1 ;
Greg Kroah-Hartman
maintainerPATCH 118/136 io_uring: fix issue with io_write() not always undoing sb_start_write()
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit e053aaf4da56cbf0afb33a0fda4a62188e2c0637 upstream.
This is actually an older issue, but we never used to hit the -EAGAIN path before having done sb_start_write(). Make sure that we always call kiocb_end_write() if we need to retry the write, so that we keep the calls to sb_start_write() etc balanced.
--- fs/io_uring.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/io_uring.c +6 -1
@@ -3720,7 +3720,12 @@ done: copy_iov:iov_iter_restore (iter, state); ret =io_setup_async_rw (req, iovec, inline_vecs, iter, false); -return ret ?: -EAGAIN ; +if (!ret) { +if (kiocb->ki_flags &IOCB_WRITE ) +kiocb_end_write (req); +return -EAGAIN ; + } +return ret; } out_free:/* it's reportedly faster than delegating the null check to kfree() */
Greg Kroah-Hartman
maintainerPATCH 119/136 Revert "usbnet: smsc95xx: Fix deadlock on runtime resume"
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
This reverts commit b574d1e3e9a2432b5acd9c4a9dc8d70b6a37aaf1 which is commit 7b960c967f2aa01ab8f45c5a0bd78e754cffdeee upstream.
It is reported to cause problems, so drop it from the 5.15.y tree until the root cause can be determined.
--- drivers/net/usb/smsc95xx.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/net/usb/smsc95xx.c +6 -20
@@ -69,7 +69,6 @@ struct smsc95xx_priv {struct fwnode_handle *irqfwnode;struct mii_bus *mdiobus;struct phy_device *phydev; -struct task_struct *pm_task; };static bool turbo_mode = true;
@@ -79,14 +78,13 @@ MODULE_PARM_DESC(turbo_mode, "Enable mulstatic int __must_check __smsc95xx_read_reg (struct usbnet *dev,u32 index,u32 *data,int in_pm) { -struct smsc95xx_priv *pdata = dev->driver_priv;u32 buf;int ret;int (*fn)(struct usbnet *,u8 ,u8 ,u16 ,u16 ,void *,u16 );BUG_ON (!dev); -if (current != pdata->pm_task) +if (!in_pm) fn = usbnet_read_cmd;else fn = usbnet_read_cmd_nopm;
@@ -110,14 +108,13 @@ static int __must_check __smsc95xx_read_static int __must_check __smsc95xx_write_reg (struct usbnet *dev,u32 index,u32 data,int in_pm) { -struct smsc95xx_priv *pdata = dev->driver_priv;u32 buf;int ret;int (*fn)(struct usbnet *,u8 ,u8 ,u16 ,u16 ,const void *,u16 );BUG_ON (!dev); -if (current != pdata->pm_task) +if (!in_pm) fn = usbnet_write_cmd;else fn = usbnet_write_cmd_nopm;
@@ -1485,12 +1482,9 @@ static int smsc95xx_suspend(struct usb_iu32 val, link_up;int ret; - pdata->pm_task = current; - ret =usbnet_suspend (intf, message);if (ret <0 ) {netdev_warn (dev->net,"usbnet_suspend error\n" ); - pdata->pm_task =NULL ;return ret; }
@@ -1730,7 +1724,6 @@ done:if (ret &&PMSG_IS_AUTO (message))usbnet_resume (intf); - pdata->pm_task =NULL ;return ret; }
@@ -1751,31 +1744,29 @@ static int smsc95xx_resume(struct usb_in/* do this first to ensure it's cleared even in error case */ pdata->suspend_flags =0 ; - pdata->pm_task = current; -if (suspend_flags &SUSPEND_ALLMODES ) {/* clear wake-up sources */ ret =smsc95xx_read_reg_nopm (dev,WUCSR , &val);if (ret <0 ) - goto done; +return ret; val &= ~(WUCSR_WAKE_EN_ |WUCSR_MPEN_ ); ret =smsc95xx_write_reg_nopm (dev,WUCSR , val);if (ret <0 ) - goto done; +return ret;/* clear wake-up status */ ret =smsc95xx_read_reg_nopm (dev,PM_CTRL , &val);if (ret <0 ) - goto done; +return ret; val &= ~PM_CTL_WOL_EN_ ; val |=PM_CTL_WUPS_ ; ret =smsc95xx_write_reg_nopm (dev,PM_CTRL , val);if (ret <0 ) - goto done; +return ret; }phy_init_hw (pdata->phydev);
@@ -1784,20 +1775,15 @@ static int smsc95xx_resume(struct usb_inif (ret <0 )netdev_warn (dev->net,"usbnet_resume error\n" ); -done: - pdata->pm_task =NULL ;return ret; }static int smsc95xx_reset_resume (struct usb_interface *intf) {struct usbnet *dev =usb_get_intfdata (intf); -struct smsc95xx_priv *pdata = dev->driver_priv;int ret; - pdata->pm_task = current; ret =smsc95xx_reset (dev); - pdata->pm_task =NULL ;if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 120/136 Revert "usbnet: smsc95xx: Forward PHY interrupts to PHY driver to avoid polling"
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
This reverts commit eaf3a094d8924ecb0baacf6df62ae1c6a96083cf which is upstream commit 1ce8b37241ed291af56f7a49bbdbf20c08728e88.
It is reported to cause problems, so drop it from the 5.15.y tree until the root cause can be determined.
--- drivers/net/usb/smsc95xx.c | 113 ++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 61 deletions(-)
drivers/net/usb/smsc95xx.c +52 -61
@@ -18,8 +18,6 @@#include <linux/usb/usbnet.h> #include <linux/slab.h> #include <linux/of_net.h> -#include <linux/irq.h> -#include <linux/irqdomain.h> #include <linux/mdio.h> #include <linux/phy.h> #include "smsc95xx.h"
@@ -53,9 +51,6 @@#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3) -#define SMSC95XX_NR_IRQS (1)/* raise to 12 for GPIOs */ -#define PHY_HWIRQ (SMSC95XX_NR_IRQS - 1) -struct smsc95xx_priv {u32 mac_cr;u32 hash_hi;
@@ -64,9 +59,6 @@ struct smsc95xx_priv {spinlock_t mac_cr_lock;u8 features;u8 suspend_flags; -struct irq_chip irqchip; -struct irq_domain *irqdomain; -struct fwnode_handle *irqfwnode;struct mii_bus *mdiobus;struct phy_device *phydev; };
@@ -603,8 +595,6 @@ static void smsc95xx_mac_update_fullduplstatic void smsc95xx_status (struct usbnet *dev,struct urb *urb) { -struct smsc95xx_priv *pdata = dev->driver_priv; -unsigned long flags;u32 intdata;if (urb->actual_length !=4 ) {
@@ -616,15 +606,11 @@ static void smsc95xx_status(struct usbne intdata =get_unaligned_le32 (urb->transfer_buffer);netif_dbg (dev, link, dev->net,"intdata: 0x%08X\n" , intdata); -local_irq_save (flags); -if (intdata &INT_ENP_PHY_INT_ ) -generic_handle_domain_irq (pdata->irqdomain,PHY_HWIRQ ); + ;else netdev_warn (dev->net,"unexpected interrupt, intdata=0x%08X\n" , intdata); - -local_irq_restore (flags); }/* Enable or disable Tx & Rx checksum offload engines */
@@ -1086,9 +1072,8 @@ static int smsc95xx_bind(struct usbnet * {struct smsc95xx_priv *pdata;bool is_internal_phy; -char usb_path[64 ]; -int ret, phy_irq;u32 val; +int ret; printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n");
@@ -1128,38 +1113,10 @@ static int smsc95xx_bind(struct usbnet *if (ret) goto free_pdata; -/* create irq domain for use by PHY driver and GPIO consumers */ -usb_make_path (dev->udev, usb_path,sizeof (usb_path)); - pdata->irqfwnode =irq_domain_alloc_named_fwnode (usb_path); -if (!pdata->irqfwnode) { - ret = -ENOMEM ; - goto free_pdata; - } - - pdata->irqdomain =irq_domain_create_linear (pdata->irqfwnode, -SMSC95XX_NR_IRQS , - &irq_domain_simple_ops, - pdata); -if (!pdata->irqdomain) { - ret = -ENOMEM ; - goto free_irqfwnode; - } - - phy_irq =irq_create_mapping (pdata->irqdomain,PHY_HWIRQ ); -if (!phy_irq) { - ret = -ENOENT ; - goto remove_irqdomain; - } - - pdata->irqchip = dummy_irq_chip; - pdata->irqchip.name =SMSC_CHIPNAME ; -irq_set_chip_and_handler_name (phy_irq, &pdata->irqchip, - handle_simple_irq,"phy" ); - pdata->mdiobus =mdiobus_alloc ();if (!pdata->mdiobus) { ret = -ENOMEM ; - goto dispose_irq; + goto free_pdata; } ret =smsc95xx_read_reg (dev,HW_CFG , &val);
@@ -1192,7 +1149,6 @@ static int smsc95xx_bind(struct usbnet * goto unregister_mdio; } - pdata->phydev->irq = phy_irq; pdata->phydev->is_internal = is_internal_phy;/* detect device revision as different features may be available */
@@ -1235,15 +1191,6 @@ unregister_mdio: free_mdio:mdiobus_free (pdata->mdiobus); -dispose_irq: -irq_dispose_mapping (phy_irq); - -remove_irqdomain: -irq_domain_remove (pdata->irqdomain); - -free_irqfwnode: -irq_domain_free_fwnode (pdata->irqfwnode); - free_pdata:kfree (pdata);return ret;
@@ -1256,9 +1203,6 @@ static void smsc95xx_unbind(struct usbnephy_disconnect (dev->net->phydev);mdiobus_unregister (pdata->mdiobus);mdiobus_free (pdata->mdiobus); -irq_dispose_mapping (irq_find_mapping (pdata->irqdomain,PHY_HWIRQ )); -irq_domain_remove (pdata->irqdomain); -irq_domain_free_fwnode (pdata->irqfwnode);netif_dbg (dev, ifdown, dev->net,"free pdata\n" );kfree (pdata); }
@@ -1283,6 +1227,29 @@ static u32 smsc_crc(const u8 *buffer, sireturn crc << ((filter %2 ) *16 ); } +static int smsc95xx_enable_phy_wakeup_interrupts (struct usbnet *dev,u16 mask) +{ +int ret; + +netdev_dbg (dev->net,"enabling PHY wakeup interrupts\n" ); + +/* read to clear */ + ret =smsc95xx_mdio_read_nopm (dev,PHY_INT_SRC ); +if (ret <0 ) +return ret; + +/* enable interrupt source */ + ret =smsc95xx_mdio_read_nopm (dev,PHY_INT_MASK ); +if (ret <0 ) +return ret; + + ret |= mask; + +smsc95xx_mdio_write_nopm (dev,PHY_INT_MASK , ret); + +return 0 ; +} +static int smsc95xx_link_ok_nopm (struct usbnet *dev) {int ret;
@@ -1449,6 +1416,7 @@ static int smsc95xx_enter_suspend3(strucstatic int smsc95xx_autosuspend (struct usbnet *dev,u32 link_up) {struct smsc95xx_priv *pdata = dev->driver_priv; +int ret;if (!netif_running (dev->net)) {/* interface is ifconfig down so fully power down hw */
@@ -1467,10 +1435,27 @@ static int smsc95xx_autosuspend(struct u }netdev_dbg (dev->net,"autosuspend entering SUSPEND1\n" ); + +/* enable PHY wakeup events for if cable is attached */ + ret =smsc95xx_enable_phy_wakeup_interrupts (dev, +PHY_INT_MASK_ANEG_COMP_ ); +if (ret <0 ) { +netdev_warn (dev->net,"error enabling PHY wakeup ints\n" ); +return ret; + } +netdev_info (dev->net,"entering SUSPEND1 mode\n" );return smsc95xx_enter_suspend1 (dev); } +/* enable PHY wakeup events so we remote wakeup if cable is pulled */ + ret =smsc95xx_enable_phy_wakeup_interrupts (dev, +PHY_INT_MASK_LINK_DOWN_ ); +if (ret <0 ) { +netdev_warn (dev->net,"error enabling PHY wakeup ints\n" ); +return ret; + } +netdev_dbg (dev->net,"autosuspend entering SUSPEND3\n" );return smsc95xx_enter_suspend3 (dev); }
@@ -1536,6 +1521,13 @@ static int smsc95xx_suspend(struct usb_i }if (pdata->wolopts &WAKE_PHY ) { + ret =smsc95xx_enable_phy_wakeup_interrupts (dev, + (PHY_INT_MASK_ANEG_COMP_ |PHY_INT_MASK_LINK_DOWN_ )); +if (ret <0 ) { +netdev_warn (dev->net,"error enabling PHY wakeup ints\n" ); + goto done; + } +/* if link is down then configure EDPD and enter SUSPEND1, * otherwise enter SUSPEND0 below */
@@ -1769,12 +1761,11 @@ static int smsc95xx_resume(struct usb_inreturn ret; } -phy_init_hw (pdata->phydev); - ret =usbnet_resume (intf);if (ret <0 )netdev_warn (dev->net,"usbnet_resume error\n" ); +phy_init_hw (pdata->phydev);return ret; }
Greg Kroah-Hartman
maintainerPATCH 121/136 mm/hugetlb: fix hugetlb not supporting softdirty tracking
In reply to Greg Kroah-HartmanFrom: David Hildenbrand <[email protected]>
commit f96f7a40874d7c746680c0b9f57cef2262ae551f upstream.
Patch series "mm/hugetlb: fix write-fault handling for shared mappings", v2.
I observed that hugetlb does not support/expect write-faults in shared mappings that would have to map the R/O-mapped page writable -- and I found two case where we could currently get such faults and would erroneously map an anon page into a shared mapping.
Reproducers part of the patches.
I propose to backport both fixes to stable trees. The first fix needs a small adjustment.
This patch (of 2):
Staring at hugetlb_wp(), one might wonder where all the logic for shared mappings is when stumbling over a write-protected page in a shared mapping. In fact, there is none, and so far we thought we could get away with that because e.g., mprotect() should always do the right thing and map all pages directly writable.
Looks like we were wrong:
--------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#define HUGETLB_SIZE (2 * 1024 * 1024u)
static void clear_softdirty(void)
{
int fd = open("/proc/self/clear_refs", O_WRONLY);
const char *ctrl = "4";
int ret;
if (fd < 0) {
fprintf(stderr, "open(clear_refs) failed\n");
exit(1);
}
ret = write(fd, ctrl, strlen(ctrl));
if (ret != strlen(ctrl)) {
fprintf(stderr, "write(clear_refs) failed\n");
exit(1);
}
close(fd);}
int main(int argc, char **argv)
{
char *map;
int fd;
fd = open("/dev/hugepages/tmp", O_RDWR | O_CREAT);
if (!fd) {
fprintf(stderr, "open() failed\n");
return -errno;
}
if (ftruncate(fd, HUGETLB_SIZE)) {
fprintf(stderr, "ftruncate() failed\n");
return -errno;
}
map = mmap(NULL, HUGETLB_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
fprintf(stderr, "mmap() failed\n");
return -errno;
}
*map = 0;
if (mprotect(map, HUGETLB_SIZE, PROT_READ)) {
fprintf(stderr, "mmprotect() failed\n");
return -errno;
}
clear_softdirty();
if (mprotect(map, HUGETLB_SIZE, PROT_READ|PROT_WRITE)) {
fprintf(stderr, "mmprotect() failed\n");
return -errno;
}
*map = 0;
return 0; }
--------------------------------------------------------------------------
Above test fails with SIGBUS when there is only a single free hugetlb page.
# echo 1 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # ./test Bus error (core dumped)
And worse, with sufficient free hugetlb pages it will map an anonymous page into a shared mapping, for example, messing up accounting during unmap and breaking MAP_SHARED semantics:
# echo 2 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # ./test # cat /proc/meminfo | grep HugePages_ HugePages_Total: 2 HugePages_Free: 1 HugePages_Rsvd: 18446744073709551615 HugePages_Surp: 0
Reason in this particular case is that vma_wants_writenotify() will return "true", removing VM_SHARED in vma_set_page_prot() to map pages write-protected. Let's teach vma_wants_writenotify() that hugetlb does not support softdirty tracking.
--- mm/mmap.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
mm/mmap.c +6 -2
@@ -1684,8 +1684,12 @@ int vma_wants_writenotify(struct vm_area pgprot_val(vm_pgprot_modify(vm_page_prot, vm_flags)))return 0 ; -/* Do we need to track softdirty? */ -if (IS_ENABLED (CONFIG_MEM_SOFT_DIRTY ) && !(vm_flags &VM_SOFTDIRTY )) +/* +* Do we need to track softdirty? hugetlb does not support softdirty +* tracking yet. +*/ +if (IS_ENABLED (CONFIG_MEM_SOFT_DIRTY ) && !(vm_flags &VM_SOFTDIRTY ) && + !is_vm_hugetlb_page (vma))return 1 ;/* Specialty mapping? */
Greg Kroah-Hartman
maintainerPATCH 122/136 Revert "md-raid: destroy the bitmap after destroying the thread"
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
commit 1d258758cf06a0734482989911d184dd5837ed4e upstream.
This reverts commit e151db8ecfb019b7da31d076130a794574c89f6f. Because it obviously breaks clustered raid as noticed by Neil though it fixed KASAN issue for dm-raid, let's revert it and fix KASAN issue in next commit.
[1]. https://lore.kernel.org/linux-raid/[email protected]/T/#m95ac225cab7409f66c295772483d091084a6d470
--- drivers/md/md.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/md.c +1 -1
@@ -6251,11 +6251,11 @@ static void mddev_detach(struct mddev *mstatic void __md_stop (struct mddev *mddev) {struct md_personality *pers = mddev->pers; +md_bitmap_destroy (mddev);mddev_detach (mddev);/* Ensure ->event_work is done */ if (mddev->event_work.func)flush_workqueue (md_misc_wq); -md_bitmap_destroy (mddev);spin_lock (&mddev->lock); mddev->pers =NULL ;spin_unlock (&mddev->lock);
Greg Kroah-Hartman
maintainerPATCH 123/136 md: call __md_stop_writes in md_stop
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
commit 0dd84b319352bb8ba64752d4e45396d8b13e6018 upstream.
Quoted 1 line
From the link [1], we can see raid1d was running even after the path
raid_dtr -> md_stop -> __md_stop.
Let's stop write first in destructor to align with normal md-raid to fix the KASAN issue.
--- drivers/md/md.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/md.c +1 -0
@@ -6272,6 +6272,7 @@ void md_stop(struct mddev *mddev)/* stop the array and free an attached data structures. * This is called from dm-raid */ +__md_stop_writes (mddev);__md_stop (mddev);bioset_exit (&mddev->bio_set);bioset_exit (&mddev->sync_set);
Greg Kroah-Hartman
maintainerPATCH 124/136 mptcp: Fix crash due to tcp_tsorted_anchor was initialized before release skb
In reply to Greg Kroah-HartmanFrom: Yonglong Li <[email protected]>
commit 3ef3905aa3b5b3e222ee6eb0210bfd999417a8cc upstream.
Got crash when doing pressure test of mptcp:
===========================================================================dst_release: dst:ffffa06ce6e5c058 refcnt:-1
kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
BUG: unable to handle kernel paging request at ffffa06ce6e5c058 PGD 190a01067 P4D 190a01067 PUD 43fffb067 PMD 22e403063 PTE 8000000226e5c063 Oops: 0011 [#1] SMP PTI CPU: 7 PID: 7823 Comm: kworker/7:0 Kdump: loaded Tainted: G E Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.2.1 04/01/2014 Call Trace: ? skb_release_head_state+0x68/0x100 ? skb_release_all+0xe/0x30 ? kfree_skb+0x32/0xa0 ? mptcp_sendmsg_frag+0x57e/0x750 ? __mptcp_retrans+0x21b/0x3c0 ? __switch_to_asm+0x35/0x70 ? mptcp_worker+0x25e/0x320 ? process_one_work+0x1a7/0x360 ? worker_thread+0x30/0x390 ? create_worker+0x1a0/0x1a0 ? kthread+0x112/0x130 ? kthread_flush_work_fn+0x10/0x10 ? ret_from_fork+0x35/0x40 ===========================================================================
In __mptcp_alloc_tx_skb skb was allocated and skb->tcp_tsorted_anchor will be initialized, in under memory pressure situation sk_wmem_schedule will return false and then kfree_skb. In this case skb->_skb_refdst is not null because_skb_refdst and tcp_tsorted_anchor are stored in the same mem, and kfree_skb will try to release dst and cause crash.
--- net/mptcp/protocol.c | 1 + 1 file changed, 1 insertion(+)
net/mptcp/protocol.c +1 -0
@@ -1246,6 +1246,7 @@ static struct sk_buff *__mptcp_alloc_tx_tcp_skb_entail (ssk, skb);return skb; } +tcp_skb_tsorted_anchor_cleanup (skb);kfree_skb (skb);return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 125/136 arm64: Fix match_list for erratum 1286807 on Arm Cortex-A76
In reply to Greg Kroah-HartmanFrom: Zenghui Yu <[email protected]>
commit 5e1e087457c94ad7fafbe1cf6f774c6999ee29d4 upstream.
Since commit 51f559d66527 ("arm64: Enable repeat tlbi workaround on KRYO4XX gold CPUs"), we failed to detect erratum 1286807 on Cortex-A76 because its entry in arm64_repeat_tlbi_list[] was accidently corrupted by this commit.
Fix this issue by creating a separate entry for Kryo4xx Gold.
--- arch/arm64/kernel/cpu_errata.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kernel/cpu_errata.c +2 -0
@@ -208,6 +208,8 @@ static const struct arm64_cpu_capabiliti #ifdef CONFIG_ARM64_ERRATUM_1286807 { ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0), + }, + { /* Kryo4xx Gold (rcpe to rfpe) => (r0p0 to r3p0) */ ERRATA_MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xe), },
Greg Kroah-Hartman
maintainerPATCH 126/136 binder_alloc: add missing mmap_lock calls when using the VMA
In reply to Greg Kroah-HartmanFrom: Liam Howlett <[email protected]>
commit 44e602b4e52f70f04620bbbf4fe46ecb40170bde upstream.
Take the mmap_read_lock() when using the VMA in binder_alloc_print_pages() and when checking for a VMA in binder_alloc_new_buf_locked().
It is worth noting binder_alloc_new_buf_locked() drops the VMA read lock after it verifies a VMA exists, but may be taken again deeper in the call stack, if necessary.
--- drivers/android/binder_alloc.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
drivers/android/binder_alloc.c +21 -10
@@ -395,12 +395,15 @@ static struct binder_buffer *binder_allosize_t size, data_offsets_size;int ret; +mmap_read_lock (alloc->vma_vm_mm);if (!binder_alloc_get_vma (alloc)) { +mmap_read_unlock (alloc->vma_vm_mm);binder_alloc_debug (BINDER_DEBUG_USER_ERROR ,"%d: binder_alloc_buf, no vma\n" , alloc->pid);return ERR_PTR (-ESRCH ); } +mmap_read_unlock (alloc->vma_vm_mm); data_offsets_size =ALIGN (data_size,sizeof (void *)) +ALIGN (offsets_size,sizeof (void *));
@@ -922,17 +925,25 @@ void binder_alloc_print_pages(struct seq* Make sure the binder_alloc is fully initialized, otherwise we might * read inconsistent state. */ -if (binder_alloc_get_vma (alloc) !=NULL ) { -for (i =0 ; i < alloc->buffer_size /PAGE_SIZE ; i++) { - page = &alloc->pages[i]; -if (!page->page_ptr) - free++; -else if (list_empty (&page->lru)) - active++; -else - lru++; - } + +mmap_read_lock (alloc->vma_vm_mm); +if (binder_alloc_get_vma (alloc) ==NULL ) { +mmap_read_unlock (alloc->vma_vm_mm); + goto uninitialized; + } + +mmap_read_unlock (alloc->vma_vm_mm); +for (i =0 ; i < alloc->buffer_size /PAGE_SIZE ; i++) { + page = &alloc->pages[i]; +if (!page->page_ptr) + free++; +else if (list_empty (&page->lru)) + active++; +else + lru++; } + +uninitialized:mutex_unlock (&alloc->mutex);seq_printf (m," pages: %d:%d:%d\n" , active, lru, free);seq_printf (m," pages high watermark: %zu\n" , alloc->pages_high);
Greg Kroah-Hartman
maintainerPATCH 127/136 x86/nospec: Fix i386 RSB stuffing
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 332924973725e8cdcc783c175f68cf7e162cb9e5 upstream.
Turns out that i386 doesn't unconditionally have LFENCE, as such the loop in __FILL_RETURN_BUFFER isn't actually speculation safe on such chips.
--- arch/x86/include/asm/nospec-branch.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/x86/include/asm/nospec-branch.h +12 -0
@@ -50,6 +50,7 @@* the optimal version - two calls, each with their own speculation * trap should their return address end up getting used, in a loop. */ +#ifdef CONFIG_X86_64 #define __FILL_RETURN_BUFFER (reg, nr) \ mov $(nr/2), reg; \ 771: \
@@ -60,6 +61,17 @@ jnz 771b; \/* barrier for jnz misprediction */ \ lfence; +#else +/* +* i386 doesn't unconditionally have LFENCE, as such it can't +* do a loop. +*/ +#define __FILL_RETURN_BUFFER (reg, nr) \ + .rept nr; \ + __FILL_RETURN_SLOT; \ + .endr; \ + add $(BITS_PER_LONG/8) * nr, %_ASM_SP; +#endif /* * Stuff a single RSB slot.
Greg Kroah-Hartman
maintainerPATCH 128/136 Documentation/ABI: Mention retbleed vulnerability info file for sysfs
In reply to Greg Kroah-HartmanFrom: Salvatore Bonaccorso <[email protected]>
commit 00da0cb385d05a89226e150a102eb49d8abb0359 upstream.
While reporting for the AMD retbleed vulnerability was added in
6b80b59b3555 ("x86/bugs: Report AMD retbleed vulnerability")
the new sysfs file was not mentioned so far in the ABI documentation for sysfs-devices-system-cpu. Fix that.
--- Documentation/ABI/testing/sysfs-devices-system-cpu | 1 + 1 file changed, 1 insertion(+)
Documentation/ABI/testing/sysfs-devices-system-cpu +1 -0
@@ -521,6 +521,7 @@ What: /sys/devices/system/cpu/vulnerabi /sys/devices/system/cpu/vulnerabilities/tsx_async_abort /sys/devices/system/cpu/vulnerabilities/itlb_multihit /sys/devices/system/cpu/vulnerabilities/mmio_stale_data + /sys/devices/system/cpu/vulnerabilities/retbleed Date: January 2018 Contact: Linux kernel mailing list <[email protected]> Description: Information about CPU vulnerabilities
Greg Kroah-Hartman
maintainerPATCH 129/136 blk-mq: fix io hung due to missing commit_rqs
In reply to Greg Kroah-HartmanFrom: Yu Kuai <[email protected]>
commit 65fac0d54f374625b43a9d6ad1f2c212bd41f518 upstream.
Currently, in virtio_scsi, if 'bd->last' is not set to true while dispatching request, such io will stay in driver's queue, and driver will wait for block layer to dispatch more rqs. However, if block layer failed to dispatch more rq, it should trigger commit_rqs to inform driver.
There is a problem in blk_mq_try_issue_list_directly() that commit_rqs won't be called:
// assume that queue_depth is set to 1, list contains two rq blk_mq_try_issue_list_directly
blk_mq_request_issue_directly
// dispatch first rq
// last is false
__blk_mq_try_issue_directly
blk_mq_get_dispatch_budget
// succeed to get first budget __blk_mq_issue_directly
scsi_queue_rq
cmd->flags |= SCMD_LAST
virtscsi_queuecommand
kick = (sc->flags & SCMD_LAST) != 0
// kick is false, first rq won't issue to diskqueued++
blk_mq_request_issue_directly
// dispatch second rq
__blk_mq_try_issue_directly
blk_mq_get_dispatch_budget
// failed to get second budget
ret == BLK_STS_RESOURCE
blk_mq_request_bypass_insert
// errors is still 0
if (!list_empty(list) || errors && ...)
// won't pass, commit_rqs won't be called
In this situation, first rq relied on second rq to dispatch, while second rq relied on first rq to complete, thus they will both hung.
Fix the problem by also treat 'BLK_STS_*RESOURCE' as 'errors' since it means that request is not queued successfully.
Same problem exists in blk_mq_dispatch_rq_list(), 'BLK_STS_*RESOURCE' can't be treated as 'errors' here, fix the problem by calling commit_rqs if queue_rq return 'BLK_STS_*RESOURCE'.
--- block/blk-mq.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
block/blk-mq.c +3 -2
@@ -1400,7 +1400,8 @@ out:/* If we didn't flush the entire list, we could have told the driver * there was more coming, but that turned out to be a lie. */ -if ((!list_empty (list) || errors) && q->mq_ops->commit_rqs && queued) +if ((!list_empty (list) || errors || needs_resource || + ret ==BLK_STS_DEV_RESOURCE ) && q->mq_ops->commit_rqs && queued) q->mq_ops->commit_rqs (hctx);/* * Any items that need requeuing? Stuff them into hctx->dispatch,
@@ -2111,6 +2112,7 @@ void blk_mq_try_issue_list_directly(strulist_del_init (&rq->queuelist); ret =blk_mq_request_issue_directly (rq,list_empty (list));if (ret !=BLK_STS_OK ) { + errors++;if (ret ==BLK_STS_RESOURCE || ret ==BLK_STS_DEV_RESOURCE ) { blk_mq_request_bypass_insert(rq, false,
@@ -2118,7 +2120,6 @@ void blk_mq_try_issue_list_directly(strubreak ; }blk_mq_end_request (rq, ret); - errors++; }else queued++; }
Greg Kroah-Hartman
maintainerPATCH 130/136 perf python: Fix build when PYTHON_CONFIG is user supplied
In reply to Greg Kroah-HartmanFrom: James Clark <[email protected]>
commit bc9e7fe313d5e56d4d5f34bcc04d1165f94f86fb upstream.
The previous change to Python autodetection had a small mistake where the auto value was used to determine the Python binary, rather than the user supplied value. The Python binary is only used for one part of the build process, rather than the final linking, so it was producing correct builds in most scenarios, especially when the auto detected value matched what the user wanted, or the system only had a valid set of Pythons.
Change it so that the Python binary path is derived from either the PYTHON_CONFIG value or PYTHON value, depending on what is specified by the user. This was the original intention.
This error was spotted in a build failure an odd cross compilation environment after commit 4c41cb46a732fe82 ("perf python: Prefer python3") was merged.
--- tools/perf/Makefile.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/Makefile.config +1 -1
@@ -263,7 +263,7 @@ endif # defined. get-executable-or-default fails with an error if the first argument is supplied but # doesn't exist. override PYTHON_CONFIG := $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON_AUTO)) -override PYTHON := $(call get-executable-or-default,PYTHON,$(subst -config,,$(PYTHON_AUTO))) +override PYTHON := $(call get-executable-or-default,PYTHON,$(subst -config,,$(PYTHON_CONFIG))) grep-libs = $(filter -l%,$(1)) strip-libs = $(filter-out -l%,$(1))
Greg Kroah-Hartman
maintainerPATCH 131/136 perf/x86/intel/uncore: Fix broken read_counter() for SNB IMC PMU
In reply to Greg Kroah-HartmanFrom: Stephane Eranian <[email protected]>
commit 11745ecfe8fea4b4a4c322967a7605d2ecbd5080 upstream.
Existing code was generating bogus counts for the SNB IMC bandwidth counters:
$ perf stat -a -I 1000 -e uncore_imc/data_reads/,uncore_imc/data_writes/
1.000327813 1,024.03 MiB uncore_imc/data_reads/
1.000327813 20.73 MiB uncore_imc/data_writes/
2.000580153 261,120.00 MiB uncore_imc/data_reads/
2.000580153 23.28 MiB uncore_imc/data_writes/The problem was introduced by commit:
07ce734dd8ad ("perf/x86/intel/uncore: Clean up client IMC")
Where the read_counter callback was replace to point to the generic uncore_mmio_read_counter() function.
The SNB IMC counters are freerunnig 32-bit counters laid out contiguously in MMIO. But uncore_mmio_read_counter() is using a readq() call to read from MMIO therefore reading 64-bit from MMIO. Although this is okay for the uncore_perf_event_update() function because it is shifting the value based on the actual counter width to compute a delta, it is not okay for the uncore_pmu_event_start() which is simply reading the counter and therefore priming the event->prev_count with a bogus value which is responsible for causing bogus deltas in the perf stat command above.
The fix is to reintroduce the custom callback for read_counter for the SNB IMC PMU and use readl() instead of readq(). With the change the output of perf stat is back to normal:
$ perf stat -a -I 1000 -e uncore_imc/data_reads/,uncore_imc/data_writes/
1.000120987 296.94 MiB uncore_imc/data_reads/
1.000120987 138.42 MiB uncore_imc/data_writes/
2.000403144 175.91 MiB uncore_imc/data_reads/
2.000403144 68.50 MiB uncore_imc/data_writes/--- arch/x86/events/intel/uncore_snb.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
arch/x86/events/intel/uncore_snb.c +17 -1
@@ -788,6 +788,22 @@ int snb_pci2phy_map_init(int devid)return 0 ; } +static u64 snb_uncore_imc_read_counter (struct intel_uncore_box *box,struct perf_event *event) +{ +struct hw_perf_event *hwc = &event->hw; + +/* +* SNB IMC counters are 32-bit and are laid out back to back +* in MMIO space. Therefore we must use a 32-bit accessor function +* using readq() from uncore_mmio_read_counter() causes problems +* because it is reading 64-bit at a time. This is okay for the +* uncore_perf_event_update() function because it drops the upper +* 32-bits but not okay for plain uncore_read_counter() as invoked +* in uncore_pmu_event_start(). +*/ +return (u64 )readl (box->io_addr + hwc->event_base); +} +static struct pmu snb_uncore_imc_pmu = { .task_ctx_nr = perf_invalid_context, .event_init = snb_uncore_imc_event_init,
@@ -807,7 +823,7 @@ static struct intel_uncore_ops snb_uncor .disable_event = snb_uncore_imc_disable_event, .enable_event = snb_uncore_imc_enable_event, .hw_config = snb_uncore_imc_hw_config, - .read_counter = uncore_mmio_read_counter, + .read_counter = snb_uncore_imc_read_counter, };static struct intel_uncore_type snb_uncore_imc = {
Greg Kroah-Hartman
maintainerPATCH 132/136 perf/x86/intel/ds: Fix precise store latency handling
In reply to Greg Kroah-HartmanFrom: Stephane Eranian <[email protected]>
commit d4bdb0bebc5ba3299d74f123c782d99cd4e25c49 upstream.
With the existing code in store_latency_data(), the memory operation (mem_op) returned to the user is always OP_LOAD where in fact, it should be OP_STORE. This comes from the fact that the function is simply grabbing the information from a data source map which covers only load accesses. Intel 12th gen CPU offers precise store sampling that captures both the data source and latency. Therefore it can use the data source mapping table but must override the memory operation to reflect stores instead of loads.
--- arch/x86/events/intel/ds.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
arch/x86/events/intel/ds.c +9 -1
@@ -236,6 +236,7 @@ static u64 load_latency_data(u64 status)static u64 store_latency_data (u64 status) {union intel_x86_pebs_dse dse; +union perf_mem_data_src src;u64 val; dse.val = status;
@@ -263,7 +264,14 @@ static u64 store_latency_data(u64 status val |=P (BLK ,NA ); -return val; +/* +* the pebs_data_source table is only for loads +* so override the mem_op to say STORE instead +*/ + src.val = val; + src.mem_op =P (OP ,STORE ); + +return src.val; }struct pebs_record_core {
Greg Kroah-Hartman
maintainerPATCH 133/136 perf stat: Clear evsel->reset_group for each stat run
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
commit bf515f024e4c0ca46a1b08c4f31860c01781d8a5 upstream.
If a weak group is broken then the reset_group flag remains set for the next run. Having reset_group set means the counter isn't created and ultimately a segfault.
A simple reproduction of this is:
# perf stat -r2 -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}:Wwhich will be added as a test in the next patch.
--- tools/perf/builtin-stat.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/builtin-stat.c +1 -0
@@ -807,6 +807,7 @@ static int __run_perf_stat(int argc, conreturn -1 ;evlist__for_each_entry (evsel_list, counter) { + counter->reset_group = false;if (bpf_counter__load (counter, &target))return -1 ;if (!evsel__is_bpf (counter))
Greg Kroah-Hartman
maintainerPATCH 134/136 scsi: ufs: core: Enable link lost interrupt
In reply to Greg Kroah-HartmanFrom: Kiwoong Kim <[email protected]>
commit 6d17a112e9a63ff6a5edffd1676b99e0ffbcd269 upstream.
Link lost is treated as fatal error with commit c99b9b230149 ("scsi: ufs:
Treat link loss as fatal error"), but the event isn't registered as interrupt source. Enable it.
--- drivers/scsi/ufs/ufshci.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/scsi/ufs/ufshci.h +1 -5
@@ -133,11 +133,7 @@ static inline u32 ufshci_version(u32 maj#define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK) -#define UFSHCD_ERROR_MASK (UIC_ERROR |\ - DEVICE_FATAL_ERROR |\ - CONTROLLER_FATAL_ERROR |\ - SYSTEM_BUS_FATAL_ERROR |\ - CRYPTO_ENGINE_FATAL_ERROR) +#define UFSHCD_ERROR_MASK (UIC_ERROR | INT_FATAL_ERRORS)#define INT_FATAL_ERRORS (DEVICE_FATAL_ERROR |\ CONTROLLER_FATAL_ERROR |\
Greg Kroah-Hartman
maintainerPATCH 135/136 scsi: storvsc: Remove WQ_MEM_RECLAIM from storvsc_error_wq
In reply to Greg Kroah-HartmanFrom: Saurabh Sengar <[email protected]>
commit d957e7ffb2c72410bcc1a514153a46719255a5da upstream.
storvsc_error_wq workqueue should not be marked as WQ_MEM_RECLAIM as it doesn't need to make forward progress under memory pressure. Marking this workqueue as WQ_MEM_RECLAIM may cause deadlock while flushing a non-WQ_MEM_RECLAIM workqueue. In the current state it causes the following warning:
[ 14.506347] ------------[ cut here ]------------ [ 14.506354] workqueue: WQ_MEM_RECLAIM storvsc_error_wq_0:storvsc_remove_lun is flushing !WQ_MEM_RECLAIM events_freezable_power_:disk_events_workfn [ 14.506360] WARNING: CPU: 0 PID: 8 at <-snip->kernel/workqueue.c:2623 check_flush_dependency+0xb5/0x130 [ 14.506390] CPU: 0 PID: 8 Comm: kworker/u4:0 Not tainted 5.4.0-1086-azure #91~18.04.1-Ubuntu [ 14.506391] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v4.1 05/09/2022 [ 14.506393] Workqueue: storvsc_error_wq_0 storvsc_remove_lun [ 14.506395] RIP: 0010:check_flush_dependency+0xb5/0x130 <-snip-> [ 14.506408] Call Trace: [ 14.506412] __flush_work+0xf1/0x1c0 [ 14.506414] __cancel_work_timer+0x12f/0x1b0 [ 14.506417] ? kernfs_put+0xf0/0x190 [ 14.506418] cancel_delayed_work_sync+0x13/0x20 [ 14.506420] disk_block_events+0x78/0x80 [ 14.506421] del_gendisk+0x3d/0x2f0 [ 14.506423] sr_remove+0x28/0x70 [ 14.506427] device_release_driver_internal+0xef/0x1c0 [ 14.506428] device_release_driver+0x12/0x20 [ 14.506429] bus_remove_device+0xe1/0x150 [ 14.506431] device_del+0x167/0x380 [ 14.506432] __scsi_remove_device+0x11d/0x150 [ 14.506433] scsi_remove_device+0x26/0x40 [ 14.506434] storvsc_remove_lun+0x40/0x60 [ 14.506436] process_one_work+0x209/0x400 [ 14.506437] worker_thread+0x34/0x400 [ 14.506439] kthread+0x121/0x140 [ 14.506440] ? process_one_work+0x400/0x400 [ 14.506441] ? kthread_park+0x90/0x90 [ 14.506443] ret_from_fork+0x35/0x40 [ 14.506445] ---[ end trace 2d9633159fdc6ee7 ]---
--- drivers/scsi/storvsc_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/storvsc_drv.c +1 -1
@@ -2093,7 +2093,7 @@ static int storvsc_probe(struct hv_devic*/ host_dev->handle_error_wq =alloc_ordered_workqueue ("storvsc_error_wq_%d" , -WQ_MEM_RECLAIM , +0 , host->host_no);if (!host_dev->handle_error_wq) { ret = -ENOMEM ;