Linux 6.7.9
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.7.9 kernel.
All users of the 6.7 kernel series must upgrade.
The updated 6.7.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.7.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/arch/x86/mds.rst | 38 +- Makefile | 2 arch/arm64/crypto/aes-neonbs-glue.c | 11 arch/powerpc/include/asm/rtas.h | 4 arch/powerpc/kernel/rtas.c | 9 arch/powerpc/platforms/pseries/iommu.c | 156 +++++++---- arch/riscv/Kconfig | 1 arch/riscv/include/asm/csr.h | 2 arch/riscv/include/asm/ftrace.h | 5 arch/riscv/include/asm/hugetlb.h | 2 arch/riscv/include/asm/pgalloc.h | 20 + arch/riscv/include/asm/pgtable-64.h | 2 arch/riscv/include/asm/pgtable.h | 6 arch/riscv/include/asm/vmalloc.h | 61 ---- arch/riscv/kernel/Makefile | 2 arch/riscv/kernel/cpufeature.c | 17 + arch/riscv/kernel/return_address.c | 48 +++ arch/riscv/mm/hugetlbpage.c | 2 arch/x86/entry/entry_32.S | 3 arch/x86/entry/entry_64.S | 11 arch/x86/entry/entry_64_compat.S | 1 arch/x86/include/asm/entry-common.h | 1 arch/x86/include/asm/nospec-branch.h | 12 arch/x86/kernel/cpu/bugs.c | 15 - arch/x86/kernel/cpu/common.c | 4 arch/x86/kernel/cpu/intel.c | 178 ++++++------ arch/x86/kernel/e820.c | 8 arch/x86/kernel/nmi.c | 3 arch/x86/kvm/vmx/run_flags.h | 7 arch/x86/kvm/vmx/vmenter.S | 9 arch/x86/kvm/vmx/vmx.c | 20 + drivers/bluetooth/btqca.c | 2 drivers/bluetooth/hci_bcm4377.c | 3 drivers/bluetooth/hci_qca.c | 22 + drivers/cpufreq/intel_pstate.c | 3 drivers/dma/dw-edma/dw-edma-v0-core.c | 17 + drivers/dma/dw-edma/dw-hdma-v0-core.c | 39 +- drivers/dma/dw-edma/dw-hdma-v0-regs.h | 2 drivers/dma/fsl-edma-common.c | 2 drivers/dma/fsl-qdma.c | 21 - drivers/dma/idxd/cdev.c | 2 drivers/dma/idxd/debugfs.c | 2 drivers/dma/idxd/idxd.h | 1 drivers/dma/idxd/init.c | 15 - drivers/dma/idxd/irq.c | 3 drivers/dma/ptdma/ptdma-dmaengine.c | 2 drivers/firmware/efi/capsule-loader.c | 2 drivers/gpio/gpio-74x164.c | 4 drivers/gpio/gpiolib.c | 10 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 6 drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c | 5 drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 29 ++ drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 9 drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 9 drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 9 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 9 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 9 drivers/gpu/drm/drm_buddy.c | 10 drivers/gpu/drm/nouveau/nouveau_drm.c | 5 drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c | 4 drivers/gpu/drm/tegra/drm.c | 23 + drivers/gpu/host1x/dev.c | 15 - drivers/gpu/host1x/dev.h | 6 drivers/iommu/iommufd/io_pagetable.c | 9 drivers/iommu/iommufd/selftest.c | 27 + drivers/mfd/twl6030-irq.c | 10 drivers/mmc/core/mmc.c | 2 drivers/mmc/host/mmci_stm32_sdmmc.c | 24 + drivers/mmc/host/sdhci-xenon-phy.c | 48 ++- drivers/mtd/nand/raw/marvell_nand.c | 13 drivers/mtd/nand/spi/gigadevice.c | 6 drivers/net/ethernet/freescale/fman/fman_memac.c | 18 - drivers/net/ethernet/intel/ice/ice_dpll.c | 91 +++++- drivers/net/ethernet/intel/igb/igb_ptp.c | 5 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 drivers/net/gtp.c | 12 drivers/net/tun.c | 1 drivers/net/usb/dm9601.c | 2 drivers/net/usb/lan78xx.c | 5 drivers/net/veth.c | 40 +- drivers/of/property.c | 2 drivers/perf/riscv_pmu.c | 18 - drivers/perf/riscv_pmu_legacy.c | 10 drivers/phy/freescale/phy-fsl-imx8-mipi-dphy.c | 2 drivers/phy/qualcomm/phy-qcom-m31.c | 2 drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 10 drivers/pmdomain/arm/scmi_perf_domain.c | 3 drivers/pmdomain/qcom/rpmhpd.c | 7 drivers/power/supply/Kconfig | 1 drivers/power/supply/bq27xxx_battery_i2c.c | 4 drivers/soc/qcom/pmic_glink.c | 21 - drivers/spi/spi-cadence-quadspi.c | 11 drivers/video/fbdev/core/fbcon.c | 8 fs/afs/dir.c | 4 fs/btrfs/dev-replace.c | 24 + fs/btrfs/disk-io.c | 22 - fs/btrfs/disk-io.h | 2 fs/btrfs/extent_io.c | 103 ++++++- fs/btrfs/ioctl.c | 2 fs/btrfs/send.c | 17 - fs/btrfs/transaction.c | 2 fs/ceph/mdsmap.c | 7 fs/ceph/mdsmap.h | 6 fs/efivarfs/vars.c | 17 - fs/nfs/write.c | 4 include/linux/bvec.h | 2 include/linux/netfilter.h | 1 include/net/mctp.h | 1 include/sound/soc-card.h | 2 include/uapi/linux/in6.h | 2 kernel/trace/fprobe.c | 14 - lib/nlattr.c | 4 mm/debug_vm_pgtable.c | 8 mm/filemap.c | 51 +-- mm/migrate.c | 8 net/bluetooth/hci_core.c | 7 net/bluetooth/hci_event.c | 13 net/bluetooth/hci_sync.c | 7 net/bluetooth/l2cap_core.c | 8 net/bridge/br_netfilter_hooks.c | 96 ++++++ net/bridge/netfilter/nf_conntrack_bridge.c | 30 ++ net/core/rtnetlink.c | 11 net/hsr/hsr_forward.c | 2 net/ipv4/ip_tunnel.c | 28 +- net/ipv6/addrconf.c | 7 net/mctp/route.c | 10 net/mptcp/diag.c | 3 net/mptcp/options.c | 2 net/mptcp/pm_userspace.c | 10 net/mptcp/protocol.c | 52 +++ net/mptcp/protocol.h | 21 - net/netfilter/nf_conntrack_core.c | 1 net/netfilter/nft_compat.c | 20 + net/netlink/af_netlink.c | 2 net/tls/tls_sw.c | 40 ++ net/unix/garbage.c | 21 - net/wireless/nl80211.c | 2 scripts/Kconfig.include | 2 scripts/Makefile.compiler | 2 security/landlock/fs.c | 4 security/tomoyo/common.c | 3 sound/core/Makefile | 1 sound/core/ump.c | 4 sound/firewire/amdtp-stream.c | 2 sound/pci/hda/patch_realtek.c | 33 ++ sound/soc/codecs/cs35l45.c | 2 sound/soc/codecs/cs35l56-shared.c | 8 sound/soc/codecs/cs35l56.c | 195 ++++++++++++- sound/soc/codecs/cs35l56.h | 1 sound/soc/fsl/fsl_xcvr.c | 12 sound/soc/qcom/lpass-cdc-dma.c | 2 sound/soc/soc-card.c | 24 + tools/net/ynl/lib/ynl.c | 1 tools/testing/selftests/net/mptcp/mptcp_connect.sh | 16 - tools/testing/selftests/net/mptcp/mptcp_join.sh | 196 ++++++++------ tools/testing/selftests/net/mptcp/mptcp_lib.sh | 15 + tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 8 tools/testing/selftests/net/mptcp/userspace_pm.sh | 86 ++---- 158 files changed, 1877 insertions(+), 812 deletions(-)
Alex Deucher (1):
Revert "drm/amd/pm: resolve reboot exception for si oland"
Alexander Ofitserov (1):
gtp: fix use-after-free and null-ptr-deref in gtp_newlink()
Alexander Stein (1):
phy: freescale: phy-fsl-imx8-mipi-dphy: Fix alias name to use dashes
Alexandre Ghiti (3):
riscv: Fix build error if !CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION Revert "riscv: mm: support Svnapot in huge vmap"
riscv: Fix pte_leaf_size() for NAPOT
Andy Shevchenko (1):
gpiolib: Fix the error path order in gpiochip_add_data_with_key()
Aneesh Kumar K.V (IBM) (1):
mm/debug_vm_pgtable: fix BUG_ON with pud advanced test
Ard Biesheuvel (1):
crypto: arm64/neonbs - fix out-of-bounds access on short input
Arkadiusz Kubalewski (4):
ice: fix dpll input pin phase_adjust value updates
ice: fix dpll and dpll_pin data access on PF reset
ice: fix dpll periodic work data updates on PF reset
ice: fix pin phase adjust updates on PF reset
Arnd Bergmann (1):
efi/capsule-loader: fix incorrect allocation size
Arturas Moskvinas (1):
gpio: 74x164: Enable output pins after registers are reset
Bartosz Golaszewski (1):
gpio: fix resource unwinding order in error path
Bjorn Andersson (1):
pmdomain: qcom: rpmhpd: Fix enabled_corner aggregation
Byungchul Park (1):
mm/vmscan: fix a bug calling wakeup_kswapd() with a wrong zone index
Christophe Kerello (1):
mmc: mmci: stm32: fix DMA API overlapping mappings warning
Colin Ian King (1):
ASoC: qcom: Fix uninitialized pointer dmactl
Conor Dooley (1):
RISC-V: Ignore V from the riscv,isa DT property on older T-Head CPUs
Cristian Marussi (1):
pmdomain: arm: Fix NULL dereference on scmi_perf_domain removal
Curtis Klein (1):
dmaengine: fsl-qdma: init irq after reg initialization
Dan Carpenter (1):
ASoC: cs35l56: fix reversed if statement in cs35l56_dspwait_asp1tx_put()
Danilo Krummrich (1):
drm/nouveau: don't fini scheduler before entity flush
David Howells (1):
afs: Fix endless loop in directory parsing
David Sterba (1):
btrfs: dev-replace: properly validate device names
Davide Caratti (1):
mptcp: fix double-free on socket dismantle
Dimitris Vlachos (1):
riscv: Sparse-Memory/vmemmap out-of-bounds fix
Dmitry Baryshkov (1):
phy: qcom-qmp-usb: fix v3 offsets data
Doug Smythies (1):
cpufreq: intel_pstate: fix pstate limits enforcement for adjust_perf call back
Elad Nachman (3):
mtd: rawnand: marvell: fix layouts
mmc: sdhci-xenon: add timeout for PHY init complete
mmc: sdhci-xenon: fix PHY init clock stability
Eniac Zhang (1):
ALSA: hda/realtek: fix mute/micmute LED For HP mt440
Eric Dumazet (1):
ipv6: fix potential "struct net" leak in inet6_rtm_getaddr()
Fenghua Yu (2):
dmaengine: idxd: Remove shadow Event Log head stored in idxd
dmaengine: idxd: Ensure safe user copy of completion record
Filipe Manana (3):
btrfs: fix race between ordered extent completion and fiemap
btrfs: fix double free of anonymous device after snapshot creation failure
btrfs: send: don't issue unnecessary zero writes for trailing hole
Florian Westphal (3):
netlink: add nla be16/32 types to minlen array
net: ip_tunnel: prevent perpetual headroom growth
netfilter: bridge: confirm multicast packets before passing them up the stack
Gaurav Batra (1):
powerpc/pseries/iommu: IOMMU table is not initialized for kdump over SR-IOV
Geliang Tang (7):
mptcp: map v4 address to v6 when destroying subflow
selftests: mptcp: join: add ss mptcp support check
selftests: mptcp: add evts_get_info helper
selftests: mptcp: add chk_subflows_total helper
selftests: mptcp: update userspace pm test helpers
selftests: mptcp: add mptcp_lib_is_v6
selftests: mptcp: rm subflow with v4/v4mapped addr
Gergo Koteles (1):
ALSA: hda/realtek: tas2781: enable subwoofer volume control
Greg Kroah-Hartman (1):
Linux 6.7.9
Han Xu (1):
mtd: spinand: gigadevice: Fix the get ecc status issue
Hans Peter (1):
ALSA: hda/realtek: Enable Mute LED on HP 840 G8 (MB 8AB8)
Hans de Goede (1):
power: supply: bq27xxx-i2c: Do not free non existing IRQ
Ignat Korchagin (1):
netfilter: nf_tables: allow NFPROTO_INET in nft_(match/target)_validate()
Ivan Semenov (1):
mmc: core: Fix eMMC initialization with 1-bit bus connection
Jakub Kicinski (3):
net: veth: clear GRO when clearing XDP even when down
veth: try harder when allocating queue memory
tools: ynl: fix handling of multiple mcast groups
Jakub Raczynski (1):
stmmac: Clear variable when destroying workqueue
Janaki Ramaiah Thota (1):
Bluetooth: hci_qca: Set BDA quirk bit if fwnode exists in DT
Javier Carrasco (1):
net: usb: dm9601: fix wrong return value in dm9601_mdio_read
Jay Ajit Mate (1):
ALSA: hda/realtek: Fix top speaker connection on Dell Inspiron 16 Plus 7630
Jeremy Kerr (1):
net: mctp: take ownership of skb in mctp_local_output
Jiri Bohac (1):
x86/e820: Don't reserve SETUP_RNG_SEED in e820
Jiri Slaby (SUSE) (1):
fbcon: always restore the old font data in fbcon_do_set_font()
Jisheng Zhang (1):
riscv: tlb: fix __p*d_free_tlb()
Johan Hovold (1):
Bluetooth: hci_bcm4377: do not mark valid bd_addr as invalid
Johannes Berg (1):
wifi: nl80211: reject iftype change with mesh ID change
Jonas Dreßler (1):
Bluetooth: hci_sync: Check the correct flag before starting a scan
Joy Zou (1):
dmaengine: fsl-edma: correct calculation of 'nbytes' in multi-fifo scenario
Justin Iurman (1):
uapi: in6: replace temporary label with rfc9486
Kai-Heng Feng (1):
Bluetooth: Enforce validation on max value of connection interval
Kory Maincent (6):
dmaengine: dw-edma: Fix the ch_count hdma callback
dmaengine: dw-edma: Fix wrong interrupt bit set for HDMA
dmaengine: dw-edma: HDMA_V0_REMOTEL_STOP_INT_EN typo fix
dmaengine: dw-edma: Add HDMA remote interrupt configuration
dmaengine: dw-edma: HDMA: Add sync read before starting the DMA transfer in remote setup
dmaengine: dw-edma: eDMA: Add sync read before starting the DMA transfer in remote setup
Kuniyuki Iwashima (2):
af_unix: Fix task hung while purging oob_skb in GC.
af_unix: Drop oob_skb ref before purging queue in GC.
Lin Ma (1):
rtnetlink: fix error logic of IFLA_BRIDGE_FLAGS writing back
Luiz Augusto von Dentz (2):
Bluetooth: hci_sync: Fix accept_list when attempting to suspend
Bluetooth: hci_event: Fix handling of HCI_EV_IO_CAPA_REQUEST
Lukasz Majewski (1):
net: hsr: Use correct offset for HSR TLV values in supervisory HSR frames
Ma Jun (1):
drm/amdgpu/pm: Fix the power1_min_cap value
Masami Hiramatsu (Google) (1):
fprobe: Fix to allocate entry_data_size buffer with rethook instances
Matthew Auld (1):
drm/buddy: fix range bias
Matthieu Baerts (NGI0) (1):
mptcp: avoid printing warning once on client side
Mickaël Salaün (1):
landlock: Fix asymmetric private inodes referring
Mikko Perttunen (1):
gpu: host1x: Skip reset assert on Tegra186
Ming Lei (1):
block: define bvec_iter as __packed __aligned(4)
Nathan Chancellor (2):
RISC-V: Drop invalid test from CONFIG_AS_HAS_OPTION_ARCH
kbuild: Add -Wa,--fatal-warnings to as-instr invocation
Nathan Lynch (1):
powerpc/rtas: use correct function name for resetting TCE tables
NeilBrown (1):
NFS: Fix data corruption caused by congestion.
Nhat Pham (1):
mm: cachestat: fix folio read-after-free in cache walk
Nicolin Chen (2):
iommufd: Fix iopt_access_list_id overwrite bug
iommufd: Fix protection fault in iommufd_test_syz_conv_iova
Oleksij Rempel (3):
lan78xx: enable auto speed configuration for LAN7850 if no EEPROM is detected
net: lan78xx: fix "softirq work is pending" error
igb: extend PTP timestamp adjustments to i211
Paolo Abeni (4):
mptcp: push at DSS boundaries
mptcp: fix snd_wnd initialization for passive socket
mptcp: fix potential wake-up event loss
mptcp: fix possible deadlock in subflow diag
Paolo Bonzini (2):
x86/cpu: Allow reducing x86_phys_bits during early_identify_cpu() x86/cpu/intel: Detect TME keyid bits before setting MTRR mask registers
Pawan Gupta (5):
x86/entry_64: Add VERW just before userspace transition x86/entry_32: Add VERW just before userspace transition x86/bugs: Use ALTERNATIVE() instead of mds_user_clear static key KVM/VMX: Use BT+JNC, i.e. EFLAGS.CF to select VMRESUME vs. VMLAUNCH KVM/VMX: Move VERW closer to VMentry for MDS mitigation
Peng Ma (1):
dmaengine: fsl-qdma: fix SoC may hang on 16 byte unaligned read
Peter Ujfalusi (1):
mfd: twl6030-irq: Revert to use of_match_device()
Richard Fitzgerald (8):
ASoC: cs35l56: Must clear HALO_STATE before issuing SYSTEM_RESET
ASoC: cs35l56: cs35l56_component_remove() must clear cs35l56->component
ASoC: cs35l56: cs35l56_component_remove() must clean up wm_adsp
ASoC: cs35l56: Don't add the same register patch multiple times
ASoC: cs35l56: Fix for initializing ASP1 mixer registers
ASoC: cs35l56: Fix misuse of wm_adsp 'part' string for silicon revision
ASoC: cs35l56: Fix deadlock in ASP1 mixer register initialization
ASoC: soc-card: Fix missing locking in snd_soc_card_get_kcontrol()
Rob Clark (1):
soc: qcom: pmic_glink: Fix boot when QRTR=m
Ryan Lin (1):
drm/amd/display: Add monitor patch for specific eDP
Ryosuke Yasuoka (1):
netlink: Fix kernel-infoleak-after-free in __skb_datagram_iter
Sabrina Dubroca (4):
tls: decrement decrypt_pending if no async completion will be called
tls: fix peeking with sync+async decryption
tls: separate no-async decryption request handling from async
tls: fix use-after-free on failed backlog decryption
Samuel Holland (1):
riscv: Fix enabling cbo.zero when running in M-mode
Saravana Kannan (1):
of: property: fw_devlink: Fix stupid bug in remote-endpoint parsing
Sid Pranjale (1):
drm/nouveau: keep DMA buffers required for suspend/resume
Srinivasan Shanmugam (1):
drm/amd/display: Prevent potential buffer overflow in map_hw_resources
Tadeusz Struk (1):
dmaengine: ptdma: use consistent DMA masks
Takashi Iwai (2):
ALSA: Drop leftover snd-rtctimer stuff from Makefile
ALSA: ump: Fix the discard error code from snd_ump_legacy_open()
Takashi Sakamoto (1):
ALSA: firewire-lib: fix to check cycle continuity
Tetsuo Handa (1):
tomoyo: fix UAF write bug in tomoyo_write_control()
Thierry Reding (1):
drm/tegra: Remove existing framebuffer only if we support display
Thomas Weißschuh (1):
power: supply: mm8013: select REGMAP_I2C
Théo Lebrun (2):
spi: cadence-qspi: fix pointer reference in runtime PM hooks
spi: cadence-qspi: remove system-wide suspend helper calls from runtime PM hooks
Tim Schumacher (1):
efivarfs: Request at most 512 bytes for variable names
Vadim Shakirov (2):
drivers: perf: added capabilities for legacy PMU
drivers: perf: ctr_get_width function for legacy is not defined
Vladimir Oltean (1):
net: dpaa: fman_memac: accept phy-interface-type = "10gbase-r" in the device tree
Willian Wang (1):
ALSA: hda/realtek: Add special fixup for Lenovo 14IRP8
Xiubo Li (1):
ceph: switch to corrected encoding of max_xattr_size in mdsmap
Yang Yingliang (1):
phy: qcom: phy-qcom-m31: fix wrong pointer pass to PTR_ERR()
Yangyu Chen (1):
riscv: mm: fix NOCACHE_THEAD does not set bit[61] correctly
Ying Hsu (1):
Bluetooth: Avoid potential use-after-free in hci_error_reset
Yochai Hagvi (1):
ice: fix connection state of DPLL and out pin
Yunjian Wang (1):
tun: Fix xdp_rxq_info's queue_index when detaching
Zijun Hu (3):
Bluetooth: hci_event: Fix wrongly recorded wakeup BD_ADDR
Bluetooth: qca: Fix wrong event type for patch config command
Bluetooth: qca: Fix triggering coredump implementation
Zong Li (1):
riscv: add CALLER_ADDRx support
Greg Kroah-Hartman
maintainerDocumentation/arch/x86/mds.rst +27 -11
@@ -95,6 +95,9 @@ The kernel provides a function to invoke the buffer clearing: mds_clear_cpu_buffers() +Also macro CLEAR_CPU_BUFFERS can be used in ASM late in exit-to-user path. +Other than CFLAGS.ZF, this macro doesn't clobber any registers. + The mitigation is invoked on kernel/userspace, hypervisor/guest and C-state (idle) transitions.
@@ -138,17 +141,30 @@ Mitigation points When transitioning from kernel to user space the CPU buffers are flushed on affected CPUs when the mitigation is not disabled on the kernel - command line. The migitation is enabled through the static key - mds_user_clear. - - The mitigation is invoked in prepare_exit_to_usermode() which covers - all but one of the kernel to user space transitions. The exception - is when we return from a Non Maskable Interrupt (NMI), which is - handled directly in do_nmi(). - - (The reason that NMI is special is that prepare_exit_to_usermode() can - enable IRQs. In NMI context, NMIs are blocked, and we don't want to - enable IRQs with NMIs blocked.) + command line. The mitigation is enabled through the feature flag + X86_FEATURE_CLEAR_CPU_BUF. + + The mitigation is invoked just before transitioning to userspace after + user registers are restored. This is done to minimize the window in + which kernel data could be accessed after VERW e.g. via an NMI after + VERW. + + **Corner case not handled** + Interrupts returning to kernel don't clear CPUs buffers since the + exit-to-user path is expected to do that anyways. But, there could be + a case when an NMI is generated in kernel after the exit-to-user path + has cleared the buffers. This case is not handled and NMI returning to + kernel don't clear CPU buffers because: + + 1. It is rare to get an NMI after VERW, but before returning to userspace. + 2. For an unprivileged user, there is no known way to make that NMI + less rare or target it. + 3. It would take a large number of these precisely-timed NMIs to mount + an actual attack. There's presumably not enough bandwidth. + 4. The NMI in question occurs after a VERW, i.e. when user state is + restored and most interesting data is already scrubbed. Whats left + is only the data that NMI touches, and that may or may not be of + any interest. 2. C-State transition
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 7 -SUBLEVEL = 8 +SUBLEVEL = 9 EXTRAVERSION = NAME = Hurr durr I'ma ninja sloth
arch/arm64/crypto/aes-neonbs-glue.c +11 -0
@@ -227,8 +227,19 @@ static int ctr_encrypt(struct skcipher_request *req) src += blocks *AES_BLOCK_SIZE ; }if (nbytes && walk.nbytes == walk.total) { +u8 buf[AES_BLOCK_SIZE ]; +u8 *d = dst; + +if (unlikely (nbytes <AES_BLOCK_SIZE )) + src = dst =memcpy (buf +sizeof (buf) - nbytes, + src, nbytes); +neon_aes_ctr_encrypt (dst, src, ctx->enc, ctx->key.rounds, nbytes, walk.iv); + +if (unlikely (nbytes <AES_BLOCK_SIZE )) +memcpy (d, dst, nbytes); + nbytes =0 ; }kernel_neon_end ();
arch/powerpc/include/asm/rtas.h +2 -2
@@ -68,7 +68,7 @@ enum rtas_function_index {RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE ,RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE2 ,RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW , -RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOWS , +RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOW ,RTAS_FNIDX__IBM_SCAN_LOG_DUMP ,RTAS_FNIDX__IBM_SET_DYNAMIC_INDICATOR , RTAS_FNIDX__IBM_SET_EEH_OPTION,
@@ -163,7 +163,7 @@ typedef struct {#define RTAS_FN_IBM_READ_SLOT_RESET_STATE rtas_fn_handle(RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE)#define RTAS_FN_IBM_READ_SLOT_RESET_STATE2 rtas_fn_handle(RTAS_FNIDX__IBM_READ_SLOT_RESET_STATE2)#define RTAS_FN_IBM_REMOVE_PE_DMA_WINDOW rtas_fn_handle(RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW) -#define RTAS_FN_IBM_RESET_PE_DMA_WINDOWS rtas_fn_handle(RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOWS) +#define RTAS_FN_IBM_RESET_PE_DMA_WINDOW rtas_fn_handle(RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOW)#define RTAS_FN_IBM_SCAN_LOG_DUMP rtas_fn_handle(RTAS_FNIDX__IBM_SCAN_LOG_DUMP)#define RTAS_FN_IBM_SET_DYNAMIC_INDICATOR rtas_fn_handle(RTAS_FNIDX__IBM_SET_DYNAMIC_INDICATOR)#define RTAS_FN_IBM_SET_EEH_OPTION rtas_fn_handle(RTAS_FNIDX__IBM_SET_EEH_OPTION)
arch/powerpc/kernel/rtas.c +7 -2
@@ -310,8 +310,13 @@ static struct rtas_function rtas_function_table[] __ro_after_init = { [RTAS_FNIDX__IBM_REMOVE_PE_DMA_WINDOW] = { .name = "ibm,remove-pe-dma-window", }, - [RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOWS] = { - .name = "ibm,reset-pe-dma-windows", + [RTAS_FNIDX__IBM_RESET_PE_DMA_WINDOW] = { +/* +* Note: PAPR+ v2.13 7.3.31.4.1 spells this as +* "ibm,reset-pe-dma-windows" (plural), but RTAS +* implementations use the singular form in practice. +*/ + .name = "ibm,reset-pe-dma-window", }, [RTAS_FNIDX__IBM_SCAN_LOG_DUMP] = { .name = "ibm,scan-log-dump",
arch/powerpc/platforms/pseries/iommu.c +105 -51
219 lines not on this page · raw message
arch/riscv/Kconfig +0 -1
@@ -294,7 +294,6 @@ config AS_HAS_OPTION_ARCH # https://reviews.llvm.org/D123515 def_bool y depends on $(as-instr, .option arch$(comma) +m) - depends on !$(as-instr, .option arch$(comma) -i) source "arch/riscv/Kconfig.socs" source "arch/riscv/Kconfig.errata"
arch/riscv/include/asm/csr.h +2 -0
@@ -415,6 +415,7 @@# define CSR_STATUS CSR_MSTATUS# define CSR_IE CSR_MIE# define CSR_TVEC CSR_MTVEC +# define CSR_ENVCFG CSR_MENVCFG# define CSR_SCRATCH CSR_MSCRATCH# define CSR_EPC CSR_MEPC# define CSR_CAUSE CSR_MCAUSE
@@ -439,6 +440,7 @@# define CSR_STATUS CSR_SSTATUS# define CSR_IE CSR_SIE# define CSR_TVEC CSR_STVEC +# define CSR_ENVCFG CSR_SENVCFG# define CSR_SCRATCH CSR_SSCRATCH# define CSR_EPC CSR_SEPC# define CSR_CAUSE CSR_SCAUSE
arch/riscv/include/asm/ftrace.h +5 -0
@@ -25,6 +25,11 @@#define ARCH_SUPPORTS_FTRACE_OPS 1#ifndef __ASSEMBLY__ + +extern void *return_address (unsigned int level); + +#define ftrace_return_address (n) return_address(n) +void MCOUNT_NAME (void );static inline unsigned long ftrace_call_adjust (unsigned long addr) {
arch/riscv/include/asm/hugetlb.h +2 -0
@@ -11,8 +11,10 @@ static inline void arch_clear_hugepage_flags(struct page *page) }#define arch_clear_hugepage_flags arch_clear_hugepage_flags +#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION bool arch_hugetlb_migration_supported (struct hstate *h);#define arch_hugetlb_migration_supported arch_hugetlb_migration_supported +#endif #ifdef CONFIG_RISCV_ISA_SVNAPOT #define __HAVE_ARCH_HUGE_PTE_CLEAR
arch/riscv/include/asm/pgalloc.h +17 -3
@@ -95,7 +95,13 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)__pud_free (mm, pud); } -#define __pud_free_tlb (tlb, pud, addr) pud_free((tlb)->mm, pud) +#define __pud_free_tlb (tlb, pud, addr) \ +do { \ + if (pgtable_l4_enabled) { \ + pagetable_pud_dtor(virt_to_ptdesc(pud)); \ + tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(pud)); \ + } \ +} while (0)#define p4d_alloc_one p4d_alloc_onestatic inline p4d_t *p4d_alloc_one (struct mm_struct *mm,unsigned long addr)
@@ -124,7 +130,11 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) __p4d_free(mm, p4d); } -#define __p4d_free_tlb (tlb, p4d, addr) p4d_free((tlb)->mm, p4d) +#define __p4d_free_tlb (tlb, p4d, addr) \ +do { \ + if (pgtable_l5_enabled) \ + tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(p4d)); \ +} while (0)#endif /* __PAGETABLE_PMD_FOLDED */ static inline void sync_kernel_mappings (pgd_t *pgd)
@@ -149,7 +159,11 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)#ifndef __PAGETABLE_PMD_FOLDED -#define __pmd_free_tlb (tlb, pmd, addr) pmd_free((tlb)->mm, pmd) +#define __pmd_free_tlb (tlb, pmd, addr) \ +do { \ + pagetable_pmd_dtor(virt_to_ptdesc(pmd)); \ + tlb_remove_page_ptdesc((tlb), virt_to_ptdesc(pmd)); \ +} while (0)#endif /* __PAGETABLE_PMD_FOLDED */
arch/riscv/include/asm/pgtable-64.h +1 -1
@@ -136,7 +136,7 @@ enum napot_cont_order {* 10010 - IO Strongly-ordered, Non-cacheable, Non-bufferable, Shareable, Non-trustable */ #define _PAGE_PMA_THEAD ((1UL << 62) | (1UL << 61) | (1UL << 60)) -#define _PAGE_NOCACHE_THEAD ((1UL < 61) | (1UL << 60)) +#define _PAGE_NOCACHE_THEAD ((1UL << 61) | (1UL << 60))#define _PAGE_IO_THEAD ((1UL << 63) | (1UL << 60))#define _PAGE_MTMASK_THEAD (_PAGE_PMA_THEAD | _PAGE_IO_THEAD | (1UL << 59))
arch/riscv/include/asm/pgtable.h +5 -1
@@ -84,7 +84,7 @@* Define vmemmap for pfn_to_page & page_to_pfn calls. Needed if kernel * is configured with CONFIG_SPARSEMEM_VMEMMAP enabled. */ -#define vmemmap ((struct page *)VMEMMAP_START) +#define vmemmap ((struct page *)VMEMMAP_START - (phys_ram_base >> PAGE_SHIFT))#define PCI_IO_SIZE SZ_16M#define PCI_IO_END VMEMMAP_START
@@ -439,6 +439,10 @@ static inline pte_t pte_mkhuge(pte_t pte)return pte; } +#define pte_leaf_size (pte) (pte_napot(pte) ? \ + napot_cont_size(napot_cont_order(pte)) :\ + PAGE_SIZE) +#ifdef CONFIG_NUMA_BALANCING /* * See the comment in include/asm-generic/pgtable.h
arch/riscv/include/asm/vmalloc.h +1 -60
66 lines not on this page · raw message
arch/riscv/kernel/Makefile +2 -0
@@ -7,6 +7,7 @@ ifdef CONFIG_FTRACE CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE) +CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE) endif CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,) CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
@@ -46,6 +47,7 @@ obj-y += irq.o obj-y += process.o obj-y += ptrace.o obj-y += reset.o +obj-y += return_address.o obj-y += setup.o obj-y += signal.o obj-y += syscall_table.o
arch/riscv/kernel/cpufeature.c +16 -1
@@ -22,6 +22,7 @@#include <asm/hwprobe.h> #include <asm/patch.h> #include <asm/processor.h> +#include <asm/sbi.h> #include <asm/vector.h> #include "copy-unaligned.h"
@@ -401,6 +402,20 @@ static void __init riscv_fill_hwcap_from_isa_string(unsigned long *isa2hwcap)set_bit (RISCV_ISA_EXT_ZIHPM , isainfo->isa); } +/* +* "V" in ISA strings is ambiguous in practice: it should mean +* just the standard V-1.0 but vendors aren't well behaved. +* Many vendors with T-Head CPU cores which implement the 0.7.1 +* version of the vector specification put "v" into their DTs. +* CPU cores with the ratified spec will contain non-zero +* marchid. +*/ +if (acpi_disabled &&riscv_cached_mvendorid (cpu) ==THEAD_VENDOR_ID && +riscv_cached_marchid (cpu) ==0x0 ) { + this_hwcap &= ~isa2hwcap[RISCV_ISA_EXT_v]; +clear_bit (RISCV_ISA_EXT_v, isainfo->isa); + } +/* * All "okay" hart should have same isa. Set HWCAP based on * common capabilities of every "okay" hart, in case they don't
@@ -725,7 +740,7 @@ arch_initcall(check_unaligned_access_all_cpus);void riscv_user_isa_enable (void ) {if (riscv_cpu_has_extension_unlikely (smp_processor_id (),RISCV_ISA_EXT_ZICBOZ )) -csr_set (CSR_SENVCFG ,ENVCFG_CBZE ); +csr_set (CSR_ENVCFG ,ENVCFG_CBZE ); }#ifdef CONFIG_RISCV_ALTERNATIVE
arch/riscv/kernel/return_address.c new file +48 -0
48 lines not on this page · raw message
arch/riscv/mm/hugetlbpage.c +2 -0
@@ -426,10 +426,12 @@ bool __init arch_hugetlb_valid_size(unsigned long size)return __hugetlb_valid_size (size); } +#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION bool arch_hugetlb_migration_supported (struct hstate *h) {return __hugetlb_valid_size (huge_page_size (h)); } +#endif #ifdef CONFIG_CONTIG_ALLOC static __init int gigantic_pages_init (void )
arch/x86/entry/entry_32.S +3 -0
@@ -885,6 +885,7 @@ SYM_FUNC_START(entry_SYSENTER_32) BUG_IF_WRONG_CR3 no_user_check=1 popfl popl %eax + CLEAR_CPU_BUFFERS /* * Return back to the vDSO, which will pop ecx and edx.
@@ -954,6 +955,7 @@ restore_all_switch_stack: /* Restore user state */ RESTORE_REGS pop=4 # skip orig_eax/error_code + CLEAR_CPU_BUFFERS .Lirq_return: /* * ARCH_HAS_MEMBARRIER_SYNC_CORE rely on IRET core serialization
@@ -1146,6 +1148,7 @@ SYM_CODE_START(asm_exc_nmi) /* Not on SYSENTER stack. */ call exc_nmi + CLEAR_CPU_BUFFERS jmp .Lnmi_return .Lnmi_from_sysenter_stack:
arch/x86/entry/entry_64.S +11 -0
@@ -161,6 +161,7 @@ syscall_return_via_sysret: SYM_INNER_LABEL(entry_SYSRETQ_unsafe_stack, SYM_L_GLOBAL) ANNOTATE_NOENDBR swapgs + CLEAR_CPU_BUFFERS sysretq SYM_INNER_LABEL(entry_SYSRETQ_end, SYM_L_GLOBAL) ANNOTATE_NOENDBR
@@ -601,6 +602,7 @@ SYM_INNER_LABEL(swapgs_restore_regs_and_return_to_usermode, SYM_L_GLOBAL) /* Restore RDI. */ popq %rdi swapgs + CLEAR_CPU_BUFFERS jmp .Lnative_iret
@@ -712,6 +714,8 @@ native_irq_return_ldt: */ popq %rax /* Restore user RAX */ + CLEAR_CPU_BUFFERS + /* * RSP now points to an ordinary IRET frame, except that the page * is read-only and RSP[31:16] are preloaded with the userspace
@@ -1438,6 +1442,12 @@ nmi_restore: std movq $0, 5*8(%rsp) /* clear "NMI executing" */ + /* + * Skip CLEAR_CPU_BUFFERS here, since it only helps in rare cases like + * NMI in kernel after user state is restored. For an unprivileged user + * these conditions are hard to meet. + */ + /* * iretq reads the "iret" frame and exits the NMI stack in a * single instruction. We are returning to kernel mode, so this
@@ -1455,6 +1465,7 @@ SYM_CODE_START(entry_SYSCALL32_ignore) UNWIND_HINT_END_OF_STACK ENDBR mov $-ENOSYS, %eax + CLEAR_CPU_BUFFERS sysretl SYM_CODE_END(entry_SYSCALL32_ignore)
arch/x86/entry/entry_64_compat.S +1 -0
@@ -270,6 +270,7 @@ SYM_INNER_LABEL(entry_SYSRETL_compat_unsafe_stack, SYM_L_GLOBAL) xorl %r9d, %r9d xorl %r10d, %r10d swapgs + CLEAR_CPU_BUFFERS sysretl SYM_INNER_LABEL(entry_SYSRETL_compat_end, SYM_L_GLOBAL) ANNOTATE_NOENDBR
arch/x86/include/asm/entry-common.h +0 -1
@@ -91,7 +91,6 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs, static __always_inline void arch_exit_to_user_mode(void) { -mds_user_clear_cpu_buffers ();amd_clear_divider (); }#define arch_exit_to_user_mode arch_exit_to_user_mode
arch/x86/include/asm/nospec-branch.h +0 -12
@@ -540,7 +540,6 @@ DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp);DECLARE_STATIC_KEY_FALSE (switch_mm_cond_ibpb);DECLARE_STATIC_KEY_FALSE (switch_mm_always_ibpb); -DECLARE_STATIC_KEY_FALSE (mds_user_clear);DECLARE_STATIC_KEY_FALSE (mds_idle_clear);DECLARE_STATIC_KEY_FALSE (switch_mm_cond_l1d_flush);
@@ -574,17 +573,6 @@ static __always_inline void mds_clear_cpu_buffers(void) asmvolatile ("verw %[ds]" : : [ds]"m" (ds) :"cc" ); } -/** -* mds_user_clear_cpu_buffers - Mitigation for MDS and TAA vulnerability -* -* Clear CPU buffers if the corresponding static key is enabled -*/ -static __always_inline void mds_user_clear_cpu_buffers(void) -{ -if (static_branch_likely (&mds_user_clear)) -mds_clear_cpu_buffers (); -} -/** * mds_idle_clear_cpu_buffers - Mitigation for MDS vulnerability *
arch/x86/kernel/cpu/bugs.c +6 -9
@@ -111,9 +111,6 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_ibpb);/* Control unconditional IBPB in switch_mm() */ DEFINE_STATIC_KEY_FALSE (switch_mm_always_ibpb); -/* Control MDS CPU buffer clear before returning to user space */ -DEFINE_STATIC_KEY_FALSE (mds_user_clear); -EXPORT_SYMBOL_GPL (mds_user_clear);/* Control MDS CPU buffer clear before idling (halt, mwait) */ DEFINE_STATIC_KEY_FALSE (mds_idle_clear);EXPORT_SYMBOL_GPL (mds_idle_clear);
@@ -252,7 +249,7 @@ static void __init mds_select_mitigation(void)if (!boot_cpu_has (X86_FEATURE_MD_CLEAR )) mds_mitigation =MDS_MITIGATION_VMWERV ; -static_branch_enable (&mds_user_clear); +setup_force_cpu_cap (X86_FEATURE_CLEAR_CPU_BUF );if (!boot_cpu_has (X86_BUG_MSBDS_ONLY ) && (mds_nosmt ||cpu_mitigations_auto_nosmt ()))
@@ -356,7 +353,7 @@ static void __init taa_select_mitigation(void)* For guests that can't determine whether the correct microcode is * present on host, enable the mitigation for UCODE_NEEDED as well. */ -static_branch_enable (&mds_user_clear); +setup_force_cpu_cap (X86_FEATURE_CLEAR_CPU_BUF );if (taa_nosmt ||cpu_mitigations_auto_nosmt ())cpu_smt_disable (false);
@@ -424,7 +421,7 @@ static void __init mmio_select_mitigation(void)*/ if (boot_cpu_has_bug (X86_BUG_MDS ) || (boot_cpu_has_bug (X86_BUG_TAA ) &&boot_cpu_has (X86_FEATURE_RTM ))) -static_branch_enable (&mds_user_clear); +setup_force_cpu_cap (X86_FEATURE_CLEAR_CPU_BUF );else static_branch_enable (&mmio_stale_data_clear);
@@ -484,12 +481,12 @@ static void __init md_clear_update_mitigation(void)if (cpu_mitigations_off ())return ; -if (!static_key_enabled (&mds_user_clear)) +if (!boot_cpu_has (X86_FEATURE_CLEAR_CPU_BUF )) goto out;/* -* mds_user_clear is now enabled. Update MDS, TAA and MMIO Stale Data -* mitigation, if necessary. +* X86_FEATURE_CLEAR_CPU_BUF is now enabled. Update MDS, TAA and MMIO +* Stale Data mitigation, if necessary. */ if (mds_mitigation ==MDS_MITIGATION_OFF &&boot_cpu_has_bug (X86_BUG_MDS )) {
arch/x86/kernel/cpu/common.c +2 -2
@@ -1596,6 +1596,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)get_cpu_vendor (c);get_cpu_cap (c);setup_force_cpu_cap (X86_FEATURE_CPUID ); +get_cpu_address_sizes (c);cpu_parse_early_param ();if (this_cpu->c_early_init)
@@ -1608,10 +1609,9 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) this_cpu->c_bsp_init (c); }else {setup_clear_cpu_cap (X86_FEATURE_CPUID ); +get_cpu_address_sizes (c); } -get_cpu_address_sizes (c); -setup_force_cpu_cap (X86_FEATURE_ALWAYS );cpu_set_bug_bits (c);
arch/x86/kernel/cpu/intel.c +91 -87
202 lines not on this page · raw message
arch/x86/kernel/e820.c +5 -3
@@ -1017,10 +1017,12 @@ void __init e820__reserve_setup_data(void)e820__range_update (pa_data,sizeof (*data)+data->len,E820_TYPE_RAM ,E820_TYPE_RESERVED_KERN );/* -* SETUP_EFI and SETUP_IMA are supplied by kexec and do not need -* to be reserved. +* SETUP_EFI, SETUP_IMA and SETUP_RNG_SEED are supplied by +* kexec and do not need to be reserved. */ -if (data->type !=SETUP_EFI && data->type !=SETUP_IMA ) +if (data->type !=SETUP_EFI && + data->type !=SETUP_IMA && + data->type !=SETUP_RNG_SEED )e820__range_update_kexec (pa_data,sizeof (*data) + data->len,E820_TYPE_RAM ,E820_TYPE_RESERVED_KERN );
arch/x86/kernel/nmi.c +0 -3
@@ -563,9 +563,6 @@ DEFINE_IDTENTRY_RAW(exc_nmi) }if (this_cpu_dec_return (nmi_state)) goto nmi_restart; - -if (user_mode (regs)) -mds_user_clear_cpu_buffers (); }#if IS_ENABLED (CONFIG_KVM_INTEL )
arch/x86/kvm/vmx/run_flags.h +5 -2
@@ -2,7 +2,10 @@#ifndef __KVM_X86_VMX_RUN_FLAGS_H#define __KVM_X86_VMX_RUN_FLAGS_H -#define VMX_RUN_VMRESUME (1 << 0) -#define VMX_RUN_SAVE_SPEC_CTRL (1 << 1) +#define VMX_RUN_VMRESUME_SHIFT 0 +#define VMX_RUN_SAVE_SPEC_CTRL_SHIFT 1 + +#define VMX_RUN_VMRESUME BIT(VMX_RUN_VMRESUME_SHIFT) +#define VMX_RUN_SAVE_SPEC_CTRL BIT(VMX_RUN_SAVE_SPEC_CTRL_SHIFT)#endif /* __KVM_X86_VMX_RUN_FLAGS_H */
arch/x86/kvm/vmx/vmenter.S +6 -3
@@ -139,7 +139,7 @@ SYM_FUNC_START(__vmx_vcpu_run) mov (%_ASM_SP), %_ASM_AX /* Check if vmlaunch or vmresume is needed */ - test $VMX_RUN_VMRESUME, %ebx + bt $VMX_RUN_VMRESUME_SHIFT, %ebx /* Load guest registers. Don't clobber flags. */ mov VCPU_RCX(%_ASM_AX), %_ASM_CX
@@ -161,8 +161,11 @@ SYM_FUNC_START(__vmx_vcpu_run) /* Load guest RAX. This kills the @regs pointer! */ mov VCPU_RAX(%_ASM_AX), %_ASM_AX - /* Check EFLAGS.ZF from 'test VMX_RUN_VMRESUME' above */ - jz .Lvmlaunch + /* Clobbers EFLAGS.ZF */ + CLEAR_CPU_BUFFERS + + /* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */ + jnc .Lvmlaunch /* * After a successful VMRESUME/VMLAUNCH, control flow "magically"
arch/x86/kvm/vmx/vmx.c +16 -4
@@ -387,7 +387,16 @@ static __always_inline void vmx_enable_fb_clear(struct vcpu_vmx *vmx)static void vmx_update_fb_clear_dis (struct kvm_vcpu *vcpu,struct vcpu_vmx *vmx) { - vmx->disable_fb_clear = (host_arch_capabilities &ARCH_CAP_FB_CLEAR_CTRL ) && +/* +* Disable VERW's behavior of clearing CPU buffers for the guest if the +* CPU isn't affected by MDS/TAA, and the host hasn't forcefully enabled +* the mitigation. Disabling the clearing behavior provides a +* performance boost for guests that aren't aware that manually clearing +* CPU buffers is unnecessary, at the cost of MSR accesses on VM-Entry +* and VM-Exit. +*/ + vmx->disable_fb_clear = !cpu_feature_enabled (X86_FEATURE_CLEAR_CPU_BUF ) && + (host_arch_capabilities &ARCH_CAP_FB_CLEAR_CTRL ) && !boot_cpu_has_bug (X86_BUG_MDS ) && !boot_cpu_has_bug (X86_BUG_TAA );
@@ -7226,11 +7235,14 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,guest_state_enter_irqoff (); -/* L1D Flush includes CPU buffer clear to mitigate MDS */ +/* +* L1D Flush includes CPU buffer clear to mitigate MDS, but VERW +* mitigation for MDS is done late in VMentry and is still +* executed in spite of L1D Flush. This is because an extra VERW +* should not matter much after the big hammer L1D Flush. +*/ if (static_branch_unlikely (&vmx_l1d_should_flush))vmx_l1d_flush (vcpu); -else if (static_branch_unlikely (&mds_user_clear)) -mds_clear_cpu_buffers ();else if (static_branch_unlikely (&mmio_stale_data_clear) &&kvm_arch_has_assigned_device (vcpu->kvm))mds_clear_cpu_buffers ();
drivers/bluetooth/btqca.c +1 -1
@@ -152,7 +152,7 @@ static int qca_send_patch_config_cmd(struct hci_dev *hdev)bt_dev_dbg (hdev,"QCA Patch config" ); skb =__hci_cmd_sync_ev (hdev,EDL_PATCH_CMD_OPCODE ,sizeof (cmd), - cmd,HCI_EV_VENDOR ,HCI_INIT_TIMEOUT ); + cmd,0 ,HCI_INIT_TIMEOUT );if (IS_ERR (skb)) { err =PTR_ERR (skb);bt_dev_err (hdev,"Sending QCA Patch config failed (%d)" , err);
drivers/bluetooth/hci_bcm4377.c +1 -2
@@ -1417,7 +1417,7 @@ static int bcm4377_check_bdaddr(struct bcm4377_data *bcm4377) bda = (struct hci_rp_read_bd_addr *)skb->data;if (!bcm4377_is_valid_bdaddr (bcm4377, &bda->bdaddr)) -set_bit (HCI_QUIRK_INVALID_BDADDR , &bcm4377->hdev->quirks); +set_bit (HCI_QUIRK_USE_BDADDR_PROPERTY , &bcm4377->hdev->quirks);kfree_skb (skb);return 0 ;
@@ -2368,7 +2368,6 @@ static int bcm4377_probe(struct pci_dev *pdev, const struct pci_device_id *id) hdev->set_bdaddr = bcm4377_hci_set_bdaddr; hdev->setup = bcm4377_hci_setup; -set_bit (HCI_QUIRK_USE_BDADDR_PROPERTY , &hdev->quirks);if (bcm4377->hw->broken_mws_transport_config)set_bit (HCI_QUIRK_BROKEN_MWS_TRANSPORT_CONFIG , &hdev->quirks);if (bcm4377->hw->broken_ext_scan)
drivers/bluetooth/hci_qca.c +16 -6
@@ -7,6 +7,7 @@* * Copyright (C) 2007 Texas Instruments, Inc. * Copyright (c) 2010, 2012, 2018 The Linux Foundation. All rights reserved. +* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Acknowledgements: * This file is based on hci_ll.c, which was...
@@ -1806,13 +1807,12 @@ static int qca_power_on(struct hci_dev *hdev)static void hci_coredump_qca (struct hci_dev *hdev) { +int err;static const u8 param[] = {0x26 }; -struct sk_buff *skb; - skb =__hci_cmd_sync (hdev,0xfc0c ,1 , param,HCI_CMD_TIMEOUT ); -if (IS_ERR (skb)) -bt_dev_err (hdev,"%s: trigger crash failed (%ld)" , __func__,PTR_ERR (skb)); -kfree_skb (skb); + err =__hci_cmd_send (hdev,0xfc0c ,1 , param); +if (err <0 ) +bt_dev_err (hdev,"%s: trigger crash failed (%d)" , __func__, err); }static int qca_setup (struct hci_uart *hu)
@@ -1886,7 +1886,17 @@ static int qca_setup(struct hci_uart *hu)case QCA_WCN6750 :case QCA_WCN6855 :case QCA_WCN7850 : -set_bit (HCI_QUIRK_USE_BDADDR_PROPERTY , &hdev->quirks); + +/* Set BDA quirk bit for reading BDA value from fwnode property +* only if that property exist in DT. +*/ +if (fwnode_property_present (dev_fwnode (hdev->dev.parent),"local-bd-address" )) { +set_bit (HCI_QUIRK_USE_BDADDR_PROPERTY , &hdev->quirks); +bt_dev_info (hdev,"setting quirk bit to read BDA from fwnode later" ); + }else { +bt_dev_dbg (hdev,"local-bd-address` is not present in the devicetree so not setting quirk bit for BDA" ); + } +hci_set_aosp_capable (hdev); ret =qca_read_soc_version (hdev, &ver, soc_type);
drivers/cpufreq/intel_pstate.c +3 -0
@@ -2983,6 +2983,9 @@ static void intel_cpufreq_adjust_perf(unsigned int cpunum,if (min_pstate < cpu->min_perf_ratio) min_pstate = cpu->min_perf_ratio; +if (min_pstate > cpu->max_perf_ratio) + min_pstate = cpu->max_perf_ratio; + max_pstate =min (cap_pstate, cpu->max_perf_ratio);if (max_pstate < min_pstate) max_pstate = min_pstate;
drivers/dma/dw-edma/dw-edma-v0-core.c +17 -0
@@ -346,6 +346,20 @@ static void dw_edma_v0_core_write_chunk(struct dw_edma_chunk *chunk)dw_edma_v0_write_ll_link (chunk, i, control, chunk->ll_region.paddr); } +static void dw_edma_v0_sync_ll_data (struct dw_edma_chunk *chunk) +{ +/* +* In case of remote eDMA engine setup, the DW PCIe RP/EP internal +* configuration registers and application memory are normally accessed +* over different buses. Ensure LL-data reaches the memory before the +* doorbell register is toggled by issuing the dummy-read from the remote +* LL memory in a hope that the MRd TLP will return only after the +* last MWr TLP is completed +*/ +if (!(chunk->chan->dw->chip->flags &DW_EDMA_CHIP_LOCAL )) +readl (chunk->ll_region.vaddr.io); +} +static void dw_edma_v0_core_start (struct dw_edma_chunk *chunk,bool first) {struct dw_edma_chan *chan = chunk->chan;
@@ -412,6 +426,9 @@ static void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first)SET_CH_32 (dw, chan->dir, chan->id, llp.msb,upper_32_bits (chunk->ll_region.paddr)); } + +dw_edma_v0_sync_ll_data (chunk); +/* Doorbell */ SET_RW_32 (dw, chan->dir, doorbell,FIELD_PREP (EDMA_V0_DOORBELL_CH_MASK , chan->id));
drivers/dma/dw-edma/dw-hdma-v0-core.c +26 -13
@@ -65,18 +65,12 @@ static void dw_hdma_v0_core_off(struct dw_edma *dw)static u16 dw_hdma_v0_core_ch_count (struct dw_edma *dw,enum dw_edma_dir dir) { -u32 num_ch =0 ; -int id; - -for (id =0 ; id <HDMA_V0_MAX_NR_CH ; id++) { -if (GET_CH_32 (dw, id, dir, ch_en) &BIT (0 )) - num_ch++; - } - -if (num_ch >HDMA_V0_MAX_NR_CH ) - num_ch =HDMA_V0_MAX_NR_CH ; - -return (u16 )num_ch; +/* +* The HDMA IP have no way to know the number of hardware channels +* available, we set it to maximum channels and let the platform +* set the right number of channels. +*/ +return HDMA_V0_MAX_NR_CH ; }static enum dma_status dw_hdma_v0_core_ch_status (struct dw_edma_chan *chan)
@@ -228,6 +222,20 @@ static void dw_hdma_v0_core_write_chunk(struct dw_edma_chunk *chunk)dw_hdma_v0_write_ll_link (chunk, i, control, chunk->ll_region.paddr); } +static void dw_hdma_v0_sync_ll_data (struct dw_edma_chunk *chunk) +{ +/* +* In case of remote HDMA engine setup, the DW PCIe RP/EP internal +* configuration registers and application memory are normally accessed +* over different buses. Ensure LL-data reaches the memory before the +* doorbell register is toggled by issuing the dummy-read from the remote +* LL memory in a hope that the MRd TLP will return only after the +* last MWr TLP is completed +*/ +if (!(chunk->chan->dw->chip->flags &DW_EDMA_CHIP_LOCAL )) +readl (chunk->ll_region.vaddr.io); +} +static void dw_hdma_v0_core_start (struct dw_edma_chunk *chunk,bool first) {struct dw_edma_chan *chan = chunk->chan;
@@ -242,7 +250,9 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first)/* Interrupt enable&unmask - done, abort */ tmp =GET_CH_32 (dw, chan->dir, chan->id, int_setup) |HDMA_V0_STOP_INT_MASK |HDMA_V0_ABORT_INT_MASK | -HDMA_V0_LOCAL_STOP_INT_EN |HDMA_V0_LOCAL_STOP_INT_EN ; +HDMA_V0_LOCAL_STOP_INT_EN |HDMA_V0_LOCAL_ABORT_INT_EN ; +if (!(dw->chip->flags &DW_EDMA_CHIP_LOCAL )) + tmp |=HDMA_V0_REMOTE_STOP_INT_EN |HDMA_V0_REMOTE_ABORT_INT_EN ;SET_CH_32 (dw, chan->dir, chan->id, int_setup, tmp);/* Channel control */ SET_CH_32 (dw, chan->dir, chan->id, control1,HDMA_V0_LINKLIST_EN );
@@ -256,6 +266,9 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first)/* Set consumer cycle */ SET_CH_32 (dw, chan->dir, chan->id, cycle_sync,HDMA_V0_CONSUMER_CYCLE_STAT |HDMA_V0_CONSUMER_CYCLE_BIT ); + +dw_hdma_v0_sync_ll_data (chunk); +/* Doorbell */ SET_CH_32 (dw, chan->dir, chan->id, doorbell,HDMA_V0_DOORBELL_START ); }
drivers/dma/dw-edma/dw-hdma-v0-regs.h +1 -1
@@ -15,7 +15,7 @@#define HDMA_V0_LOCAL_ABORT_INT_EN BIT(6)#define HDMA_V0_REMOTE_ABORT_INT_EN BIT(5)#define HDMA_V0_LOCAL_STOP_INT_EN BIT(4) -#define HDMA_V0_REMOTEL_STOP_INT_EN BIT(3) +#define HDMA_V0_REMOTE_STOP_INT_EN BIT(3)#define HDMA_V0_ABORT_INT_MASK BIT(2)#define HDMA_V0_STOP_INT_MASK BIT(0)#define HDMA_V0_LINKLIST_EN BIT(0)
drivers/dma/fsl-edma-common.c +1 -1
@@ -503,7 +503,7 @@ void fsl_edma_fill_tcd(struct fsl_edma_chan *fsl_chan,if (fsl_chan->is_multi_fifo) {/* set mloff to support multiple fifo */ burst = cfg->direction ==DMA_DEV_TO_MEM ? - cfg->src_addr_width : cfg->dst_addr_width; + cfg->src_maxburst : cfg->dst_maxburst; nbytes |=EDMA_V3_TCD_NBYTES_MLOFF (-(burst *4 ));/* enable DMLOE/SMLOE */ if (cfg->direction ==DMA_MEM_TO_DEV ) {
drivers/dma/fsl-qdma.c +11 -10
@@ -109,6 +109,7 @@#define FSL_QDMA_CMD_WTHROTL_OFFSET 20#define FSL_QDMA_CMD_DSEN_OFFSET 19#define FSL_QDMA_CMD_LWC_OFFSET 16 +#define FSL_QDMA_CMD_PF BIT(17)/* Field definition for Descriptor status */ #define QDMA_CCDF_STATUS_RTE BIT(5)
@@ -384,7 +385,8 @@ static void fsl_qdma_comp_fill_memcpy(struct fsl_qdma_comp *fsl_comp,qdma_csgf_set_f (csgf_dest, len);/* Descriptor Buffer */ cmd =cpu_to_le32 (FSL_QDMA_CMD_RWTTYPE << -FSL_QDMA_CMD_RWTTYPE_OFFSET ); +FSL_QDMA_CMD_RWTTYPE_OFFSET ) | +FSL_QDMA_CMD_PF ; sdf->data =QDMA_SDDF_CMD (cmd); cmd = cpu_to_le32(FSL_QDMA_CMD_RWTTYPE <<
@@ -1197,10 +1199,6 @@ static int fsl_qdma_probe(struct platform_device *pdev)if (!fsl_qdma->queue)return -ENOMEM ; - ret =fsl_qdma_irq_init (pdev, fsl_qdma); -if (ret) -return ret; - fsl_qdma->irq_base =platform_get_irq_byname (pdev,"qdma-queue0" );if (fsl_qdma->irq_base <0 )return fsl_qdma->irq_base;
@@ -1239,16 +1237,19 @@ static int fsl_qdma_probe(struct platform_device *pdev)platform_set_drvdata (pdev, fsl_qdma); - ret =dma_async_device_register (&fsl_qdma->dma_dev); + ret =fsl_qdma_reg_init (fsl_qdma);if (ret) { -dev_err (&pdev->dev, -"Can't register NXP Layerscape qDMA engine.\n" ); +dev_err (&pdev->dev,"Can't Initialize the qDMA engine.\n" );return ret; } - ret =fsl_qdma_reg_init (fsl_qdma); + ret =fsl_qdma_irq_init (pdev, fsl_qdma); +if (ret) +return ret; + + ret =dma_async_device_register (&fsl_qdma->dma_dev);if (ret) { -dev_err (&pdev->dev,"Can't Initialize the qDMA engine.\n" ); +dev_err (&pdev->dev,"Can't register NXP Layerscape qDMA engine.\n" );return ret; }
drivers/dma/idxd/cdev.c +1 -1
@@ -345,7 +345,7 @@ static void idxd_cdev_evl_drain_pasid(struct idxd_wq *wq, u32 pasid)spin_lock (&evl->lock); status.bits =ioread64 (idxd->reg_base +IDXD_EVLSTATUS_OFFSET ); t = status.tail; - h = evl->head; + h = status.head; size = evl->size;while (h != t) {
drivers/dma/idxd/debugfs.c +1 -1
@@ -68,9 +68,9 @@ static int debugfs_evl_show(struct seq_file *s, void *d)spin_lock (&evl->lock); - h = evl->head; evl_status.bits =ioread64 (idxd->reg_base +IDXD_EVLSTATUS_OFFSET ); t = evl_status.tail; + h = evl_status.head; evl_size = evl->size; seq_printf(s, "Event Log head %u tail %u interrupt pending %u\n\n",
drivers/dma/idxd/idxd.h +0 -1
@@ -290,7 +290,6 @@ struct idxd_evl {unsigned int log_size;/* The number of entries in the event log. */ u16 size; -u16 head;unsigned long *bmap;bool batch_fail[IDXD_MAX_BATCH_IDENT ]; };
drivers/dma/idxd/init.c +12 -3
@@ -342,7 +342,9 @@ static void idxd_cleanup_internals(struct idxd_device *idxd)static int idxd_init_evl (struct idxd_device *idxd) {struct device *dev = &idxd->pdev->dev; +unsigned int evl_cache_size;struct idxd_evl *evl; +const char *idxd_name;if (idxd->hw.gen_cap.evl_support ==0 )return 0 ;
@@ -354,9 +356,16 @@ static int idxd_init_evl(struct idxd_device *idxd)spin_lock_init (&evl->lock); evl->size =IDXD_EVL_SIZE_MIN ; - idxd->evl_cache =kmem_cache_create (dev_name (idxd_confdev (idxd)), -sizeof (struct idxd_evl_fault ) +evl_ent_size (idxd), -0 ,0 ,NULL ); + idxd_name =dev_name (idxd_confdev (idxd)); + evl_cache_size =sizeof (struct idxd_evl_fault ) +evl_ent_size (idxd); +/* +* Since completion record in evl_cache will be copied to user +* when handling completion record page fault, need to create +* the cache suitable for user copy. +*/ + idxd->evl_cache =kmem_cache_create_usercopy (idxd_name, evl_cache_size, +0 ,0 ,0 , evl_cache_size, +NULL );if (!idxd->evl_cache) {kfree (evl);return -ENOMEM ;
drivers/dma/idxd/irq.c +1 -2
@@ -367,9 +367,9 @@ static void process_evl_entries(struct idxd_device *idxd)/* Clear interrupt pending bit */ iowrite32 (evl_status.bits_upper32, idxd->reg_base +IDXD_EVLSTATUS_OFFSET +sizeof (u32)); - h = evl->head; evl_status.bits =ioread64 (idxd->reg_base +IDXD_EVLSTATUS_OFFSET ); t = evl_status.tail; + h = evl_status.head; size = idxd->evl->size;while (h != t) {
@@ -378,7 +378,6 @@ static void process_evl_entries(struct idxd_device *idxd) h = (h +1 ) % size; } - evl->head = h; evl_status.head = h;iowrite32 (evl_status.bits_lower32, idxd->reg_base +IDXD_EVLSTATUS_OFFSET );spin_unlock (&evl->lock);
drivers/dma/ptdma/ptdma-dmaengine.c +0 -2
@@ -385,8 +385,6 @@ int pt_dmaengine_register(struct pt_device *pt) chan->vc.desc_free = pt_do_cleanup;vchan_init (&chan->vc, dma_dev); -dma_set_mask_and_coherent (pt->dev,DMA_BIT_MASK (64 )); - ret =dma_async_device_register (dma_dev);if (ret) goto err_reg;
drivers/firmware/efi/capsule-loader.c +1 -1
@@ -292,7 +292,7 @@ static int efi_capsule_open(struct inode *inode, struct file *file)return -ENOMEM ; } - cap_info->phys =kzalloc (sizeof (void *),GFP_KERNEL ); + cap_info->phys =kzalloc (sizeof (phys_addr_t),GFP_KERNEL );if (!cap_info->phys) {kfree (cap_info->pages);kfree (cap_info);
drivers/gpio/gpio-74x164.c +2 -2
@@ -127,8 +127,6 @@ static int gen_74x164_probe(struct spi_device *spi)if (IS_ERR (chip->gpiod_oe))return PTR_ERR (chip->gpiod_oe); -gpiod_set_value_cansleep (chip->gpiod_oe,1 ); -spi_set_drvdata (spi, chip); chip->gpio_chip.label = spi->modalias;
@@ -153,6 +151,8 @@ static int gen_74x164_probe(struct spi_device *spi) goto exit_destroy; } +gpiod_set_value_cansleep (chip->gpiod_oe,1 ); + ret =gpiochip_add_data (&chip->gpio_chip, chip);if (!ret)return 0 ;
drivers/gpio/gpiolib.c +5 -5
@@ -972,11 +972,11 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, ret =gpiochip_irqchip_init_valid_mask (gc);if (ret) - goto err_remove_acpi_chip; + goto err_free_hogs; ret =gpiochip_irqchip_init_hw (gc);if (ret) - goto err_remove_acpi_chip; + goto err_remove_irqchip_mask; ret =gpiochip_add_irqchip (gc, lock_key, request_key);if (ret)
@@ -1001,13 +1001,13 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,gpiochip_irqchip_remove (gc); err_remove_irqchip_mask:gpiochip_irqchip_free_valid_mask (gc); -err_remove_acpi_chip: +err_free_hogs: +gpiochip_free_hogs (gc);acpi_gpiochip_remove (gc); +gpiochip_remove_pin_ranges (gc); err_remove_of_chip: -gpiochip_free_hogs (gc);of_gpiochip_remove (gc); err_free_gpiochip_mask: -gpiochip_remove_pin_ranges (gc);gpiochip_free_valid_mask (gc);if (gdev->dev.release) {/* release() has been registered by gpiochip_setup_dev() */
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +4 -2
@@ -66,6 +66,8 @@ static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)/* Workaround for some monitors that do not clear DPCD 0x317 if FreeSync is unsupported */ case drm_edid_encode_panel_id ('A' ,'U' ,'O' ,0xA7AB ):case drm_edid_encode_panel_id ('A' ,'U' ,'O' ,0xE69B ): +case drm_edid_encode_panel_id ('B' ,'O' ,'E' ,0x092A ): +case drm_edid_encode_panel_id ('L' ,'G' ,'D' ,0x06D1 ):DRM_DEBUG_DRIVER ("Clearing DPCD 0x317 on monitor with panel id %X\n" , panel_id); edid_caps->panel_patch.remove_sink_ext_caps = true;break ;
@@ -119,6 +121,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps( edid_caps->edid_hdmi = connector->display_info.is_hdmi; +apply_edid_quirks (edid_buf, edid_caps); + sad_count =drm_edid_to_sad ((struct edid *) edid->raw_edid, &sads);if (sad_count <=0 )return result;
@@ -145,8 +149,6 @@ enum dc_edid_status dm_helpers_parse_edid_caps(else edid_caps->speaker_flags =DEFAULT_SPEAKER_LOCATION ; -apply_edid_quirks (edid_buf, edid_caps); -kfree (sads);kfree (sadb);
drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c +5 -0
@@ -76,6 +76,11 @@ static void map_hw_resources(struct dml2_context *dml2, in_out_display_cfg->hw.DLGRefClkFreqMHz =50 ; }for (j =0 ; j < mode_support_info->DPPPerSurface[i]; j++) { +if (i >= __DML2_WRAPPER_MAX_STREAMS_PLANES__) { +dml_print ("DML::%s: Index out of bounds: i=%d, __DML2_WRAPPER_MAX_STREAMS_PLANES__=%d\n" , + __func__, i, __DML2_WRAPPER_MAX_STREAMS_PLANES__); +break ; + } dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_stream_id[num_pipes] = dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_stream_id[i]; dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_stream_id_valid[num_pipes] = true; dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_plane_id[num_pipes] = dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id[i];
drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +29 -0
@@ -6925,6 +6925,23 @@ static int si_dpm_enable(struct amdgpu_device *adev)return 0 ; } +static int si_set_temperature_range (struct amdgpu_device *adev) +{ +int ret; + + ret =si_thermal_enable_alert (adev, false); +if (ret) +return ret; + ret =si_thermal_set_temperature_range (adev,R600_TEMP_RANGE_MIN ,R600_TEMP_RANGE_MAX ); +if (ret) +return ret; + ret =si_thermal_enable_alert (adev, true); +if (ret) +return ret; + +return ret; +} +static void si_dpm_disable (struct amdgpu_device *adev) {struct rv7xx_power_info *pi =rv770_get_pi (adev);
@@ -7608,6 +7625,18 @@ static int si_dpm_process_interrupt(struct amdgpu_device *adev,static int si_dpm_late_init (void *handle) { +int ret; +struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +if (!adev->pm.dpm_enabled) +return 0 ; + + ret =si_set_temperature_range (adev); +if (ret) +return ret; +#if 0 //TODO ? +si_dpm_powergate_uvd (adev, true); +#endif return 0 ; }
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +4 -5
@@ -1303,13 +1303,12 @@ static int arcturus_get_power_limit(struct smu_context *smu,if (default_power_limit) *default_power_limit = power_limit; -if (smu->od_enabled) { +if (smu->od_enabled) od_percent_upper =le32_to_cpu (powerplay_table->overdrive_table.max[SMU_11_0_ODSETTING_POWERPERCENTAGE ]); - od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_ODSETTING_POWERPERCENTAGE ]); - }else { +else od_percent_upper =0 ; - od_percent_lower =100 ; - } + + od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_ODSETTING_POWERPERCENTAGE ]);dev_dbg (smu->adev->dev,"od percent upper:%d, od percent lower:%d (default power: %d)\n" , od_percent_upper, od_percent_lower, power_limit);
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +4 -5
@@ -2357,13 +2357,12 @@ static int navi10_get_power_limit(struct smu_context *smu, *default_power_limit = power_limit;if (smu->od_enabled && -navi10_od_feature_is_supported (od_settings,SMU_11_0_ODCAP_POWER_LIMIT )) { +navi10_od_feature_is_supported (od_settings,SMU_11_0_ODCAP_POWER_LIMIT )) od_percent_upper =le32_to_cpu (powerplay_table->overdrive_table.max[SMU_11_0_ODSETTING_POWERPERCENTAGE ]); - od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_ODSETTING_POWERPERCENTAGE ]); - }else { +else od_percent_upper =0 ; - od_percent_lower =100 ; - } + + od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_ODSETTING_POWERPERCENTAGE ]);dev_dbg (smu->adev->dev,"od percent upper:%d, od percent lower:%d (default power: %d)\n" , od_percent_upper, od_percent_lower, power_limit);
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +4 -5
@@ -640,13 +640,12 @@ static int sienna_cichlid_get_power_limit(struct smu_context *smu,if (default_power_limit) *default_power_limit = power_limit; -if (smu->od_enabled) { +if (smu->od_enabled) od_percent_upper =le32_to_cpu (powerplay_table->overdrive_table.max[SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]); - od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]); - }else { +else od_percent_upper =0 ; - od_percent_lower =100 ; - } + + od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]);dev_dbg (smu->adev->dev,"od percent upper:%d, od percent lower:%d (default power: %d)\n" , od_percent_upper, od_percent_lower, power_limit);
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +4 -5
@@ -2364,13 +2364,12 @@ static int smu_v13_0_0_get_power_limit(struct smu_context *smu,if (default_power_limit) *default_power_limit = power_limit; -if (smu->od_enabled) { +if (smu->od_enabled) od_percent_upper =le32_to_cpu (powerplay_table->overdrive_table.max[SMU_13_0_0_ODSETTING_POWERPERCENTAGE ]); - od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_13_0_0_ODSETTING_POWERPERCENTAGE ]); - }else { +else od_percent_upper =0 ; - od_percent_lower =100 ; - } + + od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_13_0_0_ODSETTING_POWERPERCENTAGE ]);dev_dbg (smu->adev->dev,"od percent upper:%d, od percent lower:%d (default power: %d)\n" , od_percent_upper, od_percent_lower, power_limit);
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +4 -5
@@ -2328,13 +2328,12 @@ static int smu_v13_0_7_get_power_limit(struct smu_context *smu,if (default_power_limit) *default_power_limit = power_limit; -if (smu->od_enabled) { +if (smu->od_enabled) od_percent_upper =le32_to_cpu (powerplay_table->overdrive_table.max[SMU_13_0_7_ODSETTING_POWERPERCENTAGE ]); - od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_13_0_7_ODSETTING_POWERPERCENTAGE ]); - }else { +else od_percent_upper =0 ; - od_percent_lower =100 ; - } + + od_percent_lower =le32_to_cpu (powerplay_table->overdrive_table.min[SMU_13_0_7_ODSETTING_POWERPERCENTAGE ]);dev_dbg (smu->adev->dev,"od percent upper:%d, od percent lower:%d (default power: %d)\n" , od_percent_upper, od_percent_lower, power_limit);
drivers/gpu/drm/drm_buddy.c +10 -0
@@ -332,6 +332,7 @@ alloc_range_bias(struct drm_buddy *mm, u64 start, u64 end, unsigned int order) { + u64 req_size = mm->chunk_size << order;struct drm_buddy_block *block;struct drm_buddy_block *buddy;LIST_HEAD (dfs);
@@ -367,6 +368,15 @@ alloc_range_bias(struct drm_buddy *mm,if (drm_buddy_block_is_allocated (block))continue ; +if (block_start < start || block_end > end) { +u64 adjusted_start =max (block_start, start); +u64 adjusted_end =min (block_end, end); + +if (round_down (adjusted_end +1 , req_size) <= +round_up (adjusted_start, req_size)) +continue ; + } +if (contains (start, end, block_start, block_end) && order ==drm_buddy_block_order (block)) {/*
drivers/gpu/drm/nouveau/nouveau_drm.c +3 -2
@@ -708,10 +708,11 @@ nouveau_drm_device_fini(struct drm_device *dev) }mutex_unlock (&drm->clients_lock); -nouveau_sched_fini (drm); -nouveau_cli_fini (&drm->client);nouveau_cli_fini (&drm->master); + +nouveau_sched_fini (drm); +nvif_parent_dtor (&drm->parent);mutex_destroy (&drm->clients_lock);kfree (drm);
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c +2 -2
@@ -1054,8 +1054,6 @@ r535_gsp_postinit(struct nvkm_gsp *gsp)/* Release the DMA buffers that were needed only for boot and init */ nvkm_gsp_mem_dtor (gsp, &gsp->boot.fw);nvkm_gsp_mem_dtor (gsp, &gsp->libos); -nvkm_gsp_mem_dtor (gsp, &gsp->rmargs); -nvkm_gsp_mem_dtor (gsp, &gsp->wpr_meta);return ret; }
@@ -2163,6 +2161,8 @@ r535_gsp_dtor(struct nvkm_gsp *gsp)r535_gsp_dtor_fws (gsp); +nvkm_gsp_mem_dtor (gsp, &gsp->rmargs); +nvkm_gsp_mem_dtor (gsp, &gsp->wpr_meta);nvkm_gsp_mem_dtor (gsp, &gsp->shm.mem);nvkm_gsp_mem_dtor (gsp, &gsp->loginit);nvkm_gsp_mem_dtor (gsp, &gsp->logintr);
drivers/gpu/drm/tegra/drm.c +20 -3
@@ -1242,9 +1242,26 @@ static int host1x_drm_probe(struct host1x_device *dev)drm_mode_config_reset (drm); - err =drm_aperture_remove_framebuffers (&tegra_drm_driver); -if (err <0 ) - goto hub; +/* +* Only take over from a potential firmware framebuffer if any CRTCs +* have been registered. This must not be a fatal error because there +* are other accelerators that are exposed via this driver. +* +* Another case where this happens is on Tegra234 where the display +* hardware is no longer part of the host1x complex, so this driver +* will not expose any modesetting features. +*/ +if (drm->mode_config.num_crtc >0 ) { + err =drm_aperture_remove_framebuffers (&tegra_drm_driver); +if (err <0 ) + goto hub; + }else { +/* +* Indicate to userspace that this doesn't expose any display +* capabilities. +*/ + drm->driver_features &= ~(DRIVER_MODESET |DRIVER_ATOMIC ); + } err =drm_dev_register (drm,0 );if (err <0 )
drivers/gpu/host1x/dev.c +9 -6
@@ -169,6 +169,7 @@ static const struct host1x_info host1x06_info = { .num_sid_entries = ARRAY_SIZE(tegra186_sid_table), .sid_table = tegra186_sid_table, .reserve_vblank_syncpts = false, + .skip_reset_assert = true, };static const struct host1x_sid_entry tegra194_sid_table[] = {
@@ -680,13 +681,15 @@ static int __maybe_unused host1x_runtime_suspend(struct device *dev)host1x_intr_stop (host);host1x_syncpt_save (host); - err =reset_control_bulk_assert (host->nresets, host->resets); -if (err) { -dev_err (dev,"failed to assert reset: %d\n" , err); - goto resume_host1x; - } +if (!host->info->skip_reset_assert) { + err =reset_control_bulk_assert (host->nresets, host->resets); +if (err) { +dev_err (dev,"failed to assert reset: %d\n" , err); + goto resume_host1x; + } -usleep_range (1000 ,2000 ); +usleep_range (1000 ,2000 ); + }clk_disable_unprepare (host->clk);reset_control_bulk_release (host->nresets, host->resets);
drivers/gpu/host1x/dev.h +6 -0
@@ -116,6 +116,12 @@ struct host1x_info {* the display driver disables VBLANK increments. */ bool reserve_vblank_syncpts; +/* +* On Tegra186, secure world applications may require access to +* host1x during suspend/resume. To allow this, we need to leave +* host1x not in reset. +*/ +bool skip_reset_assert; };struct host1x {
drivers/iommu/iommufd/io_pagetable.c +6 -3
@@ -1330,20 +1330,23 @@ int iopt_disable_large_pages(struct io_pagetable *iopt)int iopt_add_access (struct io_pagetable *iopt,struct iommufd_access *access) { +u32 new_id;int rc;down_write (&iopt->domains_rwsem);down_write (&iopt->iova_rwsem); - rc =xa_alloc (&iopt->access_list, &access->iopt_access_list_id, access, - xa_limit_16b,GFP_KERNEL_ACCOUNT ); + rc =xa_alloc (&iopt->access_list, &new_id, access, xa_limit_16b, +GFP_KERNEL_ACCOUNT ); +if (rc) goto out_unlock; rc =iopt_calculate_iova_alignment (iopt);if (rc) { -xa_erase (&iopt->access_list, access->iopt_access_list_id); +xa_erase (&iopt->access_list, new_id); goto out_unlock; } + access->iopt_access_list_id = new_id; out_unlock:up_write (&iopt->iova_rwsem);
drivers/iommu/iommufd/selftest.c +21 -6
@@ -48,8 +48,8 @@ enum {* In syzkaller mode the 64 bit IOVA is converted into an nth area and offset * value. This has a much smaller randomization space and syzkaller can hit it. */ -static unsigned long iommufd_test_syz_conv_iova (struct io_pagetable *iopt, -u64 *iova) +static unsigned long __iommufd_test_syz_conv_iova (struct io_pagetable *iopt, +u64 *iova) {struct syz_layout {__u32 nth_area;
@@ -73,6 +73,21 @@ static unsigned long iommufd_test_syz_conv_iova(struct io_pagetable *iopt,return 0 ; } +static unsigned long iommufd_test_syz_conv_iova (struct iommufd_access *access, +u64 *iova) +{ +unsigned long ret; + +mutex_lock (&access->ioas_lock); +if (!access->ioas) { +mutex_unlock (&access->ioas_lock); +return 0 ; + } + ret =__iommufd_test_syz_conv_iova (&access->ioas->iopt, iova); +mutex_unlock (&access->ioas_lock); +return ret; +} +void iommufd_test_syz_conv_iova_id (struct iommufd_ucmd *ucmd,unsigned int ioas_id,u64 *iova,u32 *flags) {
@@ -85,7 +100,7 @@ void iommufd_test_syz_conv_iova_id(struct iommufd_ucmd *ucmd, ioas =iommufd_get_ioas (ucmd->ictx, ioas_id);if (IS_ERR (ioas))return ; - *iova =iommufd_test_syz_conv_iova (&ioas->iopt, iova); + *iova =__iommufd_test_syz_conv_iova (&ioas->iopt, iova);iommufd_put_object (ucmd->ictx, &ioas->obj); }
@@ -1045,7 +1060,7 @@ static int iommufd_test_access_pages(struct iommufd_ucmd *ucmd, }if (flags &MOCK_FLAGS_ACCESS_SYZ ) - iova =iommufd_test_syz_conv_iova (&staccess->access->ioas->iopt, + iova =iommufd_test_syz_conv_iova (staccess->access, &cmd->access_pages.iova); npages = (ALIGN(iova + length, PAGE_SIZE) -
@@ -1147,8 +1162,8 @@ static int iommufd_test_access_rw(struct iommufd_ucmd *ucmd, }if (flags &MOCK_FLAGS_ACCESS_SYZ ) - iova =iommufd_test_syz_conv_iova (&staccess->access->ioas->iopt, - &cmd->access_rw.iova); + iova =iommufd_test_syz_conv_iova (staccess->access, + &cmd->access_rw.iova); rc =iommufd_access_rw (staccess->access, iova, tmp, length, flags);if (rc)
drivers/mfd/twl6030-irq.c +5 -5
@@ -24,10 +24,10 @@#include <linux/kthread.h> #include <linux/mfd/twl.h> #include <linux/platform_device.h> -#include <linux/property.h> #include <linux/suspend.h> #include <linux/of.h> #include <linux/irqdomain.h> +#include <linux/of_device.h> #include "twl-core.h"
@@ -368,10 +368,10 @@ int twl6030_init_irq(struct device *dev, int irq_num)int nr_irqs;int status;u8 mask[3 ]; -const int *irq_tbl; +const struct of_device_id *of_id; - irq_tbl =device_get_match_data (dev); -if (!irq_tbl) { + of_id =of_match_device (twl6030_of_match, dev); +if (!of_id || !of_id->data) {dev_err (dev,"Unknown TWL device model\n" );return -EINVAL ; }
@@ -409,7 +409,7 @@ int twl6030_init_irq(struct device *dev, int irq_num) twl6030_irq->pm_nb.notifier_call = twl6030_irq_pm_notifier;atomic_set (&twl6030_irq->wakeirqs,0 ); - twl6030_irq->irq_mapping_tbl = irq_tbl; + twl6030_irq->irq_mapping_tbl = of_id->data; twl6030_irq->irq_domain = irq_domain_add_linear(node, nr_irqs,
drivers/mmc/core/mmc.c +2 -0
@@ -1006,10 +1006,12 @@ static int mmc_select_bus_width(struct mmc_card *card)static unsigned ext_csd_bits[] = {EXT_CSD_BUS_WIDTH_8 ,EXT_CSD_BUS_WIDTH_4 , +EXT_CSD_BUS_WIDTH_1 , };static unsigned bus_widths[] = {MMC_BUS_WIDTH_8 ,MMC_BUS_WIDTH_4 , +MMC_BUS_WIDTH_1 , };struct mmc_host *host = card->host;unsigned idx, bus_width =0 ;
drivers/mmc/host/mmci_stm32_sdmmc.c +24 -0
@@ -225,6 +225,8 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)struct scatterlist *sg;int i; + host->dma_in_progress = true; +if (!host->variant->dma_lli || data->sg_len ==1 || idma->use_bounce_buffer) {u32 dma_addr;
@@ -263,9 +265,30 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)return 0 ; } +static void sdmmc_idma_error (struct mmci_host *host) +{ +struct mmc_data *data = host->data; +struct sdmmc_idma *idma = host->dma_priv; + +if (!dma_inprogress (host)) +return ; + +writel_relaxed (0 , host->base +MMCI_STM32_IDMACTRLR ); + host->dma_in_progress = false; + data->host_cookie =0 ; + +if (!idma->use_bounce_buffer) +dma_unmap_sg (mmc_dev (host->mmc), data->sg, data->sg_len, +mmc_get_dma_dir (data)); +} +static void sdmmc_idma_finalize (struct mmci_host *host,struct mmc_data *data) { +if (!dma_inprogress (host)) +return ; +writel_relaxed (0 , host->base +MMCI_STM32_IDMACTRLR ); + host->dma_in_progress = false;if (!data->host_cookie)sdmmc_idma_unprep_data (host, data,0 );
@@ -676,6 +699,7 @@ static struct mmci_host_ops sdmmc_variant_ops = { .dma_setup = sdmmc_idma_setup, .dma_start = sdmmc_idma_start, .dma_finalize = sdmmc_idma_finalize, + .dma_error = sdmmc_idma_error, .set_clkreg = mmci_sdmmc_set_clkreg, .set_pwrreg = mmci_sdmmc_set_pwrreg, .busy_complete = sdmmc_busy_complete,
drivers/mmc/host/sdhci-xenon-phy.c +39 -9
81 lines not on this page · raw message
drivers/mtd/nand/raw/marvell_nand.c +5 -8
@@ -290,16 +290,13 @@ static const struct marvell_hw_ecc_layout marvell_nfc_layouts[] = {MARVELL_LAYOUT (2048 ,512 ,4 ,1 ,1 ,2048 ,32 ,30 ,0 ,0 ,0 ),MARVELL_LAYOUT (2048 ,512 ,8 ,2 ,1 ,1024 ,0 ,30 ,1024 ,32 ,30 ),MARVELL_LAYOUT (2048 ,512 ,8 ,2 ,1 ,1024 ,0 ,30 ,1024 ,64 ,30 ), -MARVELL_LAYOUT (2048 ,512 ,12 ,3 ,2 ,704 ,0 ,30 ,640 ,0 ,30 ), -MARVELL_LAYOUT (2048 ,512 ,16 ,5 ,4 ,512 ,0 ,30 ,0 ,32 ,30 ), +MARVELL_LAYOUT (2048 ,512 ,16 ,4 ,4 ,512 ,0 ,30 ,0 ,32 ,30 ),MARVELL_LAYOUT (4096 ,512 ,4 ,2 ,2 ,2048 ,32 ,30 ,0 ,0 ,0 ), -MARVELL_LAYOUT (4096 ,512 ,8 ,5 ,4 ,1024 ,0 ,30 ,0 ,64 ,30 ), -MARVELL_LAYOUT (4096 ,512 ,12 ,6 ,5 ,704 ,0 ,30 ,576 ,32 ,30 ), -MARVELL_LAYOUT (4096 ,512 ,16 ,9 ,8 ,512 ,0 ,30 ,0 ,32 ,30 ), +MARVELL_LAYOUT (4096 ,512 ,8 ,4 ,4 ,1024 ,0 ,30 ,0 ,64 ,30 ), +MARVELL_LAYOUT (4096 ,512 ,16 ,8 ,8 ,512 ,0 ,30 ,0 ,32 ,30 ),MARVELL_LAYOUT (8192 ,512 ,4 ,4 ,4 ,2048 ,0 ,30 ,0 ,0 ,0 ), -MARVELL_LAYOUT (8192 ,512 ,8 ,9 ,8 ,1024 ,0 ,30 ,0 ,160 ,30 ), -MARVELL_LAYOUT (8192 ,512 ,12 ,12 ,11 ,704 ,0 ,30 ,448 ,64 ,30 ), - MARVELL_LAYOUT( 8192, 512, 16, 17, 16, 512, 0, 30, 0, 32, 30), +MARVELL_LAYOUT (8192 ,512 ,8 ,8 ,8 ,1024 ,0 ,30 ,0 ,160 ,30 ), + MARVELL_LAYOUT( 8192, 512, 16, 16, 16, 512, 0, 30, 0, 32, 30), };/**
drivers/mtd/nand/spi/gigadevice.c +4 -2
@@ -186,7 +186,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand, {u8 status2;struct spi_mem_op op =SPINAND_GET_FEATURE_OP (GD5FXGQXXEXXG_REG_STATUS2 , - &status2); + spinand->scratchbuf);int ret;switch (status &STATUS_ECC_MASK ) {
@@ -207,6 +207,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,* report the maximum of 4 in this case */ /* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */ + status2 = *(spinand->scratchbuf);return ((status &STATUS_ECC_MASK ) >>2 ) | ((status2 &STATUS_ECC_MASK ) >>4 );
@@ -228,7 +229,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand, {u8 status2;struct spi_mem_op op =SPINAND_GET_FEATURE_OP (GD5FXGQXXEXXG_REG_STATUS2 , - &status2); + spinand->scratchbuf);int ret;switch (status &STATUS_ECC_MASK ) {
@@ -248,6 +249,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,* 1 ... 4 bits are flipped (and corrected) */ /* bits sorted this way (1...0): ECCSE1, ECCSE0 */ + status2 = *(spinand->scratchbuf);return ((status2 &STATUS_ECC_MASK ) >>4 ) +1 ;case STATUS_ECC_UNCOR_ERROR :
drivers/net/ethernet/freescale/fman/fman_memac.c +9 -9
@@ -1073,6 +1073,14 @@ int memac_initialization(struct mac_device *mac_dev,unsigned long capabilities;unsigned long *supported; +/* The internal connection to the serdes is XGMII, but this isn't +* really correct for the phy mode (which is the external connection). +* However, this is how all older device trees say that they want +* 10GBASE-R (aka XFI), so just convert it for them. +*/ +if (mac_dev->phy_if ==PHY_INTERFACE_MODE_XGMII ) + mac_dev->phy_if =PHY_INTERFACE_MODE_10GBASER ; + mac_dev->phylink_ops = &memac_mac_ops; mac_dev->set_promisc = memac_set_promiscuous; mac_dev->change_addr = memac_modify_mac_address;
@@ -1139,7 +1147,7 @@ int memac_initialization(struct mac_device *mac_dev,* (and therefore that xfi_pcs cannot be set). If we are defaulting to * XGMII, assume this is for XFI. Otherwise, assume it is for SGMII. */ -if (err && mac_dev->phy_if ==PHY_INTERFACE_MODE_XGMII ) +if (err && mac_dev->phy_if ==PHY_INTERFACE_MODE_10GBASER ) memac->xfi_pcs = pcs;else memac->sgmii_pcs = pcs;
@@ -1153,14 +1161,6 @@ int memac_initialization(struct mac_device *mac_dev, goto _return_fm_mac_free; } -/* The internal connection to the serdes is XGMII, but this isn't -* really correct for the phy mode (which is the external connection). -* However, this is how all older device trees say that they want -* 10GBASE-R (aka XFI), so just convert it for them. -*/ -if (mac_dev->phy_if ==PHY_INTERFACE_MODE_XGMII ) - mac_dev->phy_if =PHY_INTERFACE_MODE_10GBASER ; -/* TODO: The following interface modes are supported by (some) hardware * but not by this driver: * - 1000BASE-KX
drivers/net/ethernet/intel/ice/ice_dpll.c +78 -13
201 lines not on this page · raw message
drivers/net/ethernet/intel/igb/igb_ptp.c +3 -2
@@ -957,7 +957,7 @@ static void igb_ptp_tx_hwtstamp(struct igb_adapter *adapter)igb_ptp_systim_to_hwtstamp (adapter, &shhwtstamps, regval);/* adjust timestamp for the TX latency based on link speed */ -if (adapter->hw.mac.type == e1000_i210) { +if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) {switch (adapter->link_speed) {case SPEED_10 : adjust =IGB_I210_TX_LATENCY_10 ;
@@ -1003,6 +1003,7 @@ int igb_ptp_rx_pktstamp(struct igb_q_vector *q_vector, void *va, ktime_t *timestamp) {struct igb_adapter *adapter = q_vector->adapter; +struct e1000_hw *hw = &adapter->hw;struct skb_shared_hwtstamps ts;__le64 *regval = (__le64 *)va;int adjust =0 ;
@@ -1022,7 +1023,7 @@ int igb_ptp_rx_pktstamp(struct igb_q_vector *q_vector, void *va,igb_ptp_systim_to_hwtstamp (adapter, &ts,le64_to_cpu (regval[1 ]));/* adjust timestamp for the RX latency based on link speed */ -if (adapter->hw.mac.type == e1000_i210) { +if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211) {switch (adapter->link_speed) {case SPEED_10 : adjust =IGB_I210_RX_LATENCY_10 ;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
@@ -3942,8 +3942,10 @@ static void stmmac_fpe_stop_wq(struct stmmac_priv *priv) {set_bit (__FPE_REMOVING, &priv->fpe_task_state); -if (priv->fpe_wq) +if (priv->fpe_wq) {destroy_workqueue (priv->fpe_wq); + priv->fpe_wq =NULL ; + }netdev_info (priv->dev,"FPE workqueue stop" ); }
drivers/net/gtp.c +6 -6
@@ -1903,26 +1903,26 @@ static int __init gtp_init(void)get_random_bytes (>p_h_initval,sizeof (gtp_h_initval)); - err =rtnl_link_register (>p_link_ops); + err =register_pernet_subsys (>p_net_ops);if (err <0 ) goto error_out; - err =register_pernet_subsys (>p_net_ops); + err =rtnl_link_register (>p_link_ops);if (err <0 ) - goto unreg_rtnl_link; + goto unreg_pernet_subsys; err =genl_register_family (>p_genl_family);if (err <0 ) - goto unreg_pernet_subsys; + goto unreg_rtnl_link;pr_info ("GTP module loaded (pdp ctx size %zd bytes)\n" ,sizeof (struct pdp_ctx ));return 0 ; -unreg_pernet_subsys: -unregister_pernet_subsys (>p_net_ops); unreg_rtnl_link:rtnl_link_unregister (>p_link_ops); +unreg_pernet_subsys: +unregister_pernet_subsys (>p_net_ops); error_out:pr_err ("error loading GTP module loaded\n" );return err;
drivers/net/tun.c +1 -0
@@ -653,6 +653,7 @@ static void __tun_detach(struct tun_file *tfile, bool clean) tun->tfiles[tun->numqueues - 1]); ntfile =rtnl_dereference (tun->tfiles[index]); ntfile->queue_index = index; + ntfile->xdp_rxq.queue_index = index;rcu_assign_pointer (tun->tfiles[tun->numqueues -1 ],NULL );
drivers/net/usb/dm9601.c +1 -1
@@ -232,7 +232,7 @@ static int dm9601_mdio_read(struct net_device *netdev, int phy_id, int loc) err =dm_read_shared_word (dev,1 , loc, &res);if (err <0 ) {netdev_err (dev->net,"MDIO read error: %d\n" , err); -return err; +return 0 ; } netdev_dbg(dev->net,
drivers/net/usb/lan78xx.c +4 -1
@@ -1501,7 +1501,9 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)lan78xx_rx_urb_submit_all (dev); +local_bh_disable ();napi_schedule (&dev->napi); +local_bh_enable (); }return 0 ;
@@ -3035,7 +3037,8 @@ static int lan78xx_reset(struct lan78xx_net *dev)if (dev->chipid ==ID_REV_CHIP_ID_7801_ ) buf &= ~MAC_CR_GMII_EN_ ; -if (dev->chipid ==ID_REV_CHIP_ID_7800_ ) { +if (dev->chipid ==ID_REV_CHIP_ID_7800_ || + dev->chipid ==ID_REV_CHIP_ID_7850_ ) { ret =lan78xx_read_raw_eeprom (dev,0 ,1 , &sig);if (!ret && sig !=EEPROM_INDICATOR ) {/* Implies there is no external eeprom. Set mac speed */
drivers/net/veth.c +20 -20
@@ -1208,14 +1208,6 @@ static int veth_enable_xdp(struct net_device *dev)veth_disable_xdp_range (dev,0 , dev->real_num_rx_queues, true);return err; } - -if (!veth_gro_requested (dev)) { -/* user-space did not require GRO, but adding XDP -* is supposed to get GRO working -*/ - dev->features |=NETIF_F_GRO ; -netdev_features_change (dev); - } } }
@@ -1235,18 +1227,9 @@ static void veth_disable_xdp(struct net_device *dev)for (i =0 ; i < dev->real_num_rx_queues; i++)rcu_assign_pointer (priv->rq[i].xdp_prog,NULL ); -if (!netif_running (dev) || !veth_gro_requested (dev)) { +if (!netif_running (dev) || !veth_gro_requested (dev))veth_napi_del (dev); -/* if user-space did not require GRO, since adding XDP -* enabled it, clear it now -*/ -if (!veth_gro_requested (dev) &&netif_running (dev)) { - dev->features &= ~NETIF_F_GRO ; -netdev_features_change (dev); - } - } -veth_disable_xdp_range (dev,0 , dev->real_num_rx_queues, false); }
@@ -1478,7 +1461,8 @@ static int veth_alloc_queues(struct net_device *dev)struct veth_priv *priv =netdev_priv (dev);int i; - priv->rq =kcalloc (dev->num_rx_queues,sizeof (*priv->rq),GFP_KERNEL_ACCOUNT ); + priv->rq =kvcalloc (dev->num_rx_queues,sizeof (*priv->rq), +GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL);if (!priv->rq)return -ENOMEM ;
@@ -1494,7 +1478,7 @@ static void veth_free_queues(struct net_device *dev) {struct veth_priv *priv =netdev_priv (dev); -kfree (priv->rq); +kvfree (priv->rq); }static int veth_dev_init (struct net_device *dev)
@@ -1654,6 +1638,14 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, }if (!old_prog) { +if (!veth_gro_requested (dev)) { +/* user-space did not require GRO, but adding +* XDP is supposed to get GRO working +*/ + dev->features |=NETIF_F_GRO ; +netdev_features_change (dev); + } + peer->hw_features &= ~NETIF_F_GSO_SOFTWARE ; peer->max_mtu = max_mtu; }
@@ -1669,6 +1661,14 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,if (dev->flags &IFF_UP )veth_disable_xdp (dev); +/* if user-space did not require GRO, since adding XDP +* enabled it, clear it now +*/ +if (!veth_gro_requested (dev)) { + dev->features &= ~NETIF_F_GRO ; +netdev_features_change (dev); + } +if (peer) { peer->hw_features |=NETIF_F_GSO_SOFTWARE ; peer->max_mtu =ETH_MAX_MTU ;
drivers/of/property.c +1 -1
@@ -1303,7 +1303,7 @@ static struct device_node *parse_remote_endpoint(struct device_node *np, int index) {/* Return NULL for index > 0 to signify end of remote-endpoints. */ -if (!index ||strcmp (prop_name,"remote-endpoint" )) +if (index >0 ||strcmp (prop_name,"remote-endpoint" ))return NULL ;return of_graph_get_remote_port_parent (np);
drivers/perf/riscv_pmu.c +5 -13
@@ -150,19 +150,11 @@ u64 riscv_pmu_ctr_get_width_mask(struct perf_event *event)struct riscv_pmu *rvpmu =to_riscv_pmu (event->pmu);struct hw_perf_event *hwc = &event->hw; -if (!rvpmu->ctr_get_width) -/** -* If the pmu driver doesn't support counter width, set it to default -* maximum allowed by the specification. -*/ - cwidth =63 ; -else { -if (hwc->idx ==-1 ) -/* Handle init case where idx is not initialized yet */ - cwidth = rvpmu->ctr_get_width (0 ); -else - cwidth = rvpmu->ctr_get_width (hwc->idx); - } +if (hwc->idx ==-1 ) +/* Handle init case where idx is not initialized yet */ + cwidth = rvpmu->ctr_get_width (0 ); +else + cwidth = rvpmu->ctr_get_width (hwc->idx);return GENMASK_ULL (cwidth,0 ); }
drivers/perf/riscv_pmu_legacy.c +9 -1
@@ -37,6 +37,12 @@ static int pmu_legacy_event_map(struct perf_event *event, u64 *config)return pmu_legacy_ctr_get_idx (event); } +/* cycle & instret are always 64 bit, one bit less according to SBI spec */ +static int pmu_legacy_ctr_get_width (int idx) +{ +return 63 ; +} +static u64 pmu_legacy_read_ctr (struct perf_event *event) {struct hw_perf_event *hwc = &event->hw;
@@ -111,12 +117,14 @@ static void pmu_legacy_init(struct riscv_pmu *pmu) pmu->ctr_stop =NULL ; pmu->event_map = pmu_legacy_event_map; pmu->ctr_get_idx = pmu_legacy_ctr_get_idx; - pmu->ctr_get_width =NULL ; + pmu->ctr_get_width = pmu_legacy_ctr_get_width; pmu->ctr_clear_idx =NULL ; pmu->ctr_read = pmu_legacy_read_ctr; pmu->event_mapped = pmu_legacy_event_mapped; pmu->event_unmapped = pmu_legacy_event_unmapped; pmu->csr_index = pmu_legacy_csr_index; + pmu->pmu.capabilities |=PERF_PMU_CAP_NO_INTERRUPT ; + pmu->pmu.capabilities |=PERF_PMU_CAP_NO_EXCLUDE ;perf_pmu_register (&pmu->pmu,"cpu" ,PERF_TYPE_RAW ); }
drivers/phy/freescale/phy-fsl-imx8-mipi-dphy.c +1 -1
@@ -706,7 +706,7 @@ static int mixel_dphy_probe(struct platform_device *pdev)return ret; } - priv->id =of_alias_get_id (np,"mipi_dphy" ); + priv->id =of_alias_get_id (np,"mipi-dphy" );if (priv->id <0 ) {dev_err (dev,"Failed to get phy node alias id: %d\n" , priv->id);
drivers/phy/qualcomm/phy-qcom-m31.c +1 -1
@@ -299,7 +299,7 @@ static int m31usb_phy_probe(struct platform_device *pdev) qphy->vreg =devm_regulator_get (dev,"vdda-phy" );if (IS_ERR (qphy->vreg)) -return dev_err_probe (dev,PTR_ERR (qphy->phy), +return dev_err_probe (dev,PTR_ERR (qphy->vreg),"failed to get vreg\n" );phy_set_drvdata (qphy->phy, qphy);
drivers/phy/qualcomm/phy-qcom-qmp-usb.c +5 -5
@@ -1276,7 +1276,7 @@ static const char * const qmp_phy_vreg_l[] = { "vdda-phy", "vdda-pll", }; -static const struct qmp_usb_offsets qmp_usb_offsets_ipq8074 = { +static const struct qmp_usb_offsets qmp_usb_offsets_v3 = { .serdes =0 , .pcs =0x800 , .pcs_misc =0x600 ,
@@ -1292,7 +1292,7 @@ static const struct qmp_usb_offsets qmp_usb_offsets_ipq9574 = { .rx = 0x400, }; -static const struct qmp_usb_offsets qmp_usb_offsets_v3 = { +static const struct qmp_usb_offsets qmp_usb_offsets_v3_msm8996 = { .serdes =0 , .pcs =0x600 , .tx =0x200 ,
@@ -1328,7 +1328,7 @@ static const struct qmp_usb_offsets qmp_usb_offsets_v5 = {static const struct qmp_phy_cfg ipq6018_usb3phy_cfg = { .lanes =1 , - .offsets = &qmp_usb_offsets_ipq8074, + .offsets = &qmp_usb_offsets_v3, .serdes_tbl = ipq9574_usb3_serdes_tbl, .serdes_tbl_num =ARRAY_SIZE (ipq9574_usb3_serdes_tbl),
@@ -1346,7 +1346,7 @@ static const struct qmp_phy_cfg ipq6018_usb3phy_cfg = {static const struct qmp_phy_cfg ipq8074_usb3phy_cfg = { .lanes =1 , - .offsets = &qmp_usb_offsets_ipq8074, + .offsets = &qmp_usb_offsets_v3, .serdes_tbl = ipq8074_usb3_serdes_tbl, .serdes_tbl_num =ARRAY_SIZE (ipq8074_usb3_serdes_tbl),
@@ -1382,7 +1382,7 @@ static const struct qmp_phy_cfg ipq9574_usb3phy_cfg = {static const struct qmp_phy_cfg msm8996_usb3phy_cfg = { .lanes =1 , - .offsets = &qmp_usb_offsets_v3, + .offsets = &qmp_usb_offsets_v3_msm8996, .serdes_tbl = msm8996_usb3_serdes_tbl, .serdes_tbl_num =ARRAY_SIZE (msm8996_usb3_serdes_tbl),
drivers/pmdomain/arm/scmi_perf_domain.c +3 -0
@@ -159,6 +159,9 @@ static void scmi_perf_domain_remove(struct scmi_device *sdev)struct genpd_onecell_data *scmi_pd_data =dev_get_drvdata (dev);int i; +if (!scmi_pd_data) +return ; +of_genpd_del_provider (dev->of_node);for (i =0 ; i < scmi_pd_data->num_domains; i++)
drivers/pmdomain/qcom/rpmhpd.c +5 -2
@@ -692,6 +692,7 @@ static int rpmhpd_aggregate_corner(struct rpmhpd *pd, unsigned int corner)unsigned int active_corner, sleep_corner;unsigned int this_active_corner =0 , this_sleep_corner =0 ;unsigned int peer_active_corner =0 , peer_sleep_corner =0 ; +unsigned int peer_enabled_corner;if (pd->state_synced) {to_active_sleep (pd, corner, &this_active_corner, &this_sleep_corner);
@@ -701,9 +702,11 @@ static int rpmhpd_aggregate_corner(struct rpmhpd *pd, unsigned int corner) this_sleep_corner = pd->level_count -1 ; } -if (peer && peer->enabled) -to_active_sleep (peer, peer->corner, &peer_active_corner, +if (peer && peer->enabled) { + peer_enabled_corner =max (peer->corner, peer->enable_corner); +to_active_sleep (peer, peer_enabled_corner, &peer_active_corner, &peer_sleep_corner); + } active_corner =max (this_active_corner, peer_active_corner);
drivers/power/supply/Kconfig +1 -0
@@ -978,6 +978,7 @@ config CHARGER_QCOM_SMB2 config FUEL_GAUGE_MM8013 tristate "Mitsumi MM8013 fuel gauge driver" depends on I2C + select REGMAP_I2C help Say Y here to enable the Mitsumi MM8013 fuel gauge driver. It enables the monitoring of many battery parameters, including
drivers/power/supply/bq27xxx_battery_i2c.c +3 -1
@@ -209,7 +209,9 @@ static void bq27xxx_battery_i2c_remove(struct i2c_client *client) {struct bq27xxx_device_info *di =i2c_get_clientdata (client); -free_irq (client->irq, di); +if (client->irq) +free_irq (client->irq, di); +bq27xxx_battery_teardown (di);mutex_lock (&battery_mutex);
drivers/soc/qcom/pmic_glink.c +11 -10
@@ -268,10 +268,17 @@ static int pmic_glink_probe(struct platform_device *pdev)else pg->client_mask =PMIC_GLINK_CLIENT_DEFAULT ; + pg->pdr =pdr_handle_alloc (pmic_glink_pdr_callback, pg); +if (IS_ERR (pg->pdr)) { + ret =dev_err_probe (&pdev->dev,PTR_ERR (pg->pdr), +"failed to initialize pdr\n" ); +return ret; + } +if (pg->client_mask &BIT (PMIC_GLINK_CLIENT_UCSI )) { ret =pmic_glink_add_aux_device (pg, &pg->ucsi_aux,"ucsi" );if (ret) -return ret; + goto out_release_pdr_handle; }if (pg->client_mask &BIT (PMIC_GLINK_CLIENT_ALTMODE )) { ret =pmic_glink_add_aux_device (pg, &pg->altmode_aux,"altmode" );
@@ -284,17 +291,11 @@ static int pmic_glink_probe(struct platform_device *pdev) goto out_release_altmode_aux; } - pg->pdr =pdr_handle_alloc (pmic_glink_pdr_callback, pg); -if (IS_ERR (pg->pdr)) { - ret =dev_err_probe (&pdev->dev,PTR_ERR (pg->pdr),"failed to initialize pdr\n" ); - goto out_release_aux_devices; - } - service =pdr_add_lookup (pg->pdr,"tms/servreg" ,"msm/adsp/charger_pd" );if (IS_ERR (service)) { ret =dev_err_probe (&pdev->dev,PTR_ERR (service),"failed adding pdr lookup for charger_pd\n" ); - goto out_release_pdr_handle; + goto out_release_aux_devices; }mutex_lock (&__pmic_glink_lock);
@@ -303,8 +304,6 @@ static int pmic_glink_probe(struct platform_device *pdev)return 0 ; -out_release_pdr_handle: -pdr_handle_release (pg->pdr); out_release_aux_devices:if (pg->client_mask &BIT (PMIC_GLINK_CLIENT_BATT ))pmic_glink_del_aux_device (pg, &pg->ps_aux);
@@ -314,6 +313,8 @@ static int pmic_glink_probe(struct platform_device *pdev) out_release_ucsi_aux:if (pg->client_mask &BIT (PMIC_GLINK_CLIENT_UCSI ))pmic_glink_del_aux_device (pg, &pg->ucsi_aux); +out_release_pdr_handle: +pdr_handle_release (pg->pdr);return ret; }
drivers/spi/spi-cadence-quadspi.c +2 -9
@@ -1930,21 +1930,15 @@ static void cqspi_remove(struct platform_device *pdev)static int cqspi_suspend (struct device *dev) {struct cqspi_st *cqspi =dev_get_drvdata (dev); -struct spi_controller *host =dev_get_drvdata (dev); -int ret; - ret =spi_controller_suspend (host);cqspi_controller_enable (cqspi,0 ); -clk_disable_unprepare (cqspi->clk); - -return ret; +return 0 ; }static int cqspi_resume (struct device *dev) {struct cqspi_st *cqspi =dev_get_drvdata (dev); -struct spi_controller *host =dev_get_drvdata (dev);clk_prepare_enable (cqspi->clk);cqspi_wait_idle (cqspi);
@@ -1952,8 +1946,7 @@ static int cqspi_resume(struct device *dev) cqspi->current_cs =-1 ; cqspi->sclk =0 ; - -return spi_controller_resume (host); +return 0 ; } static DEFINE_RUNTIME_DEV_PM_OPS(cqspi_dev_pm_ops, cqspi_suspend,
drivers/video/fbdev/core/fbcon.c +3 -5
@@ -2400,11 +2400,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,struct fbcon_ops *ops = info->fbcon_par;struct fbcon_display *p = &fb_display[vc->vc_num];int resize, ret, old_userfont, old_width, old_height, old_charcount; -char *old_data =NULL ; +u8 *old_data = vc->vc_font.data; resize = (w != vc->vc_font.width) || (h != vc->vc_font.height); -if (p->userfont) - old_data = vc->vc_font.data; vc->vc_font.data = (void *)(p->fontdata = data); old_userfont = p->userfont;if ((p->userfont = userfont))
@@ -2438,13 +2436,13 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,update_screen (vc); } -if (old_data && (--REFCOUNT (old_data) ==0 )) +if (old_userfont && (--REFCOUNT (old_data) ==0 ))kfree (old_data -FONT_EXTRA_WORDS *sizeof (int ));return 0 ; err_out: p->fontdata = old_data; - vc->vc_font.data = (void *)old_data; + vc->vc_font.data = old_data;if (userfont) { p->userfont = old_userfont;
fs/afs/dir.c +3 -1
@@ -479,8 +479,10 @@ static int afs_dir_iterate_block(struct afs_vnode *dvnode, dire->u.name[0 ] =='.' && ctx->actor != afs_lookup_filldir && ctx->actor != afs_lookup_one_filldir && - memcmp(dire->u.name, ".__afs", 6) == 0) + memcmp(dire->u.name, ".__afs", 6) == 0) { + ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);continue ; + }/* found the next entry */ if (!dir_emit(ctx, dire->u.name, nlen,
fs/btrfs/dev-replace.c +20 -4
@@ -727,6 +727,23 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info,return ret; } +static int btrfs_check_replace_dev_names (struct btrfs_ioctl_dev_replace_args *args) +{ +if (args->start.srcdevid ==0 ) { +if (memchr (args->start.srcdev_name,0 , +sizeof (args->start.srcdev_name)) ==NULL ) +return -ENAMETOOLONG ; + }else { + args->start.srcdev_name[0 ] =0 ; + } + +if (memchr (args->start.tgtdev_name,0 , +sizeof (args->start.tgtdev_name)) ==NULL ) +return -ENAMETOOLONG ; + +return 0 ; +} +int btrfs_dev_replace_by_ioctl (struct btrfs_fs_info *fs_info,struct btrfs_ioctl_dev_replace_args *args) {
@@ -739,10 +756,9 @@ int btrfs_dev_replace_by_ioctl(struct btrfs_fs_info *fs_info,default :return -EINVAL ; } - -if ((args->start.srcdevid ==0 && args->start.srcdev_name[0 ] =='\0' ) || - args->start.tgtdev_name[0 ] =='\0' ) -return -EINVAL ; + ret =btrfs_check_replace_dev_names (args); +if (ret <0 ) +return ret; ret = btrfs_dev_replace_start(fs_info, args->start.tgtdev_name, args->start.srcdevid,
fs/btrfs/disk-io.c +11 -11
@@ -1286,12 +1286,12 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info)* * @objectid: root id * @anon_dev: preallocated anonymous block device number for new roots, -* pass 0 for new allocation. +* pass NULL for a new allocation. * @check_ref: whether to check root item references, If true, return -ENOENT * for orphan roots */ static struct btrfs_root *btrfs_get_root_ref (struct btrfs_fs_info *fs_info, -u64 objectid,dev_t anon_dev, +u64 objectid,dev_t *anon_dev,bool check_ref) {struct btrfs_root *root;
@@ -1321,9 +1321,9 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info,* that common but still possible. In that case, we just need * to free the anon_dev. */ -if (unlikely (anon_dev)) { -free_anon_bdev (anon_dev); - anon_dev =0 ; +if (unlikely (anon_dev && *anon_dev)) { +free_anon_bdev (*anon_dev); + *anon_dev =0 ; }if (check_ref &&btrfs_root_refs (&root->root_item) ==0 ) {
@@ -1345,7 +1345,7 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info, goto fail; } - ret =btrfs_init_fs_root (root, anon_dev); + ret =btrfs_init_fs_root (root, anon_dev ? *anon_dev :0 );if (ret) goto fail;
@@ -1381,7 +1381,7 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info,* root's anon_dev to 0 to avoid a double free, once by btrfs_put_root() * and once again by our caller. */ -if (anon_dev) +if (anon_dev && *anon_dev) root->anon_dev =0 ;btrfs_put_root (root);return ERR_PTR (ret);
@@ -1397,7 +1397,7 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info,struct btrfs_root *btrfs_get_fs_root (struct btrfs_fs_info *fs_info,u64 objectid,bool check_ref) { -return btrfs_get_root_ref (fs_info, objectid,0 , check_ref); +return btrfs_get_root_ref (fs_info, objectid,NULL , check_ref); }/*
@@ -1405,11 +1405,11 @@ struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,* the anonymous block device id * * @objectid: tree objectid -* @anon_dev: if zero, allocate a new anonymous block device or use the -* parameter value +* @anon_dev: if NULL, allocate a new anonymous block device or use the +* parameter value if not NULL */ struct btrfs_root *btrfs_get_new_fs_root (struct btrfs_fs_info *fs_info, -u64 objectid,dev_t anon_dev) +u64 objectid,dev_t *anon_dev) {return btrfs_get_root_ref (fs_info, objectid, anon_dev, true); }
fs/btrfs/disk-io.h +1 -1
@@ -64,7 +64,7 @@ void btrfs_free_fs_roots(struct btrfs_fs_info *fs_info);struct btrfs_root *btrfs_get_fs_root (struct btrfs_fs_info *fs_info,u64 objectid,bool check_ref);struct btrfs_root *btrfs_get_new_fs_root (struct btrfs_fs_info *fs_info, -u64 objectid,dev_t anon_dev); +u64 objectid,dev_t *anon_dev);struct btrfs_root *btrfs_get_fs_root_commit_root (struct btrfs_fs_info *fs_info,struct btrfs_path *path,u64 objectid);
fs/btrfs/extent_io.c +96 -7
123 lines not on this page · raw message
fs/btrfs/ioctl.c +1 -1
@@ -721,7 +721,7 @@ static noinline int create_subvol(struct mnt_idmap *idmap,free_extent_buffer (leaf); leaf =NULL ; - new_root =btrfs_get_new_fs_root (fs_info, objectid, anon_dev); + new_root =btrfs_get_new_fs_root (fs_info, objectid, &anon_dev);if (IS_ERR (new_root)) { ret =PTR_ERR (new_root);btrfs_abort_transaction (trans, ret);
fs/btrfs/send.c +13 -4
@@ -6705,11 +6705,20 @@ static int finish_inode_if_needed(struct send_ctx *sctx, int at_end)if (ret) goto out; } -if (sctx->cur_inode_last_extent < - sctx->cur_inode_size) { - ret =send_hole (sctx, sctx->cur_inode_size); -if (ret) +if (sctx->cur_inode_last_extent < sctx->cur_inode_size) { + ret =range_is_hole_in_parent (sctx, + sctx->cur_inode_last_extent, + sctx->cur_inode_size); +if (ret <0 ) { goto out; + }else if (ret ==0 ) { + ret =send_hole (sctx, sctx->cur_inode_size); +if (ret <0 ) + goto out; + }else { +/* Range is already a hole, skip. */ + ret =0 ; + } } }if (need_truncate) {
fs/btrfs/transaction.c +1 -1
@@ -1834,7 +1834,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, } key.offset = (u64)-1 ; - pending->snap =btrfs_get_new_fs_root (fs_info, objectid, pending->anon_dev); + pending->snap =btrfs_get_new_fs_root (fs_info, objectid, &pending->anon_dev);if (IS_ERR (pending->snap)) { ret =PTR_ERR (pending->snap); pending->snap =NULL ;
fs/ceph/mdsmap.c +4 -3
@@ -380,10 +380,11 @@ struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p,ceph_decode_skip_8 (p, end, bad_ext);/* required_client_features */ ceph_decode_skip_set (p, end,64 , bad_ext); +/* bal_rank_mask */ +ceph_decode_skip_string (p, end, bad_ext); + } +if (mdsmap_ev >=18 ) {ceph_decode_64_safe (p, end, m->m_max_xattr_size, bad_ext); - }else { -/* This forces the usage of the (sync) SETXATTR Op */ - m->m_max_xattr_size =0 ; } bad_ext: doutc(cl, "m_enabled: %d, m_damaged: %d, m_num_laggy: %d\n",
fs/ceph/mdsmap.h +5 -1
@@ -27,7 +27,11 @@ struct ceph_mdsmap {u32 m_session_timeout;/* seconds */ u32 m_session_autoclose;/* seconds */ u64 m_max_file_size; -u64 m_max_xattr_size;/* maximum size for xattrs blob */
Lines of this file are not shown. View the raw message.
mm/filemap.c +26 -25
51 lines not on this page · raw message
net/bridge/br_netfilter_hooks.c +96 -0
96 lines not on this page · raw message
net/bridge/netfilter/nf_conntrack_bridge.c +30 -0
Lines of this file are not shown. View the raw message.
net/mptcp/protocol.c +51 -1
52 lines not on this page · raw message
sound/soc/codecs/cs35l56.c +174 -21
195 lines not on this page · raw message
tools/testing/selftests/net/mptcp/mptcp_connect.sh +5 -11
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_join.sh +117 -79
196 lines not on this page · raw message
tools/testing/selftests/net/mptcp/mptcp_lib.sh +15 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +1 -7
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/userspace_pm.sh +39 -47
86 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.