Linux 5.4.78
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.78 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.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/networking/j1939.rst | 4 Makefile | 2 arch/arm/include/asm/kprobes.h | 22 arch/arm/probes/kprobes/opt-arm.c | 18 arch/arm64/kvm/sys_regs.c | 18 arch/powerpc/kernel/eeh_cache.c | 5 arch/powerpc/kernel/head_32.S | 12 arch/riscv/kernel/head.S | 5 arch/s390/kernel/smp.c | 3 arch/x86/kernel/cpu/bugs.c | 52 - arch/x86/kvm/x86.c | 4 drivers/block/nbd.c | 10 drivers/char/random.c | 1 drivers/char/tpm/eventlog/efi.c | 5 drivers/char/tpm/tpm_tis.c | 29 drivers/char/virtio_console.c | 8 drivers/gpio/gpio-pcie-idio-24.c | 62 + drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 27 drivers/gpu/drm/amd/amdgpu/soc15.c | 3 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 4 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 1 drivers/gpu/drm/amd/powerplay/inc/smumgr.h | 2 drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c | 29 drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c | 8 drivers/gpu/drm/gma500/psb_irq.c | 34 drivers/gpu/drm/i915/gem/i915_gem_domain.c | 28 drivers/gpu/drm/i915/gt/intel_engine_cs.c | 3 drivers/hv/hv_balloon.c | 2 drivers/i2c/busses/i2c-mt65xx.c | 8 drivers/i2c/busses/i2c-sh_mobile.c | 86 + drivers/iommu/amd_iommu_types.h | 6 drivers/iommu/intel-svm.c | 2 drivers/mfd/sprd-sc27xx-spi.c | 28 drivers/misc/mei/client.h | 4 drivers/mmc/host/renesas_sdhi_core.c | 1 drivers/mmc/host/sdhci-of-esdhc.c | 2 drivers/net/can/dev.c | 14 drivers/net/can/flexcan.c | 5 drivers/net/can/peak_canfd/peak_canfd.c | 11 drivers/net/can/rx-offload.c | 4 drivers/net/can/ti_hecc.c | 8 drivers/net/can/usb/peak_usb/pcan_usb_core.c | 51 - drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 48 - drivers/net/can/xilinx_can.c | 6 drivers/net/ethernet/intel/igc/igc_main.c | 14 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 7 drivers/net/ethernet/microchip/lan743x_main.c | 12 drivers/net/ethernet/microchip/lan743x_main.h | 3 drivers/net/ethernet/realtek/r8169_main.c | 3 drivers/net/vrf.c | 92 + drivers/net/wan/cosa.c | 1 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 2 drivers/nvme/host/core.c | 8 drivers/nvme/host/nvme.h | 1 drivers/nvme/host/rdma.c | 14 drivers/nvme/host/tcp.c | 16 drivers/of/address.c | 4 drivers/opp/core.c | 7 drivers/pci/controller/dwc/pcie-qcom.c | 13 drivers/pinctrl/aspeed/pinctrl-aspeed.c | 7 drivers/pinctrl/intel/pinctrl-intel.c | 8 drivers/pinctrl/pinctrl-amd.c | 6 drivers/scsi/device_handler/scsi_dh_alua.c | 9 drivers/scsi/hpsa.c | 4 drivers/scsi/mpt3sas/mpt3sas_base.c | 7 drivers/spi/spi-bcm2835.c | 3 drivers/thunderbolt/nhi.c | 19 drivers/thunderbolt/xdomain.c | 1 drivers/uio/uio.c | 10 drivers/usb/class/cdc-acm.c | 9 drivers/usb/dwc3/dwc3-pci.c | 4 drivers/usb/dwc3/gadget.c | 32 drivers/usb/gadget/udc/goku_udc.c | 2 drivers/usb/host/xhci-histb.c | 2 drivers/vfio/pci/vfio_pci.c | 2 drivers/vfio/platform/vfio_platform_common.c | 3 fs/afs/yfsclient.c | 1 fs/btrfs/dev-replace.c | 26 fs/btrfs/extent-tree.c | 7 fs/btrfs/ioctl.c | 12 fs/btrfs/ref-verify.c | 1 fs/btrfs/relocation.c | 4 fs/btrfs/volumes.c | 33 fs/cifs/cifs_unicode.c | 8 fs/erofs/inode.c | 21 fs/ext4/inline.c | 1 fs/ext4/super.c | 4 fs/gfs2/rgrp.c | 5 fs/gfs2/super.c | 1 fs/jbd2/checkpoint.c | 2 fs/jbd2/transaction.c | 4 fs/ocfs2/super.c | 1 fs/xfs/libxfs/xfs_alloc.c | 1 fs/xfs/libxfs/xfs_bmap.h | 2 fs/xfs/libxfs/xfs_rmap.c | 2 fs/xfs/libxfs/xfs_rmap_btree.c | 16 fs/xfs/scrub/bmap.c | 2 fs/xfs/scrub/inode.c | 3 fs/xfs/scrub/refcount.c | 8 fs/xfs/xfs_iops.c | 10 fs/xfs/xfs_pnfs.c | 2 include/linux/arm-smccc.h | 2 include/linux/can/skb.h | 20 include/linux/compiler-gcc.h | 2 include/linux/compiler_types.h | 4 include/linux/netfilter/nfnetlink.h | 9 include/linux/netfilter_ipv4.h | 2 include/linux/netfilter_ipv6.h | 10 include/linux/prandom.h | 36 include/linux/time64.h | 4 include/trace/events/btrfs.h | 10 include/trace/events/sunrpc.h | 8 kernel/bpf/Makefile | 6 kernel/bpf/core.c | 2 kernel/bpf/hashtab.c | 30 kernel/dma/swiotlb.c | 6 kernel/events/core.c | 7 kernel/events/internal.h | 2 kernel/exit.c | 5 kernel/futex.c | 5 kernel/irq/Kconfig | 1 kernel/reboot.c | 28 kernel/time/itimer.c | 4 kernel/time/tick-common.c | 2 kernel/time/timer.c | 7 kernel/trace/trace.c | 4 lib/random32.c | 462 ++++++---- mm/slub.c | 2 net/can/j1939/socket.c | 6 net/ipv4/netfilter.c | 8 net/ipv4/netfilter/iptable_mangle.c | 2 net/ipv4/netfilter/nf_reject_ipv4.c | 2 net/ipv4/syncookies.c | 9 net/ipv4/udp_offload.c | 2 net/ipv6/netfilter.c | 6 net/ipv6/netfilter/ip6table_mangle.c | 2 net/ipv6/sit.c | 2 net/ipv6/syncookies.c | 10 net/iucv/af_iucv.c | 3 net/mac80211/tx.c | 37 net/netfilter/ipset/ip_set_core.c | 3 net/netfilter/ipvs/ip_vs_core.c | 4 net/netfilter/nf_nat_proto.c | 4 net/netfilter/nf_synproxy_core.c | 2 net/netfilter/nf_tables_api.c | 15 net/netfilter/nfnetlink.c | 22 net/netfilter/nft_chain_route.c | 4 net/netfilter/utils.c | 4 net/sched/sch_generic.c | 3 net/tipc/topsrv.c | 10 net/wireless/core.c | 57 - net/wireless/core.h | 5 net/wireless/nl80211.c | 3 net/wireless/reg.c | 2 net/x25/af_x25.c | 2 net/xfrm/xfrm_state.c | 8 security/selinux/ibpkey.c | 4 sound/hda/ext/hdac_ext_controller.c | 2 sound/pci/hda/hda_controller.h | 3 sound/pci/hda/hda_intel.c | 63 - sound/soc/codecs/cs42l51.c | 22 sound/soc/codecs/wcd9335.c | 2 sound/soc/intel/boards/kbl_rt5663_max98927.c | 39 sound/soc/qcom/sdm845.c | 2 tools/perf/builtin-trace.c | 15 tools/perf/util/scripting-engines/trace-event-python.c | 7 tools/perf/util/session.c | 1 tools/testing/selftests/bpf/prog_tests/map_init.c | 214 ++++ tools/testing/selftests/bpf/progs/test_map_init.c | 33 tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_user.tc | 4 tools/testing/selftests/pidfd/pidfd_open_test.c | 1 tools/testing/selftests/pidfd/pidfd_poll_test.c | 1 tools/testing/selftests/proc/proc-loadavg-001.c | 1 tools/testing/selftests/proc/proc-self-syscall.c | 1 tools/testing/selftests/proc/proc-uptime-002.c | 1 virt/kvm/arm/mmu.c | 1 virt/kvm/arm/psci.c | 2 177 files changed, 1740 insertions(+), 783 deletions(-)
Al Viro (1):
don't dump the threads that had been already exiting when zapped.
Alexander Lobakin (2):
virtio: virtio_console: fix DMA memory allocation for rproc serial
net: udp: fix UDP header access on Fast/frag0 UDP GRO
Alexander Usyskin (1):
mei: protect mei_cl_mtu from null dereference
Anand Jain (1):
btrfs: dev-replace: fail mount if we don't have replace item with target device
Anand K Mistry (1):
x86/speculation: Allow IBPB to be conditionally enabled on CPUs with always-on STIBP
Andrew Jeffery (1):
ARM: 9019/1: kprobes: Avoid fortify_panic() when copying optprobe template
Andrew Jones (1):
KVM: arm64: Don't hide ID registers from userspace
Andy Shevchenko (1):
pinctrl: intel: Set default bias in case no particular value given
Ansuel Smith (1):
PCI: qcom: Make sure PCIe is reset before init for rev 2.1.0
Ard Biesheuvel (1):
bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE
Arnaldo Carvalho de Melo (1):
perf scripting python: Avoid declaring function pointers with a visibility attribute
Arnaud de Turckheim (3):
gpio: pcie-idio-24: Fix irq mask when masking
gpio: pcie-idio-24: Fix IRQ Enable Register value
gpio: pcie-idio-24: Enable PEX8311 interrupts
Baolin Wang (1):
mfd: sprd: Add wakeup capability for PMIC IRQ
Billy Tsai (1):
pinctrl: aspeed: Fix GPI only function problem.
Bob Peterson (3):
gfs2: Free rd_bits later in gfs2_clear_rgrpd to fix use-after-free
gfs2: Add missing truncate_inode_pages_final for sd_aspace
gfs2: check for live vs. read-only file system in gfs2_fitrim
Boris Protopopov (1):
Convert trailing spaces and periods in path components
Brian Foster (1):
xfs: flush new eof page on truncate to avoid post-eof corruption
Chao Leng (3):
nvme: introduce nvme_sync_io_queues
nvme-rdma: avoid race between time out and tear down
nvme-tcp: avoid race between time out and tear down
Chen Zhou (1):
selinux: Fix error return code in sel_ib_pkey_sid_slow()
Chris Brandt (1):
usb: cdc-acm: Add DISABLE_ECHO for Renesas USB Download mode
Chris Wilson (1):
drm/i915/gem: Flush coherency domains on first set-domain-ioctl
Christoph Hellwig (2):
nbd: fix a block_device refcount leak in nbd_release
xfs: fix a missing unlock on error in xfs_fs_map_blocks
Christophe Leroy (1):
powerpc/603: Always fault when _PAGE_ACCESSED is not set
Chuck Lever (1):
SUNRPC: Fix general protection fault in trace_rpc_xdr_overflow()
Chunyan Zhang (1):
tick/common: Touch watchdog in tick_unfreeze() on all CPUs
Coiby Xu (2):
pinctrl: amd: use higher precision for 512 RtcClk
pinctrl: amd: fix incorrect way to disable debounce filter
Colin Ian King (1):
selftests/ftrace: check for do_sys_openat2 in user-memory test
Dan Carpenter (3):
ALSA: hda: prevent undefined shift in snd_hdac_ext_bus_get_link()
can: peak_usb: add range checking in decode operations
futex: Don't enable IRQs unconditionally in put_pi_state()
Darrick J. Wong (6):
xfs: set xefi_discard when creating a deferred agfl free log intent item
xfs: fix scrub flagging rtinherit even if there is no rt device
xfs: fix flags argument to rmap lookup when converting shared file rmaps
xfs: set the unwritten bit in rmap lookup flags in xchk_bmap_get_rmapextents
xfs: fix rmap key and record comparison functions
xfs: fix brainos in the refcount scrubber's rmap fragment processor
David Howells (1):
afs: Fix warning due to unadvanced marshalling pointer
David Verbeiren (1):
bpf: Zero-fill re-used per-cpu map element
Dinghao Liu (1):
btrfs: ref-verify: fix memory leak in btrfs_ref_tree_mod
Evan Nimmo (1):
of/address: Fix of_node memory leak in of_dma_is_coherent
Evan Quan (3):
drm/amdgpu: perform srbm soft reset always on SDMA resume drm/amd/pm: perform SMC reset on suspend/hibernation drm/amd/pm: do not use ixFEATURE_STATUS for checking smc running
Evgeny Novikov (1):
usb: gadget: goku_udc: fix potential crashes in probe
Fred Gao (1):
vfio/pci: Bypass IGD init in case of -ENODEV
Gao Xiang (1):
erofs: derive atime instead of leaving it empty
George Spelvin (1):
random32: make prandom_u32() output unpredictable
Greg Kroah-Hartman (1):
Linux 5.4.78
Hannes Reinecke (1):
scsi: scsi_dh_alua: Avoid crash during alua_bus_detach()
Heikki Krogerus (1):
usb: dwc3: pci: add support for the Intel Alder Lake-S
Heiner Kallweit (1):
r8169: fix potential skb double free in an error path
Jason A. Donenfeld (1):
netfilter: use actual socket sk rather than skb sk when routing harder
Jerry Snitselaar (1):
tpm_tis: Disable interrupts on ThinkPad T490s
Jing Xiangfeng (1):
thunderbolt: Add the missed ida_simple_remove() in ring_request_msix()
Jiri Olsa (2):
perf tools: Add missing swap for ino_generation perf/core: Fix race in the perf_mmap_close() function
Joakim Zhang (2):
can: flexcan: remove FLEXCAN_QUIRK_DISABLE_MECR quirk for LS1021A
can: flexcan: flexcan_remove(): disable wakeup completely
Johannes Berg (2):
mac80211: fix use of skb payload instead of header
cfg80211: initialize wdev data earlier
Johannes Thumshirn (1):
btrfs: reschedule when cloning lots of extents
Josef Bacik (2):
btrfs: sysfs: init devices outside of the chunk_mutex
btrfs: fix min reserved size calculation in merge_reloc_root
Joseph Qi (1):
ext4: unlock xattr_sem properly in ext4_inline_data_truncate()
Kai-Heng Feng (2):
ALSA: hda: Separate runtime and system suspend
ALSA: hda: Reinstate runtime_allow() for all hda controllers
Kaixu Xia (1):
ext4: correctly report "not supported" for {usr,grp}jquota when !CONFIG_QUOTA
Keita Suzuki (1):
scsi: hpsa: Fix memory leak in hpsa_init_one()
Laurent Dufour (1):
mm/slub: fix panic in slab_alloc_node()
Liu, Yi L (1):
iommu/vt-d: Fix a bug for PDP check in prq_event_thread
Mao Wenan (1):
net: Update window_clamp if SOCK_RCVBUF is set
Maor Gottlieb (1):
net/mlx5: Fix deletion of duplicate rules
Marc Kleine-Budde (1):
can: rx-offload: don't call kfree_skb() from IRQ context
Marc Zyngier (1):
genirq: Let GENERIC_IRQ_IPI select IRQ_DOMAIN_HIERARCHY
Martin Hundebøll (1):
spi: bcm2835: remove use of uninitialized gpio flags variable
Martin Schiller (1):
net/x25: Fix null-ptr-deref in x25_connect
Martin Willi (1):
vrf: Fix fast path output packet handling with async Netfilter rules
Masashi Honma (1):
ath9k_htc: Use appropriate rs_datalen type
Matteo Croce (2):
Revert "kernel/reboot.c: convert simple_strtoul to kstrtoint"
reboot: fix overflow parsing reboot cpu number
Matthew Wilcox (Oracle) (1):
btrfs: fix potential overflow in cluster_pages_for_defrag on 32bit arch
Maxim Levitsky (1):
KVM: x86: don't expose MSR_IA32_UMWAIT_CONTROL unconditionally
Mika Westerberg (1):
thunderbolt: Fix memory leak if ida_simple_get() fails in enumerate_services()
Ming Lei (1):
nbd: don't update block size after device is started
Navid Emamdoost (1):
can: xilinx_can: handle failure cases of pm_runtime_get_sync
Olaf Hering (1):
hv_balloon: disable warning when floor reached
Oleksij Rempel (1):
can: can_create_echo_skb(): fix echo skb generation: always use skb_clone()
Oliver Hartkopp (1):
can: dev: __can_get_echo_skb(): fix real payload length return value for RTR frames
Oliver Herms (1):
IPv6: Set SIT tunnel hard_header_len to zero
Olivier Moysan (1):
ASoC: cs42l51: manage mclk shutdown delay
Pablo Neira Ayuso (1):
netfilter: nf_tables: missing validation from the abort path
Peter Zijlstra (1):
perf: Fix get_recursion_context()
Qian Cai (2):
powerpc/eeh_cache: Fix a possible debugfs deadlock s390/smp: move rcu_cpu_starting() earlier
Qii Wang (1):
i2c: mediatek: move dma reset before i2c reset
Qiujun Huang (1):
tracing: Fix the checking of stackidx in __ftrace_trace_stack
Qu Wenruo (1):
btrfs: tracepoints: output proper root owner for trace_find_free_extent()
Sagi Grimberg (2):
nvme-rdma: avoid repeated request completion
nvme-tcp: avoid repeated request completion
Santosh Shukla (1):
KVM: arm64: Force PTE mapping on fault resulting in a device mapping
Sean Anderson (1):
riscv: Set text_offset correctly for M-Mode
Shin'ichiro Kawasaki (1):
uio: Fix use-after-free in uio_unregister_device()
Sreekanth Reddy (1):
scsi: mpt3sas: Fix timeouts observed while reenabling IRQ
Srinivas Kandagatla (2):
ASoC: codecs: wcd9335: Set digital gain range correctly
ASoC: qcom: sdm845: set driver name correctly
Stanislav Ivanichkin (1):
perf trace: Fix segfault when trying to trace events by cgroup
Stefano Brivio (1):
netfilter: ipset: Update byte and packet counters regardless of whether they match
Stefano Stabellini (1):
swiotlb: fix "x86: Don't panic if can not alloc buffer for swiotlb"
Stephane Grosjean (2):
can: peak_usb: peak_usb_get_ts_time(): fix timestamp wrapping
can: peak_canfd: pucan_handle_can_rx(): fix echo management when loopback is on
Stephen Boyd (1):
KVM: arm64: ARM_SMCCC_ARCH_WORKAROUND_1 doesn't return SMCCC_RET_NOT_REQUIRED
Suravee Suthikulpanit (1):
iommu/amd: Increase interrupt remapping table limit to 512 entries
Sven Van Asbroeck (1):
lan743x: fix "BUG: invalid wait context" when setting rx mode
Theodore Ts'o (1):
jbd2: fix up sparse warnings in checkpoint code
Thinh Nguyen (2):
usb: dwc3: gadget: Continue to process pending requests
usb: dwc3: gadget: Reclaim extra TRBs after request completion
Thomas Zimmermann (1):
drm/gma500: Fix out-of-bounds access to struct drm_device.vblank[]
Tomasz Figa (1):
ASoC: Intel: kbl_rt5663_max98927: Fix kabylake_ssp_fixup function
Tommi Rantala (2):
selftests: pidfd: fix compilation errors due to wait.h
selftests: proc: fix warning: _GNU_SOURCE redefined
Tyler Hicks (1):
tpm: efi: Don't create binary_bios_measurements file for an empty log
Ulrich Hecht (1):
i2c: sh_mobile: implement atomic transfers
Ursula Braun (1):
net/af_iucv: fix null pointer dereference on shutdown
Veerabadhran Gopalakrishnan (1):
amd/amdgpu: Disable VCN DPG mode for Picasso
Venkata Sandeep Dhanalakota (1):
drm/i915: Correctly set SFC capability for video engines
Vincent Mailhol (1):
can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context
Vinicius Costa Gomes (1):
igc: Fix returning wrong statistics
Viresh Kumar (1):
opp: Reduce the size of critical section in _opp_table_kref_release()
Wang Hai (2):
cosa: Add missing kfree in error path of cosa_write
tipc: fix memory leak in tipc_topsrv_start()
Wengang Wang (1):
ocfs2: initialize ip_next_orphan
Yangbo Lu (1):
mmc: sdhci-of-esdhc: Handle pulse width detection erratum for more SoCs
Ye Bin (1):
cfg80211: regulatory: Fix inconsistent format argument
Yegor Yefremov (1):
can: j1939: swap addr and pgn in the send example
Yoshihiro Shimoda (1):
mmc: renesas_sdhi_core: Add missing tmio_mmc_host_free() at remove
Yunsheng Lin (1):
net: sch_generic: fix the missing new qdisc assignment bug
Zeng Tao (1):
time: Prevent undefined behaviour in timespec64_to_ns()
Zhang Changzhong (2):
can: j1939: j1939_sk_bind(): return failure if netdev is down
can: ti_hecc: ti_hecc_probe(): add missed clk_disable_unprepare() in error path
Zhang Qilong (2):
vfio: platform: fix reference leak in vfio_platform_open
xhci: hisilicon: fix refercence leak in xhci_histb_probe
zhuoliang zhang (1):
net: xfrm: fix a race condition during allocing spi
Greg Kroah-Hartman
maintainerDocumentation/networking/j1939.rst +2 -2
@@ -414,8 +414,8 @@ Send: .can_family = AF_CAN, .can_addr.j1939 = { .name = J1939_NO_NAME; - .pgn = 0x30, - .addr = 0x12300, + .addr = 0x30, + .pgn = 0x12300, }, };
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 77 +SUBLEVEL = 78 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/include/asm/kprobes.h +11 -11
@@ -44,20 +44,20 @@ int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *data);/* optinsn template addresses */ -extern __visible kprobe_opcode_t optprobe_template_entry; -extern __visible kprobe_opcode_t optprobe_template_val; -extern __visible kprobe_opcode_t optprobe_template_call; -extern __visible kprobe_opcode_t optprobe_template_end; -extern __visible kprobe_opcode_t optprobe_template_sub_sp; -extern __visible kprobe_opcode_t optprobe_template_add_sp; -extern __visible kprobe_opcode_t optprobe_template_restore_begin; -extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn; -extern __visible kprobe_opcode_t optprobe_template_restore_end; +extern __visible kprobe_opcode_t optprobe_template_entry[]; +extern __visible kprobe_opcode_t optprobe_template_val[]; +extern __visible kprobe_opcode_t optprobe_template_call[]; +extern __visible kprobe_opcode_t optprobe_template_end[]; +extern __visible kprobe_opcode_t optprobe_template_sub_sp[]; +extern __visible kprobe_opcode_t optprobe_template_add_sp[]; +extern __visible kprobe_opcode_t optprobe_template_restore_begin[]; +extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn[]; +extern __visible kprobe_opcode_t optprobe_template_restore_end[];#define MAX_OPTIMIZED_LENGTH 4#define MAX_OPTINSN_SIZE \ - ((unsigned long)&optprobe_template_end - \ - (unsigned long)&optprobe_template_entry) + ((unsigned long)optprobe_template_end - \ + (unsigned long)optprobe_template_entry)#define RELATIVEJUMP_SIZE 4struct arch_optimized_insn {
arch/arm/probes/kprobes/opt-arm.c +9 -9
@@ -85,21 +85,21 @@ asm ( "optprobe_template_end:\n");#define TMPL_VAL_IDX \ - ((unsigned long *)&optprobe_template_val - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_val - (unsigned long *)optprobe_template_entry)#define TMPL_CALL_IDX \ - ((unsigned long *)&optprobe_template_call - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_call - (unsigned long *)optprobe_template_entry)#define TMPL_END_IDX \ - ((unsigned long *)&optprobe_template_end - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_end - (unsigned long *)optprobe_template_entry)#define TMPL_ADD_SP \ - ((unsigned long *)&optprobe_template_add_sp - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_add_sp - (unsigned long *)optprobe_template_entry)#define TMPL_SUB_SP \ - ((unsigned long *)&optprobe_template_sub_sp - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_sub_sp - (unsigned long *)optprobe_template_entry)#define TMPL_RESTORE_BEGIN \ - ((unsigned long *)&optprobe_template_restore_begin - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_restore_begin - (unsigned long *)optprobe_template_entry)#define TMPL_RESTORE_ORIGN_INSN \ - ((unsigned long *)&optprobe_template_restore_orig_insn - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_restore_orig_insn - (unsigned long *)optprobe_template_entry)#define TMPL_RESTORE_END \ - ((unsigned long *)&optprobe_template_restore_end - (unsigned long *)&optprobe_template_entry) + ((unsigned long *)optprobe_template_restore_end - (unsigned long *)optprobe_template_entry)/* * ARM can always optimize an instruction when using ARM ISA, except
@@ -234,7 +234,7 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *or }/* Copy arch-dep-instance from template. */ -memcpy (code, (unsigned long *)&optprobe_template_entry, +memcpy (code, (unsigned long *)optprobe_template_entry,TMPL_END_IDX *sizeof (kprobe_opcode_t));/* Adjust buffer according to instruction. */
arch/arm64/kvm/sys_regs.c +1 -17
@@ -1132,16 +1132,6 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,return REG_HIDDEN_USER |REG_HIDDEN_GUEST ; } -/* Visibility overrides for SVE-specific ID registers */ -static unsigned int sve_id_visibility (const struct kvm_vcpu *vcpu, -const struct sys_reg_desc *rd) -{ -if (vcpu_has_sve (vcpu)) -return 0 ; - -return REG_HIDDEN_USER ; -} -/* Generate the emulated ID_AA64ZFR0_EL1 value exposed to the guest */ static u64 guest_id_aa64zfr0_el1 (const struct kvm_vcpu *vcpu) {
@@ -1168,9 +1158,6 @@ static int get_id_aa64zfr0_el1(struct kvm_vcpu *vcpu, {u64 val; -if (WARN_ON (!vcpu_has_sve (vcpu))) -return -ENOENT ; - val =guest_id_aa64zfr0_el1 (vcpu);return reg_to_user (uaddr, &val, reg->id); }
@@ -1183,9 +1170,6 @@ static int set_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,int err;u64 val; -if (WARN_ON (!vcpu_has_sve (vcpu))) -return -ENOENT ; - err =reg_from_user (&val, uaddr, id);if (err)return err;
@@ -1448,7 +1432,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {ID_SANITISED (ID_AA64PFR1_EL1 ),ID_UNALLOCATED (4 ,2 ),ID_UNALLOCATED (4 ,3 ), - { SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, .visibility = sve_id_visibility }, + { SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, },ID_UNALLOCATED (4 ,5 ),ID_UNALLOCATED (4 ,6 ), ID_UNALLOCATED(4,7),
arch/powerpc/kernel/eeh_cache.c +3 -2
@@ -272,8 +272,9 @@ static int eeh_addr_cache_show(struct seq_file *s, void *v) {struct pci_io_addr_range *piar;struct rb_node *n; +unsigned long flags; -spin_lock (&pci_io_addr_cache_root.piar_lock); +spin_lock_irqsave (&pci_io_addr_cache_root.piar_lock, flags);for (n =rb_first (&pci_io_addr_cache_root.rb_root); n; n =rb_next (n)) { piar = rb_entry(n, struct pci_io_addr_range, rb_node);
@@ -281,7 +282,7 @@ static int eeh_addr_cache_show(struct seq_file *s, void *v) (piar->flags &IORESOURCE_IO ) ?"i/o" :"mem" , &piar->addr_lo, &piar->addr_hi, pci_name(piar->pcidev)); } -spin_unlock (&pci_io_addr_cache_root.piar_lock); +spin_unlock_irqrestore (&pci_io_addr_cache_root.piar_lock, flags);return 0 ; }
arch/powerpc/kernel/head_32.S +0 -12
@@ -418,11 +418,7 @@ InstructionTLBMiss: cmplw 0,r1,r3 #endif mfspr r2, SPRN_SPRG_PGDIR -#ifdef CONFIG_SWAP li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC -#else - li r1,_PAGE_PRESENT | _PAGE_EXEC -#endif #if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC) bge- 112f lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
@@ -484,11 +480,7 @@ DataLoadTLBMiss: lis r1,PAGE_OFFSET@h /* check if kernel address */ cmplw 0,r1,r3 mfspr r2, SPRN_SPRG_PGDIR -#ifdef CONFIG_SWAP li r1, _PAGE_PRESENT | _PAGE_ACCESSED -#else - li r1, _PAGE_PRESENT -#endif bge- 112f lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
@@ -564,11 +556,7 @@ DataStoreTLBMiss: lis r1,PAGE_OFFSET@h /* check if kernel address */ cmplw 0,r1,r3 mfspr r2, SPRN_SPRG_PGDIR -#ifdef CONFIG_SWAP li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED -#else - li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT -#endif bge- 112f lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
arch/riscv/kernel/head.S +5 -0
@@ -26,12 +26,17 @@ ENTRY(_start) /* reserved */ .word 0 .balign 8 +#ifdef CONFIG_RISCV_M_MODE + /* Image load offset (0MB) from start of RAM for M-mode */ + .dword 0 +#else #if __riscv_xlen == 64 /* Image load offset(2MB) from start of RAM */ .dword 0x200000 #else /* Image load offset(4MB) from start of RAM */ .dword 0x400000 +#endif #endif /* Effective size of kernel image */ .dword _end - _start
arch/s390/kernel/smp.c +2 -1
@@ -845,13 +845,14 @@ void __init smp_detect_cpus(void)static void smp_init_secondary (void ) { -int cpu =smp_processor_id (); +int cpu =raw_smp_processor_id (); S390_lowcore.last_update_clock =get_tod_clock ();restore_access_regs (S390_lowcore.access_regs_save_area);set_cpu_flag (CIF_ASCE_PRIMARY );set_cpu_flag (CIF_ASCE_SECONDARY );cpu_init (); +rcu_cpu_starting (cpu);preempt_disable ();init_cpu_timer ();vtime_init ();
arch/x86/kernel/cpu/bugs.c +33 -19
86 lines not on this page · raw message
arch/x86/kvm/x86.c +4 -0
@@ -5235,6 +5235,10 @@ static void kvm_init_msr_list(void)if (!kvm_x86_ops->rdtscp_supported ())continue ;break ; +case MSR_IA32_UMWAIT_CONTROL : +if (!boot_cpu_has (X86_FEATURE_WAITPKG )) +continue ; +break ;case MSR_IA32_RTIT_CTL :case MSR_IA32_RTIT_STATUS :if (!kvm_x86_ops->pt_supported ())
drivers/block/nbd.c +6 -4
@@ -296,7 +296,7 @@ static void nbd_size_clear(struct nbd_device *nbd) } } -static void nbd_size_update (struct nbd_device *nbd) +static void nbd_size_update (struct nbd_device *nbd,bool start) {struct nbd_config *config = nbd->config;struct block_device *bdev =bdget_disk (nbd->disk,0 );
@@ -312,7 +312,8 @@ static void nbd_size_update(struct nbd_device *nbd)if (bdev) {if (bdev->bd_disk) {bd_set_size (bdev, config->bytesize); -set_blocksize (bdev, config->blksize); +if (start) +set_blocksize (bdev, config->blksize); }else bdev->bd_invalidated =1 ;bdput (bdev);
@@ -327,7 +328,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize, config->blksize = blocksize; config->bytesize = blocksize * nr_blocks;if (nbd->task_recv !=NULL ) -nbd_size_update (nbd); +nbd_size_update (nbd, false); }static void nbd_complete_rq (struct request *req)
@@ -1293,7 +1294,7 @@ static int nbd_start_device(struct nbd_device *nbd) args->index = i;queue_work (nbd->recv_workq, &args->work); } -nbd_size_update (nbd); +nbd_size_update (nbd, true);return error; }
@@ -1502,6 +1503,7 @@ static void nbd_release(struct gendisk *disk, fmode_t mode)if (test_bit (NBD_RT_DISCONNECT_ON_CLOSE , &nbd->config->runtime_flags) && bdev->bd_openers ==0 )nbd_disconnect_and_put (nbd); +bdput (bdev);nbd_config_put (nbd);nbd_put (nbd);
drivers/char/random.c +0 -1
@@ -1330,7 +1330,6 @@ void add_interrupt_randomness(int irq, int irq_flags)fast_mix (fast_pool);add_interrupt_bench (cycles); -this_cpu_add (net_rand_state.s1, fast_pool->pool[cycles &3 ]);if (unlikely (crng_init ==0 )) { if ((fast_pool->count >= 64) &&
drivers/char/tpm/eventlog/efi.c +5 -0
@@ -41,6 +41,11 @@ int tpm_read_log_efi(struct tpm_chip *chip) log_size = log_tbl->size;memunmap (log_tbl); +if (!log_size) { +pr_warn ("UEFI TPM log area empty\n" ); +return -EIO ; + } + log_tbl =memremap (efi.tpm_log,sizeof (*log_tbl) + log_size,MEMREMAP_WB );if (!log_tbl) {
drivers/char/tpm/tpm_tis.c +27 -2
@@ -27,6 +27,7 @@#include <linux/of.h> #include <linux/of_device.h> #include <linux/kernel.h> +#include <linux/dmi.h> #include "tpm.h" #include "tpm_tis_core.h"
@@ -49,8 +50,8 @@ static inline struct tpm_tis_tcg_phy *to_tpm_tis_tcg_phy(struct tpm_tis_data *da return container_of(data, struct tpm_tis_tcg_phy, priv); } -static bool interrupts = true; -module_param (interrupts, bool,0444 ); +static int interrupts =-1 ; +module_param (interrupts, int,0444 );MODULE_PARM_DESC (interrupts,"Enable interrupts" );static bool itpm;
@@ -63,6 +64,28 @@ module_param(force, bool, 0444);MODULE_PARM_DESC (force,"Force device probe rather than using ACPI entry" );#endif +static int tpm_tis_disable_irq (const struct dmi_system_id *d) +{ +if (interrupts ==-1 ) { +pr_notice ("tpm_tis: %s detected: disabling interrupts.\n" , d->ident); + interrupts =0 ; + } + +return 0 ; +} + +static const struct dmi_system_id tpm_tis_dmi_table[] = { + { + .callback = tpm_tis_disable_irq, + .ident ="ThinkPad T490s" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"ThinkPad T490s" ), + }, + }, + {} +}; +#if defined(CONFIG_PNP ) && defined(CONFIG_ACPI )static int has_hid (struct acpi_device *dev,const char *hid) {
@@ -192,6 +215,8 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info)int irq =-1 ;int rc; +dmi_check_system (tpm_tis_dmi_table); + rc =check_acpi_tpm2 (dev);if (rc)return rc;
drivers/char/virtio_console.c +4 -4
@@ -435,12 +435,12 @@ static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size/* * Allocate DMA memory from ancestor. When a virtio * device is created by remoteproc, the DMA memory is -* associated with the grandparent device: -* vdev => rproc => platform-dev. +* associated with the parent device: +* virtioY => remoteprocX#vdevYbuffer. */ -if (!vdev->dev.parent || !vdev->dev.parent->parent) + buf->dev = vdev->dev.parent; +if (!buf->dev) goto free_buf; - buf->dev = vdev->dev.parent->parent;/* Increase device refcnt to avoid freeing it */ get_device (buf->dev);
drivers/gpio/gpio-pcie-idio-24.c +56 -6
117 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/cik_sdma.c +12 -15
@@ -1071,22 +1071,19 @@ static int cik_sdma_soft_reset(void *handle) {u32 srbm_soft_reset =0 ;struct amdgpu_device *adev = (struct amdgpu_device *)handle; -u32 tmp =RREG32 (mmSRBM_STATUS2); +u32 tmp; -if (tmp &SRBM_STATUS2__SDMA_BUSY_MASK ) { -/* sdma0 */ - tmp =RREG32 (mmSDMA0_F32_CNTL +SDMA0_REGISTER_OFFSET ); - tmp |=SDMA0_F32_CNTL__HALT_MASK ; -WREG32 (mmSDMA0_F32_CNTL +SDMA0_REGISTER_OFFSET , tmp); - srbm_soft_reset |=SRBM_SOFT_RESET__SOFT_RESET_SDMA_MASK ; - } -if (tmp &SRBM_STATUS2__SDMA1_BUSY_MASK ) { -/* sdma1 */ - tmp =RREG32 (mmSDMA0_F32_CNTL +SDMA1_REGISTER_OFFSET ); - tmp |=SDMA0_F32_CNTL__HALT_MASK ; -WREG32 (mmSDMA0_F32_CNTL +SDMA1_REGISTER_OFFSET , tmp); - srbm_soft_reset |=SRBM_SOFT_RESET__SOFT_RESET_SDMA1_MASK ; - } +/* sdma0 */ + tmp =RREG32 (mmSDMA0_F32_CNTL +SDMA0_REGISTER_OFFSET ); + tmp |=SDMA0_F32_CNTL__HALT_MASK ; +WREG32 (mmSDMA0_F32_CNTL +SDMA0_REGISTER_OFFSET , tmp); + srbm_soft_reset |=SRBM_SOFT_RESET__SOFT_RESET_SDMA_MASK ; + +/* sdma1 */ + tmp =RREG32 (mmSDMA0_F32_CNTL +SDMA1_REGISTER_OFFSET ); + tmp |=SDMA0_F32_CNTL__HALT_MASK ; +WREG32 (mmSDMA0_F32_CNTL +SDMA1_REGISTER_OFFSET , tmp); + srbm_soft_reset |=SRBM_SOFT_RESET__SOFT_RESET_SDMA1_MASK ;if (srbm_soft_reset) { tmp =RREG32 (mmSRBM_SOFT_RESET);
drivers/gpu/drm/amd/amdgpu/soc15.c +1 -2
@@ -1144,8 +1144,7 @@ static int soc15_common_early_init(void *handle) adev->pg_flags =AMD_PG_SUPPORT_SDMA |AMD_PG_SUPPORT_MMHUB | -AMD_PG_SUPPORT_VCN | -AMD_PG_SUPPORT_VCN_DPG ; +AMD_PG_SUPPORT_VCN ; }else { adev->cg_flags =AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS |
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +4 -0
@@ -1533,6 +1533,10 @@ int smu7_disable_dpm_tasks(struct pp_hwmgr *hwmgr)PP_ASSERT_WITH_CODE ((tmp_result ==0 ),"Failed to reset to default!" , result = tmp_result); + tmp_result =smum_stop_smc (hwmgr); +PP_ASSERT_WITH_CODE ((tmp_result ==0 ), +"Failed to stop smc!" , result = tmp_result); + tmp_result =smu7_force_switch_to_arbf0 (hwmgr);PP_ASSERT_WITH_CODE ((tmp_result ==0 ),"Failed to force to switch arbf0!" , result = tmp_result);
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +1 -0
@@ -229,6 +229,7 @@ struct pp_smumgr_func {bool (*is_hw_avfs_present)(struct pp_hwmgr *hwmgr);int (*update_dpm_settings)(struct pp_hwmgr *hwmgr,void *profile_setting);int (*smc_table_manager)(struct pp_hwmgr *hwmgr,uint8_t *table,uint16_t table_id,bool rw);/*rw: true for read, false for write */ +int (*stop_smc)(struct pp_hwmgr *hwmgr); };struct pp_hwmgr_func {
drivers/gpu/drm/amd/powerplay/inc/smumgr.h +2 -0
@@ -114,4 +114,6 @@ extern int smum_update_dpm_settings(struct pp_hwmgr *hwmgr, void *profile_settinextern int smum_smc_table_manager (struct pp_hwmgr *hwmgr,uint8_t *table,uint16_t table_id,bool rw); +extern int smum_stop_smc (struct pp_hwmgr *hwmgr); +#endif
drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c +25 -4
@@ -2725,10 +2725,7 @@ static int ci_initialize_mc_reg_table(struct pp_hwmgr *hwmgr)static bool ci_is_dpm_running (struct pp_hwmgr *hwmgr) { -return (1 ==PHM_READ_INDIRECT_FIELD (hwmgr->device, -CGS_IND_REG__SMC ,FEATURE_STATUS , -VOLTAGE_CONTROLLER_ON )) - ? true : false; +return ci_is_smc_ram_running (hwmgr); }static int ci_smu_init (struct pp_hwmgr *hwmgr)
@@ -2936,6 +2933,29 @@ static int ci_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type)return 0 ; } +static void ci_reset_smc (struct pp_hwmgr *hwmgr) +{ +PHM_WRITE_INDIRECT_FIELD (hwmgr->device,CGS_IND_REG__SMC , +SMC_SYSCON_RESET_CNTL , + rst_reg,1 ); +} + + +static void ci_stop_smc_clock (struct pp_hwmgr *hwmgr) +{ +PHM_WRITE_INDIRECT_FIELD (hwmgr->device,CGS_IND_REG__SMC , +SMC_SYSCON_CLOCK_CNTL_0 , + ck_disable,1 ); +} + +static int ci_stop_smc (struct pp_hwmgr *hwmgr) +{ +ci_reset_smc (hwmgr); +ci_stop_smc_clock (hwmgr); + +return 0 ; +} +const struct pp_smumgr_func ci_smu_funcs = { .name ="ci_smu" , .smu_init = ci_smu_init,
@@ -2960,4 +2980,5 @@ const struct pp_smumgr_func ci_smu_funcs = { .is_dpm_running = ci_is_dpm_running, .update_dpm_settings = ci_update_dpm_settings, .update_smc_table = ci_update_smc_table, + .stop_smc = ci_stop_smc, };
drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c +8 -0
@@ -217,3 +217,11 @@ int smum_smc_table_manager(struct pp_hwmgr *hwmgr, uint8_t *table, uint16_t tablreturn -EINVAL ; } + +int smum_stop_smc (struct pp_hwmgr *hwmgr) +{ +if (hwmgr->smumgr_funcs->stop_smc) +return hwmgr->smumgr_funcs->stop_smc (hwmgr); + +return 0 ; +}
drivers/gpu/drm/gma500/psb_irq.c +12 -22
@@ -337,6 +337,7 @@ int psb_irq_postinstall(struct drm_device *dev) {struct drm_psb_private *dev_priv = dev->dev_private;unsigned long irqflags; +unsigned int i;spin_lock_irqsave (&dev_priv->irqmask_lock, irqflags);
@@ -349,20 +350,12 @@ int psb_irq_postinstall(struct drm_device *dev)PSB_WVDC32 (dev_priv->vdc_irq_mask,PSB_INT_ENABLE_R );PSB_WVDC32 (0xFFFFFFFF ,PSB_HWSTAM ); -if (dev->vblank[0 ].enabled) -psb_enable_pipestat (dev_priv,0 ,PIPE_VBLANK_INTERRUPT_ENABLE ); -else -psb_disable_pipestat (dev_priv,0 ,PIPE_VBLANK_INTERRUPT_ENABLE ); - -if (dev->vblank[1 ].enabled) -psb_enable_pipestat (dev_priv,1 ,PIPE_VBLANK_INTERRUPT_ENABLE ); -else -psb_disable_pipestat (dev_priv,1 ,PIPE_VBLANK_INTERRUPT_ENABLE ); - -if (dev->vblank[2 ].enabled) -psb_enable_pipestat (dev_priv,2 ,PIPE_VBLANK_INTERRUPT_ENABLE ); -else -psb_disable_pipestat (dev_priv,2 ,PIPE_VBLANK_INTERRUPT_ENABLE ); +for (i =0 ; i < dev->num_crtcs; ++i) { +if (dev->vblank[i].enabled) +psb_enable_pipestat (dev_priv, i,PIPE_VBLANK_INTERRUPT_ENABLE ); +else +psb_disable_pipestat (dev_priv, i,PIPE_VBLANK_INTERRUPT_ENABLE ); + }if (dev_priv->ops->hotplug_enable) dev_priv->ops->hotplug_enable (dev, true);
@@ -375,6 +368,7 @@ void psb_irq_uninstall(struct drm_device *dev) {struct drm_psb_private *dev_priv = dev->dev_private;unsigned long irqflags; +unsigned int i;spin_lock_irqsave (&dev_priv->irqmask_lock, irqflags);
@@ -383,14 +377,10 @@ void psb_irq_uninstall(struct drm_device *dev)PSB_WVDC32 (0xFFFFFFFF ,PSB_HWSTAM ); -if (dev->vblank[0 ].enabled) -psb_disable_pipestat (dev_priv,0 ,PIPE_VBLANK_INTERRUPT_ENABLE ); - -if (dev->vblank[1 ].enabled) -psb_disable_pipestat (dev_priv,1 ,PIPE_VBLANK_INTERRUPT_ENABLE ); - -if (dev->vblank[2 ].enabled) -psb_disable_pipestat (dev_priv,2 ,PIPE_VBLANK_INTERRUPT_ENABLE ); +for (i =0 ; i < dev->num_crtcs; ++i) { +if (dev->vblank[i].enabled) +psb_disable_pipestat (dev_priv, i,PIPE_VBLANK_INTERRUPT_ENABLE ); + } dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG | _PSB_IRQ_MSVDX_FLAG |
drivers/gpu/drm/i915/gem/i915_gem_domain.c +13 -15
@@ -605,21 +605,6 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,if (!obj)return -ENOENT ; -/* -* Already in the desired write domain? Nothing for us to do! -* -* We apply a little bit of cunning here to catch a broader set of -* no-ops. If obj->write_domain is set, we must be in the same -* obj->read_domains, and only that domain. Therefore, if that -* obj->write_domain matches the request read_domains, we are -* already in the same read/write domain and can skip the operation, -* without having to further check the requested write_domain. -*/ -if (READ_ONCE (obj->write_domain) == read_domains) { - err =0 ; - goto out; - } -/* * Try to flush the object off the GPU without holding the lock. * We will repeat the flush holding the lock in the normal manner
@@ -657,6 +642,19 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,if (err) goto out; +/* +* Already in the desired write domain? Nothing for us to do! +* +* We apply a little bit of cunning here to catch a broader set of +* no-ops. If obj->write_domain is set, we must be in the same +* obj->read_domains, and only that domain. Therefore, if that +* obj->write_domain matches the request read_domains, we are +* already in the same read/write domain and can skip the operation, +* without having to further check the requested write_domain. +*/ +if (READ_ONCE (obj->write_domain) == read_domains) + goto out_unpin; + err =i915_gem_object_lock_interruptible (obj);if (err) goto out_unpin;
drivers/gpu/drm/i915/gt/intel_engine_cs.c +2 -1
@@ -354,7 +354,8 @@ static void __setup_engine_capabilities(struct intel_engine_cs *engine)* instances. */ if ((INTEL_GEN (i915) >=11 && -RUNTIME_INFO (i915)->vdbox_sfc_access & engine->mask) || + (RUNTIME_INFO (i915)->vdbox_sfc_access & +BIT (engine->instance))) || (INTEL_GEN (i915) >=9 && engine->instance ==0 )) engine->uabi_capabilities |=I915_VIDEO_AND_ENHANCE_CLASS_CAPABILITY_SFC ;
drivers/hv/hv_balloon.c +1 -1
@@ -1277,7 +1277,7 @@ static void balloon_up(struct work_struct *dummy)/* Refuse to balloon below the floor. */ if (avail_pages < num_pages || avail_pages - num_pages < floor) { -pr_warn ("Balloon request will be partially fulfilled. %s\n" , +pr_info ("Balloon request will be partially fulfilled. %s\n" , avail_pages < num_pages ?"Not enough memory." :"Balloon floor reached." );
drivers/i2c/busses/i2c-mt65xx.c +4 -4
@@ -389,6 +389,10 @@ static void mtk_i2c_init_hw(struct mtk_i2c *i2c) {u16 control_reg; +writel (I2C_DMA_HARD_RST , i2c->pdmabase +OFFSET_RST ); +udelay (50 ); +writel (I2C_DMA_CLR_FLAG , i2c->pdmabase +OFFSET_RST ); +mtk_i2c_writew (i2c,I2C_SOFT_RST ,OFFSET_SOFTRESET );/* Set ioconfig */
@@ -419,10 +423,6 @@ static void mtk_i2c_init_hw(struct mtk_i2c *i2c)mtk_i2c_writew (i2c, control_reg,OFFSET_CONTROL );mtk_i2c_writew (i2c,I2C_DELAY_LEN ,OFFSET_DELAY_LEN ); - -writel (I2C_DMA_HARD_RST , i2c->pdmabase +OFFSET_RST ); -udelay (50 ); -writel (I2C_DMA_CLR_FLAG , i2c->pdmabase +OFFSET_RST ); }/*
drivers/i2c/busses/i2c-sh_mobile.c +66 -20
142 lines not on this page · raw message
drivers/iommu/amd_iommu_types.h +5 -1
@@ -406,7 +406,11 @@ extern bool amd_iommu_np_cache;/* Only true if all IOMMUs support device IOTLBs */ extern bool amd_iommu_iotlb_sup; -#define MAX_IRQS_PER_TABLE 256 +/* +* AMD IOMMU hardware only support 512 IRTEs despite +* the architectural limitation of 2048 entries. +*/ +#define MAX_IRQS_PER_TABLE 512#define IRQ_TABLE_ALIGNMENT 128struct irq_remap_table {
drivers/iommu/intel-svm.c +1 -1
@@ -646,7 +646,7 @@ static irqreturn_t prq_event_thread(int irq, void *d) resp.qw0 =QI_PGRP_PASID (req->pasid) |QI_PGRP_DID (req->rid) |QI_PGRP_PASID_P (req->pasid_present) | -QI_PGRP_PDP (req->pasid_present) | +QI_PGRP_PDP (req->priv_data_present) |QI_PGRP_RESP_CODE (result) |QI_PGRP_RESP_TYPE ; resp.qw1 = QI_PGRP_IDX(req->prg_index) |
drivers/mfd/sprd-sc27xx-spi.c +27 -1
@@ -204,7 +204,7 @@ static int sprd_pmic_probe(struct spi_device *spi) } ret =devm_regmap_add_irq_chip (&spi->dev, ddata->regmap, ddata->irq, -IRQF_ONESHOT |IRQF_NO_SUSPEND ,0 , +IRQF_ONESHOT ,0 , &ddata->irq_chip, &ddata->irq_data);if (ret) {dev_err (&spi->dev,"Failed to add PMIC irq chip %d\n" , ret);
@@ -220,9 +220,34 @@ static int sprd_pmic_probe(struct spi_device *spi)return ret; } +device_init_wakeup (&spi->dev, true);return 0 ; } +#ifdef CONFIG_PM_SLEEP +static int sprd_pmic_suspend (struct device *dev) +{ +struct sprd_pmic *ddata =dev_get_drvdata (dev); + +if (device_may_wakeup (dev)) +enable_irq_wake (ddata->irq); + +return 0 ; +} + +static int sprd_pmic_resume (struct device *dev) +{ +struct sprd_pmic *ddata =dev_get_drvdata (dev); + +if (device_may_wakeup (dev)) +disable_irq_wake (ddata->irq); + +return 0 ; +} +#endif + +static SIMPLE_DEV_PM_OPS(sprd_pmic_pm_ops, sprd_pmic_suspend, sprd_pmic_resume); +static const struct of_device_id sprd_pmic_match[] = { { .compatible ="sprd,sc2731" , .data = &sc2731_data }, {},
@@ -234,6 +259,7 @@ static struct spi_driver sprd_pmic_driver = { .name = "sc27xx-pmic", .bus = &spi_bus_type, .of_match_table = sprd_pmic_match, + .pm = &sprd_pmic_pm_ops, }, .probe = sprd_pmic_probe, };
drivers/misc/mei/client.h +2 -2
@@ -128,11 +128,11 @@ static inline u8 mei_cl_me_id(const struct mei_cl *cl)* * @cl: host client * -* Return: mtu +* Return: mtu or 0 if client is not connected */ static inline size_t mei_cl_mtu (const struct mei_cl *cl) { -return cl->me_cl->props.max_msg_length; +return cl->me_cl ? cl->me_cl->props.max_msg_length :0 ; }/**
drivers/mmc/host/renesas_sdhi_core.c +1 -0
@@ -874,6 +874,7 @@ int renesas_sdhi_remove(struct platform_device *pdev)tmio_mmc_host_remove (host);renesas_sdhi_clk_disable (host); +tmio_mmc_host_free (host);return 0 ; }
drivers/mmc/host/sdhci-of-esdhc.c +2 -0
@@ -1212,6 +1212,8 @@ static struct soc_device_attribute soc_fixup_sdhc_clkdivs[] = {static struct soc_device_attribute soc_unreliable_pulse_detection[] = { { .family ="QorIQ LX2160A" , .revision ="1.0" , }, + { .family ="QorIQ LX2160A" , .revision ="2.0" , }, + { .family ="QorIQ LS1028A" , .revision ="1.0" , }, { }, };
drivers/net/can/dev.c +11 -3
@@ -486,9 +486,13 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)*/ struct sk_buff *skb = priv->echo_skb[idx];struct canfd_frame *cf = (struct canfd_frame *)skb->data; -u8 len = cf->len; - *len_ptr = len; +/* get the real payload length for netdev statistics */ +if (cf->can_id &CAN_RTR_FLAG ) + *len_ptr =0 ; +else + *len_ptr = cf->len; + priv->echo_skb[idx] =NULL ;return skb;
@@ -512,7 +516,11 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)if (!skb)return 0 ; -netif_rx (skb); +skb_get (skb); +if (netif_rx (skb) ==NET_RX_SUCCESS ) +dev_consume_skb_any (skb); +else +dev_kfree_skb_any (skb);return len; }
drivers/net/can/flexcan.c +3 -2
@@ -321,8 +321,7 @@ static const struct flexcan_devtype_data fsl_vf610_devtype_data = {static const struct flexcan_devtype_data fsl_ls1021a_r2_devtype_data = { .quirks =FLEXCAN_QUIRK_DISABLE_RXFG |FLEXCAN_QUIRK_ENABLE_EACEN_RRS | -FLEXCAN_QUIRK_DISABLE_MECR |FLEXCAN_QUIRK_BROKEN_PERR_STATE | -FLEXCAN_QUIRK_USE_OFF_TIMESTAMP , +FLEXCAN_QUIRK_BROKEN_PERR_STATE |FLEXCAN_QUIRK_USE_OFF_TIMESTAMP , };static const struct can_bittiming_const flexcan_bittiming_const = {
@@ -1677,6 +1676,8 @@ static int flexcan_remove(struct platform_device *pdev) {struct net_device *dev =platform_get_drvdata (pdev); +device_set_wakeup_enable (&pdev->dev, false); +device_set_wakeup_capable (&pdev->dev, false);unregister_flexcandev (dev);pm_runtime_disable (&pdev->dev);free_candev (dev);
drivers/net/can/peak_canfd/peak_canfd.c +8 -3
@@ -248,8 +248,7 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv, cf_len =get_can_dlc (pucan_msg_get_dlc (msg));/* if this frame is an echo, */ -if ((rx_msg_flags &PUCAN_MSG_LOOPED_BACK ) && - !(rx_msg_flags &PUCAN_MSG_SELF_RECEIVE )) { +if (rx_msg_flags &PUCAN_MSG_LOOPED_BACK ) {unsigned long flags;spin_lock_irqsave (&priv->echo_lock, flags);
@@ -263,7 +262,13 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,netif_wake_queue (priv->ndev);spin_unlock_irqrestore (&priv->echo_lock, flags); -return 0 ; + +/* if this frame is only an echo, stop here. Otherwise, +* continue to push this application self-received frame into +* its own rx queue. +*/ +if (!(rx_msg_flags &PUCAN_MSG_SELF_RECEIVE )) +return 0 ; }/* otherwise, it should be pushed into rx fifo */
drivers/net/can/rx-offload.c +2 -2
@@ -272,7 +272,7 @@ int can_rx_offload_queue_sorted(struct can_rx_offload *offload,if (skb_queue_len (&offload->skb_queue) > offload->skb_queue_len_max) { -kfree_skb (skb); +dev_kfree_skb_any (skb);return -ENOBUFS ; }
@@ -317,7 +317,7 @@ int can_rx_offload_queue_tail(struct can_rx_offload *offload, {if (skb_queue_len (&offload->skb_queue) > offload->skb_queue_len_max) { -kfree_skb (skb); +dev_kfree_skb_any (skb);return -ENOBUFS ; }
drivers/net/can/ti_hecc.c +5 -3
@@ -936,7 +936,7 @@ static int ti_hecc_probe(struct platform_device *pdev) err =clk_prepare_enable (priv->clk);if (err) {dev_err (&pdev->dev,"clk_prepare_enable() failed\n" ); - goto probe_exit_clk; + goto probe_exit_release_clk; } priv->offload.mailbox_read = ti_hecc_mailbox_read;
@@ -945,7 +945,7 @@ static int ti_hecc_probe(struct platform_device *pdev) err =can_rx_offload_add_timestamp (ndev, &priv->offload);if (err) {dev_err (&pdev->dev,"can_rx_offload_add_timestamp() failed\n" ); - goto probe_exit_clk; + goto probe_exit_disable_clk; } err =register_candev (ndev);
@@ -963,7 +963,9 @@ static int ti_hecc_probe(struct platform_device *pdev) probe_exit_offload:can_rx_offload_del (&priv->offload); -probe_exit_clk: +probe_exit_disable_clk: +clk_disable_unprepare (priv->clk); +probe_exit_release_clk:clk_put (priv->clk); probe_exit_candev:free_candev (ndev);
drivers/net/can/usb/peak_usb/pcan_usb_core.c +46 -5
60 lines not on this page · raw message
drivers/net/can/usb/peak_usb/pcan_usb_fd.c +37 -11
90 lines not on this page · raw message
drivers/net/can/xilinx_can.c +3 -3
@@ -1384,7 +1384,7 @@ static int xcan_open(struct net_device *ndev)if (ret <0 ) {netdev_err (ndev,"%s: pm_runtime_get failed(%d)\n" , __func__, ret); -return ret; + goto err; } ret = request_irq(ndev->irq, xcan_interrupt, priv->irq_flags,
@@ -1468,6 +1468,7 @@ static int xcan_get_berr_counter(const struct net_device *ndev,if (ret <0 ) {netdev_err (ndev,"%s: pm_runtime_get failed(%d)\n" , __func__, ret); +pm_runtime_put (priv->dev);return ret; }
@@ -1783,7 +1784,7 @@ static int xcan_probe(struct platform_device *pdev)if (ret <0 ) {netdev_err (ndev,"%s: pm_runtime_get failed(%d)\n" , __func__, ret); - goto err_pmdisable; + goto err_disableclks; }if (priv->read_reg (priv,XCAN_SR_OFFSET ) !=XCAN_SR_CONFIG_MASK ) {
@@ -1818,7 +1819,6 @@ static int xcan_probe(struct platform_device *pdev) err_disableclks:pm_runtime_put (priv->dev); -err_pmdisable:pm_runtime_disable (&pdev->dev); err_free:free_candev (ndev);
drivers/net/ethernet/intel/igc/igc_main.c +8 -6
@@ -2222,21 +2222,23 @@ static int igc_change_mtu(struct net_device *netdev, int new_mtu) }/** -* igc_get_stats - Get System Network Statistics +* igc_get_stats64 - Get System Network Statistics * @netdev: network interface device structure +* @stats: rtnl_link_stats64 pointer * * Returns the address of the device statistics structure. * The statistics are updated here and also from the timer callback. */ -static struct net_device_stats *igc_get_stats (struct net_device *netdev) +static void igc_get_stats64 (struct net_device *netdev, +struct rtnl_link_stats64 *stats) {struct igc_adapter *adapter =netdev_priv (netdev); +spin_lock (&adapter->stats64_lock);if (!test_bit (__IGC_RESETTING, &adapter->state))igc_update_stats (adapter); - -/* only return the current stats */ -return &netdev->stats; +memcpy (stats, &adapter->stats64,sizeof (*stats)); +spin_unlock (&adapter->stats64_lock); } static netdev_features_t igc_fix_features(struct net_device *netdev,
@@ -3984,7 +3986,7 @@ static const struct net_device_ops igc_netdev_ops = { .ndo_start_xmit = igc_xmit_frame, .ndo_set_mac_address = igc_set_mac, .ndo_change_mtu = igc_change_mtu, - .ndo_get_stats = igc_get_stats, + .ndo_get_stats64 = igc_get_stats64, .ndo_fix_features = igc_fix_features, .ndo_set_features = igc_set_features, .ndo_features_check = igc_features_check,
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +4 -3
@@ -1923,10 +1923,11 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle)down_write_ref_node (&fte->node, false);for (i = handle->num_rules -1 ; i >=0 ; i--)tree_remove_node (&handle->rule[i]->node, true); -if (fte->modify_mask && fte->dests_size) { -modify_fte (fte); +if (fte->dests_size) { +if (fte->modify_mask) +modify_fte (fte);up_write_ref_node (&fte->node, false); - }else { + }else if (list_empty (&fte->node.children)) {del_hw_fte (&fte->node);/* Avoid double call to del_hw_fte */ fte->node.del_hw_func =NULL ;
drivers/net/ethernet/microchip/lan743x_main.c +3 -9
@@ -672,14 +672,12 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)static int lan743x_dp_write (struct lan743x_adapter *adapter,u32 select,u32 addr,u32 length,u32 *buf) { -int ret = -EIO ;u32 dp_sel;int i; -mutex_lock (&adapter->dp_lock);if (lan743x_csr_wait_for_bit (adapter,DP_SEL ,DP_SEL_DPRDY_ ,1 ,40 ,100 ,100 )) - goto unlock; +return -EIO ; dp_sel =lan743x_csr_read (adapter,DP_SEL ); dp_sel &= ~DP_SEL_MASK_ ; dp_sel |= select;
@@ -691,13 +689,10 @@ static int lan743x_dp_write(struct lan743x_adapter *adapter,lan743x_csr_write (adapter,DP_CMD ,DP_CMD_WRITE_ );if (lan743x_csr_wait_for_bit (adapter,DP_SEL ,DP_SEL_DPRDY_ ,1 ,40 ,100 ,100 )) - goto unlock; +return -EIO ; } - ret =0 ; -unlock: -mutex_unlock (&adapter->dp_lock); -return ret; +return 0 ; }static u32 lan743x_mac_mii_access (u16 id,u16 index,int read)
@@ -2674,7 +2669,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, adapter->intr.irq = adapter->pdev->irq;lan743x_csr_write (adapter,INT_EN_CLR ,0xFFFFFFFF ); -mutex_init (&adapter->dp_lock); ret =lan743x_gpio_init (adapter);if (ret)
drivers/net/ethernet/microchip/lan743x_main.h +0 -3
@@ -706,9 +706,6 @@ struct lan743x_adapter {struct lan743x_csr csr;struct lan743x_intr intr; -/* lock, used to prevent concurrent access to data port */ -struct mutex dp_lock; -struct lan743x_gpio gpio;struct lan743x_ptp ptp;
drivers/net/ethernet/realtek/r8169_main.c +2 -1
@@ -5846,7 +5846,8 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp, opts[1 ] |= transport_offset <<TCPHO_SHIFT ; }else {if (unlikely (rtl_test_hw_pad_bug (tp, skb))) -return !eth_skb_pad (skb); +/* eth_skb_pad would free the skb on error */ +return !__skb_put_padto (skb,ETH_ZLEN , false); }return true;
drivers/net/vrf.c +69 -23
150 lines not on this page · raw message
drivers/net/wan/cosa.c +1 -0
@@ -889,6 +889,7 @@ static ssize_t cosa_write(struct file *file, chan->tx_status =1 ;spin_unlock_irqrestore (&cosa->lock, flags);up (&chan->wsem); +kfree (kbuf);return -ERESTARTSYS ; } }
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +1 -1
@@ -973,7 +973,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,struct ath_htc_rx_status *rxstatus;struct ath_rx_status rx_stats;bool decrypt_error = false; -__be16 rs_datalen; +u16 rs_datalen;bool is_phyerr;if (skb->len <HTC_RX_FRAME_HEADER_SIZE ) {
drivers/nvme/host/core.c +6 -2
@@ -4226,8 +4226,7 @@ void nvme_start_queues(struct nvme_ctrl *ctrl) }EXPORT_SYMBOL_GPL (nvme_start_queues); - -void nvme_sync_queues (struct nvme_ctrl *ctrl) +void nvme_sync_io_queues (struct nvme_ctrl *ctrl) {struct nvme_ns *ns;
@@ -4235,7 +4234,12 @@ void nvme_sync_queues(struct nvme_ctrl *ctrl)list_for_each_entry (ns, &ctrl->namespaces, list)blk_sync_queue (ns->queue);up_read (&ctrl->namespaces_rwsem); +} +EXPORT_SYMBOL_GPL (nvme_sync_io_queues); +void nvme_sync_queues (struct nvme_ctrl *ctrl) +{ +nvme_sync_io_queues (ctrl);if (ctrl->admin_q)blk_sync_queue (ctrl->admin_q); }
drivers/nvme/host/nvme.h +1 -0
@@ -494,6 +494,7 @@ void nvme_stop_queues(struct nvme_ctrl *ctrl);void nvme_start_queues (struct nvme_ctrl *ctrl);void nvme_kill_queues (struct nvme_ctrl *ctrl);void nvme_sync_queues (struct nvme_ctrl *ctrl); +void nvme_sync_io_queues (struct nvme_ctrl *ctrl);void nvme_unfreeze (struct nvme_ctrl *ctrl);void nvme_wait_freeze (struct nvme_ctrl *ctrl);int nvme_wait_freeze_timeout (struct nvme_ctrl *ctrl,long timeout);
drivers/nvme/host/rdma.c +3 -11
@@ -110,7 +110,6 @@ struct nvme_rdma_ctrl {struct sockaddr_storage src_addr;struct nvme_ctrl ctrl; -struct mutex teardown_lock;bool use_inline_data;u32 io_queues[HCTX_MAX_TYPES ]; };
@@ -933,8 +932,8 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new)static void nvme_rdma_teardown_admin_queue (struct nvme_rdma_ctrl *ctrl,bool remove) { -mutex_lock (&ctrl->teardown_lock);blk_mq_quiesce_queue (ctrl->ctrl.admin_q); +blk_sync_queue (ctrl->ctrl.admin_q);nvme_rdma_stop_queue (&ctrl->queues[0 ]);if (ctrl->ctrl.admin_tagset) { blk_mq_tagset_busy_iter(ctrl->ctrl.admin_tagset,
@@ -944,16 +943,15 @@ static void nvme_rdma_teardown_admin_queue(struct nvme_rdma_ctrl *ctrl,if (remove)blk_mq_unquiesce_queue (ctrl->ctrl.admin_q);nvme_rdma_destroy_admin_queue (ctrl, remove); -mutex_unlock (&ctrl->teardown_lock); }static void nvme_rdma_teardown_io_queues (struct nvme_rdma_ctrl *ctrl,bool remove) { -mutex_lock (&ctrl->teardown_lock);if (ctrl->ctrl.queue_count >1 ) {nvme_start_freeze (&ctrl->ctrl);nvme_stop_queues (&ctrl->ctrl); +nvme_sync_io_queues (&ctrl->ctrl);nvme_rdma_stop_io_queues (ctrl);if (ctrl->ctrl.tagset) { blk_mq_tagset_busy_iter(ctrl->ctrl.tagset,
@@ -964,7 +962,6 @@ static void nvme_rdma_teardown_io_queues(struct nvme_rdma_ctrl *ctrl,nvme_start_queues (&ctrl->ctrl);nvme_rdma_destroy_io_queues (ctrl, remove); } -mutex_unlock (&ctrl->teardown_lock); }static void nvme_rdma_free_ctrl (struct nvme_ctrl *nctrl)
@@ -1728,16 +1725,12 @@ static void nvme_rdma_complete_timed_out(struct request *rq) {struct nvme_rdma_request *req =blk_mq_rq_to_pdu (rq);struct nvme_rdma_queue *queue = req->queue; -struct nvme_rdma_ctrl *ctrl = queue->ctrl; -/* fence other contexts that may complete the command */ -mutex_lock (&ctrl->teardown_lock);nvme_rdma_stop_queue (queue); -if (!blk_mq_request_completed (rq)) { +if (blk_mq_request_started (rq) && !blk_mq_request_completed (rq)) {nvme_req (rq)->status =NVME_SC_HOST_ABORTED_CMD ;blk_mq_complete_request (rq); } -mutex_unlock (&ctrl->teardown_lock); } static enum blk_eh_timer_return
@@ -2029,7 +2022,6 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,return ERR_PTR (-ENOMEM ); ctrl->ctrl.opts = opts;INIT_LIST_HEAD (&ctrl->list); -mutex_init (&ctrl->teardown_lock);if (!(opts->mask &NVMF_OPT_TRSVCID )) { opts->trsvcid =
drivers/nvme/host/tcp.c +4 -12
@@ -110,7 +110,6 @@ struct nvme_tcp_ctrl {struct sockaddr_storage src_addr;struct nvme_ctrl ctrl; -struct mutex teardown_lock;struct work_struct err_work;struct delayed_work connect_work;struct nvme_tcp_request async_req;
@@ -1797,8 +1796,8 @@ static int nvme_tcp_configure_admin_queue(struct nvme_ctrl *ctrl, bool new)static void nvme_tcp_teardown_admin_queue (struct nvme_ctrl *ctrl,bool remove) { -mutex_lock (&to_tcp_ctrl (ctrl)->teardown_lock);blk_mq_quiesce_queue (ctrl->admin_q); +blk_sync_queue (ctrl->admin_q);nvme_tcp_stop_queue (ctrl,0 );if (ctrl->admin_tagset) { blk_mq_tagset_busy_iter(ctrl->admin_tagset,
@@ -1808,18 +1807,17 @@ static void nvme_tcp_teardown_admin_queue(struct nvme_ctrl *ctrl,if (remove)blk_mq_unquiesce_queue (ctrl->admin_q);nvme_tcp_destroy_admin_queue (ctrl, remove); -mutex_unlock (&to_tcp_ctrl (ctrl)->teardown_lock); }static void nvme_tcp_teardown_io_queues (struct nvme_ctrl *ctrl,bool remove) { -mutex_lock (&to_tcp_ctrl (ctrl)->teardown_lock);if (ctrl->queue_count <=1 ) - goto out; +return ;blk_mq_quiesce_queue (ctrl->admin_q);nvme_start_freeze (ctrl);nvme_stop_queues (ctrl); +nvme_sync_io_queues (ctrl);nvme_tcp_stop_io_queues (ctrl);if (ctrl->tagset) { blk_mq_tagset_busy_iter(ctrl->tagset,
@@ -1829,8 +1827,6 @@ static void nvme_tcp_teardown_io_queues(struct nvme_ctrl *ctrl,if (remove)nvme_start_queues (ctrl);nvme_tcp_destroy_io_queues (ctrl, remove); -out: -mutex_unlock (&to_tcp_ctrl (ctrl)->teardown_lock); }static void nvme_tcp_reconnect_or_remove (struct nvme_ctrl *ctrl)
@@ -2074,14 +2070,11 @@ static void nvme_tcp_complete_timed_out(struct request *rq)struct nvme_tcp_request *req =blk_mq_rq_to_pdu (rq);struct nvme_ctrl *ctrl = &req->queue->ctrl->ctrl; -/* fence other contexts that may complete the command */ -mutex_lock (&to_tcp_ctrl (ctrl)->teardown_lock);nvme_tcp_stop_queue (ctrl,nvme_tcp_queue_id (req->queue)); -if (!blk_mq_request_completed (rq)) { +if (blk_mq_request_started (rq) && !blk_mq_request_completed (rq)) {nvme_req (rq)->status =NVME_SC_HOST_ABORTED_CMD ;blk_mq_complete_request (rq); } -mutex_unlock (&to_tcp_ctrl (ctrl)->teardown_lock); } static enum blk_eh_timer_return
@@ -2344,7 +2337,6 @@ static struct nvme_ctrl *nvme_tcp_create_ctrl(struct device *dev, nvme_tcp_reconnect_ctrl_work);INIT_WORK (&ctrl->err_work, nvme_tcp_error_recovery_work);INIT_WORK (&ctrl->ctrl.reset_work, nvme_reset_ctrl_work); -mutex_init (&ctrl->teardown_lock);if (!(opts->mask &NVMF_OPT_TRSVCID )) { opts->trsvcid =
drivers/of/address.c +3 -1
@@ -1003,11 +1003,13 @@ EXPORT_SYMBOL_GPL(of_dma_get_range);*/ bool of_dma_is_coherent (struct device_node *np) { -struct device_node *node =of_node_get (np); +struct device_node *node;if (IS_ENABLED (CONFIG_OF_DMA_DEFAULT_COHERENT ))return true; + node =of_node_get (np); +while (node) {if (of_property_read_bool (node,"dma-coherent" )) {of_node_put (node);
drivers/opp/core.c +4 -3
@@ -1046,6 +1046,10 @@ static void _opp_table_kref_release(struct kref *kref) struct opp_table *opp_table = container_of(kref, struct opp_table, kref);struct opp_device *opp_dev, *temp; +/* Drop the lock as soon as we can */ +list_del (&opp_table->node); +mutex_unlock (&opp_table_lock); +_of_clear_opp_table (opp_table);/* Release clk */
@@ -1067,10 +1071,7 @@ static void _opp_table_kref_release(struct kref *kref)mutex_destroy (&opp_table->genpd_virt_dev_lock);mutex_destroy (&opp_table->lock); -list_del (&opp_table->node);kfree (opp_table); - -mutex_unlock (&opp_table_lock); }void dev_pm_opp_put_opp_table (struct opp_table *opp_table)
drivers/pci/controller/dwc/pcie-qcom.c +13 -0
@@ -303,6 +303,9 @@ static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie)clk_disable_unprepare (res->core_clk);clk_disable_unprepare (res->aux_clk);clk_disable_unprepare (res->ref_clk); + +writel (1 , pcie->parf +PCIE20_PARF_PHY_CTRL ); +regulator_bulk_disable (ARRAY_SIZE (res->supplies), res->supplies); }
@@ -315,6 +318,16 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)u32 val;int ret; +/* reset the PCIe interface as uboot can leave it undefined state */ +reset_control_assert (res->pci_reset); +reset_control_assert (res->axi_reset); +reset_control_assert (res->ahb_reset); +reset_control_assert (res->por_reset); +reset_control_assert (res->ext_reset); +reset_control_assert (res->phy_reset); + +writel (1 , pcie->parf +PCIE20_PARF_PHY_CTRL ); + ret =regulator_bulk_enable (ARRAY_SIZE (res->supplies), res->supplies);if (ret <0 ) {dev_err (dev,"cannot enable regulators\n" );
drivers/pinctrl/aspeed/pinctrl-aspeed.c +4 -3
@@ -277,13 +277,14 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function,static bool aspeed_expr_is_gpio (const struct aspeed_sig_expr *expr) {/* -* The signal type is GPIO if the signal name has "GPIO" as a prefix. +* The signal type is GPIO if the signal name has "GPI" as a prefix. * strncmp (rather than strcmp) is used to implement the prefix * requirement. * -* expr->signal might look like "GPIOT3" in the GPIO case. +* expr->signal might look like "GPIOB1" in the GPIO case. +* expr->signal might look like "GPIT0" in the GPI case. */ -return strncmp (expr->signal,"GPIO" ,4 ) ==0 ; +return strncmp (expr->signal,"GPI" ,3 ) ==0 ; }static bool aspeed_gpio_in_exprs (const struct aspeed_sig_expr **exprs)
drivers/pinctrl/intel/pinctrl-intel.c +8 -0
@@ -662,6 +662,10 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin, value |=PADCFG1_TERM_UP ; +/* Set default strength value in case none is given */ +if (arg ==1 ) + arg =5000 ; +switch (arg) {case 20000 : value |=PADCFG1_TERM_20K <<PADCFG1_TERM_SHIFT ;
@@ -684,6 +688,10 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,case PIN_CONFIG_BIAS_PULL_DOWN : value &= ~(PADCFG1_TERM_UP |PADCFG1_TERM_MASK ); +/* Set default strength value in case none is given */ +if (arg ==1 ) + arg =5000 ; +switch (arg) {case 20000 : value |=PADCFG1_TERM_20K <<PADCFG1_TERM_SHIFT ;
drivers/pinctrl/pinctrl-amd.c +3 -3
@@ -153,7 +153,7 @@ static int amd_gpio_set_debounce(struct gpio_chip *gc, unsigned offset, pin_reg |=BIT (DB_TMR_OUT_UNIT_OFF ); pin_reg &= ~BIT (DB_TMR_LARGE_OFF ); }else if (debounce <250000 ) { - time = debounce /15600 ; + time = debounce /15625 ; pin_reg |= time &DB_TMR_OUT_MASK ; pin_reg &= ~BIT (DB_TMR_OUT_UNIT_OFF ); pin_reg |=BIT (DB_TMR_LARGE_OFF );
@@ -163,14 +163,14 @@ static int amd_gpio_set_debounce(struct gpio_chip *gc, unsigned offset, pin_reg |=BIT (DB_TMR_OUT_UNIT_OFF ); pin_reg |=BIT (DB_TMR_LARGE_OFF ); }else { - pin_reg &= ~DB_CNTRl_MASK; + pin_reg &= ~(DB_CNTRl_MASK <<DB_CNTRL_OFF ); ret = -EINVAL ; } }else { pin_reg &= ~BIT (DB_TMR_OUT_UNIT_OFF ); pin_reg &= ~BIT (DB_TMR_LARGE_OFF ); pin_reg &= ~DB_TMR_OUT_MASK ; - pin_reg &= ~DB_CNTRl_MASK; + pin_reg &= ~(DB_CNTRl_MASK <<DB_CNTRL_OFF ); }writel (pin_reg, gpio_dev->base + offset *4 );raw_spin_unlock_irqrestore (&gpio_dev->lock, flags);
drivers/scsi/device_handler/scsi_dh_alua.c +5 -4
@@ -658,8 +658,8 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)rcu_read_lock ();list_for_each_entry_rcu (h, &tmp_pg->dh_list, node) { -/* h->sdev should always be valid */ -BUG_ON (!h->sdev); +if (!h->sdev) +continue ; h->sdev->access_state = desc[0 ]; }rcu_read_unlock ();
@@ -705,7 +705,8 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg) pg->expiry =0 ;rcu_read_lock ();list_for_each_entry_rcu (h, &pg->dh_list, node) { -BUG_ON (!h->sdev); +if (!h->sdev) +continue ; h->sdev->access_state = (pg->state &SCSI_ACCESS_STATE_MASK );if (pg->pref)
@@ -1147,7 +1148,6 @@ static void alua_bus_detach(struct scsi_device *sdev)spin_lock (&h->pg_lock); pg =rcu_dereference_protected (h->pg,lockdep_is_held (&h->pg_lock));rcu_assign_pointer (h->pg,NULL ); - h->sdev =NULL ;spin_unlock (&h->pg_lock);if (pg) {spin_lock_irq (&pg->lock);
@@ -1156,6 +1156,7 @@ static void alua_bus_detach(struct scsi_device *sdev)kref_put (&pg->kref, release_port_group); } sdev->handler_data =NULL ; +synchronize_rcu ();kfree (h); }
drivers/scsi/hpsa.c +3 -1
@@ -8854,7 +8854,7 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)/* hook into SCSI subsystem */ rc =hpsa_scsi_add_host (h);if (rc) - goto clean7;/* perf, sg, cmd, irq, shost, pci, lu, aer/h */ + goto clean8;/* lastlogicals, perf, sg, cmd, irq, shost, pci, lu, aer/h */ /* Monitor the controller for firmware lockups */ h->heartbeat_sample_interval =HEARTBEAT_SAMPLE_INTERVAL ;
@@ -8869,6 +8869,8 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) HPSA_EVENT_MONITOR_INTERVAL);return 0 ; +clean8:/* lastlogicals, perf, sg, cmd, irq, shost, pci, lu, aer/h */ +kfree (h->lastlogicals); clean7:/* perf, sg, cmd, irq, shost, pci, lu, aer/h */ hpsa_free_performant_mode (h); h->access.set_intr_mask (h,HPSA_INTR_OFF );
drivers/scsi/mpt3sas/mpt3sas_base.c +7 -0
@@ -1641,6 +1641,13 @@ _base_irqpoll(struct irq_poll *irqpoll, int budget) reply_q->irq_poll_scheduled = false; reply_q->irq_line_enable = true;enable_irq (reply_q->os_irq); +/* +* Go for one more round of processing the +* reply descriptor post queue incase if HBA +* Firmware has posted some reply descriptors +* while reenabling the IRQ. +*/ +_base_process_reply_queue (reply_q); }return num_entries;
drivers/spi/spi-bcm2835.c +1 -2
@@ -1179,7 +1179,6 @@ static int bcm2835_spi_setup(struct spi_device *spi)struct spi_controller *ctlr = spi->controller;struct bcm2835_spi *bs =spi_controller_get_devdata (ctlr);struct gpio_chip *chip; -enum gpio_lookup_flags lflags;u32 cs;/*
@@ -1247,7 +1246,7 @@ static int bcm2835_spi_setup(struct spi_device *spi) spi->cs_gpiod =gpiochip_request_own_desc (chip,8 - spi->chip_select,DRV_NAME , - lflags, +GPIO_LOOKUP_FLAGS_DEFAULT ,GPIOD_OUT_LOW );if (IS_ERR (spi->cs_gpiod))return PTR_ERR (spi->cs_gpiod);
drivers/thunderbolt/nhi.c +15 -4
@@ -410,12 +410,23 @@ static int ring_request_msix(struct tb_ring *ring, bool no_suspend) ring->vector = ret; - ring->irq =pci_irq_vector (ring->nhi->pdev, ring->vector); -if (ring->irq <0 ) -return ring->irq; + ret =pci_irq_vector (ring->nhi->pdev, ring->vector); +if (ret <0 ) + goto err_ida_remove; + + ring->irq = ret; irqflags = no_suspend ?IRQF_NO_SUSPEND :0 ; -return request_irq (ring->irq, ring_msix, irqflags,"thunderbolt" , ring); + ret =request_irq (ring->irq, ring_msix, irqflags,"thunderbolt" , ring); +if (ret) + goto err_ida_remove; + +return 0 ; + +err_ida_remove: +ida_simple_remove (&nhi->msix_ida, ring->vector); + +return ret; }static void ring_release_msix (struct tb_ring *ring)
drivers/thunderbolt/xdomain.c +1 -0
@@ -830,6 +830,7 @@ static void enumerate_services(struct tb_xdomain *xd) id =ida_simple_get (&xd->service_ids,0 ,0 ,GFP_KERNEL );if (id <0 ) { +kfree (svc->key);kfree (svc);break ; }
drivers/uio/uio.c +6 -4
@@ -413,10 +413,10 @@ static int uio_get_minor(struct uio_device *idev)return retval; } -static void uio_free_minor (struct uio_device *idev) +static void uio_free_minor (unsigned long minor) {mutex_lock (&minor_lock); -idr_remove (&uio_idr, idev->minor); +idr_remove (&uio_idr, minor);mutex_unlock (&minor_lock); }
@@ -990,7 +990,7 @@ int __uio_register_device(struct module *owner, err_uio_dev_add_attributes:device_del (&idev->dev); err_device_create: -uio_free_minor (idev); +uio_free_minor (idev->minor);put_device (&idev->dev);return ret; }
@@ -1004,11 +1004,13 @@ EXPORT_SYMBOL_GPL(__uio_register_device);void uio_unregister_device (struct uio_info *info) {struct uio_device *idev; +unsigned long minor;if (!info || !info->uio_dev)return ; idev = info->uio_dev; + minor = idev->minor;mutex_lock (&idev->info_lock);uio_dev_del_attributes (idev);
@@ -1024,7 +1026,7 @@ void uio_unregister_device(struct uio_info *info)device_unregister (&idev->dev); -uio_free_minor (idev); +uio_free_minor (minor);return ; }
drivers/usb/class/cdc-acm.c +9 -0
@@ -1706,6 +1706,15 @@ static const struct usb_device_id acm_ids[] = { { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */ .driver_info =NO_UNION_NORMAL ,/* has no union descriptor */ }, + { USB_DEVICE(0x045b, 0x023c), /* Renesas USB Download mode */ + .driver_info = DISABLE_ECHO, /* Don't echo banner */ + }, + { USB_DEVICE(0x045b, 0x0248), /* Renesas USB Download mode */ + .driver_info = DISABLE_ECHO, /* Don't echo banner */ + }, + { USB_DEVICE(0x045b, 0x024D), /* Renesas USB Download mode */ + .driver_info = DISABLE_ECHO, /* Don't echo banner */ + }, { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; [email protected] */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ },
drivers/usb/dwc3/dwc3-pci.c +4 -0
@@ -40,6 +40,7 @@#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee#define PCI_DEVICE_ID_INTEL_JSP 0x4dee +#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1#define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"#define PCI_INTEL_BXT_FUNC_PMU_PWR 4
@@ -367,6 +368,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = { {PCI_VDEVICE (INTEL ,PCI_DEVICE_ID_INTEL_JSP ), (kernel_ulong_t) &dwc3_pci_intel_properties, }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS), + (kernel_ulong_t) &dwc3_pci_intel_properties, }, + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB), (kernel_ulong_t) &dwc3_pci_amd_properties, }, { } /* Terminating Entry */
drivers/usb/dwc3/gadget.c +25 -7
@@ -2627,6 +2627,11 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, ret =dwc3_gadget_ep_reclaim_trb_linear (dep, req, event, status); + req->request.actual = req->request.length - req->remaining; + +if (!dwc3_gadget_ep_request_completed (req)) + goto out; +if (req->needs_extra_trb) {unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc);
@@ -2642,13 +2647,6 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, req->needs_extra_trb = false; } - req->request.actual = req->request.length - req->remaining; - -if (!dwc3_gadget_ep_request_completed (req)) { -__dwc3_gadget_kick_transfer (dep); - goto out; - } -dwc3_gadget_giveback (dep, req, status); out:
@@ -2671,6 +2669,24 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep, } } +static bool dwc3_gadget_ep_should_continue (struct dwc3_ep *dep) +{ +struct dwc3_request *req; + +if (!list_empty (&dep->pending_list)) +return true; + +/* +* We only need to check the first entry of the started list. We can +* assume the completed requests are removed from the started list. +*/ + req =next_request (&dep->started_list); +if (!req) +return false; + +return !dwc3_gadget_ep_request_completed (req); +} +static void dwc3_gadget_endpoint_frame_from_event (struct dwc3_ep *dep,const struct dwc3_event_depevt *event) {
@@ -2700,6 +2716,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,if (stop)dwc3_stop_active_transfer (dep, true, true); +else if (dwc3_gadget_ep_should_continue (dep)) +__dwc3_gadget_kick_transfer (dep);/* * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
drivers/usb/gadget/udc/goku_udc.c +1 -1
@@ -1757,6 +1757,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto err; } +pci_set_drvdata (pdev, dev);spin_lock_init (&dev->lock); dev->pdev = pdev; dev->gadget.ops = &goku_ops;
@@ -1790,7 +1791,6 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) } dev->regs = (struct goku_udc_regs __iomem *) base; -pci_set_drvdata (pdev, dev);INFO (dev,"%s\n" , driver_desc);INFO (dev,"version: " DRIVER_VERSION " %s\n" ,dmastr ());INFO (dev,"irq %d, pci mem %p\n" , pdev->irq, base);
drivers/usb/host/xhci-histb.c +1 -1
@@ -241,7 +241,7 @@ static int xhci_histb_probe(struct platform_device *pdev)/* Initialize dma_mask and coherent_dma_mask to 32-bits */ ret =dma_set_mask_and_coherent (dev,DMA_BIT_MASK (32 ));if (ret) -return ret; + goto disable_pm; hcd =usb_create_hcd (driver, dev,dev_name (dev));if (!hcd) {
drivers/vfio/pci/vfio_pci.c +1 -1
@@ -334,7 +334,7 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev) pdev->vendor == PCI_VENDOR_ID_INTEL && IS_ENABLED(CONFIG_VFIO_PCI_IGD)) { ret =vfio_pci_igd_init (vdev); -if (ret) { +if (ret && ret != -ENODEV ) {pci_warn (pdev,"Failed to setup Intel IGD regions\n" ); goto disable_exit; }
drivers/vfio/platform/vfio_platform_common.c +1 -2
@@ -267,7 +267,7 @@ static int vfio_platform_open(void *device_data) ret =pm_runtime_get_sync (vdev->device);if (ret <0 ) - goto err_pm; + goto err_rst; ret =vfio_platform_call_reset (vdev, &extra_dbg);if (ret && vdev->reset_required) {
@@ -284,7 +284,6 @@ static int vfio_platform_open(void *device_data) err_rst:pm_runtime_put (vdev->device); -err_pm:vfio_platform_irq_cleanup (vdev); err_irq:vfio_platform_regions_cleanup (vdev);
fs/afs/yfsclient.c +1 -0
@@ -2162,6 +2162,7 @@ int yfs_fs_store_opaque_acl2(struct afs_fs_cursor *fc, const struct afs_acl *aclmemcpy (bp, acl->data, acl->size);if (acl->size != size)memset ((void *)bp + acl->size,0 , size - acl->size); + bp += size /sizeof (__be32);yfs_check_req (call, bp);trace_afs_make_fs_call (call, &vnode->fid);
fs/btrfs/dev-replace.c +24 -2
@@ -55,6 +55,17 @@ int btrfs_init_dev_replace(struct btrfs_fs_info *fs_info) ret =btrfs_search_slot (NULL , dev_root, &key, path,0 ,0 );if (ret) { no_valid_dev_replace_entry_found: +/* +* We don't have a replace item or it's corrupted. If there is +* a replace target, fail the mount. +*/ +if (btrfs_find_device (fs_info->fs_devices, +BTRFS_DEV_REPLACE_DEVID ,NULL ,NULL , false)) { +btrfs_err (fs_info, +"found replace target device without a valid replace item" ); + ret = -EUCLEAN ; + goto out; + } ret =0 ; dev_replace->replace_state =BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED ;
@@ -107,8 +118,19 @@ int btrfs_init_dev_replace(struct btrfs_fs_info *fs_info)case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED :case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED :case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED : - dev_replace->srcdev =NULL ; - dev_replace->tgtdev =NULL ; +/* +* We don't have an active replace item but if there is a +* replace target, fail the mount. +*/ +if (btrfs_find_device (fs_info->fs_devices, +BTRFS_DEV_REPLACE_DEVID ,NULL ,NULL , false)) { +btrfs_err (fs_info, +"replace devid present without an active replace item" ); + ret = -EUCLEAN ; + }else { + dev_replace->srcdev =NULL ; + dev_replace->tgtdev =NULL ; + }break ;case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED :case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED :
fs/btrfs/extent-tree.c +4 -3
@@ -3800,11 +3800,12 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info,* |- Push harder to find free extents * |- If not found, re-iterate all block groups */ -static noinline int find_free_extent(struct btrfs_fs_info *fs_info, +static noinline int find_free_extent(struct btrfs_root *root,u64 ram_bytes,u64 num_bytes,u64 empty_size,u64 hint_byte,struct btrfs_key *ins,u64 flags,int delalloc) { +struct btrfs_fs_info *fs_info = root->fs_info;int ret =0 ;int cache_block_group_error =0 ;struct btrfs_free_cluster *last_ptr =NULL ;
@@ -3833,7 +3834,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, ins->objectid =0 ; ins->offset =0 ; -trace_find_free_extent (fs_info, num_bytes, empty_size, flags); +trace_find_free_extent (root, num_bytes, empty_size, flags); space_info =btrfs_find_space_info (fs_info, flags);if (!space_info) {
@@ -4141,7 +4142,7 @@ int btrfs_reserve_extent(struct btrfs_root *root, u64 ram_bytes, flags =get_alloc_profile_by_root (root, is_data); again:WARN_ON (num_bytes < fs_info->sectorsize); - ret =find_free_extent (fs_info, ram_bytes, num_bytes, empty_size, + ret =find_free_extent (root, ram_bytes, num_bytes, empty_size, hint_byte, ins, flags, delalloc);if (!ret && !is_data) {btrfs_dec_block_group_reservations (fs_info, ins->objectid);
fs/btrfs/ioctl.c +6 -6
@@ -1255,6 +1255,7 @@ static int cluster_pages_for_defrag(struct inode *inode,u64 page_start;u64 page_end;u64 page_cnt; +u64 start = (u64 )start_index <<PAGE_SHIFT ;int ret;int i;int i_done;
@@ -1271,8 +1272,7 @@ static int cluster_pages_for_defrag(struct inode *inode, page_cnt =min_t (u64, (u64 )num_pages, (u64 )file_end - start_index +1 ); ret =btrfs_delalloc_reserve_space (inode, &data_reserved, - start_index <<PAGE_SHIFT , - page_cnt <<PAGE_SHIFT ); + start, page_cnt <<PAGE_SHIFT );if (ret)return ret; i_done =0 ;
@@ -1361,8 +1361,7 @@ static int cluster_pages_for_defrag(struct inode *inode,btrfs_mod_outstanding_extents (BTRFS_I (inode),1 );spin_unlock (&BTRFS_I (inode)->lock);btrfs_delalloc_release_space (inode, data_reserved, - start_index <<PAGE_SHIFT , - (page_cnt - i_done) <<PAGE_SHIFT , true); + start, (page_cnt - i_done) <<PAGE_SHIFT , true); }
@@ -1389,8 +1388,7 @@ static int cluster_pages_for_defrag(struct inode *inode,put_page (pages[i]); }btrfs_delalloc_release_space (inode, data_reserved, - start_index <<PAGE_SHIFT , - page_cnt <<PAGE_SHIFT , true); + start, page_cnt <<PAGE_SHIFT , true);btrfs_delalloc_release_extents (BTRFS_I (inode), page_cnt <<PAGE_SHIFT );extent_changeset_free (data_reserved);return ret;
@@ -3752,6 +3750,8 @@ static int btrfs_clone(struct inode *src, struct inode *inode, ret = -EINTR ; goto out; } + +cond_resched (); } ret =0 ;
fs/btrfs/ref-verify.c +1 -0
@@ -851,6 +851,7 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info, "dropping a ref for a root that doesn't have a ref on the block");dump_block_entry (fs_info, be);dump_ref_action (fs_info, ra); +kfree (ref);kfree (ra); goto out_unlock; }
fs/btrfs/relocation.c +3 -1
@@ -2287,6 +2287,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,struct btrfs_root_item *root_item;struct btrfs_path *path;struct extent_buffer *leaf; +int reserve_level;int level;int max_level;int replaced =0 ;
@@ -2335,7 +2336,8 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,* Thus the needed metadata size is at most root_level * nodesize, * and * 2 since we have two trees to COW. */ - min_reserved = fs_info->nodesize *btrfs_root_level (root_item) *2 ; + reserve_level =max_t (int,1 ,btrfs_root_level (root_item)); + min_reserved = fs_info->nodesize * reserve_level *2 ;memset (&next_key,0 ,sizeof (next_key));while (1 ) {
fs/btrfs/volumes.c +11 -22
@@ -1245,22 +1245,13 @@ void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step)continue ; } -if (device->devid ==BTRFS_DEV_REPLACE_DEVID ) { -/* -* In the first step, keep the device which has -* the correct fsid and the devid that is used -* for the dev_replace procedure. -* In the second step, the dev_replace state is -* read from the device tree and it is known -* whether the procedure is really active or -* not, which means whether this device is -* used or whether it should be removed. -*/ -if (step ==0 ||test_bit (BTRFS_DEV_STATE_REPLACE_TGT , - &device->dev_state)) { -continue ; - } - } +/* +* We have already validated the presence of BTRFS_DEV_REPLACE_DEVID, +* in btrfs_init_dev_replace() so just continue. +*/ +if (device->devid ==BTRFS_DEV_REPLACE_DEVID ) +continue ; +if (device->bdev) {blkdev_put (device->bdev, device->mode); device->bdev =NULL ;
@@ -1269,9 +1260,6 @@ void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step)if (test_bit (BTRFS_DEV_STATE_WRITEABLE , &device->dev_state)) {list_del_init (&device->dev_alloc_list);clear_bit (BTRFS_DEV_STATE_WRITEABLE , &device->dev_state); -if (!test_bit (BTRFS_DEV_STATE_REPLACE_TGT , - &device->dev_state)) - fs_devices->rw_devices--; }list_del_init (&device->dev_list); fs_devices->num_devices--;
@@ -2728,9 +2716,6 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_pathbtrfs_set_super_num_devices (fs_info->super_copy, orig_super_num_devices +1 ); -/* add sysfs device entry */ -btrfs_sysfs_add_device_link (fs_devices, device); -/* * we've got more storage, clear any full flags on the space * infos
@@ -2738,6 +2723,10 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_pathbtrfs_clear_space_info_full (fs_info);mutex_unlock (&fs_info->chunk_mutex); + +/* Add sysfs device entry */ +btrfs_sysfs_add_device_link (fs_devices, device); +mutex_unlock (&fs_devices->device_list_mutex);if (seeding_dev) {
fs/cifs/cifs_unicode.c +7 -1
@@ -488,7 +488,13 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,else if (map_chars ==SFM_MAP_UNI_RSVD ) {bool end_of_string; -if (i == srclen -1 ) +/** +* Remap spaces and periods found at the end of every +* component of the path. The special cases of '.' and +* '..' do not need to be dealt with explicitly because +* they are addressed in namei.c:link_path_walk(). +**/ +if ((i == srclen -1 ) || (source[i+1 ] =='\\' )) end_of_string = true;else end_of_string = false;
fs/erofs/inode.c +11 -10
@@ -107,11 +107,9 @@ static struct page *erofs_read_inode(struct inode *inode,i_gid_write (inode,le32_to_cpu (die->i_gid));set_nlink (inode,le32_to_cpu (die->i_nlink)); -/* ns timestamp */ - inode->i_mtime.tv_sec = inode->i_ctime.tv_sec = -le64_to_cpu (die->i_ctime); - inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = -le32_to_cpu (die->i_ctime_nsec); +/* extended inode has its own timestamp */ + inode->i_ctime.tv_sec =le64_to_cpu (die->i_ctime); + inode->i_ctime.tv_nsec =le32_to_cpu (die->i_ctime_nsec); inode->i_size =le64_to_cpu (die->i_size);
@@ -149,11 +147,9 @@ static struct page *erofs_read_inode(struct inode *inode,i_gid_write (inode,le16_to_cpu (dic->i_gid));set_nlink (inode,le16_to_cpu (dic->i_nlink)); -/* use build time to derive all file time */ - inode->i_mtime.tv_sec = inode->i_ctime.tv_sec = - sbi->build_time; - inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = - sbi->build_time_nsec; +/* use build time for compact inodes */ + inode->i_ctime.tv_sec = sbi->build_time; + inode->i_ctime.tv_nsec = sbi->build_time_nsec; inode->i_size =le32_to_cpu (dic->i_size);if (erofs_inode_is_data_compressed (vi->datalayout))
@@ -167,6 +163,11 @@ static struct page *erofs_read_inode(struct inode *inode, goto err_out; } + inode->i_mtime.tv_sec = inode->i_ctime.tv_sec; + inode->i_atime.tv_sec = inode->i_ctime.tv_sec; + inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec; + inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec; +if (!nblks)/* measure inode.i_blocks as generic filesystems */ inode->i_blocks =roundup (inode->i_size,EROFS_BLKSIZ ) >>9 ;
fs/ext4/inline.c +1 -0
@@ -1918,6 +1918,7 @@ int ext4_inline_data_truncate(struct inode *inode, int *has_inline)ext4_write_lock_xattr (inode, &no_expand);if (!ext4_has_inline_data (inode)) { +ext4_write_unlock_xattr (inode, &no_expand); *has_inline =0 ;ext4_journal_stop (handle);return 0 ;
fs/ext4/super.c +2 -2
@@ -1756,8 +1756,8 @@ static const struct mount_opts { {Opt_noquota, (EXT4_MOUNT_QUOTA |EXT4_MOUNT_USRQUOTA |EXT4_MOUNT_GRPQUOTA |EXT4_MOUNT_PRJQUOTA ), MOPT_CLEAR | MOPT_Q}, - {Opt_usrjquota, 0, MOPT_Q}, - {Opt_grpjquota, 0, MOPT_Q}, + {Opt_usrjquota, 0, MOPT_Q | MOPT_STRING}, + {Opt_grpjquota, 0, MOPT_Q | MOPT_STRING}, {Opt_offusrjquota, 0, MOPT_Q}, {Opt_offgrpjquota, 0, MOPT_Q}, {Opt_jqfmt_vfsold, QFMT_VFS_OLD, MOPT_QFMT},
fs/gfs2/rgrp.c +4 -1
@@ -736,9 +736,9 @@ void gfs2_clear_rgrpd(struct gfs2_sbd *sdp) }gfs2_free_clones (rgd); +return_all_reservations (rgd);kfree (rgd->rd_bits); rgd->rd_bits =NULL ; -return_all_reservations (rgd);kmem_cache_free (gfs2_rgrpd_cachep, rgd); } }
@@ -1410,6 +1410,9 @@ int gfs2_fitrim(struct file *filp, void __user *argp)if (!capable (CAP_SYS_ADMIN ))return -EPERM ; +if (!test_bit (SDF_JOURNAL_LIVE , &sdp->sd_flags)) +return -EROFS ; +if (!blk_queue_discard (q))return -EOPNOTSUPP ;
fs/gfs2/super.c +1 -0
@@ -689,6 +689,7 @@ static void gfs2_put_super(struct super_block *sb)gfs2_jindex_free (sdp);/* Take apart glock structures and buffer lists */ gfs2_gl_hash_clear (sdp); +truncate_inode_pages_final (&sdp->sd_aspace);gfs2_delete_debugfs_file (sdp);/* Unmount the locking protocol */ gfs2_lm_unmount (sdp);
fs/jbd2/checkpoint.c +2 -0
@@ -106,6 +106,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh)* for a checkpoint to free up some space in the log. */ void __jbd2_log_wait_for_space (journal_t *journal) +__acquires(&journal->j_state_lock) +__releases(&journal->j_state_lock) {int nblocks, space_left;/* assert_spin_locked(&journal->j_state_lock); */
fs/jbd2/transaction.c +3 -1
@@ -171,8 +171,10 @@ static void wait_transaction_switching(journal_t *journal)DEFINE_WAIT (wait);if (WARN_ON (!journal->j_running_transaction || - journal->j_running_transaction->t_state !=T_SWITCH )) + journal->j_running_transaction->t_state !=T_SWITCH )) { +read_unlock (&journal->j_state_lock);return ; + }prepare_to_wait (&journal->j_wait_transaction_locked, &wait,TASK_UNINTERRUPTIBLE );read_unlock (&journal->j_state_lock);
fs/ocfs2/super.c +1 -0
@@ -1692,6 +1692,7 @@ static void ocfs2_inode_init_once(void *data) oi->ip_blkno =0ULL ; oi->ip_clusters =0 ; + oi->ip_next_orphan =NULL ;ocfs2_resv_init_once (&oi->ip_la_data_resv);
fs/xfs/libxfs/xfs_alloc.c +1 -0
@@ -2209,6 +2209,7 @@ xfs_defer_agfl_block( new->xefi_startblock =XFS_AGB_TO_FSB (mp, agno, agbno); new->xefi_blockcount =1 ; new->xefi_oinfo = *oinfo; + new->xefi_skip_discard = false;trace_xfs_agfl_free_defer (mp, agno,0 , agbno,1 );
fs/xfs/libxfs/xfs_bmap.h +1 -1
@@ -52,9 +52,9 @@ struct xfs_extent_free_item {xfs_fsblock_t xefi_startblock;/* starting fs block number */ xfs_extlen_t xefi_blockcount;/* number of blocks in extent */ +bool xefi_skip_discard;struct list_head xefi_list;struct xfs_owner_info xefi_oinfo;/* extent owner */ -bool xefi_skip_discard; };#define XFS_BMAP_MAX_NMAP 4
fs/xfs/libxfs/xfs_rmap.c +1 -1
@@ -1379,7 +1379,7 @@ xfs_rmap_convert_shared(* record for our insertion point. This will also give us the record for * start block contiguity tests. */ - error =xfs_rmap_lookup_le_range (cur, bno, owner, offset, flags, + error =xfs_rmap_lookup_le_range (cur, bno, owner, offset, oldext, &PREV , &i);if (error) goto done;
fs/xfs/libxfs/xfs_rmap_btree.c +8 -8
@@ -243,8 +243,8 @@ xfs_rmapbt_key_diff(else if (y > x)return -1 ; - x =XFS_RMAP_OFF (be64_to_cpu (kp->rm_offset)); - y = rec->rm_offset; + x =be64_to_cpu (kp->rm_offset); + y =xfs_rmap_irec_offset_pack (rec);if (x > y)return 1 ;else if (y > x)
@@ -275,8 +275,8 @@ xfs_rmapbt_diff_two_keys(else if (y > x)return -1 ; - x =XFS_RMAP_OFF (be64_to_cpu (kp1->rm_offset)); - y =XFS_RMAP_OFF (be64_to_cpu (kp2->rm_offset)); + x =be64_to_cpu (kp1->rm_offset); + y =be64_to_cpu (kp2->rm_offset);if (x > y)return 1 ;else if (y > x)
@@ -390,8 +390,8 @@ xfs_rmapbt_keys_inorder(return 1 ; else if (a > b) return 0; - a =XFS_RMAP_OFF (be64_to_cpu (k1->rmap.rm_offset)); - b =XFS_RMAP_OFF (be64_to_cpu (k2->rmap.rm_offset)); + a =be64_to_cpu (k1->rmap.rm_offset); + b =be64_to_cpu (k2->rmap.rm_offset);if (a <= b)return 1 ;return 0 ;
@@ -420,8 +420,8 @@ xfs_rmapbt_recs_inorder(return 1 ; else if (a > b) return 0; - a =XFS_RMAP_OFF (be64_to_cpu (r1->rmap.rm_offset)); - b =XFS_RMAP_OFF (be64_to_cpu (r2->rmap.rm_offset)); + a =be64_to_cpu (r1->rmap.rm_offset); + b =be64_to_cpu (r2->rmap.rm_offset);if (a <= b)return 1 ;return 0 ;
fs/xfs/scrub/bmap.c +2 -0
@@ -113,6 +113,8 @@ xchk_bmap_get_rmap(if (info->whichfork ==XFS_ATTR_FORK ) rflags |=XFS_RMAP_ATTR_FORK ; +if (irec->br_state ==XFS_EXT_UNWRITTEN ) + rflags |=XFS_RMAP_UNWRITTEN ;/* * CoW staging extents are owned (on disk) by the refcountbt, so
fs/xfs/scrub/inode.c +1 -2
@@ -121,8 +121,7 @@ xchk_inode_flags( goto bad;/* rt flags require rt device */ -if ((flags & (XFS_DIFLAG_REALTIME |XFS_DIFLAG_RTINHERIT )) && - !mp->m_rtdev_targp) +if ((flags &XFS_DIFLAG_REALTIME ) && !mp->m_rtdev_targp) goto bad;/* new rt bitmap flag only valid for rbmino */
fs/xfs/scrub/refcount.c +3 -5
@@ -170,7 +170,6 @@ xchk_refcountbt_process_rmap_fragments(*/ INIT_LIST_HEAD (&worklist); rbno =NULLAGBLOCK ; - nr =1 ;/* Make sure the fragments actually /are/ in agbno order. */ bno =0 ;
@@ -184,15 +183,14 @@ xchk_refcountbt_process_rmap_fragments(* Find all the rmaps that start at or before the refc extent, * and put them on the worklist. */ + nr =0 ;list_for_each_entry_safe (frag, n, &refchk->fragments, list) { -if (frag->rm.rm_startblock > refchk->bno) - goto done; +if (frag->rm.rm_startblock > refchk->bno || nr > target_nr) +break ; bno = frag->rm.rm_startblock + frag->rm.rm_blockcount;if (bno < rbno) rbno = bno;list_move_tail (&frag->list, &worklist); -if (nr == target_nr) -break ; nr++; }
fs/xfs/xfs_iops.c +10 -0
@@ -885,6 +885,16 @@ xfs_setattr_size( error =iomap_zero_range (inode, oldsize, newsize - oldsize, &did_zeroing, &xfs_iomap_ops); }else { +/* +* iomap won't detect a dirty page over an unwritten block (or a +* cow block over a hole) and subsequently skips zeroing the +* newly post-EOF portion of the page. Flush the new EOF to +* convert the block before the pagecache truncate. +*/ + error =filemap_write_and_wait_range (inode->i_mapping, newsize, + newsize); +if (error) +return error; error =iomap_truncate_page (inode, newsize, &did_zeroing, &xfs_iomap_ops); }
fs/xfs/xfs_pnfs.c +1 -1
@@ -134,7 +134,7 @@ xfs_fs_map_blocks( goto out_unlock; error =invalidate_inode_pages2 (inode->i_mapping);if (WARN_ON_ONCE (error)) -return error; + goto out_unlock; end_fsb =XFS_B_TO_FSB (mp, (xfs_ufsize_t )offset + length); offset_fsb =XFS_B_TO_FSBT (mp, offset);
include/linux/arm-smccc.h +2 -0
@@ -76,6 +76,8 @@ ARM_SMCCC_SMC_32, \ 0, 0x7fff) +#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1 +#ifndef __ASSEMBLY__#include <linux/linkage.h>
include/linux/can/skb.h +8 -12
@@ -61,21 +61,17 @@ static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk)*/ static inline struct sk_buff *can_create_echo_skb (struct sk_buff *skb) { -if (skb_shared (skb)) { -struct sk_buff *nskb =skb_clone (skb,GFP_ATOMIC ); +struct sk_buff *nskb; -if (likely (nskb)) { -can_skb_set_owner (nskb, skb->sk); -consume_skb (skb); -return nskb; - }else { -kfree_skb (skb); -return NULL ; - } + nskb =skb_clone (skb,GFP_ATOMIC ); +if (unlikely (!nskb)) { +kfree_skb (skb); +return NULL ; } -/* we can assume to have an unshared skb with proper owner */ -return skb; +can_skb_set_owner (nskb, skb->sk); +consume_skb (skb); +return nskb; }#endif /* !_CAN_SKB_H */
include/linux/compiler-gcc.h +0 -2
@@ -170,5 +170,3 @@#else #define __diag_GCC_8 (s)#endif - -#define __no_fgcse __attribute__((optimize("-fno-gcse")))
include/linux/compiler_types.h +0 -4
@@ -212,10 +212,6 @@ struct ftrace_likely_data {#define asm_inline asm#endif -#ifndef __no_fgcse -# define __no_fgcse -#endif -/* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type (a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
include/linux/netfilter/nfnetlink.h +8 -1
@@ -24,6 +24,12 @@ struct nfnl_callback {const u_int16_t attr_count;/* number of nlattr's */ }; +enum nfnl_abort_action { +NFNL_ABORT_NONE =0 , +NFNL_ABORT_AUTOLOAD , +NFNL_ABORT_VALIDATE , +}; +struct nfnetlink_subsystem {const char *name;__u8 subsys_id;/* nfnetlink subsystem ID */
@@ -31,7 +37,8 @@ struct nfnetlink_subsystem {const struct nfnl_callback *cb;/* callback for individual types */ struct module *owner;int (*commit)(struct net *net,struct sk_buff *skb); -int (*abort)(struct net *net,struct sk_buff *skb,bool autoload); +int (*abort)(struct net *net,struct sk_buff *skb, +enum nfnl_abort_action action);void (*cleanup)(struct net *net);bool (*valid_genid)(struct net *net,u32 genid); };
include/linux/netfilter_ipv4.h +1 -1
@@ -16,7 +16,7 @@ struct ip_rt_info {u_int32_t mark; }; -int ip_route_me_harder (struct net *net,struct sk_buff *skb,unsigned addr_type); +int ip_route_me_harder (struct net *net,struct sock *sk,struct sk_buff *skb,unsigned addr_type);struct nf_queue_entry ;
include/linux/netfilter_ipv6.h +5 -5
@@ -42,7 +42,7 @@ struct nf_ipv6_ops {#if IS_MODULE (CONFIG_IPV6 )int (*chk_addr)(struct net *net,const struct in6_addr *addr,const struct net_device *dev,int strict); -int (*route_me_harder)(struct net *net,struct sk_buff *skb); +int (*route_me_harder)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*dev_get_saddr)(struct net *net,const struct net_device *dev,const struct in6_addr *daddr,unsigned int srcprefs,struct in6_addr *saddr);
@@ -143,9 +143,9 @@ static inline int nf_br_ip6_fragment(struct net *net, struct sock *sk,#endif } -int ip6_route_me_harder (struct net *net,struct sk_buff *skb); +int ip6_route_me_harder (struct net *net,struct sock *sk,struct sk_buff *skb); -static inline int nf_ip6_route_me_harder (struct net *net,struct sk_buff *skb) +static inline int nf_ip6_route_me_harder (struct net *net,struct sock *sk,struct sk_buff *skb) {#if IS_MODULE (CONFIG_IPV6 )const struct nf_ipv6_ops *v6_ops =nf_get_ipv6_ops ();
@@ -153,9 +153,9 @@ static inline int nf_ip6_route_me_harder(struct net *net, struct sk_buff *skb)if (!v6_ops)return -EHOSTUNREACH ; -return v6_ops->route_me_harder (net, skb); +return v6_ops->route_me_harder (net, sk, skb);#elif IS_BUILTIN (CONFIG_IPV6 ) -return ip6_route_me_harder (net, skb); +return ip6_route_me_harder (net, sk, skb);#else return -EHOSTUNREACH ;#endif
include/linux/prandom.h +34 -2
@@ -16,12 +16,44 @@ void prandom_bytes(void *buf, size_t nbytes);void prandom_seed (u32 seed);void prandom_reseed_late (void ); +#if BITS_PER_LONG ==64 +/* +* The core SipHash round function. Each line can be executed in +* parallel given enough CPU resources. +*/ +#define PRND_SIPROUND (v0, v1, v2, v3) ( \ + v0 += v1, v1 = rol64(v1, 13), v2 += v3, v3 = rol64(v3, 16), \ + v1 ^= v0, v0 = rol64(v0, 32), v3 ^= v2, \ + v0 += v3, v3 = rol64(v3, 21), v2 += v1, v1 = rol64(v1, 17), \ + v3 ^= v0, v1 ^= v2, v2 = rol64(v2, 32) \ +) + +#define PRND_K0 (0x736f6d6570736575 ^ 0x6c7967656e657261) +#define PRND_K1 (0x646f72616e646f6d ^ 0x7465646279746573) + +#elif BITS_PER_LONG ==32 +/* +* On 32-bit machines, we use HSipHash, a reduced-width version of SipHash. +* This is weaker, but 32-bit machines are not used for high-traffic +* applications, so there is less output for an attacker to analyze. +*/ +#define PRND_SIPROUND (v0, v1, v2, v3) ( \ + v0 += v1, v1 = rol32(v1, 5), v2 += v3, v3 = rol32(v3, 8), \ + v1 ^= v0, v0 = rol32(v0, 16), v3 ^= v2, \ + v0 += v3, v3 = rol32(v3, 7), v2 += v1, v1 = rol32(v1, 13), \ + v3 ^= v0, v1 ^= v2, v2 = rol32(v2, 16) \ +) +#define PRND_K0 0x6c796765 +#define PRND_K1 0x74656462 + +#else +#error Unsupported BITS_PER_LONG +#endif +struct rnd_state {__u32 s1, s2, s3, s4; }; -DECLARE_PER_CPU(struct rnd_state, net_rand_state); -u32 prandom_u32_state (struct rnd_state *state);void prandom_bytes_state (struct rnd_state *state,void *buf,size_t nbytes);void prandom_seed_full_state (struct rnd_state __percpu *pcpu_state);
include/linux/time64.h +4 -0
@@ -132,6 +132,10 @@ static inline bool timespec64_valid_settod(const struct timespec64 *ts)*/ static inline s64 timespec64_to_ns (const struct timespec64 *ts) { +/* Prevent multiplication overflow */ +if ((unsigned long long )ts->tv_sec >=KTIME_SEC_MAX ) +return KTIME_MAX ; +return ((s64 ) ts->tv_sec *NSEC_PER_SEC ) + ts->tv_nsec; }
include/trace/events/btrfs.h +6 -4
@@ -1159,25 +1159,27 @@ DEFINE_EVENT(btrfs__reserved_extent, btrfs_reserved_extent_free,TRACE_EVENT (find_free_extent, - TP_PROTO(const struct btrfs_fs_info *fs_info, u64 num_bytes, + TP_PROTO(const struct btrfs_root *root, u64 num_bytes, u64 empty_size, u64 data), -TP_ARGS (fs_info, num_bytes, empty_size, data), +TP_ARGS (root, num_bytes, empty_size, data),TP_STRUCT__entry_btrfs ( + __field( u64, root_objectid ) __field( u64, num_bytes ) __field( u64, empty_size )__field ( u64, data ) ), -TP_fast_assign_btrfs (fs_info, +TP_fast_assign_btrfs (root->fs_info, + __entry->root_objectid = root->root_key.objectid; __entry->num_bytes = num_bytes; __entry->empty_size = empty_size; __entry->data = data; ),TP_printk_btrfs ("root=%llu(%s) len=%llu empty_size=%llu flags=%llu(%s)" , -show_root_type (BTRFS_EXTENT_TREE_OBJECTID ), +show_root_type (__entry->root_objectid), __entry->num_bytes, __entry->empty_size, __entry->data,__print_flags ((unsigned long )__entry->data,"|" , BTRFS_GROUP_FLAGS))
include/trace/events/sunrpc.h +4 -4
@@ -357,10 +357,10 @@ TRACE_EVENT(rpc_xdr_overflow, __field(size_t, tail_len) __field(unsigned int, page_len) __field(unsigned int, len) - __string(progname, - xdr->rqst->rq_task->tk_client->cl_program->name) - __string(procedure, - xdr->rqst->rq_task->tk_msg.rpc_proc->p_name) + __string(progname, xdr->rqst ? + xdr->rqst->rq_task->tk_client->cl_program->name : "unknown") + __string(procedure, xdr->rqst ? + xdr->rqst->rq_task->tk_msg.rpc_proc->p_name : "unknown") ), TP_fast_assign(
kernel/bpf/Makefile +5 -1
@@ -1,6 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 obj-y := core.o -CFLAGS_core.o += $(call cc-disable-warning, override-init) +ifneq ($(CONFIG_BPF_JIT_ALWAYS_ON),y) +# ___bpf_prog_run() needs GCSE disabled on x86; see 3193c0836f203 for details +cflags-nogcse-$(CONFIG_X86)$(CONFIG_CC_IS_GCC) := -fno-gcse +endif +CFLAGS_core.o += $(call cc-disable-warning, override-init) $(cflags-nogcse-yy) obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o inode.o helpers.o tnum.o obj-$(CONFIG_BPF_SYSCALL) += hashtab.o arraymap.o percpu_freelist.o bpf_lru_list.o lpm_trie.o map_in_map.o
kernel/bpf/core.c +1 -1
@@ -1299,7 +1299,7 @@ bool bpf_opcode_in_insntable(u8 code)* * Decode and execute eBPF instructions. */ -static u64 __no_fgcse ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) +static u64 ___bpf_prog_run (u64 *regs,const struct bpf_insn *insn,u64 *stack) {#define BPF_INSN_2_LBL (x, y) [BPF_##x | BPF_##y] = &&x##_##y#define BPF_INSN_3_LBL (x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z
kernel/bpf/hashtab.c +28 -2
@@ -709,6 +709,32 @@ static void pcpu_copy_value(struct bpf_htab *htab, void __percpu *pptr, } } +static void pcpu_init_value (struct bpf_htab *htab,void __percpu *pptr, +void *value,bool onallcpus) +{ +/* When using prealloc and not setting the initial value on all cpus, +* zero-fill element values for other cpus (just as what happens when +* not using prealloc). Otherwise, bpf program has no way to ensure +* known initial values for cpus other than current one +* (onallcpus=false always when coming from bpf prog). +*/ +if (htab_is_prealloc (htab) && !onallcpus) { +u32 size =round_up (htab->map.value_size,8 ); +int current_cpu =raw_smp_processor_id (); +int cpu; + +for_each_possible_cpu (cpu) { +if (cpu == current_cpu) +bpf_long_memcpy (per_cpu_ptr (pptr, cpu), value, + size); +else +memset (per_cpu_ptr (pptr, cpu),0 , size); + } + }else { +pcpu_copy_value (htab, pptr, value, onallcpus); + } +} +static bool fd_htab_map_needs_adjust (const struct bpf_htab *htab) { return htab->map.map_type == BPF_MAP_TYPE_HASH_OF_MAPS &&
@@ -779,7 +805,7 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key, } } -pcpu_copy_value (htab, pptr, value, onallcpus); +pcpu_init_value (htab, pptr, value, onallcpus);if (!prealloc)htab_elem_set_ptr (l_new, key_size, pptr);
@@ -1075,7 +1101,7 @@ static int __htab_lru_percpu_map_update_elem(struct bpf_map *map, void *key,pcpu_copy_value (htab,htab_elem_get_ptr (l_old, key_size), value, onallcpus); }else { -pcpu_copy_value (htab,htab_elem_get_ptr (l_new, key_size), +pcpu_init_value (htab,htab_elem_get_ptr (l_new, key_size), value, onallcpus);hlist_nulls_add_head_rcu (&l_new->hash_node, head); l_new =NULL ;
kernel/dma/swiotlb.c +5 -1
@@ -230,6 +230,7 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) io_tlb_orig_addr[i] =INVALID_PHYS_ADDR ; } io_tlb_index =0 ; + no_iotlb_memory = false;if (verbose)swiotlb_print_info ();
@@ -261,9 +262,11 @@ swiotlb_init(int verbose)if (vstart && !swiotlb_init_with_tbl (vstart, io_tlb_nslabs, verbose))return ; -if (io_tlb_start) +if (io_tlb_start) {memblock_free_early (io_tlb_start,PAGE_ALIGN (io_tlb_nslabs <<IO_TLB_SHIFT )); + io_tlb_start =0 ; + }pr_warn ("Cannot allocate buffer" ); no_iotlb_memory = true; }
@@ -361,6 +364,7 @@ swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs) io_tlb_orig_addr[i] =INVALID_PHYS_ADDR ; } io_tlb_index =0 ; + no_iotlb_memory = false;swiotlb_print_info ();
kernel/events/core.c +4 -3
@@ -5596,11 +5596,11 @@ static void perf_pmu_output_stop(struct perf_event *event);static void perf_mmap_close (struct vm_area_struct *vma) {struct perf_event *event = vma->vm_file->private_data; -struct ring_buffer *rb =ring_buffer_get (event);struct user_struct *mmap_user = rb->mmap_user;int mmap_locked = rb->mmap_locked;unsigned long size =perf_data_size (rb); +bool detach_rest = false;if (event->pmu->event_unmapped) event->pmu->event_unmapped (event, vma->vm_mm);
@@ -5631,7 +5631,8 @@ static void perf_mmap_close(struct vm_area_struct *vma)mutex_unlock (&event->mmap_mutex); } -atomic_dec (&rb->mmap_count); +if (atomic_dec_and_test (&rb->mmap_count)) + detach_rest = true;if (!atomic_dec_and_mutex_lock (&event->mmap_count, &event->mmap_mutex)) goto out_put;
@@ -5640,7 +5641,7 @@ static void perf_mmap_close(struct vm_area_struct *vma)mutex_unlock (&event->mmap_mutex);/* If there's still other mmap()s of this buffer, we're done. */ -if (atomic_read (&rb->mmap_count)) +if (!detach_rest) goto out_put;/*
kernel/events/internal.h +1 -1
@@ -210,7 +210,7 @@ static inline int get_recursion_context(int *recursion) rctx =3 ; else if (in_irq()) rctx =2 ; - else if (in_softirq()) + else if (in_serving_softirq()) rctx =1 ; else rctx =0 ;
kernel/exit.c +4 -1
@@ -456,7 +456,10 @@ static void exit_mm(void)up_read (&mm->mmap_sem); self.task = current; - self.next =xchg (&core_state->dumper.next, &self); +if (self.task->flags &PF_SIGNALED ) + self.next =xchg (&core_state->dumper.next, &self); +else + self.task =NULL ;/* * Implies mb(), the result of xchg() must be visible * to core_state->dumper.
kernel/futex.c +3 -2
@@ -880,8 +880,9 @@ static void put_pi_state(struct futex_pi_state *pi_state)*/ if (pi_state->owner) {struct task_struct *owner; +unsigned long flags; -raw_spin_lock_irq (&pi_state->pi_mutex.wait_lock); +raw_spin_lock_irqsave (&pi_state->pi_mutex.wait_lock, flags); owner = pi_state->owner;if (owner) {raw_spin_lock (&owner->pi_lock);
@@ -889,7 +890,7 @@ static void put_pi_state(struct futex_pi_state *pi_state)raw_spin_unlock (&owner->pi_lock); }rt_mutex_proxy_unlock (&pi_state->pi_mutex, owner); -raw_spin_unlock_irq (&pi_state->pi_mutex.wait_lock); +raw_spin_unlock_irqrestore (&pi_state->pi_mutex.wait_lock, flags); }if (current->pi_state_cache) {
kernel/irq/Kconfig +1 -0
@@ -81,6 +81,7 @@ config IRQ_FASTEOI_HIERARCHY_HANDLERS # Generic IRQ IPI support config GENERIC_IRQ_IPI bool + select IRQ_DOMAIN_HIERARCHY # Generic MSI interrupt support config GENERIC_MSI_IRQ
kernel/reboot.c +14 -14
@@ -551,22 +551,22 @@ static int __init reboot_setup(char *str)break ;case 's' : - { -int rc;
Lines of this file are not shown. View the raw message.
lib/random32.c +283 -179
462 lines not on this page · raw message
net/wireless/core.c +31 -26
57 lines not on this page · raw message
sound/pci/hda/hda_intel.c +35 -28
63 lines not on this page · raw message
sound/soc/intel/boards/kbl_rt5663_max98927.c +31 -8
Lines of this file are not shown. View the raw message.
tools/perf/util/scripting-engines/trace-event-python.c +2 -5
Lines of this file are not shown. View the raw message.
tools/testing/selftests/bpf/prog_tests/map_init.c new file +214 -0
214 lines not on this page · raw message
tools/testing/selftests/bpf/progs/test_map_init.c new file +33 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_user.tc +4 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/pidfd/pidfd_open_test.c +0 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/pidfd/pidfd_poll_test.c +0 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/proc/proc-loadavg-001.c +0 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/proc/proc-self-syscall.c +0 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/proc/proc-uptime-002.c +0 -1
Lines of this file are not shown. View the 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.