6.6.70-rc1 review
Greg Kroah-Hartman
maintainercover 6.6.70-rc1 review
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.6.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.6.70-rc1
Yihang Li <[email protected]>
scsi: hisi_sas: Remove redundant checks for automatic debugfs dump
Kashyap Desai <[email protected]>
RDMA/bnxt_re: Fix max SGEs for the Work Request
Paolo Abeni <[email protected]>
mptcp: don't always assume copied data in mptcp_cleanup_rbuf()
Paolo Abeni <[email protected]>
mptcp: fix recvbuffer adjust on sleeping rcvmsg
Paolo Abeni <[email protected]>
mptcp: fix TCP options overflow.
Seiji Nishikawa <[email protected]>
mm: vmscan: account for free pages to prevent infinite Loop in throttle_direct_reclaim()
Alessandro Carminati <[email protected]>
mm/kmemleak: fix sleeping function called from invalid context at print message
Yafang Shao <[email protected]>
mm/readahead: fix large folio support in async readahead
Joshua Washington <[email protected]>
gve: guard XDP xmit NDO on existence of xdp queues
Joshua Washington <[email protected]>
gve: guard XSK operations on the existence of queues
David Hildenbrand <[email protected]>
fs/proc/task_mmu: fix pagemap flags with PMD THP entries on 32bit
Biju Das <[email protected]>
drm: adv7511: Fix use-after-free in adv7533_attach_dsi()
Biju Das <[email protected]>
dt-bindings: display: adi,adv7533: Drop single lane support
Biju Das <[email protected]>
drm: adv7511: Drop dsi single lane support
Nikolay Kuratov <[email protected]>
net/sctp: Prevent autoclose integer overflow in sctp_association_init()
Pascal Hambourg <[email protected]>
sky2: Add device ID 11ab:4373 for Marvell 88E8075
Evgenii Shatokhin <[email protected]>
pinctrl: mcp23s08: Fix sleeping in atomic context due to regmap locking
Dan Carpenter <[email protected]>
RDMA/uverbs: Prevent integer overflow issue
Kuan-Wei Chiu <[email protected]>
scripts/sorttable: fix orc_sort_cmp() to maintain symmetry and transitivity
Arnd Bergmann <[email protected]>
kcov: mark in_softirq_really() as __always_inline
Dennis Lam <[email protected]>
ocfs2: fix slab-use-after-free due to dangling pointer dqi_priv
Takashi Iwai <[email protected]>
ALSA: seq: oss: Fix races at processing SysEx messages
Daniel Schaefer <[email protected]>
ALSA hda/realtek: Add quirk for Framework F111:000C
Takashi Iwai <[email protected]>
ALSA: seq: Check UMP support for midi_version change
Shung-Hsi Yu <[email protected]>
Revert "bpf: support non-r10 register spill/fill to/from stack in precision tracking"
Masahiro Yamada <[email protected]>
modpost: fix the missed iteration for the max bit in do_input()
Masahiro Yamada <[email protected]>
modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix the max WQE size for static WQE support
Nathan Lynch <[email protected]>
seq_buf: Make DECLARE_SEQ_BUF() usable
Leon Romanovsky <[email protected]>
ARC: build: Try to guess GCC variant of cross compiler
Uros Bizjak <[email protected]>
irqchip/gic: Correct declaration of *percpu_base pointer in union gic_base
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_core: Fix sleeping function called from invalid context
Daniele Palmas <[email protected]>
net: usb: qmi_wwan: add Telit FE910C04 compositions
Enzo Matsumiya <[email protected]>
smb: client: destroy cfid_put_wq on module exit
Namjae Jeon <[email protected]>
ksmbd: set ATTR_CTIME flags when setting mtime
Hobin Woo <[email protected]>
ksmbd: retry iterate_dir in smb2_query_dir
Anton Protopopov <[email protected]>
bpf: fix potential error return
Adrian Ratiu <[email protected]>
sound: usb: format: don't warn that raw DSD is unsupported
Adrian Ratiu <[email protected]>
sound: usb: enable DSD output for ddHiFi TC44C
Vasiliy Kovalev <[email protected]>
ALSA: hda/realtek: Add new alc2xx-fixup-headset-mic model
Takashi Iwai <[email protected]>
ALSA: hda/ca0132: Use standard HD-audio quirk matching helpers
Filipe Manana <[email protected]>
btrfs: flush delalloc workers queue before stopping cleaner kthread during unmount
Prike Liang <[email protected]>
drm/amdkfd: Correct the migration DMA map direction
Emmanuel Grumbach <[email protected]>
wifi: mac80211: wake the queues in case of failure in resume
Issam Hamdi <[email protected]>
wifi: mac80211: fix mbss changed flags corruption on 32 bit systems
Meghana Malladi <[email protected]>
net: ti: icssg-prueth: Fix clearing of IEP_CMP_CFG registers during iep_init
Eric Dumazet <[email protected]>
ila: serialize calls to nf_register_net_hooks()
Eric Dumazet <[email protected]>
af_packet: fix vlan_get_protocol_dgram() vs MSG_PEEK
Eric Dumazet <[email protected]>
af_packet: fix vlan_get_tci() vs MSG_PEEK
Maciej S. Szmigiero <[email protected]>
net: wwan: iosm: Properly check for valid exec stage in ipc_mmio_init()
Eric Dumazet <[email protected]>
net: restrict SO_REUSEPORT to inet sockets
Willem de Bruijn <[email protected]>
net: reenable NETIF_F_IPV6_CSUM offload for BIG TCP packets
Liang Jie <[email protected]>
net: sfc: Correct key_len for efx_tc_ct_zone_ht_params
Li Zhijian <[email protected]>
RDMA/rtrs: Ensure 'ib_sge list' is accessible
Jinjian Song <[email protected]>
net: wwan: t7xx: Fix FSM command timeout issue
Joe Hattori <[email protected]>
net: mv643xx_eth: fix an OF node reference leak
Vitalii Mordan <[email protected]>
eth: bcmsysport: fix call balance of priv->clk handling routines
Tanya Agarwal <[email protected]>
ALSA: usb-audio: US16x08: Initialize array before use
Antonio Pastor <[email protected]>
net: llc: reset skb->transport_header
Pablo Neira Ayuso <[email protected]>
netfilter: nft_set_hash: unaligned atomic read on struct nft_set_ext
Rodrigo Vivi <[email protected]>
drm/i915/dg1: Fix power gate sequence.
Jianbo Liu <[email protected]>
net/mlx5e: Skip restore TC rules for vport rep without loaded flag
Dragos Tatulea <[email protected]>
net/mlx5e: macsec: Maintain TX SA from encoding_sa
Shahar Shitrit <[email protected]>
net/mlx5: DR, select MSIX vector 0 for completion queue creation
Ilya Shchipletsov <[email protected]>
netrom: check buffer length before accessing it
Xiao Liang <[email protected]>
net: Fix netns for ip_tunnel_init_flow()
Ido Schimmel <[email protected]>
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_xmit()
Ido Schimmel <[email protected]>
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_md_tunnel_xmit()
Ido Schimmel <[email protected]>
ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_bind_dev()
Eric Dumazet <[email protected]>
ip_tunnel: annotate data-races around t->parms.link
Wang Liang <[email protected]>
net: fix memory leak in tcp_conn_request()
Joe Hattori <[email protected]>
net: stmmac: restructure the error path of stmmac_probe_config_dt()
Andrew Halaney <[email protected]>
net: stmmac: don't create a MDIO bus if unnecessary
Chengchang Tang <[email protected]>
RDMA/hns: Fix missing flush CQE for DWQE
Chengchang Tang <[email protected]>
RDMA/hns: Fix warning storm caused by invalid input in IO path
wenglianfa <[email protected]>
RDMA/hns: Fix mapping error of zero-hop WQE buffer
Chengchang Tang <[email protected]>
RDMA/hns: Remove unused parameters and variables
Chengchang Tang <[email protected]>
RDMA/hns: Refactor mtr find
Tristram Ha <[email protected]>
net: dsa: microchip: Fix LAN937X set_ageing_time function
Tristram Ha <[email protected]>
net: dsa: microchip: Fix KSZ9477 set_ageing_time function
Stefan Ekenberg <[email protected]>
drm/bridge: adv7511_audio: Update Audio InfoFrame properly
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix the locking while accessing the QP table
Damodharam Ammepalli <[email protected]>
RDMA/bnxt_re: Fix MSN table size for variable wqe mode
Damodharam Ammepalli <[email protected]>
RDMA/bnxt_re: Add send queue size check for variable wqe
Kalesh AP <[email protected]>
RDMA/bnxt_re: Disable use of reserved wqes
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Add support for Variable WQE in Genp7 adapters
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix max_qp_wrs reported
Kalesh AP <[email protected]>
RDMA/bnxt_re: Fix reporting hw_ver in query_device
Saravanan Vajravel <[email protected]>
RDMA/bnxt_re: Add check for path mtu in modify_qp
Kalesh AP <[email protected]>
RDMA/bnxt_re: Fix the check for 9060 condition
Robert Beckett <[email protected]>
nvme-pci: 512 byte aligned dma pool segment quirk
Kashyap Desai <[email protected]>
RDMA/bnxt_re: Avoid sending the modify QP workaround for latest adapters
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Avoid initializing the software queue for user queues
Patrisious Haddad <[email protected]>
RDMA/mlx5: Enforce same type port association for multiport RoCE
Leon Romanovsky <[email protected]>
RDMA/bnxt_re: Remove always true dattr validity check
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Allow MSN table capability check
Steven Rostedt <[email protected]>
tracing: Check "%s" dereference via the field and not the TP_printk format
Steven Rostedt <[email protected]>
tracing: Fix trace_check_vprintf() when tp_printk is used
Steven Rostedt (Google) <[email protected]>
tracing: Handle old buffer mappings for event strings and functions
Kees Cook <[email protected]>
seq_buf: Introduce DECLARE_SEQ_BUF and seq_buf_str()
Matthew Wilcox (Oracle) <[email protected]>
powerpc: Remove initialisation of readpos
Matthew Wilcox (Oracle) <[email protected]>
tracing: Move readpos from seq_buf to trace_seq
Jeremy Kerr <[email protected]>
net: mctp: handle skb cleanup on sock_queue failures
Max Kellermann <[email protected]>
ceph: give up on paths longer than PATH_MAX
Xiubo Li <[email protected]>
ceph: print cluster fsid and client global_id in all debug logs
Xiubo Li <[email protected]>
libceph: add doutc and *_client debug macros support
Steven Rostedt <[email protected]>
tracing: Have process_string() also allow arrays
Eric Biggers <[email protected]>
mmc: sdhci-msm: fix crypto key eviction
Johannes Thumshirn <[email protected]>
btrfs: fix use-after-free in btrfs_encoded_read_endio()
Thiébaud Weksteen <[email protected]>
selinux: ignore unknown extended permissions
Chao Yu <[email protected]>
f2fs: fix to wait dio completion
Joe Hattori <[email protected]>
platform/x86: mlx-platform: call pci_dev_put() to balance the refcount
Takashi Iwai <[email protected]>
ALSA: ump: Shut up truncated string warning
Michal Pecio <[email protected]>
usb: xhci: Avoid queuing redundant Stop Endpoint commands
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: glink: fix off-by-one in connector_status
Yihang Li <[email protected]>
scsi: hisi_sas: Fix a deadlock issue related to automatic dump
Uros Bizjak <[email protected]>
cleanup: Remove address space of returned pointer
Stefan Berger <[email protected]>
crypto: ecc - Prevent ecc_digits_from_bytes from reading too many bytes
Jan Beulich <[email protected]>
memblock: make memblock_set_node() also warn about use of MAX_NUMNODES
Chris Lu <[email protected]>
Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
Chris Lu <[email protected]>
Bluetooth: btusb: add callback function in btusb suspend/resume
Filipe Manana <[email protected]>
btrfs: fix use-after-free when COWing tree bock and tracing is enabled
Filipe Manana <[email protected]>
btrfs: rename and export __btrfs_cow_block()
Xin Li (Intel) <[email protected]>
x86/fred: Clear WFE in missing-ENDBRANCH #CPs
Xin Li <[email protected]>
x86/ptrace: Add FRED additional information to the pt_regs structure
Xin Li <[email protected]>
x86/ptrace: Cleanup the definition of the pt_regs structure
Qinxin Xia <[email protected]>
ACPI/IORT: Add PMCG platform information for HiSilicon HIP09A
Yicong Yang <[email protected]>
ACPI/IORT: Add PMCG platform information for HiSilicon HIP10/11
Ranjan Kumar <[email protected]>
scsi: mpi3mr: Start controller indexing from 0
Guixin Liu <[email protected]>
scsi: mpi3mr: Use ida to manage mrioc ID
Takashi Iwai <[email protected]>
ALSA: ump: Update legacy substream names upon FB info update
Takashi Iwai <[email protected]>
ALSA: ump: Indicate the inactive group in legacy substream names
Takashi Iwai <[email protected]>
ALSA: ump: Don't open legacy substream for an inactive group
Takashi Iwai <[email protected]>
ALSA: ump: Use guard() for locking
Jan Kara <[email protected]>
udf: Verify inode link counts before performing rename
Al Viro <[email protected]>
udf_rename(): only access the child content on cross-directory rename
Claudiu Beznea <[email protected]>
watchdog: rzg2l_wdt: Power on the watchdog domain in the restart handler
Claudiu Beznea <[email protected]>
watchdog: rzg2l_wdt: Rely on the reset driver for doing proper reset
Claudiu Beznea <[email protected]>
watchdog: rzg2l_wdt: Remove reset de-assert from probe
Andrea della Porta <[email protected]>
of: address: Preserve the flags portion on 1:1 dma-ranges mapping
Rob Herring <[email protected]>
of: address: Store number of bus flag cells rather than bool
Herve Codina <[email protected]>
of: address: Remove duplicated functions
Naman Jain <[email protected]>
x86/hyperv: Fix hv tsc page based sched_clock for hibernation
Baoquan He <[email protected]>
x86, crash: wrap crash dumping code into crash related ifdefs
Mario Limonciello <[email protected]>
thunderbolt: Don't display nvm_version unless upgrade supported
Mika Westerberg <[email protected]>
thunderbolt: Add support for Intel Panther Lake-M/P
Mika Westerberg <[email protected]>
thunderbolt: Add support for Intel Lunar Lake
Mathias Nyman <[email protected]>
xhci: Turn NEC specific quirk for handling Stop Endpoint errors generic
Michal Pecio <[email protected]>
usb: xhci: Limit Stop Endpoint retries
Michal Pecio <[email protected]>
xhci: retry Stop Endpoint on buggy NEC controllers
Nikita Yushchenko <[email protected]>
net: renesas: rswitch: fix possible early skb release
K Prateek Nayak <[email protected]>
softirq: Allow raising SCHED_SOFTIRQ from SMP-call-function on RT kernel
Sebastian Ott <[email protected]>
net/mlx5: unique names for per device caches
Nilay Shroff <[email protected]>
Revert "nvme: make keep-alive synchronous operation"
Nilay Shroff <[email protected]>
nvme: use helper nvme_ctrl_state in nvme_keep_alive_finish function
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: glink: be more precise on orientation-aware ports
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: glink: set orientation aware if supported
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: add update_connector callback
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: glink: move GPIO reading into connector_status callback
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: add callback for connector status updates
Nuno Sa <[email protected]>
iio: adc: ad7192: properly check spi_get_device_match_data()
Jonathan Cameron <[email protected]>
iio: adc: ad7192: Convert from of specific to fwnode property handling
Xu Yang <[email protected]>
usb: chipidea: udc: limit usb request length to max 16KB
Xu Yang <[email protected]>
usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag
Tomer Maimon <[email protected]>
usb: chipidea: add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag
Konstantin Komarov <[email protected]>
fs/ntfs3: Fix warning in ni_fiemap
Konstantin Komarov <[email protected]>
fs/ntfs3: Implement fallocate for compressed files
Dmitry Baryshkov <[email protected]>
remoteproc: qcom: pas: enable SAR2130P audio DSP support
Tengfei Fan <[email protected]>
remoteproc: qcom: pas: Add support for SA8775p ADSP, CDSP and GPDSP
Nikita Travkin <[email protected]>
remoteproc: qcom: pas: Add sc7180 adsp
Adam Young <[email protected]>
mailbox: pcc: Check before sending MCTP PCC response ACK
Sudeep Holla <[email protected]>
ACPI: PCC: Add PCC shared memory region command and status bitfields
Huisong Li <[email protected]>
mailbox: pcc: Support shared interrupt for multiple subspaces
Huisong Li <[email protected]>
mailbox: pcc: Add support for platform notification handling
Devi Priya <[email protected]>
clk: qcom: clk-alpha-pll: Add NSS HUAYRA ALPHA PLL support for ipq9574
Rajendra Nayak <[email protected]>
clk: qcom: clk-alpha-pll: Add support for zonda ole pll configure
Yihang Li <[email protected]>
scsi: hisi_sas: Create all dump files during debugfs initialization
Yihang Li <[email protected]>
scsi: hisi_sas: Allocate DFX memory during dump trigger
Yihang Li <[email protected]>
scsi: hisi_sas: Directly call register snapshot instead of using workqueue
Hao Qin <[email protected]>
Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925
Jiande Lu <[email protected]>
Bluetooth: btusb: Add USB HW IDs for MT7921/MT7922/MT7925
Ulrik Strid <[email protected]>
Bluetooth: btusb: Add new VID/PID 13d3/3602 for MT7925
Jingyang Wang <[email protected]>
Bluetooth: Add support ITTIM PE50-M75C
Markus Elfring <[email protected]>
Bluetooth: hci_conn: Reduce hci_conn_drop() calls in two functions
Jarkko Nikula <[email protected]>
i2c: i801: Add support for Intel Panther Lake
Jarkko Nikula <[email protected]>
i2c: i801: Add support for Intel Arrow Lake-H
Kang Yang <[email protected]>
wifi: ath10k: avoid NULL pointer error during sdio remove
Jeff Johnson <[email protected]>
wifi: ath10k: Update Qualcomm Innovation Center, Inc. copyrights
Kalle Valo <[email protected]>
wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
Rory Little <[email protected]>
wifi: mac80211: Add non-atomic station iterator
Karthikeyan Periyasamy <[email protected]>
wifi: ath12k: Optimize the mac80211 hw data access
Ping-Ke Shih <[email protected]>
wifi: rtw88: use ieee80211_purge_tx_queue() to purge TX skb
Ping-Ke Shih <[email protected]>
wifi: mac80211: export ieee80211_purge_tx_queue() for drivers
Ricardo Ribalda <[email protected]>
media: uvcvideo: Force UVC version to 1.0a for 0408:4033
Laurent Pinchart <[email protected]>
media: uvcvideo: Force UVC version to 1.0a for 0408:4035
Przemek Kitszel <[email protected]>
cleanup: Adjust scoped_guard() macros to avoid potential warning
Peter Zijlstra <[email protected]>
cleanup: Add conditional guard support
Lukas Wunner <[email protected]>
crypto: ecdsa - Avoid signed integer overflow on signature decoding
Stefan Berger <[email protected]>
crypto: ecdsa - Use ecc_digits_from_bytes to convert signature
Stefan Berger <[email protected]>
crypto: ecdsa - Rename keylen to bufsize where necessary
Stefan Berger <[email protected]>
crypto: ecdsa - Convert byte arrays with key coordinates to digits
Brian Foster <[email protected]>
ext4: partial zero eof block on unaligned inode size extension
Jeff Layton <[email protected]>
ext4: convert to new timestamp accessors
Mike Rapoport (Microsoft) <[email protected]>
memblock: allow zero threshold in validate_numa_converage()
Liam Ni <[email protected]>
NUMA: optimize detection of memory with no node id assigned by firmware
Miguel Ojeda <[email protected]>
rust: allow clippy::needless_lifetimes
Miguel Ojeda <[email protected]>
rust: relax most deny-level lints to warnings
Alex Deucher <[email protected]>
Revert "drm/radeon: Delay Connector detecting when HPD singals is unstable"
Shixiong Ou <[email protected]>
drm/radeon: Delay Connector detecting when HPD singals is unstable
Thomas Gleixner <[email protected]>
sched: Initialize idle tasks only once
Selvarasu Ganesan <[email protected]>
usb: dwc3: gadget: Add missing check for single port RAM in TxFIFO resizing logic
Paulo Alcantara <[email protected]>
smb: client: fix use-after-free of signing key
Paulo Alcantara <[email protected]>
smb: client: stop flooding dmesg in smb2_calc_signature()
Ralph Boehme <[email protected]>
fs/smb/client: implement chmod() for SMB3 POSIX Extensions
ChenXiaoSong <[email protected]>
smb/client: rename cifs_ace to smb_ace
ChenXiaoSong <[email protected]>
smb/client: rename cifs_acl to smb_acl
ChenXiaoSong <[email protected]>
smb/client: rename cifs_sid to smb_sid
ChenXiaoSong <[email protected]>
smb/client: rename cifs_ntsd to smb_ntsd
Borislav Petkov (AMD) <[email protected]>
x86/mm: Carve out INVLPG inline asm for use by others
Mauro Carvalho Chehab <[email protected]>
docs: media: update location of the media patches
Fangzhi Zuo <[email protected]>
drm/amd/display: Fix incorrect DSC recompute trigger
Agustin Gutierrez <[email protected]>
drm/amd/display: Fix DSC-re-computing
-------------
Diffstat:
Documentation/admin-guide/media/building.rst | 2 +- Documentation/admin-guide/media/saa7134.rst | 2 +- Documentation/arch/arm64/silicon-errata.rst | 5 +- .../bindings/display/bridge/adi,adv7533.yaml | 2 +- Documentation/i2c/busses/i2c-i801.rst | 2 + Makefile | 29 +- arch/arc/Makefile | 2 +- arch/loongarch/kernel/numa.c | 28 +- arch/powerpc/kernel/setup-common.c | 1 - arch/x86/entry/vsyscall/vsyscall_64.c | 2 +- arch/x86/include/asm/ptrace.h | 104 ++- arch/x86/include/asm/tlb.h | 4 + arch/x86/kernel/Makefile | 4 +- arch/x86/kernel/cet.c | 30 + arch/x86/kernel/cpu/mshyperv.c | 68 +- arch/x86/kernel/kexec-bzimage64.c | 4 + arch/x86/kernel/kvm.c | 4 +- arch/x86/kernel/machine_kexec_64.c | 3 + arch/x86/kernel/process_64.c | 2 +- arch/x86/kernel/reboot.c | 4 +- arch/x86/kernel/setup.c | 2 +- arch/x86/kernel/smp.c | 2 +- arch/x86/mm/numa.c | 34 +- arch/x86/mm/tlb.c | 3 +- arch/x86/xen/enlighten_hvm.c | 4 + arch/x86/xen/mmu_pv.c | 2 +- crypto/ecc.c | 22 + crypto/ecdsa.c | 51 +- drivers/acpi/arm64/iort.c | 9 + drivers/bluetooth/btusb.c | 47 ++ drivers/clk/qcom/clk-alpha-pll.c | 27 + drivers/clk/qcom/clk-alpha-pll.h | 5 + drivers/clocksource/hyperv_timer.c | 14 +- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 4 +- .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 16 +- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 14 +- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 10 +- drivers/gpu/drm/bridge/adv7511/adv7533.c | 4 +- drivers/gpu/drm/i915/gt/intel_rc6.c | 2 +- drivers/i2c/busses/Kconfig | 2 + drivers/i2c/busses/i2c-i801.c | 9 + drivers/iio/adc/ad7192.c | 39 +- drivers/infiniband/core/uverbs_cmd.c | 16 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 63 +- drivers/infiniband/hw/bnxt_re/main.c | 21 +- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 93 +-- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 19 +- drivers/infiniband/hw/bnxt_re/qplib_res.h | 6 + drivers/infiniband/hw/bnxt_re/qplib_sp.c | 26 +- drivers/infiniband/hw/bnxt_re/qplib_sp.h | 9 + drivers/infiniband/hw/bnxt_re/roce_hsi.h | 30 +- drivers/infiniband/hw/hns/hns_roce_alloc.c | 3 +- drivers/infiniband/hw/hns/hns_roce_cq.c | 11 +- drivers/infiniband/hw/hns/hns_roce_device.h | 12 +- drivers/infiniband/hw/hns/hns_roce_hem.c | 54 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 130 ++-- drivers/infiniband/hw/hns/hns_roce_mr.c | 95 +-- drivers/infiniband/hw/hns/hns_roce_qp.c | 4 +- drivers/infiniband/hw/hns/hns_roce_srq.c | 4 +- drivers/infiniband/hw/mlx5/main.c | 6 +- drivers/infiniband/ulp/rtrs/rtrs-srv.c | 2 +- drivers/irqchip/irq-gic.c | 2 +- drivers/mailbox/pcc.c | 136 +++- drivers/media/usb/uvc/uvc_driver.c | 22 + drivers/mmc/host/sdhci-msm.c | 16 +- drivers/net/dsa/microchip/ksz9477.c | 47 +- drivers/net/dsa/microchip/ksz9477_reg.h | 4 +- drivers/net/dsa/microchip/lan937x_main.c | 62 +- drivers/net/dsa/microchip/lan937x_reg.h | 9 +- drivers/net/ethernet/broadcom/bcmsysport.c | 21 +- drivers/net/ethernet/google/gve/gve_main.c | 25 +- drivers/net/ethernet/google/gve/gve_tx.c | 5 +- drivers/net/ethernet/marvell/mv643xx_eth.c | 14 +- drivers/net/ethernet/marvell/sky2.c | 1 + .../ethernet/mellanox/mlx5/core/en_accel/macsec.c | 4 + .../net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c | 6 +- drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 3 + .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 3 - drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 7 +- .../ethernet/mellanox/mlx5/core/steering/dr_send.c | 4 +- .../net/ethernet/mellanox/mlxsw/spectrum_span.c | 3 +- drivers/net/ethernet/renesas/rswitch.c | 5 +- drivers/net/ethernet/sfc/tc_conntrack.c | 2 +- .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 120 ++-- drivers/net/ethernet/ti/icssg/icss_iep.c | 8 + drivers/net/usb/qmi_wwan.c | 3 + drivers/net/wireless/ath/ath10k/bmi.c | 1 + drivers/net/wireless/ath/ath10k/ce.c | 1 + drivers/net/wireless/ath/ath10k/core.c | 1 + drivers/net/wireless/ath/ath10k/core.h | 1 + drivers/net/wireless/ath/ath10k/coredump.c | 1 + drivers/net/wireless/ath/ath10k/coredump.h | 1 + drivers/net/wireless/ath/ath10k/debug.c | 1 + drivers/net/wireless/ath/ath10k/debugfs_sta.c | 1 + drivers/net/wireless/ath/ath10k/htc.c | 1 + drivers/net/wireless/ath/ath10k/htt.h | 1 + drivers/net/wireless/ath/ath10k/htt_rx.c | 1 + drivers/net/wireless/ath/ath10k/htt_tx.c | 1 + drivers/net/wireless/ath/ath10k/hw.c | 1 + drivers/net/wireless/ath/ath10k/hw.h | 1 + drivers/net/wireless/ath/ath10k/mac.c | 1 + drivers/net/wireless/ath/ath10k/pci.c | 1 + drivers/net/wireless/ath/ath10k/pci.h | 1 + drivers/net/wireless/ath/ath10k/qmi.c | 1 + drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c | 1 + drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h | 1 + drivers/net/wireless/ath/ath10k/rx_desc.h | 1 + drivers/net/wireless/ath/ath10k/sdio.c | 5 +- drivers/net/wireless/ath/ath10k/thermal.c | 1 + drivers/net/wireless/ath/ath10k/usb.h | 1 + drivers/net/wireless/ath/ath10k/wmi-tlv.h | 1 + drivers/net/wireless/ath/ath10k/wmi.c | 1 + drivers/net/wireless/ath/ath10k/wmi.h | 1 + drivers/net/wireless/ath/ath10k/wow.c | 1 + drivers/net/wireless/ath/ath12k/mac.c | 26 +- drivers/net/wireless/ath/ath12k/reg.c | 6 +- drivers/net/wireless/realtek/rtw88/sdio.c | 6 +- drivers/net/wireless/realtek/rtw88/usb.c | 5 +- drivers/net/wwan/iosm/iosm_ipc_mmio.c | 2 +- drivers/net/wwan/t7xx/t7xx_state_monitor.c | 26 +- drivers/net/wwan/t7xx/t7xx_state_monitor.h | 5 +- drivers/nvme/host/core.c | 27 +- drivers/nvme/host/nvme.h | 5 + drivers/nvme/host/pci.c | 9 +- drivers/of/address.c | 30 +- drivers/pinctrl/pinctrl-mcp23s08.c | 6 + drivers/platform/x86/mlx-platform.c | 2 + drivers/remoteproc/qcom_q6v5_pas.c | 94 +++ drivers/scsi/hisi_sas/hisi_sas.h | 3 +- drivers/scsi/hisi_sas/hisi_sas_main.c | 17 +- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 200 +++--- drivers/scsi/mpi3mr/mpi3mr_os.c | 12 +- drivers/thunderbolt/nhi.c | 12 + drivers/thunderbolt/nhi.h | 6 + drivers/thunderbolt/retimer.c | 17 +- drivers/usb/chipidea/ci.h | 2 + drivers/usb/chipidea/ci_hdrc_imx.c | 1 + drivers/usb/chipidea/core.c | 2 + drivers/usb/chipidea/otg.c | 5 +- drivers/usb/chipidea/udc.c | 6 + drivers/usb/dwc3/core.h | 4 + drivers/usb/dwc3/gadget.c | 54 +- drivers/usb/host/xhci-ring.c | 42 +- drivers/usb/host/xhci.c | 21 +- drivers/usb/host/xhci.h | 2 + drivers/usb/typec/ucsi/ucsi.c | 9 + drivers/usb/typec/ucsi/ucsi.h | 5 + drivers/usb/typec/ucsi/ucsi_glink.c | 60 +- drivers/watchdog/rzg2l_wdt.c | 83 ++- fs/btrfs/ctree.c | 37 +- fs/btrfs/ctree.h | 7 + fs/btrfs/disk-io.c | 9 + fs/btrfs/inode.c | 2 +- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 ++++---- fs/ceph/caps.c | 708 ++++++++++++--------- fs/ceph/crypto.c | 39 +- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 ++++--- fs/ceph/export.c | 39 +- fs/ceph/file.c | 245 ++++--- fs/ceph/inode.c | 485 +++++++------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 +- fs/ceph/mds_client.c | 563 +++++++++------- fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++--- fs/ceph/super.c | 70 +- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +-- fs/ext4/ext4.h | 20 +- fs/ext4/extents.c | 18 +- fs/ext4/ialloc.c | 4 +- fs/ext4/inline.c | 4 +- fs/ext4/inode.c | 72 ++- fs/ext4/ioctl.c | 13 +- fs/ext4/namei.c | 10 +- fs/ext4/super.c | 2 +- fs/ext4/xattr.c | 8 +- fs/f2fs/file.c | 13 + fs/ntfs3/attrib.c | 32 +- fs/ntfs3/frecord.c | 103 +-- fs/ntfs3/inode.c | 3 +- fs/ntfs3/ntfs_fs.h | 3 +- fs/ocfs2/quota_global.c | 2 +- fs/ocfs2/quota_local.c | 1 + fs/proc/task_mmu.c | 2 +- fs/smb/client/cifsacl.c | 266 ++++---- fs/smb/client/cifsacl.h | 20 +- fs/smb/client/cifsfs.c | 1 + fs/smb/client/cifsglob.h | 22 +- fs/smb/client/cifsproto.h | 26 +- fs/smb/client/cifssmb.c | 6 +- fs/smb/client/inode.c | 4 +- fs/smb/client/smb2inode.c | 4 +- fs/smb/client/smb2ops.c | 14 +- fs/smb/client/smb2pdu.c | 12 +- fs/smb/client/smb2pdu.h | 8 +- fs/smb/client/smb2proto.h | 4 +- fs/smb/client/smb2transport.c | 56 +- fs/smb/client/xattr.c | 4 +- fs/smb/server/smb2pdu.c | 22 +- fs/smb/server/vfs.h | 1 + fs/udf/namei.c | 17 +- include/acpi/pcc.h | 20 + include/clocksource/hyperv_timer.h | 2 + include/crypto/internal/ecc.h | 10 + include/linux/bpf_verifier.h | 31 +- include/linux/ceph/ceph_debug.h | 38 ++ include/linux/cleanup.h | 88 ++- include/linux/if_vlan.h | 16 +- include/linux/memblock.h | 1 + include/linux/mlx5/driver.h | 6 + include/linux/mutex.h | 3 +- include/linux/rwsem.h | 8 +- include/linux/seq_buf.h | 25 +- include/linux/spinlock.h | 15 + include/linux/trace_events.h | 6 +- include/linux/trace_seq.h | 2 + include/linux/usb/chipidea.h | 2 + include/net/bluetooth/hci_core.h | 108 ++-- include/net/mac80211.h | 31 + include/net/netfilter/nf_tables.h | 7 +- kernel/bpf/core.c | 6 +- kernel/bpf/verifier.c | 175 +++-- kernel/kcov.c | 2 +- kernel/sched/core.c | 12 +- kernel/softirq.c | 15 +- kernel/trace/trace.c | 231 ++----- kernel/trace/trace.h | 6 +- kernel/trace/trace_events.c | 44 +- kernel/trace/trace_output.c | 6 +- kernel/trace/trace_seq.c | 6 +- lib/seq_buf.c | 26 +- mm/kmemleak.c | 2 +- mm/memblock.c | 38 ++ mm/readahead.c | 6 +- mm/vmscan.c | 9 +- net/bluetooth/hci_conn.c | 13 +- net/bluetooth/hci_core.c | 10 +- net/bluetooth/iso.c | 6 + net/bluetooth/l2cap_core.c | 12 +- net/bluetooth/rfcomm/core.c | 6 + net/bluetooth/sco.c | 12 +- net/core/dev.c | 4 +- net/core/sock.c | 5 +- net/ipv4/ip_tunnel.c | 38 +- net/ipv4/tcp_input.c | 1 + net/ipv6/ila/ila_xlat.c | 16 +- net/llc/llc_input.c | 2 +- net/mac80211/ieee80211_i.h | 2 - net/mac80211/mesh.c | 6 +- net/mac80211/status.c | 1 + net/mac80211/util.c | 19 +- net/mctp/route.c | 36 +- net/mptcp/options.c | 7 + net/mptcp/protocol.c | 22 +- net/netrom/nr_route.c | 6 + net/packet/af_packet.c | 28 +- net/sctp/associola.c | 3 +- rust/Makefile | 4 +- scripts/mod/file2alias.c | 4 +- scripts/sorttable.h | 5 +- security/selinux/ss/services.c | 8 +- sound/core/seq/oss/seq_oss_synth.c | 2 + sound/core/seq/seq_clientmgr.c | 14 +- sound/core/ump.c | 61 +- sound/pci/hda/patch_ca0132.c | 37 +- sound/pci/hda/patch_realtek.c | 2 + sound/usb/format.c | 7 +- sound/usb/mixer_us16x08.c | 2 +- sound/usb/quirks.c | 2 + .../bpf/progs/verifier_subprog_precision.c | 23 +- tools/testing/selftests/bpf/verifier/precise.c | 38 +- 276 files changed, 4885 insertions(+), 3100 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/222 drm/amd/display: Fix DSC-re-computing
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Agustin Gutierrez <[email protected]>
[ Upstream commit b9b5a82c532109a09f4340ef5cabdfdbb0691a9d ]
[Why]
This fixes a bug introduced by commit c53655545141 ("drm/amd/display: dsc mst re-compute pbn for changes on hub").
The change caused light-up issues with a second display that required DSC on some MST docks.
[How]
Use Virtual DPCD for DSC caps in MST case.
[Limitations]
This change only affects MST DSC devices that follow specifications additional changes are required to check for old MST DSC devices such as ones which do not check for Virtual DPCD registers.
Stable-dep-of: 4641169a8c95 ("drm/amd/display: Fix incorrect DSC recompute trigger")
--- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +13 -5
@@ -1219,10 +1219,6 @@ static bool is_dsc_need_re_compute(if (dc_link->type != dc_connection_mst_branch)return false; -if (!(dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT || - dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_PASSTHROUGH_SUPPORT)) -return false; -for (i =0 ; i <MAX_PIPES ; i++) stream_on_link[i] =NULL ;
@@ -1240,7 +1236,19 @@ static bool is_dsc_need_re_compute(continue ; aconnector = (struct amdgpu_dm_connector *) stream->dm_stream_context; -if (!aconnector) +if (!aconnector || !aconnector->dsc_aux) +continue ; + +/* +* Check if cached virtual MST DSC caps are available and DSC is supported +* this change takes care of newer MST DSC capable devices that report their +* DPCD caps as per specifications in their Virtual DPCD registers. + +* TODO: implement the check for older MST DSC devices that do not conform to +* specifications. +*/ +if (!(aconnector->dc_sink->dsc_caps.dsc_dec_caps.is_dsc_supported || + aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_PASSTHROUGH_SUPPORT))continue ; stream_on_link[new_stream_on_link_num] = aconnector;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 2/222 drm/amd/display: Fix incorrect DSC recompute trigger
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangzhi Zuo <[email protected]>
[ Upstream commit 4641169a8c95d9efc35d2d3c55c3948f3b375ff9 ]
A stream without dsc_aux should not be eliminated from
the dsc determination. Whether it needs a dsc recompute depends on whether its mode has changed or not. Eliminating such a no-dsc stream from the dsc determination policy will end up with inconsistencies in the new dc_state when compared to the current dc_state, triggering a dsc recompute that should not have happened.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +1 -1
@@ -1236,7 +1236,7 @@ static bool is_dsc_need_re_compute(continue ; aconnector = (struct amdgpu_dm_connector *) stream->dm_stream_context; -if (!aconnector || !aconnector->dsc_aux) +if (!aconnector)continue ;/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 3/222 docs: media: update location of the media patches
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 72ad4ff638047bbbdf3232178fea4bec1f429319 ]
Due to recent changes on the way we're maintaining media, the location of the main tree was updated.
Change docs accordingly.
--- Documentation/admin-guide/media/building.rst | 2 +- Documentation/admin-guide/media/saa7134.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/admin-guide/media/building.rst +1 -1
@@ -15,7 +15,7 @@ Please notice, however, that, if: you should use the main media development tree ``master`` branch: - https://git.linuxtv.org/media_tree.git/ + https://git.linuxtv.org/media.git/ In this case, you may find some useful information at the `LinuxTv wiki pages <https://linuxtv.org/wiki>`_:
Documentation/admin-guide/media/saa7134.rst +1 -1
@@ -67,7 +67,7 @@ Changes / Fixes Please mail to linux-media AT vger.kernel.org unified diffs against the linux media git tree: - https://git.linuxtv.org/media_tree.git/ + https://git.linuxtv.org/media.git/ This is done by committing a patch at a clone of the git tree and submitting the patch using ``git send-email``. Don't forget to
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 4/222 x86/mm: Carve out INVLPG inline asm for use by others
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov (AMD) <[email protected]>
[ Upstream commit f1d84b59cbb9547c243d93991acf187fdbe9fbe9 ]
No functional changes.
--- arch/x86/include/asm/tlb.h | 4 ++++ arch/x86/mm/tlb.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-)
arch/x86/include/asm/tlb.h +4 -0
@@ -34,4 +34,8 @@ static inline void __tlb_remove_table(void *table) free_page_and_swap_cache(table); } +static inline void invlpg (unsigned long addr) +{ + asmvolatile ("invlpg (%0)" ::"r" (addr) :"memory" ); +}#endif /* _ASM_X86_TLB_H */
arch/x86/mm/tlb.c +2 -1
@@ -19,6 +19,7 @@#include <asm/cacheflush.h> #include <asm/apic.h> #include <asm/perf_event.h> +#include <asm/tlb.h> #include "mm_internal.h"
@@ -1145,7 +1146,7 @@ STATIC_NOPV void native_flush_tlb_one_user(unsigned long addr)bool cpu_pcide;/* Flush 'addr' from the kernel PCID: */ - asmvolatile ("invlpg (%0)" ::"r" (addr) :"memory" ); +invlpg (addr);/* If PTI is off there is no user PCID and nothing to flush. */ if (!static_cpu_has (X86_FEATURE_PTI ))
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 5/222 smb/client: rename cifs_ntsd to smb_ntsd
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChenXiaoSong <[email protected]>
[ Upstream commit 3651487607ae778df1051a0a38bb34a5bd34e3b7 ]
Preparation for moving acl definitions to new common header file.
Use the following shell command to rename:
find fs/smb/client -type f -exec sed -i \
's/struct cifs_ntsd/struct smb_ntsd/g' {} +Stable-dep-of: d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX Extensions")
--- fs/smb/client/cifsacl.c | 36 ++++++++++++++++++------------------ fs/smb/client/cifsacl.h | 6 +++--- fs/smb/client/cifsglob.h | 12 ++++++------ fs/smb/client/cifsproto.h | 16 ++++++++-------- fs/smb/client/cifssmb.c | 6 +++--- fs/smb/client/smb2ops.c | 14 +++++++------- fs/smb/client/smb2pdu.c | 2 +- fs/smb/client/smb2proto.h | 2 +- fs/smb/client/xattr.c | 4 ++-- 9 files changed, 49 insertions(+), 49 deletions(-)
fs/smb/client/cifsacl.c +18 -18
@@ -515,8 +515,8 @@ exit_cifs_idmap(void) }/* copy ntsd, owner sid, and group sid from a security descriptor to another */ -static __u32 copy_sec_desc (const struct cifs_ntsd *pntsd, -struct cifs_ntsd *pnntsd, +static __u32 copy_sec_desc (const struct smb_ntsd *pntsd, +struct smb_ntsd *pnntsd,__u32 sidsoffset,struct cifs_sid *pownersid,struct cifs_sid *pgrpsid)
@@ -527,7 +527,7 @@ static __u32 copy_sec_desc(const struct cifs_ntsd *pntsd,/* copy security descriptor control portion */ pnntsd->revision = pntsd->revision; pnntsd->type = pntsd->type; - pnntsd->dacloffset =cpu_to_le32 (sizeof (struct cifs_ntsd )); + pnntsd->dacloffset =cpu_to_le32 (sizeof (struct smb_ntsd )); pnntsd->sacloffset =0 ; pnntsd->osidoffset =cpu_to_le32 (sidsoffset); pnntsd->gsidoffset =cpu_to_le32 (sidsoffset +sizeof (struct cifs_sid ));
@@ -1191,7 +1191,7 @@ static int parse_sid(struct cifs_sid *psid, char *end_of_acl)/* Convert CIFS ACL to POSIX form */ static int parse_sec_desc (struct cifs_sb_info *cifs_sb, -struct cifs_ntsd *pntsd,int acl_len,struct cifs_fattr *fattr, +struct smb_ntsd *pntsd,int acl_len,struct cifs_fattr *fattr,bool get_mode_from_special_sid) {int rc =0 ;
@@ -1249,7 +1249,7 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb, }/* Convert permission bits from mode to equivalent CIFS ACL */ -static int build_sec_desc (struct cifs_ntsd *pntsd,struct cifs_ntsd *pnntsd, +static int build_sec_desc (struct smb_ntsd *pntsd,struct smb_ntsd *pnntsd,__u32 secdesclen,__u32 *pnsecdesclen,__u64 *pnmode,kuid_t uid,kgid_t gid,bool mode_from_sid,bool id_from_sid,int *aclflag) {
@@ -1279,7 +1279,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd, le32_to_cpu(pntsd->gsidoffset));if (pnmode && *pnmode !=NO_CHANGE_64 ) {/* chmod */ - ndacloffset =sizeof (struct cifs_ntsd ); + ndacloffset =sizeof (struct smb_ntsd ); ndacl_ptr = (struct cifs_acl *)((char *)pnntsd + ndacloffset); ndacl_ptr->revision = dacloffset ? dacl_ptr->revision :cpu_to_le16 (ACL_REVISION );
@@ -1297,7 +1297,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd, *aclflag |=CIFS_ACL_DACL ; }else { - ndacloffset =sizeof (struct cifs_ntsd ); + ndacloffset =sizeof (struct smb_ntsd ); ndacl_ptr = (struct cifs_acl *)((char *)pnntsd + ndacloffset); ndacl_ptr->revision = dacloffset ? dacl_ptr->revision :cpu_to_le16 (ACL_REVISION );
@@ -1385,11 +1385,11 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd, }#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY -struct cifs_ntsd *get_cifs_acl_by_fid (struct cifs_sb_info *cifs_sb, +struct smb_ntsd *get_cifs_acl_by_fid (struct cifs_sb_info *cifs_sb,const struct cifs_fid *cifsfid,u32 *pacllen,u32 __maybe_unused unused) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;unsigned int xid;int rc;struct tcon_link *tlink =cifs_sb_tlink (cifs_sb);
@@ -1410,10 +1410,10 @@ struct cifs_ntsd *get_cifs_acl_by_fid(struct cifs_sb_info *cifs_sb,return pntsd; } -static struct cifs_ntsd *get_cifs_acl_by_path (struct cifs_sb_info *cifs_sb, +static struct smb_ntsd *get_cifs_acl_by_path (struct cifs_sb_info *cifs_sb,const char *path,u32 *pacllen) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;int oplock =0 ;unsigned int xid;int rc;
@@ -1454,11 +1454,11 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, }/* Retrieve an ACL from the server */ -struct cifs_ntsd *get_cifs_acl (struct cifs_sb_info *cifs_sb, +struct smb_ntsd *get_cifs_acl (struct cifs_sb_info *cifs_sb,struct inode *inode,const char *path,u32 *pacllen,u32 info) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;struct cifsFileInfo *open_file =NULL ;if (inode)
@@ -1472,7 +1472,7 @@ struct cifs_ntsd *get_cifs_acl(struct cifs_sb_info *cifs_sb, }/* Set an ACL on the server */ -int set_cifs_acl (struct cifs_ntsd *pnntsd,__u32 acllen, +int set_cifs_acl (struct smb_ntsd *pnntsd,__u32 acllen,struct inode *inode,const char *path,int aclflag) {int oplock =0 ;
@@ -1528,7 +1528,7 @@ cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, struct inode *inode, bool mode_from_special_sid, const char *path, const struct cifs_fid *pfid) { - struct cifs_ntsd *pntsd = NULL; + struct smb_ntsd *pntsd = NULL;u32 acllen =0 ;int rc =0 ;struct tcon_link *tlink =cifs_sb_tlink (cifs_sb);
@@ -1581,8 +1581,8 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,__u32 nsecdesclen =0 ;__u32 dacloffset =0 ;struct cifs_acl *dacl_ptr =NULL ; -struct cifs_ntsd *pntsd =NULL ;/* acl obtained from server */ -struct cifs_ntsd *pnntsd =NULL ;/* modified acl to be sent to server */ +struct smb_ntsd *pntsd =NULL ;/* acl obtained from server */ +struct smb_ntsd *pnntsd =NULL ;/* modified acl to be sent to server */ struct cifs_sb_info *cifs_sb =CIFS_SB (inode->i_sb);struct tcon_link *tlink =cifs_sb_tlink (cifs_sb);struct smb_version_operations *ops;
@@ -1630,7 +1630,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, nsecdesclen +=5 *sizeof (struct cifs_ace ); }else {/* chown */ /* When ownership changes, changes new owner sid length could be different */ - nsecdesclen =sizeof (struct cifs_ntsd ) + (sizeof (struct cifs_sid ) *2 ); + nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct cifs_sid ) *2 ); dacloffset =le32_to_cpu (pntsd->dacloffset);if (dacloffset) { dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset);
fs/smb/client/cifsacl.h +3 -3
@@ -33,7 +33,7 @@* Security Descriptor length containing DACL with 3 ACEs (one each for * owner, group and world). */ -#define DEFAULT_SEC_DESC_LEN (sizeof(struct cifs_ntsd) + \ +#define DEFAULT_SEC_DESC_LEN (sizeof(struct smb_ntsd) + \ sizeof(struct cifs_acl) + \ (sizeof(struct cifs_ace) * 4))
@@ -55,7 +55,7 @@#define SID_STRING_BASE_SIZE (2 + 3 + 15 + 1)#define SID_STRING_SUBAUTH_SIZE (11)/* size of a single subauth string */ -struct cifs_ntsd { +struct smb_ntsd {__le16 revision;/* revision level */ __le16 type;__le32 osidoffset;
@@ -194,6 +194,6 @@ struct owner_group_sids {* Minimum security descriptor can be one without any SACL and DACL and can * consist of revision, type, and two sids of minimum size for owner and group */ -#define MIN_SEC_DESC_LEN (sizeof(struct cifs_ntsd) + (2 * MIN_SID_LEN)) +#define MIN_SEC_DESC_LEN (sizeof(struct smb_ntsd) + (2 * MIN_SID_LEN))#endif /* _CIFSACL_H */
fs/smb/client/cifsglob.h +6 -6
@@ -539,12 +539,12 @@ struct smb_version_operations {int (*set_EA)(const unsigned int ,struct cifs_tcon *,const char *,const char *,const void *,const __u16 ,const struct nls_table *,struct cifs_sb_info *); -struct cifs_ntsd * (*get_acl)(struct cifs_sb_info *,struct inode *, -const char *,u32 *,u32 ); -struct cifs_ntsd * (*get_acl_by_fid)(struct cifs_sb_info *, -const struct cifs_fid *,u32 *,u32 ); -int (*set_acl)(struct cifs_ntsd *,__u32 ,struct inode *,const char *, -int ); +struct smb_ntsd * (*get_acl)(struct cifs_sb_info *cifssb,struct inode *ino, +const char *patch,u32 *plen,u32 info); +struct smb_ntsd * (*get_acl_by_fid)(struct cifs_sb_info *cifssmb, +const struct cifs_fid *pfid,u32 *plen,u32 info); +int (*set_acl)(struct smb_ntsd *pntsd,__u32 len,struct inode *ino,const char *path, +int flag);/* writepages retry size */ unsigned int (*wp_retry_size)(struct inode *);/* get mtu credits */
fs/smb/client/cifsproto.h +8 -8
@@ -231,16 +231,16 @@ extern int cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, const char *path, const struct cifs_fid *pfid);extern int id_mode_to_cifs_acl (struct inode *inode,const char *path,__u64 *pnmode,kuid_t uid,kgid_t gid); -extern struct cifs_ntsd *get_cifs_acl (struct cifs_sb_info *,struct inode *, -const char *,u32 *,u32 ); -extern struct cifs_ntsd *get_cifs_acl_by_fid (struct cifs_sb_info *, -const struct cifs_fid *,u32 *,u32 ); +extern struct smb_ntsd *get_cifs_acl (struct cifs_sb_info *cifssmb,struct inode *ino, +const char *path,u32 *plen,u32 info); +extern struct smb_ntsd *get_cifs_acl_by_fid (struct cifs_sb_info *cifssb, +const struct cifs_fid *pfid,u32 *plen,u32 info);extern struct posix_acl *cifs_get_acl (struct mnt_idmap *idmap,struct dentry *dentry,int type);extern int cifs_set_acl (struct mnt_idmap *idmap,struct dentry *dentry,struct posix_acl *acl,int type); -extern int set_cifs_acl (struct cifs_ntsd *,__u32 ,struct inode *, -const char *,int ); +extern int set_cifs_acl (struct smb_ntsd *pntsd,__u32 len,struct inode *ino, +const char *path,int flag);extern unsigned int setup_authusers_ACE (struct cifs_ace *pace);extern unsigned int setup_special_mode_ACE (struct cifs_ace *pace,__u64 nmode);extern unsigned int setup_special_user_owner_ACE (struct cifs_ace *pace);
@@ -568,9 +568,9 @@ extern int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon,const struct nls_table *nls_codepage, struct cifs_sb_info *cifs_sb);extern int CIFSSMBGetCIFSACL (const unsigned int xid,struct cifs_tcon *tcon, -__u16 fid,struct cifs_ntsd **acl_inf,__u32 *buflen); +__u16 fid,struct smb_ntsd **acl_inf,__u32 *buflen);extern int CIFSSMBSetCIFSACL (const unsigned int ,struct cifs_tcon *,__u16 , -struct cifs_ntsd *,__u32 ,int ); +struct smb_ntsd *pntsd,__u32 len,int aclflag); extern int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon, const unsigned char *searchName, struct posix_acl **acl, const int acl_type,
fs/smb/client/cifssmb.c +3 -3
@@ -3385,7 +3385,7 @@ validate_ntransact(char *buf, char **ppparm, char **ppdata,/* Get Security Descriptor (by handle) from remote server for a file or dir */ int CIFSSMBGetCIFSACL (const unsigned int xid,struct cifs_tcon *tcon,__u16 fid, -struct cifs_ntsd **acl_inf,__u32 *pbuflen) +struct smb_ntsd **acl_inf,__u32 *pbuflen) {int rc =0 ;int buf_type =0 ;
@@ -3455,7 +3455,7 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,/* check if buffer is big enough for the acl header followed by the smallest SID */ -if ((*pbuflen <sizeof (struct cifs_ntsd ) +8 ) || +if ((*pbuflen <sizeof (struct smb_ntsd ) +8 ) || (*pbuflen >=64 *1024 )) {cifs_dbg (VFS ,"bad acl length %d\n" , *pbuflen); rc = -EINVAL ;
@@ -3475,7 +3475,7 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,int CIFSSMBSetCIFSACL (const unsigned int xid,struct cifs_tcon *tcon,__u16 fid, -struct cifs_ntsd *pntsd,__u32 acllen,int aclflag) +struct smb_ntsd *pntsd,__u32 acllen,int aclflag) {__u16 byte_count, param_count, data_count, param_offset, data_offset;int rc =0 ;
fs/smb/client/smb2ops.c +7 -7
@@ -3001,11 +3001,11 @@ smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,return rc; } -static struct cifs_ntsd * +static struct smb_ntsd *get_smb2_acl_by_fid (struct cifs_sb_info *cifs_sb,const struct cifs_fid *cifsfid,u32 *pacllen,u32 info) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;unsigned int xid;int rc = -EOPNOTSUPP ;struct tcon_link *tlink =cifs_sb_tlink (cifs_sb);
@@ -3030,11 +3030,11 @@ get_smb2_acl_by_fid(struct cifs_sb_info *cifs_sb, } -static struct cifs_ntsd * +static struct smb_ntsd *get_smb2_acl_by_path (struct cifs_sb_info *cifs_sb,const char *path,u32 *pacllen,u32 info) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;u8 oplock =SMB2_OPLOCK_LEVEL_NONE ;unsigned int xid;int rc;
@@ -3097,7 +3097,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb, }static int -set_smb2_acl (struct cifs_ntsd *pnntsd,__u32 acllen, +set_smb2_acl (struct smb_ntsd *pnntsd,__u32 acllen,struct inode *inode,const char *path,int aclflag) {u8 oplock =SMB2_OPLOCK_LEVEL_NONE ;
@@ -3155,12 +3155,12 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen, }/* Retrieve an ACL from the server */ -static struct cifs_ntsd * +static struct smb_ntsd *get_smb2_acl (struct cifs_sb_info *cifs_sb,struct inode *inode,const char *path,u32 *pacllen,u32 info) { -struct cifs_ntsd *pntsd =NULL ; +struct smb_ntsd *pntsd =NULL ;struct cifsFileInfo *open_file =NULL ;if (inode && !(info &SACL_SECINFO ))
fs/smb/client/smb2pdu.c +1 -1
@@ -5626,7 +5626,7 @@ SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,int SMB2_set_acl (const unsigned int xid,struct cifs_tcon *tcon,u64 persistent_fid,u64 volatile_fid, -struct cifs_ntsd *pnntsd,int pacllen,int aclflag) +struct smb_ntsd *pnntsd,int pacllen,int aclflag) { return send_set_info(xid, tcon, persistent_fid, volatile_fid, current->tgid, 0, SMB2_O_INFO_SECURITY, aclflag,
fs/smb/client/smb2proto.h +1 -1
@@ -247,7 +247,7 @@ extern int SMB2_set_info_init(struct cifs_tcon *tcon,extern void SMB2_set_info_free (struct smb_rqst *rqst);extern int SMB2_set_acl (const unsigned int xid,struct cifs_tcon *tcon,u64 persistent_fid,u64 volatile_fid, -struct cifs_ntsd *pnntsd,int pacllen,int aclflag); +struct smb_ntsd *pnntsd,int pacllen,int aclflag);extern int SMB2_set_ea (const unsigned int xid,struct cifs_tcon *tcon,u64 persistent_fid,u64 volatile_fid,struct smb2_file_full_ea_info *buf,int len);
fs/smb/client/xattr.c +2 -2
@@ -162,7 +162,7 @@ static int cifs_xattr_set(const struct xattr_handler *handler,case XATTR_CIFS_ACL :case XATTR_CIFS_NTSD :case XATTR_CIFS_NTSD_FULL : { -struct cifs_ntsd *pacl; +struct smb_ntsd *pacl;if (!value) goto out;
@@ -315,7 +315,7 @@ static int cifs_xattr_get(const struct xattr_handler *handler,* fetch owner and DACL otherwise */ u32 acllen, extra_info; -struct cifs_ntsd *pacl; +struct smb_ntsd *pacl;if (pTcon->ses->server->ops->get_acl ==NULL ) goto out;/* rc already EOPNOTSUPP */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 6/222 smb/client: rename cifs_sid to smb_sid
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChenXiaoSong <[email protected]>
[ Upstream commit 7f599d8fb3e087aff5be4e1392baaae3f8d42419 ]
Preparation for moving acl definitions to new common header file.
Use the following shell command to rename:
find fs/smb/client -type f -exec sed -i \
's/struct cifs_sid/struct smb_sid/g' {} +Stable-dep-of: d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX Extensions")
--- fs/smb/client/cifsacl.c | 96 +++++++++++++++++++-------------------- fs/smb/client/cifsacl.h | 6 +-- fs/smb/client/cifsglob.h | 8 ++-- fs/smb/client/cifsproto.h | 2 +- fs/smb/client/smb2inode.c | 4 +- fs/smb/client/smb2pdu.c | 2 +- fs/smb/client/smb2pdu.h | 8 ++-- 7 files changed, 63 insertions(+), 63 deletions(-)
fs/smb/client/cifsacl.c +48 -48
@@ -27,18 +27,18 @@#include "cifs_unicode.h" /* security id for everyone/world system group */ -static const struct cifs_sid sid_everyone = { +static const struct smb_sid sid_everyone = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,1 }, {0 } };/* security id for Authenticated Users system group */ -static const struct cifs_sid sid_authusers = { +static const struct smb_sid sid_authusers = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,5 }, {cpu_to_le32 (11 )} };/* S-1-22-1 Unmapped Unix users */ -static const struct cifs_sid sid_unix_users = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,22 }, +static const struct smb_sid sid_unix_users = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,22 }, {cpu_to_le32 (1 ),0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 } };/* S-1-22-2 Unmapped Unix groups */ -static const struct cifs_sid sid_unix_groups = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,22 }, +static const struct smb_sid sid_unix_groups = {1 ,1 , {0 ,0 ,0 ,0 ,0 ,22 }, {cpu_to_le32 (2 ),0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 } };/*
@@ -48,17 +48,17 @@ static const struct cifs_sid sid_unix_groups = { 1, 1, {0, 0, 0, 0, 0, 22},/* S-1-5-88 MS NFS and Apple style UID/GID/mode */ /* S-1-5-88-1 Unix uid */ -static const struct cifs_sid sid_unix_NFS_users = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, +static const struct smb_sid sid_unix_NFS_users = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, {cpu_to_le32 (88 ),cpu_to_le32 (1 ),0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 } };/* S-1-5-88-2 Unix gid */ -static const struct cifs_sid sid_unix_NFS_groups = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, +static const struct smb_sid sid_unix_NFS_groups = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, {cpu_to_le32 (88 ),cpu_to_le32 (2 ),0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 } };/* S-1-5-88-3 Unix mode */ -static const struct cifs_sid sid_unix_NFS_mode = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, +static const struct smb_sid sid_unix_NFS_mode = {1 ,2 , {0 ,0 ,0 ,0 ,0 ,5 }, {cpu_to_le32 (88 ),cpu_to_le32 (3 ),0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 } };
@@ -106,7 +106,7 @@ static struct key_type cifs_idmap_key_type = { };static char * -sid_to_key_str (struct cifs_sid *sidptr,unsigned int type) +sid_to_key_str (struct smb_sid *sidptr,unsigned int type) {int i, len;unsigned int saval;
@@ -158,7 +158,7 @@ sid_to_key_str(struct cifs_sid *sidptr, unsigned int type)* the same returns zero, if they do not match returns non-zero. */ static int -compare_sids (const struct cifs_sid *ctsid,const struct cifs_sid *cwsid) +compare_sids (const struct smb_sid *ctsid,const struct smb_sid *cwsid) {int i;int num_subauth, num_sat, num_saw;
@@ -204,11 +204,11 @@ compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid) }static bool -is_well_known_sid (const struct cifs_sid *psid,uint32_t *puid,bool is_group) +is_well_known_sid (const struct smb_sid *psid,uint32_t *puid,bool is_group) {int i;int num_subauth; -const struct cifs_sid *pwell_known_sid; +const struct smb_sid *pwell_known_sid;if (!psid || (puid ==NULL ))return false;
@@ -260,7 +260,7 @@ is_well_known_sid(const struct cifs_sid *psid, uint32_t *puid, bool is_group) }static __u16 -cifs_copy_sid (struct cifs_sid *dst,const struct cifs_sid *src) +cifs_copy_sid (struct smb_sid *dst,const struct smb_sid *src) {int i;__u16 size =1 +1 +6 ;
@@ -277,11 +277,11 @@ cifs_copy_sid(struct cifs_sid *dst, const struct cifs_sid *src) }static int -id_to_sid (unsigned int cid,uint sidtype,struct cifs_sid *ssid) +id_to_sid (unsigned int cid,uint sidtype,struct smb_sid *ssid) {int rc;struct key *sidkey; -struct cifs_sid *ksid; +struct smb_sid *ksid;unsigned int ksid_size;char desc[3 +10 +1 ];/* 3 byte prefix + 10 bytes for value + NULL */ const struct cred *saved_cred;
@@ -312,8 +312,8 @@ id_to_sid(unsigned int cid, uint sidtype, struct cifs_sid *ssid)* it could be. */ ksid = sidkey->datalen <=sizeof (sidkey->payload) ? - (struct cifs_sid *)&sidkey->payload : - (struct cifs_sid *)sidkey->payload.data[0 ]; + (struct smb_sid *)&sidkey->payload : + (struct smb_sid *)sidkey->payload.data[0 ]; ksid_size =CIFS_SID_BASE_SIZE + (ksid->num_subauth *sizeof (__le32));if (ksid_size > sidkey->datalen) {
@@ -336,7 +336,7 @@ id_to_sid(unsigned int cid, uint sidtype, struct cifs_sid *ssid) }int -sid_to_id (struct cifs_sb_info *cifs_sb,struct cifs_sid *psid, +sid_to_id (struct cifs_sb_info *cifs_sb,struct smb_sid *psid,struct cifs_fattr *fattr,uint sidtype) {int rc =0 ;
@@ -518,11 +518,11 @@ exit_cifs_idmap(void)static __u32 copy_sec_desc (const struct smb_ntsd *pntsd,struct smb_ntsd *pnntsd,__u32 sidsoffset, -struct cifs_sid *pownersid, -struct cifs_sid *pgrpsid) +struct smb_sid *pownersid, +struct smb_sid *pgrpsid) { -struct cifs_sid *owner_sid_ptr, *group_sid_ptr; -struct cifs_sid *nowner_sid_ptr, *ngroup_sid_ptr; +struct smb_sid *owner_sid_ptr, *group_sid_ptr; +struct smb_sid *nowner_sid_ptr, *ngroup_sid_ptr;/* copy security descriptor control portion */ pnntsd->revision = pntsd->revision;
@@ -530,28 +530,28 @@ static __u32 copy_sec_desc(const struct smb_ntsd *pntsd, pnntsd->dacloffset =cpu_to_le32 (sizeof (struct smb_ntsd )); pnntsd->sacloffset =0 ; pnntsd->osidoffset =cpu_to_le32 (sidsoffset); - pnntsd->gsidoffset =cpu_to_le32 (sidsoffset +sizeof (struct cifs_sid )); + pnntsd->gsidoffset =cpu_to_le32 (sidsoffset +sizeof (struct smb_sid ));/* copy owner sid */ if (pownersid) owner_sid_ptr = pownersid;else - owner_sid_ptr = (struct cifs_sid *)((char *)pntsd + + owner_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->osidoffset)); - nowner_sid_ptr = (struct cifs_sid *)((char *)pnntsd + sidsoffset); + nowner_sid_ptr = (struct smb_sid *)((char *)pnntsd + sidsoffset);cifs_copy_sid (nowner_sid_ptr, owner_sid_ptr);/* copy group sid */ if (pgrpsid) group_sid_ptr = pgrpsid;else - group_sid_ptr = (struct cifs_sid *)((char *)pntsd + + group_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->gsidoffset)); - ngroup_sid_ptr = (struct cifs_sid *)((char *)pnntsd + sidsoffset + -sizeof (struct cifs_sid )); + ngroup_sid_ptr = (struct smb_sid *)((char *)pnntsd + sidsoffset + +sizeof (struct smb_sid ));cifs_copy_sid (ngroup_sid_ptr, group_sid_ptr); -return sidsoffset + (2 *sizeof (struct cifs_sid )); +return sidsoffset + (2 *sizeof (struct smb_sid )); }
@@ -666,7 +666,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use,return ; } -static __u16 cifs_copy_ace (struct cifs_ace *dst,struct cifs_ace *src,struct cifs_sid *psid) +static __u16 cifs_copy_ace (struct cifs_ace *dst,struct cifs_ace *src,struct smb_sid *psid) {__u16 size =1 +1 +2 +4 ;
@@ -686,7 +686,7 @@ static __u16 cifs_copy_ace(struct cifs_ace *dst, struct cifs_ace *src, struct ci }static __u16 fill_ace_for_sid (struct cifs_ace *pntace, -const struct cifs_sid *psid,__u64 nmode, +const struct smb_sid *psid,__u64 nmode,umode_t bits,__u8 access_type,bool allow_delete_child) {
@@ -759,7 +759,7 @@ static void dump_ace(struct cifs_ace *pace, char *end_of_acl)#endif static void parse_dacl (struct cifs_acl *pdacl,char *end_of_acl, -struct cifs_sid *pownersid,struct cifs_sid *pgrpsid, +struct smb_sid *pownersid,struct smb_sid *pgrpsid,struct cifs_fattr *fattr,bool mode_from_special_sid) {int i;
@@ -930,8 +930,8 @@ unsigned int setup_special_user_owner_ACE(struct cifs_ace *pntace) }static void populate_new_aces (char *nacl_base, -struct cifs_sid *pownersid, -struct cifs_sid *pgrpsid, +struct smb_sid *pownersid, +struct smb_sid *pgrpsid,__u64 *pnmode,u32 *pnum_aces,u16 *pnsize,bool modefromsid) {
@@ -967,7 +967,7 @@ static void populate_new_aces(char *nacl_base,* updated in the inode. */ -if (!memcmp (pownersid, pgrpsid,sizeof (struct cifs_sid ))) { +if (!memcmp (pownersid, pgrpsid,sizeof (struct smb_sid ))) {/* * Case when owner and group SIDs are the same. * Set the more restrictive of the two modes.
@@ -1035,8 +1035,8 @@ static void populate_new_aces(char *nacl_base, }static __u16 replace_sids_and_copy_aces (struct cifs_acl *pdacl,struct cifs_acl *pndacl, -struct cifs_sid *pownersid,struct cifs_sid *pgrpsid, -struct cifs_sid *pnownersid,struct cifs_sid *pngrpsid) +struct smb_sid *pownersid,struct smb_sid *pgrpsid, +struct smb_sid *pnownersid,struct smb_sid *pngrpsid) {int i;u16 size =0 ;
@@ -1075,7 +1075,7 @@ static __u16 replace_sids_and_copy_aces(struct cifs_acl *pdacl, struct cifs_acl }static int set_chmod_dacl (struct cifs_acl *pdacl,struct cifs_acl *pndacl, -struct cifs_sid *pownersid,struct cifs_sid *pgrpsid, +struct smb_sid *pownersid,struct smb_sid *pgrpsid,__u64 *pnmode,bool mode_from_sid) {int i;
@@ -1156,7 +1156,7 @@ static int set_chmod_dacl(struct cifs_acl *pdacl, struct cifs_acl *pndacl,return 0 ; } -static int parse_sid (struct cifs_sid *psid,char *end_of_acl) +static int parse_sid (struct smb_sid *psid,char *end_of_acl) {/* BB need to add parm so we can store the SID BB */
@@ -1195,7 +1195,7 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb, bool get_mode_from_special_sid) {int rc =0 ; -struct cifs_sid *owner_sid_ptr, *group_sid_ptr; +struct smb_sid *owner_sid_ptr, *group_sid_ptr;struct cifs_acl *dacl_ptr;/* no need for SACL ptr */ char *end_of_acl = ((char *)pntsd) + acl_len;__u32 dacloffset;
@@ -1203,9 +1203,9 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb,if (pntsd ==NULL )return -EIO ; - owner_sid_ptr = (struct cifs_sid *)((char *)pntsd + + owner_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->osidoffset)); - group_sid_ptr = (struct cifs_sid *)((char *)pntsd + + group_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->gsidoffset)); dacloffset =le32_to_cpu (pntsd->dacloffset); dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset);
@@ -1257,8 +1257,8 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd,__u32 dacloffset;__u32 ndacloffset;__u32 sidsoffset; -struct cifs_sid *owner_sid_ptr, *group_sid_ptr; -struct cifs_sid *nowner_sid_ptr =NULL , *ngroup_sid_ptr =NULL ; +struct smb_sid *owner_sid_ptr, *group_sid_ptr; +struct smb_sid *nowner_sid_ptr =NULL , *ngroup_sid_ptr =NULL ;struct cifs_acl *dacl_ptr =NULL ;/* no need for SACL ptr */ struct cifs_acl *ndacl_ptr =NULL ;/* no need for SACL ptr */ char *end_of_acl = ((char *)pntsd) + secdesclen;
@@ -1273,9 +1273,9 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd, } } - owner_sid_ptr = (struct cifs_sid *)((char *)pntsd + + owner_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->osidoffset)); - group_sid_ptr = (struct cifs_sid *)((char *)pntsd + + group_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->gsidoffset));if (pnmode && *pnmode !=NO_CHANGE_64 ) {/* chmod */
@@ -1305,7 +1305,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd,if (uid_valid (uid)) {/* chown */ uid_t id; - nowner_sid_ptr =kzalloc (sizeof (struct cifs_sid ), + nowner_sid_ptr =kzalloc (sizeof (struct smb_sid ),GFP_KERNEL );if (!nowner_sid_ptr) { rc = -ENOMEM ;
@@ -1334,7 +1334,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd, }if (gid_valid (gid)) {/* chgrp */ gid_t id; - ngroup_sid_ptr =kzalloc (sizeof (struct cifs_sid ), + ngroup_sid_ptr =kzalloc (sizeof (struct smb_sid ),GFP_KERNEL );if (!ngroup_sid_ptr) { rc = -ENOMEM ;
@@ -1630,7 +1630,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, nsecdesclen +=5 *sizeof (struct cifs_ace ); }else {/* chown */ /* When ownership changes, changes new owner sid length could be different */ - nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct cifs_sid ) *2 ); + nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct smb_sid ) *2 ); dacloffset =le32_to_cpu (pntsd->dacloffset);if (dacloffset) { dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset);
fs/smb/client/cifsacl.h +3 -3
@@ -64,14 +64,14 @@ struct smb_ntsd {__le32 dacloffset; } __attribute__((packed)); -struct cifs_sid { +struct smb_sid {__u8 revision;/* revision level */ __u8 num_subauth;__u8 authority[NUM_AUTHS ];__le32 sub_auth[SID_MAX_SUB_AUTHORITIES ];/* sub_auth[num_subauth] */ } __attribute__((packed)); -/* size of a struct cifs_sid, sans sub_auth array */ +/* size of a struct smb_sid, sans sub_auth array */ #define CIFS_SID_BASE_SIZE (1 + 1 + NUM_AUTHS)struct cifs_acl {
@@ -116,7 +116,7 @@ struct cifs_ace {__u8 flags;__le16 size;__le32 access_req; -struct cifs_sid sid;/* ie UUID of user or group who gets these perms */ +struct smb_sid sid;/* ie UUID of user or group who gets these perms */ } __attribute__((packed));/*
fs/smb/client/cifsglob.h +4 -4
@@ -202,8 +202,8 @@ struct cifs_cred {int gid;int mode;int cecount; -struct cifs_sid osid; -struct cifs_sid gsid; +struct smb_sid osid; +struct smb_sid gsid;struct cifs_ntace *ntaces;struct cifs_ace *aces; };
@@ -231,8 +231,8 @@ struct cifs_open_info_data {unsigned int eas_len; } wsl;char *symlink_target; -struct cifs_sid posix_owner; -struct cifs_sid posix_group; +struct smb_sid posix_owner; +struct smb_sid posix_group;union {struct smb2_file_all_info fi;struct smb311_posix_qinfo posix_fi;
fs/smb/client/cifsproto.h +1 -1
@@ -223,7 +223,7 @@ extern int cifs_set_file_info(struct inode *inode, struct iattr *attrs,extern int cifs_rename_pending_delete (const char *full_path,struct dentry *dentry,const unsigned int xid); -extern int sid_to_id (struct cifs_sb_info *cifs_sb,struct cifs_sid *psid, +extern int sid_to_id (struct cifs_sb_info *cifs_sb,struct smb_sid *psid,struct cifs_fattr *fattr,uint sidtype); extern int cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, struct inode *inode,
fs/smb/client/smb2inode.c +2 -2
@@ -315,7 +315,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,SMB2_O_INFO_FILE ,0 ,sizeof (struct smb311_posix_qinfo *) + (PATH_MAX *2 ) + - (sizeof(struct cifs_sid) * 2), 0, NULL); + (sizeof(struct smb_sid) * 2), 0, NULL); }else { rc = SMB2_query_info_init(tcon, server, &rqst[num_rqst],
@@ -325,7 +325,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,SMB2_O_INFO_FILE ,0 ,sizeof (struct smb311_posix_qinfo *) + (PATH_MAX *2 ) + - (sizeof(struct cifs_sid) * 2), 0, NULL); + (sizeof(struct smb_sid) * 2), 0, NULL); }if (!rc && (!cfile || num_rqst >1 )) {smb2_set_next_command (tcon, &rqst[num_rqst]);
fs/smb/client/smb2pdu.c +1 -1
@@ -3915,7 +3915,7 @@ SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid, struct smb311_posix_qinfo *data, u32 *plen) { size_t output_len = sizeof(struct smb311_posix_qinfo *) + - (sizeof (struct cifs_sid ) *2 ) + (PATH_MAX *2 ); + (sizeof (struct smb_sid ) *2 ) + (PATH_MAX *2 ); *plen =0 ; return query_info(xid, tcon, persistent_fid, volatile_fid,
fs/smb/client/smb2pdu.h +4 -4
@@ -364,8 +364,8 @@ struct create_posix_rsp {u32 nlink;u32 reparse_tag;u32 mode; -struct cifs_sid owner;/* var-sized on the wire */ -struct cifs_sid group;/* var-sized on the wire */ +struct smb_sid owner;/* var-sized on the wire */ +struct smb_sid group;/* var-sized on the wire */ } __packed;#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
@@ -408,8 +408,8 @@ struct smb2_posix_info {struct smb2_posix_info_parsed {const struct smb2_posix_info *base;size_t size; -struct cifs_sid owner; -struct cifs_sid group; +struct smb_sid owner; +struct smb_sid group;int name_len;const u8 *name; };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 7/222 smb/client: rename cifs_acl to smb_acl
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChenXiaoSong <[email protected]>
[ Upstream commit 251b93ae73805b216e84ed2190b525f319da4c87 ]
Preparation for moving acl definitions to new common header file.
Use the following shell command to rename:
find fs/smb/client -type f -exec sed -i \
's/struct cifs_acl/struct smb_acl/g' {} +Stable-dep-of: d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX Extensions")
--- fs/smb/client/cifsacl.c | 34 +++++++++++++++++----------------- fs/smb/client/cifsacl.h | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-)
fs/smb/client/cifsacl.c +17 -17
@@ -758,7 +758,7 @@ static void dump_ace(struct cifs_ace *pace, char *end_of_acl) }#endif -static void parse_dacl (struct cifs_acl *pdacl,char *end_of_acl, +static void parse_dacl (struct smb_acl *pdacl,char *end_of_acl,struct smb_sid *pownersid,struct smb_sid *pgrpsid,struct cifs_fattr *fattr,bool mode_from_special_sid) {
@@ -793,7 +793,7 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, fattr->cf_mode &= ~(0777 ); acl_base = (char *)pdacl; - acl_size =sizeof (struct cifs_acl ); + acl_size =sizeof (struct smb_acl ); num_aces =le32_to_cpu (pdacl->num_aces);if (num_aces >0 ) {
@@ -1034,7 +1034,7 @@ static void populate_new_aces(char *nacl_base, *pnsize = nsize; } -static __u16 replace_sids_and_copy_aces (struct cifs_acl *pdacl,struct cifs_acl *pndacl, +static __u16 replace_sids_and_copy_aces (struct smb_acl *pdacl,struct smb_acl *pndacl,struct smb_sid *pownersid,struct smb_sid *pgrpsid,struct smb_sid *pnownersid,struct smb_sid *pngrpsid) {
@@ -1049,11 +1049,11 @@ static __u16 replace_sids_and_copy_aces(struct cifs_acl *pdacl, struct cifs_aclu16 ace_size =0 ; acl_base = (char *)pdacl; - size =sizeof (struct cifs_acl ); + size =sizeof (struct smb_acl ); src_num_aces =le32_to_cpu (pdacl->num_aces); nacl_base = (char *)pndacl; - nsize =sizeof (struct cifs_acl ); + nsize =sizeof (struct smb_acl );/* Go through all the ACEs */ for (i =0 ; i < src_num_aces; ++i) {
@@ -1074,7 +1074,7 @@ static __u16 replace_sids_and_copy_aces(struct cifs_acl *pdacl, struct cifs_aclreturn nsize; } -static int set_chmod_dacl (struct cifs_acl *pdacl,struct cifs_acl *pndacl, +static int set_chmod_dacl (struct smb_acl *pdacl,struct smb_acl *pndacl,struct smb_sid *pownersid,struct smb_sid *pgrpsid,__u64 *pnmode,bool mode_from_sid) {
@@ -1091,7 +1091,7 @@ static int set_chmod_dacl(struct cifs_acl *pdacl, struct cifs_acl *pndacl,/* Assuming that pndacl and pnmode are never NULL */ nacl_base = (char *)pndacl; - nsize =sizeof (struct cifs_acl ); + nsize =sizeof (struct smb_acl );/* If pdacl is NULL, we don't have a src. Simply populate new ACL. */ if (!pdacl) {
@@ -1103,7 +1103,7 @@ static int set_chmod_dacl(struct cifs_acl *pdacl, struct cifs_acl *pndacl, } acl_base = (char *)pdacl; - size =sizeof (struct cifs_acl ); + size =sizeof (struct smb_acl ); src_num_aces =le32_to_cpu (pdacl->num_aces);/* Retain old ACEs which we can retain */
@@ -1196,7 +1196,7 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb, {int rc =0 ;struct smb_sid *owner_sid_ptr, *group_sid_ptr; -struct cifs_acl *dacl_ptr;/* no need for SACL ptr */ +struct smb_acl *dacl_ptr;/* no need for SACL ptr */ char *end_of_acl = ((char *)pntsd) + acl_len;__u32 dacloffset;
@@ -1208,7 +1208,7 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb, group_sid_ptr = (struct smb_sid *)((char *)pntsd +le32_to_cpu (pntsd->gsidoffset)); dacloffset =le32_to_cpu (pntsd->dacloffset); - dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); + dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset); cifs_dbg(NOISY, "revision %d type 0x%x ooffset 0x%x goffset 0x%x sacloffset 0x%x dacloffset 0x%x\n", pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), le32_to_cpu(pntsd->gsidoffset),
@@ -1259,14 +1259,14 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd,__u32 sidsoffset;struct smb_sid *owner_sid_ptr, *group_sid_ptr;struct smb_sid *nowner_sid_ptr =NULL , *ngroup_sid_ptr =NULL ; -struct cifs_acl *dacl_ptr =NULL ;/* no need for SACL ptr */ -struct cifs_acl *ndacl_ptr =NULL ;/* no need for SACL ptr */ +struct smb_acl *dacl_ptr =NULL ;/* no need for SACL ptr */ +struct smb_acl *ndacl_ptr =NULL ;/* no need for SACL ptr */ char *end_of_acl = ((char *)pntsd) + secdesclen;u16 size =0 ; dacloffset =le32_to_cpu (pntsd->dacloffset);if (dacloffset) { - dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); + dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset);if (end_of_acl < (char *)dacl_ptr +le16_to_cpu (dacl_ptr->size)) {cifs_dbg (VFS ,"Server returned illegal ACL size\n" );return -EINVAL ;
@@ -1280,7 +1280,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd,if (pnmode && *pnmode !=NO_CHANGE_64 ) {/* chmod */ ndacloffset =sizeof (struct smb_ntsd ); - ndacl_ptr = (struct cifs_acl *)((char *)pnntsd + ndacloffset); + ndacl_ptr = (struct smb_acl *)((char *)pnntsd + ndacloffset); ndacl_ptr->revision = dacloffset ? dacl_ptr->revision :cpu_to_le16 (ACL_REVISION );
@@ -1298,7 +1298,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd, *aclflag |=CIFS_ACL_DACL ; }else { ndacloffset =sizeof (struct smb_ntsd ); - ndacl_ptr = (struct cifs_acl *)((char *)pnntsd + ndacloffset); + ndacl_ptr = (struct smb_acl *)((char *)pnntsd + ndacloffset); ndacl_ptr->revision = dacloffset ? dacl_ptr->revision :cpu_to_le16 (ACL_REVISION ); ndacl_ptr->num_aces = dacl_ptr ? dacl_ptr->num_aces :0 ;
@@ -1580,7 +1580,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,__u32 secdesclen =0 ;__u32 nsecdesclen =0 ;__u32 dacloffset =0 ; -struct cifs_acl *dacl_ptr =NULL ; +struct smb_acl *dacl_ptr =NULL ;struct smb_ntsd *pntsd =NULL ;/* acl obtained from server */ struct smb_ntsd *pnntsd =NULL ;/* modified acl to be sent to server */ struct cifs_sb_info *cifs_sb =CIFS_SB (inode->i_sb);
@@ -1633,7 +1633,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct smb_sid ) *2 ); dacloffset =le32_to_cpu (pntsd->dacloffset);if (dacloffset) { - dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); + dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset);if (mode_from_sid) nsecdesclen +=le32_to_cpu (dacl_ptr->num_aces) *sizeof (struct cifs_ace );
fs/smb/client/cifsacl.h +2 -2
@@ -34,7 +34,7 @@* owner, group and world). */ #define DEFAULT_SEC_DESC_LEN (sizeof(struct smb_ntsd) + \ - sizeof(struct cifs_acl) + \ + sizeof(struct smb_acl) + \ (sizeof(struct cifs_ace) * 4))/*
@@ -74,7 +74,7 @@ struct smb_sid {/* size of a struct smb_sid, sans sub_auth array */ #define CIFS_SID_BASE_SIZE (1 + 1 + NUM_AUTHS) -struct cifs_acl { +struct smb_acl {__le16 revision;/* revision level */ __le16 size;__le32 num_aces;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 8/222 smb/client: rename cifs_ace to smb_ace
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChenXiaoSong <[email protected]>
[ Upstream commit 09bedafc1e2c5c82aad3cbfe1359e2b0bf752f3a ]
Preparation for moving acl definitions to new common header file.
Use the following shell command to rename:
find fs/smb/client -type f -exec sed -i \
's/struct cifs_ace/struct smb_ace/g' {} +Stable-dep-of: d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX Extensions")
--- fs/smb/client/cifsacl.c | 62 +++++++++++++++++++-------------------- fs/smb/client/cifsacl.h | 4 +-- fs/smb/client/cifsglob.h | 2 +- fs/smb/client/cifsproto.h | 6 ++-- fs/smb/client/smb2pdu.c | 8 ++--- 5 files changed, 41 insertions(+), 41 deletions(-)
fs/smb/client/cifsacl.c +31 -31
@@ -666,7 +666,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use,return ; } -static __u16 cifs_copy_ace (struct cifs_ace *dst,struct cifs_ace *src,struct smb_sid *psid) +static __u16 cifs_copy_ace (struct smb_ace *dst,struct smb_ace *src,struct smb_sid *psid) {__u16 size =1 +1 +2 +4 ;
@@ -685,7 +685,7 @@ static __u16 cifs_copy_ace(struct cifs_ace *dst, struct cifs_ace *src, struct smreturn size; } -static __u16 fill_ace_for_sid (struct cifs_ace *pntace, +static __u16 fill_ace_for_sid (struct smb_ace *pntace,const struct smb_sid *psid,__u64 nmode,umode_t bits,__u8 access_type,bool allow_delete_child)
@@ -723,7 +723,7 @@ static __u16 fill_ace_for_sid(struct cifs_ace *pntace,#ifdef CONFIG_CIFS_DEBUG2 -static void dump_ace (struct cifs_ace *pace,char *end_of_acl) +static void dump_ace (struct smb_ace *pace,char *end_of_acl) {int num_subauth;
@@ -766,7 +766,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,int num_aces =0 ;int acl_size;char *acl_base; -struct cifs_ace **ppace; +struct smb_ace **ppace;/* BB need to add parm so we can store the SID BB */
@@ -799,15 +799,15 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,if (num_aces >0 ) {umode_t denied_mode =0 ; -if (num_aces >ULONG_MAX /sizeof (struct cifs_ace *)) +if (num_aces >ULONG_MAX /sizeof (struct smb_ace *))return ; - ppace =kmalloc_array (num_aces,sizeof (struct cifs_ace *), + ppace =kmalloc_array (num_aces,sizeof (struct smb_ace *),GFP_KERNEL );if (!ppace)return ;for (i =0 ; i < num_aces; ++i) { - ppace[i] = (struct cifs_ace *) (acl_base + acl_size); + ppace[i] = (struct smb_ace *) (acl_base + acl_size);#ifdef CONFIG_CIFS_DEBUG2 dump_ace (ppace[i], end_of_acl);#endif
@@ -849,7 +849,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,/* memcpy((void *)(&(cifscred->aces[i])), (void *)ppace[i], -sizeof(struct cifs_ace)); */ +sizeof(struct smb_ace)); */ acl_base = (char *)ppace[i]; acl_size =le16_to_cpu (ppace[i]->size);
@@ -861,7 +861,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,return ; } -unsigned int setup_authusers_ACE (struct cifs_ace *pntace) +unsigned int setup_authusers_ACE (struct smb_ace *pntace) {int i;unsigned int ace_size =20 ;
@@ -885,7 +885,7 @@ unsigned int setup_authusers_ACE(struct cifs_ace *pntace)* Fill in the special SID based on the mode. See * https://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */ -unsigned int setup_special_mode_ACE (struct cifs_ace *pntace,__u64 nmode) +unsigned int setup_special_mode_ACE (struct smb_ace *pntace,__u64 nmode) {int i;unsigned int ace_size =28 ;
@@ -907,7 +907,7 @@ unsigned int setup_special_mode_ACE(struct cifs_ace *pntace, __u64 nmode)return ace_size; } -unsigned int setup_special_user_owner_ACE (struct cifs_ace *pntace) +unsigned int setup_special_user_owner_ACE (struct smb_ace *pntace) {int i;unsigned int ace_size =28 ;
@@ -944,17 +944,17 @@ static void populate_new_aces(char *nacl_base,__u64 deny_user_mode =0 ;__u64 deny_group_mode =0 ;bool sticky_set = false; -struct cifs_ace *pnntace =NULL ; +struct smb_ace *pnntace =NULL ; nmode = *pnmode; num_aces = *pnum_aces; nsize = *pnsize;if (modefromsid) { - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=setup_special_mode_ACE (pnntace, nmode); num_aces++; - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=setup_authusers_ACE (pnntace); num_aces++; goto set_size;
@@ -992,7 +992,7 @@ static void populate_new_aces(char *nacl_base, sticky_set = true;if (deny_user_mode) { - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, pownersid, deny_user_mode,0700 ,ACCESS_DENIED , false); num_aces++;
@@ -1000,31 +1000,31 @@ static void populate_new_aces(char *nacl_base,/* Group DENY ACE does not conflict with owner ALLOW ACE. Keep in preferred order*/ if (deny_group_mode && !(deny_group_mode & (user_mode >>3 ))) { - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, pgrpsid, deny_group_mode,0070 ,ACCESS_DENIED , false); num_aces++; } - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, pownersid, user_mode,0700 ,ACCESS_ALLOWED , true); num_aces++;/* Group DENY ACE conflicts with owner ALLOW ACE. So keep it after. */ if (deny_group_mode && (deny_group_mode & (user_mode >>3 ))) { - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, pgrpsid, deny_group_mode,0070 ,ACCESS_DENIED , false); num_aces++; } - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, pgrpsid, group_mode,0070 ,ACCESS_ALLOWED , !sticky_set); num_aces++; - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=fill_ace_for_sid (pnntace, &sid_everyone, other_mode,0007 ,ACCESS_ALLOWED , !sticky_set); num_aces++;
@@ -1040,11 +1040,11 @@ static __u16 replace_sids_and_copy_aces(struct smb_acl *pdacl, struct smb_acl *p {int i;u16 size =0 ; -struct cifs_ace *pntace =NULL ; +struct smb_ace *pntace =NULL ;char *acl_base =NULL ;u32 src_num_aces =0 ;u16 nsize =0 ; -struct cifs_ace *pnntace =NULL ; +struct smb_ace *pnntace =NULL ;char *nacl_base =NULL ;u16 ace_size =0 ;
@@ -1057,8 +1057,8 @@ static __u16 replace_sids_and_copy_aces(struct smb_acl *pdacl, struct smb_acl *p/* Go through all the ACEs */ for (i =0 ; i < src_num_aces; ++i) { - pntace = (struct cifs_ace *) (acl_base + size); - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pntace = (struct smb_ace *) (acl_base + size); + pnntace = (struct smb_ace *) (nacl_base + nsize);if (pnownersid &&compare_sids (&pntace->sid, pownersid) ==0 ) ace_size =cifs_copy_ace (pnntace, pntace, pnownersid);
@@ -1080,11 +1080,11 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl, {int i;u16 size =0 ; -struct cifs_ace *pntace =NULL ; +struct smb_ace *pntace =NULL ;char *acl_base =NULL ;u32 src_num_aces =0 ;u16 nsize =0 ; -struct cifs_ace *pnntace =NULL ; +struct smb_ace *pnntace =NULL ;char *nacl_base =NULL ;u32 num_aces =0 ;bool new_aces_set = false;
@@ -1108,7 +1108,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,/* Retain old ACEs which we can retain */ for (i =0 ; i < src_num_aces; ++i) { - pntace = (struct cifs_ace *) (acl_base + size); + pntace = (struct smb_ace *) (acl_base + size);if (!new_aces_set && (pntace->flags &INHERITED_ACE )) {/* Place the new ACEs in between existing explicit and inherited */
@@ -1130,7 +1130,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl, }/* update the pointer to the next ACE to populate*/ - pnntace = (struct cifs_ace *) (nacl_base + nsize); + pnntace = (struct smb_ace *) (nacl_base + nsize); nsize +=cifs_copy_ace (pnntace, pntace,NULL ); num_aces++;
@@ -1625,9 +1625,9 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, nsecdesclen = secdesclen;if (pnmode && *pnmode !=NO_CHANGE_64 ) {/* chmod */ if (mode_from_sid) - nsecdesclen +=2 *sizeof (struct cifs_ace ); + nsecdesclen +=2 *sizeof (struct smb_ace );else /* cifsacl */ - nsecdesclen +=5 *sizeof (struct cifs_ace ); + nsecdesclen +=5 *sizeof (struct smb_ace ); }else {/* chown */ /* When ownership changes, changes new owner sid length could be different */ nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct smb_sid ) *2 );
@@ -1636,7 +1636,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset);if (mode_from_sid) nsecdesclen += -le32_to_cpu (dacl_ptr->num_aces) *sizeof (struct cifs_ace ); +le32_to_cpu (dacl_ptr->num_aces) *sizeof (struct smb_ace );else /* cifsacl */ nsecdesclen +=le16_to_cpu (dacl_ptr->size); }
fs/smb/client/cifsacl.h +2 -2
@@ -35,7 +35,7 @@*/ #define DEFAULT_SEC_DESC_LEN (sizeof(struct smb_ntsd) + \ sizeof(struct smb_acl) + \ - (sizeof(struct cifs_ace) * 4)) + (sizeof(struct smb_ace) * 4))/* * Maximum size of a string representation of a SID:
@@ -111,7 +111,7 @@ struct smb_acl {#define SUCCESSFUL_ACCESS_ACE_FLAG 0x40#define FAILED_ACCESS_ACE_FLAG 0x80 -struct cifs_ace { +struct smb_ace {__u8 type;/* see above and MS-DTYP 2.4.4.1 */ __u8 flags;__le16 size;
fs/smb/client/cifsglob.h +1 -1
@@ -205,7 +205,7 @@ struct cifs_cred {struct smb_sid osid;struct smb_sid gsid;struct cifs_ntace *ntaces; -struct cifs_ace *aces; +struct smb_ace *aces; };struct cifs_open_info_data {
fs/smb/client/cifsproto.h +3 -3
@@ -241,9 +241,9 @@ extern int cifs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, struct posix_acl *acl, int type);extern int set_cifs_acl (struct smb_ntsd *pntsd,__u32 len,struct inode *ino,const char *path,int flag); -extern unsigned int setup_authusers_ACE (struct cifs_ace *pace); -extern unsigned int setup_special_mode_ACE (struct cifs_ace *pace,__u64 nmode); -extern unsigned int setup_special_user_owner_ACE (struct cifs_ace *pace); +extern unsigned int setup_authusers_ACE (struct smb_ace *pace); +extern unsigned int setup_special_mode_ACE (struct smb_ace *pace,__u64 nmode); +extern unsigned int setup_special_user_owner_ACE (struct smb_ace *pace);extern void dequeue_mid (struct mid_q_entry *mid,bool malformed); extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
fs/smb/client/smb2pdu.c +4 -4
@@ -2623,7 +2623,7 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len)unsigned int group_offset =0 ;struct smb3_acl acl = {}; - *len =round_up (sizeof (struct crt_sd_ctxt ) + (sizeof (struct cifs_ace ) *4 ),8 ); + *len =round_up (sizeof (struct crt_sd_ctxt ) + (sizeof (struct smb_ace ) *4 ),8 );if (set_owner) {/* sizeof(struct owner_group_sids) is already multiple of 8 so no need to round */
@@ -2672,21 +2672,21 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len) ptr +=sizeof (struct smb3_acl );/* create one ACE to hold the mode embedded in reserved special SID */ - acelen =setup_special_mode_ACE ((struct cifs_ace *)ptr, (__u64 )mode); + acelen =setup_special_mode_ACE ((struct smb_ace *)ptr, (__u64 )mode); ptr += acelen; acl_size = acelen +sizeof (struct smb3_acl ); ace_count =1 ;if (set_owner) {/* we do not need to reallocate buffer to add the two more ACEs. plenty of space */ - acelen =setup_special_user_owner_ACE ((struct cifs_ace *)ptr); + acelen =setup_special_user_owner_ACE ((struct smb_ace *)ptr); ptr += acelen; acl_size += acelen; ace_count +=1 ; }/* and one more ACE to allow access for authenticated users */ - acelen =setup_authusers_ACE ((struct cifs_ace *)ptr); + acelen =setup_authusers_ACE ((struct smb_ace *)ptr); ptr += acelen; acl_size += acelen; ace_count +=1 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 9/222 fs/smb/client: implement chmod() for SMB3 POSIX Extensions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ralph Boehme <[email protected]>
[ Upstream commit d413eabff18d640031fc955d107ad9c03c3bf9f1 ]
The NT ACL format for an SMB3 POSIX Extensions chmod() is a single ACE with the magic S-1-5-88-3-mode SID:
NT Security Descriptor
Revision: 1
Type: 0x8004, Self Relative, DACL Present
Offset to owner SID: 56
Offset to group SID: 124
Offset to SACL: 0
Offset to DACL: 20
Owner: S-1-5-21-3177838999-3893657415-1037673384-1000
Group: S-1-22-2-1000
NT User (DACL) ACL
Revision: NT4 (2)
Size: 36
Num ACEs: 1
NT ACE: S-1-5-88-3-438, flags 0x00, Access Allowed, mask 0x00000000
Type: Access Allowed
NT ACE Flags: 0x00
Size: 28
Access required: 0x00000000
SID: S-1-5-88-3-438Owner and Group should be NULL, but the server is not required to fail the request if they are present.
--- fs/smb/client/cifsacl.c | 50 +++++++++++++++++++++++---------------- fs/smb/client/cifsproto.h | 4 +++- fs/smb/client/inode.c | 4 +++- fs/smb/client/smb2pdu.c | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-)
fs/smb/client/cifsacl.c +30 -20
@@ -885,12 +885,17 @@ unsigned int setup_authusers_ACE(struct smb_ace *pntace)* Fill in the special SID based on the mode. See * https://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */ -unsigned int setup_special_mode_ACE (struct smb_ace *pntace,__u64 nmode) +unsigned int setup_special_mode_ACE (struct smb_ace *pntace, +bool posix, +__u64 nmode) {int i;unsigned int ace_size =28 ; - pntace->type =ACCESS_DENIED_ACE_TYPE ; +if (posix) + pntace->type =ACCESS_ALLOWED_ACE_TYPE ; +else + pntace->type =ACCESS_DENIED_ACE_TYPE ; pntace->flags =0x0 ; pntace->access_req =0 ; pntace->sid.num_subauth =3 ;
@@ -933,7 +938,8 @@ static void populate_new_aces(char *nacl_base,struct smb_sid *pownersid, struct smb_sid *pgrpsid, __u64 *pnmode, u32 *pnum_aces, u16 *pnsize, - bool modefromsid) + bool modefromsid, + bool posix) { __u64 nmode;u32 num_aces =0 ;
@@ -950,13 +956,15 @@ static void populate_new_aces(char *nacl_base, num_aces = *pnum_aces; nsize = *pnsize; -if (modefromsid) { - pnntace = (struct smb_ace *) (nacl_base + nsize); - nsize +=setup_special_mode_ACE (pnntace, nmode); - num_aces++; +if (modefromsid || posix) { pnntace = (struct smb_ace *) (nacl_base + nsize); - nsize +=setup_authusers_ACE (pnntace); + nsize +=setup_special_mode_ACE (pnntace, posix, nmode); num_aces++; +if (modefromsid) { + pnntace = (struct smb_ace *) (nacl_base + nsize); + nsize +=setup_authusers_ACE (pnntace); + num_aces++; + } goto set_size; }
@@ -1076,7 +1084,7 @@ static __u16 replace_sids_and_copy_aces(struct smb_acl *pdacl, struct smb_acl *pstatic int set_chmod_dacl (struct smb_acl *pdacl,struct smb_acl *pndacl,struct smb_sid *pownersid,struct smb_sid *pgrpsid, -__u64 *pnmode,bool mode_from_sid) +__u64 *pnmode,bool mode_from_sid,bool posix) {int i;u16 size =0 ;
@@ -1094,11 +1102,11 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl, nsize =sizeof (struct smb_acl );/* If pdacl is NULL, we don't have a src. Simply populate new ACL. */ -if (!pdacl) { +if (!pdacl || posix) {populate_new_aces (nacl_base, pownersid, pgrpsid, pnmode, &num_aces, &nsize, - mode_from_sid); + mode_from_sid, posix); goto finalize_dacl; }
@@ -1115,7 +1123,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,populate_new_aces (nacl_base, pownersid, pgrpsid, pnmode, &num_aces, &nsize, - mode_from_sid); + mode_from_sid, posix); new_aces_set = true; }
@@ -1144,7 +1152,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,populate_new_aces (nacl_base, pownersid, pgrpsid, pnmode, &num_aces, &nsize, - mode_from_sid); + mode_from_sid, posix); new_aces_set = true; }
@@ -1251,7 +1259,7 @@ static int parse_sec_desc(struct cifs_sb_info *cifs_sb,/* Convert permission bits from mode to equivalent CIFS ACL */ static int build_sec_desc (struct smb_ntsd *pntsd,struct smb_ntsd *pnntsd,__u32 secdesclen,__u32 *pnsecdesclen,__u64 *pnmode,kuid_t uid,kgid_t gid, -bool mode_from_sid,bool id_from_sid,int *aclflag) +bool mode_from_sid,bool id_from_sid,bool posix,int *aclflag) {int rc =0 ;__u32 dacloffset;
@@ -1288,7 +1296,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd, ndacl_ptr->num_aces =cpu_to_le32 (0 ); rc =set_chmod_dacl (dacl_ptr, ndacl_ptr, owner_sid_ptr, group_sid_ptr, - pnmode, mode_from_sid); + pnmode, mode_from_sid, posix); sidsoffset = ndacloffset +le16_to_cpu (ndacl_ptr->size);/* copy the non-dacl portion of secdesc */
@@ -1587,6 +1595,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,struct tcon_link *tlink =cifs_sb_tlink (cifs_sb);struct smb_version_operations *ops;bool mode_from_sid, id_from_sid; +bool posix =tlink_tcon (tlink)->posix_extensions;const u32 info =0 ;if (IS_ERR (tlink))
@@ -1622,12 +1631,13 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, id_from_sid = false;/* Potentially, five new ACEs can be added to the ACL for U,G,O mapping */ - nsecdesclen = secdesclen;if (pnmode && *pnmode !=NO_CHANGE_64 ) {/* chmod */ -if (mode_from_sid) - nsecdesclen +=2 *sizeof (struct smb_ace ); +if (posix) + nsecdesclen =1 *sizeof (struct smb_ace ); +else if (mode_from_sid) + nsecdesclen = secdesclen + (2 *sizeof (struct smb_ace ));else /* cifsacl */ - nsecdesclen +=5 *sizeof (struct smb_ace ); + nsecdesclen = secdesclen + (5 *sizeof (struct smb_ace )); }else {/* chown */ /* When ownership changes, changes new owner sid length could be different */ nsecdesclen =sizeof (struct smb_ntsd ) + (sizeof (struct smb_sid ) *2 );
@@ -1657,7 +1667,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, } rc =build_sec_desc (pntsd, pnntsd, secdesclen, &nsecdesclen, pnmode, uid, gid, - mode_from_sid, id_from_sid, &aclflag); + mode_from_sid, id_from_sid, posix, &aclflag);cifs_dbg (NOISY ,"build_sec_desc rc: %d\n" , rc);
fs/smb/client/cifsproto.h +3 -1
@@ -242,7 +242,9 @@ extern int cifs_set_acl(struct mnt_idmap *idmap,extern int set_cifs_acl (struct smb_ntsd *pntsd,__u32 len,struct inode *ino,const char *path,int flag);extern unsigned int setup_authusers_ACE (struct smb_ace *pace); -extern unsigned int setup_special_mode_ACE (struct smb_ace *pace,__u64 nmode); +extern unsigned int setup_special_mode_ACE (struct smb_ace *pace, +bool posix, +__u64 nmode);extern unsigned int setup_special_user_owner_ACE (struct smb_ace *pace);extern void dequeue_mid (struct mid_q_entry *mid,bool malformed);
fs/smb/client/inode.c +3 -1
@@ -3087,6 +3087,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)int rc = -EACCES ;__u32 dosattr =0 ;__u64 mode =NO_CHANGE_64 ; +bool posix =cifs_sb_master_tcon (cifs_sb)->posix_extensions; xid =get_xid ();
@@ -3177,7 +3178,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) mode = attrs->ia_mode; rc =0 ;if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_CIFS_ACL ) || - (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MODE_FROM_SID )) { + (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MODE_FROM_SID ) || + posix) { rc =id_mode_to_cifs_acl (inode, full_path, &mode,INVALID_UID ,INVALID_GID );if (rc) {
fs/smb/client/smb2pdu.c +1 -1
@@ -2672,7 +2672,7 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len) ptr +=sizeof (struct smb3_acl );/* create one ACE to hold the mode embedded in reserved special SID */ - acelen =setup_special_mode_ACE ((struct smb_ace *)ptr, (__u64 )mode); + acelen =setup_special_mode_ACE ((struct smb_ace *)ptr, false, (__u64 )mode); ptr += acelen; acl_size = acelen +sizeof (struct smb3_acl ); ace_count =1 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 10/222 smb: client: stop flooding dmesg in smb2_calc_signature()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit a13ca780afab350f37f8be9eda2bf79d1aed9bdd ]
When having several mounts that share same credential and the client couldn't re-establish an SMB session due to an expired kerberos ticket or rotated password, smb2_calc_signature() will end up flooding dmesg when not finding SMB sessions to calculate signatures.
Stable-dep-of: 343d7fe6df9e ("smb: client: fix use-after-free of signing key")
--- fs/smb/client/smb2transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/smb2transport.c +1 -1
@@ -242,7 +242,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, ses =smb2_find_smb_ses (server,le64_to_cpu (shdr->SessionId));if (unlikely (!ses)) { -cifs_server_dbg (VFS ,"%s: Could not find session\n" , __func__); +cifs_server_dbg (FYI ,"%s: Could not find session\n" , __func__);return -ENOENT ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 11/222 smb: client: fix use-after-free of signing key
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit 343d7fe6df9e247671440a932b6a73af4fa86d95 ]
Customers have reported use-after-free in @ses->auth_key.response with SMB2.1 + sign mounts which occurs due to following race:
task A task Bcifs_mount()
dfs_mount_share()
get_session()
cifs_mount_get_session() cifs_send_recv()
cifs_get_smb_ses() compound_send_recv()
cifs_setup_session() smb2_setup_request()
kfree_sensitive() smb2_calc_signature()
crypto_shash_setkey() *UAF*
Fix this by ensuring that we have a valid @ses->auth_key.response by checking whether @ses->ses_status is SES_GOOD or SES_EXITING with @ses->ses_lock held. After commit 24a9799aa8ef ("smb: client: fix UAF in smb2_reconnect_server()"), we made sure to call ->logoff() only when @ses was known to be good (e.g. valid ->auth_key.response), so it's safe to access signing key when @ses->ses_status == SES_EXITING.
--- fs/smb/client/smb2proto.h | 2 -- fs/smb/client/smb2transport.c | 56 +++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 18 deletions(-)
fs/smb/client/smb2proto.h +0 -2
@@ -37,8 +37,6 @@ extern struct mid_q_entry *smb2_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst);extern struct mid_q_entry *smb2_setup_async_request (struct TCP_Server_Info *server,struct smb_rqst *rqst); -extern struct cifs_ses *smb2_find_smb_ses (struct TCP_Server_Info *server, -__u64 ses_id);extern struct cifs_tcon *smb2_find_smb_tcon (struct TCP_Server_Info *server,__u64 ses_id,__u32 tid); extern int smb2_calc_signature(struct smb_rqst *rqst,
fs/smb/client/smb2transport.c +40 -16
100 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 12/222 usb: dwc3: gadget: Add missing check for single port RAM in TxFIFO resizing logic
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvarasu Ganesan <[email protected]>
[ Upstream commit 61eb055cd3048ee01ca43d1be924167d33e16fdc ]
The existing implementation of the TxFIFO resizing logic only supports scenarios where more than one port RAM is used. However, there is a need to resize the TxFIFO in USB2.0-only mode where only a single port RAM is available. This commit introduces the necessary changes to support TxFIFO resizing in such scenarios by adding a missing check for single port RAM.
This fix addresses certain platform configurations where the existing TxFIFO resizing logic does not work properly due to the absence of support for single port RAM. By adding this missing check, we ensure that the TxFIFO resizing logic works correctly in all scenarios, including those with a single port RAM.
--- drivers/usb/dwc3/core.h | 4 +++ drivers/usb/dwc3/gadget.c | 54 +++++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 8 deletions(-)
drivers/usb/dwc3/core.h +4 -0
@@ -899,6 +899,7 @@ struct dwc3_hwparams {#define DWC3_MODE (n) ((n) & 0x7)/* HWPARAMS1 */ +#define DWC3_SPRAM_TYPE (n) (((n) >> 23) & 1)#define DWC3_NUM_INT (n) (((n) & (0x3f << 15)) >> 15)/* HWPARAMS3 */
@@ -909,6 +910,9 @@ struct dwc3_hwparams {#define DWC3_NUM_IN_EPS (p) (((p)->hwparams3 & \ (DWC3_NUM_IN_EPS_MASK)) >> 18) +/* HWPARAMS6 */ +#define DWC3_RAM0_DEPTH (n) (((n) & (0xffff0000)) >> 16) +/* HWPARAMS7 */ #define DWC3_RAM1_DEPTH (n) ((n) & 0xffff)
drivers/usb/dwc3/gadget.c +46 -8
97 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 13/222 sched: Initialize idle tasks only once
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
[ Upstream commit b23decf8ac9102fc52c4de5196f4dc0a5f3eb80b ]
Idle tasks are initialized via __sched_fork() twice:
fork_idle()
copy_process()
sched_fork()
__sched_fork()
init_idle()
__sched_fork()Instead of cleaning this up, sched_ext hacked around it. Even when analyis and solution were provided in a discussion, nobody cared to clean this up.
init_idle() is also invoked from sched_init() to initialize the boot CPU's idle task, which requires the __sched_fork() invocation. But this can be trivially solved by invoking __sched_fork() before init_idle() in sched_init() and removing the __sched_fork() invocation from init_idle().
Do so and clean up the comments explaining this historical leftover.
--- kernel/sched/core.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
kernel/sched/core.c +5 -7
@@ -4488,7 +4488,8 @@ int wake_up_state(struct task_struct *p, unsigned int state)* Perform scheduler related setup for a newly forked process p. * p is forked by current. * -* __sched_fork() is basic setup used by init_idle() too: +* __sched_fork() is basic setup which is also used by sched_init() to +* initialize the boot CPU's idle task. */ static void __sched_fork (unsigned long clone_flags,struct task_struct *p) {
@@ -9257,8 +9258,6 @@ void __init init_idle(struct task_struct *idle, int cpu)struct rq *rq =cpu_rq (cpu);unsigned long flags; -__sched_fork (0 , idle); -raw_spin_lock_irqsave (&idle->pi_lock, flags);raw_spin_rq_lock (rq);
@@ -9273,10 +9272,8 @@ void __init init_idle(struct task_struct *idle, int cpu)#ifdef CONFIG_SMP /* -* It's possible that init_idle() gets called multiple times on a task, -* in that case do_set_cpus_allowed() will not do the right thing. -* -* And since this is boot we can forgo the serialization. +* No validation and serialization required at boot time and for +* setting up the idle tasks of not yet online CPUs. */ set_cpus_allowed_common (idle, &ac);#endif
@@ -10105,6 +10102,7 @@ void __init sched_init(void)* but because we are the idle thread, we just pick up running again * when this runqueue becomes "idle". */ +__sched_fork (0 , current);init_idle (current,smp_processor_id ()); calc_load_update = jiffies +LOAD_FREQ ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 14/222 drm/radeon: Delay Connector detecting when HPD singals is unstable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shixiong Ou <[email protected]>
[ Upstream commit 949658cb9b69ab9d22a42a662b2fdc7085689ed8 ]
In some causes, HPD signals will jitter when plugging in or unplugging HDMI.
Rescheduling the hotplug work for a second when EDID may still be readable but HDP is disconnected, and fixes this issue.
Stable-dep-of: 979bfe291b5b ("Revert "drm/radeon: Delay Connector detecting when HPD singals is unstable"")
--- drivers/gpu/drm/radeon/radeon_connectors.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/radeon/radeon_connectors.c +10 -0
@@ -1267,6 +1267,16 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) goto exit; } } + +if (dret && radeon_connector->hpd.hpd !=RADEON_HPD_NONE && + !radeon_hpd_sense (rdev, radeon_connector->hpd.hpd) && + connector->connector_type ==DRM_MODE_CONNECTOR_HDMIA ) { +DRM_DEBUG_KMS ("EDID is readable when HPD disconnected\n" ); +schedule_delayed_work (&rdev->hotplug_work,msecs_to_jiffies (1000 )); + ret = connector_status_disconnected; + goto exit; + } +if (dret) { radeon_connector->detected_by_load = false;radeon_connector_free_edid (connector);
Signature · 1 line
2.39.5
RE: [PATCH 6.6 014/222] drm/radeon: Delay Connector detecting when HPD singals is unstable
[Public]
Quoted 20 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Monday, January 6, 2025 10:14 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Shixiong Ou <[email protected]>; Deucher, Alexander <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 014/222] drm/radeon: Delay Connector detecting when HPD singals is unstable6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shixiong Ou <[email protected]>
[ Upstream commit
949658cb9b69ab9d22a42a662b2fdc7085689ed8]In some causes, HPD signals will jitter when plugging in or unplugging HDMI.
Quoted 7 lines
Rescheduling the hotplug work for a second when EDID may still be readable but HDP is disconnected, and fixes this issue.
Signed-off-by Shixiong Ou <[email protected]>Signed-off-by Alex Deucher <[email protected]>Stable-dep-of:
979bfe291b5b("Revert "drm/radeon: Delay Connector detecting when HPD singals is unstable"")
Please drop both of these patches. There is no need to pull back a patch just so that you can apply the revert.
Thanks,
Alex
Quoted 34 lines
Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/radeon/radeon_connectors.c | 10 ++++++++++ 1 file changed, 10 insertions(+)drivers/gpu/drm/radeon/radeon_connectors.c +10
-0@@ -1267,6 +1267,16 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) goto exit; } } + +if (dret && radeon_connector->hpd.hpd !=RADEON_HPD_NONE && + !radeon_hpd_sense (rdev, radeon_connector->hpd.hpd) && + connector->connector_type ==DRM_MODE_CONNECTOR_HDMIA ) { +DRM_DEBUG_KMS ("EDID is readable when HPD disconnected\n"); +schedule_delayed_work (&rdev->hotplug_work,msecs_to_jiffies (1000 )); + ret = connector_status_disconnected; + goto exit; + } +if (dret) { radeon_connector->detected_by_load = false; radeon_connector_free_edid(connector);--
2.39.5
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 014/222] drm/radeon: Delay Connector detecting when HPD singals is unstable
Quoted 25 lines · Alexander
[Public]
Quoted 23 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Monday, January 6, 2025 10:14 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Shixiong Ou <[email protected]>; Deucher, Alexander <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 014/222] drm/radeon: Delay Connector detecting when HPD singals is unstable6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shixiong Ou <[email protected]>
[ Upstream commit
949658cb9b69ab9d22a42a662b2fdc7085689ed8]In some causes, HPD signals will jitter when plugging in or unplugging HDMI.
Rescheduling the hotplug work for a second when EDID may still be readable but HDP is disconnected, and fixes this issue.
Quoted 6 lines
Quoted 4 lines
Signed-off-by Shixiong Ou <[email protected]>Signed-off-by Alex Deucher <[email protected]>Stable-dep-of:
979bfe291b5b("Revert "drm/radeon: Delay Connector detecting when HPD singals is unstable"")Please drop both of these patches. There is no need to pull back a patch just so that you can apply the revert.
Good point, both now dropped, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 15/222 Revert "drm/radeon: Delay Connector detecting when HPD singals is unstable"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 979bfe291b5b30a9132c2fd433247e677b24c6aa ]
This reverts commit 949658cb9b69ab9d22a42a662b2fdc7085689ed8.
This causes a blank screen on boot.
--- drivers/gpu/drm/radeon/radeon_connectors.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/gpu/drm/radeon/radeon_connectors.c +0 -10
@@ -1267,16 +1267,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) goto exit; } } - -if (dret && radeon_connector->hpd.hpd !=RADEON_HPD_NONE && - !radeon_hpd_sense (rdev, radeon_connector->hpd.hpd) && - connector->connector_type ==DRM_MODE_CONNECTOR_HDMIA ) { -DRM_DEBUG_KMS ("EDID is readable when HPD disconnected\n" ); -schedule_delayed_work (&rdev->hotplug_work,msecs_to_jiffies (1000 )); - ret = connector_status_disconnected; - goto exit; - } -if (dret) { radeon_connector->detected_by_load = false;radeon_connector_free_edid (connector);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 16/222 rust: relax most deny-level lints to warnings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
[ Upstream commit f8f88aa25a03ce1e0fc8a9842840988b870f0c37 ]
Since we are starting to support several Rust toolchains, lints (including Clippy ones) now may behave differently and lint groups may include new lints.
Therefore, to maximize the chances a given version works, relax some deny-level lints to warnings. It may also make our lives a bit easier while developing new code or refactoring.
To be clear, the requirements for in-tree code are still the same, since Rust code still needs to be warning-free (patches should be clean under WERROR=y) and the set of lints is not changed.
unsafe_op_in_unsafe_fn is left unmodified, i.e. as an error, since it is becoming the default in the language (warn-by-default in Rust 2024 [1] and ideally an error later on) and thus it should also be very well tested. In addition, it is simple enough that it should not have false positives (unlike e.g. rust_2018_idioms's explicit_outlives_requirements).
non_ascii_idents is left unmodified as well, i.e. as an error, since it is unlikely one gains any productivity during development if it were a warning (in fact, it may be worse, since it is likely one made a typo). In addition, it should not have false positives.
Finally, put the two -D ones at the top and take the chance to do one per line.
Stable-dep-of: 60fc1e675013 ("rust: allow clippy::needless_lifetimes")
--- Makefile | 24 +++++++++++++----------- rust/Makefile | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-)
Makefile +13 -11
@@ -457,17 +457,19 @@ KBUILD_USERLDFLAGS := $(USERLDFLAGS) # host programs. export rust_common_flags := --edition=2021 \ -Zbinary_dep_depinfo=y \ - -Dunsafe_op_in_unsafe_fn -Drust_2018_idioms \ - -Dunreachable_pub -Dnon_ascii_idents \ + -Dunsafe_op_in_unsafe_fn \ + -Dnon_ascii_idents \ + -Wrust_2018_idioms \ + -Wunreachable_pub \ -Wmissing_docs \ - -Drustdoc::missing_crate_level_docs \ - -Dclippy::correctness -Dclippy::style \ - -Dclippy::suspicious -Dclippy::complexity \ - -Dclippy::perf \ - -Dclippy::let_unit_value -Dclippy::mut_mut \ - -Dclippy::needless_bitwise_bool \ - -Dclippy::needless_continue \ - -Dclippy::no_mangle_with_rust_abi \ + -Wrustdoc::missing_crate_level_docs \ + -Wclippy::correctness -Wclippy::style \ + -Wclippy::suspicious -Wclippy::complexity \ + -Wclippy::perf \ + -Wclippy::let_unit_value -Wclippy::mut_mut \ + -Wclippy::needless_bitwise_bool \ + -Wclippy::needless_continue \ + -Wclippy::no_mangle_with_rust_abi \ -Wclippy::dbg_macro KBUILD_HOSTCFLAGS := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
@@ -572,7 +574,7 @@ KBUILD_RUSTFLAGS := $(rust_common_flags) \ -Csymbol-mangling-version=v0 \ -Crelocation-model=static \ -Zfunction-sections=n \ - -Dclippy::float_arithmetic + -Wclippy::float_arithmetic KBUILD_AFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL :=
rust/Makefile +2 -2
@@ -422,7 +422,7 @@ ifneq ($(or $(CONFIG_ARM64),$(and $(CONFIG_RISCV),$(CONFIG_64BIT))),) endif $(obj)/core.o: private skip_clippy = 1 -$(obj)/core.o: private skip_flags = -Dunreachable_pub +$(obj)/core.o: private skip_flags = -Wunreachable_pub $(obj)/core.o: private rustc_objcopy = $(foreach sym,$(redirect-intrinsics),--redefine-sym $(sym)=__rust$(sym)) $(obj)/core.o: private rustc_target_flags = $(core-cfgs) $(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs scripts/target.json FORCE
@@ -433,7 +433,7 @@ $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE $(call if_changed_dep,rustc_library) $(obj)/alloc.o: private skip_clippy = 1 -$(obj)/alloc.o: private skip_flags = -Dunreachable_pub +$(obj)/alloc.o: private skip_flags = -Wunreachable_pub $(obj)/alloc.o: private rustc_target_flags = $(alloc-cfgs) $(obj)/alloc.o: $(src)/alloc/lib.rs $(obj)/compiler_builtins.o FORCE $(call if_changed_dep,rustc_library)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 17/222 rust: allow `clippy::needless_lifetimes`
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
[ Upstream commit 60fc1e6750133620e404d40b93df5afe32e3e6c6 ]
In beta Clippy (i.e. Rust 1.83.0), the needless_lifetimes lint has been extended [1] to suggest eliding impl lifetimes, e.g.
error: the following explicit lifetimes could be elided: 'a
--> rust/kernel/list.rs:647:6
|
647 | impl<'a, T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'a, T, ID> {}
| ^^ ^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
= note: `-D clippy::needless-lifetimes` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_lifetimes)]`
help: elide the lifetimes
|
647 - impl<'a, T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'a, T, ID> {}
647 + impl<T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'_, T, ID> {}A possibility would have been to clean them -- the RFC patch [2] did this, while asking if we wanted these cleanups. There is an open issue
[3] in Clippy about being able to differentiate some of the new cases, e.g. those that do not involve introducing '_. Thus it seems others feel similarly.
Thus, for the time being, we decided to allow the lint.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -469,6 +469,7 @@ export rust_common_flags := --edition=2021 \ -Wclippy::let_unit_value -Wclippy::mut_mut \ -Wclippy::needless_bitwise_bool \ -Wclippy::needless_continue \ + -Aclippy::needless_lifetimes \ -Wclippy::no_mangle_with_rust_abi \ -Wclippy::dbg_macro
Signature · 1 line
2.39.5
Re: [PATCH 6.6 017/222] rust: allow `clippy::needless_lifetimes`
Quoted 2 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
This should not be needed (because in 6.6.y the Rust version is pinned, unlike in 6.12.y), so both Rust-related commits can be dropped, but they should not hurt either (built-tested).
See https://lore.kernel.org/stable/CANiq72k9A-adJy8uzog_NdrrfLh6+EgHY0kqPcA5Y45Hod+OkQ@mail.gmail.com/
Thanks!
Cheers,
Miguel
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 017/222] rust: allow `clippy::needless_lifetimes`
Quoted 10 lines · Miguel Ojeda
Quoted 2 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
This should not be needed (because in 6.6.y the Rust version is pinned, unlike in 6.12.y), so both Rust-related commits can be dropped, but they should not hurt either (built-tested).
See https://lore.kernel.org/stable/CANiq72k9A-adJy8uzog_NdrrfLh6+EgHY0kqPcA5Y45Hod+OkQ@mail.gmail.com/
Now dropped, thanks!
greg k-h
Greg Kroah-Hartman
maintainerPATCH 18/222 NUMA: optimize detection of memory with no node id assigned by firmware
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liam Ni <[email protected]>
[ Upstream commit ff6c3d81f2e86b63a3a530683f89ef393882782a ]
Sanity check that makes sure the nodes cover all memory loops over numa_meminfo to count the pages that have node id assigned by the firmware, then loops again over memblock.memory to find the total amount of memory and in the end checks that the difference between the total memory and memory that covered by nodes is less than some threshold. Worse, the loop over numa_meminfo calls __absent_pages_in_range() that also partially traverses memblock.memory.
It's much simpler and more efficient to have a single traversal of memblock.memory that verifies that amount of memory not covered by nodes is less than a threshold.
Introduce memblock_validate_numa_coverage() that does exactly that and use it instead of numa_meminfo_cover_memory().
Stable-dep-of: 9cdc6423acb4 ("memblock: allow zero threshold in validate_numa_converage()")
--- arch/loongarch/kernel/numa.c | 28 +--------------------------- arch/x86/mm/numa.c | 34 ++-------------------------------- include/linux/memblock.h | 1 + mm/memblock.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 59 deletions(-)
arch/loongarch/kernel/numa.c +1 -27
@@ -226,32 +226,6 @@ static void __init node_mem_init(unsigned int node)#ifdef CONFIG_ACPI_NUMA -/* -* Sanity check to catch more bad NUMA configurations (they are amazingly -* common). Make sure the nodes cover all memory. -*/ -static bool __init numa_meminfo_cover_memory (const struct numa_meminfo *mi) -{ -int i; -u64 numaram, biosram; - - numaram =0 ; -for (i =0 ; i < mi->nr_blks; i++) { -u64 s = mi->blk[i].start >>PAGE_SHIFT ; -u64 e = mi->blk[i].end >>PAGE_SHIFT ; - - numaram += e - s; - numaram -=__absent_pages_in_range (mi->blk[i].nid, s, e); -if ((s64 )numaram <0 ) - numaram =0 ; - } - max_pfn = max_low_pfn; - biosram = max_pfn -absent_pages_in_range (0 , max_pfn); - -BUG_ON ((s64)(biosram - numaram) >= (1 << (20 -PAGE_SHIFT ))); -return true; -} -static void __init add_node_intersection (u32 node,u64 start,u64 size,u32 type) {static unsigned long num_physpages;
@@ -396,7 +370,7 @@ int __init init_numa_memory(void)return -EINVAL ;init_node_memblock (); -if (numa_meminfo_cover_memory (&numa_meminfo) == false) +if (!memblock_validate_numa_coverage (SZ_1M ))return -EINVAL ;for_each_node_mask (node, node_possible_map) {
arch/x86/mm/numa.c +2 -32
@@ -448,37 +448,6 @@ int __node_distance(int from, int to) }EXPORT_SYMBOL (__node_distance); -/* -* Sanity check to catch more bad NUMA configurations (they are amazingly -* common). Make sure the nodes cover all memory. -*/ -static bool __init numa_meminfo_cover_memory (const struct numa_meminfo *mi) -{ -u64 numaram, e820ram; -int i; - - numaram =0 ; -for (i =0 ; i < mi->nr_blks; i++) { -u64 s = mi->blk[i].start >>PAGE_SHIFT ; -u64 e = mi->blk[i].end >>PAGE_SHIFT ; - numaram += e - s; - numaram -=__absent_pages_in_range (mi->blk[i].nid, s, e); -if ((s64 )numaram <0 ) - numaram =0 ; - } - - e820ram = max_pfn -absent_pages_in_range (0 , max_pfn); - -/* We seem to lose 3 pages somewhere. Allow 1M of slack. */ -if ((s64)(e820ram - numaram) >= (1 << (20 -PAGE_SHIFT ))) { -printk (KERN_ERR "NUMA: nodes only cover %LuMB of your %LuMB e820 RAM. Not used.\n" , - (numaram <<PAGE_SHIFT ) >>20 , - (e820ram <<PAGE_SHIFT ) >>20 ); -return false; - } -return true; -} -/* * Mark all currently memblock-reserved physical memory (which covers the * kernel's own memory ranges) as hot-unswappable.
@@ -584,7 +553,8 @@ static int __init numa_register_memblks(struct numa_meminfo *mi)return -EINVAL ; } } -if (!numa_meminfo_cover_memory (mi)) + +if (!memblock_validate_numa_coverage (SZ_1M ))return -EINVAL ;/* Finally register nodes. */
include/linux/memblock.h +1 -0
@@ -122,6 +122,7 @@ unsigned long memblock_addrs_overlap(phys_addr_t base1, phys_addr_t size1, phys_addr_t base2, phys_addr_t size2);bool memblock_overlaps_region (struct memblock_type *type,phys_addr_t base,phys_addr_t size); +bool memblock_validate_numa_coverage (unsigned long threshold_bytes);int memblock_mark_hotplug (phys_addr_t base,phys_addr_t size);int memblock_clear_hotplug (phys_addr_t base,phys_addr_t size);int memblock_mark_mirror (phys_addr_t base,phys_addr_t size);
mm/memblock.c +34 -0
@@ -735,6 +735,40 @@ int __init_memblock memblock_add(phys_addr_t base, phys_addr_t size)return memblock_add_range (&memblock.memory, base, size,MAX_NUMNODES ,0 ); } +/** +* memblock_validate_numa_coverage - check if amount of memory with +* no node ID assigned is less than a threshold +* @threshold_bytes: maximal number of pages that can have unassigned node +* ID (in bytes). +* +* A buggy firmware may report memory that does not belong to any node. +* Check if amount of such memory is below @threshold_bytes. +* +* Return: true on success, false on failure. +*/ +bool __init_memblock memblock_validate_numa_coverage(unsigned long threshold_bytes) +{ +unsigned long nr_pages =0 ; +unsigned long start_pfn, end_pfn, mem_size_mb; +int nid, i; + +/* calculate lose page */ +for_each_mem_pfn_range (i,MAX_NUMNODES , &start_pfn, &end_pfn, &nid) { +if (nid ==NUMA_NO_NODE ) + nr_pages += end_pfn - start_pfn; + } + +if ((nr_pages <<PAGE_SHIFT ) >= threshold_bytes) { + mem_size_mb =memblock_phys_mem_size () >>20 ; +pr_err ("NUMA: no nodes coverage for %luMB of %luMB RAM\n" , + (nr_pages <<PAGE_SHIFT ) >>20 , mem_size_mb); +return false; + } + +return true; +} + +/** * memblock_isolate_range - isolate given range into disjoint memblocks * @type: memblock type to isolate range for
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 19/222 memblock: allow zero threshold in validate_numa_converage()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Rapoport (Microsoft) <[email protected]>
[ Upstream commit 9cdc6423acb49055efb444ecd895d853a70ef931 ]
Currently memblock validate_numa_converage() returns false negative when threshold set to zero.
Make the check if the memory size with invalid node ID is greater than the threshold exclusive to fix that.
--- mm/memblock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/memblock.c +2 -2
@@ -738,7 +738,7 @@ int __init_memblock memblock_add(phys_addr_t base, phys_addr_t size)/** * memblock_validate_numa_coverage - check if amount of memory with * no node ID assigned is less than a threshold -* @threshold_bytes: maximal number of pages that can have unassigned node +* @threshold_bytes: maximal memory size that can have unassigned node * ID (in bytes). * * A buggy firmware may report memory that does not belong to any node.
@@ -758,7 +758,7 @@ bool __init_memblock memblock_validate_numa_coverage(unsigned long threshold_byt nr_pages += end_pfn - start_pfn; } -if ((nr_pages <<PAGE_SHIFT ) >= threshold_bytes) { +if ((nr_pages <<PAGE_SHIFT ) > threshold_bytes) { mem_size_mb =memblock_phys_mem_size () >>20 ;pr_err ("NUMA: no nodes coverage for %luMB of %luMB RAM\n" , (nr_pages <<PAGE_SHIFT ) >>20 , mem_size_mb);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 20/222 ext4: convert to new timestamp accessors
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit b898ab233611f7903d88c0b10f8145e1c15d3642 ]
Convert to using the new inode timestamp accessor functions.
Stable-dep-of: c7fc0366c656 ("ext4: partial zero eof block on unaligned inode size extension")
--- fs/ext4/ext4.h | 20 +++++++++++++++----- fs/ext4/extents.c | 11 ++++++----- fs/ext4/ialloc.c | 4 ++-- fs/ext4/inline.c | 4 ++-- fs/ext4/inode.c | 19 ++++++++++--------- fs/ext4/ioctl.c | 13 +++++++++++-- fs/ext4/namei.c | 10 +++++----- fs/ext4/super.c | 2 +- fs/ext4/xattr.c | 8 ++++---- 9 files changed, 56 insertions(+), 35 deletions(-)
fs/ext4/ext4.h +15 -5
@@ -891,10 +891,13 @@ do { \ (raw_inode)->xtime =cpu_to_le32 (clamp_t (int32_t, (ts).tv_sec,S32_MIN ,S32_MAX )); \ } while (0) -#define EXT4_INODE_SET_XTIME (xtime, inode, raw_inode) \ - EXT4_INODE_SET_XTIME_VAL(xtime, inode, raw_inode, (inode)->xtime) +#define EXT4_INODE_SET_ATIME (inode, raw_inode) \ + EXT4_INODE_SET_XTIME_VAL(i_atime, inode, raw_inode, inode_get_atime(inode)) -#define EXT4_INODE_SET_CTIME (inode, raw_inode) \ +#define EXT4_INODE_SET_MTIME (inode, raw_inode) \ + EXT4_INODE_SET_XTIME_VAL(i_mtime, inode, raw_inode, inode_get_mtime(inode)) + +#define EXT4_INODE_SET_CTIME (inode, raw_inode) \ EXT4_INODE_SET_XTIME_VAL(i_ctime, inode, raw_inode, inode_get_ctime(inode))#define EXT4_EINODE_SET_XTIME (xtime, einode, raw_inode) \
@@ -910,9 +913,16 @@ do { \ .tv_sec = (signed)le32_to_cpu((raw_inode)->xtime) \ }) -#define EXT4_INODE_GET_XTIME (xtime, inode, raw_inode) \ +#define EXT4_INODE_GET_ATIME (inode, raw_inode) \ +do { \ + inode_set_atime_to_ts(inode, \ + EXT4_INODE_GET_XTIME_VAL(i_atime, inode, raw_inode)); \ +} while (0) + +#define EXT4_INODE_GET_MTIME (inode, raw_inode) \ do { \ - (inode)->xtime = EXT4_INODE_GET_XTIME_VAL(xtime, inode, raw_inode); \ + inode_set_mtime_to_ts(inode, \ + EXT4_INODE_GET_XTIME_VAL(i_mtime, inode, raw_inode)); \ } while (0)#define EXT4_INODE_GET_CTIME (inode, raw_inode) \
fs/ext4/extents.c +6 -5
@@ -4532,7 +4532,8 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,if (epos > new_size) epos = new_size;if (ext4_update_inode_size (inode, epos) &0x1 ) - inode->i_mtime =inode_get_ctime (inode); +inode_set_mtime_to_ts (inode, +inode_get_ctime (inode)); } ret2 =ext4_mark_inode_dirty (handle, inode);ext4_update_inode_fsync_trans (handle, inode,1 );
@@ -4670,7 +4671,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,/* Now release the pages and zero block aligned part of pages */ truncate_pagecache_range (inode, start, end -1 ); - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); ret =ext4_alloc_file_blocks (file, lblk, max_blocks, new_size, flags);
@@ -4695,7 +4696,7 @@ static long ext4_zero_range(struct file *file, loff_t offset, goto out_mutex; } - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode));if (new_size)ext4_update_inode_size (inode, new_size); ret =ext4_mark_inode_dirty (handle, inode);
@@ -5431,7 +5432,7 @@ static int ext4_collapse_range(struct file *file, loff_t offset, loff_t len)up_write (&EXT4_I (inode)->i_data_sem);if (IS_SYNC (inode))ext4_handle_sync (handle); - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); ret =ext4_mark_inode_dirty (handle, inode);ext4_update_inode_fsync_trans (handle, inode,1 );
@@ -5541,7 +5542,7 @@ static int ext4_insert_range(struct file *file, loff_t offset, loff_t len)/* Expand file to avoid data loss if there is error while shifting */ inode->i_size += len;EXT4_I (inode)->i_disksize += len; - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); ret =ext4_mark_inode_dirty (handle, inode);if (ret) goto out_stop;
fs/ext4/ialloc.c +2 -2
@@ -1255,8 +1255,8 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, inode->i_ino = ino + group *EXT4_INODES_PER_GROUP (sb);/* This is the optimal IO size (for stat), not the fs block size */ inode->i_blocks =0 ; - inode->i_mtime = inode->i_atime =inode_set_ctime_current (inode); - ei->i_crtime = inode->i_mtime; +simple_inode_init_ts (inode); + ei->i_crtime =inode_get_mtime (inode);memset (ei->i_data,0 ,sizeof (ei->i_data)); ei->i_dir_start_lookup =0 ;
fs/ext4/inline.c +2 -2
@@ -1037,7 +1037,7 @@ static int ext4_add_dirent_to_inline(handle_t *handle,* happen is that the times are slightly out of date * and/or different from the directory change time. */ - dir->i_mtime =inode_set_ctime_current (dir); +inode_set_mtime_to_ts (dir,inode_set_ctime_current (dir));ext4_update_dx_flag (dir);inode_inc_iversion (dir);return 1 ;
@@ -2010,7 +2010,7 @@ int ext4_inline_data_truncate(struct inode *inode, int *has_inline)ext4_orphan_del (handle, inode);if (err ==0 ) { - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); err =ext4_mark_inode_dirty (handle, inode);if (IS_SYNC (inode))ext4_handle_sync (handle);
fs/ext4/inode.c +10 -9
@@ -4055,7 +4055,7 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)if (IS_SYNC (inode))ext4_handle_sync (handle); - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); ret2 =ext4_mark_inode_dirty (handle, inode);if (unlikely (ret2)) ret = ret2;
@@ -4215,7 +4215,7 @@ int ext4_truncate(struct inode *inode)if (inode->i_nlink)ext4_orphan_del (handle, inode); - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); err2 =ext4_mark_inode_dirty (handle, inode);if (unlikely (err2 && !err)) err = err2;
@@ -4319,8 +4319,8 @@ static int ext4_fill_raw_inode(struct inode *inode, struct ext4_inode *raw_inode raw_inode->i_links_count =cpu_to_le16 (inode->i_nlink);EXT4_INODE_SET_CTIME (inode, raw_inode); -EXT4_INODE_SET_XTIME (i_mtime, inode, raw_inode); -EXT4_INODE_SET_XTIME (i_atime, inode, raw_inode); +EXT4_INODE_SET_MTIME (inode, raw_inode); +EXT4_INODE_SET_ATIME (inode, raw_inode);EXT4_EINODE_SET_XTIME (i_crtime, ei, raw_inode); raw_inode->i_dtime =cpu_to_le32 (ei->i_dtime);
@@ -4928,8 +4928,8 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, }EXT4_INODE_GET_CTIME (inode, raw_inode); -EXT4_INODE_GET_XTIME (i_mtime, inode, raw_inode); -EXT4_INODE_GET_XTIME (i_atime, inode, raw_inode); +EXT4_INODE_GET_ATIME (inode, raw_inode); +EXT4_INODE_GET_MTIME (inode, raw_inode);EXT4_EINODE_GET_XTIME (i_crtime, ei, raw_inode);if (likely (!test_opt2 (inode->i_sb,HURD_COMPAT ))) {
@@ -5054,8 +5054,8 @@ static void __ext4_update_other_inode_time(struct super_block *sb,spin_lock (&ei->i_raw_lock);EXT4_INODE_SET_CTIME (inode, raw_inode); -EXT4_INODE_SET_XTIME (i_mtime, inode, raw_inode); -EXT4_INODE_SET_XTIME (i_atime, inode, raw_inode); +EXT4_INODE_SET_MTIME (inode, raw_inode); +EXT4_INODE_SET_ATIME (inode, raw_inode);ext4_inode_csum_set (inode, raw_inode, ei);spin_unlock (&ei->i_raw_lock);trace_ext4_other_inode_update_time (inode, orig_ino);
@@ -5451,7 +5451,8 @@ int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,* update c/mtime in shrink case below */ if (!shrink) - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode, +inode_set_ctime_current (inode));if (shrink) ext4_fc_track_range(handle, inode,
fs/ext4/ioctl.c +11 -2
@@ -312,13 +312,22 @@ static void swap_inode_data(struct inode *inode1, struct inode *inode2)struct ext4_inode_info *ei1;struct ext4_inode_info *ei2;unsigned long tmp; +struct timespec64 ts1, ts2; ei1 =EXT4_I (inode1); ei2 =EXT4_I (inode2);swap (inode1->i_version, inode2->i_version); -swap (inode1->i_atime, inode2->i_atime); -swap (inode1->i_mtime, inode2->i_mtime); + + ts1 =inode_get_atime (inode1); + ts2 =inode_get_atime (inode2); +inode_set_atime_to_ts (inode1, ts2); +inode_set_atime_to_ts (inode2, ts1); + + ts1 =inode_get_mtime (inode1); + ts2 =inode_get_mtime (inode2); +inode_set_mtime_to_ts (inode1, ts2); +inode_set_mtime_to_ts (inode2, ts1);memswap (ei1->i_data, ei2->i_data,sizeof (ei1->i_data)); tmp = ei1->i_flags &EXT4_FL_SHOULD_SWAP ;
fs/ext4/namei.c +5 -5
@@ -2210,7 +2210,7 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,* happen is that the times are slightly out of date * and/or different from the directory change time. */ - dir->i_mtime =inode_set_ctime_current (dir); +inode_set_mtime_to_ts (dir,inode_set_ctime_current (dir));ext4_update_dx_flag (dir);inode_inc_iversion (dir); err2 =ext4_mark_inode_dirty (handle, dir);
@@ -3248,7 +3248,7 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)* recovery. */ inode->i_size =0 ;ext4_orphan_add (handle, inode); - dir->i_mtime =inode_set_ctime_current (dir); +inode_set_mtime_to_ts (dir,inode_set_ctime_current (dir));inode_set_ctime_current (inode); retval =ext4_mark_inode_dirty (handle, inode);if (retval)
@@ -3323,7 +3323,7 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name, retval =ext4_delete_entry (handle, dir, de, bh);if (retval) goto out_handle; - dir->i_mtime =inode_set_ctime_current (dir); +inode_set_mtime_to_ts (dir,inode_set_ctime_current (dir));ext4_update_dx_flag (dir); retval =ext4_mark_inode_dirty (handle, dir);if (retval)
@@ -3691,7 +3691,7 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,if (ext4_has_feature_filetype (ent->dir->i_sb)) ent->de->file_type = file_type;inode_inc_iversion (ent->dir); - ent->dir->i_mtime =inode_set_ctime_current (ent->dir); +inode_set_mtime_to_ts (ent->dir,inode_set_ctime_current (ent->dir)); retval =ext4_mark_inode_dirty (handle, ent->dir);BUFFER_TRACE (ent->bh,"call ext4_handle_dirty_metadata" );if (!ent->inlined) {
@@ -4006,7 +4006,7 @@ static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,ext4_dec_count (new.inode);inode_set_ctime_current (new.inode); } - old.dir->i_mtime =inode_set_ctime_current (old.dir); +inode_set_mtime_to_ts (old.dir,inode_set_ctime_current (old.dir));ext4_update_dx_flag (old.dir);if (old.dir_bh) { retval =ext4_rename_dir_finish (handle, &old, new.dir->i_ino);
fs/ext4/super.c +1 -1
@@ -7180,7 +7180,7 @@ static int ext4_quota_off(struct super_block *sb, int type) }EXT4_I (inode)->i_flags &= ~(EXT4_NOATIME_FL |EXT4_IMMUTABLE_FL );inode_set_flags (inode,0 ,S_NOATIME |S_IMMUTABLE ); - inode->i_mtime =inode_set_ctime_current (inode); +inode_set_mtime_to_ts (inode,inode_set_ctime_current (inode)); err =ext4_mark_inode_dirty (handle, inode);ext4_journal_stop (handle); out_unlock:
fs/ext4/xattr.c +4 -4
@@ -356,7 +356,7 @@ ext4_xattr_inode_hash(struct ext4_sb_info *sbi, const void *buffer, size_t size)static u64 ext4_xattr_inode_get_ref (struct inode *ea_inode) { -return ((u64 )inode_get_ctime (ea_inode).tv_sec <<32 ) | +return ((u64 )inode_get_ctime_sec (ea_inode) <<32 ) | (u32 )inode_peek_iversion_raw (ea_inode); }
@@ -368,12 +368,12 @@ static void ext4_xattr_inode_set_ref(struct inode *ea_inode, u64 ref_count)static u32 ext4_xattr_inode_get_hash (struct inode *ea_inode) { -return (u32 )ea_inode->i_atime.tv_sec; +return (u32 )inode_get_atime_sec (ea_inode); }static void ext4_xattr_inode_set_hash (struct inode *ea_inode,u32 hash) { - ea_inode->i_atime.tv_sec = hash; +inode_set_atime (ea_inode, hash,0 ); }/*
@@ -418,7 +418,7 @@ static int ext4_xattr_inode_read(struct inode *ea_inode, void *buf, size_t size)return ret; } -#define EXT4_XATTR_INODE_GET_PARENT (inode) ((__u32)(inode)->i_mtime.tv_sec) +#define EXT4_XATTR_INODE_GET_PARENT (inode) ((__u32)(inode_get_mtime_sec(inode)))static int ext4_xattr_inode_iget (struct inode *parent,unsigned long ea_ino,u32 ea_inode_hash,struct inode **ea_inode)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 21/222 ext4: partial zero eof block on unaligned inode size extension
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Foster <[email protected]>
[ Upstream commit c7fc0366c65628fd69bfc310affec4918199aae2 ]
Using mapped writes, it's technically possible to expose stale post-eof data on a truncate up operation. Consider the following example:
$ xfs_io -fc "pwrite 0 2k" -c "mmap 0 4k" -c "mwrite 2k 2k" \ -c "truncate 8k" -c "pread -v 2k 16" <file> ... 00000800: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX ...
This shows that the post-eof data written via mwrite lands within EOF after a truncate up. While this is deliberate of the test case, behavior is somewhat unpredictable because writeback does post-eof zeroing, and writeback can occur at any time in the background. For example, an fsync inserted between the mwrite and truncate causes the subsequent read to instead return zeroes. This basically means that there is a race window in this situation between any subsequent extending operation and writeback that dictates whether post-eof data is exposed to the file or zeroed.
To prevent this problem, perform partial block zeroing as part of the various inode size extending operations that are susceptible to it. For truncate extension, zero around the original eof similar to how truncate down does partial zeroing of the new eof. For extension via writes and fallocate related operations, zero the newly exposed range of the file to cover any partial zeroing that must occur at the original and new eof blocks.
--- fs/ext4/extents.c | 7 ++++++- fs/ext4/inode.c | 51 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 16 deletions(-)
fs/ext4/extents.c +6 -1
@@ -4475,7 +4475,7 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,int depth =0 ;struct ext4_map_blocks map;unsigned int credits; -loff_t epos; +loff_t epos, old_size =i_size_read (inode);BUG_ON (!ext4_test_inode_flag (inode,EXT4_INODE_EXTENTS )); map.m_lblk = offset;
@@ -4534,6 +4534,11 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,if (ext4_update_inode_size (inode, epos) &0x1 )inode_set_mtime_to_ts (inode,inode_get_ctime (inode)); +if (epos > old_size) { +pagecache_isize_extended (inode, old_size, epos); +ext4_zero_partial_blocks (handle, inode, + old_size, epos - old_size); + } } ret2 =ext4_mark_inode_dirty (handle, inode);ext4_update_inode_fsync_trans (handle, inode,1 );
fs/ext4/inode.c +36 -15
95 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 22/222 crypto: ecdsa - Convert byte arrays with key coordinates to digits
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Berger <[email protected]>
[ Upstream commit d67c96fb97b5811e15c881d5cb72e293faa5f8e1 ]
For NIST P192/256/384 the public key's x and y parameters could be copied directly from a given array since both parameters filled 'ndigits' of digits (a 'digit' is a u64). For support of NIST P521 the key parameters need to have leading zeros prepended to the most significant digit since only 2 bytes of the most significant digit are provided.
Therefore, implement ecc_digits_from_bytes to convert a byte array into an array of digits and use this function in ecdsa_set_pub_key where an input byte array needs to be converted into digits.
Stable-dep-of: 3b0565c70350 ("crypto: ecdsa - Avoid signed integer overflow on signature decoding")
--- crypto/ecdsa.c | 14 +++++++++----- include/crypto/internal/ecc.h | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-)
crypto/ecdsa.c +9 -5
@@ -222,9 +222,8 @@ static int ecdsa_ecc_ctx_reset(struct ecc_ctx *ctx)static int ecdsa_set_pub_key (struct crypto_akcipher *tfm,const void *key,unsigned int keylen) {struct ecc_ctx *ctx =akcipher_tfm_ctx (tfm); +unsigned int digitlen, ndigits;const unsigned char *d = key; -const u64 *digits = (const u64 *)&d[1 ]; -unsigned int ndigits;int ret; ret =ecdsa_ecc_ctx_reset (ctx);
@@ -238,12 +237,17 @@ static int ecdsa_set_pub_key(struct crypto_akcipher *tfm, const void *key, unsigreturn -EINVAL ; keylen--; - ndigits = (keylen >>1 ) /sizeof (u64); + digitlen = keylen >>1 ; + + ndigits =DIV_ROUND_UP (digitlen,sizeof (u64));if (ndigits != ctx->curve->g.ndigits)return -EINVAL ; -ecc_swap_digits (digits, ctx->pub_key.x, ndigits); -ecc_swap_digits (&digits[ndigits], ctx->pub_key.y, ndigits); + d++; + +ecc_digits_from_bytes (d, digitlen, ctx->pub_key.x, ndigits); +ecc_digits_from_bytes (&d[digitlen], digitlen, ctx->pub_key.y, ndigits); + ret =ecc_is_pubkey_valid_full (ctx->curve, &ctx->pub_key); ctx->pub_key_set = ret ==0 ;
include/crypto/internal/ecc.h +21 -0
@@ -56,6 +56,27 @@ static inline void ecc_swap_digits(const void *in, u64 *out, unsigned int ndigit out[i] =get_unaligned_be64 (&src[ndigits -1 - i]); } +/** +* ecc_digits_from_bytes() - Create ndigits-sized digits array from byte array +* @in: Input byte array +* @nbytes Size of input byte array +* @out Output digits array +* @ndigits: Number of digits to create from byte array +*/ +static inline void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, +u64 *out,unsigned int ndigits) +{ +unsigned int o = nbytes &7 ; +__be64 msd =0 ; + +if (o) { +memcpy ((u8 *)&msd +sizeof (msd) - o, in, o); + out[--ndigits] =be64_to_cpu (msd); + in += o; + } +ecc_swap_digits (in, out, ndigits); +} +/** * ecc_is_key_valid() - Validate a given ECDH private key *
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 23/222 crypto: ecdsa - Rename keylen to bufsize where necessary
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Berger <[email protected]>
[ Upstream commit 703ca5cda1ea04735e48882a7cccff97d57656c3 ]
In cases where 'keylen' was referring to the size of the buffer used by a curve's digits, it does not reflect the purpose of the variable anymore once NIST P521 is used. What it refers to then is the size of the buffer, which may be a few bytes larger than the size a coordinate of a key. Therefore, rename keylen to bufsize where appropriate.
Stable-dep-of: 3b0565c70350 ("crypto: ecdsa - Avoid signed integer overflow on signature decoding")
--- crypto/ecdsa.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
crypto/ecdsa.c +6 -6
@@ -35,8 +35,8 @@ struct ecdsa_signature_ctx {static int ecdsa_get_signature_rs (u64 *dest,size_t hdrlen,unsigned char tag,const void *value,size_t vlen,unsigned int ndigits) { -size_t keylen = ndigits *sizeof (u64); -ssize_t diff = vlen - keylen; +size_t bufsize = ndigits *sizeof (u64); +ssize_t diff = vlen - bufsize;const char *d = value;u8 rs[ECC_MAX_BYTES ];
@@ -58,7 +58,7 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,if (diff)return -EINVAL ; } -if (-diff >= keylen) +if (-diff >= bufsize)return -EINVAL ;if (diff) {
@@ -138,7 +138,7 @@ static int ecdsa_verify(struct akcipher_request *req) {struct crypto_akcipher *tfm =crypto_akcipher_reqtfm (req);struct ecc_ctx *ctx =akcipher_tfm_ctx (tfm); -size_t keylen = ctx->curve->g.ndigits *sizeof (u64); +size_t bufsize = ctx->curve->g.ndigits *sizeof (u64);struct ecdsa_signature_ctx sig_ctx = { .curve = ctx->curve, };
@@ -165,14 +165,14 @@ static int ecdsa_verify(struct akcipher_request *req) goto error;/* if the hash is shorter then we will add leading zeros to fit to ndigits */ - diff = keylen - req->dst_len; + diff = bufsize - req->dst_len;if (diff >=0 ) {if (diff)memset (rawhash,0 , diff);memcpy (&rawhash[diff], buffer + req->src_len, req->dst_len); }else if (diff <0 ) {/* given hash is longer, we take the left-most bytes */ -memcpy (&rawhash, buffer + req->src_len, keylen); +memcpy (&rawhash, buffer + req->src_len, bufsize); }ecc_swap_digits ((u64 *)rawhash, hash, ctx->curve->g.ndigits);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 24/222 crypto: ecdsa - Use ecc_digits_from_bytes to convert signature
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Berger <[email protected]>
[ Upstream commit 546ce0bdc91afd9f5c4c67d9fc4733e0fc7086d1 ]
Since ecc_digits_from_bytes will provide zeros when an insufficient number of bytes are passed in the input byte array, use it to convert the r and s components of the signature to digits directly from the input byte array. This avoids going through an intermediate byte array that has the first few bytes filled with zeros.
Stable-dep-of: 3b0565c70350 ("crypto: ecdsa - Avoid signed integer overflow on signature decoding")
--- crypto/ecdsa.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)
crypto/ecdsa.c +2 -10
@@ -38,7 +38,6 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,size_t bufsize = ndigits *sizeof (u64);ssize_t diff = vlen - bufsize;const char *d = value; -u8 rs[ECC_MAX_BYTES ];if (!value || !vlen)return -EINVAL ;
@@ -46,7 +45,7 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,/* diff = 0: 'value' has exacly the right size * diff > 0: 'value' has too many bytes; one leading zero is allowed that * makes the value a positive integer; error on more -* diff < 0: 'value' is missing leading zeros, which we add +* diff < 0: 'value' is missing leading zeros */ if (diff >0 ) {/* skip over leading zeros that make 'value' a positive int */
@@ -61,14 +60,7 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,if (-diff >= bufsize)return -EINVAL ; -if (diff) { -/* leading zeros not given in 'value' */ -memset (rs,0 , -diff); - } - -memcpy (&rs[-diff], d, vlen); - -ecc_swap_digits ((u64 *)rs, dest, ndigits); +ecc_digits_from_bytes (d, vlen, dest, ndigits);return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 25/222 crypto: ecdsa - Avoid signed integer overflow on signature decoding
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit 3b0565c703503f832d6cd7ba805aafa3b330cb9d ]
When extracting a signature component r or s from an ASN.1-encoded integer, ecdsa_get_signature_rs() subtracts the expected length "bufsize" from the ASN.1 length "vlen" (both of unsigned type size_t) and stores the result in "diff" (of signed type ssize_t).
This results in a signed integer overflow if vlen > SSIZE_MAX + bufsize.
The kernel is compiled with -fno-strict-overflow, which implies -fwrapv, meaning signed integer overflow is not undefined behavior. And the function does check for overflow:
if (-diff >= bufsize)
return -EINVAL;
So the code is fine in principle but not very obvious. In the future it might trigger a false-positive with CONFIG_UBSAN_SIGNED_WRAP=y.
Avoid by comparing the two unsigned variables directly and erroring out if "vlen" is too large.
--- crypto/ecdsa.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
crypto/ecdsa.c +7 -12
@@ -36,29 +36,24 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag, const void *value, size_t vlen, unsigned int ndigits) { size_t bufsize = ndigits * sizeof(u64); -ssize_t diff = vlen - bufsize;const char *d = value; -if (!value || !vlen) +if (!value || !vlen || vlen > bufsize +1 )return -EINVAL ; -/* diff = 0: 'value' has exacly the right size -* diff > 0: 'value' has too many bytes; one leading zero is allowed that -* makes the value a positive integer; error on more -* diff < 0: 'value' is missing leading zeros +/* +* vlen may be 1 byte larger than bufsize due to a leading zero byte +* (necessary if the most significant bit of the integer is set). */ -if (diff >0 ) { +if (vlen > bufsize) {/* skip over leading zeros that make 'value' a positive int */ if (*d ==0 ) { vlen -=1 ; - diff--; d++; - } -if (diff) + }else {return -EINVAL ; + } } -if (-diff >= bufsize) -return -EINVAL ;ecc_digits_from_bytes (d, vlen, dest, ndigits);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 26/222 cleanup: Add conditional guard support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit e4ab322fbaaaf84b23d6cb0e3317a7f68baf36dc ]
Adds:
- DEFINE_GUARD_COND() / DEFINE_LOCK_GUARD_1_COND() to extend existing guards with conditional lock primitives, eg. mutex_trylock(), mutex_lock_interruptible().
nb. both primitives allow NULL 'locks', which cause the lock to
fail (obviously).
- extends scoped_guard() to not take the body when the the conditional guard 'fails'. eg.
scoped_guard (mutex_intr, &task->signal_cred_guard_mutex) {
...
}will only execute the body when the mutex is held.
- provides scoped_cond_guard(name, fail, args...); which extends scoped_guard() to do fail when the lock-acquire fails.
Stable-dep-of: fcc22ac5baf0 ("cleanup: Adjust scoped_guard() macros to avoid potential warning")
--- include/linux/cleanup.h | 52 +++++++++++++++++++++++++++++++++++++--- include/linux/mutex.h | 3 ++- include/linux/rwsem.h | 8 +++---- include/linux/spinlock.h | 15 ++++++++++++ 4 files changed, 70 insertions(+), 8 deletions(-)
include/linux/cleanup.h +49 -3
@@ -92,25 +92,55 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \* trivial wrapper around DEFINE_CLASS() above specifically * for locks. * +* DEFINE_GUARD_COND(name, ext, condlock) +* wrapper around EXTEND_CLASS above to add conditional lock +* variants to a base class, eg. mutex_trylock() or +* mutex_lock_interruptible(). +* * guard(name): -* an anonymous instance of the (guard) class +* an anonymous instance of the (guard) class, not recommended for +* conditional locks. * * scoped_guard (name, args...) { }: * similar to CLASS(name, scope)(args), except the variable (with the * explicit name 'scope') is declard in a for-loop such that its scope is * bound to the next (compound) statement. * +* for conditional locks the loop body is skipped when the lock is not +* acquired. +* +* scoped_cond_guard (name, fail, args...) { }: +* similar to scoped_guard(), except it does fail when the lock +* acquire fails. +* */ #define DEFINE_GUARD (_name, _type, _lock, _unlock) \ - DEFINE_CLASS(_name, _type, _unlock, ({ _lock; _T; }), _type _T) + DEFINE_CLASS(_name, _type, if (_T) { _unlock; }, ({ _lock; _T; }), _type _T); \ + static inline void * class_##_name##_lock_ptr(class_##_name##_t *_T) \ + { return *_T; } + +#define DEFINE_GUARD_COND (_name, _ext, _condlock) \ + EXTEND_CLASS(_name, _ext, \ + ({ void *_t = _T; if (_T && !(_condlock)) _t = NULL; _t; }), \ + class_##_name##_t _T) \ + static inline void * class_##_name##_ext##_lock_ptr(class_##_name##_t *_T) \ + { return class_##_name##_lock_ptr(_T); }#define guard (_name) \ CLASS(_name, __UNIQUE_ID(guard)) +#define __guard_ptr (_name) class_##_name##_lock_ptr + #define scoped_guard(_name, args...) \ for (CLASS(_name, scope)(args), \ - *done = NULL; !done; done = (void *)1) + *done = NULL; __guard_ptr(_name)(&scope) && !done; done = (void *)1) + +#define scoped_cond_guard(_name, _fail, args...) \ + for (CLASS(_name, scope)(args), \ + *done = NULL; !done; done = (void *)1) \ + if (!__guard_ptr(_name)(&scope)) _fail; \ + else/* * Additional helper macros for generating lock guards with types, either for
@@ -119,6 +149,7 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \* * DEFINE_LOCK_GUARD_0(name, lock, unlock, ...) * DEFINE_LOCK_GUARD_1(name, type, lock, unlock, ...) +* DEFINE_LOCK_GUARD_1_COND(name, ext, condlock) * * will result in the following type: *
@@ -140,6 +171,11 @@ typedef struct { \ static inline void class_##_name##_destructor(class_##_name##_t *_T) \ { \if (_T->lock) { _unlock; } \ +} \ + \ +static inline void *class_##_name##_lock_ptr(class_##_name##_t *_T) \ +{ \ +return _T->lock; \ }
@@ -168,4 +204,14 @@ __DEFINE_LOCK_GUARD_1(_name, _type, _lock) __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__) \ __DEFINE_LOCK_GUARD_0(_name, _lock) +#define DEFINE_LOCK_GUARD_1_COND (_name, _ext, _condlock) \ + EXTEND_CLASS(_name, _ext, \ + ({ class_##_name##_t _t = { .lock = l }, *_T = &_t;\ + if (_T->lock && !(_condlock)) _T->lock = NULL; \ + _t; }), \ + typeof_member(class_##_name##_t, lock) l) \ + static inline void * class_##_name##_ext##_lock_ptr(class_##_name##_t *_T) \ + { return class_##_name##_lock_ptr(_T); } + +#endif /* __LINUX_GUARDS_H */
include/linux/mutex.h +2 -1
@@ -248,6 +248,7 @@ extern void mutex_unlock(struct mutex *lock);extern int atomic_dec_and_mutex_lock (atomic_t *cnt,struct mutex *lock); DEFINE_GUARD(mutex, struct mutex *, mutex_lock(_T), mutex_unlock(_T)) -DEFINE_FREE(mutex, struct mutex *, if (_T) mutex_unlock(_T)) +DEFINE_GUARD_COND(mutex, _try, mutex_trylock(_T)) +DEFINE_GUARD_COND(mutex, _intr, mutex_lock_interruptible(_T) == 0)#endif /* __LINUX_MUTEX_H */
include/linux/rwsem.h +4 -4
@@ -203,11 +203,11 @@ extern void up_read(struct rw_semaphore *sem);extern void up_write (struct rw_semaphore *sem); DEFINE_GUARD(rwsem_read, struct rw_semaphore *, down_read(_T), up_read(_T)) -DEFINE_GUARD(rwsem_write, struct rw_semaphore *, down_write(_T), up_write(_T)) - -DEFINE_FREE(up_read, struct rw_semaphore *, if (_T) up_read(_T)) -DEFINE_FREE(up_write, struct rw_semaphore *, if (_T) up_write(_T)) +DEFINE_GUARD_COND(rwsem_read, _try, down_read_trylock(_T)) +DEFINE_GUARD_COND(rwsem_read, _intr, down_read_interruptible(_T) == 0) +DEFINE_GUARD(rwsem_write, struct rw_semaphore *, down_write(_T), up_write(_T)) +DEFINE_GUARD_COND (rwsem_write, _try,down_write_trylock (_T))/* * downgrade write lock to read lock
include/linux/spinlock.h +15 -0
@@ -507,6 +507,8 @@ DEFINE_LOCK_GUARD_1(raw_spinlock, raw_spinlock_t, raw_spin_lock(_T->lock), raw_spin_unlock(_T->lock)) +DEFINE_LOCK_GUARD_1_COND(raw_spinlock, _try, raw_spin_trylock(_T->lock)) +DEFINE_LOCK_GUARD_1 (raw_spinlock_nested, raw_spinlock_t,raw_spin_lock_nested (_T->lock,SINGLE_DEPTH_NESTING ),raw_spin_unlock (_T->lock))
@@ -515,23 +517,36 @@ DEFINE_LOCK_GUARD_1(raw_spinlock_irq, raw_spinlock_t, raw_spin_lock_irq(_T->lock), raw_spin_unlock_irq(_T->lock)) +DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irq, _try, raw_spin_trylock_irq(_T->lock)) + DEFINE_LOCK_GUARD_1(raw_spinlock_irqsave, raw_spinlock_t, raw_spin_lock_irqsave(_T->lock, _T->flags), raw_spin_unlock_irqrestore(_T->lock, _T->flags), unsigned long flags) +DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irqsave, _try, + raw_spin_trylock_irqsave(_T->lock, _T->flags)) + DEFINE_LOCK_GUARD_1(spinlock, spinlock_t, spin_lock(_T->lock), spin_unlock(_T->lock)) +DEFINE_LOCK_GUARD_1_COND(spinlock, _try, spin_trylock(_T->lock)) + DEFINE_LOCK_GUARD_1(spinlock_irq, spinlock_t, spin_lock_irq(_T->lock), spin_unlock_irq(_T->lock)) +DEFINE_LOCK_GUARD_1_COND(spinlock_irq, _try, + spin_trylock_irq(_T->lock)) + DEFINE_LOCK_GUARD_1(spinlock_irqsave, spinlock_t, spin_lock_irqsave(_T->lock, _T->flags), spin_unlock_irqrestore(_T->lock, _T->flags), unsigned long flags) +DEFINE_LOCK_GUARD_1_COND(spinlock_irqsave, _try, + spin_trylock_irqsave(_T->lock, _T->flags)) +#undef __LINUX_INSIDE_SPINLOCK_H#endif /* __LINUX_SPINLOCK_H */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 27/222 cleanup: Adjust scoped_guard() macros to avoid potential warning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Przemek Kitszel <[email protected]>
[ Upstream commit fcc22ac5baf06dd17193de44b60dbceea6461983 ]
Change scoped_guard() and scoped_cond_guard() macros to make reasoning about them easier for static analysis tools (smatch, compiler diagnostics), especially to enable them to tell if the given usage of scoped_guard() is with a conditional lock class (interruptible-locks, try-locks) or not (like simple mutex_lock()).
Add compile-time error if scoped_cond_guard() is used for non-conditional lock class.
Beyond easier tooling and a little shrink reported by bloat-o-meter this patch enables developer to write code like:
int foo(struct my_drv *adapter)
{
scoped_guard(spinlock, &adapter->some_spinlock)
return adapter->spinlock_protected_var;
}Current scoped_guard() implementation does not support that, due to compiler complaining:
error: control reaches end of non-void function [-Werror=return-type]
Technical stuff about the change:scoped_guard() macro uses common idiom of using "for" statement to declare a scoped variable. Unfortunately, current logic is too hard for compiler diagnostics to be sure that there is exactly one loop step; fix that.
To make any loop so trivial that there is no above warning, it must not depend on any non-const variable to tell if there are more steps. There is no obvious solution for that in C, but one could use the compound statement expression with "goto" jumping past the "loop", effectively leaving only the subscope part of the loop semantics.
More impl details:
one more level of macro indirection is now needed to avoid duplicating label names;
I didn't spot any other place that is using the
"for (...; goto label) if (0) label: break;" idiom, so it's not packed for reuse beyond scoped_guard() family, what makes actual macros code cleaner.
There was also a need to introduce const true/false variable per lock class, it is used to aid compiler diagnostics reasoning about "exactly 1 step" loops (note that converting that to function would undo the whole benefit).
Big thanks to Andy Shevchenko for help on this patch, both internal and public, ranging from whitespace/formatting, through commit message clarifications, general improvements, ending with presenting alternative approaches - all despite not even liking the idea.
Big thanks to Dmitry Torokhov for the idea of compile-time check for scoped_cond_guard() (to use it only with conditional locsk), and general improvements for the patch.
Big thanks to David Lechner for idea to cover also scoped_cond_guard().
--- include/linux/cleanup.h | 52 +++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 10 deletions(-)
include/linux/cleanup.h +42 -10
@@ -113,14 +113,20 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \* similar to scoped_guard(), except it does fail when the lock * acquire fails. * +* Only for conditional locks. */ +#define __DEFINE_CLASS_IS_CONDITIONAL (_name, _is_cond) \ +static __maybe_unused const bool class_##_name##_is_conditional = _is_cond +#define DEFINE_GUARD (_name, _type, _lock, _unlock) \ + __DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ DEFINE_CLASS(_name, _type, if (_T) { _unlock; }, ({ _lock; _T; }), _type _T); \ static inline void * class_##_name##_lock_ptr(class_##_name##_t *_T) \ { return *_T; }#define DEFINE_GUARD_COND (_name, _ext, _condlock) \ + __DEFINE_CLASS_IS_CONDITIONAL(_name##_ext, true); \ EXTEND_CLASS(_name, _ext, \ ({ void *_t = _T; if (_T && !(_condlock)) _t = NULL; _t; }), \ class_##_name##_t _T) \
@@ -131,17 +137,40 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ CLASS(_name, __UNIQUE_ID(guard))#define __guard_ptr (_name) class_##_name##_lock_ptr +#define __is_cond_ptr (_name) class_##_name##_is_conditional -#define scoped_guard(_name, args...) \ - for (CLASS(_name, scope)(args), \ - *done = NULL; __guard_ptr(_name)(&scope) && !done; done = (void *)1) - -#define scoped_cond_guard(_name, _fail, args...) \ - for (CLASS(_name, scope)(args), \ - *done = NULL; !done; done = (void *)1) \ - if (!__guard_ptr(_name)(&scope)) _fail; \ - else - +/* +* Helper macro for scoped_guard(). +* +* Note that the "!__is_cond_ptr(_name)" part of the condition ensures that +* compiler would be sure that for the unconditional locks the body of the +* loop (caller-provided code glued to the else clause) could not be skipped. +* It is needed because the other part - "__guard_ptr(_name)(&scope)" - is too +* hard to deduce (even if could be proven true for unconditional locks). +*/ +#define __scoped_guard(_name, _label, args...) \ + for (CLASS(_name, scope)(args); \ + __guard_ptr(_name)(&scope) || !__is_cond_ptr(_name); \ + ({ goto _label; })) \ + if (0) { \ +_label: \ + break; \ + } else + +#define scoped_guard(_name, args...) \ + __scoped_guard(_name, __UNIQUE_ID(label), args) + +#define __scoped_cond_guard(_name, _fail, _label, args...) \ + for (CLASS(_name, scope)(args); true; ({ goto _label; })) \ + if (!__guard_ptr(_name)(&scope)) { \ + BUILD_BUG_ON(!__is_cond_ptr(_name)); \ + _fail; \ +_label: \ + break; \ + } else + +#define scoped_cond_guard(_name, _fail, args...) \ + __scoped_cond_guard(_name, _fail, __UNIQUE_ID(label), args)/* * Additional helper macros for generating lock guards with types, either for * locks that don't have a native type (eg. RCU, preempt) or those that need a
@@ -197,14 +226,17 @@ static inline class_##_name##_t class_##_name##_constructor(void) \ }#define DEFINE_LOCK_GUARD_1 (_name, _type, _lock, _unlock, ...) \ +__DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ __DEFINE_UNLOCK_GUARD(_name, _type, _unlock, __VA_ARGS__) \ __DEFINE_LOCK_GUARD_1(_name, _type, _lock)#define DEFINE_LOCK_GUARD_0 (_name, _lock, _unlock, ...) \ +__DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__) \ __DEFINE_LOCK_GUARD_0(_name, _lock)#define DEFINE_LOCK_GUARD_1_COND (_name, _ext, _condlock) \ + __DEFINE_CLASS_IS_CONDITIONAL(_name##_ext, true); \ EXTEND_CLASS(_name, _ext, \ ({ class_##_name##_t _t = { .lock = l }, *_T = &_t;\ if (_T->lock && !(_condlock)) _T->lock = NULL; \
Signature · 1 line
2.39.5
Re: [PATCH 6.6 027/222] cleanup: Adjust scoped_guard() macros to avoid potential warning
Quoted 6 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Przemek Kitszel <[email protected]>
Quoted 8 lines
[ Upstream commit
fcc22ac5baf06dd17193de44b60dbceea6461983]Change
scoped_guard()andscoped_cond_guard()macros to make reasoning about them easier for static analysis tools (smatch, compiler diagnostics), especially to enable them to tell if the given usage ofscoped_guard()is with a conditional lock class (interruptible-locks, try-locks) or not (like simplemutex_lock()).
please also consider cherry pick of the commit 9a884bdb6e95 ("iio: magnetometer: fix if () scoped_guard() formatting") when picking the one in the subject
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 027/222] cleanup: Adjust scoped_guard() macros to avoid potential warning
Quoted 16 lines · Przemek Kitszel
Quoted 6 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Przemek Kitszel <[email protected]>
Quoted 8 lines
[ Upstream commit
fcc22ac5baf06dd17193de44b60dbceea6461983]Change
scoped_guard()andscoped_cond_guard()macros to make reasoning about them easier for static analysis tools (smatch, compiler diagnostics), especially to enable them to tell if the given usage ofscoped_guard()is with a conditional lock class (interruptible-locks, try-locks) or not (like simplemutex_lock()).
Quoted 3 lines
please also consider cherry pick of the commit
9a884bdb6e95("iio:
magnetometer: fix if ()scoped_guard()formatting") when picking the one in the subject
Did you try to apply that commit to the 6.6.y tree? If you have it working, please send us the correct backport because as-is, it does not apply at all.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 28/222 media: uvcvideo: Force UVC version to 1.0a for 0408:4035
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit c397e8c45d911443b4ab60084fb723edf2a5b604 ]
The Quanta ACER HD User Facing camera reports a UVC 1.50 version, but implements UVC 1.0a as shown by the UVC probe control being 26 bytes long. Force the UVC version for that device.
Stable-dep-of: c9df99302fff ("media: uvcvideo: Force UVC version to 1.0a for 0408:4033")
--- drivers/media/usb/uvc/uvc_driver.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/media/usb/uvc/uvc_driver.c +11 -0
@@ -2519,6 +2519,17 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceSubClass = 1, .bInterfaceProtocol = UVC_PC_PROTOCOL_15, .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited }, +/* Quanta ACER HD User Facing */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x0408, + .idProduct = 0x4035, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = UVC_PC_PROTOCOL_15, + .driver_info = (kernel_ulong_t)&(const struct uvc_device_info ){ + .uvc_version =0x010a , + } }, /* LogiLink Wireless Webcam */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 29/222 media: uvcvideo: Force UVC version to 1.0a for 0408:4033
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Ribalda <[email protected]>
[ Upstream commit c9df99302fff53b6007666136b9f43fbac7ee3d8 ]
The Quanta ACER HD User Facing camera reports a UVC 1.50 version, but implements UVC 1.0a as shown by the UVC probe control being 26 bytes long. Force the UVC version for that device.
--- drivers/media/usb/uvc/uvc_driver.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/media/usb/uvc/uvc_driver.c +11 -0
@@ -2520,6 +2520,17 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceProtocol = UVC_PC_PROTOCOL_15, .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },/* Quanta ACER HD User Facing */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x0408, + .idProduct = 0x4033, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = UVC_PC_PROTOCOL_15, + .driver_info = (kernel_ulong_t)&(const struct uvc_device_info ){ + .uvc_version =0x010a , + } }, + /* Quanta ACER HD User Facing */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, .idVendor = 0x0408,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 30/222 wifi: mac80211: export ieee80211_purge_tx_queue() for drivers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 53bc1b73b67836ac9867f93dee7a443986b4a94f ]
Drivers need to purge TX SKB when stopping. Using skb_queue_purge() can't report TX status to mac80211, causing ieee80211_free_ack_frame() warns "Have pending ack frames!". Export ieee80211_purge_tx_queue() for drivers to not have to reimplement it.
Stable-dep-of: 3e5e4a801aaf ("wifi: rtw88: use ieee80211_purge_tx_queue() to purge TX skb")
--- include/net/mac80211.h | 13 +++++++++++++ net/mac80211/ieee80211_i.h | 2 -- net/mac80211/status.c | 1 + 3 files changed, 14 insertions(+), 2 deletions(-)
include/net/mac80211.h +13 -0
@@ -3039,6 +3039,19 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw,*/ void ieee80211_free_txskb (struct ieee80211_hw *hw,struct sk_buff *skb); +/** +* ieee80211_purge_tx_queue - purge TX skb queue +* @hw: the hardware +* @skbs: the skbs +* +* Free a set of transmit skbs. Use this function when device is going to stop +* but some transmit skbs without TX status are still queued. +* This function does not take the list lock and the caller must hold the +* relevant locks to use it. +*/ +void ieee80211_purge_tx_queue (struct ieee80211_hw *hw, +struct sk_buff_head *skbs); +/** * DOC: Hardware crypto acceleration *
net/mac80211/ieee80211_i.h +0 -2
@@ -2057,8 +2057,6 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,u32 info_flags, u32 ctrl_flags, u64 *cookie); -void ieee80211_purge_tx_queue (struct ieee80211_hw *hw, -struct sk_buff_head *skbs);struct sk_buff *ieee80211_build_data_template (struct ieee80211_sub_if_data *sdata,struct sk_buff *skb,u32 info_flags);
net/mac80211/status.c +1 -0
@@ -1270,3 +1270,4 @@ void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,while ((skb =__skb_dequeue (skbs)))ieee80211_free_txskb (hw, skb); } +EXPORT_SYMBOL (ieee80211_purge_tx_queue);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 31/222 wifi: rtw88: use ieee80211_purge_tx_queue() to purge TX skb
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 3e5e4a801aaf4283390cc34959c6c48f910ca5ea ]
When removing kernel modules by:
rmmod rtw88_8723cs rtw88_8703b rtw88_8723x rtw88_sdio rtw88_core
Driver uses skb_queue_purge() to purge TX skb, but not report tx status causing "Have pending ack frames!" warning. Use ieee80211_purge_tx_queue() to correct this.
Since ieee80211_purge_tx_queue() doesn't take locks, to prevent racing between TX work and purge TX queue, flush and destroy TX work in advance.
wlan0: deauthenticating from aa:f5:fd:60:4c:a8 by local
choice (Reason: 3=DEAUTH_LEAVING)
------------[ cut here ]------------
Have pending ack frames!
WARNING: CPU: 3 PID: 9232 at net/mac80211/main.c:1691
ieee80211_free_ack_frame+0x5c/0x90 [mac80211]
CPU: 3 PID: 9232 Comm: rmmod Tainted: G C
6.10.1-200.fc40.aarch64 #1
Hardware name: pine64 Pine64 PinePhone Braveheart
(1.1)/Pine64 PinePhone Braveheart (1.1), BIOS 2024.01 01/01/2024
pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : ieee80211_free_ack_frame+0x5c/0x90 [mac80211]
lr : ieee80211_free_ack_frame+0x5c/0x90 [mac80211]
sp : ffff80008c1b37b0
x29: ffff80008c1b37b0 x28: ffff000003be8000 x27: 0000000000000000
x26: 0000000000000000 x25: ffff000003dc14b8 x24: ffff80008c1b37d0
x23: ffff000000ff9f80 x22: 0000000000000000 x21: 000000007fffffff
x20: ffff80007c7e93d8 x19: ffff00006e66f400 x18: 0000000000000000
x17: ffff7ffffd2b3000 x16: ffff800083fc0000 x15: 0000000000000000
x14: 0000000000000000 x13: 2173656d61726620 x12: 6b636120676e6964
x11: 0000000000000000 x10: 000000000000005d x9 : ffff8000802af2b0
x8 : ffff80008c1b3430 x7 : 0000000000000001 x6 : 0000000000000001
x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000003be8000
Call trace:
ieee80211_free_ack_frame+0x5c/0x90 [mac80211]
idr_for_each+0x74/0x110
ieee80211_free_hw+0x44/0xe8 [mac80211]
rtw_sdio_remove+0x9c/0xc0 [rtw88_sdio]
sdio_bus_remove+0x44/0x180
device_remove+0x54/0x90
device_release_driver_internal+0x1d4/0x238
driver_detach+0x54/0xc0
bus_remove_driver+0x78/0x108
driver_unregister+0x38/0x78
sdio_unregister_driver+0x2c/0x40
rtw_8723cs_driver_exit+0x18/0x1000 [rtw88_8723cs]
__do_sys_delete_module.isra.0+0x190/0x338
__arm64_sys_delete_module+0x1c/0x30
invoke_syscall+0x74/0x100
el0_svc_common.constprop.0+0x48/0xf0
do_el0_svc+0x24/0x38
el0_svc+0x3c/0x158
el0t_64_sync_handler+0x120/0x138
el0t_64_sync+0x194/0x198
---[ end trace 0000000000000000 ]------ drivers/net/wireless/realtek/rtw88/sdio.c | 6 +++--- drivers/net/wireless/realtek/rtw88/usb.c | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw88/sdio.c +3 -3
@@ -1295,12 +1295,12 @@ static void rtw_sdio_deinit_tx(struct rtw_dev *rtwdev)struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;int i; -for (i =0 ; i <RTK_MAX_TX_QUEUE_NUM ; i++) -skb_queue_purge (&rtwsdio->tx_queue[i]); -flush_workqueue (rtwsdio->txwq);destroy_workqueue (rtwsdio->txwq);kfree (rtwsdio->tx_handler_data); + +for (i =0 ; i <RTK_MAX_TX_QUEUE_NUM ; i++) +ieee80211_purge_tx_queue (rtwdev->hw, &rtwsdio->tx_queue[i]); } int rtw_sdio_probe(struct sdio_func *sdio_func,
drivers/net/wireless/realtek/rtw88/usb.c +3 -2
@@ -416,10 +416,11 @@ static void rtw_usb_tx_handler(struct work_struct *work)static void rtw_usb_tx_queue_purge (struct rtw_usb *rtwusb) { +struct rtw_dev *rtwdev = rtwusb->rtwdev;int i;for (i =0 ; i <ARRAY_SIZE (rtwusb->tx_queue); i++) -skb_queue_purge (&rtwusb->tx_queue[i]); +ieee80211_purge_tx_queue (rtwdev->hw, &rtwusb->tx_queue[i]); }static void rtw_usb_write_port_complete (struct urb *urb)
@@ -801,9 +802,9 @@ static void rtw_usb_deinit_tx(struct rtw_dev *rtwdev) {struct rtw_usb *rtwusb =rtw_get_usb_priv (rtwdev); -rtw_usb_tx_queue_purge (rtwusb);flush_workqueue (rtwusb->txwq);destroy_workqueue (rtwusb->txwq); +rtw_usb_tx_queue_purge (rtwusb); } static int rtw_usb_intf_init(struct rtw_dev *rtwdev,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 32/222 wifi: ath12k: Optimize the mac80211 hw data access
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karthikeyan Periyasamy <[email protected]>
[ Upstream commit 842addae02089fce4731be1c8d7d539449d4d009 ]
Currently mac80211 hw data is accessed by convert the hw to radio (ar) structure and then radio to hw structure which is not necessary in some places where mac80211 hw data is already present. So in that kind of places avoid the conversion and directly access the mac80211 hw data.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Stable-dep-of: 8fac3266c68a ("wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()")
--- drivers/net/wireless/ath/ath12k/mac.c | 14 +++++++------- drivers/net/wireless/ath/ath12k/reg.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +7 -7
@@ -4945,7 +4945,7 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw,if (ret) {ath12k_warn (ar->ab,"failed to queue management frame %d\n" , ret); -ieee80211_free_txskb (ar->hw, skb); +ieee80211_free_txskb (hw, skb); }return ; }
@@ -4953,7 +4953,7 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw, ret =ath12k_dp_tx (ar, arvif, skb);if (ret) {ath12k_warn (ar->ab,"failed to transmit frame %d\n" , ret); -ieee80211_free_txskb (ar->hw, skb); +ieee80211_free_txskb (hw, skb); } }
@@ -5496,7 +5496,7 @@ static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw, goto err_peer_del; param_id =WMI_VDEV_PARAM_RTS_THRESHOLD ; - param_value = ar->hw->wiphy->rts_threshold; + param_value = hw->wiphy->rts_threshold; ret =ath12k_wmi_vdev_set_param_cmd (ar, arvif->vdev_id, param_id, param_value);if (ret) {
@@ -6676,7 +6676,7 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, arvif->vdev_id, ret);return ret; } -ieee80211_iterate_stations_atomic (ar->hw, +ieee80211_iterate_stations_atomic (hw, ath12k_mac_disable_peer_fixed_rate, arvif); } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
@@ -6722,14 +6722,14 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,return -EINVAL ; } -ieee80211_iterate_stations_atomic (ar->hw, +ieee80211_iterate_stations_atomic (hw, ath12k_mac_disable_peer_fixed_rate, arvif);mutex_lock (&ar->conf_mutex); arvif->bitrate_mask = *mask; -ieee80211_iterate_stations_atomic (ar->hw, +ieee80211_iterate_stations_atomic (hw, ath12k_mac_set_bitrate_mask_iter, arvif);
@@ -6767,7 +6767,7 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,ath12k_warn (ar->ab,"pdev %d successfully recovered\n" , ar->pdev->pdev_id); ar->state =ATH12K_STATE_ON ; -ieee80211_wake_queues (ar->hw); +ieee80211_wake_queues (hw);if (ab->is_reset) { recovery_count =atomic_inc_return (&ab->recovery_count);
drivers/net/wireless/ath/ath12k/reg.c +3 -3
@@ -28,11 +28,11 @@ static const struct ieee80211_regdomain ath12k_world_regd = { } }; -static bool ath12k_regdom_changes (struct ath12k *ar,char *alpha2) +static bool ath12k_regdom_changes (struct ieee80211_hw *hw,char *alpha2) {const struct ieee80211_regdomain *regd; - regd =rcu_dereference_rtnl (ar->hw->wiphy->regd); + regd =rcu_dereference_rtnl (hw->wiphy->regd);/* This can happen during wiphy registration where the previous * user request is received before we update the regd received * from firmware.
@@ -71,7 +71,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)return ; } -if (!ath12k_regdom_changes (ar, request->alpha2)) { +if (!ath12k_regdom_changes (hw, request->alpha2)) {ath12k_dbg (ar->ab,ATH12K_DBG_REG ,"Country is already set\n" );return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 33/222 wifi: mac80211: Add non-atomic station iterator
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rory Little <[email protected]>
[ Upstream commit 7c3b69eadea9e57c28bf914b0fd70f268f3682e1 ]
Drivers may at times want to iterate their stations with a function which requires some non-atomic operations.
ieee80211_iterate_stations_mtx() introduces an API to iterate stations while holding that wiphy's mutex. This allows the iterating function to do non-atomic operations safely.
Stable-dep-of: 8fac3266c68a ("wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()")
--- include/net/mac80211.h | 18 ++++++++++++++++++ net/mac80211/util.c | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-)
include/net/mac80211.h +18 -0
@@ -6080,6 +6080,24 @@ void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,void (*iterator)(void *data,struct ieee80211_sta *sta), void *data); + +/** +* ieee80211_iterate_stations_mtx - iterate stations +* +* This function iterates over all stations associated with a given +* hardware that are currently uploaded to the driver and calls the callback +* function for them. This version can only be used while holding the wiphy +* mutex. +* +* @hw: the hardware struct of which the interfaces should be iterated over +* @iterator: the iterator function to call +* @data: first argument of the iterator function +*/ +void ieee80211_iterate_stations_mtx (struct ieee80211_hw *hw, +void (*iterator)(void *data, +struct ieee80211_sta *sta), +void *data); +/** * ieee80211_queue_work - add work onto the mac80211 workqueue *
net/mac80211/util.c +15 -1
@@ -827,7 +827,8 @@ static void __iterate_stations(struct ieee80211_local *local, {struct sta_info *sta; -list_for_each_entry_rcu (sta, &local->sta_list, list) { +list_for_each_entry_rcu (sta, &local->sta_list, list, +lockdep_is_held (&local->hw.wiphy->mtx)) {if (!sta->uploaded)continue ;
@@ -848,6 +849,19 @@ void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (ieee80211_iterate_stations_atomic); +void ieee80211_iterate_stations_mtx (struct ieee80211_hw *hw, +void (*iterator)(void *data, +struct ieee80211_sta *sta), +void *data) +{ +struct ieee80211_local *local =hw_to_local (hw); + +lockdep_assert_wiphy (local->hw.wiphy); + +__iterate_stations (local, iterator, data); +} +EXPORT_SYMBOL_GPL (ieee80211_iterate_stations_mtx); +struct ieee80211_vif *wdev_to_ieee80211_vif (struct wireless_dev *wdev) {struct ieee80211_sub_if_data *sdata =IEEE80211_WDEV_TO_SUB_IF (wdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 34/222 wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalle Valo <[email protected]>
[ Upstream commit 8fac3266c68a8e647240b8ac8d0b82f1821edf85 ]
When I try to manually set bitrates:
iw wlan0 set bitrates legacy-2.4 1
I get sleeping from invalid context error, see below. Fix that by switching to use recently introduced ieee80211_iterate_stations_mtx().
Do note that WCN6855 firmware is still crashing, I'm not sure if that firmware even supports bitrate WMI commands and should we consider disabling ath12k_mac_op_set_bitrate_mask() for WCN6855? But that's for another patch.
BUG: sleeping function called from invalid context at drivers/net/wireless/ath/ath12k/wmi.c:420
in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 2236, name: iwpreempt_count: 0, expected: 0
RCU nest depth: 1, expected: 0
3 locks held by iw/2236:
#0: ffffffffabc6f1d8 (cb_lock){++++}-{3:3}, at: genl_rcv+0x14/0x40
#1: ffff888138410810 (&rdev->wiphy.mtx){+.+.}-{3:3}, at: nl80211_pre_doit+0x54d/0x800 [cfg80211] #2: ffffffffab2cfaa0 (rcu_read_lock){....}-{1:2}, at: ieee80211_iterate_stations_atomic+0x2f/0x200 [mac80211]
CPU: 3 UID: 0 PID: 2236 Comm: iw Not tainted 6.11.0-rc7-wt-ath+ #1772 Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021 Call Trace: <TASK> dump_stack_lvl+0xa4/0xe0 dump_stack+0x10/0x20 __might_resched+0x363/0x5a0 ? __alloc_skb+0x165/0x340 __might_sleep+0xad/0x160 ath12k_wmi_cmd_send+0xb1/0x3d0 [ath12k] ? ath12k_wmi_init_wcn7850+0xa40/0xa40 [ath12k] ? __netdev_alloc_skb+0x45/0x7b0 ? __asan_memset+0x39/0x40 ? ath12k_wmi_alloc_skb+0xf0/0x150 [ath12k] ? reacquire_held_locks+0x4d0/0x4d0 ath12k_wmi_set_peer_param+0x340/0x5b0 [ath12k] ath12k_mac_disable_peer_fixed_rate+0xa3/0x110 [ath12k] ? ath12k_mac_vdev_stop+0x4f0/0x4f0 [ath12k] ieee80211_iterate_stations_atomic+0xd4/0x200 [mac80211] ath12k_mac_op_set_bitrate_mask+0x5d2/0x1080 [ath12k] ? ath12k_mac_vif_chan+0x320/0x320 [ath12k] drv_set_bitrate_mask+0x267/0x470 [mac80211] ieee80211_set_bitrate_mask+0x4cc/0x8a0 [mac80211] ? __this_cpu_preempt_check+0x13/0x20 nl80211_set_tx_bitrate_mask+0x2bc/0x530 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? trace_contention_end+0xef/0x140 ? rtnl_unlock+0x9/0x10 ? nl80211_pre_doit+0x557/0x800 [cfg80211] genl_family_rcv_msg_doit+0x1f0/0x2e0 ? genl_family_rcv_msg_attrs_parse.isra.0+0x250/0x250 ? ns_capable+0x57/0xd0 genl_family_rcv_msg+0x34c/0x600 ? genl_family_rcv_msg_dumpit+0x310/0x310 ? __lock_acquire+0xc62/0x1de0 ? he_set_mcs_mask.isra.0+0x8d0/0x8d0 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? cfg80211_external_auth_request+0x690/0x690 [cfg80211] genl_rcv_msg+0xa0/0x130 netlink_rcv_skb+0x14c/0x400 ? genl_family_rcv_msg+0x600/0x600 ? netlink_ack+0xd70/0xd70 ? rwsem_optimistic_spin+0x4f0/0x4f0 ? genl_rcv+0x14/0x40 ? down_read_killable+0x580/0x580 ? netlink_deliver_tap+0x13e/0x350 ? __this_cpu_preempt_check+0x13/0x20 genl_rcv+0x23/0x40 netlink_unicast+0x45e/0x790 ? netlink_attachskb+0x7f0/0x7f0 netlink_sendmsg+0x7eb/0xdb0 ? netlink_unicast+0x790/0x790 ? __this_cpu_preempt_check+0x13/0x20 ? selinux_socket_sendmsg+0x31/0x40 ? netlink_unicast+0x790/0x790 __sock_sendmsg+0xc9/0x160 ____sys_sendmsg+0x620/0x990 ? kernel_sendmsg+0x30/0x30 ? __copy_msghdr+0x410/0x410 ? __kasan_check_read+0x11/0x20 ? mark_lock+0xe6/0x1470 ___sys_sendmsg+0xe9/0x170 ? copy_msghdr_from_user+0x120/0x120 ? __lock_acquire+0xc62/0x1de0 ? do_fault_around+0x2c6/0x4e0 ? do_user_addr_fault+0x8c1/0xde0 ? reacquire_held_locks+0x220/0x4d0 ? do_user_addr_fault+0x8c1/0xde0 ? __kasan_check_read+0x11/0x20 ? __fdget+0x4e/0x1d0 ? sockfd_lookup_light+0x1a/0x170 __sys_sendmsg+0xd2/0x180 ? __sys_sendmsg_sock+0x20/0x20 ? reacquire_held_locks+0x4d0/0x4d0 ? debug_smp_processor_id+0x17/0x20 __x64_sys_sendmsg+0x72/0xb0 ? lockdep_hardirqs_on+0x7d/0x100 x64_sys_call+0x894/0x9f0 do_syscall_64+0x64/0x130 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7f230fe04807 Code: 64 89 02 48 c7 c0 ff ff ff ff eb bb 0f 1f 80 00 00 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10 RSP: 002b:00007ffe996a7ea8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000556f9f9c3390 RCX: 00007f230fe04807 RDX: 0000000000000000 RSI: 00007ffe996a7ee0 RDI: 0000000000000003 RBP: 0000556f9f9c88c0 R08: 0000000000000002 R09: 0000000000000000 R10: 0000556f965ca190 R11: 0000000000000246 R12: 0000556f9f9c8780 R13: 00007ffe996a7ee0 R14: 0000556f9f9c87d0 R15: 0000556f9f9c88c0 </TASK>
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +9 -9
@@ -6676,9 +6676,9 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, arvif->vdev_id, ret);return ret; } -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_disable_peer_fixed_rate, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_disable_peer_fixed_rate, + arvif); }else if (ath12k_mac_bitrate_mask_get_single_nss (ar, band, mask, &single_nss)) { rate =WMI_FIXED_RATE_NONE ;
@@ -6722,16 +6722,16 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,return -EINVAL ; } -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_disable_peer_fixed_rate, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_disable_peer_fixed_rate, + arvif);mutex_lock (&ar->conf_mutex); arvif->bitrate_mask = *mask; -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_set_bitrate_mask_iter, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_set_bitrate_mask_iter, + arvif);mutex_unlock (&ar->conf_mutex); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 35/222 wifi: ath10k: Update Qualcomm Innovation Center, Inc. copyrights
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Johnson <[email protected]>
[ Upstream commit b1dc0ba41431147e55407140962c76f3e7a06753 ]
Update the copyright for all ath10k files modified on behalf of Qualcomm Innovation Center, Inc. in 2021 through 2023.
Stable-dep-of: 95c38953cb1e ("wifi: ath10k: avoid NULL pointer error during sdio remove")
--- drivers/net/wireless/ath/ath10k/bmi.c | 1 + drivers/net/wireless/ath/ath10k/ce.c | 1 + drivers/net/wireless/ath/ath10k/core.c | 1 + drivers/net/wireless/ath/ath10k/core.h | 1 + drivers/net/wireless/ath/ath10k/coredump.c | 1 + drivers/net/wireless/ath/ath10k/coredump.h | 1 + drivers/net/wireless/ath/ath10k/debug.c | 1 + drivers/net/wireless/ath/ath10k/debugfs_sta.c | 1 + drivers/net/wireless/ath/ath10k/htc.c | 1 + drivers/net/wireless/ath/ath10k/htt.h | 1 + drivers/net/wireless/ath/ath10k/htt_rx.c | 1 + drivers/net/wireless/ath/ath10k/htt_tx.c | 1 + drivers/net/wireless/ath/ath10k/hw.c | 1 + drivers/net/wireless/ath/ath10k/hw.h | 1 + drivers/net/wireless/ath/ath10k/mac.c | 1 + drivers/net/wireless/ath/ath10k/pci.c | 1 + drivers/net/wireless/ath/ath10k/pci.h | 1 + drivers/net/wireless/ath/ath10k/qmi.c | 1 + drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c | 1 + drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h | 1 + drivers/net/wireless/ath/ath10k/rx_desc.h | 1 + drivers/net/wireless/ath/ath10k/sdio.c | 1 + drivers/net/wireless/ath/ath10k/thermal.c | 1 + drivers/net/wireless/ath/ath10k/usb.h | 1 + drivers/net/wireless/ath/ath10k/wmi-tlv.h | 1 + drivers/net/wireless/ath/ath10k/wmi.c | 1 + drivers/net/wireless/ath/ath10k/wmi.h | 1 + drivers/net/wireless/ath/ath10k/wow.c | 1 + 28 files changed, 28 insertions(+)
drivers/net/wireless/ath/ath10k/bmi.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2014,2016-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "bmi.h"
drivers/net/wireless/ath/ath10k/ce.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "hif.h"
drivers/net/wireless/ath/ath10k/core.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/module.h>
drivers/net/wireless/ath/ath10k/core.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _CORE_H_
drivers/net/wireless/ath/ath10k/coredump.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "coredump.h"
drivers/net/wireless/ath/ath10k/coredump.h +1 -0
@@ -1,6 +1,7 @@/* SPDX-License-Identifier: ISC */ /* * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _COREDUMP_H_
drivers/net/wireless/ath/ath10k/debug.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/module.h>
drivers/net/wireless/ath/ath10k/debugfs_sta.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2014-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "core.h"
drivers/net/wireless/ath/ath10k/htc.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "core.h"
drivers/net/wireless/ath/ath10k/htt.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _HTT_H_
drivers/net/wireless/ath/ath10k/htt_rx.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "core.h"
drivers/net/wireless/ath/ath10k/htt_tx.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/etherdevice.h>
drivers/net/wireless/ath/ath10k/hw.c +1 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: ISC /* * Copyright (c) 2014-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/types.h>
drivers/net/wireless/ath/ath10k/hw.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _HW_H_
drivers/net/wireless/ath/ath10k/mac.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "mac.h"
drivers/net/wireless/ath/ath10k/pci.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/pci.h>
drivers/net/wireless/ath/ath10k/pci.h +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _PCI_H_
drivers/net/wireless/ath/ath10k/qmi.c +1 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: ISC /* * Copyright (c) 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/completion.h>
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c +1 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: ISC /* * Copyright (c) 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/soc/qcom/qmi.h>
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h +1 -0
@@ -1,6 +1,7 @@/* SPDX-License-Identifier: ISC */ /* * Copyright (c) 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef WCN3990_QMI_SVC_V01_H
drivers/net/wireless/ath/ath10k/rx_desc.h +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _RX_DESC_H_
drivers/net/wireless/ath/ath10k/sdio.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2004-2011 Atheros Communications Inc. * Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc. * Copyright (c) 2016-2017 Erik Stromdahl <[email protected]> +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/module.h>
drivers/net/wireless/ath/ath10k/thermal.c +1 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: ISC /* * Copyright (c) 2014-2015 Qualcomm Atheros, Inc. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/device.h>
drivers/net/wireless/ath/ath10k/usb.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2004-2011 Atheros Communications Inc. * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. * Copyright (c) 2016-2017 Erik Stromdahl <[email protected]> +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _USB_H_
drivers/net/wireless/ath/ath10k/wmi-tlv.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _WMI_TLV_H#define _WMI_TLV_H
drivers/net/wireless/ath/ath10k/wmi.c +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/skbuff.h>
drivers/net/wireless/ath/ath10k/wmi.h +1 -0
@@ -3,6 +3,7 @@* Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _WMI_H_
drivers/net/wireless/ath/ath10k/wow.c +1 -0
@@ -2,6 +2,7 @@/* * Copyright (c) 2015-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018, The Linux Foundation. All rights reserved. +* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "mac.h"
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 36/222 wifi: ath10k: avoid NULL pointer error during sdio remove
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kang Yang <[email protected]>
[ Upstream commit 95c38953cb1ecf40399a676a1f85dfe2b5780a9a ]
When running 'rmmod ath10k', ath10k_sdio_remove() will free sdio workqueue by destroy_workqueue(). But if CONFIG_INIT_ON_FREE_DEFAULT_ON is set to yes, kernel panic will happen:
Call trace: destroy_workqueue+0x1c/0x258 ath10k_sdio_remove+0x84/0x94 sdio_bus_remove+0x50/0x16c device_release_driver_internal+0x188/0x25c device_driver_detach+0x20/0x2c
This is because during 'rmmod ath10k', ath10k_sdio_remove() will call ath10k_core_destroy() before destroy_workqueue(). wiphy_dev_release() will finally be called in ath10k_core_destroy(). This function will free struct cfg80211_registered_device *rdev and all its members, including wiphy, dev and the pointer of sdio workqueue. Then the pointer of sdio workqueue will be set to NULL due to CONFIG_INIT_ON_FREE_DEFAULT_ON.
After device release, destroy_workqueue() will use NULL pointer then the kernel panic happen.
Call trace:
ath10k_sdio_remove
->ath10k_core_unregister
……
->ath10k_core_stop
->ath10k_hif_stop
->ath10k_sdio_irq_disable
->ath10k_hif_power_down
->del_timer_sync(&ar_sdio->sleep_timer)
->ath10k_core_destroy
->ath10k_mac_destroy
->ieee80211_free_hw
->wiphy_free
……
->wiphy_dev_release->destroy_workqueue
Need to call destroy_workqueue() before ath10k_core_destroy(), free the work queue buffer first and then free pointer of work queue by ath10k_core_destroy(). This order matches the error path order in ath10k_sdio_probe().
No work will be queued on sdio workqueue between it is destroyed and ath10k_core_destroy() is called. Based on the call_stack above, the reason is:
Only ath10k_sdio_sleep_timer_handler(), ath10k_sdio_hif_tx_sg() and ath10k_sdio_irq_disable() will queue work on sdio workqueue. Sleep timer will be deleted before ath10k_core_destroy() in ath10k_hif_power_down().ath10k_sdio_irq_disable() only be called in ath10k_hif_stop(). ath10k_core_unregister() will call ath10k_hif_power_down() to stop hif bus, so ath10k_sdio_hif_tx_sg() won't be called anymore.
Tested-on: QCA6174 hw3.2 SDIO WLAN.RMH.4.4.1-00189
--- drivers/net/wireless/ath/ath10k/sdio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath10k/sdio.c +3 -3
@@ -3,7 +3,7 @@* Copyright (c) 2004-2011 Atheros Communications Inc. * Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc. * Copyright (c) 2016-2017 Erik Stromdahl <[email protected]> -* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/module.h>
@@ -2648,9 +2648,9 @@ static void ath10k_sdio_remove(struct sdio_func *func)netif_napi_del (&ar->napi); -ath10k_core_destroy (ar); -destroy_workqueue (ar_sdio->workqueue); + +ath10k_core_destroy (ar); }static const struct sdio_device_id ath10k_sdio_devices[] = {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 37/222 i2c: i801: Add support for Intel Arrow Lake-H
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Nikula <[email protected]>
[ Upstream commit f0eda4ddb2146a9f29d31b54c396f741bd0c82f1 ]
Add SMBus PCI ID on Intel Arrow Lake-H.
Stable-dep-of: bd492b583712 ("i2c: i801: Add support for Intel Panther Lake")
--- Documentation/i2c/busses/i2c-i801.rst | 1 + drivers/i2c/busses/Kconfig | 1 + drivers/i2c/busses/i2c-i801.c | 3 +++ 3 files changed, 5 insertions(+)
Documentation/i2c/busses/i2c-i801.rst +1 -0
@@ -48,6 +48,7 @@ Supported adapters: * Intel Raptor Lake (PCH) * Intel Meteor Lake (SOC and PCH) * Intel Birch Stream (SOC) + * Intel Arrow Lake (SOC) Datasheets: Publicly available at the Intel website
drivers/i2c/busses/Kconfig +1 -0
@@ -159,6 +159,7 @@ config I2C_I801 Raptor Lake (PCH) Meteor Lake (SOC and PCH) Birch Stream (SOC) + Arrow Lake (SOC) This driver can also be built as a module. If so, the module will be called i2c-i801.
drivers/i2c/busses/i2c-i801.c +3 -0
@@ -80,6 +80,7 @@* Meteor Lake SoC-S (SOC) 0xae22 32 hard yes yes yes * Meteor Lake PCH-S (PCH) 0x7f23 32 hard yes yes yes * Birch Stream (SOC) 0x5796 32 hard yes yes yes +* Arrow Lake-H (SOC) 0x7722 32 hard yes yes yes * * Features supported by this driver: * Software PEC no
@@ -234,6 +235,7 @@#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_M_SMBUS 0x54a3#define PCI_DEVICE_ID_INTEL_BIRCH_STREAM_SMBUS 0x5796#define PCI_DEVICE_ID_INTEL_BROXTON_SMBUS 0x5ad4 +#define PCI_DEVICE_ID_INTEL_ARROW_LAKE_H_SMBUS 0x7722#define PCI_DEVICE_ID_INTEL_RAPTOR_LAKE_S_SMBUS 0x7a23#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS 0x7aa3#define PCI_DEVICE_ID_INTEL_METEOR_LAKE_P_SMBUS 0x7e22
@@ -1046,6 +1048,7 @@ static const struct pci_device_id i801_ids[] = { { PCI_DEVICE_DATA(INTEL, METEOR_LAKE_SOC_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { PCI_DEVICE_DATA(INTEL, METEOR_LAKE_PCH_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { PCI_DEVICE_DATA(INTEL, BIRCH_STREAM_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, + { PCI_DEVICE_DATA(INTEL, ARROW_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { 0, } };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 38/222 i2c: i801: Add support for Intel Panther Lake
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Nikula <[email protected]>
[ Upstream commit bd492b58371295d3ae26162b9666be584abad68a ]
Add SMBus PCI IDs on Intel Panther Lake-P and -U.
--- Documentation/i2c/busses/i2c-i801.rst | 1 + drivers/i2c/busses/Kconfig | 1 + drivers/i2c/busses/i2c-i801.c | 6 ++++++ 3 files changed, 8 insertions(+)
Documentation/i2c/busses/i2c-i801.rst +1 -0
@@ -49,6 +49,7 @@ Supported adapters: * Intel Meteor Lake (SOC and PCH) * Intel Birch Stream (SOC) * Intel Arrow Lake (SOC) + * Intel Panther Lake (SOC) Datasheets: Publicly available at the Intel website
drivers/i2c/busses/Kconfig +1 -0
@@ -160,6 +160,7 @@ config I2C_I801 Meteor Lake (SOC and PCH) Birch Stream (SOC) Arrow Lake (SOC) + Panther Lake (SOC) This driver can also be built as a module. If so, the module will be called i2c-i801.
drivers/i2c/busses/i2c-i801.c +6 -0
@@ -81,6 +81,8 @@* Meteor Lake PCH-S (PCH) 0x7f23 32 hard yes yes yes * Birch Stream (SOC) 0x5796 32 hard yes yes yes * Arrow Lake-H (SOC) 0x7722 32 hard yes yes yes +* Panther Lake-H (SOC) 0xe322 32 hard yes yes yes +* Panther Lake-P (SOC) 0xe422 32 hard yes yes yes * * Features supported by this driver: * Software PEC no
@@ -258,6 +260,8 @@#define PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS 0xa323#define PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS 0xa3a3#define PCI_DEVICE_ID_INTEL_METEOR_LAKE_SOC_S_SMBUS 0xae22 +#define PCI_DEVICE_ID_INTEL_PANTHER_LAKE_H_SMBUS 0xe322 +#define PCI_DEVICE_ID_INTEL_PANTHER_LAKE_P_SMBUS 0xe422struct i801_mux_config {char *gpio_chip;
@@ -1049,6 +1053,8 @@ static const struct pci_device_id i801_ids[] = { { PCI_DEVICE_DATA(INTEL, METEOR_LAKE_PCH_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { PCI_DEVICE_DATA(INTEL, BIRCH_STREAM_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { PCI_DEVICE_DATA(INTEL, ARROW_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, + { PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, + { PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_P_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, { 0, } };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 39/222 Bluetooth: hci_conn: Reduce hci_conn_drop() calls in two functions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Elfring <[email protected]>
[ Upstream commit d96b543c6f3b78b6440b68b5a5bbface553eff28 ]
An hci_conn_drop() call was immediately used after a null pointer check for an hci_conn_link() call in two function implementations. Thus call such a function only once instead directly before the checks.
This issue was transformed by using the Coccinelle software.
--- net/bluetooth/hci_conn.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
net/bluetooth/hci_conn.c +3 -10
@@ -2178,13 +2178,9 @@ struct hci_conn *hci_bind_bis(struct hci_dev *hdev, bdaddr_t *dst, conn->iso_qos.bcast.big);if (parent && parent != conn) { link =hci_conn_link (parent, conn); -if (!link) { -hci_conn_drop (conn); -return ERR_PTR (-ENOLINK ); - } - -/* Link takes the refcount */ hci_conn_drop (conn); +if (!link) +return ERR_PTR (-ENOLINK ); }return conn;
@@ -2274,15 +2270,12 @@ struct hci_conn *hci_connect_cis(struct hci_dev *hdev, bdaddr_t *dst, } link =hci_conn_link (le, cis); +hci_conn_drop (cis);if (!link) {hci_conn_drop (le); -hci_conn_drop (cis);return ERR_PTR (-ENOLINK ); } -/* Link takes the refcount */ -hci_conn_drop (cis); - cis->state =BT_CONNECT ;hci_le_create_cis_pending (hdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 40/222 Bluetooth: Add support ITTIM PE50-M75C
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jingyang Wang <[email protected]>
[ Upstream commit 00b1c3c4b682ba4b4f9fc46e047b537e668576af ]
-Device(35f5:7922) from /sys/kernel/debug/usb/devices
P: Vendor=35f5 ProdID=7922 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
Stable-dep-of: faa5fd605d20 ("Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925")
--- drivers/bluetooth/btusb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/btusb.c +3 -0
@@ -658,6 +658,9 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x04ca, 0x3804), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x35f5, 0x7922), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, /* Additional Realtek 8723AE Bluetooth devices */ { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 41/222 Bluetooth: btusb: Add new VID/PID 13d3/3602 for MT7925
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulrik Strid <[email protected]>
[ Upstream commit 560ff4bc99070bfb493018b6b7045af269a008a4 ]
Add VID 13d3 & PID 3602 for MediaTek MT7925 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=07 Lev=01 Prnt=01 Port=10 Cnt=02 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=13d3 ProdID=3602 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
Stable-dep-of: faa5fd605d20 ("Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925")
--- drivers/bluetooth/btusb.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/bluetooth/btusb.c +5 -0
@@ -662,6 +662,11 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, +/* Additional MediaTek MT7925 Bluetooth devices */ + { USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, + /* Additional Realtek 8723AE Bluetooth devices */ { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 42/222 Bluetooth: btusb: Add USB HW IDs for MT7921/MT7922/MT7925
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiande Lu <[email protected]>
[ Upstream commit 129d329286f624b0ccd66e904a2c27eb4d5196e5 ]
Add HW IDs for wireless module specific to Acer/ASUS notebook models to ensure proper recognition and functionality. These HW IDs are extracted from Windows driver inf file. Note some HW IDs without official drivers, still in testing phase. Thus, we update module HW ID and test ensure consistent boot success.
Stable-dep-of: faa5fd605d20 ("Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925")
--- drivers/bluetooth/btusb.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/bluetooth/btusb.c +24 -0
@@ -620,6 +620,9 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x0e8d, 0x0608), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3606), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, /* MediaTek MT7922A Bluetooth devices */ { USB_DEVICE(0x0489, 0xe0d8), .driver_info = BTUSB_MEDIATEK |
@@ -661,11 +664,32 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x35f5, 0x7922), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3614), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3615), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x04ca, 0x38e4), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3605), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3607), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, /* Additional MediaTek MT7925 Bluetooth devices */ + { USB_DEVICE(0x0489, 0xe113), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, { USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, /* Additional Realtek 8723AE Bluetooth devices */ { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 43/222 Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Qin <[email protected]>
[ Upstream commit faa5fd605d2081b6c9fa2355b59582d4ccd24b16 ]
Add VID 0489 & PID e111 for MediaTek MT7925 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=02 Lev=02 Prnt=02 Port=04 Cnt=02 Dev#= 4 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0489 ProdID=e111 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -681,6 +681,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_VALID_LE_STATES },/* Additional MediaTek MT7925 Bluetooth devices */ + { USB_DEVICE(0x0489, 0xe111), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0489, 0xe113), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 44/222 scsi: hisi_sas: Directly call register snapshot instead of using workqueue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihang Li <[email protected]>
[ Upstream commit 2ff07b5c6fe9173e7a7de3b23f300d71ad4d8fde ]
Currently, register information dump is performed via workqueue, regardless of the trigger mode (automatic or manual). There is a delay in dumping register through workqueue, the exact register information at trigger time cannot be obtained.
Call register snapshot directly instead of through a workqueue.
Stable-dep-of: 9f564f15f884 ("scsi: hisi_sas: Create all dump files during debugfs initialization")
--- drivers/scsi/hisi_sas/hisi_sas.h | 1 - drivers/scsi/hisi_sas/hisi_sas_main.c | 7 +++++-- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 14 +++----------- 3 files changed, 8 insertions(+), 14 deletions(-)
drivers/scsi/hisi_sas/hisi_sas.h +0 -1
@@ -451,7 +451,6 @@ struct hisi_hba {const struct hisi_sas_hw *hw;/* Low level hw interface */ unsigned long sata_dev_bitmap[BITS_TO_LONGS (HISI_SAS_MAX_DEVICES )];struct work_struct rst_work; -struct work_struct debugfs_work;u32 phy_state;u32 intr_coal_ticks;/* Time of interrupt coalesce in us */ u32 intr_coal_count;/* Interrupt count to coalesce */
drivers/scsi/hisi_sas/hisi_sas_main.c +5 -2
@@ -1967,8 +1967,11 @@ static bool hisi_sas_internal_abort_timeout(struct sas_task *task,struct hisi_hba *hisi_hba =dev_to_hisi_hba (device);struct hisi_sas_internal_abort_data *timeout = data; -if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0 ].itct) -queue_work (hisi_hba->wq, &hisi_hba->debugfs_work); +if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0 ].itct) { +down (&hisi_hba->sem); + hisi_hba->hw->debugfs_snapshot_regs (hisi_hba); +up (&hisi_hba->sem); + }if (task->task_state_flags &SAS_TASK_STATE_DONE ) { pr_err("Internal abort: timeout %016llx\n",
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +3 -11
@@ -558,7 +558,6 @@ static int experimental_iopoll_q_cnt;module_param (experimental_iopoll_q_cnt, int,0444 );MODULE_PARM_DESC (experimental_iopoll_q_cnt,"number of queues to be used as poll mode, def=0" ); -static void debugfs_work_handler_v3_hw (struct work_struct *work);static void debugfs_snapshot_regs_v3_hw (struct hisi_hba *hisi_hba);static u32 hisi_sas_read32 (struct hisi_hba *hisi_hba,u32 off)
@@ -3397,7 +3396,6 @@ hisi_sas_shost_alloc_pci(struct pci_dev *pdev) hisi_hba =shost_priv (shost);INIT_WORK (&hisi_hba->rst_work, hisi_sas_rst_work_handler); -INIT_WORK (&hisi_hba->debugfs_work, debugfs_work_handler_v3_hw); hisi_hba->hw = &hisi_sas_v3_hw; hisi_hba->pci_dev = pdev; hisi_hba->dev = dev;
@@ -3919,7 +3917,9 @@ static ssize_t debugfs_trigger_dump_v3_hw_write(struct file *file,if (buf[0 ] !='1' )return -EFAULT ; -queue_work (hisi_hba->wq, &hisi_hba->debugfs_work); +down (&hisi_hba->sem); +debugfs_snapshot_regs_v3_hw (hisi_hba); +up (&hisi_hba->sem);return count; }
@@ -4670,14 +4670,6 @@ static void debugfs_fifo_init_v3_hw(struct hisi_hba *hisi_hba) } } -static void debugfs_work_handler_v3_hw (struct work_struct *work) -{ -struct hisi_hba *hisi_hba = - container_of(work, struct hisi_hba, debugfs_work); - -debugfs_snapshot_regs_v3_hw (hisi_hba); -} -static void debugfs_release_v3_hw (struct hisi_hba *hisi_hba,int dump_index) {struct device *dev = hisi_hba->dev;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 45/222 scsi: hisi_sas: Allocate DFX memory during dump trigger
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihang Li <[email protected]>
[ Upstream commit 63f0733d07ce60252e885602b39571ade0441015 ]
Currently, if CONFIG_SCSI_HISI_SAS_DEBUGFS_DEFAULT_ENABLE is enabled, the memory space used by DFX is allocated during device initialization, which occupies a large number of memory resources. The memory usage before and after the driver is loaded is as follows:
Memory usage before the driver is loaded:
$ free -m
total used free shared buff/cache available
Mem: 867352 2578 864037 11 735 861681
Swap: 4095 0 4095Memory usage after the driver which include 4 HBAs is loaded:
$ insmod hisi_sas_v3_hw.ko
$ free -m
total used free shared buff/cache available
Mem: 867352 4760 861848 11 743 859495
Swap: 4095 0 4095The driver with 4 HBAs connected will allocate about 110 MB of memory without enabling debugfs.
Therefore, to avoid wasting memory resources, DFX memory is allocated during dump triggering. The dump may fail due to memory allocation failure. After this change, each dump costs about 10 MB of memory, and each dump lasts about 100 ms.
Stable-dep-of: 9f564f15f884 ("scsi: hisi_sas: Create all dump files during debugfs initialization")
--- drivers/scsi/hisi_sas/hisi_sas.h | 2 +- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 93 +++++++++++++------------- 2 files changed, 46 insertions(+), 49 deletions(-)
drivers/scsi/hisi_sas/hisi_sas.h +1 -1
@@ -343,7 +343,7 @@ struct hisi_sas_hw { u8 reg_index, u8 reg_count, u8 *write_data);void (*wait_cmds_complete_timeout)(struct hisi_hba *hisi_hba,int delay_ms,int timeout_ms); -void (*debugfs_snapshot_regs)(struct hisi_hba *hisi_hba); +int (*debugfs_snapshot_regs)(struct hisi_hba *hisi_hba);int complete_hdr_size;const struct scsi_host_template *sht; };
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +45 -48
144 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 46/222 scsi: hisi_sas: Create all dump files during debugfs initialization
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihang Li <[email protected]>
[ Upstream commit 9f564f15f88490b484e02442dc4c4b11640ea172 ]
For the current debugfs of hisi_sas, after user triggers dump, the driver allocate memory space to save the register information and create debugfs files to display the saved information. In this process, the debugfs files created after each dump.
Therefore, when the dump is triggered while the driver is unbind, the following hang occurs:
[67840.853907] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a0 [67840.862947] Mem abort info: [67840.865855] ESR = 0x0000000096000004 [67840.869713] EC = 0x25: DABT (current EL), IL = 32 bits [67840.875125] SET = 0, FnV = 0 [67840.878291] EA = 0, S1PTW = 0 [67840.881545] FSC = 0x04: level 0 translation fault [67840.886528] Data abort info: [67840.889524] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [67840.895117] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [67840.900284] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [67840.905709] user pgtable: 4k pages, 48-bit VAs, pgdp=0000002803a1f000 [67840.912263] [00000000000000a0] pgd=0000000000000000, p4d=0000000000000000 [67840.919177] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP [67840.996435] pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [67841.003628] pc : down_write+0x30/0x98 [67841.007546] lr : start_creating.part.0+0x60/0x198 [67841.012495] sp : ffff8000b979ba20 [67841.016046] x29: ffff8000b979ba20 x28: 0000000000000010 x27: 0000000000024b40 [67841.023412] x26: 0000000000000012 x25: ffff20202b355ae8 x24: ffff20202b35a8c8 [67841.030779] x23: ffffa36877928208 x22: ffffa368b4972240 x21: ffff8000b979bb18 [67841.038147] x20: ffff00281dc1e3c0 x19: fffffffffffffffe x18: 0000000000000020 [67841.045515] x17: 0000000000000000 x16: ffffa368b128a530 x15: ffffffffffffffff [67841.052888] x14: ffff8000b979bc18 x13: ffffffffffffffff x12: ffff8000b979bb18 [67841.060263] x11: 0000000000000000 x10: 0000000000000000 x9 : ffffa368b1289b18 [67841.067640] x8 : 0000000000000012 x7 : 0000000000000000 x6 : 00000000000003a9 [67841.075014] x5 : 0000000000000000 x4 : ffff002818c5cb00 x3 : 0000000000000001 [67841.082388] x2 : 0000000000000000 x1 : ffff002818c5cb00 x0 : 00000000000000a0 [67841.089759] Call trace: [67841.092456] down_write+0x30/0x98 [67841.096017] start_creating.part.0+0x60/0x198 [67841.100613] debugfs_create_dir+0x48/0x1f8 [67841.104950] debugfs_create_files_v3_hw+0x88/0x348 [hisi_sas_v3_hw] [67841.111447] debugfs_snapshot_regs_v3_hw+0x708/0x798 [hisi_sas_v3_hw] [67841.118111] debugfs_trigger_dump_v3_hw_write+0x9c/0x120 [hisi_sas_v3_hw] [67841.125115] full_proxy_write+0x68/0xc8 [67841.129175] vfs_write+0xd8/0x3f0 [67841.132708] ksys_write+0x70/0x108 [67841.136317] __arm64_sys_write+0x24/0x38 [67841.140440] invoke_syscall+0x50/0x128 [67841.144385] el0_svc_common.constprop.0+0xc8/0xf0 [67841.149273] do_el0_svc+0x24/0x38 [67841.152773] el0_svc+0x38/0xd8 [67841.156009] el0t_64_sync_handler+0xc0/0xc8 [67841.160361] el0t_64_sync+0x1a4/0x1a8 [67841.164189] Code: b9000882 d2800002 d2800023 f9800011 (c85ffc05) [67841.170443] ---[ end trace 0000000000000000 ]---
To fix this issue, create all directories and files during debugfs initialization. In this way, the driver only needs to allocate memory space to save information each time the user triggers dumping.
--- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 99 ++++++++++++++++++++------ 1 file changed, 77 insertions(+), 22 deletions(-)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +77 -22
@@ -3560,6 +3560,11 @@ debugfs_to_reg_name_v3_hw(int off, int base_off,return NULL ; } +static bool debugfs_dump_is_generated_v3_hw (void *p) +{ +return p ? true : false; +} +static void debugfs_print_reg_v3_hw (u32 *regs_val,struct seq_file *s,const struct hisi_sas_debugfs_reg *reg) {
@@ -3585,6 +3590,9 @@ static int debugfs_global_v3_hw_show(struct seq_file *s, void *p) {struct hisi_sas_debugfs_regs *global = s->private; +if (!debugfs_dump_is_generated_v3_hw (global->data)) +return -EPERM ; +debugfs_print_reg_v3_hw (global->data, s, &debugfs_global_reg);
@@ -3596,6 +3604,9 @@ static int debugfs_axi_v3_hw_show(struct seq_file *s, void *p) {struct hisi_sas_debugfs_regs *axi = s->private; +if (!debugfs_dump_is_generated_v3_hw (axi->data)) +return -EPERM ; +debugfs_print_reg_v3_hw (axi->data, s, &debugfs_axi_reg);
@@ -3607,6 +3618,9 @@ static int debugfs_ras_v3_hw_show(struct seq_file *s, void *p) {struct hisi_sas_debugfs_regs *ras = s->private; +if (!debugfs_dump_is_generated_v3_hw (ras->data)) +return -EPERM ; +debugfs_print_reg_v3_hw (ras->data, s, &debugfs_ras_reg);
@@ -3619,6 +3633,9 @@ static int debugfs_port_v3_hw_show(struct seq_file *s, void *p)struct hisi_sas_debugfs_port *port = s->private;const struct hisi_sas_debugfs_reg *reg_port = &debugfs_port_reg; +if (!debugfs_dump_is_generated_v3_hw (port->data)) +return -EPERM ; +debugfs_print_reg_v3_hw (port->data, s, reg_port);return 0 ;
@@ -3674,6 +3691,9 @@ static int debugfs_cq_v3_hw_show(struct seq_file *s, void *p)struct hisi_sas_debugfs_cq *debugfs_cq = s->private;int slot; +if (!debugfs_dump_is_generated_v3_hw (debugfs_cq->complete_hdr)) +return -EPERM ; +for (slot =0 ; slot <HISI_SAS_QUEUE_SLOTS ; slot++)debugfs_cq_show_slot_v3_hw (s, slot, debugfs_cq);
@@ -3695,8 +3715,12 @@ static void debugfs_dq_show_slot_v3_hw(struct seq_file *s, int slot,static int debugfs_dq_v3_hw_show (struct seq_file *s,void *p) { +struct hisi_sas_debugfs_dq *debugfs_dq = s->private;int slot; +if (!debugfs_dump_is_generated_v3_hw (debugfs_dq->hdr)) +return -EPERM ; +for (slot =0 ; slot <HISI_SAS_QUEUE_SLOTS ; slot++)debugfs_dq_show_slot_v3_hw (s, slot, s->private);
@@ -3710,6 +3734,9 @@ static int debugfs_iost_v3_hw_show(struct seq_file *s, void *p)struct hisi_sas_iost *iost = debugfs_iost->iost;int i, max_command_entries =HISI_SAS_MAX_COMMANDS ; +if (!debugfs_dump_is_generated_v3_hw (iost)) +return -EPERM ; +for (i =0 ; i < max_command_entries; i++, iost++) {__le64 *data = &iost->qw0;
@@ -3729,6 +3756,9 @@ static int debugfs_iost_cache_v3_hw_show(struct seq_file *s, void *p)int i, tab_idx;__le64 *iost; +if (!debugfs_dump_is_generated_v3_hw (iost_cache)) +return -EPERM ; +for (i =0 ; i <HISI_SAS_IOST_ITCT_CACHE_NUM ; i++, iost_cache++) {/* * Data struct of IOST cache:
@@ -3752,6 +3782,9 @@ static int debugfs_itct_v3_hw_show(struct seq_file *s, void *p)struct hisi_sas_debugfs_itct *debugfs_itct = s->private;struct hisi_sas_itct *itct = debugfs_itct->itct; +if (!debugfs_dump_is_generated_v3_hw (itct)) +return -EPERM ; +for (i =0 ; i <HISI_SAS_MAX_ITCT_ENTRIES ; i++, itct++) {__le64 *data = &itct->qw0;
@@ -3771,6 +3804,9 @@ static int debugfs_itct_cache_v3_hw_show(struct seq_file *s, void *p)int i, tab_idx;__le64 *itct; +if (!debugfs_dump_is_generated_v3_hw (itct_cache)) +return -EPERM ; +for (i =0 ; i <HISI_SAS_IOST_ITCT_CACHE_NUM ; i++, itct_cache++) {/* * Data struct of ITCT cache:
@@ -3788,10 +3824,9 @@ static int debugfs_itct_cache_v3_hw_show(struct seq_file *s, void *p) }DEFINE_SHOW_ATTRIBUTE (debugfs_itct_cache_v3_hw); -static void debugfs_create_files_v3_hw (struct hisi_hba *hisi_hba) +static void debugfs_create_files_v3_hw (struct hisi_hba *hisi_hba,int index) {u64 *debugfs_timestamp; -int dump_index = hisi_hba->debugfs_dump_index;struct dentry *dump_dentry;struct dentry *dentry;char name[256 ];
@@ -3799,17 +3834,17 @@ static void debugfs_create_files_v3_hw(struct hisi_hba *hisi_hba)int c;int d; -snprintf (name,256 ,"%d" , dump_index); +snprintf (name,256 ,"%d" , index); dump_dentry =debugfs_create_dir (name, hisi_hba->debugfs_dump_dentry); - debugfs_timestamp = &hisi_hba->debugfs_timestamp[dump_index]; + debugfs_timestamp = &hisi_hba->debugfs_timestamp[index];debugfs_create_u64 ("timestamp" ,0400 , dump_dentry, debugfs_timestamp);debugfs_create_file ("global" ,0400 , dump_dentry, - &hisi_hba->debugfs_regs[dump_index][DEBUGFS_GLOBAL ], + &hisi_hba->debugfs_regs[index][DEBUGFS_GLOBAL ], &debugfs_global_v3_hw_fops);/* Create port dir and files */
@@ -3818,7 +3853,7 @@ static void debugfs_create_files_v3_hw(struct hisi_hba *hisi_hba)snprintf (name,256 ,"%d" , p);debugfs_create_file (name,0400 , dentry, - &hisi_hba->debugfs_port_reg[dump_index][p], + &hisi_hba->debugfs_port_reg[index][p], &debugfs_port_v3_hw_fops); }
@@ -3828,7 +3863,7 @@ static void debugfs_create_files_v3_hw(struct hisi_hba *hisi_hba)snprintf (name,256 ,"%d" , c);debugfs_create_file (name,0400 , dentry, - &hisi_hba->debugfs_cq[dump_index][c], + &hisi_hba->debugfs_cq[index][c], &debugfs_cq_v3_hw_fops); }
@@ -3838,32 +3873,32 @@ static void debugfs_create_files_v3_hw(struct hisi_hba *hisi_hba)snprintf (name,256 ,"%d" , d);debugfs_create_file (name,0400 , dentry, - &hisi_hba->debugfs_dq[dump_index][d], + &hisi_hba->debugfs_dq[index][d], &debugfs_dq_v3_hw_fops); }debugfs_create_file ("iost" ,0400 , dump_dentry, - &hisi_hba->debugfs_iost[dump_index], + &hisi_hba->debugfs_iost[index], &debugfs_iost_v3_hw_fops);debugfs_create_file ("iost_cache" ,0400 , dump_dentry, - &hisi_hba->debugfs_iost_cache[dump_index], + &hisi_hba->debugfs_iost_cache[index], &debugfs_iost_cache_v3_hw_fops);debugfs_create_file ("itct" ,0400 , dump_dentry, - &hisi_hba->debugfs_itct[dump_index], + &hisi_hba->debugfs_itct[index], &debugfs_itct_v3_hw_fops);debugfs_create_file ("itct_cache" ,0400 , dump_dentry, - &hisi_hba->debugfs_itct_cache[dump_index], + &hisi_hba->debugfs_itct_cache[index], &debugfs_itct_cache_v3_hw_fops);debugfs_create_file ("axi" ,0400 , dump_dentry, - &hisi_hba->debugfs_regs[dump_index][DEBUGFS_AXI ], + &hisi_hba->debugfs_regs[index][DEBUGFS_AXI ], &debugfs_axi_v3_hw_fops);debugfs_create_file ("ras" ,0400 , dump_dentry, - &hisi_hba->debugfs_regs[dump_index][DEBUGFS_RAS ], + &hisi_hba->debugfs_regs[index][DEBUGFS_RAS ], &debugfs_ras_v3_hw_fops); }
@@ -4645,22 +4680,34 @@ static void debugfs_release_v3_hw(struct hisi_hba *hisi_hba, int dump_index)int i;devm_kfree (dev, hisi_hba->debugfs_iost_cache[dump_index].cache); + hisi_hba->debugfs_iost_cache[dump_index].cache =NULL ;devm_kfree (dev, hisi_hba->debugfs_itct_cache[dump_index].cache); + hisi_hba->debugfs_itct_cache[dump_index].cache =NULL ;devm_kfree (dev, hisi_hba->debugfs_iost[dump_index].iost); + hisi_hba->debugfs_iost[dump_index].iost =NULL ;devm_kfree (dev, hisi_hba->debugfs_itct[dump_index].itct); + hisi_hba->debugfs_itct[dump_index].itct =NULL ; -for (i =0 ; i < hisi_hba->queue_count; i++) +for (i =0 ; i < hisi_hba->queue_count; i++) {devm_kfree (dev, hisi_hba->debugfs_dq[dump_index][i].hdr); + hisi_hba->debugfs_dq[dump_index][i].hdr =NULL ; + } -for (i =0 ; i < hisi_hba->queue_count; i++) +for (i =0 ; i < hisi_hba->queue_count; i++) {devm_kfree (dev, hisi_hba->debugfs_cq[dump_index][i].complete_hdr); + hisi_hba->debugfs_cq[dump_index][i].complete_hdr =NULL ; + } -for (i =0 ; i <DEBUGFS_REGS_NUM ; i++) +for (i =0 ; i <DEBUGFS_REGS_NUM ; i++) {devm_kfree (dev, hisi_hba->debugfs_regs[dump_index][i].data); + hisi_hba->debugfs_regs[dump_index][i].data =NULL ; + } -for (i =0 ; i < hisi_hba->n_phy; i++) +for (i =0 ; i < hisi_hba->n_phy; i++) {devm_kfree (dev, hisi_hba->debugfs_port_reg[dump_index][i].data); + hisi_hba->debugfs_port_reg[dump_index][i].data =NULL ; + } }static const struct hisi_sas_debugfs_reg *debugfs_reg_array_v3_hw[DEBUGFS_REGS_NUM ] = {
@@ -4787,8 +4834,6 @@ static int debugfs_snapshot_regs_v3_hw(struct hisi_hba *hisi_hba)debugfs_snapshot_itct_reg_v3_hw (hisi_hba);debugfs_snapshot_iost_reg_v3_hw (hisi_hba); -debugfs_create_files_v3_hw (hisi_hba); -debugfs_snapshot_restore_v3_hw (hisi_hba); hisi_hba->debugfs_dump_index++;
@@ -4872,6 +4917,17 @@ static void debugfs_bist_init_v3_hw(struct hisi_hba *hisi_hba) hisi_hba->debugfs_bist_linkrate =SAS_LINK_RATE_1_5_GBPS ; } +static void debugfs_dump_init_v3_hw (struct hisi_hba *hisi_hba) +{ +int i; + + hisi_hba->debugfs_dump_dentry = +debugfs_create_dir ("dump" , hisi_hba->debugfs_dir); + +for (i =0 ; i < hisi_sas_debugfs_dump_count; i++) +debugfs_create_files_v3_hw (hisi_hba, i); +} +static void debugfs_exit_v3_hw (struct hisi_hba *hisi_hba) {debugfs_remove_recursive (hisi_hba->debugfs_dir);
@@ -4892,8 +4948,7 @@ static void debugfs_init_v3_hw(struct hisi_hba *hisi_hba)/* create bist structures */ debugfs_bist_init_v3_hw (hisi_hba); - hisi_hba->debugfs_dump_dentry = -debugfs_create_dir ("dump" , hisi_hba->debugfs_dir); +debugfs_dump_init_v3_hw (hisi_hba);debugfs_phy_down_cnt_init_v3_hw (hisi_hba);debugfs_fifo_init_v3_hw (hisi_hba);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 47/222 clk: qcom: clk-alpha-pll: Add support for zonda ole pll configure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rajendra Nayak <[email protected]>
[ Upstream commit c32f4f4ae1c6035b44bb4ca7a41fa4fd51244597 ]
Zonda ole pll has as extra PLL_OFF_CONFIG_CTL_U2 register, hence add support for it.
Stable-dep-of: 79dfed29aa3f ("clk: qcom: clk-alpha-pll: Add NSS HUAYRA ALPHA PLL support for ipq9574")
--- drivers/clk/qcom/clk-alpha-pll.c | 16 ++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 4 ++++ 2 files changed, 20 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +16 -0
@@ -52,6 +52,7 @@#define PLL_CONFIG_CTL (p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL])#define PLL_CONFIG_CTL_U (p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U])#define PLL_CONFIG_CTL_U1 (p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1]) +#define PLL_CONFIG_CTL_U2 (p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U2])#define PLL_TEST_CTL (p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL])#define PLL_TEST_CTL_U (p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U])#define PLL_TEST_CTL_U1 (p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1])
@@ -227,6 +228,21 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_ALPHA_VAL] = 0x24, [PLL_OFF_ALPHA_VAL_U] = 0x28, }, + [CLK_ALPHA_PLL_TYPE_ZONDA_OLE] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_USER_CTL] = 0x0c, + [PLL_OFF_USER_CTL_U] = 0x10, + [PLL_OFF_CONFIG_CTL] = 0x14, + [PLL_OFF_CONFIG_CTL_U] = 0x18, + [PLL_OFF_CONFIG_CTL_U1] = 0x1c, + [PLL_OFF_CONFIG_CTL_U2] = 0x20, + [PLL_OFF_TEST_CTL] = 0x24, + [PLL_OFF_TEST_CTL_U] = 0x28, + [PLL_OFF_TEST_CTL_U1] = 0x2c, + [PLL_OFF_OPMODE] = 0x30, + [PLL_OFF_STATUS] = 0x3c, + }, };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);
drivers/clk/qcom/clk-alpha-pll.h +4 -0
@@ -21,6 +21,7 @@ enum {CLK_ALPHA_PLL_TYPE_LUCID =CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_AGERA ,CLK_ALPHA_PLL_TYPE_ZONDA , +CLK_ALPHA_PLL_TYPE_ZONDA_OLE ,CLK_ALPHA_PLL_TYPE_LUCID_EVO ,CLK_ALPHA_PLL_TYPE_LUCID_OLE , CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
@@ -42,6 +43,7 @@ enum {PLL_OFF_CONFIG_CTL ,PLL_OFF_CONFIG_CTL_U ,PLL_OFF_CONFIG_CTL_U1 , +PLL_OFF_CONFIG_CTL_U2 ,PLL_OFF_TEST_CTL ,PLL_OFF_TEST_CTL_U , PLL_OFF_TEST_CTL_U1,
@@ -119,6 +121,7 @@ struct alpha_pll_config {u32 config_ctl_val;u32 config_ctl_hi_val;u32 config_ctl_hi1_val; +u32 config_ctl_hi2_val;u32 user_ctl_val;u32 user_ctl_hi_val;u32 user_ctl_hi1_val;
@@ -173,6 +176,7 @@ extern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops;extern const struct clk_ops clk_alpha_pll_zonda_ops;#define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops +#define clk_alpha_pll_zonda_ole_ops clk_alpha_pll_zonda_opsextern const struct clk_ops clk_alpha_pll_lucid_evo_ops;extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 48/222 clk: qcom: clk-alpha-pll: Add NSS HUAYRA ALPHA PLL support for ipq9574
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devi Priya <[email protected]>
[ Upstream commit 79dfed29aa3f714e0a94a39b2bfe9ac14ce19a6a ]
Add support for NSS Huayra alpha pll found on ipq9574 SoCs. Programming sequence is the same as that of Huayra type Alpha PLL, so we can re-use the same.
--- drivers/clk/qcom/clk-alpha-pll.c | 11 +++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 1 + 2 files changed, 12 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +11 -0
@@ -243,6 +243,17 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_OPMODE] = 0x30, [PLL_OFF_STATUS] = 0x3c, }, + [CLK_ALPHA_PLL_TYPE_NSS_HUAYRA] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_TEST_CTL] = 0x0c, + [PLL_OFF_TEST_CTL_U] = 0x10, + [PLL_OFF_USER_CTL] = 0x14, + [PLL_OFF_CONFIG_CTL] = 0x18, + [PLL_OFF_CONFIG_CTL_U] = 0x1c, + [PLL_OFF_STATUS] = 0x20, + }, + };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);
drivers/clk/qcom/clk-alpha-pll.h +1 -0
@@ -29,6 +29,7 @@ enum {CLK_ALPHA_PLL_TYPE_BRAMMO_EVO ,CLK_ALPHA_PLL_TYPE_STROMER ,CLK_ALPHA_PLL_TYPE_STROMER_PLUS , +CLK_ALPHA_PLL_TYPE_NSS_HUAYRA , CLK_ALPHA_PLL_TYPE_MAX, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 49/222 mailbox: pcc: Add support for platform notification handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huisong Li <[email protected]>
[ Upstream commit 60c40b06fa68694dd08a1a0038ea8b9de3f3b1ca ]
Currently, PCC driver doesn't support the processing of platform notification for type 4 PCC subspaces.
According to ACPI specification, if platform sends a notification to OSPM, it must clear the command complete bit and trigger platform interrupt. OSPM needs to check whether the command complete bit is cleared, clear platform interrupt, process command, and then set the command complete and ring doorbell to the Platform.
Let us stash the value of the pcc type and use the same while processing the interrupt of the channel. We also need to set the command complete bit and ring doorbell in the interrupt handler for the type 4 channel to complete the communication flow after processing the notification from the Platform.
Stable-dep-of: 7f9e19f207be ("mailbox: pcc: Check before sending MCTP PCC response ACK")
--- drivers/mailbox/pcc.c | 50 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-)
drivers/mailbox/pcc.c +41 -9
@@ -91,6 +91,7 @@ struct pcc_chan_reg {* @cmd_update: PCC register bundle for the command complete update register * @error: PCC register bundle for the error status register * @plat_irq: platform interrupt +* @type: PCC subspace type */ struct pcc_chan_info {struct pcc_mbox_chan chan;
@@ -100,12 +101,15 @@ struct pcc_chan_info {struct pcc_chan_reg cmd_update;struct pcc_chan_reg error;int plat_irq; +u8 type; };#define to_pcc_chan_info (c) container_of(c, struct pcc_chan_info, chan)static struct pcc_chan_info *chan_info;static int pcc_chan_count; +static int pcc_send_data (struct mbox_chan *chan,void *data); +/* * PCC can be used with perf critical drivers such as CPPC * So it makes sense to locally cache the virtual address and
@@ -221,6 +225,34 @@ static int pcc_map_interrupt(u32 interrupt, u32 flags)return acpi_register_gsi (NULL , interrupt, trigger, polarity); } +static bool pcc_mbox_cmd_complete_check (struct pcc_chan_info *pchan) +{ +u64 val; +int ret; + + ret =pcc_chan_reg_read (&pchan->cmd_complete, &val); +if (ret) +return false; + +if (!pchan->cmd_complete.gas) +return true; + +/* +* Judge if the channel respond the interrupt based on the value of +* command complete. +*/ + val &= pchan->cmd_complete.status_mask; +/* +* If this is PCC slave subspace channel, and the command complete +* bit 0 indicates that Platform is sending a notification and OSPM +* needs to respond this interrupt to process this command. +*/ +if (pchan->type ==ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE ) +return !val; + +return !!val; +} +/** * pcc_mbox_irq - PCC mailbox interrupt handler * @irq: interrupt number
@@ -236,17 +268,9 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)int ret; pchan = chan->con_priv; - - ret =pcc_chan_reg_read (&pchan->cmd_complete, &val); -if (ret) +if (!pcc_mbox_cmd_complete_check (pchan))return IRQ_NONE ; -if (val) {/* Ensure GAS exists and value is non-zero */ - val &= pchan->cmd_complete.status_mask; -if (!val) -return IRQ_NONE ; - } - ret =pcc_chan_reg_read (&pchan->error, &val);if (ret)return IRQ_NONE ;
@@ -262,6 +286,13 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)mbox_chan_received_data (chan,NULL ); +/* +* The PCC slave subspace channel needs to set the command complete bit +* and ring doorbell after processing message. +*/ +if (pchan->type ==ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE ) +pcc_send_data (chan,NULL ); +return IRQ_HANDLED ; }
@@ -698,6 +729,7 @@ static int pcc_mbox_probe(struct platform_device *pdev)pcc_parse_subspace_shmem (pchan, pcct_entry); + pchan->type = pcct_entry->type; pcct_entry = (struct acpi_subtable_header *) ((unsigned long ) pcct_entry + pcct_entry->length); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 50/222 mailbox: pcc: Support shared interrupt for multiple subspaces
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huisong Li <[email protected]>
[ Upstream commit 3db174e478cb0bb34888c20a531608b70aec9c1f ]
If the platform acknowledge interrupt is level triggered, then it can be shared by multiple subspaces provided each one has a unique platform interrupt ack preserve and ack set masks.
If it can be shared, then we can request the irq with IRQF_SHARED and IRQF_ONESHOT flags. The first one indicating it can be shared and the latter one to keep the interrupt disabled until the hardirq handler finished.
Further, since there is no way to detect if the interrupt is for a given channel as the interrupt ack preserve and ack set masks are for clearing the interrupt and not for reading the status(in case Irq Ack register may be write-only on some platforms), we need a way to identify if the given channel is in use and expecting the interrupt.
PCC type0, type1 and type5 do not support shared level triggered interrupt. The methods of determining whether a given channel for remaining types should respond to an interrupt are as follows:
- type2: Whether the interrupt belongs to a given channel is only determined by the status field in Generic Communications Channel Shared Memory Region, which is done in rx_callback of PCC client.
- type3: This channel checks chan_in_use flag first and then checks the command complete bit(value '1' indicates that the command has been completed).
- type4: Platform ensure that the default value of the command complete bit corresponding to the type4 channel is '1'. This command complete bit is '0' when receive a platform notification.
The new field, 'chan_in_use' is used by the type only support the communication from OSPM to Platform (like type3) and should be completely ignored by other types so as to avoid too many type unnecessary checks in IRQ handler.
Stable-dep-of: 7f9e19f207be ("mailbox: pcc: Check before sending MCTP PCC response ACK")
--- drivers/mailbox/pcc.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-)
drivers/mailbox/pcc.c +40 -3
@@ -92,6 +92,13 @@ struct pcc_chan_reg {* @error: PCC register bundle for the error status register * @plat_irq: platform interrupt * @type: PCC subspace type +* @plat_irq_flags: platform interrupt flags +* @chan_in_use: this flag is used just to check if the interrupt needs +* handling when it is shared. Since only one transfer can occur +* at a time and mailbox takes care of locking, this flag can be +* accessed without a lock. Note: the type only support the +* communication from OSPM to Platform, like type3, use it, and +* other types completely ignore it. */ struct pcc_chan_info {struct pcc_mbox_chan chan;
@@ -102,6 +109,8 @@ struct pcc_chan_info {struct pcc_chan_reg error;int plat_irq;u8 type; +unsigned int plat_irq_flags; +bool chan_in_use; };#define to_pcc_chan_info (c) container_of(c, struct pcc_chan_info, chan)
@@ -225,6 +234,12 @@ static int pcc_map_interrupt(u32 interrupt, u32 flags)return acpi_register_gsi (NULL , interrupt, trigger, polarity); } +static bool pcc_chan_plat_irq_can_be_shared (struct pcc_chan_info *pchan) +{ +return (pchan->plat_irq_flags &ACPI_PCCT_INTERRUPT_MODE ) == +ACPI_LEVEL_SENSITIVE ; +} +static bool pcc_mbox_cmd_complete_check (struct pcc_chan_info *pchan) {u64 val;
@@ -242,6 +257,7 @@ static bool pcc_mbox_cmd_complete_check(struct pcc_chan_info *pchan)* command complete. */ val &= pchan->cmd_complete.status_mask; +/* * If this is PCC slave subspace channel, and the command complete * bit 0 indicates that Platform is sending a notification and OSPM
@@ -268,6 +284,10 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)int ret; pchan = chan->con_priv; +if (pchan->type ==ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE && + !pchan->chan_in_use) +return IRQ_NONE ; +if (!pcc_mbox_cmd_complete_check (pchan))return IRQ_NONE ;
@@ -289,9 +309,12 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)/* * The PCC slave subspace channel needs to set the command complete bit * and ring doorbell after processing message. +* +* The PCC master subspace channel clears chan_in_use to free channel. */ if (pchan->type ==ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE )pcc_send_data (chan,NULL ); + pchan->chan_in_use = false;return IRQ_HANDLED ; }
@@ -371,7 +394,11 @@ static int pcc_send_data(struct mbox_chan *chan, void *data)if (ret)return ret; -return pcc_chan_reg_read_modify_write (&pchan->db); + ret =pcc_chan_reg_read_modify_write (&pchan->db); +if (!ret && pchan->plat_irq >0 ) + pchan->chan_in_use = true; + +return ret; }/**
@@ -384,11 +411,14 @@ static int pcc_send_data(struct mbox_chan *chan, void *data)static int pcc_startup (struct mbox_chan *chan) {struct pcc_chan_info *pchan = chan->con_priv; +unsigned long irqflags;int rc;if (pchan->plat_irq >0 ) { - rc =devm_request_irq (chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq,0 , -MBOX_IRQ_NAME , chan); + irqflags =pcc_chan_plat_irq_can_be_shared (pchan) ? +IRQF_SHARED |IRQF_ONESHOT :0 ; + rc =devm_request_irq (chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq, + irqflags,MBOX_IRQ_NAME , chan);if (unlikely (rc)) {dev_err (chan->mbox->dev,"failed to register PCC interrupt %d\n" , pchan->plat_irq);
@@ -494,6 +524,7 @@ static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, pcct_ss->platform_interrupt);return -EINVAL ; } + pchan->plat_irq_flags = pcct_ss->flags;if (pcct_ss->header.type ==ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 ) {struct acpi_pcct_hw_reduced_type2 *pcct2_ss = (void *)pcct_ss;
@@ -515,6 +546,12 @@ static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, "PLAT IRQ ACK"); } +if (pcc_chan_plat_irq_can_be_shared (pchan) && + !pchan->plat_irq_ack.gas) { +pr_err ("PCC subspace has level IRQ with no ACK register\n" ); +return -EINVAL ; + } +return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 51/222 ACPI: PCC: Add PCC shared memory region command and status bitfields
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
[ Upstream commit 55d235ebb684b993b3247740c1c8e273f8af4a54 ]
Define the common macros to use when referring to various bitfields in the PCC generic communications channel command and status fields.
Currently different drivers that need to use these bitfields have defined these locally. This common macro is intended to consolidate and replace those.
Stable-dep-of: 7f9e19f207be ("mailbox: pcc: Check before sending MCTP PCC response ACK")
--- include/acpi/pcc.h | 13 +++++++++++++ 1 file changed, 13 insertions(+)
include/acpi/pcc.h +13 -0
@@ -18,7 +18,20 @@ struct pcc_mbox_chan {u16 min_turnaround_time; }; +/* Generic Communications Channel Shared Memory Region */ +#define PCC_SIGNATURE 0x50434300 +/* Generic Communications Channel Command Field */ +#define PCC_CMD_GENERATE_DB_INTR BIT(15) +/* Generic Communications Channel Status Field */ +#define PCC_STATUS_CMD_COMPLETE BIT(0) +#define PCC_STATUS_SCI_DOORBELL BIT(1) +#define PCC_STATUS_ERROR BIT(2) +#define PCC_STATUS_PLATFORM_NOTIFY BIT(3) +/* Initiator Responder Communications Channel Flags */ +#define PCC_CMD_COMPLETION_NOTIFY BIT(0) +#define MAX_PCC_SUBSPACES 256 +#ifdef CONFIG_PCC extern struct pcc_mbox_chan *pcc_mbox_request_channel (struct mbox_client *cl,int subspace_id);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 52/222 mailbox: pcc: Check before sending MCTP PCC response ACK
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Young <[email protected]>
[ Upstream commit 7f9e19f207be0c534d517d65e01417ba968cdd34 ]
Type 4 PCC channels have an option to send back a response to the platform when they are done processing the request. The flag to indicate whether or not to respond is inside the message body, and thus is not available to the pcc mailbox.
If the flag is not set, still set command completion bit after processing message.
In order to read the flag, this patch maps the shared buffer to virtual memory. To avoid duplication of mapping the shared buffer is then made available to be used by the driver that uses the mailbox.
--- drivers/mailbox/pcc.c | 61 +++++++++++++++++++++++++++++++++++++------ include/acpi/pcc.h | 7 +++++ 2 files changed, 60 insertions(+), 8 deletions(-)
drivers/mailbox/pcc.c +53 -8
@@ -269,6 +269,35 @@ static bool pcc_mbox_cmd_complete_check(struct pcc_chan_info *pchan)return !!val; } +static void check_and_ack (struct pcc_chan_info *pchan,struct mbox_chan *chan) +{ +struct acpi_pcct_ext_pcc_shared_memory pcc_hdr; + +if (pchan->type !=ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE ) +return ; +/* If the memory region has not been mapped, we cannot +* determine if we need to send the message, but we still +* need to set the cmd_update flag before returning. +*/ +if (pchan->chan.shmem ==NULL ) { +pcc_chan_reg_read_modify_write (&pchan->cmd_update); +return ; + } +memcpy_fromio (&pcc_hdr, pchan->chan.shmem, +sizeof (struct acpi_pcct_ext_pcc_shared_memory )); +/* +* The PCC slave subspace channel needs to set the command complete bit +* after processing message. If the PCC_ACK_FLAG is set, it should also +* ring the doorbell. +* +* The PCC master subspace channel clears chan_in_use to free channel. +*/ +if (le32_to_cpup (&pcc_hdr.flags) &PCC_ACK_FLAG_MASK ) +pcc_send_data (chan,NULL ); +else +pcc_chan_reg_read_modify_write (&pchan->cmd_update); +} +/** * pcc_mbox_irq - PCC mailbox interrupt handler * @irq: interrupt number
@@ -306,14 +335,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)mbox_chan_received_data (chan,NULL ); -/* -* The PCC slave subspace channel needs to set the command complete bit -* and ring doorbell after processing message. -* -* The PCC master subspace channel clears chan_in_use to free channel. -*/ -if (pchan->type ==ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE ) -pcc_send_data (chan,NULL ); +check_and_ack (pchan, chan); pchan->chan_in_use = false;return IRQ_HANDLED ;
@@ -365,14 +387,37 @@ EXPORT_SYMBOL_GPL(pcc_mbox_request_channel);void pcc_mbox_free_channel (struct pcc_mbox_chan *pchan) {struct mbox_chan *chan = pchan->mchan; +struct pcc_chan_info *pchan_info; +struct pcc_mbox_chan *pcc_mbox_chan;if (!chan || !chan->cl)return ; + pchan_info = chan->con_priv; + pcc_mbox_chan = &pchan_info->chan; +if (pcc_mbox_chan->shmem) { +iounmap (pcc_mbox_chan->shmem); + pcc_mbox_chan->shmem =NULL ; + }mbox_free_channel (chan); }EXPORT_SYMBOL_GPL (pcc_mbox_free_channel); +int pcc_mbox_ioremap (struct mbox_chan *chan) +{ +struct pcc_chan_info *pchan_info; +struct pcc_mbox_chan *pcc_mbox_chan; + +if (!chan || !chan->cl) +return -1 ; + pchan_info = chan->con_priv; + pcc_mbox_chan = &pchan_info->chan; + pcc_mbox_chan->shmem =ioremap (pcc_mbox_chan->shmem_base_addr, + pcc_mbox_chan->shmem_size); +return 0 ; +} +EXPORT_SYMBOL_GPL (pcc_mbox_ioremap); +/** * pcc_send_data - Called from Mailbox Controller code. Used * here only to ring the channel doorbell. The PCC client
include/acpi/pcc.h +7 -0
@@ -12,6 +12,7 @@struct pcc_mbox_chan {struct mbox_chan *mchan;u64 shmem_base_addr; +void __iomem *shmem;u64 shmem_size;u32 latency;u32 max_access_rate;
@@ -31,11 +32,13 @@ struct pcc_mbox_chan {#define PCC_CMD_COMPLETION_NOTIFY BIT(0)#define MAX_PCC_SUBSPACES 256 +#define PCC_ACK_FLAG_MASK 0x1#ifdef CONFIG_PCC extern struct pcc_mbox_chan *pcc_mbox_request_channel (struct mbox_client *cl,int subspace_id);extern void pcc_mbox_free_channel (struct pcc_mbox_chan *chan); +extern int pcc_mbox_ioremap (struct mbox_chan *chan);#else static inline struct pcc_mbox_chan *pcc_mbox_request_channel (struct mbox_client *cl,int subspace_id)
@@ -43,6 +46,10 @@ pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)return ERR_PTR (-ENODEV ); }static inline void pcc_mbox_free_channel (struct pcc_mbox_chan *chan) { } +static inline int pcc_mbox_ioremap (struct mbox_chan *chan) +{ +return 0 ; +};#endif #endif /* _PCC_H */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 53/222 remoteproc: qcom: pas: Add sc7180 adsp
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Travkin <[email protected]>
[ Upstream commit 8de60bbab994bf8165d7d10e974872852da47aa7 ]
sc7180 has a dedicated ADSP similar to the one found in sm8250. Add it's compatible to the driver reusing the existing config so the devices that use the adsp can probe it.
Stable-dep-of: 009e288c989b ("remoteproc: qcom: pas: enable SAR2130P audio DSP support")
--- drivers/remoteproc/qcom_q6v5_pas.c | 1 + 1 file changed, 1 insertion(+)
drivers/remoteproc/qcom_q6v5_pas.c +1 -0
@@ -1163,6 +1163,7 @@ static const struct of_device_id adsp_of_match[] = { { .compatible = "qcom,qcs404-adsp-pas", .data = &adsp_resource_init }, { .compatible = "qcom,qcs404-cdsp-pas", .data = &cdsp_resource_init }, { .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init }, + { .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource}, { .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init}, { .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init}, { .compatible = "qcom,sc8180x-adsp-pas", .data = &sm8150_adsp_resource},
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 54/222 remoteproc: qcom: pas: Add support for SA8775p ADSP, CDSP and GPDSP
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tengfei Fan <[email protected]>
[ Upstream commit 9091225ba28c0106d3cd041c7abf5551a94bb524 ]
Add support for PIL loading on ADSP, CDSP0, CDSP1, GPDSP0 and GPDSP1 on SA8775p SoCs.
Stable-dep-of: 009e288c989b ("remoteproc: qcom: pas: enable SAR2130P audio DSP support")
--- drivers/remoteproc/qcom_q6v5_pas.c | 92 ++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+)
drivers/remoteproc/qcom_q6v5_pas.c +92 -0
@@ -786,6 +786,23 @@ static const struct adsp_data adsp_resource_init = { .ssctl_id = 0x14, }; +static const struct adsp_data sa8775p_adsp_resource = { + .crash_reason_smem =423 , + .firmware_name ="adsp.mbn" , + .pas_id =1 , + .minidump_id =5 , + .auto_boot = true, + .proxy_pd_names = (char *[]){ +"lcx" , +"lmx" , +NULL + }, + .load_state ="adsp" , + .ssr_name ="lpass" , + .sysmon_name ="adsp" , + .ssctl_id =0x14 , +}; +static const struct adsp_data sdm845_adsp_resource_init = { .crash_reason_smem =423 , .firmware_name ="adsp.mdt" ,
@@ -885,6 +902,42 @@ static const struct adsp_data cdsp_resource_init = { .ssctl_id = 0x17, }; +static const struct adsp_data sa8775p_cdsp0_resource = { + .crash_reason_smem =601 , + .firmware_name ="cdsp0.mbn" , + .pas_id =18 , + .minidump_id =7 , + .auto_boot = true, + .proxy_pd_names = (char *[]){ +"cx" , +"mxc" , +"nsp" , +NULL + }, + .load_state ="cdsp" , + .ssr_name ="cdsp" , + .sysmon_name ="cdsp" , + .ssctl_id =0x17 , +}; + +static const struct adsp_data sa8775p_cdsp1_resource = { + .crash_reason_smem =633 , + .firmware_name ="cdsp1.mbn" , + .pas_id =30 , + .minidump_id =20 , + .auto_boot = true, + .proxy_pd_names = (char *[]){ +"cx" , +"mxc" , +"nsp" , +NULL + }, + .load_state ="nsp" , + .ssr_name ="cdsp1" , + .sysmon_name ="cdsp1" , + .ssctl_id =0x20 , +}; +static const struct adsp_data sdm845_cdsp_resource_init = { .crash_reason_smem =601 , .firmware_name ="cdsp.mdt" ,
@@ -987,6 +1040,40 @@ static const struct adsp_data sm8350_cdsp_resource = { .ssctl_id = 0x17, }; +static const struct adsp_data sa8775p_gpdsp0_resource = { + .crash_reason_smem =640 , + .firmware_name ="gpdsp0.mbn" , + .pas_id =39 , + .minidump_id =21 , + .auto_boot = true, + .proxy_pd_names = (char *[]){ +"cx" , +"mxc" , +NULL + }, + .load_state ="gpdsp0" , + .ssr_name ="gpdsp0" , + .sysmon_name ="gpdsp0" , + .ssctl_id =0x21 , +}; + +static const struct adsp_data sa8775p_gpdsp1_resource = { + .crash_reason_smem =641 , + .firmware_name ="gpdsp1.mbn" , + .pas_id =40 , + .minidump_id =22 , + .auto_boot = true, + .proxy_pd_names = (char *[]){ +"cx" , +"mxc" , +NULL + }, + .load_state ="gpdsp1" , + .ssr_name ="gpdsp1" , + .sysmon_name ="gpdsp1" , + .ssctl_id =0x22 , +}; +static const struct adsp_data mpss_resource_init = { .crash_reason_smem =421 , .firmware_name ="modem.mdt" ,
@@ -1163,6 +1250,11 @@ static const struct of_device_id adsp_of_match[] = { { .compatible = "qcom,qcs404-adsp-pas", .data = &adsp_resource_init }, { .compatible = "qcom,qcs404-cdsp-pas", .data = &cdsp_resource_init }, { .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init }, + { .compatible = "qcom,sa8775p-adsp-pas", .data = &sa8775p_adsp_resource}, + { .compatible = "qcom,sa8775p-cdsp0-pas", .data = &sa8775p_cdsp0_resource}, + { .compatible = "qcom,sa8775p-cdsp1-pas", .data = &sa8775p_cdsp1_resource}, + { .compatible = "qcom,sa8775p-gpdsp0-pas", .data = &sa8775p_gpdsp0_resource}, + { .compatible = "qcom,sa8775p-gpdsp1-pas", .data = &sa8775p_gpdsp1_resource}, { .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource}, { .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init}, { .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init},
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 55/222 remoteproc: qcom: pas: enable SAR2130P audio DSP support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 009e288c989b3fe548a45c82da407d7bd00418a9 ]
Enable support for the Audio DSP on the Qualcomm SAR2130P platform, reusing the SM8350 resources.
--- drivers/remoteproc/qcom_q6v5_pas.c | 1 + 1 file changed, 1 insertion(+)
drivers/remoteproc/qcom_q6v5_pas.c +1 -0
@@ -1255,6 +1255,7 @@ static const struct of_device_id adsp_of_match[] = { { .compatible = "qcom,sa8775p-cdsp1-pas", .data = &sa8775p_cdsp1_resource}, { .compatible = "qcom,sa8775p-gpdsp0-pas", .data = &sa8775p_gpdsp0_resource}, { .compatible = "qcom,sa8775p-gpdsp1-pas", .data = &sa8775p_gpdsp1_resource}, + { .compatible = "qcom,sar2130p-adsp-pas", .data = &sm8350_adsp_resource}, { .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource}, { .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init}, { .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init},
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 56/222 fs/ntfs3: Implement fallocate for compressed files
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit 9a2d6a40b8a1a6fa62eaf47ceee10a5eef62284c ]
Stable-dep-of: e2705dd3d16d ("fs/ntfs3: Fix warning in ni_fiemap")
--- fs/ntfs3/attrib.c | 25 +++++++++++++++---------- fs/ntfs3/inode.c | 3 ++- 2 files changed, 17 insertions(+), 11 deletions(-)
fs/ntfs3/attrib.c +15 -10
@@ -977,15 +977,17 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn, goto out;/* Check for compressed frame. */ - err =attr_is_frame_compressed (ni, attr, vcn >>NTFS_LZNT_CUNIT , &hint); + err =attr_is_frame_compressed (ni, attr_b, vcn >>NTFS_LZNT_CUNIT , + &hint);if (err) goto out;if (hint) {/* if frame is compressed - don't touch it. */ *lcn =COMPRESSED_LCN ; - *len = hint; - err = -EOPNOTSUPP ; +/* length to the end of frame. */ + *len =NTFS_LZNT_CLUSTERS - (vcn & (NTFS_LZNT_CLUSTERS -1 )); + err =0 ; goto out; }
@@ -1028,16 +1030,16 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn,/* Check if 'vcn' and 'vcn0' in different attribute segments. */ if (vcn < svcn || evcn1 <= vcn) { -/* Load attribute for truncated vcn. */ - attr =ni_find_attr (ni, attr_b, &le,ATTR_DATA ,NULL ,0 , - &vcn, &mi); -if (!attr) { +struct ATTRIB *attr2; +/* Load runs for truncated vcn. */ + attr2 =ni_find_attr (ni, attr_b, &le_b,ATTR_DATA ,NULL , +0 , &vcn, &mi); +if (!attr2) { err = -EINVAL ; goto out; } - svcn =le64_to_cpu (attr->nres.svcn); - evcn1 =le64_to_cpu (attr->nres.evcn) +1 ; - err =attr_load_runs (attr, ni, run,NULL ); + evcn1 =le64_to_cpu (attr2->nres.evcn) +1 ; + err =attr_load_runs (attr2, ni, run,NULL );if (err) goto out; }
@@ -1530,6 +1532,9 @@ int attr_wof_frame_info(struct ntfs_inode *ni, struct ATTRIB *attr,/* * attr_is_frame_compressed - Used to detect compressed frame. +* +* attr - base (primary) attribute segment. +* Only base segments contains valid 'attr->nres.c_unit' */ int attr_is_frame_compressed (struct ntfs_inode *ni,struct ATTRIB *attr,CLST frame,CLST *clst_data)
fs/ntfs3/inode.c +2 -1
@@ -604,7 +604,8 @@ static noinline int ntfs_get_block_vbo(struct inode *inode, u64 vbo, bytes = ((u64 )len << cluster_bits) - off; -if (lcn ==SPARSE_LCN ) { +if (lcn >= sbi->used.bitmap.nbits) { +/* This case includes resident/compressed/sparse. */ if (!create) {if (bh->b_size > bytes) bh->b_size = bytes;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 57/222 fs/ntfs3: Fix warning in ni_fiemap
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit e2705dd3d16d1000f1fd8193d82447065de8c899 ]
Use local runs_tree instead of cached. This way excludes rw_semaphore lock.
--- fs/ntfs3/attrib.c | 9 ++-- fs/ntfs3/frecord.c | 103 +++++++-------------------------------------- fs/ntfs3/ntfs_fs.h | 3 +- 3 files changed, 21 insertions(+), 94 deletions(-)
fs/ntfs3/attrib.c +4 -5
@@ -978,7 +978,7 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn,/* Check for compressed frame. */ err =attr_is_frame_compressed (ni, attr_b, vcn >>NTFS_LZNT_CUNIT , - &hint); + &hint, run);if (err) goto out;
@@ -1534,16 +1534,16 @@ int attr_wof_frame_info(struct ntfs_inode *ni, struct ATTRIB *attr,* attr_is_frame_compressed - Used to detect compressed frame. * * attr - base (primary) attribute segment. +* run - run to use, usually == &ni->file.run. * Only base segments contains valid 'attr->nres.c_unit' */ int attr_is_frame_compressed (struct ntfs_inode *ni,struct ATTRIB *attr, -CLST frame,CLST *clst_data) +CLST frame,CLST *clst_data,struct runs_tree *run) {int err;u32 clst_frame;CLST clen, lcn, vcn, alen, slen, vcn_next;size_t idx; -struct runs_tree *run; *clst_data =0 ;
@@ -1555,7 +1555,6 @@ int attr_is_frame_compressed(struct ntfs_inode *ni, struct ATTRIB *attr, clst_frame =1u << attr->nres.c_unit; vcn = frame * clst_frame; - run = &ni->file.run;if (!run_lookup_entry (run, vcn, &lcn, &clen, &idx)) { err = attr_load_runs_vcn(ni, attr->type, attr_name(attr),
@@ -1691,7 +1690,7 @@ int attr_allocate_frame(struct ntfs_inode *ni, CLST frame, size_t compr_size,if (err) goto out; - err =attr_is_frame_compressed (ni, attr_b, frame, &clst_data); + err =attr_is_frame_compressed (ni, attr_b, frame, &clst_data, run);if (err) goto out;
fs/ntfs3/frecord.c +15 -88
193 lines not on this page · raw message
fs/ntfs3/ntfs_fs.h +2 -1
@@ -446,7 +446,8 @@ int attr_wof_frame_info(struct ntfs_inode *ni, struct ATTRIB *attr, struct runs_tree *run, u64 frame, u64 frames, u8 frame_bits, u32 *ondisk_size, u64 *vbo_data);int attr_is_frame_compressed (struct ntfs_inode *ni,struct ATTRIB *attr, -CLST frame,CLST *clst_data); +CLST frame,CLST *clst_data, +struct runs_tree *run);int attr_allocate_frame (struct ntfs_inode *ni,CLST frame,size_t compr_size,u64 new_valid);int attr_collapse_range (struct ntfs_inode *ni,u64 vbo,u64 bytes);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 58/222 usb: chipidea: add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomer Maimon <[email protected]>
[ Upstream commit 2978cc1f285390c1bd4d9bfc665747adc6e4b19c ]
Adding CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag to modify the vbus_active parameter to active in case the ChipIdea USB IP role is device-only and there is no otgsc register.
Stable-dep-of: ec841b8d73cf ("usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag")
--- drivers/usb/chipidea/otg.c | 5 ++++- include/linux/usb/chipidea.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/usb/chipidea/otg.c +4 -1
@@ -130,8 +130,11 @@ enum ci_role ci_otg_role(struct ci_hdrc *ci)void ci_handle_vbus_change (struct ci_hdrc *ci) { -if (!ci->is_otg) +if (!ci->is_otg) { +if (ci->platdata->flags &CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS ) +usb_gadget_vbus_connect (&ci->gadget);return ; + }if (hw_read_otgsc (ci,OTGSC_BSV ) && !ci->vbus_active)usb_gadget_vbus_connect (&ci->gadget);
include/linux/usb/chipidea.h +1 -0
@@ -64,6 +64,7 @@ struct ci_hdrc_platform_data {#define CI_HDRC_PMQOS BIT(15)#define CI_HDRC_PHY_VBUS_CONTROL BIT(16)#define CI_HDRC_HAS_PORTSC_PEC_MISSED BIT(17) +#define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS BIT(18)enum usb_dr_mode dr_mode;#define CI_HDRC_CONTROLLER_RESET_EVENT 0#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 59/222 usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
[ Upstream commit ec841b8d73cff37f8960e209017efe1eb2fb21f2 ]
Currently, the imx deivice controller has below limitations:
1. can't generate short packet interrupt if IOC not set in dTD. So if one request span more than one dTDs and only the last dTD set IOC, the usb request will pending there if no more data comes.
2. the controller can't accurately deliver data to differtent usb requests in some cases due to short packet. For example: one usb request span 3 dTDs, then if the controller received a short packet the next packet will go to 2nd dTD of current request rather than the first dTD of next request.
3. can't build a bus packet use multiple dTDs. For example: controller needs to send one packet of 512 bytes use dTD1 (200 bytes) + dTD2 (312 bytes), actually the host side will see 200 bytes short packet.
Based on these limits, add CI_HDRC_HAS_SHORT_PKT_LIMIT flag and use it on imx platforms.
--- drivers/usb/chipidea/ci.h | 1 + drivers/usb/chipidea/ci_hdrc_imx.c | 1 + drivers/usb/chipidea/core.c | 2 ++ include/linux/usb/chipidea.h | 1 + 4 files changed, 5 insertions(+)
drivers/usb/chipidea/ci.h +1 -0
@@ -260,6 +260,7 @@ struct ci_hdrc {bool b_sess_valid_event;bool imx28_write_fix;bool has_portsc_pec_bug; +bool has_short_pkt_limit;bool supports_runtime_pm;bool in_lpm;bool wakeup_int;
drivers/usb/chipidea/ci_hdrc_imx.c +1 -0
@@ -334,6 +334,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)struct ci_hdrc_platform_data pdata = { .name =dev_name (&pdev->dev), .capoffset =DEF_CAPOFFSET , + .flags =CI_HDRC_HAS_SHORT_PKT_LIMIT , .notify_event = ci_hdrc_imx_notify_event, };int ret;
drivers/usb/chipidea/core.c +2 -0
@@ -1076,6 +1076,8 @@ static int ci_hdrc_probe(struct platform_device *pdev) CI_HDRC_SUPPORTS_RUNTIME_PM); ci->has_portsc_pec_bug = !!(ci->platdata->flags &CI_HDRC_HAS_PORTSC_PEC_MISSED ); + ci->has_short_pkt_limit = !!(ci->platdata->flags & +CI_HDRC_HAS_SHORT_PKT_LIMIT );platform_set_drvdata (pdev, ci); ret =hw_device_init (ci, base);
include/linux/usb/chipidea.h +1 -0
@@ -65,6 +65,7 @@ struct ci_hdrc_platform_data {#define CI_HDRC_PHY_VBUS_CONTROL BIT(16)#define CI_HDRC_HAS_PORTSC_PEC_MISSED BIT(17)#define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS BIT(18) +#define CI_HDRC_HAS_SHORT_PKT_LIMIT BIT(19)enum usb_dr_mode dr_mode;#define CI_HDRC_CONTROLLER_RESET_EVENT 0#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 60/222 usb: chipidea: udc: limit usb request length to max 16KB
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
[ Upstream commit ca8d18aa7b0f22d66a3ca9a90d8f73431b8eca89 ]
To let the device controller work properly on short packet limitations, one usb request should only correspond to one dTD. Then every dTD will set IOC. In theory, each dTD support up to 20KB data transfer if the offset is 0. Due to we cannot predetermine the offset, this will limit the usb request length to max 16KB. This should be fine since most of the user transfer data based on this size policy.
--- drivers/usb/chipidea/ci.h | 1 + drivers/usb/chipidea/udc.c | 6 ++++++ 2 files changed, 7 insertions(+)
drivers/usb/chipidea/ci.h +1 -0
@@ -25,6 +25,7 @@#define TD_PAGE_COUNT 5#define CI_HDRC_PAGE_SIZE 4096ul/* page size for TD's */ #define ENDPT_MAX 32 +#define CI_MAX_REQ_SIZE (4 * CI_HDRC_PAGE_SIZE)#define CI_MAX_BUF_SIZE (TD_PAGE_COUNT * CI_HDRC_PAGE_SIZE)/******************************************************************************
drivers/usb/chipidea/udc.c +6 -0
@@ -959,6 +959,12 @@ static int _ep_queue(struct usb_ep *ep, struct usb_request *req,return -EMSGSIZE ; } +if (ci->has_short_pkt_limit && + hwreq->req.length >CI_MAX_REQ_SIZE ) { +dev_err (hwep->ci->dev,"request length too big (max 16KB)\n" ); +return -EMSGSIZE ; + } +/* first nuke then test link, e.g. previous status has not sent */ if (!list_empty (&hwreq->queue)) {dev_err (hwep->ci->dev,"request already in queue\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 61/222 iio: adc: ad7192: Convert from of specific to fwnode property handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
[ Upstream commit c3708c829a0662af429897a90aed46b70f14a50b ]
Enables use of with other firmwware types.
Removes a case of device tree specific handlers that might get copied into new drivers.
Stable-dep-of: b7f99fa1b64a ("iio: adc: ad7192: properly check spi_get_device_match_data()")
--- drivers/iio/adc/ad7192.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-)
drivers/iio/adc/ad7192.c +19 -19
@@ -16,7 +16,9 @@#include <linux/err.h> #include <linux/sched.h> #include <linux/delay.h> -#include <linux/of.h> +#include <linux/module.h> +#include <linux/mod_devicetable.h> +#include <linux/property.h> #include <linux/iio/iio.h> #include <linux/iio/sysfs.h>
@@ -360,19 +362,19 @@ static inline bool ad7192_valid_external_frequency(u32 freq) freq <= AD7192_EXT_FREQ_MHZ_MAX); } -static int ad7192_of_clock_select (struct ad7192_state *st) +static int ad7192_clock_select (struct ad7192_state *st) { -struct device_node *np = st->sd.spi->dev.of_node; +struct device *dev = &st->sd.spi->dev;unsigned int clock_sel; clock_sel =AD7192_CLK_INT ;/* use internal clock */ if (!st->mclk) { -if (of_property_read_bool (np,"adi,int-clock-output-enable" )) +if (device_property_read_bool (dev,"adi,int-clock-output-enable" )) clock_sel =AD7192_CLK_INT_CO ; }else { -if (of_property_read_bool (np,"adi,clock-xtal" )) +if (device_property_read_bool (dev,"adi,clock-xtal" )) clock_sel =AD7192_CLK_EXT_MCLK1_2 ;else clock_sel =AD7192_CLK_EXT_MCLK2 ;
@@ -381,7 +383,7 @@ static int ad7192_of_clock_select(struct ad7192_state *st)return clock_sel; } -static int ad7192_setup (struct iio_dev *indio_dev,struct device_node *np) +static int ad7192_setup (struct iio_dev *indio_dev,struct device *dev) {struct ad7192_state *st =iio_priv (indio_dev);bool rej60_en, refin2_en;
@@ -403,7 +405,7 @@ static int ad7192_setup(struct iio_dev *indio_dev, struct device_node *np) id &=AD7192_ID_MASK ;if (id != st->chip_info->chip_id) -dev_warn (&st->sd.spi->dev,"device ID query failed (0x%X != 0x%X)\n" , +dev_warn (dev,"device ID query failed (0x%X != 0x%X)\n" , id, st->chip_info->chip_id); st->mode = AD7192_MODE_SEL(AD7192_MODE_IDLE) |
@@ -412,31 +414,31 @@ static int ad7192_setup(struct iio_dev *indio_dev, struct device_node *np) st->conf =AD7192_CONF_GAIN (0 ); - rej60_en =of_property_read_bool (np,"adi,rejection-60-Hz-enable" ); + rej60_en =device_property_read_bool (dev,"adi,rejection-60-Hz-enable" );if (rej60_en) st->mode |=AD7192_MODE_REJ60 ; - refin2_en =of_property_read_bool (np,"adi,refin2-pins-enable" ); + refin2_en =device_property_read_bool (dev,"adi,refin2-pins-enable" );if (refin2_en && st->chip_info->chip_id !=CHIPID_AD7195 ) st->conf |=AD7192_CONF_REFSEL ; st->conf &= ~AD7192_CONF_CHOP ; st->f_order =AD7192_NO_SYNC_FILTER ; - buf_en =of_property_read_bool (np,"adi,buffer-enable" ); + buf_en =device_property_read_bool (dev,"adi,buffer-enable" );if (buf_en) st->conf |=AD7192_CONF_BUF ; - bipolar =of_property_read_bool (np,"bipolar" ); + bipolar =device_property_read_bool (dev,"bipolar" );if (!bipolar) st->conf |=AD7192_CONF_UNIPOLAR ; - burnout_curr_en =of_property_read_bool (np, -"adi,burnout-currents-enable" ); + burnout_curr_en =device_property_read_bool (dev, +"adi,burnout-currents-enable" );if (burnout_curr_en && buf_en) { st->conf |=AD7192_CONF_BURN ; }else if (burnout_curr_en) { -dev_warn (&st->sd.spi->dev, +dev_warn (dev,"Can't enable burnout currents: see CHOP or buffer\n" ); }
@@ -1036,9 +1038,7 @@ static int ad7192_probe(struct spi_device *spi) } st->int_vref_mv = ret /1000 ; - st->chip_info =of_device_get_match_data (&spi->dev); -if (!st->chip_info) - st->chip_info = (void *)spi_get_device_id (spi)->driver_data; + st->chip_info =spi_get_device_match_data (spi); indio_dev->name = st->chip_info->name; indio_dev->modes =INDIO_DIRECT_MODE ;
@@ -1065,7 +1065,7 @@ static int ad7192_probe(struct spi_device *spi)if (IS_ERR (st->mclk))return PTR_ERR (st->mclk); - st->clock_sel =ad7192_of_clock_select (st); + st->clock_sel =ad7192_clock_select (st);if (st->clock_sel ==AD7192_CLK_EXT_MCLK1_2 || st->clock_sel ==AD7192_CLK_EXT_MCLK2 ) {
@@ -1077,7 +1077,7 @@ static int ad7192_probe(struct spi_device *spi) } } - ret =ad7192_setup (indio_dev, spi->dev.of_node); + ret =ad7192_setup (indio_dev, &spi->dev);if (ret)return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 62/222 iio: adc: ad7192: properly check spi_get_device_match_data()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
[ Upstream commit b7f99fa1b64af2f696b13cec581cb4cd7d3982b8 ]
spi_get_device_match_data() can return a NULL pointer. Hence, let's check for it.
--- drivers/iio/adc/ad7192.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/iio/adc/ad7192.c +3 -0
@@ -1039,6 +1039,9 @@ static int ad7192_probe(struct spi_device *spi) st->int_vref_mv = ret /1000 ; st->chip_info =spi_get_device_match_data (spi); +if (!st->chip_info) +return -ENODEV ; + indio_dev->name = st->chip_info->name; indio_dev->modes =INDIO_DIRECT_MODE ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 63/222 usb: typec: ucsi: add callback for connector status updates
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 24bce22d09ec8e67022aab9a888acb56fb7a996a ]
Allow UCSI glue driver to perform addtional work to update connector status. For example, it might check the cable orientation. This call is performed after reading new connector statatus, so the platform driver can peek at new connection status bits.
The callback is called both when registering the port and when the connector change event is being handled.
Stable-dep-of: de9df030ccb5 ("usb: typec: ucsi: glink: be more precise on orientation-aware ports")
--- drivers/usb/typec/ucsi/ucsi.c | 6 ++++++ drivers/usb/typec/ucsi/ucsi.h | 3 +++ 2 files changed, 9 insertions(+)
drivers/usb/typec/ucsi/ucsi.c +6 -0
@@ -903,6 +903,9 @@ static void ucsi_handle_connector_change(struct work_struct *work)trace_ucsi_connector_change (con->num, &con->status); +if (ucsi->ops->connector_status) + ucsi->ops->connector_status (con); + role = !!(con->status.flags &UCSI_CONSTAT_PWR_DIR );if (con->status.change &UCSI_CONSTAT_POWER_DIR_CHANGE ) {
@@ -1322,6 +1325,9 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con) } ret =0 ;/* ucsi_send_command() returns length on success */ +if (ucsi->ops->connector_status) + ucsi->ops->connector_status (con); +switch (UCSI_CONSTAT_PARTNER_TYPE (con->status.flags)) {case UCSI_CONSTAT_PARTNER_TYPE_UFP :case UCSI_CONSTAT_PARTNER_TYPE_CABLE_AND_UFP :
drivers/usb/typec/ucsi/ucsi.h +3 -0
@@ -15,6 +15,7 @@struct ucsi ;struct ucsi_altmode ; +struct ucsi_connector ;struct dentry ;/* UCSI offsets (Bytes) */
@@ -52,6 +53,7 @@ struct dentry;* @sync_write: Blocking write operation * @async_write: Non-blocking write operation * @update_altmodes: Squashes duplicate DP altmodes +* @connector_status: Updates connector status, called holding connector lock * * Read and write routines for UCSI interface. @sync_write must wait for the * Command Completion Event from the PPM before returning, and @async_write must
@@ -66,6 +68,7 @@ struct ucsi_operations { const void *val, size_t val_len);bool (*update_altmodes)(struct ucsi *ucsi,struct ucsi_altmode *orig,struct ucsi_altmode *updated); +void (*connector_status)(struct ucsi_connector *con); };struct ucsi *ucsi_create (struct device *dev,const struct ucsi_operations *ops);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 64/222 usb: typec: ucsi: glink: move GPIO reading into connector_status callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 76716fd5bf09725c2c6825264147f16c21e56853 ]
To simplify the platform code move Type-C orientation handling into the connector_status callback. As it is called both during connector registration and on connector change events, duplicated code from pmic_glink_ucsi_register() can be dropped.
Also this moves operations that can sleep into a worker thread, removing the only sleeping operation from pmic_glink_ucsi_notify().
Stable-dep-of: de9df030ccb5 ("usb: typec: ucsi: glink: be more precise on orientation-aware ports")
--- drivers/usb/typec/ucsi/ucsi_glink.c | 48 ++++++++++++----------------- 1 file changed, 20 insertions(+), 28 deletions(-)
drivers/usb/typec/ucsi/ucsi_glink.c +20 -28
@@ -186,10 +186,28 @@ static int pmic_glink_ucsi_sync_write(struct ucsi *__ucsi, unsigned int offset,return ret; } +static void pmic_glink_ucsi_connector_status (struct ucsi_connector *con) +{ +struct pmic_glink_ucsi *ucsi =ucsi_get_drvdata (con->ucsi); +int orientation; + +if (con->num >=PMIC_GLINK_MAX_PORTS || + !ucsi->port_orientation[con->num -1 ]) +return ; + + orientation =gpiod_get_value (ucsi->port_orientation[con->num -1 ]); +if (orientation >=0 ) { +typec_switch_set (ucsi->port_switch[con->num -1 ], + orientation ?TYPEC_ORIENTATION_REVERSE + :TYPEC_ORIENTATION_NORMAL ); + } +} +static const struct ucsi_operations pmic_glink_ucsi_ops = { .read = pmic_glink_ucsi_read, .sync_write = pmic_glink_ucsi_sync_write, - .async_write = pmic_glink_ucsi_async_write + .async_write = pmic_glink_ucsi_async_write, + .connector_status = pmic_glink_ucsi_connector_status, };static void pmic_glink_ucsi_read_ack (struct pmic_glink_ucsi *ucsi,const void *data,int len)
@@ -228,20 +246,8 @@ static void pmic_glink_ucsi_notify(struct work_struct *work) } con_num =UCSI_CCI_CONNECTOR (cci); -if (con_num) { -if (con_num <=PMIC_GLINK_MAX_PORTS && - ucsi->port_orientation[con_num -1 ]) { -int orientation =gpiod_get_value (ucsi->port_orientation[con_num -1 ]); - -if (orientation >=0 ) { -typec_switch_set (ucsi->port_switch[con_num -1 ], - orientation ?TYPEC_ORIENTATION_REVERSE - :TYPEC_ORIENTATION_NORMAL ); - } - } - +if (con_num)ucsi_connector_change (ucsi->ucsi, con_num); - }if (ucsi->sync_pending && (cci & (UCSI_CCI_ACK_COMPLETE |UCSI_CCI_COMMAND_COMPLETE ))) {
@@ -252,20 +258,6 @@ static void pmic_glink_ucsi_notify(struct work_struct *work)static void pmic_glink_ucsi_register (struct work_struct *work) { struct pmic_glink_ucsi *ucsi = container_of(work, struct pmic_glink_ucsi, register_work); -int orientation; -int i; - -for (i =0 ; i <PMIC_GLINK_MAX_PORTS ; i++) { -if (!ucsi->port_orientation[i]) -continue ; - orientation =gpiod_get_value (ucsi->port_orientation[i]); - -if (orientation >=0 ) { -typec_switch_set (ucsi->port_switch[i], - orientation ?TYPEC_ORIENTATION_REVERSE - :TYPEC_ORIENTATION_NORMAL ); - } - }ucsi_register (ucsi->ucsi); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 65/222 usb: typec: ucsi: add update_connector callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 62866465196228917f233aea68de73be6cdb9fae ]
Add a callback to allow glue drivers to update the connector before registering corresponding power supply and Type-C port. In particular this is useful if glue drivers want to touch the connector's Type-C capabilities structure.
Stable-dep-of: de9df030ccb5 ("usb: typec: ucsi: glink: be more precise on orientation-aware ports")
--- drivers/usb/typec/ucsi/ucsi.c | 3 +++ drivers/usb/typec/ucsi/ucsi.h | 2 ++ 2 files changed, 5 insertions(+)
drivers/usb/typec/ucsi/ucsi.c +3 -0
@@ -1261,6 +1261,9 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con) cap->driver_data = con; cap->ops = &ucsi_ops; +if (ucsi->ops->update_connector) + ucsi->ops->update_connector (con); + ret =ucsi_register_port_psy (con);if (ret) goto out;
drivers/usb/typec/ucsi/ucsi.h +2 -0
@@ -53,6 +53,7 @@ struct dentry;* @sync_write: Blocking write operation * @async_write: Non-blocking write operation * @update_altmodes: Squashes duplicate DP altmodes +* @update_connector: Update connector capabilities before registering * @connector_status: Updates connector status, called holding connector lock * * Read and write routines for UCSI interface. @sync_write must wait for the
@@ -68,6 +69,7 @@ struct ucsi_operations { const void *val, size_t val_len);bool (*update_altmodes)(struct ucsi *ucsi,struct ucsi_altmode *orig,struct ucsi_altmode *updated); +void (*update_connector)(struct ucsi_connector *con);void (*connector_status)(struct ucsi_connector *con); };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 66/222 usb: typec: ucsi: glink: set orientation aware if supported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 3d1b6c9d47707d6a0f80bb5db6473b1f107b5baf ]
If the PMIC-GLINK device has orientation GPIOs declared, then it will report connection orientation. In this case set the flag to mark registered ports as orientation-aware.
Stable-dep-of: de9df030ccb5 ("usb: typec: ucsi: glink: be more precise on orientation-aware ports")
--- drivers/usb/typec/ucsi/ucsi_glink.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/usb/typec/ucsi/ucsi_glink.c +12 -0
@@ -186,6 +186,17 @@ static int pmic_glink_ucsi_sync_write(struct ucsi *__ucsi, unsigned int offset,return ret; } +static void pmic_glink_ucsi_update_connector (struct ucsi_connector *con) +{ +struct pmic_glink_ucsi *ucsi =ucsi_get_drvdata (con->ucsi); +int i; + +for (i =0 ; i <PMIC_GLINK_MAX_PORTS ; i++) { +if (ucsi->port_orientation[i]) + con->typec_cap.orientation_aware = true; + } +} +static void pmic_glink_ucsi_connector_status (struct ucsi_connector *con) {struct pmic_glink_ucsi *ucsi =ucsi_get_drvdata (con->ucsi);
@@ -207,6 +218,7 @@ static const struct ucsi_operations pmic_glink_ucsi_ops = { .read = pmic_glink_ucsi_read, .sync_write = pmic_glink_ucsi_sync_write, .async_write = pmic_glink_ucsi_async_write, + .update_connector = pmic_glink_ucsi_update_connector, .connector_status = pmic_glink_ucsi_connector_status, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 67/222 usb: typec: ucsi: glink: be more precise on orientation-aware ports
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit de9df030ccb5d3e31ee0c715d74cd77c619748f8 ]
Instead of checking if any of the USB-C ports have orientation GPIO and thus is orientation-aware, check for the GPIO for the port being registered. There are no boards that are affected by this change at this moment, so the patch is not marked as a fix, but it might affect other boards in future.
--- drivers/usb/typec/ucsi/ucsi_glink.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/usb/typec/ucsi/ucsi_glink.c +5 -5
@@ -189,12 +189,12 @@ static int pmic_glink_ucsi_sync_write(struct ucsi *__ucsi, unsigned int offset,static void pmic_glink_ucsi_update_connector (struct ucsi_connector *con) {struct pmic_glink_ucsi *ucsi =ucsi_get_drvdata (con->ucsi); -int i; -for (i =0 ; i <PMIC_GLINK_MAX_PORTS ; i++) { -if (ucsi->port_orientation[i]) - con->typec_cap.orientation_aware = true; - } +if (con->num >PMIC_GLINK_MAX_PORTS || + !ucsi->port_orientation[con->num -1 ]) +return ; + + con->typec_cap.orientation_aware = true; }static void pmic_glink_ucsi_connector_status (struct ucsi_connector *con)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 68/222 nvme: use helper nvme_ctrl_state in nvme_keep_alive_finish function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nilay Shroff <[email protected]>
[ Upstream commit 599d9f3a10eec69ef28a90161763e4bd7c9c02bf ]
We no more need acquiring ctrl->lock before accessing the NVMe controller state and instead we can now use the helper nvme_ctrl_state. So replace the use of ctrl->lock from nvme_keep_alive_finish function with nvme_ctrl_state call.
Stable-dep-of: 84488282166d ("Revert "nvme: make keep-alive synchronous operation"")
--- drivers/nvme/host/core.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/nvme/host/core.c +2 -8
@@ -1181,10 +1181,9 @@ static void nvme_queue_keep_alive_work(struct nvme_ctrl *ctrl)static void nvme_keep_alive_finish (struct request *rq,blk_status_t status,struct nvme_ctrl *ctrl) { -unsigned long flags; -bool startka = false;unsigned long rtt = jiffies - (rq->deadline - rq->timeout);unsigned long delay =nvme_keep_alive_work_period (ctrl); +enum nvme_ctrl_state state =nvme_ctrl_state (ctrl);/* * Subtract off the keepalive RTT so nvme_keep_alive_work runs
@@ -1207,12 +1206,7 @@ static void nvme_keep_alive_finish(struct request *rq, ctrl->ka_last_check_time = jiffies; ctrl->comp_seen = false; -spin_lock_irqsave (&ctrl->lock, flags); -if (ctrl->state ==NVME_CTRL_LIVE || - ctrl->state ==NVME_CTRL_CONNECTING ) - startka = true; -spin_unlock_irqrestore (&ctrl->lock, flags); -if (startka) +if (state ==NVME_CTRL_LIVE || state ==NVME_CTRL_CONNECTING )queue_delayed_work (nvme_wq, &ctrl->ka_work, delay); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 69/222 Revert "nvme: make keep-alive synchronous operation"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nilay Shroff <[email protected]>
[ Upstream commit 84488282166de6b6760ada8030e87aaa08bce3aa ]
This reverts commit d06923670b5a5f609603d4a9fee4dec02d38de9c.
It was realized that the fix implemented to contain the race condition among the keep alive task and the fabric shutdown code path in the commit d06923670b5ia ("nvme: make keep-alive synchronous operation") is not optimal. The reason being keep-alive runs under the workqueue and making it synchronous would waste a workqueue context.
Furthermore, we later found that the above race condition is a regression caused due to the changes implemented in commit a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()"). So we decided to revert the commit d06923670b5a ("nvme: make keep-alive synchronous operation") and then fix the regression.
--- drivers/nvme/host/core.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/nvme/host/core.c +10 -7
@@ -1178,9 +1178,10 @@ static void nvme_queue_keep_alive_work(struct nvme_ctrl *ctrl) nvme_keep_alive_work_period(ctrl)); } -static void nvme_keep_alive_finish (struct request *rq, -blk_status_t status,struct nvme_ctrl *ctrl) +static enum rq_end_io_ret nvme_keep_alive_end_io (struct request *rq, +blk_status_t status) { +struct nvme_ctrl *ctrl = rq->end_io_data;unsigned long rtt = jiffies - (rq->deadline - rq->timeout);unsigned long delay =nvme_keep_alive_work_period (ctrl);enum nvme_ctrl_state state =nvme_ctrl_state (ctrl);
@@ -1197,17 +1198,20 @@ static void nvme_keep_alive_finish(struct request *rq, delay =0 ; } +blk_mq_free_request (rq); +if (status) {dev_err (ctrl->device,"failed nvme_keep_alive_end_io error=%d\n" , status); -return ; +return RQ_END_IO_NONE ; } ctrl->ka_last_check_time = jiffies; ctrl->comp_seen = false;if (state ==NVME_CTRL_LIVE || state ==NVME_CTRL_CONNECTING )queue_delayed_work (nvme_wq, &ctrl->ka_work, delay); +return RQ_END_IO_NONE ; }static void nvme_keep_alive_work (struct work_struct *work)
@@ -1216,7 +1220,6 @@ static void nvme_keep_alive_work(struct work_struct *work) struct nvme_ctrl, ka_work);bool comp_seen = ctrl->comp_seen;struct request *rq; -blk_status_t status; ctrl->ka_last_check_time = jiffies;
@@ -1239,9 +1242,9 @@ static void nvme_keep_alive_work(struct work_struct *work)nvme_init_request (rq, &ctrl->ka_cmd); rq->timeout = ctrl->kato *HZ ; - status =blk_execute_rq (rq, false); -nvme_keep_alive_finish (rq, status, ctrl); -blk_mq_free_request (rq); + rq->end_io = nvme_keep_alive_end_io; + rq->end_io_data = ctrl; +blk_execute_rq_nowait (rq, false); }static void nvme_start_keep_alive (struct nvme_ctrl *ctrl)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 70/222 net/mlx5: unique names for per device caches
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
[ Upstream commit 25872a079bbbe952eb660249cc9f40fa75623e68 ]
Add the device name to the per device kmem_cache names to ensure their uniqueness. This fixes warnings like this:
"kmem_cache of name 'mlx5_fs_fgs' already exists".
--- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +5 -2
@@ -3478,6 +3478,7 @@ void mlx5_fs_core_free(struct mlx5_core_dev *dev)int mlx5_fs_core_alloc (struct mlx5_core_dev *dev) {struct mlx5_flow_steering *steering; +char name[80 ];int err =0 ; err =mlx5_init_fc_stats (dev);
@@ -3502,10 +3503,12 @@ int mlx5_fs_core_alloc(struct mlx5_core_dev *dev)else steering->mode =MLX5_FLOW_STEERING_MODE_DMFS ; - steering->fgs_cache =kmem_cache_create ("mlx5_fs_fgs" , +snprintf (name,sizeof (name),"%s-mlx5_fs_fgs" ,dev_name (dev->device)); + steering->fgs_cache =kmem_cache_create (name,sizeof (struct mlx5_flow_group ),0 ,0 ,NULL ); - steering->ftes_cache =kmem_cache_create ("mlx5_fs_ftes" ,sizeof (struct fs_fte ),0 , +snprintf (name,sizeof (name),"%s-mlx5_fs_ftes" ,dev_name (dev->device)); + steering->ftes_cache =kmem_cache_create (name,sizeof (struct fs_fte ),0 ,0 ,NULL );if (!steering->ftes_cache || !steering->fgs_cache) { err = -ENOMEM ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 71/222 softirq: Allow raising SCHED_SOFTIRQ from SMP-call-function on RT kernel
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: K Prateek Nayak <[email protected]>
[ Upstream commit 6675ce20046d149e1e1ffe7e9577947dee17aad5 ]
do_softirq_post_smp_call_flush() on PREEMPT_RT kernels carries a WARN_ON_ONCE() for any SOFTIRQ being raised from an SMP-call-function. Since do_softirq_post_smp_call_flush() is called with preempt disabled, raising a SOFTIRQ during flush_smp_call_function_queue() can lead to longer preempt disabled sections.
Since commit b2a02fc43a1f ("smp: Optimize send_call_function_single_ipi()") IPIs to an idle CPU in TIF_POLLING_NRFLAG mode can be optimized out by instead setting TIF_NEED_RESCHED bit in idle task's thread_info and relying on the flush_smp_call_function_queue() in the idle-exit path to run the SMP-call-function.
To trigger an idle load balancing, the scheduler queues nohz_csd_function() responsible for triggering an idle load balancing on a target nohz idle CPU and sends an IPI. Only now, this IPI is optimized out and the SMP-call-function is executed from flush_smp_call_function_queue() in do_idle() which can raise a SCHED_SOFTIRQ to trigger the balancing.
So far, this went undetected since, the need_resched() check in nohz_csd_function() would make it bail out of idle load balancing early as the idle thread does not clear TIF_POLLING_NRFLAG before calling flush_smp_call_function_queue(). The need_resched() check was added with the intent to catch a new task wakeup, however, it has recently discovered to be unnecessary and will be removed in the subsequent commit after which nohz_csd_function() can raise a SCHED_SOFTIRQ from flush_smp_call_function_queue() to trigger an idle load balance on an idle target in TIF_POLLING_NRFLAG mode.
nohz_csd_function() bails out early if "idle_cpu()" check for the target CPU, and does not lock the target CPU's rq until the very end, once it has found tasks to run on the CPU and will not inhibit the wakeup of, or running of a newly woken up higher priority task. Account for this and prevent a WARN_ON_ONCE() when SCHED_SOFTIRQ is raised from flush_smp_call_function_queue().
--- kernel/softirq.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
kernel/softirq.c +11 -4
@@ -279,17 +279,24 @@ static inline void invoke_softirq(void) wakeup_softirqd(); } +#define SCHED_SOFTIRQ_MASK BIT(SCHED_SOFTIRQ) +/* * flush_smp_call_function_queue() can raise a soft interrupt in a function -* call. On RT kernels this is undesired and the only known functionality -* in the block layer which does this is disabled on RT. If soft interrupts -* get raised which haven't been raised before the flush, warn so it can be +* call. On RT kernels this is undesired and the only known functionalities +* are in the block layer which is disabled on RT, and in the scheduler for +* idle load balancing. If soft interrupts get raised which haven't been +* raised before the flush, warn if it is not a SCHED_SOFTIRQ so it can be * investigated. */ void do_softirq_post_smp_call_flush (unsigned int was_pending) { -if (WARN_ON_ONCE (was_pending !=local_softirq_pending ())) +unsigned int is_pending =local_softirq_pending (); + +if (unlikely (was_pending != is_pending)) { +WARN_ON_ONCE (was_pending != (is_pending & ~SCHED_SOFTIRQ_MASK ));invoke_softirq (); + } }#else /* CONFIG_PREEMPT_RT */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 72/222 net: renesas: rswitch: fix possible early skb release
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Yushchenko <[email protected]>
[ Upstream commit 5cb099902b6b6292b3a85ffa1bb844e0ba195945 ]
When sending frame split into multiple descriptors, hardware processes descriptors one by one, including writing back DT values. The first descriptor could be already marked as completed when processing of next descriptors for the same frame is still in progress.
Although only the last descriptor is configured to generate interrupt, completion of the first descriptor could be noticed by the driver when handling interrupt for the previous frame.
Currently, driver stores skb in the entry that corresponds to the first descriptor. This results into skb could be unmapped and freed when hardware did not complete the send yet. This opens a window for corrupting the data being sent.
Fix this by saving skb in the entry that corresponds to the last descriptor used to send the frame.
--- drivers/net/ethernet/renesas/rswitch.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/renesas/rswitch.c +3 -2
@@ -1632,8 +1632,9 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *ndif (dma_mapping_error (ndev->dev.parent, dma_addr_orig)) goto err_kfree; - gq->skbs[gq->cur] = skb; - gq->unmap_addrs[gq->cur] = dma_addr_orig; +/* Stored the skb at the last descriptor to avoid skb free before hardware completes send */ + gq->skbs[(gq->cur + nr_desc -1 ) % gq->ring_size] = skb; + gq->unmap_addrs[(gq->cur + nr_desc -1 ) % gq->ring_size] = dma_addr_orig;dma_wmb ();
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 73/222 xhci: retry Stop Endpoint on buggy NEC controllers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Pecio <[email protected]>
[ Upstream commit fd9d55d190c0e5fefd3a9165ea361809427885a1 ]
Two NEC uPD720200 adapters have been observed to randomly misbehave:
a Stop Endpoint command fails with Context Error, the Output Context indicates Stopped state, and the endpoint keeps running. Very often, Set TR Dequeue Pointer is seen to fail next with Context Error too, in addition to problems from unexpectedly completed cancelled work.
The pathology is common on fast running isoc endpoints like uvcvideo, but has also been reproduced on a full-speed bulk endpoint of pl2303. It seems all EPs are affected, with risk proportional to their load.
Reproduction involves receiving any kind of stream and closing it to make the device driver cancel URBs already queued in advance.
Deal with it by retrying the command like in the Running state.
Stable-dep-of: e21ebe51af68 ("xhci: Turn NEC specific quirk for handling Stop Endpoint errors generic")
--- drivers/usb/host/xhci-ring.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/host/xhci-ring.c +9 -0
@@ -1180,6 +1180,15 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,break ; ep->ep_state &= ~EP_STOP_CMD_PENDING ;return ; +case EP_STATE_STOPPED : +/* +* NEC uPD720200 sometimes sets this state and fails with +* Context Error while continuing to process TRBs. +* Be conservative and trust EP_CTX_STATE on other chips. +*/ +if (!(xhci->quirks &XHCI_NEC_HOST )) +break ; + fallthrough;case EP_STATE_RUNNING :/* Race, HW handled stop ep cmd before ep was running */ xhci_dbg (xhci,"Stop ep completion ctx error, ep is running\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 74/222 usb: xhci: Limit Stop Endpoint retries
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Pecio <[email protected]>
[ Upstream commit 42b7581376015c1bbcbe5831f043cd0ac119d028 ]
Some host controllers fail to atomically transition an endpoint to the Running state on a doorbell ring and enter a hidden "Restarting" state, which looks very much like Stopped, with the important difference that it will spontaneously transition to Running anytime soon.
A Stop Endpoint command queued in the Restarting state typically fails with Context State Error and the completion handler sees the Endpoint Context State as either still Stopped or already Running. Even a case of Halted was observed, when an error occurred right after the restart.
The Halted state is already recovered from by resetting the endpoint. The Running state is handled by retrying Stop Endpoint.
The Stopped state was recognized as a problem on NEC controllers and worked around also by retrying, because the endpoint soon restarts and then stops for good. But there is a risk: the command may fail if the endpoint is "stopped for good" already, and retries will fail forever.
The possibility of this was not realized at the time, but a number of cases were discovered later and reproduced. Some proved difficult to deal with, and it is outright impossible to predict if an endpoint may fail to ever start at all due to a hardware bug. One such bug (albeit on ASM3142, not on NEC) was found to be reliably triggered simply by toggling an AX88179 NIC up/down in a tight loop for a few seconds.
An endless retries storm is quite nasty. Besides putting needless load on the xHC and CPU, it causes URBs never to be given back, paralyzing the device and connection/disconnection logic for the whole bus if the device is unplugged. User processes waiting for URBs become unkillable, drivers and kworker threads lock up and xhci_hcd cannot be reloaded.
For peace of mind, impose a timeout on Stop Endpoint retries in this case. If they don't succeed in 100ms, consider the endpoint stopped permanently for some reason and just give back the unlinked URBs. This failure case is rare already and work is under way to make it rarer.
Start this work today by also handling one simple case of race with Reset Endpoint, because it costs just two lines to implement.
Stable-dep-of: e21ebe51af68 ("xhci: Turn NEC specific quirk for handling Stop Endpoint errors generic")
--- drivers/usb/host/xhci-ring.c | 28 ++++++++++++++++++++++++---- drivers/usb/host/xhci.c | 2 ++ drivers/usb/host/xhci.h | 1 + 3 files changed, 27 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-ring.c +24 -4
@@ -52,6 +52,7 @@* endpoint rings; it generates events on the event ring for these. */ +#include <linux/jiffies.h> #include <linux/scatterlist.h> #include <linux/slab.h> #include <linux/dma-mapping.h>
@@ -1182,16 +1183,35 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,return ;case EP_STATE_STOPPED :/* -* NEC uPD720200 sometimes sets this state and fails with -* Context Error while continuing to process TRBs. -* Be conservative and trust EP_CTX_STATE on other chips. +* Per xHCI 4.6.9, Stop Endpoint command on a Stopped +* EP is a Context State Error, and EP stays Stopped. +* +* But maybe it failed on Halted, and somebody ran Reset +* Endpoint later. EP state is now Stopped and EP_HALTED +* still set because Reset EP handler will run after us. +*/ +if (ep->ep_state &EP_HALTED ) +break ; +/* +* On some HCs EP state remains Stopped for some tens of +* us to a few ms or more after a doorbell ring, and any +* new Stop Endpoint fails without aborting the restart. +* This handler may run quickly enough to still see this +* Stopped state, but it will soon change to Running. +* +* Assume this bug on unexpected Stop Endpoint failures. +* Keep retrying until the EP starts and stops again, on +* chips where this is known to help. Wait for 100ms. */ if (!(xhci->quirks &XHCI_NEC_HOST ))break ; +if (time_is_before_jiffies (ep->stop_time +msecs_to_jiffies (100 ))) +break ; fallthrough;case EP_STATE_RUNNING :/* Race, HW handled stop ep cmd before ep was running */ -xhci_dbg (xhci,"Stop ep completion ctx error, ep is running\n" ); +xhci_dbg (xhci,"Stop ep completion ctx error, ctx_state %d\n" , +GET_EP_CTX_STATE (ep_ctx)); command =xhci_alloc_command (xhci, false,GFP_ATOMIC );if (!command) {
drivers/usb/host/xhci.c +2 -0
@@ -8,6 +8,7 @@* Some code borrowed from the Linux EHCI driver. */ +#include <linux/jiffies.h> #include <linux/pci.h> #include <linux/iommu.h> #include <linux/iopoll.h>
@@ -1746,6 +1747,7 @@ static int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ret = -ENOMEM ; goto done; } + ep->stop_time = jiffies; ep->ep_state |=EP_STOP_CMD_PENDING ;xhci_queue_stop_endpoint (xhci, command, urb->dev->slot_id, ep_index,0 );
drivers/usb/host/xhci.h +1 -0
@@ -717,6 +717,7 @@ struct xhci_virt_ep {/* Bandwidth checking storage */ struct xhci_bw_info bw_info;struct list_head bw_endpoint_list; +unsigned long stop_time;/* Isoch Frame ID checking storage */ int next_frame_id;/* Use new Isoch TRB layout needed for extended TBC support */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 75/222 xhci: Turn NEC specific quirk for handling Stop Endpoint errors generic
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit e21ebe51af688eb98fd6269240212a3c7300deea ]
xHC hosts from several vendors have the same issue where endpoints start so slowly that a later queued 'Stop Endpoint' command may complete before endpoint is up and running.
The 'Stop Endpoint' command fails with context state error as the endpoint still appears as stopped.
See commit 42b758137601 ("usb: xhci: Limit Stop Endpoint retries") for details
--- drivers/usb/host/xhci-ring.c | 2 -- 1 file changed, 2 deletions(-)
drivers/usb/host/xhci-ring.c +0 -2
@@ -1203,8 +1203,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,* Keep retrying until the EP starts and stops again, on * chips where this is known to help. Wait for 100ms. */ -if (!(xhci->quirks &XHCI_NEC_HOST )) -break ;if (time_is_before_jiffies (ep->stop_time +msecs_to_jiffies (100 )))break ; fallthrough;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 76/222 thunderbolt: Add support for Intel Lunar Lake
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
[ Upstream commit 2cd3da4e37453019e21a486d9de3144f46b4fdf7 ]
Intel Lunar Lake has similar integrated Thunderbolt/USB4 controller as Intel Meteor Lake with some small differences in the host router (it has 3 DP IN adapters for instance). Add the Intel Lunar Lake PCI IDs to the driver list of supported devices.
Stable-dep-of: 8644b48714dc ("thunderbolt: Add support for Intel Panther Lake-M/P")
--- drivers/thunderbolt/nhi.c | 4 ++++ drivers/thunderbolt/nhi.h | 2 ++ 2 files changed, 6 insertions(+)
drivers/thunderbolt/nhi.c +4 -0
@@ -1524,6 +1524,10 @@ static struct pci_device_id nhi_ids[] = { .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTL_P_NHI1), .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
drivers/thunderbolt/nhi.h +2 -0
@@ -90,6 +90,8 @@ extern const struct tb_nhi_ops icl_nhi_ops;#define PCI_DEVICE_ID_INTEL_TGL_H_NHI1 0x9a21#define PCI_DEVICE_ID_INTEL_RPL_NHI0 0xa73e#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d +#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833 +#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 77/222 thunderbolt: Add support for Intel Panther Lake-M/P
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
[ Upstream commit 8644b48714dca8bf2f42a4ff8311de8efc9bd8c3 ]
Intel Panther Lake-M/P has the same integrated Thunderbolt/USB4 controller as Lunar Lake. Add these PCI IDs to the driver list of supported devices.
--- drivers/thunderbolt/nhi.c | 8 ++++++++ drivers/thunderbolt/nhi.h | 4 ++++ 2 files changed, 12 insertions(+)
drivers/thunderbolt/nhi.c +8 -0
@@ -1528,6 +1528,14 @@ static struct pci_device_id nhi_ids[] = { .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1), .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI0), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1), + .driver_data = (kernel_ulong_t)&icl_nhi_ops }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
drivers/thunderbolt/nhi.h +4 -0
@@ -92,6 +92,10 @@ extern const struct tb_nhi_ops icl_nhi_ops;#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI0 0xe333 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI1 0xe334 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI0 0xe433 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI1 0xe434#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 78/222 thunderbolt: Dont display nvm_version unless upgrade supported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit e34f1717ef0632fcec5cb827e5e0e9f223d70c9b ]
The read will never succeed if NVM wasn't initialized due to an unknown format.
Add a new callback for visibility to only show when supported.
--- drivers/thunderbolt/retimer.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/thunderbolt/retimer.c +15 -2
@@ -98,6 +98,7 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt) err_nvm:dev_dbg (&rt->dev,"NVM upgrade disabled\n" ); + rt->no_nvm_upgrade = true;if (!IS_ERR (nvm))tb_nvm_free (nvm);
@@ -177,8 +178,6 @@ static ssize_t nvm_authenticate_show(struct device *dev,if (!rt->nvm) ret = -EAGAIN ; -else if (rt->no_nvm_upgrade) - ret = -EOPNOTSUPP ;else ret =sysfs_emit (buf,"%#x\n" , rt->auth_status);
@@ -331,6 +330,19 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr, }static DEVICE_ATTR_RO (vendor); +static umode_t retimer_is_visible (struct kobject *kobj,struct attribute *attr, +int n) +{ +struct device *dev =kobj_to_dev (kobj); +struct tb_retimer *rt =tb_to_retimer (dev); + +if (attr == &dev_attr_nvm_authenticate.attr || + attr == &dev_attr_nvm_version.attr) +return rt->no_nvm_upgrade ?0 : attr->mode; + +return attr->mode; +} +static struct attribute *retimer_attrs[] = { &dev_attr_device.attr, &dev_attr_nvm_authenticate.attr,
@@ -340,6 +352,7 @@ static struct attribute *retimer_attrs[] = { };static const struct attribute_group retimer_group = { + .is_visible = retimer_is_visible, .attrs = retimer_attrs, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 79/222 x86, crash: wrap crash dumping code into crash related ifdefs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baoquan He <[email protected]>
[ Upstream commit a4eeb2176d89fdf2785851521577b94b31690a60 ]
Now crash codes under kernel/ folder has been split out from kexec code, crash dumping can be separated from kexec reboot in config items on x86 with some adjustments.
Here, also change some ifdefs or IS_ENABLED() check to more appropriate ones, e,g
- #ifdef CONFIG_KEXEC_CORE -> #ifdef CONFIG_CRASH_DUMP
- (!IS_ENABLED(CONFIG_KEXEC_CORE)) - > (!IS_ENABLED(CONFIG_CRASH_RESERVE))
Stable-dep-of: bcc80dec91ee ("x86/hyperv: Fix hv tsc page based sched_clock for hibernation")
--- arch/x86/kernel/Makefile | 4 ++-- arch/x86/kernel/cpu/mshyperv.c | 10 ++++++++-- arch/x86/kernel/kexec-bzimage64.c | 4 ++++ arch/x86/kernel/kvm.c | 4 ++-- arch/x86/kernel/machine_kexec_64.c | 3 +++ arch/x86/kernel/reboot.c | 4 ++-- arch/x86/kernel/setup.c | 2 +- arch/x86/kernel/smp.c | 2 +- arch/x86/xen/enlighten_hvm.c | 4 ++++ arch/x86/xen/mmu_pv.c | 2 +- 10 files changed, 28 insertions(+), 11 deletions(-)
arch/x86/kernel/Makefile +2 -2
@@ -99,9 +99,9 @@ obj-$(CONFIG_TRACING) += trace.o obj-$(CONFIG_RETHOOK) += rethook.o obj-$(CONFIG_CRASH_CORE) += crash_core_$(BITS).o obj-$(CONFIG_KEXEC_CORE) += machine_kexec_$(BITS).o -obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).o crash.o +obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).o obj-$(CONFIG_KEXEC_FILE) += kexec-bzimage64.o -obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o +obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o crash.o obj-y += kprobes/ obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_X86_32) += doublefault_32.o
arch/x86/kernel/cpu/mshyperv.c +8 -2
@@ -209,7 +209,9 @@ static void hv_machine_shutdown(void)if (kexec_in_progress)hyperv_cleanup (); } +#endif /* CONFIG_KEXEC_CORE */ +#ifdef CONFIG_CRASH_DUMP static void hv_machine_crash_shutdown (struct pt_regs *regs) {if (hv_crash_handler)
@@ -221,7 +223,7 @@ static void hv_machine_crash_shutdown(struct pt_regs *regs)/* Disable the hypercall page when there is only 1 active CPU. */ hyperv_cleanup (); } -#endif /* CONFIG_KEXEC_CORE */ +#endif /* CONFIG_CRASH_DUMP */ #endif /* CONFIG_HYPERV */ static uint32_t __init ms_hyperv_platform (void )
@@ -493,9 +495,13 @@ static void __init ms_hyperv_init_platform(void) no_timer_check =1 ;#endif -#if IS_ENABLED (CONFIG_HYPERV ) && defined(CONFIG_KEXEC_CORE ) +#if IS_ENABLED (CONFIG_HYPERV ) +#if defined(CONFIG_KEXEC_CORE ) machine_ops.shutdown = hv_machine_shutdown; +#endif +#if defined(CONFIG_CRASH_DUMP ) machine_ops.crash_shutdown = hv_machine_crash_shutdown; +#endif #endif if (ms_hyperv.features &HV_ACCESS_TSC_INVARIANT ) {/*
arch/x86/kernel/kexec-bzimage64.c +4 -0
@@ -263,11 +263,13 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params,memset (¶ms->hd0_info,0 ,sizeof (params->hd0_info));memset (¶ms->hd1_info,0 ,sizeof (params->hd1_info)); +#ifdef CONFIG_CRASH_DUMP if (image->type ==KEXEC_TYPE_CRASH ) { ret =crash_setup_memmap_entries (image, params);if (ret)return ret; } else +#endif setup_e820_entries (params); nr_e820_entries = params->e820_entries;
@@ -428,12 +430,14 @@ static void *bzImage64_load(struct kimage *image, char *kernel,return ERR_PTR (-EINVAL ); } +#ifdef CONFIG_CRASH_DUMP /* Allocate and load backup region */ if (image->type ==KEXEC_TYPE_CRASH ) { ret =crash_load_segments (image);if (ret)return ERR_PTR (ret); } +#endif /* * Load purgatory. For 64bit entry point, purgatory code can be
arch/x86/kernel/kvm.c +2 -2
@@ -769,7 +769,7 @@ static struct notifier_block kvm_pv_reboot_nb = {* won't be valid. In cases like kexec, in which you install a new kernel, this * means a random memory location will be kept being written. */ -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP static void kvm_crash_shutdown (struct pt_regs *regs) {kvm_guest_cpu_offline (true);
@@ -852,7 +852,7 @@ static void __init kvm_guest_init(void)kvm_guest_cpu_init ();#endif -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP machine_ops.crash_shutdown = kvm_crash_shutdown;#endif
arch/x86/kernel/machine_kexec_64.c +3 -0
@@ -545,6 +545,8 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image) }#endif /* CONFIG_KEXEC_FILE */ +#ifdef CONFIG_CRASH_DUMP +static int kexec_mark_range (unsigned long start,unsigned long end,bool protect) {
@@ -589,6 +591,7 @@ void arch_kexec_unprotect_crashkres(void) {kexec_mark_crashkres (false); } +#endif /* * During a traditional boot under SME, SME will encrypt the kernel,
arch/x86/kernel/reboot.c +2 -2
@@ -796,7 +796,7 @@ struct machine_ops machine_ops __ro_after_init = { .emergency_restart = native_machine_emergency_restart, .restart = native_machine_restart, .halt = native_machine_halt, -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP .crash_shutdown = native_machine_crash_shutdown,#endif };
@@ -826,7 +826,7 @@ void machine_halt(void) machine_ops.halt (); } -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP void machine_crash_shutdown (struct pt_regs *regs) { machine_ops.crash_shutdown (regs);
arch/x86/kernel/setup.c +1 -1
@@ -547,7 +547,7 @@ static void __init reserve_crashkernel(void)bool high = false;int ret; -if (!IS_ENABLED (CONFIG_KEXEC_CORE )) +if (!IS_ENABLED (CONFIG_CRASH_RESERVE ))return ; total_mem =memblock_phys_mem_size ();
arch/x86/kernel/smp.c +1 -1
@@ -282,7 +282,7 @@ struct smp_ops smp_ops = { .smp_cpus_done = native_smp_cpus_done, .stop_other_cpus = native_stop_other_cpus, -#if defined(CONFIG_KEXEC_CORE) +#if defined(CONFIG_CRASH_DUMP) .crash_stop_other_cpus = kdump_nmi_shootdown_cpus, #endif .smp_send_reschedule = native_smp_send_reschedule,
arch/x86/xen/enlighten_hvm.c +4 -0
@@ -141,7 +141,9 @@ static void xen_hvm_shutdown(void)if (kexec_in_progress)xen_reboot (SHUTDOWN_soft_reset); } +#endif +#ifdef CONFIG_CRASH_DUMP static void xen_hvm_crash_shutdown (struct pt_regs *regs) {native_machine_crash_shutdown (regs);
@@ -229,6 +231,8 @@ static void __init xen_hvm_guest_init(void)#ifdef CONFIG_KEXEC_CORE machine_ops.shutdown = xen_hvm_shutdown; +#endif +#ifdef CONFIG_CRASH_DUMP machine_ops.crash_shutdown = xen_hvm_crash_shutdown;#endif }
arch/x86/xen/mmu_pv.c +1 -1
@@ -2517,7 +2517,7 @@ int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr, }EXPORT_SYMBOL_GPL (xen_remap_pfn); -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_VMCORE_INFO phys_addr_t paddr_vmcoreinfo_note (void ) {if (xen_pv_domain ())
Signature · 1 line
2.39.5
Re: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1
ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2
The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
# CONFIG_KEXEC is not setCONFIG_KEXEC_FILE=y
# CONFIG_KEXEC_SIG is not set
# CONFIG_CRASH_DUMP is not set
# end of Kexec and crash features # end of General setup
Quoted 265 lines
------------------
From: Baoquan He <[email protected]>
[ Upstream commit
a4eeb2176d89fdf2785851521577b94b31690a60]Now crash codes under
kernel/folder has been split out from kexec code, crash dumping can be separated from kexec reboot in config items on x86 with some adjustments.Here, also change some ifdefs or
IS_ENABLED()check to more appropriate ones, e,g
- #ifdefCONFIG_KEXEC_CORE-> #ifdefCONFIG_CRASH_DUMP
- (!IS_ENABLED(CONFIG_KEXEC_CORE)) - > (!IS_ENABLED(CONFIG_CRASH_RESERVE))[[email protected]: don't nest CONFIG_CRASH_DUMP ifdef inside CONFIG_KEXEC_CODE ifdef scope]Link https://lore.kernel.org/all/SN6PR02MB4157931105FA68D72E3D3DB8D47B2@SN6PR02MB4157.namprd02.prod.outlook.com/T/#u open hereSigned-off-by Baoquan He <[email protected]>Cc Al Viro <[email protected]>Cc Eric W. Biederman <[email protected]>Cc Hari Bathini <[email protected]>Cc Pingfan Liu <[email protected]>Cc Klara Modin <[email protected]>Cc Michael Kelley <[email protected]>Cc Nathan Chancellor <[email protected]>Cc Stephen Rothwell <[email protected]>Cc Yang Li <[email protected]>Signed-off-by Andrew Morton <[email protected]>Stable-dep-of:
bcc80dec91ee("x86/hyperv: Fix hv tsc page basedsched_clockfor hibernation")Signed-off-by Sasha Levin <[email protected]>---
arch/x86/kernel/Makefile | 4 ++-- arch/x86/kernel/cpu/mshyperv.c | 10 ++++++++-- arch/x86/kernel/kexec-bzimage64.c | 4 ++++ arch/x86/kernel/kvm.c | 4 ++-- arch/x86/kernel/machine_kexec_64.c | 3 +++ arch/x86/kernel/reboot.c | 4 ++-- arch/x86/kernel/setup.c | 2 +- arch/x86/kernel/smp.c | 2 +- arch/x86/xen/enlighten_hvm.c | 4 ++++ arch/x86/xen/mmu_pv.c | 2 +- 10 files changed, 28 insertions(+), 11 deletions(-)arch/x86/kernel/Makefile +0
-0@@ -99,9 +99,9 @@ obj-$(CONFIG_TRACING) += trace.oobj-$(CONFIG_RETHOOK) += rethook.o obj-$(CONFIG_CRASH_CORE) += crash_core_$(BITS).o obj-$(CONFIG_KEXEC_CORE) += machine_kexec_$(BITS).o
arch/x86/kernel/Makefile +1
-1-obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).o crash.o +obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).oobj-$(CONFIG_KEXEC_FILE) += kexec-bzimage64.o
arch/x86/kernel/Makefile +1
-1-obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o +obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o crash.oobj-y += kprobes/
obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_X86_32) += doublefault_32.oarch/x86/kernel/cpu/mshyperv.c +8
-2@@ -209,7 +209,9 @@ static void hv_machine_shutdown(void)if (kexec_in_progress)hyperv_cleanup (); } +#endif /* CONFIG_KEXEC_CORE */ +#ifdef CONFIG_CRASH_DUMP static void hv_machine_crash_shutdown (struct pt_regs *regs) {if (hv_crash_handler)@@ -221,7 +223,7 @@ static void hv_machine_crash_shutdown(struct pt_regs *regs)/* Disable the hypercall page when there is only 1 active CPU. */ hyperv_cleanup (); } -#endif /* CONFIG_KEXEC_CORE */ +#endif /* CONFIG_CRASH_DUMP */ #endif /* CONFIG_HYPERV */ static uint32_t __init ms_hyperv_platform (void )@@ -493,9 +495,13 @@ static void __init ms_hyperv_init_platform(void) no_timer_check =1 ;#endif -#if IS_ENABLED (CONFIG_HYPERV ) && defined(CONFIG_KEXEC_CORE ) +#if IS_ENABLED (CONFIG_HYPERV ) +#if defined(CONFIG_KEXEC_CORE ) machine_ops.shutdown = hv_machine_shutdown; +#endif +#if defined(CONFIG_CRASH_DUMP ) machine_ops.crash_shutdown = hv_machine_crash_shutdown; +#endif #endif if (ms_hyperv.features &HV_ACCESS_TSC_INVARIANT ) {/* arch/x86/kernel/kexec-bzimage64.c +4
-0@@ -263,11 +263,13 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params,memset (¶ms->hd0_info,0 ,sizeof (params->hd0_info));memset (¶ms->hd1_info,0 ,sizeof (params->hd1_info)); +#ifdef CONFIG_CRASH_DUMP if (image->type ==KEXEC_TYPE_CRASH ) { ret =crash_setup_memmap_entries (image, params);if (ret)return ret; } else +#endif setup_e820_entries (params); nr_e820_entries = params->e820_entries;@@ -428,12 +430,14 @@ static void *bzImage64_load(struct kimage *image, char *kernel,return ERR_PTR (-EINVAL ); } +#ifdef CONFIG_CRASH_DUMP /* Allocate and load backup region */ if (image->type ==KEXEC_TYPE_CRASH ) { ret =crash_load_segments (image);if (ret)return ERR_PTR (ret); } +#endif /* * Load purgatory. For 64bit entry point, purgatory code can be arch/x86/kernel/kvm.c +2
-2@@ -769,7 +769,7 @@ static struct notifier_block kvm_pv_reboot_nb = {* won't be valid. In cases like kexec, in which you install a new kernel, this * means a random memory location will be kept being written. */ -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP static void kvm_crash_shutdown (struct pt_regs *regs) {kvm_guest_cpu_offline (true);@@ -852,7 +852,7 @@ static void __init kvm_guest_init(void)kvm_guest_cpu_init ();#endif -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP machine_ops.crash_shutdown = kvm_crash_shutdown;#endif arch/x86/kernel/machine_kexec_64.c +2
-0@@ -545,6 +545,8 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image) }#endif /* CONFIG_KEXEC_FILE */ +#ifdef CONFIG_CRASH_DUMP +static int
kexec_mark_range(unsigned long start, unsigned long end, bool protect){arch/x86/kernel/machine_kexec_64.c +1
-0@@ -589,6 +591,7 @@ void arch_kexec_unprotect_crashkres(void) {kexec_mark_crashkres (false); } +#endif /* * During a traditional boot under SME, SME will encrypt the kernel, arch/x86/kernel/reboot.c +2
-2@@ -796,7 +796,7 @@ struct machine_ops machine_ops __ro_after_init = { .emergency_restart = native_machine_emergency_restart, .restart = native_machine_restart, .halt = native_machine_halt, -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP .crash_shutdown = native_machine_crash_shutdown,#endif };@@ -826,7 +826,7 @@ void machine_halt(void) machine_ops.halt (); } -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_CRASH_DUMP void machine_crash_shutdown (struct pt_regs *regs) { machine_ops.crash_shutdown (regs);arch/x86/kernel/setup.c +1
-1@@ -547,7 +547,7 @@ static void __init reserve_crashkernel(void)bool high = false;int ret; -if (!IS_ENABLED (CONFIG_KEXEC_CORE )) +if (!IS_ENABLED (CONFIG_CRASH_RESERVE ))return ; total_mem =memblock_phys_mem_size ();arch/x86/kernel/smp.c +1
-1@@ -282,7 +282,7 @@ struct smp_ops smp_ops = { .smp_cpus_done = native_smp_cpus_done, .stop_other_cpus = native_stop_other_cpus, -#if defined(CONFIG_KEXEC_CORE) +#if defined(CONFIG_CRASH_DUMP) .crash_stop_other_cpus = kdump_nmi_shootdown_cpus, #endif .smp_send_reschedule = native_smp_send_reschedule,arch/x86/xen/enlighten_hvm.c +4
-0@@ -141,7 +141,9 @@ static void xen_hvm_shutdown(void)if (kexec_in_progress)xen_reboot (SHUTDOWN_soft_reset); } +#endif +#ifdef CONFIG_CRASH_DUMP static void xen_hvm_crash_shutdown (struct pt_regs *regs) {native_machine_crash_shutdown (regs);@@ -229,6 +231,8 @@ static void __init xen_hvm_guest_init(void)#ifdef CONFIG_KEXEC_CORE machine_ops.shutdown = xen_hvm_shutdown; +#endif +#ifdef CONFIG_CRASH_DUMP machine_ops.crash_shutdown = xen_hvm_crash_shutdown;#endif }arch/x86/xen/mmu_pv.c +1
-1@@ -2517,7 +2517,7 @@ int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr, }EXPORT_SYMBOL_GPL (xen_remap_pfn); -#ifdef CONFIG_KEXEC_CORE +#ifdef CONFIG_VMCORE_INFO phys_addr_t paddr_vmcoreinfo_note (void ) {if (xen_pv_domain ())Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 32 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not set
Quoted 2 lines
# end of Kexec and crash features # end of General setup
Odd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
thanks,
greg k-h
Re: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 37 lines · Greg Kroah-Hartman
Quoted 32 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not setQuoted 2 lines
# end of Kexec and crash features # end of General setup
Quoted 2 lines
Odd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
I actually tested the mainline with this config and it works, so I think we're missing a change
Ignat
Quoted 3 lines
thanks,
greg k-h
Re: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 40 lines · Ignat Korchagin
Quoted 37 lines · Greg Kroah-Hartman
Quoted 34 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not set# end of Kexec and crash features # end of General setup
Quoted 7 lines
Quoted 2 lines
Odd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
I actually tested the mainline with this config and it works, so I think we're missing a change
Ignat
From the looks of it it is missing 02aff8480533 ("crash: split crash dumping code out from kexec_core.c")
Ignat
Quoted 3 lines
Quoted 3 lines
thanks,
greg k-h
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 44 lines · Ignat Korchagin
Quoted 43 lines · Ignat Korchagin
Quoted 39 lines · Greg Kroah-Hartman
Quoted 32 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not setQuoted 2 lines
# end of Kexec and crash features # end of General setupOdd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
Quoted 7 lines
Quoted 6 lines
I actually tested the mainline with this config and it works, so I think we're missing a change
Ignat
From the looks of it it is missing
02aff8480533("crash: split crashdumping code out from
kexec_core.c")
Ok, I can duplicate this here now, but wow, backporting that commit is not going to work. Let me see if I can just revert a few things instead...
thanks for the .config section, that helped out a lot!
greg k-h
Re: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 49 lines · Greg Kroah-Hartman
Quoted 47 lines · Ignat Korchagin
Quoted 46 lines · Ignat Korchagin
Quoted 37 lines · Greg Kroah-Hartman
Quoted 32 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not setQuoted 2 lines
# end of Kexec and crash features # end of General setupQuoted 2 lines
Odd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
I actually tested the mainline with this config and it works, so I think we're missing a change
Quoted 8 lines
Quoted 4 lines
Quoted 3 lines
Ignat
From the looks of it it is missing
02aff8480533("crash: split crashdumping code out from
kexec_core.c")Ok, I can duplicate this here now, but wow, backporting that commit is not going to work. Let me see if I can just revert a few things instead...
Yeah, I tried that yesterday, but saw it is not that trivial. Thank you!
Quoted 3 lines
thanks for the .config section, that helped out a lot!
greg k-h
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 079/222] x86, crash: wrap crash dumping code into crash related ifdefs
Quoted 53 lines · Ignat Korchagin
Quoted 51 lines · Greg Kroah-Hartman
Quoted 49 lines · Ignat Korchagin
Quoted 47 lines · Ignat Korchagin
Quoted 37 lines · Greg Kroah-Hartman
Quoted 32 lines · Ignat Korchagin
Hi,
Quoted 3 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I think this back port breaks 6.6 build (namely vmlinux.o link stage):
LD [M] net/netfilter/xt_nat.ko LD [M] net/netfilter/xt_addrtype.ko LD [M] net/ipv4/netfilter/iptable_nat.ko UPD include/generated/utsversion.h CC init/version-timestamp.o LD .tmp_vmlinux.kallsyms1ld: vmlinux.o: in function `__crash_kexec':
(.text+0x15a93a): undefined reference to `machine_crash_shutdown'
ld: vmlinux.o: in function `__do_sys_kexec_file_load':
kexec_file.c:(.text+0x15cef1): undefined reference to `arch_kexec_protect_crashkres'
ld: kexec_file.c:(.text+0x15cf28): undefined reference to `arch_kexec_unprotect_crashkres' make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/home/ignat/git/test/mainline/linux-6.6.70/Makefile:1164: vmlinux] Error 2
make: *** [Makefile:234: __sub-make] Error 2The KEXEC config setup, which triggers above:
# Kexec and crash features
#CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=y
#CONFIG_KEXECis not setCONFIG_KEXEC_FILE=y
#CONFIG_KEXEC_SIGis not set
#CONFIG_CRASH_DUMPis not setQuoted 2 lines
# end of Kexec and crash features # end of General setupQuoted 2 lines
Odd, why has no one see this on mainline? Are we missing a change somewhere or should this just be reverted for now?
I actually tested the mainline with this config and it works, so I think we're missing a change
Ignat
Quoted 8 lines
Quoted 6 lines
Quoted 2 lines
Quoted 1 line
From the looks of it it is missing
02aff8480533("crash: split crashdumping code out from
kexec_core.c")Ok, I can duplicate this here now, but wow, backporting that commit is not going to work. Let me see if I can just revert a few things instead...
Yeah, I tried that yesterday, but saw it is not that trivial. Thank you!
Should be fixed in the 6.6.71 release now, if not, please let me know.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 80/222 x86/hyperv: Fix hv tsc page based sched_clock for hibernation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naman Jain <[email protected]>
[ Upstream commit bcc80dec91ee745b3d66f3e48f0ec2efdea97149 ]
read_hv_sched_clock_tsc() assumes that the Hyper-V clock counter is bigger than the variable hv_sched_clock_offset, which is cached during early boot, but depending on the timing this assumption may be false when a hibernated VM starts again (the clock counter starts from 0 again) and is resuming back (Note: hv_init_tsc_clocksource() is not called during hibernation/resume); consequently, read_hv_sched_clock_tsc() may return a negative integer (which is interpreted as a huge positive integer since the return type is u64) and new kernel messages are prefixed with huge timestamps before read_hv_sched_clock_tsc() grows big enough (which typically takes several seconds).
Fix the issue by saving the Hyper-V clock counter just before the suspend, and using it to correct the hv_sched_clock_offset in resume. This makes hv tsc page based sched_clock continuous and ensures that post resume, it starts from where it left off during suspend. Override x86_platform.save_sched_clock_state and x86_platform.restore_sched_clock_state routines to correct this as soon as possible.
Note: if Invariant TSC is available, the issue doesn't happen because
1) we don't register read_hv_sched_clock_tsc() for sched clock:
See commit e5313f1c5404 ("clocksource/drivers/hyper-v: Rework clocksource and sched clock setup");
2) the common x86 code adjusts TSC similarly: see __restore_processor_state() -> tsc_verify_tsc_adjust(true) and x86_platform.restore_sched_clock_state().
Message-ID: <[email protected]>
--- arch/x86/kernel/cpu/mshyperv.c | 58 ++++++++++++++++++++++++++++++ drivers/clocksource/hyperv_timer.c | 14 +++++++- include/clocksource/hyperv_timer.h | 2 ++ 3 files changed, 73 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/mshyperv.c +58 -0
@@ -224,6 +224,63 @@ static void hv_machine_crash_shutdown(struct pt_regs *regs)hyperv_cleanup (); }#endif /* CONFIG_CRASH_DUMP */ + +static u64 hv_ref_counter_at_suspend; +static void (*old_save_sched_clock_state)(void ); +static void (*old_restore_sched_clock_state)(void ); + +/* +* Hyper-V clock counter resets during hibernation. Save and restore clock +* offset during suspend/resume, while also considering the time passed +* before suspend. This is to make sure that sched_clock using hv tsc page +* based clocksource, proceeds from where it left off during suspend and +* it shows correct time for the timestamps of kernel messages after resume. +*/ +static void save_hv_clock_tsc_state (void ) +{ + hv_ref_counter_at_suspend =hv_read_reference_counter (); +} + +static void restore_hv_clock_tsc_state (void ) +{ +/* +* Adjust the offsets used by hv tsc clocksource to +* account for the time spent before hibernation. +* adjusted value = reference counter (time) at suspend +* - reference counter (time) now. +*/ +hv_adj_sched_clock_offset (hv_ref_counter_at_suspend -hv_read_reference_counter ()); +} + +/* +* Functions to override save_sched_clock_state and restore_sched_clock_state +* functions of x86_platform. The Hyper-V clock counter is reset during +* suspend-resume and the offset used to measure time needs to be +* corrected, post resume. +*/ +static void hv_save_sched_clock_state (void ) +{ +old_save_sched_clock_state (); +save_hv_clock_tsc_state (); +} + +static void hv_restore_sched_clock_state (void ) +{ +restore_hv_clock_tsc_state (); +old_restore_sched_clock_state (); +} + +static void __init x86_setup_ops_for_tsc_pg_clock (void ) +{ +if (!(ms_hyperv.features &HV_MSR_REFERENCE_TSC_AVAILABLE )) +return ; + + old_save_sched_clock_state = x86_platform.save_sched_clock_state; + x86_platform.save_sched_clock_state = hv_save_sched_clock_state; + + old_restore_sched_clock_state = x86_platform.restore_sched_clock_state; + x86_platform.restore_sched_clock_state = hv_restore_sched_clock_state; +}#endif /* CONFIG_HYPERV */ static uint32_t __init ms_hyperv_platform (void )
@@ -578,6 +635,7 @@ static void __init ms_hyperv_init_platform(void)/* Register Hyper-V specific clocksource */ hv_init_clocksource (); +x86_setup_ops_for_tsc_pg_clock ();hv_vtl_init_platform ();#endif /*
drivers/clocksource/hyperv_timer.c +13 -1
@@ -27,7 +27,8 @@#include <asm/mshyperv.h> static struct clock_event_device __percpu *hv_clock_event; -static u64 hv_sched_clock_offset__ro_after_init ; +/* Note: offset can hold negative values after hibernation. */ +static u64 hv_sched_clock_offset__read_mostly ;/* * If false, we're using the old mechanism for stimer0 interrupts
@@ -456,6 +457,17 @@ static void resume_hv_clock_tsc(struct clocksource *arg)hv_set_register (HV_REGISTER_REFERENCE_TSC , tsc_msr.as_uint64); } +/* +* Called during resume from hibernation, from overridden +* x86_platform.restore_sched_clock_state routine. This is to adjust offsets +* used to calculate time for hv tsc page based sched_clock, to account for +* time spent before hibernation. +*/ +void hv_adj_sched_clock_offset (u64 offset) +{ + hv_sched_clock_offset -= offset; +} +#ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK static int hv_cs_enable (struct clocksource *cs) {
include/clocksource/hyperv_timer.h +2 -0
@@ -38,6 +38,8 @@ extern void hv_remap_tsc_clocksource(void);extern unsigned long hv_get_tsc_pfn (void );extern struct ms_hyperv_tsc_page *hv_get_tsc_page (void ); +extern void hv_adj_sched_clock_offset (u64 offset); + static __always_inline boolhv_read_tsc_page_tsc (const struct ms_hyperv_tsc_page *tsc_pg,u64 *cur_tsc,u64 *time)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 81/222 of: address: Remove duplicated functions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herve Codina <[email protected]>
[ Upstream commit 3eb030c60835668997d5763b1a0c7938faf169f6 ]
The recently added of_bus_default_flags_translate() performs the exact same operation as of_bus_pci_translate() and of_bus_isa_translate().
Avoid duplicated code replacing both of_bus_pci_translate() and of_bus_isa_translate() with of_bus_default_flags_translate().
Stable-dep-of: 7f05e20b989a ("of: address: Preserve the flags portion on 1:1 dma-ranges mapping")
--- drivers/of/address.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
drivers/of/address.c +2 -11
@@ -217,10 +217,6 @@ static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns, return da - cp; } -static int of_bus_pci_translate (__be32 *addr,u64 offset,int na) -{ -return of_bus_default_translate (addr +1 , offset, na -1 ); -}#endif /* CONFIG_PCI */ /*
@@ -344,11 +340,6 @@ static u64 of_bus_isa_map(__be32 *addr, const __be32 *range, int na, int ns,return da - cp; } -static int of_bus_isa_translate (__be32 *addr,u64 offset,int na) -{ -return of_bus_default_translate (addr +1 , offset, na -1 ); -} -static unsigned int of_bus_isa_get_flags (const __be32 *addr) {unsigned int flags =0 ;
@@ -379,7 +370,7 @@ static struct of_bus of_busses[] = { .match = of_bus_pci_match, .count_cells = of_bus_pci_count_cells, .map = of_bus_pci_map, - .translate = of_bus_pci_translate, + .translate = of_bus_default_flags_translate, .has_flags = true, .get_flags = of_bus_pci_get_flags, },
@@ -391,7 +382,7 @@ static struct of_bus of_busses[] = { .match = of_bus_isa_match, .count_cells = of_bus_isa_count_cells, .map = of_bus_isa_map, - .translate = of_bus_isa_translate, + .translate = of_bus_default_flags_translate, .has_flags = true, .get_flags = of_bus_isa_get_flags, },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 82/222 of: address: Store number of bus flag cells rather than bool
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Herring <[email protected]>
[ Upstream commit 88696db08b7efa3b6bb722014ea7429e78f6be32 ]
It is more useful to know how many flags cells a bus has rather than whether a bus has flags or not as ultimately the number of cells is the information used. Replace 'has_flags' boolean with 'flag_cells' count.
Stable-dep-of: 7f05e20b989a ("of: address: Preserve the flags portion on 1:1 dma-ranges mapping")
--- drivers/of/address.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/of/address.c +5 -9
@@ -46,7 +46,7 @@ struct of_bus {u64 (*map)(__be32 *addr,const __be32 *range,int na,int ns,int pna);int (*translate)(__be32 *addr,u64 offset,int na); -bool has_flags; +int flag_cells;unsigned int (*get_flags)(const __be32 *addr); };
@@ -371,7 +371,7 @@ static struct of_bus of_busses[] = { .count_cells = of_bus_pci_count_cells, .map = of_bus_pci_map, .translate = of_bus_default_flags_translate, - .has_flags = true, + .flag_cells = 1, .get_flags = of_bus_pci_get_flags, },#endif /* CONFIG_PCI */
@@ -383,7 +383,7 @@ static struct of_bus of_busses[] = { .count_cells = of_bus_isa_count_cells, .map = of_bus_isa_map, .translate = of_bus_default_flags_translate, - .has_flags = true, + .flag_cells = 1, .get_flags = of_bus_isa_get_flags, },/* Default with flags cell */
@@ -394,7 +394,7 @@ static struct of_bus of_busses[] = { .count_cells = of_bus_default_count_cells, .map = of_bus_default_flags_map, .translate = of_bus_default_flags_translate, - .has_flags = true, + .flag_cells = 1, .get_flags = of_bus_default_flags_get_flags, },/* Default */
@@ -827,7 +827,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,int na = parser->na;int ns = parser->ns;int np = parser->pna + na + ns; -int busflag_na =0 ; +int busflag_na = parser->bus->flag_cells;if (!range)return NULL ;
@@ -837,10 +837,6 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, range->flags = parser->bus->get_flags (parser->range); -/* A extra cell for resource flags */ -if (parser->bus->has_flags) - busflag_na =1 ; - range->bus_addr =of_read_number (parser->range + busflag_na, na - busflag_na);if (parser->dma)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 83/222 of: address: Preserve the flags portion on 1:1 dma-ranges mapping
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea della Porta <[email protected]>
[ Upstream commit 7f05e20b989ac33c9c0f8c2028ec0a566493548f ]
A missing or empty dma-ranges in a DT node implies a 1:1 mapping for dma translations. In this specific case, the current behaviour is to zero out the entire specifier so that the translation could be carried on as an offset from zero. This includes address specifier that has flags (e.g. PCI ranges).
Once the flags portion has been zeroed, the translation chain is broken since the mapping functions will check the upcoming address specifier against mismatching flags, always failing the 1:1 mapping and its entire purpose of always succeeding.
Set to zero only the address portion while passing the flags through.
--- drivers/of/address.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/of/address.c +2 -1
@@ -476,7 +476,8 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, }if (ranges ==NULL || rlen ==0 ) { offset =of_read_number (addr, na); -memset (addr,0 , pna *4 ); +/* set address to zero, pass flags through */ +memset (addr + pbus->flag_cells,0 , (pna - pbus->flag_cells) *4 );pr_debug ("empty ranges; 1:1 translation\n" ); goto finish; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 84/222 watchdog: rzg2l_wdt: Remove reset de-assert from probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 064319c3fac88e04f53f3460cd24ae90de2d9fb6 ]
There is no need to de-assert the reset signal on probe as the watchdog is not used prior executing start. Also, the clocks are not enabled in probe (pm_runtime_enable() doesn't do that), thus this is another indicator that the watchdog wasn't used previously like this. Instead, keep the watchdog hardware in its previous state at probe (by default it is in reset state), enable it when it is started and move it to reset state when it is stopped. This saves some extra power when the watchdog is unused.
Stable-dep-of: bad201b2ac4e ("watchdog: rzg2l_wdt: Power on the watchdog domain in the restart handler")
--- drivers/watchdog/rzg2l_wdt.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
drivers/watchdog/rzg2l_wdt.c +17 -11
@@ -129,6 +129,12 @@ static int rzg2l_wdt_start(struct watchdog_device *wdev)if (ret)return ret; + ret =reset_control_deassert (priv->rstc); +if (ret) { +pm_runtime_put (wdev->parent); +return ret; + } +/* Initialize time out */ rzg2l_wdt_init_timeout (wdev);
@@ -146,7 +152,9 @@ static int rzg2l_wdt_stop(struct watchdog_device *wdev)struct rzg2l_wdt_priv *priv =watchdog_get_drvdata (wdev);int ret; -rzg2l_wdt_reset (priv); + ret =reset_control_assert (priv->rstc); +if (ret) +return ret; ret =pm_runtime_put (wdev->parent);if (ret <0 )
@@ -186,6 +194,12 @@ static int rzg2l_wdt_restart(struct watchdog_device *wdev,clk_prepare_enable (priv->osc_clk);if (priv->devtype ==WDT_RZG2L ) { +int ret; + + ret =reset_control_deassert (priv->rstc); +if (ret) +return ret; +/* Generate Reset (WDTRSTB) Signal on parity error */ rzg2l_wdt_write (priv,0 ,PECR );
@@ -236,13 +250,11 @@ static const struct watchdog_ops rzg2l_wdt_ops = { .restart = rzg2l_wdt_restart, }; -static void rzg2l_wdt_reset_assert_pm_disable (void *data) +static void rzg2l_wdt_pm_disable (void *data) {struct watchdog_device *wdev = data; -struct rzg2l_wdt_priv *priv =watchdog_get_drvdata (wdev);pm_runtime_disable (wdev->parent); -reset_control_assert (priv->rstc); }static int rzg2l_wdt_probe (struct platform_device *pdev)
@@ -285,10 +297,6 @@ static int rzg2l_wdt_probe(struct platform_device *pdev)return dev_err_probe (&pdev->dev,PTR_ERR (priv->rstc),"failed to get cpg reset" ); - ret =reset_control_deassert (priv->rstc); -if (ret) -return dev_err_probe (dev, ret,"failed to deassert" ); - priv->devtype = (uintptr_t )of_device_get_match_data (dev);if (priv->devtype ==WDT_RZV2M ) {
@@ -309,9 +317,7 @@ static int rzg2l_wdt_probe(struct platform_device *pdev) priv->wdev.timeout =WDT_DEFAULT_TIMEOUT ;watchdog_set_drvdata (&priv->wdev, priv); - ret =devm_add_action_or_reset (&pdev->dev, - rzg2l_wdt_reset_assert_pm_disable, - &priv->wdev); + ret =devm_add_action_or_reset (&pdev->dev, rzg2l_wdt_pm_disable, &priv->wdev);if (ret <0 )return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 85/222 watchdog: rzg2l_wdt: Rely on the reset driver for doing proper reset
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit d8997ed79ed7c7c32b2ae571e0d99a58bbfd01fe ]
The reset driver has been adapted in commit da235d2fac21 ("clk: renesas: rzg2l: Check reset monitor registers") to check the reset monitor bits before declaring reset asserts/de-asserts as successful/failure operations. With that, there is no need to keep the reset workaround for RZ/V2M in place in the watchdog driver.
Stable-dep-of: bad201b2ac4e ("watchdog: rzg2l_wdt: Power on the watchdog domain in the restart handler")
--- drivers/watchdog/rzg2l_wdt.c | 39 ++++-------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-)
drivers/watchdog/rzg2l_wdt.c +4 -35
@@ -8,7 +8,6 @@#include <linux/clk.h> #include <linux/delay.h> #include <linux/io.h> -#include <linux/iopoll.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/of.h>
@@ -54,35 +53,11 @@ struct rzg2l_wdt_priv {struct reset_control *rstc;unsigned long osc_clk_rate;unsigned long delay; -unsigned long minimum_assertion_period;struct clk *pclk;struct clk *osc_clk;enum rz_wdt_type devtype; }; -static int rzg2l_wdt_reset (struct rzg2l_wdt_priv *priv) -{ -int err, status; - -if (priv->devtype ==WDT_RZV2M ) { -/* WDT needs TYPE-B reset control */ - err =reset_control_assert (priv->rstc); -if (err) -return err; -ndelay (priv->minimum_assertion_period); - err =reset_control_deassert (priv->rstc); -if (err) -return err; - err =read_poll_timeout (reset_control_status, status, - status !=1 ,0 ,1000 , false, - priv->rstc); - }else { - err =reset_control_reset (priv->rstc); - } - -return err; -} -static void rzg2l_wdt_wait_delay (struct rzg2l_wdt_priv *priv) {/* delay timer when change the setting register */
@@ -189,13 +164,12 @@ static int rzg2l_wdt_restart(struct watchdog_device *wdev, unsigned long action, void *data) { struct rzg2l_wdt_priv *priv = watchdog_get_drvdata(wdev); +int ret;clk_prepare_enable (priv->pclk);clk_prepare_enable (priv->osc_clk);if (priv->devtype ==WDT_RZG2L ) { -int ret; - ret =reset_control_deassert (priv->rstc);if (ret)return ret;
@@ -207,7 +181,9 @@ static int rzg2l_wdt_restart(struct watchdog_device *wdev,rzg2l_wdt_write (priv,PEEN_FORCE ,PEEN ); }else {/* RZ/V2M doesn't have parity error registers */ -rzg2l_wdt_reset (priv); + ret =reset_control_reset (priv->rstc); +if (ret) +return ret; wdev->timeout =0 ;
@@ -299,13 +275,6 @@ static int rzg2l_wdt_probe(struct platform_device *pdev) priv->devtype = (uintptr_t )of_device_get_match_data (dev); -if (priv->devtype ==WDT_RZV2M ) { - priv->minimum_assertion_period =RZV2M_A_NSEC + -3 *F2CYCLE_NSEC (pclk_rate) +5 * -max (F2CYCLE_NSEC (priv->osc_clk_rate), -F2CYCLE_NSEC (pclk_rate)); - } -pm_runtime_enable (&pdev->dev); priv->wdev.info = &rzg2l_wdt_ident;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 86/222 watchdog: rzg2l_wdt: Power on the watchdog domain in the restart handler
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit bad201b2ac4e238c6d4b6966a220240e3861640c ]
On RZ/G3S the watchdog can be part of a software-controlled PM domain. In this case, the watchdog device need to be powered on in
struct watchdog_ops::restart API. This can be done though pm_runtime_resume_and_get() API if the watchdog PM domain and watchdog device are marked as IRQ safe. We mark the watchdog PM domain as IRQ safe with GENPD_FLAG_IRQ_SAFE when the watchdog PM domain is registered and the watchdog device though pm_runtime_irq_safe().
Before commit e4cf89596c1f ("watchdog: rzg2l_wdt: Fix 'BUG: Invalid wait context'") pm_runtime_get_sync() was used in watchdog restart handler (which is similar to pm_runtime_resume_and_get() except the later one handles the runtime resume errors).
Commit e4cf89596c1f ("watchdog: rzg2l_wdt: Fix 'BUG: Invalid wait context'") dropped the pm_runtime_get_sync() and replaced it with clk_prepare_enable() to avoid invalid wait context due to genpd_lock() in genpd_runtime_resume() being called from atomic context. But clk_prepare_enable() doesn't fit for this either (as reported by Ulf Hansson) as clk_prepare() can also sleep (it just not throw invalid wait context warning as it is not written for this).
Because the watchdog device is marked now as IRQ safe (though this patch) the irq_safe_dev_in_sleep_domain() call from genpd_runtime_resume() returns 1 for devices not registering an IRQ safe PM domain for watchdog (as the watchdog device is IRQ safe, PM domain is not and watchdog PM domain is always-on), this being the case for RZ/G3S with old device trees and the rest of the SoCs that use this driver, we can now drop also the clk_prepare_enable() calls in restart handler and rely on pm_runtime_resume_and_get().
Thus, drop clk_prepare_enable() and use pm_runtime_resume_and_get() in watchdog restart handler.
--- drivers/watchdog/rzg2l_wdt.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
drivers/watchdog/rzg2l_wdt.c +18 -2
@@ -12,6 +12,7 @@#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> +#include <linux/pm_domain.h> #include <linux/pm_runtime.h> #include <linux/reset.h> #include <linux/units.h>
@@ -166,8 +167,22 @@ static int rzg2l_wdt_restart(struct watchdog_device *wdev,struct rzg2l_wdt_priv *priv =watchdog_get_drvdata (wdev);int ret; -clk_prepare_enable (priv->pclk); -clk_prepare_enable (priv->osc_clk); +/* +* In case of RZ/G3S the watchdog device may be part of an IRQ safe power +* domain that is currently powered off. In this case we need to power +* it on before accessing registers. Along with this the clocks will be +* enabled. We don't undo the pm_runtime_resume_and_get() as the device +* need to be on for the reboot to happen. +* +* For the rest of SoCs not registering a watchdog IRQ safe power +* domain it is safe to call pm_runtime_resume_and_get() as the +* irq_safe_dev_in_sleep_domain() call in genpd_runtime_resume() +* returns non zero value and the genpd_lock() is avoided, thus, there +* will be no invalid wait context reported by lockdep. +*/ + ret =pm_runtime_resume_and_get (wdev->parent); +if (ret) +return ret;if (priv->devtype ==WDT_RZG2L ) { ret =reset_control_deassert (priv->rstc);
@@ -275,6 +290,7 @@ static int rzg2l_wdt_probe(struct platform_device *pdev) priv->devtype = (uintptr_t )of_device_get_match_data (dev); +pm_runtime_irq_safe (&pdev->dev);pm_runtime_enable (&pdev->dev); priv->wdev.info = &rzg2l_wdt_ident;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 87/222 udf_rename(): only access the child content on cross-directory rename
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
[ Upstream commit 9d35cebb794bb7be93db76c3383979c7deacfef9 ]
We can't really afford locking the source on same-directory rename; currently vfs_rename() tries to do that, but it will have to be changed. The logics in udf_rename() is lazy and goes looking for ".." in source even in same-directory case. It's not hard to get rid of that, leaving that behaviour only for cross-directory case; that VFS can get locks safely (and will keep doing that after the coming changes).
Stable-dep-of: 6756af923e06 ("udf: Verify inode link counts before performing rename")
--- fs/udf/namei.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/udf/namei.c +6 -1
@@ -770,7 +770,7 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,struct inode *old_inode =d_inode (old_dentry);struct inode *new_inode =d_inode (new_dentry);struct udf_fileident_iter oiter, niter, diriter; -bool has_diriter = false; +bool has_diriter = false, is_dir = false;int retval;struct kernel_lb_addr tloc;
@@ -793,6 +793,9 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,if (!empty_dir (new_inode)) goto out_oiter; } + is_dir = true; + } +if (is_dir && old_dir != new_dir) { retval =udf_fiiter_find_entry (old_inode, &dotdot_name, &diriter);if (retval == -ENOENT ) {
@@ -880,7 +883,9 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,cpu_to_lelb (UDF_I (new_dir)->i_location);udf_fiiter_write_fi (&diriter,NULL );udf_fiiter_release (&diriter); + } +if (is_dir) {inode_dec_link_count (old_dir);if (new_inode)inode_dec_link_count (new_inode);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 88/222 udf: Verify inode link counts before performing rename
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
[ Upstream commit 6756af923e06aa33ad8894aaecbf9060953ba00f ]
During rename, we are updating link counts of various inodes either when rename deletes target or when moving directory across directories. Verify involved link counts are sane so that we don't trip warnings in VFS.
--- fs/udf/namei.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/udf/namei.c +10 -0
@@ -792,8 +792,18 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir, retval = -ENOTEMPTY ;if (!empty_dir (new_inode)) goto out_oiter; + retval = -EFSCORRUPTED ; +if (new_inode->i_nlink !=2 ) + goto out_oiter; } + retval = -EFSCORRUPTED ; +if (old_dir->i_nlink <3 ) + goto out_oiter; is_dir = true; + }else if (new_inode) { + retval = -EFSCORRUPTED ; +if (new_inode->i_nlink <1 ) + goto out_oiter; }if (is_dir && old_dir != new_dir) { retval = udf_fiiter_find_entry(old_inode, &dotdot_name,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 89/222 ALSA: ump: Use guard() for locking
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 631896f7eaaf8cf8c639b065d3c9fbaa66da5d32 ]
We can simplify the code gracefully with new guard() macro and co for automatic cleanup of locks.
Only the code refactoring, and no functional changes.
Stable-dep-of: 3978d53df723 ("ALSA: ump: Don't open legacy substream for an inactive group")
--- sound/core/ump.c | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-)
sound/core/ump.c +12 -23
@@ -1076,13 +1076,11 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)struct snd_ump_endpoint *ump = substream->rmidi->private_data;int dir = substream->stream;int group = ump->legacy_mapping[substream->number]; -int err =0 ; +int err; -mutex_lock (&ump->open_mutex); -if (ump->legacy_substreams[dir][group]) { - err = -EBUSY ; - goto unlock; - } +guard (mutex)(&ump->open_mutex); +if (ump->legacy_substreams[dir][group]) +return -EBUSY ;if (dir ==SNDRV_RAWMIDI_STREAM_OUTPUT ) {if (!ump->legacy_out_opens) { err = snd_rawmidi_kernel_open(&ump->core, 0,
@@ -1090,17 +1088,14 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)SNDRV_RAWMIDI_LFLG_APPEND , &ump->legacy_out_rfile);if (err <0 ) - goto unlock; +return err; } ump->legacy_out_opens++;snd_ump_convert_reset (&ump->out_cvts[group]); } -spin_lock_irq (&ump->legacy_locks[dir]); +guard (spinlock_irq)(&ump->legacy_locks[dir]); ump->legacy_substreams[dir][group] = substream; -spin_unlock_irq (&ump->legacy_locks[dir]); - unlock: -mutex_unlock (&ump->open_mutex); -return err; +return 0 ; }static int snd_ump_legacy_close (struct snd_rawmidi_substream *substream)
@@ -1109,15 +1104,13 @@ static int snd_ump_legacy_close(struct snd_rawmidi_substream *substream)int dir = substream->stream;int group = ump->legacy_mapping[substream->number]; -mutex_lock (&ump->open_mutex); -spin_lock_irq (&ump->legacy_locks[dir]); - ump->legacy_substreams[dir][group] =NULL ; -spin_unlock_irq (&ump->legacy_locks[dir]); +guard (mutex)(&ump->open_mutex); +scoped_guard (spinlock_irq, &ump->legacy_locks[dir]) + ump->legacy_substreams[dir][group] = NULL;if (dir ==SNDRV_RAWMIDI_STREAM_OUTPUT ) {if (!--ump->legacy_out_opens)snd_rawmidi_kernel_release (&ump->legacy_out_rfile); } -mutex_unlock (&ump->open_mutex);return 0 ; }
@@ -1169,12 +1162,11 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,const int dir =SNDRV_RAWMIDI_STREAM_OUTPUT ;unsigned char c;int group, size =0 ; -unsigned long flags;if (!ump->out_cvts || !ump->legacy_out_opens)return 0 ; -spin_lock_irqsave (&ump->legacy_locks[dir], flags); +guard (spinlock_irqsave)(&ump->legacy_locks[dir]);for (group =0 ; group <SNDRV_UMP_MAX_GROUPS ; group++) { substream = ump->legacy_substreams[dir][group];if (!substream)
@@ -1190,7 +1182,6 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,break ; } } -spin_unlock_irqrestore (&ump->legacy_locks[dir], flags);return size; }
@@ -1200,18 +1191,16 @@ static void process_legacy_input(struct snd_ump_endpoint *ump, const u32 *src,struct snd_rawmidi_substream *substream;unsigned char buf[16 ];unsigned char group; -unsigned long flags;const int dir =SNDRV_RAWMIDI_STREAM_INPUT ;int size; size =snd_ump_convert_from_ump (src, buf, &group);if (size <=0 )return ; -spin_lock_irqsave (&ump->legacy_locks[dir], flags); +guard (spinlock_irqsave)(&ump->legacy_locks[dir]); substream = ump->legacy_substreams[dir][group];if (substream)snd_rawmidi_receive (substream, buf, size); -spin_unlock_irqrestore (&ump->legacy_locks[dir], flags); }/* Fill ump->legacy_mapping[] for groups to be used for legacy rawmidi */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 90/222 ALSA: ump: Dont open legacy substream for an inactive group
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 3978d53df7236f0a517c2abeb43ddf6ac162cdd8 ]
When a UMP Group is inactive, we shouldn't allow users to access it via the legacy MIDI access. Add the group active flag check and return -ENODEV if it's inactive.
--- sound/core/ump.c | 2 ++ 1 file changed, 2 insertions(+)
sound/core/ump.c +2 -0
@@ -1081,6 +1081,8 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)guard (mutex)(&ump->open_mutex);if (ump->legacy_substreams[dir][group])return -EBUSY ; +if (!ump->groups[group].active) +return -ENODEV ;if (dir ==SNDRV_RAWMIDI_STREAM_OUTPUT ) {if (!ump->legacy_out_opens) { err = snd_rawmidi_kernel_open(&ump->core, 0,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 91/222 ALSA: ump: Indicate the inactive group in legacy substream names
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit e29e504e7890b9ee438ca6370d0180d607c473f9 ]
Since the legacy rawmidi has no proper way to know the inactive group, indicate it in the rawmidi substream names with "[Inactive]" suffix when the corresponding UMP group is inactive.
--- sound/core/ump.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/core/ump.c +3 -2
@@ -1245,8 +1245,9 @@ static void fill_substream_names(struct snd_ump_endpoint *ump, name = ump->groups[idx].name;if (!*name) name = ump->info.name; -snprintf (s->name,sizeof (s->name),"Group %d (%.16s)" , - idx +1 , name); +snprintf (s->name,sizeof (s->name),"Group %d (%.16s)%s" , + idx +1 , name, + ump->groups[idx].active ?"" :" [Inactive]" ); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 92/222 ALSA: ump: Update legacy substream names upon FB info update
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit edad3f9519fcacb926d0e3f3217aecaf628a593f ]
The legacy rawmidi substreams should be updated when UMP FB Info or UMP FB Name are received, too.
--- sound/core/ump.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
sound/core/ump.c +15 -4
@@ -37,6 +37,7 @@ static int process_legacy_output(struct snd_ump_endpoint *ump, u32 *buffer, int count);static void process_legacy_input (struct snd_ump_endpoint *ump,const u32 *src,int words); +static void update_legacy_names (struct snd_ump_endpoint *ump);#else static inline int process_legacy_output (struct snd_ump_endpoint *ump,u32 *buffer,int count)
@@ -47,6 +48,9 @@ static inline void process_legacy_input(struct snd_ump_endpoint *ump, const u32 *src, int words) { } +static inline void update_legacy_names (struct snd_ump_endpoint *ump) +{ +}#endif static const struct snd_rawmidi_global_ops snd_ump_rawmidi_ops = {
@@ -850,6 +854,7 @@ static int ump_handle_fb_info_msg(struct snd_ump_endpoint *ump,fill_fb_info (ump, &fb->info, buf);if (ump->parsed) {snd_ump_update_group_attrs (ump); +update_legacy_names (ump);seq_notify_fb_change (ump, fb); } }
@@ -882,6 +887,7 @@ static int ump_handle_fb_name_msg(struct snd_ump_endpoint *ump,/* notify the FB name update to sequencer, too */ if (ret >0 && ump->parsed) {snd_ump_update_group_attrs (ump); +update_legacy_names (ump);seq_notify_fb_change (ump, fb); }return ret;
@@ -1251,6 +1257,14 @@ static void fill_substream_names(struct snd_ump_endpoint *ump, } } +static void update_legacy_names (struct snd_ump_endpoint *ump) +{ +struct snd_rawmidi *rmidi = ump->legacy_rmidi; + +fill_substream_names (ump, rmidi,SNDRV_RAWMIDI_STREAM_INPUT ); +fill_substream_names (ump, rmidi,SNDRV_RAWMIDI_STREAM_OUTPUT ); +} +int snd_ump_attach_legacy_rawmidi (struct snd_ump_endpoint *ump,char *id,int device) {
@@ -1287,10 +1301,7 @@ int snd_ump_attach_legacy_rawmidi(struct snd_ump_endpoint *ump, rmidi->ops = &snd_ump_legacy_ops; rmidi->private_data = ump; ump->legacy_rmidi = rmidi; -if (input) -fill_substream_names (ump, rmidi,SNDRV_RAWMIDI_STREAM_INPUT ); -if (output) -fill_substream_names (ump, rmidi,SNDRV_RAWMIDI_STREAM_OUTPUT ); +update_legacy_names (ump);ump_dbg (ump,"Created a legacy rawmidi #%d (%s)\n" , device, id);return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 93/222 scsi: mpi3mr: Use ida to manage mrioc ID
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guixin Liu <[email protected]>
[ Upstream commit 29b75184f721b16c51ef6e67eec0e40ed88381c7 ]
To ensure that the same ID is not obtained during concurrent execution of the probe, an ida is used to manage the mrioc's ID.
Stable-dep-of: 0d32014f1e3e ("scsi: mpi3mr: Start controller indexing from 0")
--- drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/scsi/mpi3mr/mpi3mr_os.c +10 -2
@@ -8,11 +8,12 @@*/ #include "mpi3mr.h" +#include <linux/idr.h> /* global driver scop variables */ LIST_HEAD (mrioc_list);DEFINE_SPINLOCK (mrioc_list_lock); -static int mrioc_ids; +static DEFINE_IDA (mrioc_ida);static int warn_non_secure_ctlr;atomic64_t event_counter;
@@ -5065,7 +5066,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) } mrioc =shost_priv (shost); - mrioc->id = mrioc_ids++; + retval =ida_alloc_range (&mrioc_ida,1 ,U8_MAX ,GFP_KERNEL ); +if (retval <0 ) + goto id_alloc_failed; + mrioc->id = (u8 )retval;sprintf (mrioc->driver_name,"%s" ,MPI3MR_DRIVER_NAME );sprintf (mrioc->name,"%s%d" , mrioc->driver_name, mrioc->id);INIT_LIST_HEAD (&mrioc->list);
@@ -5215,9 +5219,11 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) resource_alloc_failed:destroy_workqueue (mrioc->fwevt_worker_thread); fwevtthread_failed: +ida_free (&mrioc_ida, mrioc->id);spin_lock (&mrioc_list_lock);list_del (&mrioc->list);spin_unlock (&mrioc_list_lock); +id_alloc_failed:scsi_host_put (shost); shost_failed:return retval;
@@ -5303,6 +5309,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) mrioc->sas_hba.num_phys =0 ; } +ida_free (&mrioc_ida, mrioc->id);spin_lock (&mrioc_list_lock);list_del (&mrioc->list);spin_unlock (&mrioc_list_lock);
@@ -5518,6 +5525,7 @@ static void __exit mpi3mr_exit(void) &driver_attr_event_counter);pci_unregister_driver (&mpi3mr_pci_driver);sas_release_transport (mpi3mr_transport_template); +ida_destroy (&mrioc_ida); }module_init (mpi3mr_init);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 94/222 scsi: mpi3mr: Start controller indexing from 0
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ranjan Kumar <[email protected]>
[ Upstream commit 0d32014f1e3e7a7adf1583c45387f26b9bb3a49d ]
Instead of displaying the controller index starting from '1' make the driver display the controller index starting from '0'.
--- drivers/scsi/mpi3mr/mpi3mr_os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/mpi3mr/mpi3mr_os.c +1 -1
@@ -5066,7 +5066,7 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) } mrioc =shost_priv (shost); - retval =ida_alloc_range (&mrioc_ida,1 ,U8_MAX ,GFP_KERNEL ); + retval =ida_alloc_range (&mrioc_ida,0 ,U8_MAX ,GFP_KERNEL );if (retval <0 ) goto id_alloc_failed; mrioc->id = (u8 )retval;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 95/222 ACPI/IORT: Add PMCG platform information for HiSilicon HIP10/11
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yicong Yang <[email protected]>
[ Upstream commit f3b78b470f28bb2a3a40e88bdf5c6de6a35a9b76 ]
HiSilicon HIP10/11 platforms using the same SMMU PMCG with HIP09 and thus suffers the same erratum. List them in the PMCG platform information list without introducing a new SMMU PMCG Model.
Update the silicon-errata.rst as well.
Stable-dep-of: c2b46ae02270 ("ACPI/IORT: Add PMCG platform information for HiSilicon HIP09A")
--- Documentation/arch/arm64/silicon-errata.rst | 4 ++-- drivers/acpi/arm64/iort.c | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-)
Documentation/arch/arm64/silicon-errata.rst +2 -2
@@ -244,8 +244,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip08 SMMU PMCG | #162001800 | N/A | +----------------+-----------------+-----------------+-----------------------------+ -| Hisilicon | Hip08 SMMU PMCG | #162001900 | N/A | -| | Hip09 SMMU PMCG | | | +| Hisilicon | Hip{08,09,10,10C| #162001900 | N/A | +| | ,11} SMMU PMCG | | | +----------------+-----------------+-----------------+-----------------------------+ +----------------+-----------------+-----------------+-----------------------------+ | Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
drivers/acpi/arm64/iort.c +7 -0
@@ -1712,6 +1712,13 @@ static struct acpi_platform_list pmcg_plat_info[] __initdata = {/* HiSilicon Hip09 Platform */ {"HISI " ,"HIP09 " ,0 ,ACPI_SIG_IORT , greater_than_or_equal, "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, +/* HiSilicon Hip10/11 Platform uses the same SMMU IP with Hip09 */ + {"HISI ", "HIP10 ", 0, ACPI_SIG_IORT, greater_than_or_equal, + "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, + {"HISI ", "HIP10C ", 0, ACPI_SIG_IORT, greater_than_or_equal, + "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, + {"HISI ", "HIP11 ", 0, ACPI_SIG_IORT, greater_than_or_equal, + "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, { } };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 96/222 ACPI/IORT: Add PMCG platform information for HiSilicon HIP09A
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qinxin Xia <[email protected]>
[ Upstream commit c2b46ae022704a2d845e59461fa24431ad627022 ]
HiSilicon HIP09A platforms using the same SMMU PMCG with HIP09 and thus suffers the same erratum. List them in the PMCG platform information list without introducing a new SMMU PMCG Model.
Update the silicon-errata.rst as well.
--- Documentation/arch/arm64/silicon-errata.rst | 5 +++-- drivers/acpi/arm64/iort.c | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-)
Documentation/arch/arm64/silicon-errata.rst +3 -2
@@ -244,8 +244,9 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip08 SMMU PMCG | #162001800 | N/A | +----------------+-----------------+-----------------+-----------------------------+ -| Hisilicon | Hip{08,09,10,10C| #162001900 | N/A | -| | ,11} SMMU PMCG | | | +| Hisilicon | Hip{08,09,09A,10| #162001900 | N/A | +| | ,10C,11} | | | +| | SMMU PMCG | | | +----------------+-----------------+-----------------+-----------------------------+ +----------------+-----------------+-----------------+-----------------------------+ | Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
drivers/acpi/arm64/iort.c +2 -0
@@ -1712,6 +1712,8 @@ static struct acpi_platform_list pmcg_plat_info[] __initdata = {/* HiSilicon Hip09 Platform */ {"HISI " ,"HIP09 " ,0 ,ACPI_SIG_IORT , greater_than_or_equal, "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, + {"HISI ", "HIP09A ", 0, ACPI_SIG_IORT, greater_than_or_equal, + "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09},/* HiSilicon Hip10/11 Platform uses the same SMMU IP with Hip09 */ {"HISI ", "HIP10 ", 0, ACPI_SIG_IORT, greater_than_or_equal, "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09},
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 97/222 x86/ptrace: Cleanup the definition of the pt_regs structure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Li <[email protected]>
[ Upstream commit ee63291aa8287cb7ded767d340155fe8681fc075 ]
struct pt_regs is hard to read because the member or section related comments are not aligned with the members.
The 'cs' and 'ss' members of pt_regs are type of 'unsigned long' while in reality they are only 16-bit wide. This works so far as the remaining space is unused, but FRED will use the remaining bits for other purposes.
To prepare for FRED:
- Cleanup the formatting
- Convert 'cs' and 'ss' to u16 and embed them into an union with a u64
- Fixup the related printk() format strings
Stable-dep-of: dc81e556f2a0 ("x86/fred: Clear WFE in missing-ENDBRANCH #CPs")
--- arch/x86/entry/vsyscall/vsyscall_64.c | 2 +- arch/x86/include/asm/ptrace.h | 48 +++++++++++++++++++-------- arch/x86/kernel/process_64.c | 2 +- 3 files changed, 37 insertions(+), 15 deletions(-)
arch/x86/entry/vsyscall/vsyscall_64.c +1 -1
@@ -76,7 +76,7 @@ static void warn_bad_vsyscall(const char *level, struct pt_regs *regs,if (!show_unhandled_signals)return ; -printk_ratelimited ("%s%s[%d] %s ip:%lx cs:%lx sp:%lx ax:%lx si:%lx di:%lx\n" , +printk_ratelimited ("%s%s[%d] %s ip:%lx cs:%x sp:%lx ax:%lx si:%lx di:%lx\n" , level, current->comm,task_pid_nr (current), message, regs->ip, regs->cs, regs->sp, regs->ax, regs->si, regs->di);
arch/x86/include/asm/ptrace.h +35 -13
70 lines not on this page · raw message
arch/x86/kernel/process_64.c +1 -1
@@ -117,7 +117,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_mode mode,printk ("%sFS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n" , log_lvl, fs, fsindex, gs, gsindex, shadowgs); -printk ("%sCS: %04lx DS: %04x ES: %04x CR0: %016lx\n" , +printk ("%sCS: %04x DS: %04x ES: %04x CR0: %016lx\n" , log_lvl, regs->cs, ds, es, cr0);printk ("%sCR2: %016lx CR3: %016lx CR4: %016lx\n" , log_lvl, cr2, cr3, cr4);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 98/222 x86/ptrace: Add FRED additional information to the pt_regs structure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Li <[email protected]>
[ Upstream commit 3c77bf02d0c03beb3efdf7a5b427fb2e1a76c265 ]
FRED defines additional information in the upper 48 bits of cs/ss fields. Therefore add the information definitions into the pt_regs structure.
Specifically introduce a new structure fred_ss to denote the FRED flags above SS selector, which avoids FRED_SSX_ macros and makes the code simpler and easier to read.
Stable-dep-of: dc81e556f2a0 ("x86/fred: Clear WFE in missing-ENDBRANCH #CPs")
--- arch/x86/include/asm/ptrace.h | 66 ++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 5 deletions(-)
arch/x86/include/asm/ptrace.h +61 -5
@@ -56,6 +56,50 @@ struct pt_regs {#else /* __i386__ */ +struct fred_cs { +/* CS selector */ +u64 cs :16 , +/* Stack level at event time */ + sl :2 , +/* IBT in WAIT_FOR_ENDBRANCH state */ + wfe : 1, + :45 ; +}; + +struct fred_ss { +/* SS selector */ +u64 ss :16 , +/* STI state */ + sti :1 , +/* Set if syscall, sysenter or INT n */ + swevent :1 , +/* Event is NMI type */ + nmi : 1, + :13 , +/* Event vector */ + vector : 8, + :8 , +/* Event type */ + type : 4, + :4 , +/* Event was incident to enclave execution */ + enclave :1 , +/* CPU was in long mode */ + lm :1 , +/* +* Nested exception during FRED delivery, not set +* for #DF. +*/ + nested : 1, + :1 , +/* +* The length of the instruction causing the event. +* Only set for INTO, INT1, INT3, INT n, SYSCALL +* and SYSENTER. 0 otherwise. +*/ + insnlen :4 ; +}; + struct pt_regs {/* * C ABI says these regs are callee-preserved. They aren't saved on
@@ -85,6 +129,12 @@ struct pt_regs {* - the syscall number (syscall, sysenter, int80) * - error_code stored by the CPU on traps and exceptions * - the interrupt number for device interrupts +* +* A FRED stack frame starts here: +* 1) It _always_ includes an error code; +* +* 2) The return frame for ERET[US] starts here, but +* the content of orig_ax is ignored. */ unsigned long orig_ax;
@@ -92,24 +142,30 @@ struct pt_regs {unsigned long ip;union { -/* The full 64-bit data slot containing CS */ -u64 csx;/* CS selector */ u16 cs; +/* The extended 64-bit data slot containing CS */ +u64 csx; +/* The FRED CS extension */ +struct fred_cs fred_cs; };unsigned long flags;unsigned long sp;union { -/* The full 64-bit data slot containing SS */ -u64 ssx;/* SS selector */ u16 ss; +/* The extended 64-bit data slot containing SS */ +u64 ssx; +/* The FRED SS extension */ +struct fred_ss fred_ss; };/* -* Top of stack on IDT systems. +* Top of stack on IDT systems, while FRED systems have extra fields +* defined above for storing exception related information, e.g. CR2 or +* DR6. */ };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 99/222 x86/fred: Clear WFE in missing-ENDBRANCH #CPs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Li (Intel) <[email protected]>
[ Upstream commit dc81e556f2a017d681251ace21bf06c126d5a192 ]
An indirect branch instruction sets the CPU indirect branch tracker (IBT) into WAIT_FOR_ENDBRANCH (WFE) state and WFE stays asserted across the instruction boundary. When the decoder finds an inappropriate instruction while WFE is set ENDBR, the CPU raises a #CP fault.
For the "kernel IBT no ENDBR" selftest where #CPs are deliberately triggered, the WFE state of the interrupted context needs to be cleared to let execution continue. Otherwise when the CPU resumes from the instruction that just caused the previous #CP, another missing-ENDBRANCH #CP is raised and the CPU enters a dead loop.
This is not a problem with IDT because it doesn't preserve WFE and IRET doesn't set WFE. But FRED provides space on the entry stack (in an expanded CS area) to save and restore the WFE state, thus the WFE state is no longer clobbered, so software must clear it.
Clear WFE to avoid dead looping in ibt_clear_fred_wfe() and the !ibt_fatal code path when execution is allowed to continue.
Clobbering WFE in any other circumstance is a security-relevant bug.
[ dhansen: changelog rewording ]
--- arch/x86/kernel/cet.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
arch/x86/kernel/cet.c +30 -0
@@ -81,6 +81,34 @@ static void do_user_cp_fault(struct pt_regs *regs, unsigned long error_code)static __ro_after_init bool ibt_fatal = true; +/* +* By definition, all missing-ENDBRANCH #CPs are a result of WFE && !ENDBR. +* +* For the kernel IBT no ENDBR selftest where #CPs are deliberately triggered, +* the WFE state of the interrupted context needs to be cleared to let execution +* continue. Otherwise when the CPU resumes from the instruction that just +* caused the previous #CP, another missing-ENDBRANCH #CP is raised and the CPU +* enters a dead loop. +* +* This is not a problem with IDT because it doesn't preserve WFE and IRET doesn't +* set WFE. But FRED provides space on the entry stack (in an expanded CS area) +* to save and restore the WFE state, thus the WFE state is no longer clobbered, +* so software must clear it. +*/ +static void ibt_clear_fred_wfe (struct pt_regs *regs) +{ +/* +* No need to do any FRED checks. +* +* For IDT event delivery, the high-order 48 bits of CS are pushed +* as 0s into the stack, and later IRET ignores these bits. +* +* For FRED, a test to check if fred_cs.wfe is set would be dropped +* by compilers. +*/ + regs->fred_cs.wfe =0 ; +} +static void do_kernel_cp_fault (struct pt_regs *regs,unsigned long error_code) {if ((error_code &CP_EC ) !=CP_ENDBR ) {
@@ -90,6 +118,7 @@ static void do_kernel_cp_fault(struct pt_regs *regs, unsigned long error_code)if (unlikely (regs->ip == (unsigned long )&ibt_selftest_noendbr)) { regs->ax =0 ; +ibt_clear_fred_wfe (regs);return ; }
@@ -97,6 +126,7 @@ static void do_kernel_cp_fault(struct pt_regs *regs, unsigned long error_code)if (!ibt_fatal) { printk(KERN_DEFAULT CUT_HERE);__warn (__FILE__, __LINE__, (void *)regs->ip,TAINT_WARN , regs,NULL ); +ibt_clear_fred_wfe (regs);return ; }BUG ();
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 100/222 btrfs: rename and export __btrfs_cow_block()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit 95f93bc4cbcac6121a5ee85cd5019ee8e7447e0b ]
Rename and export __btrfs_cow_block() as btrfs_force_cow_block(). This is to allow to move defrag specific code out of ctree.c and into defrag.c in one of the next patches.
Stable-dep-of: 44f52bbe96df ("btrfs: fix use-after-free when COWing tree bock and tracing is enabled")
--- fs/btrfs/ctree.c | 30 +++++++++++++++--------------- fs/btrfs/ctree.h | 7 +++++++ 2 files changed, 22 insertions(+), 15 deletions(-)
fs/btrfs/ctree.c +15 -15
@@ -526,13 +526,13 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,* bytes the allocator should try to find free next to the block it returns. * This is just a hint and may be ignored by the allocator. */ -static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, -struct btrfs_root *root, -struct extent_buffer *buf, -struct extent_buffer *parent,int parent_slot, -struct extent_buffer **cow_ret, -u64 search_start,u64 empty_size, -enum btrfs_lock_nesting nest) +int btrfs_force_cow_block (struct btrfs_trans_handle *trans, +struct btrfs_root *root, +struct extent_buffer *buf, +struct extent_buffer *parent,int parent_slot, +struct extent_buffer **cow_ret, +u64 search_start,u64 empty_size, +enum btrfs_lock_nesting nest) {struct btrfs_fs_info *fs_info = root->fs_info;struct btrfs_disk_key disk_key;
@@ -699,7 +699,7 @@ static inline int should_cow_block(struct btrfs_trans_handle *trans, }/* -* cows a single block, see __btrfs_cow_block for the real work. +* COWs a single block, see btrfs_force_cow_block() for the real work. * This version of it has extra checks so that a block isn't COWed more than * once per transaction, as long as it hasn't been written yet */
@@ -752,8 +752,8 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,* Also We don't care about the error, as it's handled internally. */ btrfs_qgroup_trace_subtree_after_cow (trans, root, buf); - ret =__btrfs_cow_block (trans, root, buf, parent, - parent_slot, cow_ret, search_start,0 , nest); + ret =btrfs_force_cow_block (trans, root, buf, parent, parent_slot, + cow_ret, search_start,0 , nest);trace_btrfs_cow_block (root, buf, *cow_ret);
@@ -904,11 +904,11 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, search_start = last_block;btrfs_tree_lock (cur); - err =__btrfs_cow_block (trans, root, cur, parent, i, - &cur, search_start, -min (16 * blocksize, - (end_slot - i) * blocksize), -BTRFS_NESTING_COW ); + err =btrfs_force_cow_block (trans, root, cur, parent, i, + &cur, search_start, +min (16 * blocksize, + (end_slot - i) * blocksize), +BTRFS_NESTING_COW );if (err) {btrfs_tree_unlock (cur);free_extent_buffer (cur);
fs/btrfs/ctree.h +7 -0
@@ -538,6 +538,13 @@ int btrfs_cow_block(struct btrfs_trans_handle *trans, struct extent_buffer *parent, int parent_slot, struct extent_buffer **cow_ret, enum btrfs_lock_nesting nest); +int btrfs_force_cow_block (struct btrfs_trans_handle *trans, +struct btrfs_root *root, +struct extent_buffer *buf, +struct extent_buffer *parent,int parent_slot, +struct extent_buffer **cow_ret, +u64 search_start,u64 empty_size, +enum btrfs_lock_nesting nest); int btrfs_copy_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct extent_buffer *buf,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 101/222 btrfs: fix use-after-free when COWing tree bock and tracing is enabled
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit 44f52bbe96dfdbe4aca3818a2534520082a07040 ]
When a COWing a tree block, at btrfs_cow_block(), and we have the tracepoint trace_btrfs_cow_block() enabled and preemption is also enabled (CONFIG_PREEMPT=y), we can trigger a use-after-free in the COWed extent buffer while inside the tracepoint code. This is because in some paths that call btrfs_cow_block(), such as btrfs_search_slot(), we are holding the last reference on the extent buffer @buf so btrfs_force_cow_block() drops the last reference on the @buf extent buffer when it calls free_extent_buffer_stale(buf), which schedules the release of the extent buffer with RCU. This means that if we are on a kernel with preemption, the current task may be preempted before calling trace_btrfs_cow_block() and the extent buffer already released by the time trace_btrfs_cow_block() is called, resulting in a use-after-free.
Fix this by moving the trace_btrfs_cow_block() from btrfs_cow_block() to btrfs_force_cow_block() before the COWed extent buffer is freed. This also has a side effect of invoking the tracepoint in the tree defrag code, at defrag.c:btrfs_realloc_node(), since btrfs_force_cow_block() is called there, but this is fine and it was actually missing there.
--- fs/btrfs/ctree.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
fs/btrfs/ctree.c +4 -7
@@ -660,6 +660,8 @@ int btrfs_force_cow_block(struct btrfs_trans_handle *trans,return ret; } } + +trace_btrfs_cow_block (root, buf, cow);if (unlock_orig)btrfs_tree_unlock (buf);free_extent_buffer_stale (buf);
@@ -711,7 +713,6 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans, {struct btrfs_fs_info *fs_info = root->fs_info;u64 search_start; -int ret;if (unlikely (test_bit (BTRFS_ROOT_DELETING , &root->state))) {btrfs_abort_transaction (trans, -EUCLEAN );
@@ -752,12 +753,8 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,* Also We don't care about the error, as it's handled internally. */ btrfs_qgroup_trace_subtree_after_cow (trans, root, buf); - ret =btrfs_force_cow_block (trans, root, buf, parent, parent_slot, - cow_ret, search_start,0 , nest); - -trace_btrfs_cow_block (root, buf, *cow_ret); - -return ret; +return btrfs_force_cow_block (trans, root, buf, parent, parent_slot, + cow_ret, search_start,0 , nest); }ALLOW_ERROR_INJECTION (btrfs_cow_block,ERRNO );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 102/222 Bluetooth: btusb: add callback function in btusb suspend/resume
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit 95f92928ad2215b5f524903e67eebd8e14f99564 ]
Add suspend/resum callback function in btusb_data which are reserved for vendor specific usage during suspend/resume. hdev->suspend will be added before stop traffic in btusb_suspend and hdev-> resume will be added after resubmit urb in btusb_resume.
Stable-dep-of: cea1805f165c ("Bluetooth: btusb: mediatek: add callback function in btusb_disconnect")
--- drivers/bluetooth/btusb.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/bluetooth/btusb.c +9 -0
@@ -892,6 +892,9 @@ struct btusb_data {int (*setup_on_usb)(struct hci_dev *hdev); +int (*suspend)(struct hci_dev *hdev); +int (*resume)(struct hci_dev *hdev); +int oob_wake_irq;/* irq for out-of-band wake-on-bt */ unsigned cmd_timeout_cnt;
@@ -4691,6 +4694,9 @@ static int btusb_suspend(struct usb_interface *intf, pm_message_t message)cancel_work_sync (&data->work); +if (data->suspend) + data->suspend (data->hdev); +btusb_stop_traffic (data);usb_kill_anchored_urbs (&data->tx_anchor);
@@ -4794,6 +4800,9 @@ static int btusb_resume(struct usb_interface *intf)btusb_submit_isoc_urb (hdev,GFP_NOIO ); } +if (data->resume) + data->resume (hdev); +spin_lock_irq (&data->txlock);play_deferred (data);clear_bit (BTUSB_SUSPENDING , &data->flags);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 103/222 Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit cea1805f165cdd783dd21f26df957118cb8641b4 ]
Add disconnect callback function in btusb_disconnect which is reserved for vendor specific usage before deregister hci in btusb_disconnect.
--- drivers/bluetooth/btusb.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bluetooth/btusb.c +4 -0
@@ -894,6 +894,7 @@ struct btusb_data {int (*suspend)(struct hci_dev *hdev);int (*resume)(struct hci_dev *hdev); +int (*disconnect)(struct hci_dev *hdev);int oob_wake_irq;/* irq for out-of-band wake-on-bt */ unsigned cmd_timeout_cnt;
@@ -4646,6 +4647,9 @@ static void btusb_disconnect(struct usb_interface *intf)if (data->diag)usb_set_intfdata (data->diag,NULL ); +if (data->disconnect) + data->disconnect (hdev); +hci_unregister_dev (hdev);if (intf == data->intf) {
Signature · 1 line
2.39.5