Linux 6.6.72
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.6.72 kernel.
All users of the 6.6 kernel series must upgrade.
The updated 6.6.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.6.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
------------
Makefile | 2 arch/arm/boot/dts/nxp/imx/imxrt1050.dtsi | 2 arch/arm64/boot/dts/rockchip/rk3328.dtsi | 1 arch/riscv/include/asm/cacheflush.h | 6 arch/riscv/include/asm/page.h | 1 arch/riscv/include/asm/patch.h | 1 arch/riscv/include/asm/pgtable.h | 2 arch/riscv/kernel/ftrace.c | 47 +++++- arch/riscv/kernel/patch.c | 16 +- arch/riscv/kernel/probes/kprobes.c | 2 arch/riscv/kernel/traps.c | 6 arch/riscv/mm/init.c | 17 ++ arch/x86/kernel/fpu/regset.c | 3 arch/x86/mm/numa.c | 6 block/bfq-iosched.c | 12 + drivers/acpi/resource.c | 18 ++ drivers/base/topology.c | 24 ++- drivers/bluetooth/btnxpuart.c | 1 drivers/cpuidle/cpuidle-riscv-sbi.c | 4 drivers/gpu/drm/amd/amdkfd/kfd_debug.c | 17 ++ drivers/gpu/drm/amd/display/dc/dc.h | 2 drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h | 8 + drivers/gpu/drm/mediatek/Kconfig | 5 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 57 +++---- drivers/gpu/drm/mediatek/mtk_dp.c | 46 +++--- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 2 drivers/hwmon/drivetemp.c | 8 - drivers/iio/adc/ad7124.c | 3 drivers/iio/adc/at91_adc.c | 2 drivers/iio/adc/rockchip_saradc.c | 2 drivers/iio/adc/ti-ads124s08.c | 4 drivers/iio/adc/ti-ads8688.c | 2 drivers/iio/dummy/iio_simple_dummy_buffer.c | 2 drivers/iio/gyro/fxas21002c_core.c | 9 + drivers/iio/imu/inv_icm42600/inv_icm42600_core.c | 8 - drivers/iio/imu/kmx61.c | 2 drivers/iio/inkern.c | 2 drivers/iio/light/vcnl4035.c | 2 drivers/iio/pressure/zpa2326.c | 2 drivers/md/dm-ebs-target.c | 2 drivers/md/dm-thin.c | 5 drivers/md/dm-verity-fec.c | 39 +++-- drivers/md/persistent-data/dm-array.c | 19 +- drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c | 4 drivers/net/ethernet/amd/pds_core/devlink.c | 2 drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 3 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 5 drivers/net/ethernet/google/gve/gve_main.c | 14 + drivers/net/ethernet/intel/ice/ice_ptp_consts.h | 4 drivers/net/ethernet/intel/igc/igc_base.c | 12 + drivers/net/ethernet/intel/igc/igc_i225.c | 5 drivers/net/ethernet/intel/igc/igc_main.c | 6 drivers/net/ethernet/intel/igc/igc_phy.c | 4 drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 1 drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c | 14 + drivers/net/ethernet/wangxun/libwx/wx_hw.c | 24 +-- drivers/net/ieee802154/ca8210.c | 6 drivers/platform/x86/amd/pmc/pmc.c | 8 - drivers/pmdomain/imx/gpcv2.c | 10 - drivers/staging/iio/frequency/ad9832.c | 2 drivers/staging/iio/frequency/ad9834.c | 2 drivers/thermal/thermal_of.c | 1 drivers/tty/serial/8250/8250_core.c | 3 drivers/ufs/core/ufshcd-priv.h | 6 drivers/ufs/core/ufshcd.c | 1 drivers/ufs/host/ufs-qcom.c | 13 - drivers/usb/chipidea/ci_hdrc_imx.c | 25 ++- drivers/usb/class/usblp.c | 7 drivers/usb/core/hub.c | 6 drivers/usb/core/port.c | 7 drivers/usb/dwc3/core.h | 1 drivers/usb/dwc3/dwc3-am62.c | 1 drivers/usb/dwc3/gadget.c | 4 drivers/usb/gadget/Kconfig | 4 drivers/usb/gadget/configfs.c | 6 drivers/usb/gadget/function/f_fs.c | 2 drivers/usb/gadget/function/f_uac2.c | 1 drivers/usb/gadget/function/u_serial.c | 8 - drivers/usb/serial/cp210x.c | 1 drivers/usb/serial/option.c | 4 drivers/usb/storage/unusual_devs.h | 7 drivers/usb/typec/tcpm/maxim_contaminant.c | 4 fs/Kconfig | 24 ++- fs/afs/afs.h | 2 fs/afs/afs_vl.h | 1 fs/afs/vl_alias.c | 8 - fs/afs/vlclient.c | 2 fs/btrfs/scrub.c | 4 fs/erofs/zdata.c | 66 ++++---- fs/exfat/dir.c | 3 fs/exfat/fatent.c | 10 + fs/f2fs/super.c | 12 - fs/jbd2/commit.c | 4 fs/jbd2/revoke.c | 2 fs/overlayfs/copy_up.c | 62 +++++--- fs/overlayfs/export.c | 49 +++--- fs/overlayfs/namei.c | 41 ++++- fs/overlayfs/overlayfs.h | 28 ++- fs/overlayfs/super.c | 20 +- fs/overlayfs/util.c | 10 + fs/smb/client/namespace.c | 19 ++ fs/smb/server/smb2pdu.c | 43 +++++ fs/smb/server/smb2pdu.h | 10 + fs/smb/server/vfs.c | 3 include/linux/hugetlb.h | 5 include/linux/mm.h | 1 include/linux/mm_types.h | 34 ++++ include/linux/numa.h | 5 include/net/inet_connection_sock.h | 2 include/ufs/ufshcd.h | 2 io_uring/io_uring.c | 13 + io_uring/timeout.c | 4 kernel/workqueue.c | 68 ++++++--- mm/hugetlb.c | 24 +-- mm/memblock.c | 24 --- net/802/psnap.c | 4 net/bluetooth/hci_sync.c | 11 - net/bluetooth/mgmt.c | 38 ++++- net/core/link_watch.c | 10 - net/ipv4/tcp_ipv4.c | 2 net/mptcp/ctrl.c | 11 - net/netfilter/nf_conntrack_core.c | 5 net/netfilter/nf_tables_api.c | 15 +- net/sched/cls_flow.c | 3 net/sched/sch_cake.c | 140 ++++++++++--------- net/sctp/sysctl.c | 14 + net/tls/tls_sw.c | 2 sound/soc/codecs/rt722-sdca.c | 7 sound/soc/mediatek/common/mtk-afe-platform-driver.c | 4 tools/include/linux/numa.h | 5 tools/testing/selftests/alsa/Makefile | 2 131 files changed, 1030 insertions(+), 507 deletions(-)
Akash M (1):
usb: gadget: f_fs: Remove WARN_ON in functionfs_bind
Alexander Gordeev (1):
pgtable: fix s390 ptdesc field comments
Alexandre Ghiti (2):
riscv: Fix early ftrace nop patching
riscv: Fix text patching when IPI are used
Amir Goldstein (3):
ovl: do not encode lower fh with upper sb_writers held
ovl: pass realinode to ovl_encode_real_fh() instead of realdentry
ovl: support encoding fid from inode with no alias
André Draszik (1):
usb: dwc3: gadget: fix writing NYET threshold
Antonio Pastor (1):
net: 802: LLC+SNAP OID:PID lookup on start of skb data
Anumula Murali Mohan Reddy (1):
cxgb4: Avoid removal of uninserted tid
Arnd Bergmann (1):
drm/mediatek: stop selecting foreign drivers
Benjamin Coddington (1):
tls: Fix tls_sw_sendmsg error handling
Carlos Song (1):
iio: gyro: fxas21002c: Fix missing data update in trigger handler
Chen-Yu Tsai (1):
ASoC: mediatek: disable buffer pre-allocation
Chenguang Zhao (1):
net/mlx5: Fix variable not being completed when function returns
Chukun Pan (1):
USB: serial: option: add MeiG Smart SRM815
Dan Carpenter (1):
usb: typec: tcpm/tcpci_maxim: fix error code in max_contaminant_read_resistance_kohm()
Daniel Borkmann (1):
tcp: Annotate data-race around sk->sk_mark in tcp_v4_send_reset
Daniel Golle (1):
drm/mediatek: Only touch DISP_REG_OVL_PITCH_MSB if AFBC is supported
Daniil Stas (1):
hwmon: (drivetemp) Fix driver producing garbage data when SCSI errors occur
David Hildenbrand (1):
mm/hugetlb: enforce that PMD PT sharing has split PMD PT locks
David Howells (1):
afs: Fix the maximum cell name length
En-Wei Wu (1):
igc: return early when failing to read EECD register
Eric Dumazet (1):
net_sched: cls_flow: validate TCA_FLOW_RSHIFT attribute
Fabio Estevam (1):
iio: adc: ti-ads124s08: Use gpiod_set_value_cansleep()
Gao Xiang (2):
erofs: handle overlapped pclusters out of crafted images properly
erofs: fix PSI memstall accounting
Greg Kroah-Hartman (1):
Linux 6.6.72
Guoqing Jiang (1):
drm/mediatek: Set private->all_drm_private[i]->drm to NULL if mtk_drm_bind returns err
Hans de Goede (2):
ACPI: resource: Add TongFang GM5HG0A to irq1_edge_low_force_override[]
ACPI: resource: Add Asus Vivobook X1504VAP to irq1_level_low_skip_override[]He Wang (1):
ksmbd: fix unexpectedly changed path in ksmbd_vfs_kern_path_locked
Ilpo Järvinen (1):
tty: serial: 8250: Fix another runtime PM usage counter underflow
Ingo Rohloff (1):
usb: gadget: configfs: Ignore trailing LF for user strings to cdev
Jakub Kicinski (1):
eth: gve: use appropriate helper to set xdp_features
Jan Beulich (2):
memblock: make memblock_set_node() also warn about use of MAX_NUMNODES x86/mm/numa: Use NUMA_NO_NODE when calling memblock_set_node()
Jason Xing (1):
tcp/dccp: complete lockless accesses to sk->sk_max_ack_backlog
Javier Carrasco (7):
cpuidle: riscv-sbi: fix device node release in early exit of for_each_possible_cpu
iio: pressure: zpa2326: fix information leak in triggered buffer
iio: dummy: iio_simply_dummy_buffer: fix information leak in triggered buffer
iio: light: vcnl4035: fix information leak in triggered buffer
iio: imu: kmx61: fix information leak in triggered buffer
iio: adc: rockchip_saradc: fix information leak in triggered buffer
iio: adc: ti-ads8688: fix information leak in triggered buffer
Jean-Baptiste Maneyrol (1):
iio: imu: inv_icm42600: fix timestamps after suspend if sensor is on
Jens Axboe (1):
io_uring/eventfd: ensure io_eventfd_signal() defers another RCU period
Jesse Brandeburg (1):
igc: field get conversion
Jesse Taube (1):
ARM: dts: imxrt1050: Fix clocks for mmc
[email protected] (1):
drm/amdkfd: fixed page fault when enable MES shader debugger
Jiawen Wu (1):
net: libwx: fix firmware mailbox abnormal return
Joe Hattori (5):
thermal: of: fix OF node leak in of_thermal_zone_find()
usb: chipidea: ci_hdrc_imx: decrement device's refcount in .remove() and in the error path of .probe()
iio: adc: at91: call input_free_device() on allocated iio_dev
iio: inkern: call iio_device_put() only on mapped devices
pmdomain: imx: gpcv2: fix an OF node reference leak in imx_gpcv2_probe()
Johan Hovold (1):
USB: serial: cp210x: add Phoenix Contact UPS Device
Jun Yan (1):
USB: usblp: return error when setting unsupported protocol
Kai-Heng Feng (1):
USB: core: Disable LPM only for non-suspended ports
Kalesh AP (1):
bnxt_en: Fix possible memory leak when hwrm_req_replace fails
Keisuke Nishimura (1):
ieee802154: ca8210: Add missing check for kfifo_alloc() in ca8210_probe()
Krister Johansen (1):
dm thin: make get_first_thin use rcu-safe list first function
Krzysztof Kozlowski (1):
pmdomain: imx: gpcv2: Simplify with scoped for each OF child loop
Kuniyuki Iwashima (1):
ipvlan: Fix use-after-free in ipvlan_get_iflink().
Li Huafei (1):
topology: Keep the cpumask unchanged when printing cpumap
Li Zhijian (1):
selftests/alsa: Fix circular dependency involving global-timer
Liankun Yang (3):
drm/mediatek: Fix YCbCr422 color format issue for DP drm/mediatek: Fix mode valid issue for dp drm/mediatek: Add return value check when reading DPCD
Lianqin Hu (1):
usb: gadget: u_serial: Disable ep before setting port to null to fix the crash caused by port being null
Liu Shixin (1):
mm: hugetlb: independent PMD page table shared count
Lubomir Rintel (1):
usb-storage: Add max sectors quirk for Nokia 208
Luiz Augusto von Dentz (2):
Bluetooth: hci_sync: Fix not setting Random Address when required
Bluetooth: MGMT: Fix Add Device to responding before completing
Ma Ke (1):
usb: fix reference leak in usb_new_device()
Maciej S. Szmigiero (1):
platform/x86/amd/pmc: Only disable IRQ1 wakeup where i8042 actually enabled it
Manivannan Sadhasivam (1):
scsi: ufs: qcom: Power off the PHY if it was already powered on in ufs_qcom_power_up_sequence()
Matthieu Baerts (NGI0) (6):
mptcp: sysctl: sched: avoid using current->nsproxy
sctp: sysctl: cookie_hmac_alg: avoid using current->nsproxy
sctp: sysctl: rto_min/max: avoid using current->nsproxy
sctp: sysctl: auth_enable: avoid using current->nsproxy
sctp: sysctl: udp_port: avoid using current->nsproxy
sctp: sysctl: plpmtud_probe_interval: avoid using current->nsproxyMeetakshi Setiya (1):
smb: client: sync the root session and superblock context passwords before automounting
Melissa Wen (1):
drm/amd/display: increase MAX_SURFACES to the value supported by hw
Michal Hrusecky (1):
USB: serial: option: add Neoway N723-EA support
Mike Rapoport (IBM) (1):
memblock: use numa_valid_node() helper to check for invalid node ID
Mikulas Patocka (1):
dm-ebs: don't set the flag DM_TARGET_PASSES_INTEGRITY
Milan Broz (1):
dm-verity FEC: Fix RS FEC repair for roots unaligned to block size (take 2)
Ming-Hung Tsai (3):
dm array: fix releasing a faulty array block twice in dm_array_cursor_end dm array: fix unreleased btree blocks on closing a faulty array cursor dm array: fix cursor index when skipping across block boundaries
Nam Cao (2):
riscv: Fix sleeping in invalid context in die()
riscv: kprobes: Fix incorrect address calculation
Namjae Jeon (1):
ksmbd: Implement new SMB3 POSIX type
Neeraj Sanjay Kale (1):
Bluetooth: btnxpuart: Fix driver sending truncated data
Pablo Neira Ayuso (2):
netfilter: nf_tables: imbalance in flowtable binding
netfilter: conntrack: clamp maximum hashtable size to INT_MAX
Parker Newman (1):
net: stmmac: dwmac-tegra: Read iommu stream id from device tree
Pavel Begunkov (1):
io_uring/timeout: fix multishot updates
Peter Geis (1):
arm64: dts: rockchip: add hevc power domain clock to rk3328
Peter Xu (1):
fs/Kconfig: make hugetlbfs a menuconfig
Prashanth K (2):
usb: dwc3-am62: Disable autosuspend during remove
usb: gadget: f_uac2: Fix incorrect setting of bNumEndpoints
Przemyslaw Korba (1):
ice: fix incorrect PHY settings for 100 GB/s
Qu Wenruo (1):
btrfs: avoid NULL pointer dereference if no valid extent tree
Rengarajan S (2):
misc: microchip: pci1xxxx: Resolve kernel panic during GPIO IRQ handling
misc: microchip: pci1xxxx: Resolve return code mismatch during GPIO set config
Rick Edgecombe (1):
x86/fpu: Ensure shadow stack is active before "getting" registers
Roman Li (1):
drm/amd/display: Add check for granularity in dml ceil/floor helpers
Shannon Nelson (1):
pds_core: limit loop over fw name list
Shuming Fan (1):
ASoC: rt722: add delay time to wait for the calibration procedure
Takashi Iwai (1):
usb: gadget: midi2: Reverse-select at the right place
Tejun Heo (1):
workqueue: Update lock debugging code
Toke Høiland-Jørgensen (1):
sched: sch_cake: add bounds checks to host bulk flow fairness counts
Tvrtko Ursulin (1):
workqueue: Do not warn when cancelling WQ_MEM_RECLAIM work from !WQ_MEM_RECLAIM worker
Uwe Kleine-König (1):
iio: adc: ad7124: Disable all channels at probe time
Wei Yang (1):
memblock tests: fix implicit declaration of function 'numa_valid_node'
Wentao Liang (1):
ksmbd: fix a missing return value check bug
Xu Lu (1):
riscv: mm: Fix the out of bound issue of vmemmap address
Xuewen Yan (1):
workqueue: Add rcu lock check at the end of work item execution
Ye Bin (1):
f2fs: fix null-ptr-deref in f2fs_submit_page_bio()
Yu Kuai (1):
block, bfq: fix waker_bfqq UAF after bfq_split_bfqq()
Yuezhang Mo (2):
exfat: fix the infinite loop in exfat_readdir()
exfat: fix the infinite loop in __exfat_free_cluster()
Zhang Yi (2):
jbd2: increase IO priority for writing revoke records
jbd2: flush filesystem device before updating tail sequence
Zhongqiu Duan (1):
tcp/dccp: allow a connection when sk_max_ack_backlog is zero
Zicheng Qu (2):
staging: iio: ad9834: Correct phase range check
staging: iio: ad9832: Correct phase range check
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 -SUBLEVEL = 71 +SUBLEVEL = 72 EXTRAVERSION = NAME = Pinguïn Aangedreven
arch/arm/boot/dts/nxp/imx/imxrt1050.dtsi +1 -1
@@ -87,7 +87,7 @@ usdhc1: mmc@402c0000 { reg = <0x402c0000 0x4000>; interrupts = <110>; clocks = <&clks IMXRT1050_CLK_IPG_PDOF>, - <&clks IMXRT1050_CLK_OSC>, + <&clks IMXRT1050_CLK_AHB_PODF>, <&clks IMXRT1050_CLK_USDHC1>; clock-names = "ipg", "ahb", "per"; bus-width = <4>;
arch/arm64/boot/dts/rockchip/rk3328.dtsi +1 -0
@@ -304,6 +304,7 @@ power: power-controller { power-domain@RK3328_PD_HEVC { reg = <RK3328_PD_HEVC>; + clocks = <&cru SCLK_VENC_CORE>; #power-domain-cells = <0>; }; power-domain@RK3328_PD_VIDEO {
arch/riscv/include/asm/cacheflush.h +6 -0
@@ -13,6 +13,12 @@ static inline void local_flush_icache_all(void) asmvolatile ("fence.i" :::"memory" ); } +static inline void local_flush_icache_range (unsigned long start, +unsigned long end) +{ +local_flush_icache_all (); +} +#define PG_dcache_clean PG_arch_1static inline void flush_dcache_folio (struct folio *folio)
arch/riscv/include/asm/page.h +1 -0
@@ -122,6 +122,7 @@ struct kernel_mapping {extern struct kernel_mapping kernel_map;extern phys_addr_t phys_ram_base; +extern unsigned long vmemmap_start_pfn;#define is_kernel_mapping (x) \ ((x) >= kernel_map.virt_addr && (x) < (kernel_map.virt_addr + kernel_map.size))
arch/riscv/include/asm/patch.h +1 -0
@@ -6,6 +6,7 @@#ifndef _ASM_RISCV_PATCH_H#define _ASM_RISCV_PATCH_H +int patch_insn_write (void *addr,const void *insn,size_t len);int patch_text_nosync (void *addr,const void *insns,size_t len);int patch_text_set_nosync (void *addr,u8 c,size_t len);int patch_text (void *addr,u32 *insns,int ninsns);
arch/riscv/include/asm/pgtable.h +1 -1
@@ -84,7 +84,7 @@* Define vmemmap for pfn_to_page & page_to_pfn calls. Needed if kernel * is configured with CONFIG_SPARSEMEM_VMEMMAP enabled. */ -#define vmemmap ((struct page *)VMEMMAP_START - (phys_ram_base >> PAGE_SHIFT)) +#define vmemmap ((struct page *)VMEMMAP_START - vmemmap_start_pfn)#define PCI_IO_SIZE SZ_16M#define PCI_IO_END VMEMMAP_START
arch/riscv/kernel/ftrace.c +43 -4
83 lines not on this page · raw message
arch/riscv/kernel/patch.c +12 -4
@@ -196,7 +196,7 @@ int patch_text_set_nosync(void *addr, u8 c, size_t len) }NOKPROBE_SYMBOL (patch_text_set_nosync); -static int patch_insn_write (void *addr,const void *insn,size_t len) +int patch_insn_write (void *addr,const void *insn,size_t len) {size_t patched =0 ;size_t size;
@@ -240,16 +240,24 @@ static int patch_text_cb(void *data)if (atomic_inc_return (&patch->cpu_count) ==num_online_cpus ()) {for (i =0 ; ret ==0 && i < patch->ninsns; i++) { len =GET_INSN_LENGTH (patch->insns[i]); - ret =patch_text_nosync (patch->addr + i * len, - &patch->insns[i], len); + ret =patch_insn_write (patch->addr + i * len, &patch->insns[i], len); } -atomic_inc (&patch->cpu_count); +/* +* Make sure the patching store is effective *before* we +* increment the counter which releases all waiting CPUs +* by using the release variant of atomic increment. The +* release pairs with the call to local_flush_icache_all() +* on the waiting CPU. +*/ +atomic_inc_return_release (&patch->cpu_count); }else {while (atomic_read (&patch->cpu_count) <=num_online_cpus ())cpu_relax ();smp_mb (); } +local_flush_icache_all (); +return ret; }NOKPROBE_SYMBOL (patch_text_cb);
arch/riscv/kernel/probes/kprobes.c +1 -1
@@ -29,7 +29,7 @@ static void __kprobes arch_prepare_ss_slot(struct kprobe *p) p->ainsn.api.restore = (unsigned long )p->addr + offset;patch_text_nosync (p->ainsn.api.insn, &p->opcode,1 ); -patch_text_nosync (p->ainsn.api.insn + offset, &insn,1 ); +patch_text_nosync ((void *)p->ainsn.api.insn + offset, &insn,1 ); }static void __kprobes arch_prepare_simulate (struct kprobe *p)
arch/riscv/kernel/traps.c +3 -3
@@ -34,7 +34,7 @@int show_unhandled_signals =1 ; -static DEFINE_SPINLOCK (die_lock); +static DEFINE_RAW_SPINLOCK (die_lock);static void dump_kernel_instr (const char *loglvl,struct pt_regs *regs) {
@@ -66,7 +66,7 @@ void die(struct pt_regs *regs, const char *str)oops_enter (); -spin_lock_irqsave (&die_lock, flags); +raw_spin_lock_irqsave (&die_lock, flags);console_verbose ();bust_spinlocks (1 );
@@ -85,7 +85,7 @@ void die(struct pt_regs *regs, const char *str)bust_spinlocks (0 );add_taint (TAINT_DIE ,LOCKDEP_NOW_UNRELIABLE ); -spin_unlock_irqrestore (&die_lock, flags); +raw_spin_unlock_irqrestore (&die_lock, flags);oops_exit ();if (in_interrupt ())
arch/riscv/mm/init.c +16 -1
@@ -32,6 +32,7 @@#include <asm/ptdump.h> #include <asm/sections.h> #include <asm/soc.h> +#include <asm/sparsemem.h> #include <asm/tlbflush.h> #include "../kernel/head.h"
@@ -57,6 +58,13 @@ EXPORT_SYMBOL(pgtable_l5_enabled);phys_addr_t phys_ram_base__ro_after_init ;EXPORT_SYMBOL (phys_ram_base); +#ifdef CONFIG_SPARSEMEM_VMEMMAP +#define VMEMMAP_ADDR_ALIGN (1ULL << SECTION_SIZE_BITS) + +unsigned long vmemmap_start_pfn__ro_after_init ; +EXPORT_SYMBOL (vmemmap_start_pfn); +#endif + unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;EXPORT_SYMBOL (empty_zero_page);
@@ -221,8 +229,12 @@ static void __init setup_bootmem(void)* Make sure we align the start of the memory on a PMD boundary so that * at worst, we map the linear mapping with PMD mappings. */ -if (!IS_ENABLED (CONFIG_XIP_KERNEL )) +if (!IS_ENABLED (CONFIG_XIP_KERNEL )) { phys_ram_base =memblock_start_of_DRAM () &PMD_MASK ; +#ifdef CONFIG_SPARSEMEM_VMEMMAP + vmemmap_start_pfn =round_down (phys_ram_base,VMEMMAP_ADDR_ALIGN ) >>PAGE_SHIFT ; +#endif + }/* * In 64-bit, any use of __va/__pa before this point is wrong as we
@@ -1080,6 +1092,9 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) kernel_map.xiprom_sz = (uintptr_t )(&_exiprom) - (uintptr_t )(&_xiprom); phys_ram_base =CONFIG_PHYS_RAM_BASE ; +#ifdef CONFIG_SPARSEMEM_VMEMMAP + vmemmap_start_pfn =round_down (phys_ram_base,VMEMMAP_ADDR_ALIGN ) >>PAGE_SHIFT ; +#endif kernel_map.phys_addr = (uintptr_t )CONFIG_PHYS_RAM_BASE ; kernel_map.size = (uintptr_t )(&_end) - (uintptr_t )(&_start);
arch/x86/kernel/fpu/regset.c +2 -1
@@ -190,7 +190,8 @@ int ssp_get(struct task_struct *target, const struct user_regset *regset,struct fpu *fpu = &target->thread.fpu;struct cet_user_state *cetregs; -if (!cpu_feature_enabled (X86_FEATURE_USER_SHSTK )) +if (!cpu_feature_enabled (X86_FEATURE_USER_SHSTK ) || + !ssp_active (target, regset))return -ENODEV ;sync_fpstate (fpu);
arch/x86/mm/numa.c +3 -3
@@ -492,7 +492,7 @@ static void __init numa_clear_kernel_node_hotplug(void)for_each_reserved_mem_region (mb_region) {int nid =memblock_get_region_node (mb_region); -if (nid !=MAX_NUMNODES ) +if (nid !=NUMA_NO_NODE )node_set (nid, reserved_nodemask); }
@@ -613,9 +613,9 @@ static int __init numa_init(int (*init_func)(void))nodes_clear (node_online_map);memset (&numa_meminfo,0 ,sizeof (numa_meminfo));WARN_ON (memblock_set_node (0 ,ULLONG_MAX , &memblock.memory, -MAX_NUMNODES )); +NUMA_NO_NODE ));WARN_ON (memblock_set_node (0 ,ULLONG_MAX , &memblock.reserved, -MAX_NUMNODES )); +NUMA_NO_NODE ));/* In case that parsing SRAT failed. */ WARN_ON (memblock_clear_hotplug (0 ,ULLONG_MAX ));numa_reset_distance ();
block/bfq-iosched.c +10 -2
@@ -6843,16 +6843,24 @@ static struct bfq_queue *bfq_waker_bfqq(struct bfq_queue *bfqq)if (new_bfqq == waker_bfqq) {/* * If waker_bfqq is in the merge chain, and current -* is the only procress. +* is the only process, waker_bfqq can be freed. */ if (bfqq_process_refs (waker_bfqq) ==1 )return NULL ; -break ; + +return waker_bfqq; } new_bfqq = new_bfqq->new_bfqq; } +/* +* If waker_bfqq is not in the merge chain, and it's procress reference +* is 0, waker_bfqq can be freed. +*/ +if (bfqq_process_refs (waker_bfqq) ==0 ) +return NULL ; +return waker_bfqq; }
drivers/acpi/resource.c +18 -0
@@ -439,6 +439,13 @@ static const struct dmi_system_id asus_laptop[] = { DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"), }, }, + { +/* Asus Vivobook X1504VAP */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), + DMI_MATCH(DMI_BOARD_NAME, "X1504VAP"), + }, + }, {/* Asus Vivobook X1704VAP */ .matches = {
@@ -633,6 +640,17 @@ static const struct dmi_system_id lg_laptop[] = { DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"), }, }, + { +/* +* TongFang GM5HG0A in case of the SKIKK Vanaheim relabel the +* board-name is changed, so check OEM strings instead. Note +* OEM string matches are always exact matches. +* https://bugzilla.kernel.org/show_bug.cgi?id=219614 +*/ + .matches = { + DMI_EXACT_MATCH(DMI_OEM_STRING, "GM5HG0A"), + }, + }, { } };
drivers/base/topology.c +20 -4
@@ -27,9 +27,17 @@ static ssize_t name##_read(struct file *file, struct kobject *kobj, \ loff_t off, size_t count) \ { \struct device *dev =kobj_to_dev (kobj); \ +cpumask_var_t mask; \ +ssize_t n; \ \ - return cpumap_print_bitmask_to_buf(buf, topology_##mask(dev->id), \ - off, count); \ +if (!alloc_cpumask_var (&mask,GFP_KERNEL )) \ +return -ENOMEM ; \ + \ + cpumask_copy(mask, topology_##mask(dev->id)); \ + n = cpumap_print_bitmask_to_buf(buf, mask, off, count); \ + free_cpumask_var(mask); \ + \ + return n; \ } \ \ static ssize_t name##_list_read(struct file *file, struct kobject *kobj, \
@@ -37,9 +45,17 @@ static ssize_t name##_list_read(struct file *file, struct kobject *kobj, \ loff_t off, size_t count) \ { \struct device *dev =kobj_to_dev (kobj); \ +cpumask_var_t mask; \ +ssize_t n; \ + \ +if (!alloc_cpumask_var (&mask,GFP_KERNEL )) \ +return -ENOMEM ; \ + \ + cpumask_copy(mask, topology_##mask(dev->id)); \ + n = cpumap_print_list_to_buf(buf, mask, off, count); \ + free_cpumask_var(mask); \ \ - return cpumap_print_list_to_buf(buf, topology_##mask(dev->id), \ - off, count); \ + return n; \ }define_id_show_func (physical_package_id,"%d" );
drivers/bluetooth/btnxpuart.c +1 -0
@@ -1280,6 +1280,7 @@ static void btnxpuart_tx_work(struct work_struct *work)while ((skb =nxp_dequeue (nxpdev))) { len =serdev_device_write_buf (serdev, skb->data, skb->len); +serdev_device_wait_until_sent (serdev,0 ); hdev->stat.byte_tx += len;skb_pull (skb, len);
drivers/cpuidle/cpuidle-riscv-sbi.c +2 -2
@@ -534,12 +534,12 @@ static int sbi_cpuidle_probe(struct platform_device *pdev)int cpu, ret;struct cpuidle_driver *drv;struct cpuidle_device *dev; -struct device_node *np, *pds_node; +struct device_node *pds_node;/* Detect OSI support based on CPU DT nodes */ sbi_cpuidle_use_osi = true;for_each_possible_cpu (cpu) { - np =of_cpu_device_node_get (cpu); + struct device_node *np __free(device_node) = of_cpu_device_node_get(cpu);if (np &&of_property_present (np,"power-domains" ) &&of_property_present (np,"power-domain-names" )) {
drivers/gpu/drm/amd/amdkfd/kfd_debug.c +17 -0
@@ -349,10 +349,27 @@ int kfd_dbg_set_mes_debug_mode(struct kfd_process_device *pdd, bool sq_trap_en) {uint32_t spi_dbg_cntl = pdd->spi_dbg_override | pdd->spi_dbg_launch_mode;uint32_t flags = pdd->process->dbg_flags; +struct amdgpu_device *adev = pdd->dev->adev; +int r;if (!kfd_dbg_is_per_vmid_supported (pdd->dev))return 0 ; +if (!pdd->proc_ctx_cpu_ptr) { + r =amdgpu_amdkfd_alloc_gtt_mem (adev, +AMDGPU_MES_PROC_CTX_SIZE , + &pdd->proc_ctx_bo, + &pdd->proc_ctx_gpu_addr, + &pdd->proc_ctx_cpu_ptr, + false); +if (r) { +dev_err (adev->dev, +"failed to allocate process context bo\n" ); +return r; + } +memset (pdd->proc_ctx_cpu_ptr,0 ,AMDGPU_MES_PROC_CTX_SIZE ); + } +return amdgpu_mes_set_shader_debugger (pdd->dev->adev, pdd->proc_ctx_gpu_addr, spi_dbg_cntl, pdd->watch_points, flags, sq_trap_en); }
drivers/gpu/drm/amd/display/dc/dc.h +1 -1
@@ -49,7 +49,7 @@ struct dmub_notification;#define DC_VER "3.2.247" -#define MAX_SURFACES 3 +#define MAX_SURFACES 4#define MAX_PLANES 6#define MAX_STREAMS 6#define MIN_VIEWPORT_SIZE 12
drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h +8 -0
@@ -66,11 +66,15 @@ static inline double dml_max5(double a, double b, double c, double d, double e)static inline double dml_ceil (double a,double granularity) { +if (granularity ==0 ) +return 0 ;return (double )dcn_bw_ceil2 (a, granularity); }static inline double dml_floor (double a,double granularity) { +if (granularity ==0 ) +return 0 ;return (double )dcn_bw_floor2 (a, granularity); }
@@ -114,11 +118,15 @@ static inline double dml_ceil_2(double f)static inline double dml_ceil_ex (double x,double granularity) { +if (granularity ==0 ) +return 0 ;return (double )dcn_bw_ceil2 (x, granularity); }static inline double dml_floor_ex (double x,double granularity) { +if (granularity ==0 ) +return 0 ;return (double )dcn_bw_floor2 (x, granularity); }
drivers/gpu/drm/mediatek/Kconfig +0 -5
@@ -10,9 +10,6 @@ config DRM_MEDIATEK select DRM_KMS_HELPER select DRM_MIPI_DSI select DRM_PANEL - select MEMORY - select MTK_SMI - select PHY_MTK_MIPI_DSI select VIDEOMODE_HELPERS help Choose this option if you have a Mediatek SoCs.
@@ -23,7 +20,6 @@ config DRM_MEDIATEK config DRM_MEDIATEK_DP tristate "DRM DPTX Support for MediaTek SoCs" depends on DRM_MEDIATEK - select PHY_MTK_DP select DRM_DISPLAY_HELPER select DRM_DISPLAY_DP_HELPER select DRM_DP_AUX_BUS
@@ -34,6 +30,5 @@ config DRM_MEDIATEK_HDMI tristate "DRM HDMI Support for Mediatek SoCs" depends on DRM_MEDIATEK select SND_SOC_HDMI_CODEC if SND_SOC - select PHY_MTK_HDMI help DRM/KMS HDMI driver for Mediatek SoCs
drivers/gpu/drm/mediatek/mtk_disp_ovl.c +29 -28
89 lines not on this page · raw message
drivers/gpu/drm/mediatek/mtk_dp.c +27 -19
96 lines not on this page · raw message
drivers/gpu/drm/mediatek/mtk_drm_drv.c +2 -0
@@ -633,6 +633,8 @@ static int mtk_drm_bind(struct device *dev) err_free: private->drm =NULL ;drm_dev_put (drm); +for (i =0 ; i < private->data->mmsys_dev_num; i++) + private->all_drm_private[i]->drm =NULL ;return ret; }
drivers/hwmon/drivetemp.c +6 -2
@@ -165,6 +165,7 @@ static int drivetemp_scsi_command(struct drivetemp_data *st, {u8 scsi_cmd[MAX_COMMAND_SIZE ];enum req_op op; +int err;memset (scsi_cmd,0 ,sizeof (scsi_cmd)); scsi_cmd[0 ] =ATA_16 ;
@@ -192,8 +193,11 @@ static int drivetemp_scsi_command(struct drivetemp_data *st, scsi_cmd[12 ] = lba_high; scsi_cmd[14 ] = ata_command; -return scsi_execute_cmd (st->sdev, scsi_cmd, op, st->smartdata, -ATA_SECT_SIZE ,HZ ,5 ,NULL ); + err =scsi_execute_cmd (st->sdev, scsi_cmd, op, st->smartdata, +ATA_SECT_SIZE ,HZ ,5 ,NULL ); +if (err >0 ) + err = -EIO ; +return err; } static int drivetemp_ata_command(struct drivetemp_data *st, u8 feature,
drivers/iio/adc/ad7124.c +3 -0
@@ -923,6 +923,9 @@ static int ad7124_setup(struct ad7124_state *st)* set all channels to this default value. */ ad7124_set_channel_odr (st, i,10 ); + +/* Disable all channels to prevent unintended conversions. */ +ad_sd_write_reg (&st->sd,AD7124_CHANNEL (i),2 ,0 ); }return ret;
drivers/iio/adc/at91_adc.c +1 -1
@@ -984,7 +984,7 @@ static int at91_ts_register(struct iio_dev *idev,return ret; err: -input_free_device (st->ts_input); +input_free_device (input);return ret; }
drivers/iio/adc/rockchip_saradc.c +2 -0
@@ -368,6 +368,8 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)int ret;int i, j =0 ; +memset (&data,0 ,sizeof (data)); +mutex_lock (&info->lock);for_each_set_bit (i, i_dev->active_scan_mask, i_dev->masklength) {
drivers/iio/adc/ti-ads124s08.c +2 -2
@@ -183,9 +183,9 @@ static int ads124s_reset(struct iio_dev *indio_dev)struct ads124s_private *priv =iio_priv (indio_dev);if (priv->reset_gpio) { -gpiod_set_value (priv->reset_gpio,0 ); +gpiod_set_value_cansleep (priv->reset_gpio,0 );udelay (200 ); -gpiod_set_value (priv->reset_gpio,1 ); +gpiod_set_value_cansleep (priv->reset_gpio,1 ); }else {return ads124s_write_cmd (indio_dev,ADS124S08_CMD_RESET ); }
drivers/iio/adc/ti-ads8688.c +1 -1
@@ -382,7 +382,7 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)struct iio_poll_func *pf = p;struct iio_dev *indio_dev = pf->indio_dev;/* Ensure naturally aligned timestamp */ -u16 buffer[ADS8688_MAX_CHANNELS +sizeof (s64)/sizeof (u16)]__aligned(8) ; +u16 buffer[ADS8688_MAX_CHANNELS +sizeof (s64)/sizeof (u16)]__aligned(8) = { };int i, j =0 ;for (i =0 ; i < indio_dev->masklength; i++) {
drivers/iio/dummy/iio_simple_dummy_buffer.c +1 -1
@@ -48,7 +48,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)int i =0 , j;u16 *data; - data =kmalloc (indio_dev->scan_bytes,GFP_KERNEL ); + data =kzalloc (indio_dev->scan_bytes,GFP_KERNEL );if (!data) goto done;
drivers/iio/gyro/fxas21002c_core.c +8 -1
@@ -730,14 +730,21 @@ static irqreturn_t fxas21002c_trigger_handler(int irq, void *p)int ret;mutex_lock (&data->lock); + ret =fxas21002c_pm_get (data); +if (ret <0 ) + goto out_unlock; + ret =regmap_bulk_read (data->regmap,FXAS21002C_REG_OUT_X_MSB , data->buffer,CHANNEL_SCAN_MAX *sizeof (s16));if (ret <0 ) - goto out_unlock; + goto out_pm_put;iio_push_to_buffers_with_timestamp (indio_dev, data->buffer, data->timestamp); +out_pm_put: +fxas21002c_pm_put (data); + out_unlock:mutex_unlock (&data->lock);
drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +7 -1
@@ -17,6 +17,7 @@#include <linux/regmap.h> #include <linux/iio/iio.h> +#include <linux/iio/common/inv_sensors_timestamp.h> #include "inv_icm42600.h" #include "inv_icm42600_buffer.h"
@@ -725,6 +726,8 @@ static int inv_icm42600_suspend(struct device *dev)static int inv_icm42600_resume (struct device *dev) {struct inv_icm42600_state *st =dev_get_drvdata (dev); +struct inv_sensors_timestamp *gyro_ts =iio_priv (st->indio_gyro); +struct inv_sensors_timestamp *accel_ts =iio_priv (st->indio_accel);int ret;mutex_lock (&st->lock);
@@ -745,9 +748,12 @@ static int inv_icm42600_resume(struct device *dev) goto out_unlock;/* restore FIFO data streaming */ -if (st->fifo.on) +if (st->fifo.on) { +inv_sensors_timestamp_reset (gyro_ts); +inv_sensors_timestamp_reset (accel_ts); ret =regmap_write (st->map,INV_ICM42600_REG_FIFO_CONFIG ,INV_ICM42600_FIFO_CONFIG_STREAM ); + } out_unlock:mutex_unlock (&st->lock);
drivers/iio/imu/kmx61.c +1 -1
@@ -1192,7 +1192,7 @@ static irqreturn_t kmx61_trigger_handler(int irq, void *p)struct kmx61_data *data =kmx61_get_data (indio_dev);int bit, ret, i =0 ;u8 base; -s16 buffer[8 ]; +s16 buffer[8 ] = { };if (indio_dev == data->acc_indio_dev) base =KMX61_ACC_XOUT_L ;
drivers/iio/inkern.c +1 -1
@@ -514,7 +514,7 @@ struct iio_channel *iio_channel_get_all(struct device *dev)return chans; error_free_chans: -for (i =0 ; i < nummaps; i++) +for (i =0 ; i < mapind; i++)iio_device_put (chans[i].indio_dev);kfree (chans); error_ret:
drivers/iio/light/vcnl4035.c +1 -1
@@ -105,7 +105,7 @@ static irqreturn_t vcnl4035_trigger_consumer_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct vcnl4035_data *data =iio_priv (indio_dev);/* Ensure naturally aligned timestamp */ -u8 buffer[ALIGN (sizeof (u16),sizeof (s64)) +sizeof (s64)]__aligned(8) ; +u8 buffer[ALIGN (sizeof (u16),sizeof (s64)) +sizeof (s64)]__aligned(8) = { };int ret; ret =regmap_read (data->regmap,VCNL4035_ALS_DATA , (int *)buffer);
drivers/iio/pressure/zpa2326.c +2 -0
@@ -586,6 +586,8 @@ static int zpa2326_fill_sample_buffer(struct iio_dev *indio_dev, } sample;int err; +memset (&sample,0 ,sizeof (sample)); +if (test_bit (0 , indio_dev->active_scan_mask)) {/* Get current pressure from hardware FIFO. */ err =zpa2326_dequeue_pressure (indio_dev, &sample.pressure);
drivers/md/dm-ebs-target.c +1 -1
@@ -442,7 +442,7 @@ static int ebs_iterate_devices(struct dm_target *ti,static struct target_type ebs_target = { .name ="ebs" , .version = {1 ,0 ,1 }, - .features =DM_TARGET_PASSES_INTEGRITY , + .features =0 , .module =THIS_MODULE , .ctr = ebs_ctr, .dtr = ebs_dtr,
drivers/md/dm-thin.c +2 -3
@@ -2334,10 +2334,9 @@ static struct thin_c *get_first_thin(struct pool *pool)struct thin_c *tc =NULL ;rcu_read_lock (); -if (!list_empty (&pool->active_thins)) { - tc = list_entry_rcu(pool->active_thins.next, struct thin_c, list); + tc = list_first_or_null_rcu(&pool->active_thins, struct thin_c, list); +if (tc)thin_get (tc); - }rcu_read_unlock ();return tc;
drivers/md/dm-verity-fec.c +26 -13
@@ -60,14 +60,19 @@ static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio,* to the data block. Caller is responsible for releasing buf. */ static u8 *fec_read_parity (struct dm_verity *v,u64 rsb,int index, -unsigned int *offset,struct dm_buffer **buf) +unsigned int *offset,unsigned int par_buf_offset, +struct dm_buffer **buf) {u64 position, block, rem;u8 *res; +/* We have already part of parity bytes read, skip to the next block */ +if (par_buf_offset) + index++; + position = (index + rsb) * v->fec->roots; block =div64_u64_rem (position, v->fec->io_size, &rem); - *offset = (unsigned int )rem; + *offset = par_buf_offset ?0 : (unsigned int )rem; res =dm_bufio_read (v->fec->bufio, block, buf);if (IS_ERR (res)) {
@@ -127,10 +132,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio, {int r, corrected =0 , res;struct dm_buffer *buf; -unsigned int n, i, offset; -u8 *par, *block; +unsigned int n, i, offset, par_buf_offset =0 ; +u8 *par, *block, par_buf[DM_VERITY_FEC_RSM -DM_VERITY_FEC_MIN_RSN ]; - par =fec_read_parity (v, rsb, block_offset, &offset, &buf); + par =fec_read_parity (v, rsb, block_offset, &offset, + par_buf_offset, &buf);if (IS_ERR (par))return PTR_ERR (par);
@@ -140,7 +146,8 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,*/ fec_for_each_buffer_rs_block (fio, n, i) { block =fec_buffer_rs_block (v, fio, n, i); - res =fec_decode_rs8 (v, fio, block, &par[offset], neras); +memcpy (&par_buf[par_buf_offset], &par[offset], v->fec->roots - par_buf_offset); + res =fec_decode_rs8 (v, fio, block, par_buf, neras);if (res <0 ) { r = res; goto error;
@@ -153,12 +160,21 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,if (block_offset >=1 << v->data_dev_block_bits) goto done; -/* read the next block when we run out of parity bytes */ - offset += v->fec->roots; +/* Read the next block when we run out of parity bytes */ + offset += (v->fec->roots - par_buf_offset); +/* Check if parity bytes are split between blocks */ +if (offset < v->fec->io_size && (offset + v->fec->roots) > v->fec->io_size) { + par_buf_offset = v->fec->io_size - offset; +memcpy (par_buf, &par[offset], par_buf_offset); + offset += par_buf_offset; + }else + par_buf_offset =0 ; +if (offset >= v->fec->io_size) {dm_bufio_release (buf); - par =fec_read_parity (v, rsb, block_offset, &offset, &buf); + par =fec_read_parity (v, rsb, block_offset, &offset, + par_buf_offset, &buf);if (IS_ERR (par))return PTR_ERR (par); }
@@ -743,10 +759,7 @@ int verity_fec_ctr(struct dm_verity *v)return -E2BIG ; } -if ((f->roots <<SECTOR_SHIFT ) & ((1 << v->data_dev_block_bits) -1 )) - f->io_size =1 << v->data_dev_block_bits; -else - f->io_size = v->fec->roots <<SECTOR_SHIFT ; + f->io_size =1 << v->data_dev_block_bits; f->bufio = dm_bufio_client_create(f->dev->bdev, f->io_size,
drivers/md/persistent-data/dm-array.c +12 -7
@@ -917,23 +917,27 @@ static int load_ablock(struct dm_array_cursor *c)if (c->block)unlock_ablock (c->info, c->block); - c->block =NULL ; - c->ab =NULL ; c->index =0 ; r =dm_btree_cursor_get_value (&c->cursor, &key, &value_le);if (r) {DMERR ("dm_btree_cursor_get_value failed" ); -dm_btree_cursor_end (&c->cursor); + goto out; }else { r =get_ablock (c->info,le64_to_cpu (value_le), &c->block, &c->ab);if (r) {DMERR ("get_ablock failed" ); -dm_btree_cursor_end (&c->cursor); + goto out; } } +return 0 ; + +out: +dm_btree_cursor_end (&c->cursor); + c->block =NULL ; + c->ab =NULL ;return r; }
@@ -956,10 +960,10 @@ EXPORT_SYMBOL_GPL(dm_array_cursor_begin);void dm_array_cursor_end (struct dm_array_cursor *c) { -if (c->block) { +if (c->block)unlock_ablock (c->info, c->block); -dm_btree_cursor_end (&c->cursor); - } + +dm_btree_cursor_end (&c->cursor); }EXPORT_SYMBOL_GPL (dm_array_cursor_end);
@@ -999,6 +1003,7 @@ int dm_array_cursor_skip(struct dm_array_cursor *c, uint32_t count) } count -= remaining; + c->index += (remaining -1 ); r =dm_array_cursor_next (c); }while (!r);
drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c +2 -2
@@ -148,7 +148,7 @@ static int pci1xxxx_gpio_set_config(struct gpio_chip *gpio, unsigned int offset,pci1xxx_assign_bit (priv->reg_base,OPENDRAIN_OFFSET (offset), (offset %32 ), true);break ;default : - ret = -EOPNOTSUPP ; + ret = -ENOTSUPP ;break ; }spin_unlock_irqrestore (&priv->lock, flags);
@@ -277,7 +277,7 @@ static irqreturn_t pci1xxxx_gpio_irq_handler(int irq, void *dev_id)writel (BIT (bit), priv->reg_base +INTR_STATUS_OFFSET (gpiobank));spin_unlock_irqrestore (&priv->lock, flags); irq =irq_find_mapping (gc->irq.domain, (bit + (gpiobank *32 ))); -generic_handle_irq (irq); +handle_nested_irq (irq); } }spin_lock_irqsave (&priv->lock, flags);
drivers/net/ethernet/amd/pds_core/devlink.c +1 -1
@@ -117,7 +117,7 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,if (err && err != -EIO )return err; - listlen = fw_list.num_fw_slots; + listlen =min (fw_list.num_fw_slots,ARRAY_SIZE (fw_list.fw_names));for (i =0 ; i < listlen; i++) {if (i <ARRAY_SIZE (fw_slotnames))strscpy (buf, fw_slotnames[i],sizeof (buf));
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +2 -1
@@ -159,7 +159,7 @@ int bnxt_send_msg(struct bnxt_en_dev *edev, rc =hwrm_req_replace (bp, req, fw_msg->msg, fw_msg->msg_len);if (rc) -return rc; + goto drop_req;hwrm_req_timeout (bp, req, fw_msg->timeout); resp =hwrm_req_hold (bp, req);
@@ -171,6 +171,7 @@ int bnxt_send_msg(struct bnxt_en_dev *edev,memcpy (fw_msg->resp, resp, resp_len); } +drop_req:hwrm_req_drop (bp, req);return rc; }
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +4 -1
@@ -1799,7 +1799,10 @@ void cxgb4_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid, struct adapter *adap = container_of(t, struct adapter, tids);struct sk_buff *skb; -WARN_ON (tid_out_of_range (&adap->tids, tid)); +if (tid_out_of_range (&adap->tids, tid)) { +dev_err (adap->pdev_dev,"tid %d out of range\n" , tid); +return ; + }if (t->tid_tab[tid - adap->tids.tid_base]) { t->tid_tab[tid - adap->tids.tid_base] =NULL ;
drivers/net/ethernet/google/gve/gve_main.c +9 -5
@@ -2009,14 +2009,18 @@ static void gve_service_task(struct work_struct *work)static void gve_set_netdev_xdp_features (struct gve_priv *priv) { +xdp_features_t xdp_features; +if (priv->queue_format ==GVE_GQI_QPL_FORMAT ) { - priv->dev->xdp_features =NETDEV_XDP_ACT_BASIC ; - priv->dev->xdp_features |=NETDEV_XDP_ACT_REDIRECT ; - priv->dev->xdp_features |=NETDEV_XDP_ACT_NDO_XMIT ; - priv->dev->xdp_features |=NETDEV_XDP_ACT_XSK_ZEROCOPY ; + xdp_features =NETDEV_XDP_ACT_BASIC ; + xdp_features |=NETDEV_XDP_ACT_REDIRECT ; + xdp_features |=NETDEV_XDP_ACT_NDO_XMIT ; + xdp_features |=NETDEV_XDP_ACT_XSK_ZEROCOPY ; }else { - priv->dev->xdp_features =0 ; + xdp_features =0 ; } + +xdp_set_features_flag (priv->dev, xdp_features); }static int gve_init_priv (struct gve_priv *priv,bool skip_describe_device)
drivers/net/ethernet/intel/ice/ice_ptp_consts.h +2 -2
@@ -359,9 +359,9 @@ const struct ice_vernier_info_e822 e822_vernier[NUM_ICE_PTP_LNK_SPD] = {/* rx_desk_rsgb_par */ 644531250 ,/* 644.53125 MHz Reed Solomon gearbox */ /* tx_desk_rsgb_pcs */ -644531250 ,/* 644.53125 MHz Reed Solomon gearbox */ +390625000 ,/* 390.625 MHz Reed Solomon gearbox */ /* rx_desk_rsgb_pcs */ -644531250 ,/* 644.53125 MHz Reed Solomon gearbox */ +390625000 ,/* 390.625 MHz Reed Solomon gearbox */ /* tx_fixed_delay */ 1620,/* pmd_adj_divisor */
drivers/net/ethernet/intel/igc/igc_base.c +8 -4
@@ -68,8 +68,11 @@ static s32 igc_init_nvm_params_base(struct igc_hw *hw)u32 eecd =rd32 (IGC_EECD );u16 size; - size = (u16)((eecd &IGC_EECD_SIZE_EX_MASK ) >> -IGC_EECD_SIZE_EX_SHIFT ); +/* failed to read reg and got all F's */ +if (!(~eecd)) +return -ENXIO ; + + size =FIELD_GET (IGC_EECD_SIZE_EX_MASK , eecd);/* Added to a constant, "size" becomes the left-shift value * for setting word_size.
@@ -162,8 +165,7 @@ static s32 igc_init_phy_params_base(struct igc_hw *hw) phy->reset_delay_us =100 ;/* set lan id */ - hw->bus.func = (rd32 (IGC_STATUS ) &IGC_STATUS_FUNC_MASK ) >> -IGC_STATUS_FUNC_SHIFT ; + hw->bus.func =FIELD_GET (IGC_STATUS_FUNC_MASK ,rd32 (IGC_STATUS ));/* Make sure the PHY is in a good state. Several people have reported * firmware leaving the PHY's page select register set to something
@@ -223,6 +225,8 @@ static s32 igc_get_invariants_base(struct igc_hw *hw)/* NVM initialization */ ret_val =igc_init_nvm_params_base (hw); +if (ret_val) + goto out;switch (hw->mac.type) {case igc_i225: ret_val =igc_init_nvm_params_i225 (hw);
drivers/net/ethernet/intel/igc/igc_i225.c +2 -3
@@ -579,9 +579,8 @@ s32 igc_set_ltr_i225(struct igc_hw *hw, bool link)/* Calculate tw_system (nsec). */ if (speed ==SPEED_100 ) { - tw_system = ((rd32 (IGC_EEE_SU ) & -IGC_TW_SYSTEM_100_MASK ) >> -IGC_TW_SYSTEM_100_SHIFT ) *500 ; + tw_system =FIELD_GET (IGC_TW_SYSTEM_100_MASK , +rd32 (IGC_EEE_SU )) *500 ; }else { tw_system = (rd32 (IGC_EEE_SU ) &IGC_TW_SYSTEM_1000_MASK ) *500 ;
drivers/net/ethernet/intel/igc/igc_main.c +2 -4
@@ -3708,8 +3708,7 @@ static int igc_enable_nfc_rule(struct igc_adapter *adapter, }if (rule->filter.match_flags &IGC_FILTER_FLAG_VLAN_TCI ) { -int prio = (rule->filter.vlan_tci &VLAN_PRIO_MASK ) >> -VLAN_PRIO_SHIFT ; +int prio =FIELD_GET (VLAN_PRIO_MASK , rule->filter.vlan_tci); err =igc_add_vlan_prio_filter (adapter, prio, rule->action);if (err)
@@ -3731,8 +3730,7 @@ static void igc_disable_nfc_rule(struct igc_adapter *adapter,igc_del_etype_filter (adapter, rule->filter.etype);if (rule->filter.match_flags &IGC_FILTER_FLAG_VLAN_TCI ) { -int prio = (rule->filter.vlan_tci &VLAN_PRIO_MASK ) >> -VLAN_PRIO_SHIFT ; +int prio =FIELD_GET (VLAN_PRIO_MASK , rule->filter.vlan_tci);igc_del_vlan_prio_filter (adapter, prio); }
drivers/net/ethernet/intel/igc/igc_phy.c +2 -2
@@ -727,7 +727,7 @@ static s32 igc_write_xmdio_reg(struct igc_hw *hw, u16 addr,*/ s32 igc_write_phy_reg_gpy (struct igc_hw *hw,u32 offset,u16 data) { -u8 dev_addr = (offset &GPY_MMD_MASK ) >>GPY_MMD_SHIFT ; +u8 dev_addr =FIELD_GET (GPY_MMD_MASK , offset);s32 ret_val; offset = offset &GPY_REG_MASK ;
@@ -758,7 +758,7 @@ s32 igc_write_phy_reg_gpy(struct igc_hw *hw, u32 offset, u16 data)*/ s32 igc_read_phy_reg_gpy (struct igc_hw *hw,u32 offset,u16 *data) { -u8 dev_addr = (offset &GPY_MMD_MASK ) >>GPY_MMD_SHIFT ; +u8 dev_addr =FIELD_GET (GPY_MMD_MASK , offset);s32 ret_val; offset = offset &GPY_REG_MASK ;
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +1 -0
@@ -1006,6 +1006,7 @@ static void cmd_work_handler(struct work_struct *work)complete (&ent->done); }up (&cmd->vars.sem); +complete (&ent->slotted);return ; } }else {
drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c +11 -3
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0-only +#include <linux/iommu.h> #include <linux/platform_device.h> #include <linux/of.h> #include <linux/module.h>
@@ -19,6 +20,8 @@ struct tegra_mgbe {struct reset_control *rst_mac;struct reset_control *rst_pcs; +u32 iommu_sid; +void __iomem *hv;void __iomem *regs;void __iomem *xpcs;
@@ -50,7 +53,6 @@ struct tegra_mgbe {#define MGBE_WRAP_COMMON_INTR_ENABLE 0x8704#define MAC_SBD_INTR BIT(2)#define MGBE_WRAP_AXI_ASID0_CTRL 0x8400 -#define MGBE_SID 0x6static int __maybe_unused tegra_mgbe_suspend (struct device *dev) {
@@ -84,7 +86,7 @@ static int __maybe_unused tegra_mgbe_resume(struct device *dev)writel (MAC_SBD_INTR , mgbe->regs +MGBE_WRAP_COMMON_INTR_ENABLE );/* Program SID */ -writel (MGBE_SID , mgbe->hv +MGBE_WRAP_AXI_ASID0_CTRL ); +writel (mgbe->iommu_sid, mgbe->hv +MGBE_WRAP_AXI_ASID0_CTRL ); value =readl (mgbe->xpcs +XPCS_WRAP_UPHY_STATUS );if ((value &XPCS_WRAP_UPHY_STATUS_TX_P_UP ) ==0 ) {
@@ -241,6 +243,12 @@ static int tegra_mgbe_probe(struct platform_device *pdev)if (IS_ERR (mgbe->xpcs))return PTR_ERR (mgbe->xpcs); +/* get controller's stream id from iommu property in device tree */ +if (!tegra_dev_iommu_get_stream_id (mgbe->dev, &mgbe->iommu_sid)) { +dev_err (mgbe->dev,"failed to get iommu stream id\n" ); +return -EINVAL ; + } + res.addr = mgbe->regs; res.irq = irq;
@@ -346,7 +354,7 @@ static int tegra_mgbe_probe(struct platform_device *pdev)writel (MAC_SBD_INTR , mgbe->regs +MGBE_WRAP_COMMON_INTR_ENABLE );/* Program SID */ -writel (MGBE_SID , mgbe->hv +MGBE_WRAP_AXI_ASID0_CTRL ); +writel (mgbe->iommu_sid, mgbe->hv +MGBE_WRAP_AXI_ASID0_CTRL ); plat->flags |=STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP ;
drivers/net/ethernet/wangxun/libwx/wx_hw.c +11 -13
@@ -242,27 +242,25 @@ int wx_host_interface_command(struct wx *wx, u32 *buffer, status =read_poll_timeout (rd32, hicr, hicr &WX_MNG_MBOX_CTL_FWRDY ,1000 , timeout *1000 , false, wx,WX_MNG_MBOX_CTL ); + buf[0 ] =rd32 (wx,WX_MNG_MBOX ); +if ((buf[0 ] &0xff0000 ) >>16 ==0x80 ) { +wx_err (wx,"Unknown FW command: 0x%x\n" , buffer[0 ] &0xff ); + status = -EINVAL ; + goto rel_out; + } +/* Check command completion */ if (status) { -wx_dbg (wx,"Command has failed with no status valid.\n" ); - - buf[0 ] =rd32 (wx,WX_MNG_MBOX ); -if ((buffer[0 ] &0xff ) != (~buf[0 ] >>24 )) { - status = -EINVAL ; - goto rel_out; - } -if ((buf[0 ] &0xff0000 ) >>16 ==0x80 ) { -wx_dbg (wx,"It's unknown cmd.\n" ); - status = -EINVAL ; - goto rel_out; - } - +wx_err (wx,"Command has failed with no status valid.\n" );wx_dbg (wx,"write value:\n" );for (i =0 ; i < dword_len; i++)wx_dbg (wx,"%x " , buffer[i]);wx_dbg (wx,"read value:\n" );for (i =0 ; i < dword_len; i++)wx_dbg (wx,"%x " , buf[i]); +wx_dbg (wx,"\ncheck: %x %x\n" , buffer[0 ] &0xff , ~buf[0 ] >>24 ); + + goto rel_out; }if (!return_data)
drivers/net/ieee802154/ca8210.c +5 -1
@@ -3078,7 +3078,11 @@ static int ca8210_probe(struct spi_device *spi_device)spi_set_drvdata (priv->spi, priv);if (IS_ENABLED (CONFIG_IEEE802154_CA8210_DEBUGFS )) { cascoda_api_upstream = ca8210_test_int_driver_write; -ca8210_test_interface_init (priv); + ret =ca8210_test_interface_init (priv); +if (ret) { +dev_crit (&spi_device->dev,"ca8210_test_interface_init failed\n" ); + goto error; + } }else { cascoda_api_upstream =NULL ; }
drivers/platform/x86/amd/pmc/pmc.c +7 -1
@@ -878,6 +878,10 @@ static int amd_pmc_suspend_handler(struct device *dev) {struct amd_pmc_dev *pdev =dev_get_drvdata (dev); +/* +* Must be called only from the same set of dev_pm_ops handlers +* as i8042_pm_suspend() is called: currently just from .suspend. +*/ if (pdev->disable_8042_wakeup && !disable_workarounds) {int rc =amd_pmc_wa_irq1 (pdev);
@@ -890,7 +894,9 @@ static int amd_pmc_suspend_handler(struct device *dev)return 0 ; } -static DEFINE_SIMPLE_DEV_PM_OPS(amd_pmc_pm, amd_pmc_suspend_handler, NULL); +static const struct dev_pm_ops amd_pmc_pm = { + .suspend = amd_pmc_suspend_handler, +};static const struct pci_device_id pmc_pci_ids[] = { {PCI_DEVICE (PCI_VENDOR_ID_AMD ,AMD_CPU_ID_PS ) },
drivers/pmdomain/imx/gpcv2.c +3 -7
@@ -1449,12 +1449,12 @@ static int imx_gpcv2_probe(struct platform_device *pdev) .max_register = SZ_4K, };struct device *dev = &pdev->dev; -struct device_node *pgc_np, *np; + struct device_node *pgc_np __free(device_node) = +of_get_child_by_name (dev->of_node,"pgc" );struct regmap *regmap;void __iomem *base;int ret; - pgc_np =of_get_child_by_name (dev->of_node,"pgc" );if (!pgc_np) {dev_err (dev,"No power domains specified in DT\n" );return -EINVAL ;
@@ -1471,7 +1471,7 @@ static int imx_gpcv2_probe(struct platform_device *pdev)return ret; } -for_each_child_of_node (pgc_np, np) { +for_each_child_of_node_scoped (pgc_np, np) {struct platform_device *pd_pdev;struct imx_pgc_domain *domain;u32 domain_index;
@@ -1482,7 +1482,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) ret =of_property_read_u32 (np,"reg" , &domain_index);if (ret) {dev_err (dev,"Failed to read 'reg' property\n" ); -of_node_put (np);return ret; }
@@ -1497,7 +1496,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) domain_index);if (!pd_pdev) {dev_err (dev,"Failed to allocate platform device\n" ); -of_node_put (np);return -ENOMEM ; }
@@ -1506,7 +1504,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) sizeof(domain_data->domains[domain_index]));if (ret) {platform_device_put (pd_pdev); -of_node_put (np);return ret; }
@@ -1523,7 +1520,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) ret =platform_device_add (pd_pdev);if (ret) {platform_device_put (pd_pdev); -of_node_put (np);return ret; } }
drivers/staging/iio/frequency/ad9832.c +1 -1
@@ -158,7 +158,7 @@ static int ad9832_write_frequency(struct ad9832_state *st,static int ad9832_write_phase (struct ad9832_state *st,unsigned long addr,unsigned long phase) { -if (phase >BIT (AD9832_PHASE_BITS )) +if (phase >=BIT (AD9832_PHASE_BITS ))return -EINVAL ; st->phase_data[0] = cpu_to_be16((AD9832_CMD_PHA8BITSW << CMD_SHIFT) |
drivers/staging/iio/frequency/ad9834.c +1 -1
@@ -131,7 +131,7 @@ static int ad9834_write_frequency(struct ad9834_state *st,static int ad9834_write_phase (struct ad9834_state *st,unsigned long addr,unsigned long phase) { -if (phase >BIT (AD9834_PHASE_BITS )) +if (phase >=BIT (AD9834_PHASE_BITS ))return -EINVAL ; st->data =cpu_to_be16 (addr | phase);
drivers/thermal/thermal_of.c +1 -0
@@ -203,6 +203,7 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int goto out; } +of_node_put (sensor_specs.np);if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ? sensor_specs.args[0 ] :0 )) {pr_debug ("sensor %pOFn id=%d belongs to %pOFn\n" , sensor, id, child);
drivers/tty/serial/8250/8250_core.c +3 -0
@@ -1131,6 +1131,9 @@ int serial8250_register_8250_port(const struct uart_8250_port *up) uart->dl_write = up->dl_write;if (uart->port.type !=PORT_8250_CIR ) { +if (uart_console_registered (&uart->port)) +pm_runtime_get_sync (uart->port.dev); +if (serial8250_isa_config !=NULL )serial8250_isa_config (0 , &uart->port, &uart->capabilities);
drivers/ufs/core/ufshcd-priv.h +0 -6
@@ -242,12 +242,6 @@ static inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba, hba->vops->config_scaling_param (hba, p, data); } -static inline void ufshcd_vops_reinit_notify (struct ufs_hba *hba) -{ -if (hba->vops && hba->vops->reinit_notify) - hba->vops->reinit_notify (hba); -} -static inline int ufshcd_vops_mcq_config_resource (struct ufs_hba *hba) {if (hba->vops && hba->vops->mcq_config_resource)
drivers/ufs/core/ufshcd.c +0 -1
@@ -8795,7 +8795,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params)ufshcd_device_reset (hba);ufs_put_device_desc (hba);ufshcd_hba_stop (hba); -ufshcd_vops_reinit_notify (hba); ret =ufshcd_hba_enable (hba);if (ret) {dev_err (hba->dev,"Host controller enable failed\n" );
drivers/ufs/host/ufs-qcom.c +5 -8
@@ -455,6 +455,11 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)dev_warn (hba->dev,"%s: host reset returned %d\n" , __func__, ret); +if (phy->power_count) { +phy_power_off (phy); +phy_exit (phy); + } +/* phy initialization - calibrate the phy */ ret =phy_init (phy);if (ret) {
@@ -1638,13 +1643,6 @@ static void ufs_qcom_config_scaling_param(struct ufs_hba *hba, }#endif -static void ufs_qcom_reinit_notify (struct ufs_hba *hba) -{ -struct ufs_qcom_host *host =ufshcd_get_variant (hba); - -phy_power_off (host->generic_phy); -} -/* Resources */ static const struct ufshcd_res_info ufs_res_info[RES_MAX ] = { {.name ="ufs_mem" ,},
@@ -1887,7 +1885,6 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = { .device_reset = ufs_qcom_device_reset, .config_scaling_param = ufs_qcom_config_scaling_param, .program_key = ufs_qcom_ice_program_key, - .reinit_notify = ufs_qcom_reinit_notify, .mcq_config_resource = ufs_qcom_mcq_config_resource, .get_hba_mac = ufs_qcom_get_hba_mac, .op_runtime_config = ufs_qcom_op_runtime_config,
drivers/usb/chipidea/ci_hdrc_imx.c +17 -8
@@ -362,25 +362,29 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) data->pinctrl =devm_pinctrl_get (dev);if (PTR_ERR (data->pinctrl) == -ENODEV ) data->pinctrl =NULL ; -else if (IS_ERR (data->pinctrl)) -return dev_err_probe (dev,PTR_ERR (data->pinctrl), +else if (IS_ERR (data->pinctrl)) { + ret =dev_err_probe (dev,PTR_ERR (data->pinctrl),"pinctrl get failed\n" ); + goto err_put; + } data->hsic_pad_regulator =devm_regulator_get_optional (dev,"hsic" );if (PTR_ERR (data->hsic_pad_regulator) == -ENODEV ) {/* no pad regulator is needed */ data->hsic_pad_regulator =NULL ; - }else if (IS_ERR (data->hsic_pad_regulator)) -return dev_err_probe (dev,PTR_ERR (data->hsic_pad_regulator), + }else if (IS_ERR (data->hsic_pad_regulator)) { + ret =dev_err_probe (dev,PTR_ERR (data->hsic_pad_regulator),"Get HSIC pad regulator error\n" ); + goto err_put; + }if (data->hsic_pad_regulator) { ret =regulator_enable (data->hsic_pad_regulator);if (ret) {dev_err (dev,"Failed to enable HSIC pad regulator\n" ); -return ret; + goto err_put; } } }
@@ -394,13 +398,14 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)dev_err (dev,"pinctrl_hsic_idle lookup failed, err=%ld\n" ,PTR_ERR (pinctrl_hsic_idle)); -return PTR_ERR (pinctrl_hsic_idle); + ret =PTR_ERR (pinctrl_hsic_idle); + goto err_put; } ret =pinctrl_select_state (data->pinctrl, pinctrl_hsic_idle);if (ret) {dev_err (dev,"hsic_idle select failed, err=%d\n" , ret); -return ret; + goto err_put; } data->pinctrl_hsic_active = pinctrl_lookup_state(data->pinctrl,
@@ -409,7 +414,8 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)dev_err (dev,"pinctrl_hsic_active lookup failed, err=%ld\n" ,PTR_ERR (data->pinctrl_hsic_active)); -return PTR_ERR (data->pinctrl_hsic_active); + ret =PTR_ERR (data->pinctrl_hsic_active); + goto err_put; } }
@@ -513,6 +519,8 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)if (pdata.flags &CI_HDRC_PMQOS )cpu_latency_qos_remove_request (&data->pm_qos_req); data->ci_pdev =NULL ; +err_put: +put_device (data->usbmisc_data->dev);return ret; }
@@ -536,6 +544,7 @@ static void ci_hdrc_imx_remove(struct platform_device *pdev)if (data->hsic_pad_regulator)regulator_disable (data->hsic_pad_regulator); } +put_device (data->usbmisc_data->dev); }static void ci_hdrc_imx_shutdown (struct platform_device *pdev)
drivers/usb/class/usblp.c +4 -3
@@ -1337,11 +1337,12 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)if (protocol <USBLP_FIRST_PROTOCOL || protocol >USBLP_LAST_PROTOCOL )return -EINVAL ; + alts = usblp->protocol[protocol].alt_setting; +if (alts <0 ) +return -EINVAL ; +/* Don't unnecessarily set the interface if there's a single alt. */ if (usblp->intf->num_altsetting >1 ) { - alts = usblp->protocol[protocol].alt_setting; -if (alts <0 ) -return -EINVAL ; r =usb_set_interface (usblp->dev, usblp->ifnum, alts);if (r <0 ) { printk(KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n",
drivers/usb/core/hub.c +4 -2
@@ -2633,13 +2633,13 @@ int usb_new_device(struct usb_device *udev) err =sysfs_create_link (&udev->dev.kobj, &port_dev->dev.kobj,"port" );if (err) - goto fail; + goto out_del_dev; err =sysfs_create_link (&port_dev->dev.kobj, &udev->dev.kobj,"device" );if (err) {sysfs_remove_link (&udev->dev.kobj,"port" ); - goto fail; + goto out_del_dev; }if (!test_and_set_bit (port1, hub->child_usage_bits))
@@ -2651,6 +2651,8 @@ int usb_new_device(struct usb_device *udev)pm_runtime_put_sync_autosuspend (&udev->dev);return err; +out_del_dev: +device_del (&udev->dev); fail:usb_set_device_state (udev,USB_STATE_NOTATTACHED );pm_runtime_disable (&udev->dev);
drivers/usb/core/port.c +4 -3
@@ -451,10 +451,11 @@ static int usb_port_runtime_suspend(struct device *dev)static void usb_port_shutdown (struct device *dev) {struct usb_port *port_dev =to_usb_port (dev); +struct usb_device *udev = port_dev->child; -if (port_dev->child) { -usb_disable_usb2_hardware_lpm (port_dev->child); -usb_unlocked_disable_lpm (port_dev->child); +if (udev && !udev->port_is_suspended) { +usb_disable_usb2_hardware_lpm (udev); +usb_unlocked_disable_lpm (udev); } }
drivers/usb/dwc3/core.h +1 -0
@@ -451,6 +451,7 @@#define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6))/* These apply for core versions 1.94a and later */ +#define DWC3_DCTL_NYET_THRES_MASK (0xf << 20)#define DWC3_DCTL_NYET_THRES (n) (((n) & 0xf) << 20)#define DWC3_DCTL_KEEP_CONNECT BIT(19)
drivers/usb/dwc3/dwc3-am62.c +1 -0
@@ -284,6 +284,7 @@ static void dwc3_ti_remove(struct platform_device *pdev)pm_runtime_put_sync (dev);pm_runtime_disable (dev); +pm_runtime_dont_use_autosuspend (dev);pm_runtime_set_suspended (dev); }
drivers/usb/dwc3/gadget.c +3 -1
@@ -4208,8 +4208,10 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum,"LPM Erratum not available on dwc3 revisions < 2.40a\n" ); - if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) + if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) { + reg &= ~DWC3_DCTL_NYET_THRES_MASK ; reg |=DWC3_DCTL_NYET_THRES (dwc->lpm_nyet_threshold); + }dwc3_gadget_dctl_write_safe (dwc, reg); }else {
drivers/usb/gadget/Kconfig +2 -2
@@ -210,6 +210,8 @@ config USB_F_MIDI config USB_F_MIDI2 tristate + select SND_UMP + select SND_UMP_LEGACY_RAWMIDI config USB_F_HID tristate
@@ -444,8 +446,6 @@ config USB_CONFIGFS_F_MIDI2 depends on USB_CONFIGFS depends on SND select USB_LIBCOMPOSITE - select SND_UMP - select SND_UMP_LEGACY_RAWMIDI select USB_F_MIDI2 help The MIDI 2.0 function driver provides the generic emulated
drivers/usb/gadget/configfs.c +5 -1
@@ -824,11 +824,15 @@ static ssize_t gadget_string_s_store(struct config_item *item, const char *page, {struct gadget_string *string =to_gadget_string (item);int size =min (sizeof (string->string), len +1 ); +ssize_t cpy_len;if (len >USB_MAX_STRING_LEN )return -EINVAL ; -return strscpy (string->string, page, size); + cpy_len =strscpy (string->string, page, size); +if (cpy_len >0 && string->string[cpy_len -1 ] =='\n' ) + string->string[cpy_len -1 ] =0 ; +return len; }CONFIGFS_ATTR (gadget_string_, s);
drivers/usb/gadget/function/f_fs.c +1 -1
@@ -1810,7 +1810,7 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev)struct usb_gadget_strings **lang;int first_id; -if (WARN_ON (ffs->state !=FFS_ACTIVE +if ((ffs->state !=FFS_ACTIVE ||test_and_set_bit (FFS_FL_BOUND , &ffs->flags)))return -EBADFD ;
drivers/usb/gadget/function/f_uac2.c +1 -0
@@ -1176,6 +1176,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) uac2->as_in_alt =0 ; } + std_ac_if_desc.bNumEndpoints =0 ;if (FUOUT_EN (uac2_opts) ||FUIN_EN (uac2_opts)) { uac2->int_ep =usb_ep_autoconfig (gadget, &fs_ep_int_desc);if (!uac2->int_ep) {
drivers/usb/gadget/function/u_serial.c +4 -4
@@ -1398,6 +1398,10 @@ void gserial_disconnect(struct gserial *gser)/* REVISIT as above: how best to track this? */ port->port_line_coding = gser->port_line_coding; +/* disable endpoints, aborting down any active I/O */ +usb_ep_disable (gser->out); +usb_ep_disable (gser->in); + port->port_usb =NULL ; gser->ioport =NULL ;if (port->port.count >0 ) {
@@ -1409,10 +1413,6 @@ void gserial_disconnect(struct gserial *gser)spin_unlock (&port->port_lock);spin_unlock_irqrestore (&serial_port_lock, flags); -/* disable endpoints, aborting down any active I/O */ -usb_ep_disable (gser->out); -usb_ep_disable (gser->in); -/* finally, free any unused/unusable I/O buffers */ spin_lock_irqsave (&port->port_lock, flags);if (port->port.count ==0 )
drivers/usb/serial/cp210x.c +1 -0
@@ -223,6 +223,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ + { USB_DEVICE(0x1B93, 0x1013) }, /* Phoenix Contact UPS Device */ { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */ { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */
drivers/usb/serial/option.c +3 -1
@@ -621,7 +621,7 @@ static void option_instat_callback(struct urb *urb);/* MeiG Smart Technology products */ #define MEIGSMART_VENDOR_ID 0x2dee -/* MeiG Smart SRM825L based on Qualcomm 315 */ +/* MeiG Smart SRM815/SRM825L based on Qualcomm 315 */ #define MEIGSMART_PRODUCT_SRM825L 0x4d22/* MeiG Smart SLM320 based on UNISOC UIS8910 */ #define MEIGSMART_PRODUCT_SLM320 0x4d41
@@ -2405,6 +2405,7 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM770A, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) },
@@ -2412,6 +2413,7 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(1) }, { USB_DEVICE_INTERFACE_CLASS(0x1bbb, 0x0640, 0xff), /* TCL IK512 ECM */ .driver_info = NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(0x2949, 0x8700, 0xff) }, /* Neoway N723-EA */ { } /* Terminating entry */ };MODULE_DEVICE_TABLE (usb, option_ids);
drivers/usb/storage/unusual_devs.h +7 -0
@@ -255,6 +255,13 @@ UNUSUAL_DEV( 0x0421, 0x06aa, 0x1110, 0x1110, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_MAX_SECTORS_64 ), +/* Added by Lubomir Rintel <[email protected]>, a very fine chap */ +UNUSUAL_DEV( 0x0421, 0x06c2, 0x0000, 0x0406, + "Nokia", + "Nokia 208", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_MAX_SECTORS_64 ), +#ifdef NO_SDDR09 UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100, "Microtech",
drivers/usb/typec/tcpm/maxim_contaminant.c +2 -2
@@ -137,7 +137,7 @@ static int max_contaminant_read_resistance_kohm(struct max_tcpci_chip *chip, mv =max_contaminant_read_adc_mv (chip, channel, sleep_msec, raw, true);if (mv <0 ) -return ret; +return mv;/* OVP enable */ ret =regmap_update_bits (regmap,TCPC_VENDOR_CC_CTRL2 ,CCOVPDIS ,0 );
@@ -159,7 +159,7 @@ static int max_contaminant_read_resistance_kohm(struct max_tcpci_chip *chip, mv =max_contaminant_read_adc_mv (chip, channel, sleep_msec, raw, true);if (mv <0 ) -return ret; +return mv;/* Disable current source */ ret =regmap_update_bits (regmap,TCPC_VENDOR_CC_CTRL2 ,SBURPCTRL ,0 );if (ret <0 )
fs/Kconfig +15 -9
@@ -253,7 +253,7 @@ config TMPFS_QUOTA config ARCH_SUPPORTS_HUGETLBFS def_bool n -config HUGETLBFS +menuconfig HUGETLBFS bool "HugeTLB file system support" depends on X86 || IA64 || SPARC64 || ARCH_SUPPORTS_HUGETLBFS || BROKEN depends on (SYSFS || SYSCTL)
@@ -265,6 +265,17 @@ config HUGETLBFS If unsure, say N. +if HUGETLBFS +config HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON + bool "HugeTLB Vmemmap Optimization (HVO) defaults to on" + default n + depends on HUGETLB_PAGE_OPTIMIZE_VMEMMAP + help + The HugeTLB Vmemmap Optimization (HVO) defaults to off. Say Y here to + enable HVO by default. It can be disabled via hugetlb_free_vmemmap=off + (boot command line) or hugetlb_optimize_vmemmap (sysctl). +endif # HUGETLBFS + config HUGETLB_PAGE def_bool HUGETLBFS
@@ -273,14 +284,9 @@ config HUGETLB_PAGE_OPTIMIZE_VMEMMAP depends on ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP depends on SPARSEMEM_VMEMMAP -config HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON - bool "HugeTLB Vmemmap Optimization (HVO) defaults to on" - default n - depends on HUGETLB_PAGE_OPTIMIZE_VMEMMAP - help - The HugeTLB VmemmapvOptimization (HVO) defaults to off. Say Y here to - enable HVO by default. It can be disabled via hugetlb_free_vmemmap=off - (boot command line) or hugetlb_optimize_vmemmap (sysctl). +config HUGETLB_PMD_PAGE_TABLE_SHARING + def_bool HUGETLB_PAGE + depends on ARCH_WANT_HUGE_PMD_SHARE && SPLIT_PMD_PTLOCKS config ARCH_HAS_GIGANTIC_PAGE bool
fs/afs/afs.h +1 -1
@@ -10,7 +10,7 @@#include <linux/in.h> -#define AFS_MAXCELLNAME 256/* Maximum length of a cell name */ +#define AFS_MAXCELLNAME 253/* Maximum length of a cell name (DNS limited) */ #define AFS_MAXVOLNAME 64/* Maximum length of a volume name */ #define AFS_MAXNSERVERS 8/* Maximum servers in a basic volume record */ #define AFS_NMAXNSERVERS 13/* Maximum servers in a N/U-class volume record */
fs/afs/afs_vl.h +1 -0
@@ -13,6 +13,7 @@#define AFS_VL_PORT 7003/* volume location service port */ #define VL_SERVICE 52/* RxRPC service ID for the Volume Location service */ #define YFS_VL_SERVICE 2503/* Service ID for AuriStor upgraded VL service */ +#define YFS_VL_MAXCELLNAME 256/* Maximum length of a cell name in YFS protocol */ enum AFSVL_Operations {VLGETENTRYBYID =503 ,/* AFS Get VLDB entry by ID */
fs/afs/vl_alias.c +6 -2
@@ -302,6 +302,7 @@ static char *afs_vl_get_cell_name(struct afs_cell *cell, struct key *key)static int yfs_check_canonical_cell_name (struct afs_cell *cell,struct key *key) {struct afs_cell *master; +size_t name_len;char *cell_name; cell_name =afs_vl_get_cell_name (cell, key);
@@ -313,8 +314,11 @@ static int yfs_check_canonical_cell_name(struct afs_cell *cell, struct key *key)return 0 ; } - master =afs_lookup_cell (cell->net, cell_name,strlen (cell_name), -NULL , false); + name_len =strlen (cell_name); +if (!name_len || name_len >AFS_MAXCELLNAME ) + master =ERR_PTR (-EOPNOTSUPP ); +else + master =afs_lookup_cell (cell->net, cell_name, name_len,NULL , false);kfree (cell_name);if (IS_ERR (master))return PTR_ERR (master);
fs/afs/vlclient.c +1 -1
@@ -671,7 +671,7 @@ static int afs_deliver_yfsvl_get_cell_name(struct afs_call *call)return ret; namesz =ntohl (call->tmp); -if (namesz >AFS_MAXCELLNAME ) +if (namesz >YFS_VL_MAXCELLNAME )return afs_protocol_error (call, afs_eproto_cellname_len); paddedsz = (namesz +3 ) & ~3 ; call->count = namesz;
fs/btrfs/scrub.c +4 -0
@@ -1538,6 +1538,10 @@ static int scrub_find_fill_first_stripe(struct btrfs_block_group *bg,u64 extent_gen;int ret; +if (unlikely (!extent_root)) { +btrfs_err (fs_info,"no valid extent root for scrub" ); +return -EUCLEAN ; + }memset (stripe->sectors,0 ,sizeof (struct scrub_sector_verification ) * stripe->nr_sectors);scrub_stripe_reset_bitmaps (stripe);
fs/erofs/zdata.c +34 -32
110 lines not on this page · raw message
fs/exfat/dir.c +2 -1
@@ -125,7 +125,7 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent type =exfat_get_entry_type (ep);if (type ==TYPE_UNUSED ) {brelse (bh); -break ; + goto out; }if (type !=TYPE_FILE && type !=TYPE_DIR ) {
@@ -189,6 +189,7 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent } } +out: dir_entry->namebuf.lfn[0 ] ='\0' ; *cpos =EXFAT_DEN_TO_B (dentry);return 0 ;
fs/exfat/fatent.c +10 -0
@@ -216,6 +216,16 @@ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chainif (err) goto dec_used_clus; + +if (num_clusters >= sbi->num_clusters -EXFAT_FIRST_CLUSTER ) { +/* +* The cluster chain includes a loop, scan the +* bitmap to get the number of used clusters. +*/ +exfat_count_used_clusters (sb, &sbi->used_clusters); + +return 0 ; + } }while (clu !=EXFAT_EOF_CLUSTER ); }
fs/f2fs/super.c +6 -6
@@ -4931,9 +4931,6 @@ static int __init init_f2fs_fs(void) err =register_shrinker (&f2fs_shrinker_info,"f2fs-shrinker" );if (err) goto free_sysfs; - err =register_filesystem (&f2fs_fs_type); -if (err) - goto free_shrinker;f2fs_create_root_stats (); err =f2fs_init_post_read_processing ();if (err)
@@ -4956,7 +4953,12 @@ static int __init init_f2fs_fs(void) err =f2fs_create_casefold_cache ();if (err) goto free_compress_cache; + err =register_filesystem (&f2fs_fs_type); +if (err) + goto free_casefold_cache;return 0 ; +free_casefold_cache: +f2fs_destroy_casefold_cache (); free_compress_cache:f2fs_destroy_compress_cache (); free_compress_mempool:
@@ -4971,8 +4973,6 @@ static int __init init_f2fs_fs(void)f2fs_destroy_post_read_processing (); free_root_stats:f2fs_destroy_root_stats (); -unregister_filesystem (&f2fs_fs_type); -free_shrinker:unregister_shrinker (&f2fs_shrinker_info); free_sysfs:f2fs_exit_sysfs ();
@@ -4996,6 +4996,7 @@ static int __init init_f2fs_fs(void) static void __exit exit_f2fs_fs(void) { +unregister_filesystem (&f2fs_fs_type);f2fs_destroy_casefold_cache ();f2fs_destroy_compress_cache ();f2fs_destroy_compress_mempool ();
@@ -5004,7 +5005,6 @@ static void __exit exit_f2fs_fs(void)f2fs_destroy_iostat_processing ();f2fs_destroy_post_read_processing ();f2fs_destroy_root_stats (); -unregister_filesystem (&f2fs_fs_type);unregister_shrinker (&f2fs_shrinker_info);f2fs_exit_sysfs ();f2fs_destroy_garbage_collection_cache ();
fs/jbd2/commit.c +2 -2
@@ -777,9 +777,9 @@ void jbd2_journal_commit_transaction(journal_t *journal)/* * If the journal is not located on the file system device, * then we must flush the file system device before we issue -* the commit record +* the commit record and update the journal tail sequence. */ -if (commit_transaction->t_need_data_flush && +if ((commit_transaction->t_need_data_flush || update_tail) && (journal->j_fs_dev != journal->j_dev) && (journal->j_flags &JBD2_BARRIER ))blkdev_issue_flush (journal->j_fs_dev);
fs/jbd2/revoke.c +1 -1
@@ -654,7 +654,7 @@ static void flush_descriptor(journal_t *journal,set_buffer_jwrite (descriptor);BUFFER_TRACE (descriptor,"write" );set_buffer_dirty (descriptor); - write_dirty_buffer(descriptor, REQ_SYNC); + write_dirty_buffer(descriptor, JBD2_JOURNAL_REQ_FLAGS); }#endif
fs/overlayfs/copy_up.c +38 -24
164 lines not on this page · raw message
fs/overlayfs/export.c +27 -22
116 lines not on this page · raw message
fs/overlayfs/namei.c +30 -11
100 lines not on this page · raw message
fs/overlayfs/overlayfs.h +20 -8
@@ -632,11 +632,15 @@ struct dentry *ovl_decode_real_fh(struct ovl_fs *ofs, struct ovl_fh *fh,int ovl_check_origin_fh (struct ovl_fs *ofs,struct ovl_fh *fh,bool connected,struct dentry *upperdentry,struct ovl_path **stackp);int ovl_verify_set_fh (struct ovl_fs *ofs,struct dentry *dentry, -enum ovl_xattr ox,struct dentry *real,bool is_upper, -bool set); +enum ovl_xattr ox,const struct ovl_fh *fh, +bool is_upper,bool set); +int ovl_verify_origin_xattr (struct ovl_fs *ofs,struct dentry *dentry, +enum ovl_xattr ox,struct dentry *real, +bool is_upper,bool set);struct dentry *ovl_index_upper (struct ovl_fs *ofs,struct dentry *index,bool connected);int ovl_verify_index (struct ovl_fs *ofs,struct dentry *index); +int ovl_get_index_name_fh (const struct ovl_fh *fh,struct qstr *name);int ovl_get_index_name (struct ovl_fs *ofs,struct dentry *origin,struct qstr *name);struct dentry *ovl_get_index_fh (struct ovl_fs *ofs,struct ovl_fh *fh);
@@ -648,17 +652,24 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags);bool ovl_lower_positive (struct dentry *dentry); +static inline int ovl_verify_origin_fh (struct ovl_fs *ofs,struct dentry *upper, +const struct ovl_fh *fh,bool set) +{ +return ovl_verify_set_fh (ofs, upper,OVL_XATTR_ORIGIN , fh, false, set); +} +static inline int ovl_verify_origin (struct ovl_fs *ofs,struct dentry *upper,struct dentry *origin,bool set) { -return ovl_verify_set_fh (ofs, upper,OVL_XATTR_ORIGIN , origin, - false, set); +return ovl_verify_origin_xattr (ofs, upper,OVL_XATTR_ORIGIN , origin, + false, set); }static inline int ovl_verify_upper (struct ovl_fs *ofs,struct dentry *index,struct dentry *upper,bool set) { -return ovl_verify_set_fh (ofs, index,OVL_XATTR_UPPER , upper, true, set); +return ovl_verify_origin_xattr (ofs, index,OVL_XATTR_UPPER , upper, + true, set); }/* readdir.c */
@@ -821,10 +832,11 @@ int ovl_copy_up_with_data(struct dentry *dentry);int ovl_maybe_copy_up (struct dentry *dentry,int flags);int ovl_copy_xattr (struct super_block *sb,const struct path *path,struct dentry *new);int ovl_set_attr (struct ovl_fs *ofs,struct dentry *upper,struct kstat *stat); -struct ovl_fh *ovl_encode_real_fh (struct ovl_fs *ofs,struct dentry *real, +struct ovl_fh *ovl_encode_real_fh (struct ovl_fs *ofs,struct inode *realinode,bool is_upper); -int ovl_set_origin (struct ovl_fs *ofs,struct dentry *lower, -struct dentry *upper); +struct ovl_fh *ovl_get_origin_fh (struct ovl_fs *ofs,struct dentry *origin); +int ovl_set_origin_fh (struct ovl_fs *ofs,const struct ovl_fh *fh, +struct dentry *upper);/* export.c */ extern const struct export_operations ovl_export_operations;
fs/overlayfs/super.c +14 -6
@@ -879,15 +879,20 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, {struct vfsmount *mnt =ovl_upper_mnt (ofs);struct dentry *indexdir; +struct dentry *origin =ovl_lowerstack (oe)->dentry; +const struct ovl_fh *fh;int err; + fh =ovl_get_origin_fh (ofs, origin); +if (IS_ERR (fh)) +return PTR_ERR (fh); + err =mnt_want_write (mnt);if (err) -return err; + goto out_free_fh;/* Verify lower root is upper root origin */ - err =ovl_verify_origin (ofs, upperpath->dentry, -ovl_lowerstack (oe)->dentry, true); + err =ovl_verify_origin_fh (ofs, upperpath->dentry, fh, true);if (err) {pr_err ("failed to verify upper root origin\n" ); goto out;
@@ -919,9 +924,10 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,* directory entries. */ if (ovl_check_origin_xattr (ofs, ofs->indexdir)) { - err =ovl_verify_set_fh (ofs, ofs->indexdir, -OVL_XATTR_ORIGIN , - upperpath->dentry, true, false); + err =ovl_verify_origin_xattr (ofs, ofs->indexdir, +OVL_XATTR_ORIGIN , + upperpath->dentry, true, + false);if (err)pr_err ("failed to verify index dir 'origin' xattr\n" ); }
@@ -939,6 +945,8 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs, out:mnt_drop_write (mnt); +out_free_fh: +kfree (fh);return err; }
fs/overlayfs/util.c +10 -0
@@ -976,12 +976,18 @@ static void ovl_cleanup_index(struct dentry *dentry)struct dentry *index =NULL ;struct inode *inode;struct qstr name = { }; +bool got_write = false;int err; err =ovl_get_index_name (ofs, lowerdentry, &name);if (err) goto fail; + err =ovl_want_write (dentry); +if (err) + goto fail; + + got_write = true; inode =d_inode (upperdentry);if (!S_ISDIR (inode->i_mode) && inode->i_nlink !=1 ) { pr_warn_ratelimited("cleanup linked index (%pd2, ino=%lu, nlink=%u)\n",
@@ -1019,6 +1025,8 @@ static void ovl_cleanup_index(struct dentry *dentry) goto fail; out: +if (got_write) +ovl_drop_write (dentry);kfree (name.name);dput (index);return ;
@@ -1089,6 +1097,8 @@ void ovl_nlink_end(struct dentry *dentry) {struct inode *inode =d_inode (dentry); +ovl_drop_write (dentry); +if (ovl_test_flag (OVL_INDEX , inode) && inode->i_nlink ==0 ) {const struct cred *old_cred;
fs/smb/client/namespace.c +18 -1
@@ -196,11 +196,28 @@ static struct vfsmount *cifs_do_automount(struct path *path)struct smb3_fs_context tmp;char *full_path;struct vfsmount *mnt; +struct cifs_sb_info *mntpt_sb; +struct cifs_ses *ses;if (IS_ROOT (mntpt))return ERR_PTR (-ESTALE ); - cur_ctx =CIFS_SB (mntpt->d_sb)->ctx; + mntpt_sb =CIFS_SB (mntpt->d_sb); + ses =cifs_sb_master_tcon (mntpt_sb)->ses; + cur_ctx = mntpt_sb->ctx; + +/* +* At this point, the root session should be in the mntpt sb. We should +* bring the sb context passwords in sync with the root session's +* passwords. This would help prevent unnecessary retries and password +* swaps for automounts. +*/ +mutex_lock (&ses->session_mutex); + rc =smb3_sync_session_ctx_passwords (mntpt_sb, ses); +mutex_unlock (&ses->session_mutex); + +if (rc) +return ERR_PTR (rc); fc =fs_context_for_submount (path->mnt->mnt_sb->s_type, mntpt);if (IS_ERR (fc))
fs/smb/server/smb2pdu.c +43 -0
61 lines not on this page · raw message
fs/smb/server/smb2pdu.h +10 -0
@@ -500,4 +500,14 @@ static inline void *smb2_get_msg(void *buf) return buf + 4; } +#define POSIX_TYPE_FILE 0 +#define POSIX_TYPE_DIR 1 +#define POSIX_TYPE_SYMLINK 2 +#define POSIX_TYPE_CHARDEV 3 +#define POSIX_TYPE_BLKDEV 4 +#define POSIX_TYPE_FIFO 5 +#define POSIX_TYPE_SOCKET 6 + +#define POSIX_FILETYPE_SHIFT 12 +#endif /* _SMB2PDU_H */
fs/smb/server/vfs.c +2 -1
@@ -1259,6 +1259,8 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name, filepath, flags, path); +if (!is_last) + next[0 ] ='/' ;if (err) goto out2;else if (is_last)
@@ -1266,7 +1268,6 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,path_put (parent_path); *parent_path = *path; - next[0 ] ='/' ; remain_len -= filename_len +1 ; }
include/linux/hugetlb.h +2 -3
@@ -1239,7 +1239,7 @@ static inline __init void hugetlb_cma_reserve(int order) }#endif -#ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE +#ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING static inline bool hugetlb_pmd_shared (pte_t *pte) {return page_count (virt_to_page (pte)) >1 ;
@@ -1275,8 +1275,7 @@ bool __vma_private_lock(struct vm_area_struct *vma);static inline pte_t *hugetlb_walk (struct vm_area_struct *vma,unsigned long addr,unsigned long sz) { -#if defined(CONFIG_HUGETLB_PAGE ) && \ - defined(CONFIG_ARCH_WANT_HUGE_PMD_SHARE ) && defined(CONFIG_LOCKDEP ) +#if defined(CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING ) && defined(CONFIG_LOCKDEP )struct hugetlb_vma_lock *vma_lock = vma->vm_private_data;/*
include/linux/mm.h +1 -0
@@ -3031,6 +3031,7 @@ static inline bool pagetable_pmd_ctor(struct ptdesc *ptdesc)if (!pmd_ptlock_init (ptdesc))return false;__folio_set_pgtable (folio); +ptdesc_pmd_pts_init (ptdesc);lruvec_stat_add_folio (folio,NR_PAGETABLE );return true; }
include/linux/mm_types.h +32 -2
@@ -398,11 +398,12 @@ FOLIO_MATCH(compound_head, _head_2a);* @pmd_huge_pte: Protected by ptdesc->ptl, used for THPs. * @__page_mapping: Aliases with page->mapping. Unused for page tables. * @pt_mm: Used for x86 pgds. -* @pt_frag_refcount: For fragmented page table tracking. Powerpc and s390 only. +* @pt_frag_refcount: For fragmented page table tracking. Powerpc only. +* @pt_share_count: Used for HugeTLB PMD page table share count. * @_pt_pad_2: Padding to ensure proper alignment. * @ptl: Lock for the page table. * @__page_type: Same as page->page_type. Unused for page tables. -* @_refcount: Same as page refcount. Used for s390 page tables. +* @_refcount: Same as page refcount. * @pt_memcg_data: Memcg data. Tracked for page tables here. * * This struct overlays struct page for now. Do not modify without a good
@@ -424,6 +425,9 @@ struct ptdesc {union {struct mm_struct *pt_mm;atomic_t pt_frag_refcount; +#ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING +atomic_t pt_share_count; +#endif };union {
@@ -468,6 +472,32 @@ static_assert(sizeof(struct ptdesc) <= sizeof(struct page)); const struct page *: (const struct ptdesc *)(p), \ struct page *: (struct ptdesc *)(p))) +#ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING +static inline void ptdesc_pmd_pts_init(struct ptdesc *ptdesc) +{ +atomic_set (&ptdesc->pt_share_count,0 ); +} + +static inline void ptdesc_pmd_pts_inc (struct ptdesc *ptdesc) +{ +atomic_inc (&ptdesc->pt_share_count); +} + +static inline void ptdesc_pmd_pts_dec (struct ptdesc *ptdesc) +{ +atomic_dec (&ptdesc->pt_share_count); +} + +static inline int ptdesc_pmd_pts_count (struct ptdesc *ptdesc) +{ +return atomic_read (&ptdesc->pt_share_count); +} +#else +static inline void ptdesc_pmd_pts_init (struct ptdesc *ptdesc) +{ +} +#endif +/* * Used for sizing the vmemmap region on some architectures */
include/linux/numa.h +5 -0
@@ -15,6 +15,11 @@#define NUMA_NO_NODE (-1)#define NUMA_NO_MEMBLK (-1) +static inline bool numa_valid_node (int nid) +{ +return nid >=0 && nid <MAX_NUMNODES ; +} +/* optionally keep NUMA memory info available post init */ #ifdef CONFIG_NUMA_KEEP_MEMINFO #define __initdata_or_meminfo
include/net/inet_connection_sock.h +1 -1
@@ -282,7 +282,7 @@ static inline int inet_csk_reqsk_queue_len(const struct sock *sk)static inline int inet_csk_reqsk_queue_is_full (const struct sock *sk) { -return inet_csk_reqsk_queue_len (sk) >= sk->sk_max_ack_backlog; +return inet_csk_reqsk_queue_len (sk) >READ_ONCE (sk->sk_max_ack_backlog); }bool inet_csk_reqsk_queue_drop (struct sock *sk,struct request_sock *req);
include/ufs/ufshcd.h +0 -2
@@ -324,7 +324,6 @@ struct ufs_pwr_mode_info {* @config_scaling_param: called to configure clock scaling parameters * @program_key: program or evict an inline encryption key * @event_notify: called to notify important events -* @reinit_notify: called to notify reinit of UFSHCD during max gear switch * @mcq_config_resource: called to configure MCQ platform resources * @get_hba_mac: called to get vendor specific mac value, mandatory for mcq mode * @op_runtime_config: called to config Operation and runtime regs Pointers
@@ -369,7 +368,6 @@ struct ufs_hba_variant_ops { const union ufs_crypto_cfg_entry *cfg, int slot);void (*event_notify)(struct ufs_hba *hba,enum ufs_event_type evt,void *data); -void (*reinit_notify)(struct ufs_hba *);int (*mcq_config_resource)(struct ufs_hba *hba);int (*get_hba_mac)(struct ufs_hba *hba);int (*op_runtime_config)(struct ufs_hba *hba);
io_uring/io_uring.c +9 -4
@@ -537,6 +537,13 @@ static __cold void io_queue_deferred(struct io_ring_ctx *ctx) } } +static void io_eventfd_free (struct rcu_head *rcu) +{ + struct io_ev_fd *ev_fd = container_of(rcu, struct io_ev_fd, rcu); + +eventfd_ctx_put (ev_fd->cq_ev_fd); +kfree (ev_fd); +}static void io_eventfd_ops (struct rcu_head *rcu) {
@@ -550,10 +557,8 @@ static void io_eventfd_ops(struct rcu_head *rcu)* ordering in a race but if references are 0 we know we have to free * it regardless. */ -if (atomic_dec_and_test (&ev_fd->refs)) { -eventfd_ctx_put (ev_fd->cq_ev_fd); -kfree (ev_fd); - } +if (atomic_dec_and_test (&ev_fd->refs)) +call_rcu (&ev_fd->rcu, io_eventfd_free); }static void io_eventfd_signal (struct io_ring_ctx *ctx)
io_uring/timeout.c +3 -1
@@ -413,10 +413,12 @@ static int io_timeout_update(struct io_ring_ctx *ctx, __u64 user_data, timeout->off =0 ;/* noseq */ data = req->async_data; + data->ts = *ts; +list_add_tail (&timeout->list, &ctx->timeout_list);hrtimer_init (&data->timer,io_timeout_get_clock (data), mode); data->timer.function = io_timeout_fn; -hrtimer_start (&data->timer,timespec64_to_ktime (*ts), mode); +hrtimer_start (&data->timer,timespec64_to_ktime (data->ts), mode);return 0 ; }
kernel/workqueue.c +45 -23
148 lines not on this page · raw message
mm/hugetlb.c +11 -13
@@ -6907,7 +6907,7 @@ long hugetlb_unreserve_pages(struct inode *inode, long start, long end,return 0 ; } -#ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE +#ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING static unsigned long page_table_shareable (struct vm_area_struct *svma,struct vm_area_struct *vma,unsigned long addr,pgoff_t idx)
@@ -7014,7 +7014,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma, spte =hugetlb_walk (svma, saddr,vma_mmu_pagesize (svma));if (spte) { -get_page (virt_to_page (spte)); +ptdesc_pmd_pts_inc (virt_to_ptdesc (spte));break ; } }
@@ -7029,7 +7029,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma, (pmd_t *)((unsigned long)spte & PAGE_MASK));mm_inc_nr_pmds (mm); }else { -put_page (virt_to_page (spte)); +ptdesc_pmd_pts_dec (virt_to_ptdesc (spte)); }spin_unlock (&mm->page_table_lock); out:
@@ -7041,10 +7041,6 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma,/* * unmap huge page backed by shared pte. * -* Hugetlb pte page is ref counted at the time of mapping. If pte is shared -* indicated by page_count > 1, unmap is achieved by clearing pud and -* decrementing the ref count. If count == 1, the pte page is not shared. -* * Called with page table lock held. * * returns: 1 successfully unmapped a shared pte page
@@ -7053,23 +7049,25 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma,int huge_pmd_unshare (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long addr,pte_t *ptep) { +unsigned long sz =huge_page_size (hstate_vma (vma));pgd_t *pgd =pgd_offset (mm, addr);p4d_t *p4d =p4d_offset (pgd, addr);pud_t *pud =pud_offset (p4d, addr);i_mmap_assert_write_locked (vma->vm_file->f_mapping);hugetlb_vma_assert_locked (vma); -BUG_ON (page_count (virt_to_page (ptep)) ==0 ); -if (page_count (virt_to_page (ptep)) ==1 ) +if (sz !=PMD_SIZE ) +return 0 ; +if (!ptdesc_pmd_pts_count (virt_to_ptdesc (ptep)))return 0 ;pud_clear (pud); -put_page (virt_to_page (ptep)); +ptdesc_pmd_pts_dec (virt_to_ptdesc (ptep));mm_dec_nr_pmds (mm);return 1 ; } -#else /* !CONFIG_ARCH_WANT_HUGE_PMD_SHARE */ +#else /* !CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING */ pte_t *huge_pmd_share (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long addr,pud_t *pud)
@@ -7092,7 +7090,7 @@ bool want_pmd_share(struct vm_area_struct *vma, unsigned long addr) {return false; } -#endif /* CONFIG_ARCH_WANT_HUGE_PMD_SHARE */ +#endif /* CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING */ #ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,
@@ -7190,7 +7188,7 @@ unsigned long hugetlb_mask_last_page(struct hstate *h)/* See description above. Architectures can provide their own version. */ __weak unsigned long hugetlb_mask_last_page (struct hstate *h) { -#ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE +#ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING if (huge_page_size (h) ==PMD_SIZE )return PUD_SIZE -PMD_SIZE ;#endif
mm/memblock.c +7 -17
@@ -754,7 +754,7 @@ bool __init_memblock memblock_validate_numa_coverage(unsigned long threshold_byt/* calculate lose page */ for_each_mem_pfn_range (i,MAX_NUMNODES , &start_pfn, &end_pfn, &nid) { -if (nid ==NUMA_NO_NODE ) +if (!numa_valid_node (nid)) nr_pages += end_pfn - start_pfn; }
@@ -1043,7 +1043,7 @@ static bool should_skip_region(struct memblock_type *type,return false;/* only memory regions are associated with nodes, check it */ -if (nid !=NUMA_NO_NODE && nid != m_nid) +if (numa_valid_node (nid) && nid != m_nid)return true;/* skip hotpluggable memory regions if needed */
@@ -1100,10 +1100,6 @@ void __next_mem_range(u64 *idx, int nid, enum memblock_flags flags,int idx_a = *idx &0xffffffff ;int idx_b = *idx >>32 ; -if (WARN_ONCE (nid ==MAX_NUMNODES , -"Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n" )) - nid =NUMA_NO_NODE ;
Lines of this file are not shown. View the raw message.
net/sched/sch_cake.c +75 -65
140 lines not on this page · raw message
sound/soc/mediatek/common/mtk-afe-platform-driver.c +2 -2
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.