Linux 5.15.53
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.53 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.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
------------
MAINTAINERS | 1 Makefile | 2 arch/arm/xen/p2m.c | 6 arch/powerpc/Kconfig | 4 arch/powerpc/include/asm/bpf_perf_event.h | 9 arch/powerpc/include/uapi/asm/bpf_perf_event.h | 9 arch/powerpc/kernel/prom_init_check.sh | 2 arch/powerpc/mm/mem.c | 33 + arch/powerpc/mm/nohash/book3e_pgtable.c | 6 arch/s390/Kconfig | 1 arch/s390/crypto/arch_random.c | 217 ------------- arch/s390/include/asm/archrandom.h | 14 arch/s390/kernel/setup.c | 5 drivers/acpi/acpi_video.c | 13 drivers/block/xen-blkfront.c | 56 ++- drivers/clocksource/timer-ixp4xx.c | 1 drivers/cpufreq/qoriq-cpufreq.c | 1 drivers/devfreq/event/exynos-ppmu.c | 8 drivers/fsi/fsi-occ.c | 54 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 3 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 1 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 drivers/gpu/drm/i915/gem/i915_gem_context.c | 5 drivers/gpu/drm/msm/msm_gem_submit.c | 2 drivers/hwmon/ibmaem.c | 12 drivers/hwmon/occ/common.c | 31 - drivers/hwmon/occ/common.h | 4 drivers/hwmon/occ/p8_i2c.c | 26 - drivers/hwmon/occ/p9_sbe.c | 9 drivers/infiniband/core/cm.c | 4 drivers/infiniband/hw/qedr/qedr.h | 1 drivers/infiniband/hw/qedr/verbs.c | 4 drivers/md/dm-raid.c | 34 +- drivers/md/raid5.c | 1 drivers/net/bonding/bond_3ad.c | 3 drivers/net/bonding/bond_alb.c | 2 drivers/net/caif/caif_virtio.c | 10 drivers/net/dsa/bcm_sf2.c | 5 drivers/net/dsa/hirschmann/hellcreek_ptp.c | 1 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 14 drivers/net/ethernet/smsc/epic100.c | 4 drivers/net/phy/ax88796b.c | 6 drivers/net/phy/dp83822.c | 4 drivers/net/phy/phy.c | 23 + drivers/net/phy/phy_device.c | 23 + drivers/net/tun.c | 15 drivers/net/usb/asix.h | 3 drivers/net/usb/asix_common.c | 1 drivers/net/usb/ax88179_178a.c | 101 ++++-- drivers/net/usb/qmi_wwan.c | 1 drivers/net/usb/usbnet.c | 4 drivers/net/virtio_net.c | 8 drivers/net/xen-netfront.c | 56 +++ drivers/nfc/nfcmrvl/i2c.c | 6 drivers/nfc/nfcmrvl/spi.c | 6 drivers/nfc/nxp-nci/i2c.c | 3 drivers/nvdimm/bus.c | 4 drivers/nvme/host/pci.c | 5 drivers/platform/x86/Kconfig | 2 drivers/platform/x86/panasonic-laptop.c | 84 ++++- drivers/vdpa/mlx5/net/mlx5_vnet.c | 2 fs/io_uring.c | 4 fs/ksmbd/smb2pdu.c | 43 +- fs/ksmbd/vfs.c | 12 fs/nfsd/vfs.c | 11 fs/read_write.c | 77 ++-- include/linux/dim.h | 2 include/linux/netdevice.h | 2 include/linux/phy.h | 6 include/uapi/drm/drm_fourcc.h | 4 net/ipv4/ip_tunnel_core.c | 2 net/ipv4/tcp_ipv4.c | 4 net/ipv6/addrconf.c | 8 net/ipv6/route.c | 9 net/ipv6/seg6_hmac.c | 1 net/ipv6/sit.c | 8 net/netfilter/nft_set_hash.c | 2 net/rose/rose_timer.c | 34 +- net/sched/act_api.c | 22 - net/sunrpc/xdr.c | 2 net/tipc/node.c | 41 +- tools/testing/selftests/bpf/test_verifier.c | 28 + tools/testing/selftests/net/mptcp/diag.sh | 48 ++ tools/testing/selftests/net/udpgso_bench.sh | 2 tools/testing/selftests/rseq/Makefile | 2 tools/testing/selftests/rseq/basic_percpu_ops_test.c | 5 tools/testing/selftests/rseq/compiler.h | 30 + tools/testing/selftests/rseq/param_test.c | 8 tools/testing/selftests/rseq/rseq-abi.h | 151 +++++++++ tools/testing/selftests/rseq/rseq-arm.h | 110 +++--- tools/testing/selftests/rseq/rseq-arm64.h | 79 +++- tools/testing/selftests/rseq/rseq-generic-thread-pointer.h | 25 + tools/testing/selftests/rseq/rseq-mips.h | 71 +--- tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h | 30 + tools/testing/selftests/rseq/rseq-ppc.h | 128 +++++-- tools/testing/selftests/rseq/rseq-s390.h | 55 ++- tools/testing/selftests/rseq/rseq-skip.h | 2 tools/testing/selftests/rseq/rseq-thread-pointer.h | 19 + tools/testing/selftests/rseq/rseq-x86-thread-pointer.h | 40 ++ tools/testing/selftests/rseq/rseq-x86.h | 200 ++++++++--- tools/testing/selftests/rseq/rseq.c | 165 ++++----- tools/testing/selftests/rseq/rseq.h | 30 + 102 files changed, 1595 insertions(+), 905 deletions(-)
Alex Deucher (1):
Revert "drm/amdgpu/display: set vblank_disable_immediate for DC"
Alexey Khoroshilov (1):
NFSD: restore EINVAL error translation in nfsd_commit()
Amir Goldstein (1):
vfs: fix copy_file_range() regression in cross-fs copies
Aneesh Kumar K.V (1):
powerpc/memhotplug: Add add_pages override for PPC
Carlos Llamas (1):
drm/fourcc: fix integer type usage in uapi header
Chris Ye (1):
nvdimm: Fix badblocks clear off-by-one error
Christophe Leroy (1):
powerpc/book3e: Fix PUD allocation size in map_kernel_page()
Chuck Lever (1):
SUNRPC: Fix READ_PLUS crasher
Dan Carpenter (1):
net: fix IFF_TX_SKB_NO_LINEAR definition
Daniele Palmas (1):
net: usb: qmi_wwan: add Telit 0x1070 composition
Dimitris Michailidis (1):
selftests/net: pass ipv6_args to udpgso_bench's IPv6 TCP test
Doug Berger (1):
net: dsa: bcm_sf2: force pause link settings
Duoming Zhou (1):
net: rose: fix UAF bugs caused by timer handler
Eddie James (3):
fsi: occ: Force sequence numbering per OCC
hwmon: (occ) Remove sequence numbering and checksum calculation
hwmon: (occ) Prevent power cap command overwriting poll response
Eli Cohen (1):
vdpa/mlx5: Update Control VQ callback information
Enguerrand de Ribaucourt (2):
net: dp83822: disable false carrier interrupt
net: dp83822: disable rx error interrupt
Eric Dumazet (4):
net: bonding: fix possible NULL deref in rlb code
tunnels: do not assume mac header is set in skb_tunnel_check_pmtu()
ipv6: fix lockdep splat in in6_dump_addrs()
tcp: add a missing nf_reset_ct() in 3WHS handling
Greg Kroah-Hartman (2):
clocksource/drivers/ixp4xx: remove EXPORT_SYMBOL_GPL from ixp4xx_timer_setup() Linux 5.15.53
Hans de Goede (5):
ACPI: video: Change how we determine if brightness key-presses are handled platform/x86: panasonic-laptop: sort includes alphabetically platform/x86: panasonic-laptop: revert "Resolve hotkey double trigger bug" platform/x86: panasonic-laptop: don't report duplicate brightness key-presses platform/x86: panasonic-laptop: filter out duplicate volume up/down/mute keypresses
Heinz Mauelshagen (1):
dm raid: fix accesses beyond end of raid member array
Jakub Kicinski (3):
net: tun: unlink NAPI from device on destruction
net: tun: stop NAPI when detaching queues
net: tun: avoid disabling NAPI twice
Jan Beulich (1):
xen-netfront: restore __skb_queue_tail() positioning in xennet_get_responses()
Jason A. Donenfeld (2):
ksmbd: use vfs_llseek instead of dereferencing NULL s390/archrandom: simplify back to earlier design and initialize earlier
Jason Wang (2):
virtio-net: fix race between ndo_open() and virtio_device_ready()
caif_virtio: fix race between virtio_device_ready() and ndo_open()
Jens Axboe (1):
io_uring: ensure that send/sendmsg and recv/recvmsg check sqe->ioprio
Jose Alonso (1):
net: usb: ax88179_178a: Fix packet receiving
Kamal Heib (1):
RDMA/qedr: Fix reporting QP timeout attribute
Krzysztof Kozlowski (1):
nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
Kumar Kartikeya Dwivedi (1):
selftests/bpf: Add test_verifier support to fixup kfunc call insns
Lamarque Vieira Souza (1):
nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA IM2P33F8ABR1
Leah Rumancik (1):
MAINTAINERS: add Leah as xfs maintainer for 5.15.y
Liam Howlett (1):
powerpc/prom_init: Fix kernel config grep
Liang He (2):
net/dsa/hirschmann: Add missing of_node_get() in hellcreek_led_setup()
drivers: cpufreq: Add missing of_node_put() in qoriq-cpufreq.c
Lukas Wunner (1):
net: phy: Don't trigger state machine while in suspend
Masahiro Yamada (1):
s390: remove unneeded 'select BUILD_BIN2C'
Mathieu Desnoyers (15):
selftests/rseq: introduce own copy of rseq uapi header selftests/rseq: Remove useless assignment to cpu variable selftests/rseq: Remove volatile from __rseq_abi
selftests/rseq: Introduce rseq_get_abi() helper
selftests/rseq: Introduce thread pointer getters
selftests/rseq: Uplift rseq selftests for compatibility with glibc-2.35 selftests/rseq: Fix ppc32: wrong rseq_cs 32-bit field pointer on big endian selftests/rseq: Fix ppc32 missing instruction selection "u" and "x" for load/store selftests/rseq: Fix ppc32 offsets by using long rather than off_t selftests/rseq: Fix warnings about #if checks of undefined tokens selftests/rseq: Remove arm/mips asm goto compiler work-around selftests/rseq: Fix: work-around asm goto compiler bugs selftests/rseq: x86-64: use %fs segment selector for accessing rseq thread area selftests/rseq: x86-32: use %gs segment selector for accessing rseq thread area selftests/rseq: Change type of rseq_offset to ptrdiff_t
Miaoqian Lin (2):
RDMA/cm: Fix memory leak in ib_cm_insert_listen
PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events
Michael Walle (1):
NFC: nxp-nci: Don't issue a zero length i2c_master_read()
Mikulas Patocka (1):
dm raid: fix KASAN warning in raid5_add_disks
Namjae Jeon (2):
ksmbd: set the range of bytes to zero without extending file size in FSCTL_ZERO_DATA
ksmbd: check invalid FileOffset and BeyondFinalZero in FSCTL_ZERO_DATA
Naveen N. Rao (1):
powerpc/bpf: Fix use of user_pt_regs in uapi
Nicolas Dichtel (1):
ipv6: take care of disable_policy when restoring routes
Oleksandr Tyshchenko (1):
xen/arm: Fix race in RB-tree based P2M accounting
Oleksij Rempel (3):
net: usb: asix: do not force pause frames support
net: asix: fix "can't send until first packet is send" issue
net: phy: ax88772a: fix lost pause advertisement configuration
Oliver Neukum (1):
usbnet: fix memory allocation in helpers
Pablo Greco (1):
nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA XPG SX6000LNP (AKA SPECTRIX S40G)
Pablo Neira Ayuso (1):
netfilter: nft_dynset: restore set element counter when failing to update
Paolo Abeni (1):
selftests: mptcp: more stable diag tests
Petr Machata (1):
mlxsw: spectrum_router: Fix rollback in tunnel next hop init
Rob Clark (1):
drm/msm/gem: Fix error return on fence id alloc fail
Roger Pau Monne (4):
xen/blkfront: fix leaking data in shared pages xen/netfront: fix leaking data in shared pages xen/netfront: force data bouncing when backend is untrusted xen/blkfront: force data bouncing when backend is untrusted
Ruili Ji (1):
drm/amdgpu: To flush tlb for MMHUB of RAVEN series
Shuah Khan (1):
selftests/rseq: remove ARRAY_SIZE define from individual tests
Stefan Seyfried (1):
platform/x86: panasonic-laptop: de-obfuscate button codes
Tao Liu (1):
linux/dim: Fix divide by 0 in RDMA DIM
Tong Zhang (1):
epic100: fix use after free on rmmod
Victor Nogueira (1):
net/sched: act_api: Notify user space if any actions were flushed before error
Xin Long (1):
tipc: move bc link creation back to tipc_node_create
Yang Yingliang (1):
hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
Yevhen Orlov (1):
net: bonding: fix use-after-free after 802.3ad slave unbind
YueHaibing (1):
net: ipv6: unexport __init-annotated seg6_hmac_net_init()
katrinzhou (2):
ipv6/sit: fix ipip6_tunnel_get_prl return value drm/i915/gem: add missing else
Greg Kroah-Hartman
maintainerMAINTAINERS +1 -0
@@ -20579,6 +20579,7 @@ F: drivers/xen/*swiotlb* XFS FILESYSTEM C: irc://irc.oftc.net/xfs +M: Leah Rumancik <[email protected]> M: Darrick J. Wong <[email protected]> M: [email protected] L: [email protected]
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 52 +SUBLEVEL = 53 EXTRAVERSION = NAME = Trick or Treat
arch/arm/xen/p2m.c +4 -2
@@ -63,11 +63,12 @@ static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)unsigned long __pfn_to_mfn (unsigned long pfn) { -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;struct xen_p2m_entry *entry;unsigned long irqflags;read_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (entry->pfn <= pfn &&
@@ -152,10 +153,11 @@ bool __set_phys_to_machine_multi(unsigned long pfn,int rc;unsigned long irqflags;struct xen_p2m_entry *p2m_entry; -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;if (mfn ==INVALID_P2M_ENTRY ) {write_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (p2m_entry->pfn <= pfn &&
arch/powerpc/Kconfig +4 -0
@@ -353,6 +353,10 @@ config ARCH_SUSPEND_NONZERO_CPU def_bool y depends on PPC_POWERNV || PPC_PSERIES +config ARCH_HAS_ADD_PAGES + def_bool y + depends on ARCH_ENABLE_MEMORY_HOTPLUG + config PPC_DCR_NATIVE bool
arch/powerpc/include/asm/bpf_perf_event.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_POWERPC_BPF_PERF_EVENT_H +#define _ASM_POWERPC_BPF_PERF_EVENT_H + +#include <asm/ptrace.h> + +typedef struct user_pt_regs bpf_user_pt_regs_t ; + +#endif /* _ASM_POWERPC_BPF_PERF_EVENT_H */
arch/powerpc/include/uapi/asm/bpf_perf_event.h deleted +0 -9
@@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ -#define _UAPI__ASM_BPF_PERF_EVENT_H__ - -#include <asm/ptrace.h> - -typedef struct user_pt_regs bpf_user_pt_regs_t ; - -#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
arch/powerpc/kernel/prom_init_check.sh +1 -1
@@ -13,7 +13,7 @@ # If you really need to reference something from prom_init.o add # it to the list below: -grep "^CONFIG_KASAN=y$" .config >/dev/null +grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null if [ $? -eq 0 ] then MEM_FUNCS="__memcpy __memset"
arch/powerpc/mm/mem.c +32 -1
@@ -104,6 +104,37 @@ void __ref arch_remove_linear_mapping(u64 start, u64 size)vm_unmap_aliases (); } +/* +* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need +* updating. +*/ +static void update_end_of_memory_vars (u64 start,u64 size) +{ +unsigned long end_pfn =PFN_UP (start + size); + +if (end_pfn > max_pfn) { + max_pfn = end_pfn; + max_low_pfn = end_pfn; + high_memory = (void *)__va (max_pfn *PAGE_SIZE -1 ) +1 ; + } +} + +int __ref add_pages (int nid,unsigned long start_pfn,unsigned long nr_pages, +struct mhp_params *params) +{ +int ret; + + ret =__add_pages (nid, start_pfn, nr_pages, params); +if (ret) +return ret; + +/* update max_pfn, max_low_pfn and high_memory */ +update_end_of_memory_vars (start_pfn <<PAGE_SHIFT , + nr_pages <<PAGE_SHIFT ); + +return ret; +} +int __ref arch_add_memory (int nid,u64 start,u64 size,struct mhp_params *params) {
@@ -114,7 +145,7 @@ int __ref arch_add_memory(int nid, u64 start, u64 size, rc =arch_create_linear_mapping (nid, start, size, params);if (rc)return rc; - rc =__add_pages (nid, start_pfn, nr_pages, params); + rc =add_pages (nid, start_pfn, nr_pages, params);if (rc)arch_remove_linear_mapping (start, size);return rc;
arch/powerpc/mm/nohash/book3e_pgtable.c +3 -3
@@ -95,8 +95,8 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot) pgdp =pgd_offset_k (ea); p4dp =p4d_offset (pgdp, ea);if (p4d_none (*p4dp)) { - pmdp =early_alloc_pgtable (PMD_TABLE_SIZE ); -p4d_populate (&init_mm, p4dp, pmdp); + pudp =early_alloc_pgtable (PUD_TABLE_SIZE ); +p4d_populate (&init_mm, p4dp, pudp); } pudp =pud_offset (p4dp, ea);if (pud_none (*pudp)) {
@@ -105,7 +105,7 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot) } pmdp =pmd_offset (pudp, ea);if (!pmd_present (*pmdp)) { - ptep =early_alloc_pgtable (PAGE_SIZE ); + ptep =early_alloc_pgtable (PTE_TABLE_SIZE );pmd_populate_kernel (&init_mm, pmdp, ptep); } ptep =pte_offset_kernel (pmdp, ea);
arch/s390/Kconfig +0 -1
@@ -516,7 +516,6 @@ config KEXEC config KEXEC_FILE bool "kexec file based system call" select KEXEC_CORE - select BUILD_BIN2C depends on CRYPTO depends on CRYPTO_SHA256 depends on CRYPTO_SHA256_S390
arch/s390/crypto/arch_random.c +0 -217
232 lines not on this page · raw message
arch/s390/include/asm/archrandom.h +7 -7
@@ -15,17 +15,13 @@#include <linux/static_key.h> #include <linux/atomic.h> +#include <asm/cpacf.h> DECLARE_STATIC_KEY_FALSE (s390_arch_random_available);extern atomic64_t s390_arch_random_counter; -bool s390_arch_get_random_long (unsigned long *v); -bool s390_arch_random_generate (u8 *buf,unsigned int nbytes); -static inline bool __must_check arch_get_random_long (unsigned long *v) { -if (static_branch_likely (&s390_arch_random_available)) -return s390_arch_get_random_long (v);return false; }
@@ -37,7 +33,9 @@ static inline bool __must_check arch_get_random_int(unsigned int *v)static inline bool __must_check arch_get_random_seed_long (unsigned long *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; }
@@ -45,7 +43,9 @@ static inline bool __must_check arch_get_random_seed_long(unsigned long *v)static inline bool __must_check arch_get_random_seed_int (unsigned int *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; }
arch/s390/kernel/setup.c +5 -0
@@ -880,6 +880,11 @@ static void __init setup_randomness(void)if (stsi (vmms,3 ,2 ,2 ) ==0 && vmms->count)add_device_randomness (&vmms->vm,sizeof (vmms->vm[0 ]) * vmms->count);memblock_free ((unsigned long ) vmms,PAGE_SIZE ); + +#ifdef CONFIG_ARCH_RANDOM +if (cpacf_query_func (CPACF_PRNO ,CPACF_PRNO_TRNG )) +static_branch_enable (&s390_arch_random_available); +#endif }/*
drivers/acpi/acpi_video.c +6 -7
@@ -73,6 +73,7 @@ module_param(device_id_scheme, bool, 0444);static int only_lcd =-1 ;module_param (only_lcd, int,0444 ); +static bool has_backlight;static int register_count;static DEFINE_MUTEX (register_count_mutex);static DEFINE_MUTEX (video_list_lock);
@@ -1222,6 +1223,9 @@ acpi_video_bus_get_one_device(struct acpi_device *device,acpi_video_device_bind (video, data);acpi_video_device_find_cap (data); +if (data->cap._BCM && data->cap._BCL) + has_backlight = true; +mutex_lock (&video->device_list_lock);list_add_tail (&data->entry, &video->video_device_list);mutex_unlock (&video->device_list_lock);
@@ -2251,6 +2255,7 @@ void acpi_video_unregister(void)if (register_count) {acpi_bus_unregister_driver (&acpi_video_bus); register_count =0 ; + has_backlight = false; }mutex_unlock (®ister_count_mutex); }
@@ -2272,13 +2277,7 @@ void acpi_video_unregister_backlight(void)bool acpi_video_handles_brightness_key_presses (void ) { -bool have_video_busses; - -mutex_lock (&video_list_lock); - have_video_busses = !list_empty (&video_bus_head); -mutex_unlock (&video_list_lock); - -return have_video_busses && +return has_backlight && (report_key_events &REPORT_BRIGHTNESS_KEY_EVENTS ); }EXPORT_SYMBOL (acpi_video_handles_brightness_key_presses);
drivers/block/xen-blkfront.c +38 -18
174 lines not on this page · raw message
drivers/clocksource/timer-ixp4xx.c +0 -1
@@ -282,7 +282,6 @@ void __init ixp4xx_timer_setup(resource_size_t timerbase, }ixp4xx_timer_register (base, timer_irq, timer_freq); } -EXPORT_SYMBOL_GPL (ixp4xx_timer_setup);#ifdef CONFIG_OF static __init int ixp4xx_of_timer_init (struct device_node *np)
drivers/cpufreq/qoriq-cpufreq.c +1 -0
@@ -275,6 +275,7 @@ static int qoriq_cpufreq_probe(struct platform_device *pdev) np =of_find_matching_node (NULL , qoriq_cpufreq_blacklist);if (np) { +of_node_put (np);dev_info (&pdev->dev,"Disabling due to erratum A-008083" );return -ENODEV ; }
drivers/devfreq/event/exynos-ppmu.c +6 -2
@@ -514,15 +514,19 @@ static int of_get_devfreq_events(struct device_node *np, count =of_get_child_count (events_np); desc =devm_kcalloc (dev, count,sizeof (*desc),GFP_KERNEL ); -if (!desc) +if (!desc) { +of_node_put (events_np);return -ENOMEM ; + } info->num_events = count; of_id =of_match_device (exynos_ppmu_id_match, dev);if (of_id) info->ppmu_type = (enum exynos_ppmu_type )of_id->data; -else +else { +of_node_put (events_np);return -EINVAL ; + } j =0 ;for_each_child_of_node (events_np, node) {
drivers/fsi/fsi-occ.c +37 -17
117 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +2 -1
@@ -768,7 +768,8 @@ int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct kgd_dev *kgd, uint16_t pasid,struct amdgpu_device *adev = (struct amdgpu_device *)kgd;bool all_hub = false; -if (adev->family ==AMDGPU_FAMILY_AI ) +if (adev->family ==AMDGPU_FAMILY_AI || + adev->family ==AMDGPU_FAMILY_RV ) all_hub = true;return amdgpu_gmc_flush_gpu_tlb_pasid (adev, pasid, flush_type, all_hub);
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +1 -0
@@ -333,6 +333,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev)if (!amdgpu_device_has_dc_support (adev)) {if (!adev->enable_virtual_display)/* Disable vblank IRQs aggressively for power-saving */ +/* XXX: can this be enabled for DC? */ adev_to_drm (adev)->vblank_disable_immediate = true; r =drm_vblank_init (adev_to_drm (adev), adev->mode_info.num_crtc);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +0 -3
@@ -3838,9 +3838,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) }#endif -/* Disable vblank IRQs aggressively for power-saving. */ -adev_to_drm (adev)->vblank_disable_immediate = true; -/* loops over all connectors on the board */ for (i =0 ; i < link_cnt; i++) {struct dc_link *link =NULL ;
drivers/gpu/drm/i915/gem/i915_gem_context.c +3 -2
@@ -720,8 +720,9 @@ static int set_proto_ctx_param(struct drm_i915_file_private *fpriv,case I915_CONTEXT_PARAM_PERSISTENCE :if (args->size) ret = -EINVAL ; - ret =proto_context_set_persistence (fpriv->dev_priv, pc, - args->value); +else + ret =proto_context_set_persistence (fpriv->dev_priv, pc, + args->value);break ;case I915_CONTEXT_PARAM_NO_ZEROMAP :
drivers/gpu/drm/msm/msm_gem_submit.c +1 -1
@@ -889,7 +889,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, submit->fence_id =idr_alloc_cyclic (&queue->fence_idr, submit->user_fence,1 ,INT_MAX ,GFP_KERNEL );if (submit->fence_id <0 ) { - ret = submit->fence_id =0 ; + ret = submit->fence_id; submit->fence_id =0 ; goto out; }
drivers/hwmon/ibmaem.c +8 -4
@@ -550,7 +550,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -598,7 +598,9 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
@@ -690,7 +692,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -738,7 +740,9 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
drivers/hwmon/occ/common.c +13 -18
@@ -132,22 +132,20 @@ struct extended_sensor {static int occ_poll (struct occ *occ) {int rc; -u16 checksum = occ->poll_cmd_data + occ->seq_no +1 ; -u8 cmd[8 ]; +u8 cmd[7 ];struct occ_poll_response_header *header;/* big endian */ - cmd[0 ] = occ->seq_no++;/* sequence number */ + cmd[0 ] =0 ;/* sequence number */ cmd[1 ] =0 ;/* cmd type */ cmd[2 ] =0 ;/* data length msb */ cmd[3 ] =1 ;/* data length lsb */ cmd[4 ] = occ->poll_cmd_data;/* data */ - cmd[5 ] = checksum >>8 ;/* checksum msb */ - cmd[6 ] = checksum &0xFF ;/* checksum lsb */ - cmd[7 ] =0 ; + cmd[5 ] =0 ;/* checksum msb */ + cmd[6 ] =0 ;/* checksum lsb */ /* mutex should already be locked if necessary */ - rc = occ->send_cmd (occ, cmd); + rc = occ->send_cmd (occ, cmd,sizeof (cmd), &occ->resp,sizeof (occ->resp));if (rc) { occ->last_error = rc;if (occ->error_count++ >OCC_ERROR_COUNT_THRESHOLD )
@@ -184,25 +182,24 @@ static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap) {int rc;u8 cmd[8 ]; -u16 checksum =0x24 ; +u8 resp[8 ];__be16 user_power_cap_be =cpu_to_be16 (user_power_cap); - cmd[0 ] =0 ; - cmd[1 ] =0x22 ; - cmd[2 ] =0 ; - cmd[3 ] =2 ; + cmd[0 ] =0 ;/* sequence number */ + cmd[1 ] =0x22 ;/* cmd type */ + cmd[2 ] =0 ;/* data length msb */ + cmd[3 ] =2 ;/* data length lsb */ memcpy (&cmd[4 ], &user_power_cap_be,2 ); - checksum += cmd[4 ] + cmd[5 ]; - cmd[6 ] = checksum >>8 ; - cmd[7 ] = checksum &0xFF ; + cmd[6 ] =0 ;/* checksum msb */ + cmd[7 ] =0 ;/* checksum lsb */ rc =mutex_lock_interruptible (&occ->lock);if (rc)return rc; - rc = occ->send_cmd (occ, cmd); + rc = occ->send_cmd (occ, cmd,sizeof (cmd), resp,sizeof (resp));mutex_unlock (&occ->lock);
@@ -1144,8 +1141,6 @@ int occ_setup(struct occ *occ, const char *name) {int rc; -/* start with 1 to avoid false match with zero-initialized SRAM buffer */ - occ->seq_no =1 ;mutex_init (&occ->lock); occ->groups[0 ] = &occ->group;
drivers/hwmon/occ/common.h +2 -2
@@ -95,9 +95,9 @@ struct occ {struct occ_sensors sensors;int powr_sample_time_us;/* average power sample time */ -u8 seq_no;u8 poll_cmd_data;/* to perform OCC poll command */ -int (*send_cmd)(struct occ *occ,u8 *cmd); +int (*send_cmd)(struct occ *occ,u8 *cmd,size_t len,void *resp, +size_t resp_len);unsigned long next_update;struct mutex lock;/* lock OCC access */
drivers/hwmon/occ/p8_i2c.c +15 -11
@@ -97,18 +97,22 @@ static int p8_i2c_occ_putscom_u32(struct i2c_client *client, u32 address, }static int p8_i2c_occ_putscom_be (struct i2c_client *client,u32 address, -u8 *data) +u8 *data,size_t len) { -__be32 data0, data1; +__be32 data0 =0 , data1 =0 ; -memcpy (&data0, data,4 ); -memcpy (&data1, data +4 ,4 ); +memcpy (&data0, data,min_t (size_t, len,4 )); +if (len >4 ) { + len -=4 ; +memcpy (&data1, data +4 ,min_t (size_t, len,4 )); + }return p8_i2c_occ_putscom_u32 (client, address,be32_to_cpu (data0),be32_to_cpu (data1)); } -static int p8_i2c_occ_send_cmd (struct occ *occ,u8 *cmd) +static int p8_i2c_occ_send_cmd (struct occ *occ,u8 *cmd,size_t len, +void *resp,size_t resp_len) {int i, rc;unsigned long start;
@@ -117,7 +121,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd)const long wait_time =msecs_to_jiffies (OCC_CMD_IN_PRG_WAIT_MS );struct p8_i2c_occ *ctx =to_p8_i2c_occ (occ);struct i2c_client *client = ctx->client; -struct occ_response *resp = &occ->resp; +struct occ_response *or = (struct occ_response *)resp; start = jiffies;
@@ -127,7 +131,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd)return rc;/* write command (expected to already be BE), we need bus-endian... */ - rc =p8_i2c_occ_putscom_be (client,OCB_DATA3 , cmd); + rc =p8_i2c_occ_putscom_be (client,OCB_DATA3 , cmd, len);if (rc)return rc;
@@ -148,7 +152,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd)return rc;/* wait for OCC */ -if (resp->return_status ==OCC_RESP_CMD_IN_PRG ) { +if (or->return_status ==OCC_RESP_CMD_IN_PRG ) { rc = -EALREADY ;if (time_after (jiffies, start + timeout))
@@ -160,7 +164,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd) }while (rc);/* check the OCC response */ -switch (resp->return_status) { +switch (or->return_status) {case OCC_RESP_CMD_IN_PRG : rc = -ETIMEDOUT ;break ;
@@ -189,8 +193,8 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd)if (rc <0 )return rc; - data_length =get_unaligned_be16 (&resp->data_length); -if (data_length >OCC_RESP_DATA_BYTES ) + data_length =get_unaligned_be16 (&or->data_length); +if ((data_length +7 ) > resp_len)return -EMSGSIZE ;/* fetch the rest of the response data */
drivers/hwmon/occ/p9_sbe.c +4 -5
@@ -16,18 +16,17 @@ struct p9_sbe_occ {#define to_p9_sbe_occ (x) container_of((x), struct p9_sbe_occ, occ) -static int p9_sbe_occ_send_cmd (struct occ *occ,u8 *cmd) +static int p9_sbe_occ_send_cmd (struct occ *occ,u8 *cmd,size_t len, +void *resp,size_t resp_len) { -struct occ_response *resp = &occ->resp;struct p9_sbe_occ *ctx =to_p9_sbe_occ (occ); -size_t resp_len =sizeof (*resp);int rc; - rc =fsi_occ_submit (ctx->sbe, cmd,8 , resp, &resp_len); + rc =fsi_occ_submit (ctx->sbe, cmd, len, resp, &resp_len);if (rc <0 )return rc; -switch (resp->return_status) { +switch (((struct occ_response *)resp)->return_status) {case OCC_RESP_CMD_IN_PRG : rc = -ETIMEDOUT ;break ;
drivers/infiniband/core/cm.c +3 -1
@@ -1252,8 +1252,10 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,return ERR_CAST (cm_id_priv); err =cm_init_listen (cm_id_priv, service_id,0 ); -if (err) +if (err) { +ib_destroy_cm_id (&cm_id_priv->id);return ERR_PTR (err); + }spin_lock_irq (&cm_id_priv->lock); listen_id_priv =cm_insert_listen (cm_id_priv, cm_handler);
drivers/infiniband/hw/qedr/qedr.h +1 -0
@@ -418,6 +418,7 @@ struct qedr_qp {u32 sq_psn;u32 qkey;u32 dest_qp_num; +u8 timeout;/* Relevant to qps created from kernel space only (ULPs) */ u8 prev_wqe_size;
drivers/infiniband/hw/qedr/verbs.c +3 -1
@@ -2622,6 +2622,8 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,1 <<max_t (int, attr->timeout -8 ,0 ); else qp_params.ack_timeout = 0; + + qp->timeout = attr->timeout; }if (attr_mask &IB_QP_RETRY_CNT ) {
@@ -2781,7 +2783,7 @@ int qedr_query_qp(struct ib_qp *ibqp,rdma_ah_set_dgid_raw (&qp_attr->ah_attr, ¶ms.dgid.bytes[0 ]);rdma_ah_set_port_num (&qp_attr->ah_attr,1 );rdma_ah_set_sl (&qp_attr->ah_attr,0 ); - qp_attr->timeout = params.timeout; + qp_attr->timeout = qp->timeout; qp_attr->rnr_retry = params.rnr_retry; qp_attr->retry_cnt = params.retry_cnt; qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
drivers/md/dm-raid.c +18 -16
@@ -1001,12 +1001,13 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)static int validate_raid_redundancy (struct raid_set *rs) {unsigned int i, rebuild_cnt =0 ; -unsigned int rebuilds_per_group =0 , copies; +unsigned int rebuilds_per_group =0 , copies, raid_disks;unsigned int group_size, last_group_start; -for (i =0 ; i < rs->md.raid_disks; i++) -if (!test_bit (In_sync, &rs->dev[i].rdev.flags) || - !rs->dev[i].rdev.sb_page) +for (i =0 ; i < rs->raid_disks; i++) +if (!test_bit (FirstUse, &rs->dev[i].rdev.flags) && + ((!test_bit (In_sync, &rs->dev[i].rdev.flags) || + !rs->dev[i].rdev.sb_page))) rebuild_cnt++;switch (rs->md.level) {
@@ -1046,8 +1047,9 @@ static int validate_raid_redundancy(struct raid_set *rs)* A A B B C * C D D E E */ + raid_disks =min (rs->raid_disks, rs->md.raid_disks);if (__is_raid10_near (rs->md.new_layout)) { -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1070,10 +1072,10 @@ static int validate_raid_redundancy(struct raid_set *rs)* results in the need to treat the last (potentially larger) * set differently. */ - group_size = (rs->md.raid_disks / copies); - last_group_start = (rs->md.raid_disks / group_size) -1 ; + group_size = (raid_disks / copies); + last_group_start = (raid_disks / group_size) -1 ; last_group_start *= group_size; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies) && !(i > last_group_start)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1588,7 +1590,7 @@ static sector_t __rdev_sectors(struct raid_set *rs) {int i; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < rs->raid_disks; i++) {struct md_rdev *rdev = &rs->dev[i].rdev; if (!test_bit(Journal, &rdev->flags) &&
@@ -3771,13 +3773,13 @@ static int raid_iterate_devices(struct dm_target *ti,unsigned int i;int r =0 ; -for (i =0 ; !r && i < rs->md.raid_disks; i++) -if (rs->dev[i].data_dev) - r =fn (ti, - rs->dev[i].data_dev, -0 ,/* No offset on data devs */ - rs->md.dev_sectors, - data); +for (i =0 ; !r && i < rs->raid_disks; i++) { +if (rs->dev[i].data_dev) { + r =fn (ti, rs->dev[i].data_dev, +0 ,/* No offset on data devs */ + rs->md.dev_sectors, data); + } + }return r; }
drivers/md/raid5.c +1 -0
@@ -8026,6 +8026,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)*/ if (rdev->saved_raid_disk >=0 && rdev->saved_raid_disk >= first && + rdev->saved_raid_disk <= last && conf->disks[rdev->saved_raid_disk].rdev ==NULL ) first = rdev->saved_raid_disk;
drivers/net/bonding/bond_3ad.c +2 -1
@@ -2228,7 +2228,8 @@ void bond_3ad_unbind_slave(struct slave *slave) temp_aggregator->num_of_ports--;if (__agg_active_ports (temp_aggregator) ==0 ) { select_new_active_agg = temp_aggregator->is_active; -ad_clear_agg (temp_aggregator); +if (temp_aggregator->num_of_ports ==0 ) +ad_clear_agg (temp_aggregator);if (select_new_active_agg) {slave_info (bond->dev, slave->dev,"Removing an active aggregator\n" );/* select new active aggregator */
drivers/net/bonding/bond_alb.c +1 -1
@@ -1281,12 +1281,12 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)return res;if (rlb_enabled) { - bond->alb_info.rlb_enabled =1 ; res =rlb_initialize (bond);if (res) {tlb_deinitialize (bond);return res; } + bond->alb_info.rlb_enabled =1 ; }else { bond->alb_info.rlb_enabled =0 ; }
drivers/net/caif/caif_virtio.c +9 -1
@@ -721,13 +721,21 @@ static int cfv_probe(struct virtio_device *vdev)/* Carrier is off until netdevice is opened */ netif_carrier_off (netdev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); +/* register Netdev */ - err =register_netdev (netdev); + err =register_netdevice (netdev);if (err) { +rtnl_unlock ();dev_err (&vdev->dev,"Unable to register netdev (%d)\n" , err); goto err; } +virtio_device_ready (vdev); + +rtnl_unlock (); +debugfs_init (cfv);return 0 ;
drivers/net/dsa/bcm_sf2.c +5 -0
@@ -865,6 +865,11 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,if (duplex ==DUPLEX_FULL ) reg |=DUPLX_MODE ; +if (tx_pause) + reg |=TXFLOW_CNTL ; +if (rx_pause) + reg |=RXFLOW_CNTL ; +core_writel (priv, reg, offset); }
drivers/net/dsa/hirschmann/hellcreek_ptp.c +1 -0
@@ -300,6 +300,7 @@ static int hellcreek_led_setup(struct hellcreek *hellcreek)const char *label, *state;int ret = -EINVAL ; +of_node_get (hellcreek->dev->of_node); leds =of_find_node_by_name (hellcreek->dev->of_node,"leds" );if (!leds) {dev_err (hellcreek->dev,"No LEDs specified in device tree!\n" );
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +13 -1
@@ -4293,6 +4293,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,return 0 ; err_nexthop_neigh_init: +list_del (&nh->router_list_node); +mlxsw_sp_nexthop_counter_free (mlxsw_sp, nh);mlxsw_sp_nexthop_remove (mlxsw_sp, nh);return err; }
@@ -6578,6 +6580,7 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, const struct fib6_info *rt) {struct net_device *dev = rt->fib6_nh->fib_nh_dev; +int err; nh->nhgi = nh_grp->nhgi; nh->nh_weight = rt->fib6_nh->fib_nh_weight;
@@ -6593,7 +6596,16 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,return 0 ; nh->ifindex = dev->ifindex; -return mlxsw_sp_nexthop_type_init (mlxsw_sp, nh, dev); + err =mlxsw_sp_nexthop_type_init (mlxsw_sp, nh, dev); +if (err) + goto err_nexthop_type_init; + +return 0 ; + +err_nexthop_type_init: +list_del (&nh->router_list_node); +mlxsw_sp_nexthop_counter_free (mlxsw_sp, nh); +return err; } static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,
drivers/net/ethernet/smsc/epic100.c +2 -2
@@ -1513,14 +1513,14 @@ static void epic_remove_one(struct pci_dev *pdev)struct net_device *dev =pci_get_drvdata (pdev);struct epic_private *ep =netdev_priv (dev); +unregister_netdev (dev);dma_free_coherent (&pdev->dev,TX_TOTAL_SIZE , ep->tx_ring, ep->tx_ring_dma);dma_free_coherent (&pdev->dev,RX_TOTAL_SIZE , ep->rx_ring, ep->rx_ring_dma); -unregister_netdev (dev);pci_iounmap (pdev, ep->ioaddr); -pci_release_regions (pdev);free_netdev (dev); +pci_release_regions (pdev);pci_disable_device (pdev);/* pci_power_off(pdev, -1); */ }
drivers/net/phy/ax88796b.c +4 -2
@@ -88,8 +88,10 @@ static void asix_ax88772a_link_change_notify(struct phy_device *phydev)/* Reset PHY, otherwise MII_LPA will provide outdated information. * This issue is reproducible only with some link partner PHYs */ -if (phydev->state ==PHY_NOLINK && phydev->drv->soft_reset) - phydev->drv->soft_reset (phydev); +if (phydev->state ==PHY_NOLINK ) { +phy_init_hw (phydev); +phy_start_aneg (phydev); + } }static struct phy_driver asix_driver[] = {
drivers/net/phy/dp83822.c +1 -3
@@ -228,9 +228,7 @@ static int dp83822_config_intr(struct phy_device *phydev)if (misr_status <0 )return misr_status; - misr_status |= (DP83822_RX_ERR_HF_INT_EN | -DP83822_FALSE_CARRIER_HF_INT_EN | -DP83822_LINK_STAT_INT_EN | + misr_status |= (DP83822_LINK_STAT_INT_EN |DP83822_ENERGY_DET_INT_EN |DP83822_LINK_QUAL_INT_EN );
drivers/net/phy/phy.c +23 -0
@@ -31,6 +31,7 @@#include <linux/io.h> #include <linux/uaccess.h> #include <linux/atomic.h> +#include <linux/suspend.h> #include <net/netlink.h> #include <net/genetlink.h> #include <net/sock.h>
@@ -972,6 +973,28 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)struct phy_driver *drv = phydev->drv;irqreturn_t ret; +/* Wakeup interrupts may occur during a system sleep transition. +* Postpone handling until the PHY has resumed. +*/ +if (IS_ENABLED (CONFIG_PM_SLEEP ) && phydev->irq_suspended) { +struct net_device *netdev = phydev->attached_dev; + +if (netdev) { +struct device *parent = netdev->dev.parent; + +if (netdev->wol_enabled) +pm_system_wakeup (); +else if (device_may_wakeup (&netdev->dev)) +pm_wakeup_dev_event (&netdev->dev,0 , true); +else if (parent &&device_may_wakeup (parent)) +pm_wakeup_dev_event (parent,0 , true); + } + + phydev->irq_rerun =1 ; +disable_irq_nosync (irq); +return IRQ_HANDLED ; + } +mutex_lock (&phydev->lock); ret = drv->handle_interrupt (phydev);mutex_unlock (&phydev->lock);
drivers/net/phy/phy_device.c +23 -0
@@ -277,6 +277,15 @@ static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)if (phydev->mac_managed_pm)return 0 ; +/* Wakeup interrupts may occur during the system sleep transition when +* the PHY is inaccessible. Set flag to postpone handling until the PHY +* has resumed. Wait for concurrent interrupt handler to complete. +*/ +if (phy_interrupt_is_valid (phydev)) { + phydev->irq_suspended =1 ; +synchronize_irq (phydev->irq); + } +/* We must stop the state machine manually, otherwise it stops out of * control, possibly with the phydev->lock held. Upon resume, netdev * may call phy routines that try to grab the same lock, and that may
@@ -314,6 +323,20 @@ static __maybe_unused int mdio_bus_phy_resume(struct device *dev)if (ret <0 )return ret; no_resume: +if (phy_interrupt_is_valid (phydev)) { + phydev->irq_suspended =0 ; +synchronize_irq (phydev->irq); + +/* Rerun interrupts which were postponed by phy_interrupt() +* because they occurred during the system sleep transition. +*/ +if (phydev->irq_rerun) { + phydev->irq_rerun =0 ; +enable_irq (phydev->irq); +irq_wake_thread (phydev->irq, phydev); + } + } +if (phydev->attached_dev && phydev->adjust_link)phy_start_machine (phydev);
drivers/net/tun.c +13 -2
@@ -274,6 +274,12 @@ static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile, } } +static void tun_napi_enable (struct tun_file *tfile) +{ +if (tfile->napi_enabled) +napi_enable (&tfile->napi); +} +static void tun_napi_disable (struct tun_file *tfile) {if (tfile->napi_enabled)
@@ -635,7 +641,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean) tun =rtnl_dereference (tfile->tun);if (tun && clean) { -tun_napi_disable (tfile); +if (!tfile->detached) +tun_napi_disable (tfile);tun_napi_del (tfile); }
@@ -654,8 +661,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean)if (clean) {RCU_INIT_POINTER (tfile->tun,NULL );sock_put (&tfile->sk); - }else + }else {tun_disable_queue (tun, tfile); +tun_napi_disable (tfile); + }synchronize_net ();tun_flow_delete_by_queue (tun, tun->numqueues +1 );
@@ -728,6 +737,7 @@ static void tun_detach_all(struct net_device *dev)sock_put (&tfile->sk); }list_for_each_entry_safe (tfile, tmp, &tun->disabled, next) { +tun_napi_del (tfile);tun_enable_queue (tfile);tun_queue_purge (tfile);xdp_rxq_info_unreg (&tfile->xdp_rxq);
@@ -808,6 +818,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,if (tfile->detached) {tun_enable_queue (tfile); +tun_napi_enable (tfile); }else {sock_hold (&tfile->sk);tun_napi_init (tun, tfile, napi, napi_frags);
drivers/net/usb/asix.h +1 -2
@@ -126,8 +126,7 @@ AX_MEDIUM_RE)#define AX88772_MEDIUM_DEFAULT \ - (AX_MEDIUM_FD | AX_MEDIUM_RFC | \ - AX_MEDIUM_TFC | AX_MEDIUM_PS | \ + (AX_MEDIUM_FD | AX_MEDIUM_PS | \ AX_MEDIUM_AC | AX_MEDIUM_RE)/* AX88772 & AX88178 RX_CTL values */
drivers/net/usb/asix_common.c +1 -0
@@ -431,6 +431,7 @@ void asix_adjust_link(struct net_device *netdev)asix_write_medium_mode (dev, mode,0 );phy_print_status (phydev); +usbnet_link_change (dev, phydev->link,0 ); }int asix_write_gpio (struct usbnet *dev,u16 value,int sleep,int in_pm)
drivers/net/usb/ax88179_178a.c +76 -25
133 lines not on this page · raw message
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1355,6 +1355,7 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
drivers/net/usb/usbnet.c +2 -2
@@ -2002,7 +2002,7 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (size) { - buf =kmalloc (size,GFP_KERNEL ); + buf =kmalloc (size,GFP_NOIO );if (!buf) goto out; }
@@ -2034,7 +2034,7 @@ static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (data) { - buf =kmemdup (data, size,GFP_KERNEL ); + buf =kmemdup (data, size,GFP_NOIO );if (!buf) goto out; }else {
drivers/net/virtio_net.c +7 -1
@@ -3241,14 +3241,20 @@ static int virtnet_probe(struct virtio_device *vdev) } } - err =register_netdev (dev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); + + err =register_netdevice (dev);if (err) {pr_debug ("virtio_net: registering device failed\n" ); +rtnl_unlock (); goto free_failover; }virtio_device_ready (vdev); +rtnl_unlock (); + err =virtnet_cpu_notif_add (vi);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" );
drivers/net/xen-netfront.c +52 -4
106 lines not on this page · raw message
drivers/nfc/nfcmrvl/i2c.c +3 -3
@@ -167,9 +167,9 @@ static int nfcmrvl_i2c_parse_dt(struct device_node *node, pdata->irq_polarity =IRQF_TRIGGER_RISING ; ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nfcmrvl/spi.c +3 -3
@@ -115,9 +115,9 @@ static int nfcmrvl_spi_parse_dt(struct device_node *node, } ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nxp-nci/i2c.c +3 -0
@@ -162,6 +162,9 @@ static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy *phy,skb_put_data (*skb, (void *)&header,NCI_CTRL_HDR_SIZE ); +if (!header.plen) +return 0 ; + r =i2c_master_recv (client,skb_put (*skb, header.plen), header.plen);if (r != header.plen) { nfc_err(&client->dev,
drivers/nvdimm/bus.c +2 -2
@@ -185,8 +185,8 @@ static int nvdimm_clear_badblocks_region(struct device *dev, void *data) ndr_end = nd_region->ndr_start + nd_region->ndr_size -1 ;/* make sure we are in the region */ -if (ctx->phys < nd_region->ndr_start - || (ctx->phys + ctx->cleared) > ndr_end) +if (ctx->phys < nd_region->ndr_start || + (ctx->phys + ctx->cleared -1 ) > ndr_end)return 0 ; sector = (ctx->phys - nd_region->ndr_start) /512 ;
drivers/nvme/host/pci.c +4 -1
@@ -3341,8 +3341,11 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_DEVICE(0x1b4b, 0x1092), /* Lexar 256 GB SSD */ .driver_data =NVME_QUIRK_NO_NS_DESC_LIST | NVME_QUIRK_IGNORE_DEV_SUBNQN, }, + { PCI_DEVICE(0x1cc1, 0x33f8), /* ADATA IM2P33F8ABR1 1 TB */ + .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x10ec, 0x5762), /* ADATA SX6000LNP */ - .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, }, + .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN | + NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1cc1, 0x8201), /* ADATA SX8200PNP 512GB */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS | NVME_QUIRK_IGNORE_DEV_SUBNQN, },
drivers/platform/x86/Kconfig +2 -0
@@ -871,6 +871,8 @@ config PANASONIC_LAPTOP tristate "Panasonic Laptop Extras" depends on INPUT && ACPI depends on BACKLIGHT_CLASS_DEVICE + depends on ACPI_VIDEO=n || ACPI_VIDEO + depends on SERIO_I8042 || SERIO_I8042 = n select INPUT_SPARSEKMAP help This driver adds support for access to backlight control and hotkeys
drivers/platform/x86/panasonic-laptop.c +67 -17
131 lines not on this page · raw message
drivers/vdpa/mlx5/net/mlx5_vnet.c +2 -0
@@ -1698,6 +1698,8 @@ static void mlx5_vdpa_set_vq_cb(struct vdpa_device *vdev, u16 idx, struct vdpa_cstruct mlx5_vdpa_net *ndev =to_mlx5_vdpa_ndev (mvdev); ndev->event_cbs[idx] = *cb; +if (is_ctrl_vq_idx (mvdev, idx)) + mvdev->cvq.event_cb = *cb; }static void mlx5_cvq_notify (struct vringh *vring)
fs/io_uring.c +4 -0
@@ -4788,6 +4788,8 @@ static int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)return -EINVAL ;if (unlikely (sqe->addr2 || sqe->file_index))return -EINVAL ; +if (unlikely (sqe->addr2 || sqe->file_index || sqe->ioprio)) +return -EINVAL ; sr->umsg =u64_to_user_ptr (READ_ONCE (sqe->addr)); sr->len =READ_ONCE (sqe->len);
@@ -5011,6 +5013,8 @@ static int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)return -EINVAL ;if (unlikely (sqe->addr2 || sqe->file_index))return -EINVAL ; +if (unlikely (sqe->addr2 || sqe->file_index || sqe->ioprio)) +return -EINVAL ; sr->umsg =u64_to_user_ptr (READ_ONCE (sqe->addr)); sr->len =READ_ONCE (sqe->len);
fs/ksmbd/smb2pdu.c +30 -13
70 lines not on this page · raw message
fs/ksmbd/vfs.c +9 -3
@@ -1018,7 +1018,9 @@ int ksmbd_vfs_zero_data(struct ksmbd_work *work, struct ksmbd_file *fp,FALLOC_FL_PUNCH_HOLE |FALLOC_FL_KEEP_SIZE , off, len); -return vfs_fallocate (fp->filp,FALLOC_FL_ZERO_RANGE , off, len); +return vfs_fallocate (fp->filp, +FALLOC_FL_ZERO_RANGE |FALLOC_FL_KEEP_SIZE , + off, len); } int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,
@@ -1049,7 +1051,7 @@ int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length, *out_count =0 ; end = start + length;while (start < end && *out_count < in_count) { - extent_start = f->f_op->llseek (f, start,SEEK_DATA ); + extent_start =vfs_llseek (f, start,SEEK_DATA );if (extent_start <0 ) {if (extent_start != -ENXIO ) ret = (int )extent_start;
@@ -1059,7 +1061,7 @@ int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,if (extent_start >= end)break ; - extent_end = f->f_op->llseek (f, extent_start,SEEK_HOLE ); + extent_end =vfs_llseek (f, extent_start,SEEK_HOLE );if (extent_end <0 ) {if (extent_end != -ENXIO ) ret = (int )extent_end;
@@ -1780,6 +1782,10 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work, ret =vfs_copy_file_range (src_fp->filp, src_off, dst_fp->filp, dst_off, len,0 ); +if (ret == -EOPNOTSUPP || ret == -EXDEV ) + ret =generic_copy_file_range (src_fp->filp, src_off, + dst_fp->filp, dst_off, + len,0 );if (ret <0 )return ret;
fs/nfsd/vfs.c +9 -2
@@ -560,6 +560,7 @@ __be32 nfsd4_clone_file_range(struct nfsd_file *nf_src, u64 src_pos,ssize_t nfsd_copy_file_range (struct file *src,u64 src_pos,struct file *dst,u64 dst_pos,u64 count) { +ssize_t ret;/* * Limit copy to 4MB to prevent indefinitely blocking an nfsd
@@ -570,7 +571,12 @@ ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,* limit like this and pipeline multiple COPY requests. */ count =min_t (u64, count,1 <<22 ); -return vfs_copy_file_range (src, src_pos, dst, dst_pos, count,0 ); + ret =vfs_copy_file_range (src, src_pos, dst, dst_pos, count,0 ); + +if (ret == -EOPNOTSUPP || ret == -EXDEV ) + ret =generic_copy_file_range (src, src_pos, dst, dst_pos, + count,0 ); +return ret; } __be32 nfsd4_vfs_fallocate(struct svc_rqst *rqstp, struct svc_fh *fhp,
@@ -1142,6 +1148,7 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, nfsd_net_id)); err2 =filemap_check_wb_err (nf->nf_file->f_mapping, since); + err =nfserrno (err2);break ;case -EINVAL : err = nfserr_notsupp;
@@ -1149,8 +1156,8 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,default :nfsd_reset_boot_verifier (net_generic (nf->nf_net, nfsd_net_id)); + err =nfserrno (err2); } - err =nfserrno (err2); }else nfsd_copy_boot_verifier (verf,net_generic (nf->nf_net, nfsd_net_id));
fs/read_write.c +44 -33
104 lines not on this page · raw message
include/linux/dim.h +1 -1
@@ -21,7 +21,7 @@* We consider 10% difference as significant. */ #define IS_SIGNIFICANT_DIFF (val, ref) \ - (((100UL * abs((val) - (ref))) / (ref)) > 10) + ((ref) && (((100UL * abs((val) - (ref))) / (ref)) > 10))/* * Calculate the gap between two values.
include/linux/netdevice.h +1 -1
@@ -1645,7 +1645,7 @@ enum netdev_priv_flags {IFF_FAILOVER_SLAVE =1 <<28 ,IFF_L3MDEV_RX_HANDLER =1 <<29 ,IFF_LIVE_RENAME_OK =1 <<30 , - IFF_TX_SKB_NO_LINEAR = 1<<31, + IFF_TX_SKB_NO_LINEAR = BIT_ULL(31), };#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
include/linux/phy.h +6 -0
@@ -536,6 +536,10 @@ struct macsec_ops;* @mdix: Current crossover * @mdix_ctrl: User setting of crossover * @interrupts: Flag interrupts have been enabled +* @irq_suspended: Flag indicating PHY is suspended and therefore interrupt +* handling shall be postponed until PHY has resumed +* @irq_rerun: Flag indicating interrupts occurred while PHY was suspended, +* requiring a rerun of the interrupt handler after resume * @interface: enum phy_interface_t value * @skb: Netlink message for cable diagnostics * @nest: Netlink nest used for cable diagnostics
@@ -590,6 +594,8 @@ struct phy_device {/* Interrupts are enabled */ unsigned interrupts:1; + unsigned irq_suspended:1; + unsigned irq_rerun:1;enum phy_state state;
include/uapi/drm/drm_fourcc.h +2 -2
@@ -1352,11 +1352,11 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)#define AMD_FMT_MOD_PIPE_MASK 0x7#define AMD_FMT_MOD_SET (field, value) \ - ((uint64_t)(value) << AMD_FMT_MOD_##field##_SHIFT) + ((__u64)(value) << AMD_FMT_MOD_##field##_SHIFT)#define AMD_FMT_MOD_GET (field, value) \ (((value) >> AMD_FMT_MOD_##field##_SHIFT) & AMD_FMT_MOD_##field##_MASK)#define AMD_FMT_MOD_CLEAR (field) \ - (~((uint64_t)AMD_FMT_MOD_##field##_MASK << AMD_FMT_MOD_##field##_SHIFT)) + (~((__u64)AMD_FMT_MOD_##field##_MASK << AMD_FMT_MOD_##field##_SHIFT))#if defined(__cplusplus) }
net/ipv4/ip_tunnel_core.c +1 -1
@@ -410,7 +410,7 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,u32 mtu =dst_mtu (encap_dst) - headroom;if ((skb_is_gso (skb) &&skb_gso_validate_network_len (skb, mtu)) || - (!skb_is_gso (skb) && (skb->len -skb_mac_header_len (skb)) <= mtu)) + (!skb_is_gso (skb) && (skb->len -skb_network_offset (skb)) <= mtu))return 0 ;skb_dst_update_pmtu_no_confirm (skb, mtu);
net/ipv4/tcp_ipv4.c +3 -1
@@ -2014,7 +2014,8 @@ int tcp_v4_rcv(struct sk_buff *skb)struct sock *nsk; sk = req->rsk_listener; -if (unlikely (tcp_v4_inbound_md5_hash (sk, skb, dif, sdif))) { +if (unlikely (!xfrm4_policy_check (sk,XFRM_POLICY_IN , skb) || +tcp_v4_inbound_md5_hash (sk, skb, dif, sdif))) {sk_drops_add (sk, skb);reqsk_put (req); goto discard_it;
@@ -2061,6 +2062,7 @@ int tcp_v4_rcv(struct sk_buff *skb) } goto discard_and_relse; } +nf_reset_ct (skb);if (nsk == sk) {reqsk_put (req);tcp_v4_restore_cb (skb);
net/ipv6/addrconf.c +2 -6
@@ -1111,10 +1111,6 @@ ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, goto out; } -if (net->ipv6.devconf_all->disable_policy || - idev->cnf.disable_policy) - f6i->dst_nopolicy = true; -neigh_parms_data_state_setall (idev->nd_parms); ifa->addr = *cfg->pfx;
@@ -5170,9 +5166,9 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, fillargs->event =RTM_GETMULTICAST ;/* multicast address */ -for (ifmca =rcu_dereference (idev->mc_list); +for (ifmca =rtnl_dereference (idev->mc_list); ifmca; - ifmca =rcu_dereference (ifmca->next), ip_idx++) { + ifmca =rtnl_dereference (ifmca->next), ip_idx++) {if (ip_idx < s_ip_idx)continue ; err =inet6_fill_ifmcaddr (skb, ifmca, fillargs);
net/ipv6/route.c +8 -1
@@ -4590,8 +4590,15 @@ struct fib6_info *addrconf_f6i_alloc(struct net *net, } f6i =ip6_route_info_create (&cfg, gfp_flags,NULL ); -if (!IS_ERR (f6i)) +if (!IS_ERR (f6i)) { f6i->dst_nocount = true; + +if (!anycast && + (net->ipv6.devconf_all->disable_policy || + idev->cnf.disable_policy)) + f6i->dst_nopolicy = true; + } +return f6i; }
net/ipv6/seg6_hmac.c +0 -1
@@ -408,7 +408,6 @@ int __net_init seg6_hmac_net_init(struct net *net)return 0 ; } -EXPORT_SYMBOL (seg6_hmac_net_init);void seg6_hmac_exit (void ) {
net/ipv6/sit.c +3 -5
@@ -323,8 +323,6 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u kcalloc(cmax, sizeof(*kp), GFP_KERNEL_ACCOUNT | __GFP_NOWARN) : NULL; -rcu_read_lock (); - ca =min (t->prl_count, cmax);if (!kp) {
@@ -341,7 +339,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u } } - c =0 ; +rcu_read_lock ();for_each_prl_rcu (t->prl) {if (c >= cmax)break ;
@@ -353,7 +351,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __uif (kprl.addr !=htonl (INADDR_ANY ))break ; } -out: +rcu_read_unlock (); len =sizeof (*kp) * c;
@@ -362,7 +360,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u ret = -EFAULT ;kfree (kp); - +out:return ret; }
net/netfilter/nft_set_hash.c +2 -0
@@ -143,6 +143,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key,/* Another cpu may race to insert the element with the same key */ if (prev) {nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); he = prev; }
@@ -152,6 +153,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key, err2:nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); err1:return false; }
net/rose/rose_timer.c +19 -15
@@ -31,89 +31,89 @@ static void rose_idletimer_expiry(struct timer_list *);void rose_start_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); sk->sk_timer.function = rose_heartbeat_expiry; sk->sk_timer.expires = jiffies +5 *HZ ; -add_timer (&sk->sk_timer); +sk_reset_timer (sk, &sk->sk_timer, sk->sk_timer.expires); }void rose_start_t1timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t1; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t2timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t2; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t3timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t3; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_hbtimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->hb; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_idletimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->idletimer); +sk_stop_timer (sk, &rose->idletimer);if (rose->idle >0 ) { rose->idletimer.function = rose_idletimer_expiry; rose->idletimer.expires = jiffies + rose->idle; -add_timer (&rose->idletimer); +sk_reset_timer (sk, &rose->idletimer, rose->idletimer.expires); } }void rose_stop_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); }void rose_stop_timer (struct sock *sk) { -del_timer (&rose_sk (sk)->timer); +sk_stop_timer (sk, &rose_sk (sk)->timer); }void rose_stop_idletimer (struct sock *sk) { -del_timer (&rose_sk (sk)->idletimer); +sk_stop_timer (sk, &rose_sk (sk)->idletimer); }static void rose_heartbeat_expiry (struct timer_list *t)
@@ -130,6 +130,7 @@ static void rose_heartbeat_expiry(struct timer_list *t) (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {bh_unlock_sock (sk);rose_destroy_socket (sk); +sock_put (sk);return ; }break ;
@@ -152,6 +153,7 @@ static void rose_heartbeat_expiry(struct timer_list *t)rose_start_heartbeat (sk);bh_unlock_sock (sk); +sock_put (sk); }static void rose_timer_expiry (struct timer_list *t)
@@ -181,6 +183,7 @@ static void rose_timer_expiry(struct timer_list *t)break ; }bh_unlock_sock (sk); +sock_put (sk); }static void rose_idletimer_expiry (struct timer_list *t)
@@ -205,4 +208,5 @@ static void rose_idletimer_expiry(struct timer_list *t)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }
net/sched/act_api.c +14 -8
@@ -350,7 +350,8 @@ static int tcf_idr_release_unsafe(struct tc_action *p) }static int tcf_del_walker (struct tcf_idrinfo *idrinfo,struct sk_buff *skb, -const struct tc_action_ops *ops) +const struct tc_action_ops *ops, +struct netlink_ext_ack *extack) {struct nlattr *nest;int n_i =0 ;
@@ -366,20 +367,25 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,if (nla_put_string (skb,TCA_KIND , ops->kind)) goto nla_put_failure; + ret =0 ;mutex_lock (&idrinfo->lock);idr_for_each_entry_ul (idr, p, tmp, id) {if (IS_ERR (p))continue ; ret =tcf_idr_release_unsafe (p); -if (ret ==ACT_P_DELETED ) { +if (ret ==ACT_P_DELETED )module_put (ops->owner); - n_i++; - }else if (ret <0 ) { -mutex_unlock (&idrinfo->lock); - goto nla_put_failure; - } +else if (ret <0 ) +break ; + n_i++; }mutex_unlock (&idrinfo->lock); +if (ret <0 ) { +if (n_i) +NL_SET_ERR_MSG (extack,"Unable to flush all TC actions" ); +else + goto nla_put_failure; + } ret =nla_put_u32 (skb,TCA_FCNT , n_i);if (ret)
@@ -400,7 +406,7 @@ int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,struct tcf_idrinfo *idrinfo = tn->idrinfo;if (type ==RTM_DELACTION ) { -return tcf_del_walker (idrinfo, skb, ops); +return tcf_del_walker (idrinfo, skb, ops, extack); }else if (type ==RTM_GETACTION ) {return tcf_dump_walker (idrinfo, skb, cb); }else {
net/sunrpc/xdr.c +1 -1
@@ -979,7 +979,7 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,*/ xdr->p = (void *)p + frag2bytes; space_left = xdr->buf->buflen - xdr->buf->len; -if (space_left - nbytes >=PAGE_SIZE ) +if (space_left - frag1bytes >=PAGE_SIZE ) xdr->end = (void *)p +PAGE_SIZE ;else xdr->end = (void *)p + space_left - frag1bytes;
net/tipc/node.c +22 -19
72 lines not on this page · raw message
tools/testing/selftests/bpf/test_verifier.c +28 -0
@@ -31,6 +31,7 @@#include <linux/if_ether.h> #include <linux/btf.h> +#include <bpf/btf.h> #include <bpf/bpf.h> #include <bpf/libbpf.h>
@@ -63,6 +64,11 @@ static bool unpriv_disabled = false;static int skips;static bool verbose = false; +struct kfunc_btf_id_pair { +const char *kfunc; +int insn_idx; +}; +struct bpf_test {const char *descr;struct bpf_insn insns[MAX_INSNS ];
@@ -88,6 +94,7 @@ struct bpf_test {int fixup_map_event_output[MAX_FIXUPS ];int fixup_map_reuseport_array[MAX_FIXUPS ];int fixup_map_ringbuf[MAX_FIXUPS ]; +struct kfunc_btf_id_pair fixup_kfunc_btf_id[MAX_FIXUPS ];/* Expected verifier log output for result REJECT or VERBOSE_ACCEPT. * Can be a tab-separated sequence of expected strings. An empty string * means no log verification.
@@ -718,6 +725,7 @@ static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type,int *fixup_map_event_output = test->fixup_map_event_output;int *fixup_map_reuseport_array = test->fixup_map_reuseport_array;int *fixup_map_ringbuf = test->fixup_map_ringbuf; +struct kfunc_btf_id_pair *fixup_kfunc_btf_id = test->fixup_kfunc_btf_id;if (test->fill_helper) { test->fill_insns =calloc (MAX_TEST_INSNS ,sizeof (struct bpf_insn ));
@@ -903,6 +911,26 @@ static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type, fixup_map_ringbuf++; }while (*fixup_map_ringbuf); } + +/* Patch in kfunc BTF IDs */ +if (fixup_kfunc_btf_id->kfunc) { +struct btf *btf; +int btf_id; + +do { + btf_id =0 ; + btf =btf__load_vmlinux_btf (); +if (btf) { + btf_id =btf__find_by_name_kind (btf, + fixup_kfunc_btf_id->kfunc, +BTF_KIND_FUNC ); + btf_id = btf_id <0 ?0 : btf_id; + } +btf__free (btf); + prog[fixup_kfunc_btf_id->insn_idx].imm = btf_id; + fixup_kfunc_btf_id++; + }while (fixup_kfunc_btf_id->kfunc); + } }struct libcap {
tools/testing/selftests/net/mptcp/diag.sh +40 -8
92 lines not on this page · raw message
tools/testing/selftests/net/udpgso_bench.sh +1 -1
@@ -120,7 +120,7 @@ run_all() { run_udp "${ipv4_args}" echo "ipv6" - run_tcp "${ipv4_args}" + run_tcp "${ipv6_args}" run_udp "${ipv6_args}" }
tools/testing/selftests/rseq/Makefile +1 -1
@@ -6,7 +6,7 @@ endif CFLAGS += -O2 -Wall -g -I./ -I../../../../usr/include/ -L$(OUTPUT) -Wl,-rpath=./ \ $(CLANG_FLAGS) -LDLIBS += -lpthread +LDLIBS += -lpthread -ldl # Own dependencies because we only want to build against 1st prerequisite, but # still track changes to header files and depend on shared object.
tools/testing/selftests/rseq/basic_percpu_ops_test.c +2 -3
@@ -9,10 +9,9 @@#include <string.h> #include <stddef.h> +#include "../kselftest.h" #include "rseq.h" -#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct percpu_lock_entry {intptr_t v; } __attribute__((aligned (128 )));
@@ -168,7 +167,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret, cpu; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/compiler.h new file +30 -0
@@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ +/* +* rseq/compiler.h +* +* Work-around asm goto compiler bugs. +* +* (C) Copyright 2021 - Mathieu Desnoyers <[email protected]> +*/ + +#ifndef RSEQ_COMPILER_H +#define RSEQ_COMPILER_H + +/* +* gcc prior to 4.8.2 miscompiles asm goto. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 +* +* gcc prior to 8.1.0 miscompiles asm goto at O1. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103908 +* +* clang prior to version 13.0.1 miscompiles asm goto at O2. +* https://github.com/llvm/llvm-project/issues/52735 +* +* Work around these issues by adding a volatile inline asm with +* memory clobber in the fallthrough after the asm goto and at each +* label target. Emit this for all compilers in case other similar +* issues are found in the future. +*/ +#define rseq_after_asm_goto () asm volatile ("" : : : "memory") + +#endif /* RSEQ_COMPILER_H_ */
tools/testing/selftests/rseq/param_test.c +3 -5
@@ -161,7 +161,7 @@ unsigned int yield_mod_cnt, nr_abort;" cbnz " INJECT_ASM_REG ", 222b\n" \ "333:\n" -#elif __PPC__ +#elif defined(__PPC__)#define RSEQ_INJECT_INPUT \ , [loop_cnt_1]"m"(loop_cnt[1]) \
@@ -368,9 +368,7 @@ void *test_percpu_spinlock_thread(void *arg)abort (); reps = thread_data->reps;for (i =0 ; i < reps; i++) { -int cpu =rseq_cpu_start (); - - cpu =rseq_this_cpu_lock (&data->lock); +int cpu =rseq_this_cpu_lock (&data->lock); data->c[cpu].count++;rseq_percpu_unlock (&data->lock, cpu);#ifndef BENCHMARK
@@ -551,7 +549,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/rseq-abi.h new file +151 -0
151 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm.h +56 -54
29 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm64.h +56 -23
79 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-generic-thread-pointer.h new file +25 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-mips.h +17 -54
71 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h new file +30 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-ppc.h +84 -44
128 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-s390.h +42 -13
55 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-skip.h +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-thread-pointer.h new file +19 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86-thread-pointer.h new file +40 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86.h +136 -64
200 lines not on this page · raw message
tools/testing/selftests/rseq/rseq.c +79 -86
165 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.