Merge 6.1.117 into android14-6.1-lts

Changes in 6.1.117
	arm64: dts: rockchip: Fix rt5651 compatible value on rk3399-eaidk-610
	arm64: dts: rockchip: Fix rt5651 compatible value on rk3399-sapphire-excavator
	arm64: dts: rockchip: Remove hdmi's 2nd interrupt on rk3328
	arm64: dts: rockchip: Fix wakeup prop names on PineNote BT node
	arm64: dts: rockchip: Fix bluetooth properties on Rock960 boards
	arm64: dts: rockchip: Remove #cooling-cells from fan on Theobroma lion
	arm64: dts: rockchip: Fix LED triggers on rk3308-roc-cc
	arm64: dts: imx8qm: Fix VPU core alias name
	arm64: dts: imx8qxp: Add VPU subsystem file
	arm64: dts: imx8-ss-vpu: Fix imx8qm VPU IRQs
	arm64: dts: imx8mp: correct sdhc ipg clk
	ARM: dts: rockchip: fix rk3036 acodec node
	ARM: dts: rockchip: drop grf reference from rk3036 hdmi
	ARM: dts: rockchip: Fix the spi controller on rk3036
	ARM: dts: rockchip: Fix the realtek audio codec on rk3036-kylin
	HID: core: zero-initialize the report buffer
	platform/x86/amd/pmc: Detect when STB is not available
	sunrpc: handle -ENOTCONN in xs_tcp_setup_socket()
	NFSv3: only use NFS timeout for MOUNT when protocols are compatible
	NFSv3: handle out-of-order write replies.
	nfs: avoid i_lock contention in nfs_clear_invalid_mapping
	security/keys: fix slab-out-of-bounds in key_task_permission
	net: enetc: set MAC address to the VF net_device
	sctp: properly validate chunk size in sctp_sf_ootb()
	can: c_can: fix {rx,tx}_errors statistics
	ice: change q_index variable type to s16 to store -1 value
	i40e: fix race condition by adding filter's intermediate sync state
	net: hns3: fix kernel crash when uninstalling driver
	net: phy: ti: add PHY_RST_AFTER_CLK_EN flag
	net: stmmac: Fix unbalanced IRQ wake disable warning on single irq case
	virtio_net: Add hash_key_length check
	net: arc: fix the device for dma_map_single/dma_unmap_single
	net: arc: rockchip: fix emac mdio node support
	Revert "ALSA: hda/conexant: Mute speakers at suspend / shutdown"
	media: stb0899_algo: initialize cfr before using it
	media: dvbdev: prevent the risk of out of memory access
	media: dvb_frontend: don't play tricks with underflow values
	media: adv7604: prevent underflow condition when reporting colorspace
	scsi: sd_zbc: Use kvzalloc() to allocate REPORT ZONES buffer
	ALSA: firewire-lib: fix return value on fail in amdtp_tscm_init()
	tools/lib/thermal: Fix sampling handler context ptr
	thermal/of: support thermal zones w/o trips subnode
	ASoC: stm32: spdifrx: fix dma channel release in stm32_spdifrx_remove
	media: ar0521: don't overflow when checking PLL values
	media: s5p-jpeg: prevent buffer overflows
	media: cx24116: prevent overflows on SNR calculus
	media: pulse8-cec: fix data timestamp at pulse8_setup()
	media: v4l2-tpg: prevent the risk of a division by zero
	media: v4l2-ctrls-api: fix error handling for v4l2_g_ctrl()
	can: mcp251xfd: mcp251xfd_get_tef_len(): fix length calculation
	can: mcp251xfd: mcp251xfd_ring_alloc(): fix coalescing configuration when switching CAN modes
	ksmbd: fix slab-use-after-free in ksmbd_smb2_session_create
	ksmbd: Fix the missing xa_store error check
	ksmbd: fix slab-use-after-free in smb3_preauth_hash_rsp
	pwm: imx-tpm: Use correct MODULO value for EPWM mode
	drm/amdgpu: Adjust debugfs eviction and IB access permissions
	drm/amdgpu: add missing size check in amdgpu_debugfs_gprwave_read()
	drm/amdgpu: prevent NULL pointer dereference if ATIF is not supported
	thermal/drivers/qcom/lmh: Remove false lockdep backtrace
	dm cache: correct the number of origin blocks to match the target length
	dm cache: fix flushing uninitialized delayed_work on cache_ctr error
	dm cache: fix out-of-bounds access to the dirty bitset when resizing
	dm cache: optimize dirty bit checking with find_next_bit when resizing
	dm cache: fix potential out-of-bounds access on the first resume
	dm-unstriped: cast an operand to sector_t to prevent potential uint32_t overflow
	ALSA: usb-audio: Add quirk for HP 320 FHD Webcam
	ALSA: hda/realtek: Fix headset mic on TUXEDO Gemini 17 Gen3
	posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone
	nfs: Fix KMSAN warning in decode_getfattr_attrs()
	net: wwan: t7xx: Fix off-by-one error in t7xx_dpmaif_rx_buf_alloc()
	net: vertexcom: mse102x: Fix possible double free of TX skb
	mptcp: use sock_kfree_s instead of kfree
	arm64: Kconfig: Make SME depend on BROKEN for now
	btrfs: reinitialize delayed ref list after deleting it from the list
	riscv/purgatory: align riscv_kernel_entry
	bnxt_re: avoid shift undefined behavior in bnxt_qplib_alloc_init_hwq
	Revert "wifi: mac80211: fix RCU list iterations"
	net: do not delay dst_entries_add() in dst_release()
	kselftest/arm64: Initialise current at build time in signal tests
	media: uvcvideo: Skip parsing frames of type UVC_VS_UNDEFINED in uvc_parse_format
	filemap: Fix bounds checking in filemap_read()
	fs/proc: fix compile warning about variable 'vmcore_mmap_ops'
	signal: restore the override_rlimit logic
	usb: musb: sunxi: Fix accessing an released usb phy
	usb: dwc3: fix fault at system suspend if device was already runtime suspended
	usb: typec: fix potential out of bounds in ucsi_ccg_update_set_new_cam_cmd()
	USB: serial: io_edgeport: fix use after free in debug printk
	USB: serial: qcserial: add support for Sierra Wireless EM86xx
	USB: serial: option: add Fibocom FG132 0x0112 composition
	USB: serial: option: add Quectel RG650V
	irqchip/gic-v3: Force propagation of the active state with a read-back
	ocfs2: remove entry once instead of null-ptr-dereference in ocfs2_xa_remove()
	ucounts: fix counter leak in inc_rlimit_get_ucounts()
	ASoC: amd: yc: fix internal mic on Xiaomi Book Pro 14 2022
	net: sched: use RCU read-side critical section in taprio_dump()
	hv_sock: Initializing vsk->trans to NULL to prevent a dangling pointer
	vsock/virtio: Initialization of the dangling pointer occurring in vsk->trans
	media: amphion: Fix VPU core alias name
	Linux 6.1.117

Change-Id: Ib8a7f11f5567a9ab25f77bdf672338f1ac116853
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2024-11-29 11:30:33 +00:00
97 changed files with 557 additions and 215 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 6 VERSION = 6
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 116 SUBLEVEL = 117
EXTRAVERSION = EXTRAVERSION =
NAME = Curry Ramen NAME = Curry Ramen

View File

@@ -304,8 +304,8 @@
&i2c2 { &i2c2 {
status = "okay"; status = "okay";
rt5616: rt5616@1b { rt5616: audio-codec@1b {
compatible = "rt5616"; compatible = "realtek,rt5616";
reg = <0x1b>; reg = <0x1b>;
clocks = <&cru SCLK_I2S_OUT>; clocks = <&cru SCLK_I2S_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -382,12 +382,13 @@
}; };
}; };
acodec: acodec-ana@20030000 { acodec: audio-codec@20030000 {
compatible = "rk3036-codec"; compatible = "rockchip,rk3036-codec";
reg = <0x20030000 0x4000>; reg = <0x20030000 0x4000>;
rockchip,grf = <&grf>;
clock-names = "acodec_pclk"; clock-names = "acodec_pclk";
clocks = <&cru PCLK_ACODEC>; clocks = <&cru PCLK_ACODEC>;
rockchip,grf = <&grf>;
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
}; };
@@ -397,7 +398,6 @@
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI>; clocks = <&cru PCLK_HDMI>;
clock-names = "pclk"; clock-names = "pclk";
rockchip,grf = <&grf>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&hdmi_ctl>; pinctrl-0 = <&hdmi_ctl>;
status = "disabled"; status = "disabled";
@@ -550,11 +550,11 @@
}; };
spi: spi@20074000 { spi: spi@20074000 {
compatible = "rockchip,rockchip-spi"; compatible = "rockchip,rk3036-spi";
reg = <0x20074000 0x1000>; reg = <0x20074000 0x1000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_SPI>, <&cru SCLK_SPI>; clocks = <&cru SCLK_SPI>, <&cru PCLK_SPI>;
clock-names = "apb-pclk","spi_pclk"; clock-names = "spiclk", "apb_pclk";
dmas = <&pdma 8>, <&pdma 9>; dmas = <&pdma 8>, <&pdma 9>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
pinctrl-names = "default"; pinctrl-names = "default";

View File

@@ -2117,6 +2117,7 @@ config ARM64_SME
bool "ARM Scalable Matrix Extension support" bool "ARM Scalable Matrix Extension support"
default y default y
depends on ARM64_SVE depends on ARM64_SVE
depends on BROKEN
help help
The Scalable Matrix Extension (SME) is an extension to the AArch64 The Scalable Matrix Extension (SME) is an extension to the AArch64
execution state which utilises a substantial subset of the SVE execution state which utilises a substantial subset of the SVE

View File

@@ -15,7 +15,7 @@ vpu: vpu@2c000000 {
mu_m0: mailbox@2d000000 { mu_m0: mailbox@2d000000 {
compatible = "fsl,imx6sx-mu"; compatible = "fsl,imx6sx-mu";
reg = <0x2d000000 0x20000>; reg = <0x2d000000 0x20000>;
interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>;
#mbox-cells = <2>; #mbox-cells = <2>;
power-domains = <&pd IMX_SC_R_VPU_MU_0>; power-domains = <&pd IMX_SC_R_VPU_MU_0>;
status = "disabled"; status = "disabled";
@@ -24,7 +24,7 @@ vpu: vpu@2c000000 {
mu1_m0: mailbox@2d020000 { mu1_m0: mailbox@2d020000 {
compatible = "fsl,imx6sx-mu"; compatible = "fsl,imx6sx-mu";
reg = <0x2d020000 0x20000>; reg = <0x2d020000 0x20000>;
interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>;
#mbox-cells = <2>; #mbox-cells = <2>;
power-domains = <&pd IMX_SC_R_VPU_MU_1>; power-domains = <&pd IMX_SC_R_VPU_MU_1>;
status = "disabled"; status = "disabled";

View File

@@ -934,7 +934,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b40000 0x10000>; reg = <0x30b40000 0x10000>;
interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC1_ROOT>; <&clk IMX8MP_CLK_USDHC1_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";
@@ -948,7 +948,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b50000 0x10000>; reg = <0x30b50000 0x10000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC2_ROOT>; <&clk IMX8MP_CLK_USDHC2_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";
@@ -962,7 +962,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b60000 0x10000>; reg = <0x30b60000 0x10000>;
interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC3_ROOT>; <&clk IMX8MP_CLK_USDHC3_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";

View File

@@ -0,0 +1,25 @@
// SPDX-License-Identifier: (GPL-2.0-or-later OR X11)
/*
* Copyright 2023 TQ-Systems GmbH <linux@ew.tq-group.com>,
* D-82229 Seefeld, Germany.
* Author: Alexander Stein
*/
&mu_m0 {
interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>;
};
&mu1_m0 {
interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>;
};
&vpu_core0 {
reg = <0x2d040000 0x10000>;
};
&vpu_core1 {
reg = <0x2d050000 0x10000>;
};
/delete-node/ &mu2_m0;
/delete-node/ &vpu_core2;

View File

@@ -46,9 +46,8 @@
serial1 = &lpuart1; serial1 = &lpuart1;
serial2 = &lpuart2; serial2 = &lpuart2;
serial3 = &lpuart3; serial3 = &lpuart3;
vpu_core0 = &vpu_core0; vpu-core0 = &vpu_core0;
vpu_core1 = &vpu_core1; vpu-core1 = &vpu_core1;
vpu_core2 = &vpu_core2;
}; };
cpus { cpus {
@@ -316,6 +315,7 @@
}; };
#include "imx8qxp-ss-img.dtsi" #include "imx8qxp-ss-img.dtsi"
#include "imx8qxp-ss-vpu.dtsi"
#include "imx8qxp-ss-adma.dtsi" #include "imx8qxp-ss-adma.dtsi"
#include "imx8qxp-ss-conn.dtsi" #include "imx8qxp-ss-conn.dtsi"
#include "imx8qxp-ss-lsio.dtsi" #include "imx8qxp-ss-lsio.dtsi"

View File

@@ -36,14 +36,14 @@
power_led: led-0 { power_led: led-0 {
label = "firefly:red:power"; label = "firefly:red:power";
linux,default-trigger = "ir-power-click"; linux,default-trigger = "default-on";
default-state = "on"; default-state = "on";
gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
}; };
user_led: led-1 { user_led: led-1 {
label = "firefly:blue:user"; label = "firefly:blue:user";
linux,default-trigger = "ir-user-click"; linux,default-trigger = "rc-feedback";
default-state = "off"; default-state = "off";
gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
}; };

View File

@@ -724,8 +724,7 @@
compatible = "rockchip,rk3328-dw-hdmi"; compatible = "rockchip,rk3328-dw-hdmi";
reg = <0x0 0xff3c0000 0x0 0x20000>; reg = <0x0 0xff3c0000 0x0 0x20000>;
reg-io-width = <4>; reg-io-width = <4>;
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
<GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI>, clocks = <&cru PCLK_HDMI>,
<&cru SCLK_HDMI_SFC>, <&cru SCLK_HDMI_SFC>,
<&cru SCLK_RTC32K>; <&cru SCLK_RTC32K>;

View File

@@ -60,7 +60,6 @@
fan: fan@18 { fan: fan@18 {
compatible = "ti,amc6821"; compatible = "ti,amc6821";
reg = <0x18>; reg = <0x18>;
#cooling-cells = <2>;
}; };
rtc_twi: rtc@6f { rtc_twi: rtc@6f {

View File

@@ -541,7 +541,7 @@
status = "okay"; status = "okay";
rt5651: audio-codec@1a { rt5651: audio-codec@1a {
compatible = "rockchip,rt5651"; compatible = "realtek,rt5651";
reg = <0x1a>; reg = <0x1a>;
clocks = <&cru SCLK_I2S_8CH_OUT>; clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -575,7 +575,7 @@
bluetooth { bluetooth {
compatible = "brcm,bcm43438-bt"; compatible = "brcm,bcm43438-bt";
clocks = <&rk808 1>; clocks = <&rk808 1>;
clock-names = "ext_clock"; clock-names = "txco";
device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>; device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>; host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>; shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;

View File

@@ -163,7 +163,7 @@
status = "okay"; status = "okay";
rt5651: rt5651@1a { rt5651: rt5651@1a {
compatible = "rockchip,rt5651"; compatible = "realtek,rt5651";
reg = <0x1a>; reg = <0x1a>;
clocks = <&cru SCLK_I2S_8CH_OUT>; clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -685,8 +685,8 @@
compatible = "brcm,bcm43438-bt"; compatible = "brcm,bcm43438-bt";
clocks = <&rk817 1>; clocks = <&rk817 1>;
clock-names = "lpo"; clock-names = "lpo";
device-wake-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>; device-wakeup-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
host-wake-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; host-wakeup-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&bt_enable_h>, <&bt_host_wake_l>, <&bt_wake_h>; pinctrl-0 = <&bt_enable_h>, <&bt_host_wake_l>, <&bt_wake_h>;
pinctrl-names = "default"; pinctrl-names = "default";

View File

@@ -11,6 +11,8 @@
.macro size, sym:req .macro size, sym:req
.size \sym, . - \sym .size \sym, . - \sym
.endm .endm
#include <asm/asm.h>
#include <linux/linkage.h>
.text .text
@@ -39,6 +41,7 @@ size purgatory_start
.data .data
.align LGREG
.globl riscv_kernel_entry .globl riscv_kernel_entry
riscv_kernel_entry: riscv_kernel_entry:
.quad 0 .quad 0

View File

@@ -132,8 +132,8 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif,
&buffer); &buffer);
obj = (union acpi_object *)buffer.pointer; obj = (union acpi_object *)buffer.pointer;
/* Fail if calling the method fails and ATIF is supported */ /* Fail if calling the method fails */
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { if (ACPI_FAILURE(status)) {
DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n", DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
acpi_format_exception(status)); acpi_format_exception(status));
kfree(obj); kfree(obj);

View File

@@ -419,7 +419,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
ssize_t result = 0; ssize_t result = 0;
int r; int r;
if (size & 0x3 || *pos & 0x3) if (size > 4096 || size & 0x3 || *pos & 0x3)
return -EINVAL; return -EINVAL;
r = pm_runtime_get_sync(adev_to_drm(adev)->dev); r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
@@ -2009,11 +2009,11 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
amdgpu_securedisplay_debugfs_init(adev); amdgpu_securedisplay_debugfs_init(adev);
amdgpu_fw_attestation_debugfs_init(adev); amdgpu_fw_attestation_debugfs_init(adev);
debugfs_create_file("amdgpu_evict_vram", 0444, root, adev, debugfs_create_file("amdgpu_evict_vram", 0400, root, adev,
&amdgpu_evict_vram_fops); &amdgpu_evict_vram_fops);
debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev, debugfs_create_file("amdgpu_evict_gtt", 0400, root, adev,
&amdgpu_evict_gtt_fops); &amdgpu_evict_gtt_fops);
debugfs_create_file("amdgpu_test_ib", 0444, root, adev, debugfs_create_file("amdgpu_test_ib", 0400, root, adev,
&amdgpu_debugfs_test_ib_fops); &amdgpu_debugfs_test_ib_fops);
debugfs_create_file("amdgpu_vm_info", 0444, root, adev, debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
&amdgpu_debugfs_vm_info_fops); &amdgpu_debugfs_vm_info_fops);

View File

@@ -1872,7 +1872,7 @@ u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
u32 len = hid_report_len(report) + 7; u32 len = hid_report_len(report) + 7;
return kmalloc(len, flags); return kzalloc(len, flags);
} }
EXPORT_SYMBOL_GPL(hid_alloc_report_buf); EXPORT_SYMBOL_GPL(hid_alloc_report_buf);

View File

@@ -1014,7 +1014,8 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
hwq_attr.stride = sizeof(struct sq_sge); hwq_attr.stride = sizeof(struct sq_sge);
hwq_attr.depth = bnxt_qplib_get_depth(sq); hwq_attr.depth = bnxt_qplib_get_depth(sq);
hwq_attr.aux_stride = psn_sz; hwq_attr.aux_stride = psn_sz;
hwq_attr.aux_depth = bnxt_qplib_set_sq_size(sq, qp->wqe_mode); hwq_attr.aux_depth = psn_sz ? bnxt_qplib_set_sq_size(sq, qp->wqe_mode)
: 0;
hwq_attr.type = HWQ_TYPE_QUEUE; hwq_attr.type = HWQ_TYPE_QUEUE;
rc = bnxt_qplib_alloc_init_hwq(&sq->hwq, &hwq_attr); rc = bnxt_qplib_alloc_init_hwq(&sq->hwq, &hwq_attr);
if (rc) if (rc)

View File

@@ -425,6 +425,13 @@ static int gic_irq_set_irqchip_state(struct irq_data *d,
} }
gic_poke_irq(d, reg); gic_poke_irq(d, reg);
/*
* Force read-back to guarantee that the active state has taken
* effect, and won't race with a guest-driven deactivation.
*/
if (reg == GICD_ISACTIVER)
gic_peek_irq(d, reg);
return 0; return 0;
} }

View File

@@ -1882,16 +1882,13 @@ static void check_migrations(struct work_struct *ws)
* This function gets called on the error paths of the constructor, so we * This function gets called on the error paths of the constructor, so we
* have to cope with a partially initialised struct. * have to cope with a partially initialised struct.
*/ */
static void destroy(struct cache *cache) static void __destroy(struct cache *cache)
{ {
unsigned int i;
mempool_exit(&cache->migration_pool); mempool_exit(&cache->migration_pool);
if (cache->prison) if (cache->prison)
dm_bio_prison_destroy_v2(cache->prison); dm_bio_prison_destroy_v2(cache->prison);
cancel_delayed_work_sync(&cache->waker);
if (cache->wq) if (cache->wq)
destroy_workqueue(cache->wq); destroy_workqueue(cache->wq);
@@ -1919,13 +1916,22 @@ static void destroy(struct cache *cache)
if (cache->policy) if (cache->policy)
dm_cache_policy_destroy(cache->policy); dm_cache_policy_destroy(cache->policy);
bioset_exit(&cache->bs);
kfree(cache);
}
static void destroy(struct cache *cache)
{
unsigned int i;
cancel_delayed_work_sync(&cache->waker);
for (i = 0; i < cache->nr_ctr_args ; i++) for (i = 0; i < cache->nr_ctr_args ; i++)
kfree(cache->ctr_args[i]); kfree(cache->ctr_args[i]);
kfree(cache->ctr_args); kfree(cache->ctr_args);
bioset_exit(&cache->bs); __destroy(cache);
kfree(cache);
} }
static void cache_dtr(struct dm_target *ti) static void cache_dtr(struct dm_target *ti)
@@ -1980,7 +1986,6 @@ struct cache_args {
sector_t cache_sectors; sector_t cache_sectors;
struct dm_dev *origin_dev; struct dm_dev *origin_dev;
sector_t origin_sectors;
uint32_t block_size; uint32_t block_size;
@@ -2061,6 +2066,7 @@ static int parse_cache_dev(struct cache_args *ca, struct dm_arg_set *as,
static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as, static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as,
char **error) char **error)
{ {
sector_t origin_sectors;
int r; int r;
if (!at_least_one_arg(as, error)) if (!at_least_one_arg(as, error))
@@ -2073,8 +2079,8 @@ static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as,
return r; return r;
} }
ca->origin_sectors = get_dev_size(ca->origin_dev); origin_sectors = get_dev_size(ca->origin_dev);
if (ca->ti->len > ca->origin_sectors) { if (ca->ti->len > origin_sectors) {
*error = "Device size larger than cached device"; *error = "Device size larger than cached device";
return -EINVAL; return -EINVAL;
} }
@@ -2384,7 +2390,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)
ca->metadata_dev = ca->origin_dev = ca->cache_dev = NULL; ca->metadata_dev = ca->origin_dev = ca->cache_dev = NULL;
origin_blocks = cache->origin_sectors = ca->origin_sectors; origin_blocks = cache->origin_sectors = ti->len;
origin_blocks = block_div(origin_blocks, ca->block_size); origin_blocks = block_div(origin_blocks, ca->block_size);
cache->origin_blocks = to_oblock(origin_blocks); cache->origin_blocks = to_oblock(origin_blocks);
@@ -2538,7 +2544,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)
*result = cache; *result = cache;
return 0; return 0;
bad: bad:
destroy(cache); __destroy(cache);
return r; return r;
} }
@@ -2589,7 +2595,7 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3); r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3);
if (r) { if (r) {
destroy(cache); __destroy(cache);
goto out; goto out;
} }
@@ -2872,19 +2878,19 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
static bool can_resize(struct cache *cache, dm_cblock_t new_size) static bool can_resize(struct cache *cache, dm_cblock_t new_size)
{ {
if (from_cblock(new_size) > from_cblock(cache->cache_size)) { if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
if (cache->sized) { DMERR("%s: unable to extend cache due to missing cache table reload",
DMERR("%s: unable to extend cache due to missing cache table reload", cache_device_name(cache));
cache_device_name(cache)); return false;
return false;
}
} }
/* /*
* We can't drop a dirty block when shrinking the cache. * We can't drop a dirty block when shrinking the cache.
*/ */
while (from_cblock(new_size) < from_cblock(cache->cache_size)) { if (cache->loaded_mappings) {
new_size = to_cblock(from_cblock(new_size) + 1); new_size = to_cblock(find_next_bit(cache->dirty_bitset,
if (is_dirty(cache, new_size)) { from_cblock(cache->cache_size),
from_cblock(new_size)));
if (new_size != cache->cache_size) {
DMERR("%s: unable to shrink cache; cache block %llu is dirty", DMERR("%s: unable to shrink cache; cache block %llu is dirty",
cache_device_name(cache), cache_device_name(cache),
(unsigned long long) from_cblock(new_size)); (unsigned long long) from_cblock(new_size));
@@ -2920,20 +2926,15 @@ static int cache_preresume(struct dm_target *ti)
/* /*
* Check to see if the cache has resized. * Check to see if the cache has resized.
*/ */
if (!cache->sized) { if (!cache->sized || csize != cache->cache_size) {
r = resize_cache_dev(cache, csize);
if (r)
return r;
cache->sized = true;
} else if (csize != cache->cache_size) {
if (!can_resize(cache, csize)) if (!can_resize(cache, csize))
return -EINVAL; return -EINVAL;
r = resize_cache_dev(cache, csize); r = resize_cache_dev(cache, csize);
if (r) if (r)
return r; return r;
cache->sized = true;
} }
if (!cache->loaded_mappings) { if (!cache->loaded_mappings) {

View File

@@ -84,8 +84,8 @@ static int unstripe_ctr(struct dm_target *ti, unsigned int argc, char **argv)
} }
uc->physical_start = start; uc->physical_start = start;
uc->unstripe_offset = uc->unstripe * uc->chunk_size; uc->unstripe_offset = (sector_t)uc->unstripe * uc->chunk_size;
uc->unstripe_width = (uc->stripes - 1) * uc->chunk_size; uc->unstripe_width = (sector_t)(uc->stripes - 1) * uc->chunk_size;
uc->chunk_shift = is_power_of_2(uc->chunk_size) ? fls(uc->chunk_size) - 1 : 0; uc->chunk_shift = is_power_of_2(uc->chunk_size) ? fls(uc->chunk_size) - 1 : 0;
tmp_len = ti->len; tmp_len = ti->len;

View File

@@ -685,7 +685,7 @@ static int pulse8_setup(struct pulse8 *pulse8, struct serio *serio,
err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4); err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4);
if (err) if (err)
return err; return err;
date = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; date = ((unsigned)data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
dev_info(pulse8->dev, "Firmware build date %ptT\n", &date); dev_info(pulse8->dev, "Firmware build date %ptT\n", &date);
dev_dbg(pulse8->dev, "Persistent config:\n"); dev_dbg(pulse8->dev, "Persistent config:\n");

View File

@@ -1795,6 +1795,9 @@ static void tpg_precalculate_line(struct tpg_data *tpg)
unsigned p; unsigned p;
unsigned x; unsigned x;
if (WARN_ON_ONCE(!tpg->src_width || !tpg->scaled_width))
return;
switch (tpg->pattern) { switch (tpg->pattern) {
case TPG_PAT_GREEN: case TPG_PAT_GREEN:
contrast = TPG_COLOR_100_RED; contrast = TPG_COLOR_100_RED;

View File

@@ -443,8 +443,8 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
default: default:
fepriv->auto_step++; fepriv->auto_step++;
fepriv->auto_sub_step = -1; /* it'll be incremented to 0 in a moment */ fepriv->auto_sub_step = 0;
break; continue;
} }
if (!ready) fepriv->auto_sub_step++; if (!ready) fepriv->auto_sub_step++;

View File

@@ -86,10 +86,15 @@ static DECLARE_RWSEM(minor_rwsem);
static int dvb_device_open(struct inode *inode, struct file *file) static int dvb_device_open(struct inode *inode, struct file *file)
{ {
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
unsigned int minor = iminor(inode);
if (minor >= MAX_DVB_MINORS)
return -ENODEV;
mutex_lock(&dvbdev_mutex); mutex_lock(&dvbdev_mutex);
down_read(&minor_rwsem); down_read(&minor_rwsem);
dvbdev = dvb_minors[iminor(inode)];
dvbdev = dvb_minors[minor];
if (dvbdev && dvbdev->fops) { if (dvbdev && dvbdev->fops) {
int err = 0; int err = 0;
@@ -529,7 +534,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
for (minor = 0; minor < MAX_DVB_MINORS; minor++) for (minor = 0; minor < MAX_DVB_MINORS; minor++)
if (dvb_minors[minor] == NULL) if (dvb_minors[minor] == NULL)
break; break;
if (minor == MAX_DVB_MINORS) { if (minor >= MAX_DVB_MINORS) {
if (new_node) { if (new_node) {
list_del (&new_node->list_head); list_del (&new_node->list_head);
kfree(dvbdevfops); kfree(dvbdevfops);
@@ -544,6 +549,14 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
} }
#else #else
minor = nums2minor(adap->num, type, id); minor = nums2minor(adap->num, type, id);
if (minor >= MAX_DVB_MINORS) {
dvb_media_device_free(dvbdev);
list_del(&dvbdev->list_head);
kfree(dvbdev);
*pdvbdev = NULL;
mutex_unlock(&dvbdev_register_lock);
return ret;
}
#endif #endif
dvbdev->minor = minor; dvbdev->minor = minor;
dvb_minors[minor] = dvb_device_get(dvbdev); dvb_minors[minor] = dvb_device_get(dvbdev);

View File

@@ -741,6 +741,7 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
{ {
struct cx24116_state *state = fe->demodulator_priv; struct cx24116_state *state = fe->demodulator_priv;
u8 snr_reading; u8 snr_reading;
int ret;
static const u32 snr_tab[] = { /* 10 x Table (rounded up) */ static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667, 0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667, 0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
@@ -749,7 +750,11 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
dprintk("%s()\n", __func__); dprintk("%s()\n", __func__);
snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0); ret = cx24116_readreg(state, CX24116_REG_QUALITY0);
if (ret < 0)
return ret;
snr_reading = ret;
if (snr_reading >= 0xa0 /* 100% */) if (snr_reading >= 0xa0 /* 100% */)
*snr = 0xffff; *snr = 0xffff;

View File

@@ -269,7 +269,7 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3; short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3;
int index = 0; int index = 0;
u8 cfr[2]; u8 cfr[2] = {0};
u8 reg; u8 reg;
internal->status = NOCARRIER; internal->status = NOCARRIER;

View File

@@ -2516,10 +2516,10 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
const struct adv76xx_chip_info *info = state->info; const struct adv76xx_chip_info *info = state->info;
struct v4l2_dv_timings timings; struct v4l2_dv_timings timings;
struct stdi_readback stdi; struct stdi_readback stdi;
u8 reg_io_0x02 = io_read(sd, 0x02); int ret;
u8 reg_io_0x02;
u8 edid_enabled; u8 edid_enabled;
u8 cable_det; u8 cable_det;
static const char * const csc_coeff_sel_rb[16] = { static const char * const csc_coeff_sel_rb[16] = {
"bypassed", "YPbPr601 -> RGB", "reserved", "YPbPr709 -> RGB", "bypassed", "YPbPr601 -> RGB", "reserved", "YPbPr709 -> RGB",
"reserved", "RGB -> YPbPr601", "reserved", "RGB -> YPbPr709", "reserved", "RGB -> YPbPr601", "reserved", "RGB -> YPbPr709",
@@ -2618,13 +2618,21 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
v4l2_info(sd, "-----Color space-----\n"); v4l2_info(sd, "-----Color space-----\n");
v4l2_info(sd, "RGB quantization range ctrl: %s\n", v4l2_info(sd, "RGB quantization range ctrl: %s\n",
rgb_quantization_range_txt[state->rgb_quantization_range]); rgb_quantization_range_txt[state->rgb_quantization_range]);
v4l2_info(sd, "Input color space: %s\n",
input_color_space_txt[reg_io_0x02 >> 4]); ret = io_read(sd, 0x02);
v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n", if (ret < 0) {
(reg_io_0x02 & 0x02) ? "RGB" : "YCbCr", v4l2_info(sd, "Can't read Input/Output color space\n");
(((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 0x01)) ? } else {
"(16-235)" : "(0-255)", reg_io_0x02 = ret;
(reg_io_0x02 & 0x08) ? "enabled" : "disabled");
v4l2_info(sd, "Input color space: %s\n",
input_color_space_txt[reg_io_0x02 >> 4]);
v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n",
(reg_io_0x02 & 0x02) ? "RGB" : "YCbCr",
(((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 0x01)) ?
"(16-235)" : "(0-255)",
(reg_io_0x02 & 0x08) ? "enabled" : "disabled");
}
v4l2_info(sd, "Color space conversion: %s\n", v4l2_info(sd, "Color space conversion: %s\n",
csc_coeff_sel_rb[cp_read(sd, info->cp_csc) >> 4]); csc_coeff_sel_rb[cp_read(sd, info->cp_csc) >> 4]);

View File

@@ -223,10 +223,10 @@ static u32 calc_pll(struct ar0521_dev *sensor, int num, u32 freq, u16 *pre_ptr,
continue; /* Minimum value */ continue; /* Minimum value */
if (new_mult > 254) if (new_mult > 254)
break; /* Maximum, larger pre won't work either */ break; /* Maximum, larger pre won't work either */
if (sensor->extclk_freq * (u64)new_mult < AR0521_PLL_MIN * if (sensor->extclk_freq * (u64)new_mult < (u64)AR0521_PLL_MIN *
new_pre) new_pre)
continue; continue;
if (sensor->extclk_freq * (u64)new_mult > AR0521_PLL_MAX * if (sensor->extclk_freq * (u64)new_mult > (u64)AR0521_PLL_MAX *
new_pre) new_pre)
break; /* Larger pre won't work either */ break; /* Larger pre won't work either */
new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult, new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult,

View File

@@ -642,7 +642,7 @@ static int vpu_core_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
core->type = core->res->type; core->type = core->res->type;
core->id = of_alias_get_id(dev->of_node, "vpu_core"); core->id = of_alias_get_id(dev->of_node, "vpu-core");
if (core->id < 0) { if (core->id < 0) {
dev_err(dev, "can't get vpu core id\n"); dev_err(dev, "can't get vpu core id\n");
return core->id; return core->id;

View File

@@ -775,11 +775,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx)
(unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2; (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2;
jpeg_buffer.curr = 0; jpeg_buffer.curr = 0;
word = 0;
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
return; return;
jpeg_buffer.size = (long)word - 2;
if (word < 2)
jpeg_buffer.size = 0;
else
jpeg_buffer.size = (long)word - 2;
jpeg_buffer.data += 2; jpeg_buffer.data += 2;
jpeg_buffer.curr = 0; jpeg_buffer.curr = 0;
@@ -1058,6 +1061,7 @@ static int get_word_be(struct s5p_jpeg_buffer *buf, unsigned int *word)
if (byte == -1) if (byte == -1)
return -1; return -1;
*word = (unsigned int)byte | temp; *word = (unsigned int)byte | temp;
return 0; return 0;
} }
@@ -1145,7 +1149,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
sof = jpeg_buffer.curr; /* after 0xffc0 */ sof = jpeg_buffer.curr; /* after 0xffc0 */
sof_len = length; sof_len = length;
@@ -1176,7 +1180,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
if (n_dqt >= S5P_JPEG_MAX_MARKER) if (n_dqt >= S5P_JPEG_MAX_MARKER)
return false; return false;
@@ -1189,7 +1193,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
if (n_dht >= S5P_JPEG_MAX_MARKER) if (n_dht >= S5P_JPEG_MAX_MARKER)
return false; return false;
@@ -1214,6 +1218,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
/* No need to check underflows as skip() does it */
skip(&jpeg_buffer, length); skip(&jpeg_buffer, length);
break; break;
} }

View File

@@ -368,7 +368,7 @@ static int uvc_parse_format(struct uvc_device *dev,
* Parse the frame descriptors. Only uncompressed, MJPEG and frame * Parse the frame descriptors. Only uncompressed, MJPEG and frame
* based formats have frame descriptors. * based formats have frame descriptors.
*/ */
while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && while (ftype && buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
buffer[2] == ftype) { buffer[2] == ftype) {
frame = &format->frame[format->nframes]; frame = &format->frame[format->nframes];
if (ftype != UVC_VS_FRAME_FRAME_BASED) if (ftype != UVC_VS_FRAME_FRAME_BASED)

View File

@@ -753,9 +753,10 @@ static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
for (i = 0; i < master->ncontrols; i++) for (i = 0; i < master->ncontrols; i++)
cur_to_new(master->cluster[i]); cur_to_new(master->cluster[i]);
ret = call_op(master, g_volatile_ctrl); ret = call_op(master, g_volatile_ctrl);
new_to_user(c, ctrl); if (!ret)
ret = new_to_user(c, ctrl);
} else { } else {
cur_to_user(c, ctrl); ret = cur_to_user(c, ctrl);
} }
v4l2_ctrl_unlock(master); v4l2_ctrl_unlock(master);
return ret; return ret;
@@ -770,7 +771,10 @@ int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
if (!ctrl || !ctrl->is_int) if (!ctrl || !ctrl->is_int)
return -EINVAL; return -EINVAL;
ret = get_ctrl(ctrl, &c); ret = get_ctrl(ctrl, &c);
control->value = c.value;
if (!ret)
control->value = c.value;
return ret; return ret;
} }
EXPORT_SYMBOL(v4l2_g_ctrl); EXPORT_SYMBOL(v4l2_g_ctrl);
@@ -811,10 +815,11 @@ static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
int ret; int ret;
v4l2_ctrl_lock(ctrl); v4l2_ctrl_lock(ctrl);
user_to_new(c, ctrl); ret = user_to_new(c, ctrl);
ret = set_ctrl(fh, ctrl, 0);
if (!ret) if (!ret)
cur_to_user(c, ctrl); ret = set_ctrl(fh, ctrl, 0);
if (!ret)
ret = cur_to_user(c, ctrl);
v4l2_ctrl_unlock(ctrl); v4l2_ctrl_unlock(ctrl);
return ret; return ret;
} }

View File

@@ -1011,7 +1011,6 @@ static int c_can_handle_bus_err(struct net_device *dev,
/* common for all type of bus errors */ /* common for all type of bus errors */
priv->can.can_stats.bus_error++; priv->can.can_stats.bus_error++;
stats->rx_errors++;
/* propagate the error condition to the CAN stack */ /* propagate the error condition to the CAN stack */
skb = alloc_can_err_skb(dev, &cf); skb = alloc_can_err_skb(dev, &cf);
@@ -1027,26 +1026,32 @@ static int c_can_handle_bus_err(struct net_device *dev,
case LEC_STUFF_ERROR: case LEC_STUFF_ERROR:
netdev_dbg(dev, "stuff error\n"); netdev_dbg(dev, "stuff error\n");
cf->data[2] |= CAN_ERR_PROT_STUFF; cf->data[2] |= CAN_ERR_PROT_STUFF;
stats->rx_errors++;
break; break;
case LEC_FORM_ERROR: case LEC_FORM_ERROR:
netdev_dbg(dev, "form error\n"); netdev_dbg(dev, "form error\n");
cf->data[2] |= CAN_ERR_PROT_FORM; cf->data[2] |= CAN_ERR_PROT_FORM;
stats->rx_errors++;
break; break;
case LEC_ACK_ERROR: case LEC_ACK_ERROR:
netdev_dbg(dev, "ack error\n"); netdev_dbg(dev, "ack error\n");
cf->data[3] = CAN_ERR_PROT_LOC_ACK; cf->data[3] = CAN_ERR_PROT_LOC_ACK;
stats->tx_errors++;
break; break;
case LEC_BIT1_ERROR: case LEC_BIT1_ERROR:
netdev_dbg(dev, "bit1 error\n"); netdev_dbg(dev, "bit1 error\n");
cf->data[2] |= CAN_ERR_PROT_BIT1; cf->data[2] |= CAN_ERR_PROT_BIT1;
stats->tx_errors++;
break; break;
case LEC_BIT0_ERROR: case LEC_BIT0_ERROR:
netdev_dbg(dev, "bit0 error\n"); netdev_dbg(dev, "bit0 error\n");
cf->data[2] |= CAN_ERR_PROT_BIT0; cf->data[2] |= CAN_ERR_PROT_BIT0;
stats->tx_errors++;
break; break;
case LEC_CRC_ERROR: case LEC_CRC_ERROR:
netdev_dbg(dev, "CRC error\n"); netdev_dbg(dev, "CRC error\n");
cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
stats->rx_errors++;
break; break;
default: default:
break; break;

View File

@@ -2,7 +2,7 @@
// //
// mcp251xfd - Microchip MCP251xFD Family CAN controller driver // mcp251xfd - Microchip MCP251xFD Family CAN controller driver
// //
// Copyright (c) 2019, 2020, 2021 Pengutronix, // Copyright (c) 2019, 2020, 2021, 2024 Pengutronix,
// Marc Kleine-Budde <kernel@pengutronix.de> // Marc Kleine-Budde <kernel@pengutronix.de>
// //
// Based on: // Based on:
@@ -473,9 +473,11 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
}; };
const struct ethtool_coalesce ec = { const struct ethtool_coalesce ec = {
.rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq, .rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq,
.rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq, .rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq == 0 ?
1 : priv->rx_obj_num_coalesce_irq,
.tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq, .tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq,
.tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq, .tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq == 0 ?
1 : priv->tx_obj_num_coalesce_irq,
}; };
struct can_ram_layout layout; struct can_ram_layout layout;

View File

@@ -16,9 +16,9 @@
#include "mcp251xfd.h" #include "mcp251xfd.h"
static inline bool mcp251xfd_tx_fifo_sta_full(u32 fifo_sta) static inline bool mcp251xfd_tx_fifo_sta_empty(u32 fifo_sta)
{ {
return !(fifo_sta & MCP251XFD_REG_FIFOSTA_TFNRFNIF); return fifo_sta & MCP251XFD_REG_FIFOSTA_TFERFFIF;
} }
static inline int static inline int
@@ -122,7 +122,11 @@ mcp251xfd_get_tef_len(struct mcp251xfd_priv *priv, u8 *len_p)
if (err) if (err)
return err; return err;
if (mcp251xfd_tx_fifo_sta_full(fifo_sta)) { /* If the chip says the TX-FIFO is empty, but there are no TX
* buffers free in the ring, we assume all have been sent.
*/
if (mcp251xfd_tx_fifo_sta_empty(fifo_sta) &&
mcp251xfd_get_tx_free(tx_ring) == 0) {
*len_p = tx_ring->obj_num; *len_p = tx_ring->obj_num;
return 0; return 0;
} }

View File

@@ -111,6 +111,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct net_device_stats *stats = &ndev->stats; struct net_device_stats *stats = &ndev->stats;
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < TX_BD_NUM; i++) { for (i = 0; i < TX_BD_NUM; i++) {
@@ -140,7 +141,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
stats->tx_bytes += skb->len; stats->tx_bytes += skb->len;
} }
dma_unmap_single(&ndev->dev, dma_unmap_addr(tx_buff, addr), dma_unmap_single(dev, dma_unmap_addr(tx_buff, addr),
dma_unmap_len(tx_buff, len), DMA_TO_DEVICE); dma_unmap_len(tx_buff, len), DMA_TO_DEVICE);
/* return the sk_buff to system */ /* return the sk_buff to system */
@@ -174,6 +175,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
static int arc_emac_rx(struct net_device *ndev, int budget) static int arc_emac_rx(struct net_device *ndev, int budget)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int work_done; unsigned int work_done;
for (work_done = 0; work_done < budget; work_done++) { for (work_done = 0; work_done < budget; work_done++) {
@@ -223,9 +225,9 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
continue; continue;
} }
addr = dma_map_single(&ndev->dev, (void *)skb->data, addr = dma_map_single(dev, (void *)skb->data,
EMAC_BUFFER_SIZE, DMA_FROM_DEVICE); EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
if (dma_mapping_error(&ndev->dev, addr)) { if (dma_mapping_error(dev, addr)) {
if (net_ratelimit()) if (net_ratelimit())
netdev_err(ndev, "cannot map dma buffer\n"); netdev_err(ndev, "cannot map dma buffer\n");
dev_kfree_skb(skb); dev_kfree_skb(skb);
@@ -237,7 +239,7 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
} }
/* unmap previosly mapped skb */ /* unmap previosly mapped skb */
dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr), dma_unmap_single(dev, dma_unmap_addr(rx_buff, addr),
dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE); dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE);
pktlen = info & LEN_MASK; pktlen = info & LEN_MASK;
@@ -423,6 +425,7 @@ static int arc_emac_open(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct phy_device *phy_dev = ndev->phydev; struct phy_device *phy_dev = ndev->phydev;
struct device *dev = ndev->dev.parent;
int i; int i;
phy_dev->autoneg = AUTONEG_ENABLE; phy_dev->autoneg = AUTONEG_ENABLE;
@@ -445,9 +448,9 @@ static int arc_emac_open(struct net_device *ndev)
if (unlikely(!rx_buff->skb)) if (unlikely(!rx_buff->skb))
return -ENOMEM; return -ENOMEM;
addr = dma_map_single(&ndev->dev, (void *)rx_buff->skb->data, addr = dma_map_single(dev, (void *)rx_buff->skb->data,
EMAC_BUFFER_SIZE, DMA_FROM_DEVICE); EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
if (dma_mapping_error(&ndev->dev, addr)) { if (dma_mapping_error(dev, addr)) {
netdev_err(ndev, "cannot dma map\n"); netdev_err(ndev, "cannot dma map\n");
dev_kfree_skb(rx_buff->skb); dev_kfree_skb(rx_buff->skb);
return -ENOMEM; return -ENOMEM;
@@ -548,6 +551,7 @@ static void arc_emac_set_rx_mode(struct net_device *ndev)
static void arc_free_tx_queue(struct net_device *ndev) static void arc_free_tx_queue(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < TX_BD_NUM; i++) { for (i = 0; i < TX_BD_NUM; i++) {
@@ -555,7 +559,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
struct buffer_state *tx_buff = &priv->tx_buff[i]; struct buffer_state *tx_buff = &priv->tx_buff[i];
if (tx_buff->skb) { if (tx_buff->skb) {
dma_unmap_single(&ndev->dev, dma_unmap_single(dev,
dma_unmap_addr(tx_buff, addr), dma_unmap_addr(tx_buff, addr),
dma_unmap_len(tx_buff, len), dma_unmap_len(tx_buff, len),
DMA_TO_DEVICE); DMA_TO_DEVICE);
@@ -579,6 +583,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
static void arc_free_rx_queue(struct net_device *ndev) static void arc_free_rx_queue(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < RX_BD_NUM; i++) { for (i = 0; i < RX_BD_NUM; i++) {
@@ -586,7 +591,7 @@ static void arc_free_rx_queue(struct net_device *ndev)
struct buffer_state *rx_buff = &priv->rx_buff[i]; struct buffer_state *rx_buff = &priv->rx_buff[i];
if (rx_buff->skb) { if (rx_buff->skb) {
dma_unmap_single(&ndev->dev, dma_unmap_single(dev,
dma_unmap_addr(rx_buff, addr), dma_unmap_addr(rx_buff, addr),
dma_unmap_len(rx_buff, len), dma_unmap_len(rx_buff, len),
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
@@ -679,6 +684,7 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
unsigned int len, *txbd_curr = &priv->txbd_curr; unsigned int len, *txbd_curr = &priv->txbd_curr;
struct net_device_stats *stats = &ndev->stats; struct net_device_stats *stats = &ndev->stats;
__le32 *info = &priv->txbd[*txbd_curr].info; __le32 *info = &priv->txbd[*txbd_curr].info;
struct device *dev = ndev->dev.parent;
dma_addr_t addr; dma_addr_t addr;
if (skb_padto(skb, ETH_ZLEN)) if (skb_padto(skb, ETH_ZLEN))
@@ -692,10 +698,9 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
addr = dma_map_single(&ndev->dev, (void *)skb->data, len, addr = dma_map_single(dev, (void *)skb->data, len, DMA_TO_DEVICE);
DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(&ndev->dev, addr))) { if (unlikely(dma_mapping_error(dev, addr))) {
stats->tx_dropped++; stats->tx_dropped++;
stats->tx_errors++; stats->tx_errors++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);

View File

@@ -133,6 +133,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
struct arc_emac_mdio_bus_data *data = &priv->bus_data; struct arc_emac_mdio_bus_data *data = &priv->bus_data;
struct device_node *np = priv->dev->of_node; struct device_node *np = priv->dev->of_node;
const char *name = "Synopsys MII Bus"; const char *name = "Synopsys MII Bus";
struct device_node *mdio_node;
struct mii_bus *bus; struct mii_bus *bus;
int error; int error;
@@ -164,7 +165,13 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name); snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name);
error = of_mdiobus_register(bus, priv->dev->of_node); /* Backwards compatibility for EMAC nodes without MDIO subnode. */
mdio_node = of_get_child_by_name(np, "mdio");
if (!mdio_node)
mdio_node = of_node_get(np);
error = of_mdiobus_register(bus, mdio_node);
of_node_put(mdio_node);
if (error) { if (error) {
mdiobus_free(bus); mdiobus_free(bus);
return dev_err_probe(priv->dev, error, return dev_err_probe(priv->dev, error,

View File

@@ -78,11 +78,18 @@ static int enetc_vf_set_mac_addr(struct net_device *ndev, void *addr)
{ {
struct enetc_ndev_priv *priv = netdev_priv(ndev); struct enetc_ndev_priv *priv = netdev_priv(ndev);
struct sockaddr *saddr = addr; struct sockaddr *saddr = addr;
int err;
if (!is_valid_ether_addr(saddr->sa_data)) if (!is_valid_ether_addr(saddr->sa_data))
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
return enetc_msg_vsi_set_primary_mac_addr(priv, saddr); err = enetc_msg_vsi_set_primary_mac_addr(priv, saddr);
if (err)
return err;
eth_hw_addr_set(ndev, saddr->sa_data);
return 0;
} }
static int enetc_vf_set_features(struct net_device *ndev, static int enetc_vf_set_features(struct net_device *ndev,

View File

@@ -25,8 +25,11 @@ void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo)
pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev); pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
if (!pci_id) if (!pci_id)
continue; continue;
if (IS_ENABLED(CONFIG_PCI_IOV)) if (IS_ENABLED(CONFIG_PCI_IOV)) {
device_lock(&ae_dev->pdev->dev);
pci_disable_sriov(ae_dev->pdev); pci_disable_sriov(ae_dev->pdev);
device_unlock(&ae_dev->pdev->dev);
}
} }
} }
EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare); EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);

View File

@@ -790,6 +790,7 @@ enum i40e_filter_state {
I40E_FILTER_ACTIVE, /* Added to switch by FW */ I40E_FILTER_ACTIVE, /* Added to switch by FW */
I40E_FILTER_FAILED, /* Rejected by FW */ I40E_FILTER_FAILED, /* Rejected by FW */
I40E_FILTER_REMOVE, /* To be removed */ I40E_FILTER_REMOVE, /* To be removed */
I40E_FILTER_NEW_SYNC, /* New, not sent yet, is in i40e_sync_vsi_filters() */
/* There is no 'removed' state; the filter struct is freed */ /* There is no 'removed' state; the filter struct is freed */
}; };
struct i40e_mac_filter { struct i40e_mac_filter {

View File

@@ -105,6 +105,7 @@ static char *i40e_filter_state_string[] = {
"ACTIVE", "ACTIVE",
"FAILED", "FAILED",
"REMOVE", "REMOVE",
"NEW_SYNC",
}; };
/** /**

View File

@@ -1251,6 +1251,7 @@ int i40e_count_filters(struct i40e_vsi *vsi)
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
if (f->state == I40E_FILTER_NEW || if (f->state == I40E_FILTER_NEW ||
f->state == I40E_FILTER_NEW_SYNC ||
f->state == I40E_FILTER_ACTIVE) f->state == I40E_FILTER_ACTIVE)
++cnt; ++cnt;
} }
@@ -1437,6 +1438,8 @@ static int i40e_correct_mac_vlan_filters(struct i40e_vsi *vsi,
new->f = add_head; new->f = add_head;
new->state = add_head->state; new->state = add_head->state;
if (add_head->state == I40E_FILTER_NEW)
add_head->state = I40E_FILTER_NEW_SYNC;
/* Add the new filter to the tmp list */ /* Add the new filter to the tmp list */
hlist_add_head(&new->hlist, tmp_add_list); hlist_add_head(&new->hlist, tmp_add_list);
@@ -1546,6 +1549,8 @@ static int i40e_correct_vf_mac_vlan_filters(struct i40e_vsi *vsi,
return -ENOMEM; return -ENOMEM;
new_mac->f = add_head; new_mac->f = add_head;
new_mac->state = add_head->state; new_mac->state = add_head->state;
if (add_head->state == I40E_FILTER_NEW)
add_head->state = I40E_FILTER_NEW_SYNC;
/* Add the new filter to the tmp list */ /* Add the new filter to the tmp list */
hlist_add_head(&new_mac->hlist, tmp_add_list); hlist_add_head(&new_mac->hlist, tmp_add_list);
@@ -2437,7 +2442,8 @@ static int
i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name, i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name,
struct i40e_mac_filter *f) struct i40e_mac_filter *f)
{ {
bool enable = f->state == I40E_FILTER_NEW; bool enable = f->state == I40E_FILTER_NEW ||
f->state == I40E_FILTER_NEW_SYNC;
struct i40e_hw *hw = &vsi->back->hw; struct i40e_hw *hw = &vsi->back->hw;
int aq_ret; int aq_ret;
@@ -2611,6 +2617,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
/* Add it to the hash list */ /* Add it to the hash list */
hlist_add_head(&new->hlist, &tmp_add_list); hlist_add_head(&new->hlist, &tmp_add_list);
f->state = I40E_FILTER_NEW_SYNC;
} }
/* Count the number of active (current and new) VLAN /* Count the number of active (current and new) VLAN
@@ -2762,7 +2769,8 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
spin_lock_bh(&vsi->mac_filter_hash_lock); spin_lock_bh(&vsi->mac_filter_hash_lock);
hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) { hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) {
/* Only update the state if we're still NEW */ /* Only update the state if we're still NEW */
if (new->f->state == I40E_FILTER_NEW) if (new->f->state == I40E_FILTER_NEW ||
new->f->state == I40E_FILTER_NEW_SYNC)
new->f->state = new->state; new->f->state = new->state;
hlist_del(&new->hlist); hlist_del(&new->hlist);
netdev_hw_addr_refcnt(new->f, vsi->netdev, -1); netdev_hw_addr_refcnt(new->f, vsi->netdev, -1);

View File

@@ -1694,11 +1694,12 @@ static int
ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp, ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp,
struct ice_fdir_fltr *input) struct ice_fdir_fltr *input)
{ {
u16 dest_vsi, q_index = 0; s16 q_index = ICE_FDIR_NO_QUEUE_IDX;
u16 orig_q_index = 0; u16 orig_q_index = 0;
struct ice_pf *pf; struct ice_pf *pf;
struct ice_hw *hw; struct ice_hw *hw;
int flow_type; int flow_type;
u16 dest_vsi;
u8 dest_ctl; u8 dest_ctl;
if (!vsi || !fsp || !input) if (!vsi || !fsp || !input)

View File

@@ -50,6 +50,8 @@
*/ */
#define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20 #define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20
#define ICE_FDIR_NO_QUEUE_IDX -1
enum ice_fltr_prgm_desc_dest { enum ice_fltr_prgm_desc_dest {
ICE_FLTR_PRGM_DESC_DEST_DROP_PKT, ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX, ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
@@ -181,7 +183,7 @@ struct ice_fdir_fltr {
u16 flex_fltr; u16 flex_fltr;
/* filter control */ /* filter control */
u16 q_index; s16 q_index;
u16 orig_q_index; u16 orig_q_index;
u16 dest_vsi; u16 dest_vsi;
u8 dest_ctl; u8 dest_ctl;

View File

@@ -3665,6 +3665,7 @@ static int stmmac_request_irq_single(struct net_device *dev)
/* Request the Wake IRQ in case of another line /* Request the Wake IRQ in case of another line
* is used for WoL * is used for WoL
*/ */
priv->wol_irq_disabled = true;
if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) { if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) {
ret = request_irq(priv->wol_irq, stmmac_interrupt, ret = request_irq(priv->wol_irq, stmmac_interrupt,
IRQF_SHARED, dev->name, dev); IRQF_SHARED, dev->name, dev);

View File

@@ -222,7 +222,7 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
struct mse102x_net_spi *mses = to_mse102x_spi(mse); struct mse102x_net_spi *mses = to_mse102x_spi(mse);
struct spi_transfer *xfer = &mses->spi_xfer; struct spi_transfer *xfer = &mses->spi_xfer;
struct spi_message *msg = &mses->spi_msg; struct spi_message *msg = &mses->spi_msg;
struct sk_buff *tskb; struct sk_buff *tskb = NULL;
int ret; int ret;
netif_dbg(mse, tx_queued, mse->ndev, "%s: skb %p, %d@%p\n", netif_dbg(mse, tx_queued, mse->ndev, "%s: skb %p, %d@%p\n",
@@ -235,7 +235,6 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
if (!tskb) if (!tskb)
return -ENOMEM; return -ENOMEM;
dev_kfree_skb(txp);
txp = tskb; txp = tskb;
} }
@@ -257,6 +256,8 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
mse->stats.xfer_err++; mse->stats.xfer_err++;
} }
dev_kfree_skb(tskb);
return ret; return ret;
} }

View File

@@ -147,6 +147,8 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl);
/* IRQ related */ \ /* IRQ related */ \
.config_intr = dp83848_config_intr, \ .config_intr = dp83848_config_intr, \
.handle_interrupt = dp83848_handle_interrupt, \ .handle_interrupt = dp83848_handle_interrupt, \
\
.flags = PHY_RST_AFTER_CLK_EN, \
} }
static struct phy_driver dp83848_driver[] = { static struct phy_driver dp83848_driver[] = {

View File

@@ -3887,6 +3887,12 @@ static int virtnet_probe(struct virtio_device *vdev)
if (vi->has_rss || vi->has_rss_hash_report) { if (vi->has_rss || vi->has_rss_hash_report) {
vi->rss_key_size = vi->rss_key_size =
virtio_cread8(vdev, offsetof(struct virtio_net_config, rss_max_key_size)); virtio_cread8(vdev, offsetof(struct virtio_net_config, rss_max_key_size));
if (vi->rss_key_size > VIRTIO_NET_RSS_MAX_KEY_SIZE) {
dev_err(&vdev->dev, "rss_max_key_size=%u exceeds the limit %u.\n",
vi->rss_key_size, VIRTIO_NET_RSS_MAX_KEY_SIZE);
err = -EINVAL;
goto free;
}
vi->rss_hash_types_supported = vi->rss_hash_types_supported =
virtio_cread32(vdev, offsetof(struct virtio_net_config, supported_hash_types)); virtio_cread32(vdev, offsetof(struct virtio_net_config, supported_hash_types));

View File

@@ -262,7 +262,7 @@ int t7xx_dpmaif_rx_buf_alloc(struct dpmaif_ctrl *dpmaif_ctrl,
return 0; return 0;
err_unmap_skbs: err_unmap_skbs:
while (--i > 0) while (i--)
t7xx_unmap_bat_skb(dpmaif_ctrl->dev, bat_req->bat_skb, i); t7xx_unmap_bat_skb(dpmaif_ctrl->dev, bat_req->bat_skb, i);
return ret; return ret;

View File

@@ -878,6 +878,11 @@ static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, STB_SPILL_TO_DRAM, 1); amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, STB_SPILL_TO_DRAM, 1);
amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, STB_SPILL_TO_DRAM, 1); amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, STB_SPILL_TO_DRAM, 1);
if (!phys_addr_hi && !phys_addr_low) {
dev_err(dev->dev, "STB is not enabled on the system; disable enable_stb or contact system vendor\n");
return -EINVAL;
}
stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low); stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low);
/* Clear msg_port for other SMU operation */ /* Clear msg_port for other SMU operation */

View File

@@ -106,7 +106,9 @@ static int pwm_imx_tpm_round_state(struct pwm_chip *chip,
p->prescale = prescale; p->prescale = prescale;
period_count = (clock_unit + ((1 << prescale) >> 1)) >> prescale; period_count = (clock_unit + ((1 << prescale) >> 1)) >> prescale;
p->mod = period_count; if (period_count == 0)
return -EINVAL;
p->mod = period_count - 1;
/* calculate real period HW can support */ /* calculate real period HW can support */
tmp = (u64)period_count << prescale; tmp = (u64)period_count << prescale;

View File

@@ -218,8 +218,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT); bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
while (bufsize >= SECTOR_SIZE) { while (bufsize >= SECTOR_SIZE) {
buf = __vmalloc(bufsize, buf = kvzalloc(bufsize, GFP_KERNEL | __GFP_NORETRY);
GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY);
if (buf) { if (buf) {
*buflen = bufsize; *buflen = bufsize;
return buf; return buf;

View File

@@ -73,7 +73,14 @@ static struct irq_chip lmh_irq_chip = {
static int lmh_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) static int lmh_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
{ {
struct lmh_hw_data *lmh_data = d->host_data; struct lmh_hw_data *lmh_data = d->host_data;
static struct lock_class_key lmh_lock_key;
static struct lock_class_key lmh_request_key;
/*
* This lock class tells lockdep that GPIO irqs are in a different
* category than their parents, so it won't report false recursion.
*/
irq_set_lockdep_class(irq, &lmh_lock_key, &lmh_request_key);
irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq); irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq);
irq_set_chip_data(irq, lmh_data); irq_set_chip_data(irq, lmh_data);

View File

@@ -238,18 +238,15 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
struct device_node *trips; struct device_node *trips;
int ret, count; int ret, count;
*ntrips = 0;
trips = of_get_child_by_name(np, "trips"); trips = of_get_child_by_name(np, "trips");
if (!trips) { if (!trips)
pr_err("Failed to find 'trips' node\n"); return NULL;
return ERR_PTR(-EINVAL);
}
count = of_get_child_count(trips); count = of_get_child_count(trips);
if (!count) { if (!count)
pr_err("No trip point defined\n"); return NULL;
ret = -EINVAL;
goto out_of_node_put;
}
tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL); tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL);
if (!tt) { if (!tt) {
@@ -272,7 +269,6 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
out_kfree: out_kfree:
kfree(tt); kfree(tt);
*ntrips = 0;
out_of_node_put: out_of_node_put:
of_node_put(trips); of_node_put(trips);
@@ -619,11 +615,14 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
trips = thermal_of_trips_init(np, &ntrips); trips = thermal_of_trips_init(np, &ntrips);
if (IS_ERR(trips)) { if (IS_ERR(trips)) {
pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id); pr_err("Failed to parse trip points for %pOFn id=%d\n", sensor, id);
ret = PTR_ERR(trips); ret = PTR_ERR(trips);
goto out_kfree_of_ops; goto out_kfree_of_ops;
} }
if (!trips)
pr_info("No trip points found for %pOFn id=%d\n", sensor, id);
ret = thermal_of_monitor_init(np, &delay, &pdelay); ret = thermal_of_monitor_init(np, &delay, &pdelay);
if (ret) { if (ret) {
pr_err("Failed to initialize monitoring delays from %pOFn\n", np); pr_err("Failed to initialize monitoring delays from %pOFn\n", np);

View File

@@ -286,8 +286,6 @@ static int sunxi_musb_exit(struct musb *musb)
if (test_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags)) if (test_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags))
sunxi_sram_release(musb->controller->parent); sunxi_sram_release(musb->controller->parent);
devm_usb_put_phy(glue->dev, glue->xceiv);
return 0; return 0;
} }

View File

@@ -770,11 +770,12 @@ static void edge_bulk_out_data_callback(struct urb *urb)
static void edge_bulk_out_cmd_callback(struct urb *urb) static void edge_bulk_out_cmd_callback(struct urb *urb)
{ {
struct edgeport_port *edge_port = urb->context; struct edgeport_port *edge_port = urb->context;
struct device *dev = &urb->dev->dev;
int status = urb->status; int status = urb->status;
atomic_dec(&CmdUrbs); atomic_dec(&CmdUrbs);
dev_dbg(&urb->dev->dev, "%s - FREE URB %p (outstanding %d)\n", dev_dbg(dev, "%s - FREE URB %p (outstanding %d)\n", __func__, urb,
__func__, urb, atomic_read(&CmdUrbs)); atomic_read(&CmdUrbs));
/* clean up the transfer buffer */ /* clean up the transfer buffer */
@@ -784,8 +785,7 @@ static void edge_bulk_out_cmd_callback(struct urb *urb)
usb_free_urb(urb); usb_free_urb(urb);
if (status) { if (status) {
dev_dbg(&urb->dev->dev, dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
"%s - nonzero write bulk status received: %d\n",
__func__, status); __func__, status);
return; return;
} }

View File

@@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
#define QUECTEL_VENDOR_ID 0x2c7c #define QUECTEL_VENDOR_ID 0x2c7c
/* These Quectel products use Quectel's vendor ID */ /* These Quectel products use Quectel's vendor ID */
#define QUECTEL_PRODUCT_EC21 0x0121 #define QUECTEL_PRODUCT_EC21 0x0121
#define QUECTEL_PRODUCT_RG650V 0x0122
#define QUECTEL_PRODUCT_EM061K_LTA 0x0123 #define QUECTEL_PRODUCT_EM061K_LTA 0x0123
#define QUECTEL_PRODUCT_EM061K_LMS 0x0124 #define QUECTEL_PRODUCT_EM061K_LMS 0x0124
#define QUECTEL_PRODUCT_EC25 0x0125 #define QUECTEL_PRODUCT_EC25 0x0125
@@ -1273,6 +1274,8 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
@@ -2320,6 +2323,9 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x30) }, /* Fibocom FG132 Diag */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x40) }, /* Fibocom FG132 AT */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0, 0) }, /* Fibocom FG132 NMEA */
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */
.driver_info = RSVD(5) }, .driver_info = RSVD(5) },
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */

View File

@@ -166,6 +166,8 @@ static const struct usb_device_id id_table[] = {
{DEVICE_SWI(0x1199, 0x9090)}, /* Sierra Wireless EM7565 QDL */ {DEVICE_SWI(0x1199, 0x9090)}, /* Sierra Wireless EM7565 QDL */
{DEVICE_SWI(0x1199, 0x9091)}, /* Sierra Wireless EM7565 */ {DEVICE_SWI(0x1199, 0x9091)}, /* Sierra Wireless EM7565 */
{DEVICE_SWI(0x1199, 0x90d2)}, /* Sierra Wireless EM9191 QDL */ {DEVICE_SWI(0x1199, 0x90d2)}, /* Sierra Wireless EM9191 QDL */
{DEVICE_SWI(0x1199, 0x90e4)}, /* Sierra Wireless EM86xx QDL*/
{DEVICE_SWI(0x1199, 0x90e5)}, /* Sierra Wireless EM86xx */
{DEVICE_SWI(0x1199, 0xc080)}, /* Sierra Wireless EM7590 QDL */ {DEVICE_SWI(0x1199, 0xc080)}, /* Sierra Wireless EM7590 QDL */
{DEVICE_SWI(0x1199, 0xc081)}, /* Sierra Wireless EM7590 */ {DEVICE_SWI(0x1199, 0xc081)}, /* Sierra Wireless EM7590 */
{DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ {DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */

View File

@@ -441,6 +441,8 @@ static void ucsi_ccg_update_set_new_cam_cmd(struct ucsi_ccg *uc,
port = uc->orig; port = uc->orig;
new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd); new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd);
if (new_cam >= ARRAY_SIZE(uc->updated))
return;
new_port = &uc->updated[new_cam]; new_port = &uc->updated[new_cam];
cam = new_port->linked_idx; cam = new_port->linked_idx;
enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd); enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd);

View File

@@ -622,7 +622,7 @@ static int insert_delayed_ref(struct btrfs_trans_handle *trans,
&href->ref_add_list); &href->ref_add_list);
else if (ref->action == BTRFS_DROP_DELAYED_REF) { else if (ref->action == BTRFS_DROP_DELAYED_REF) {
ASSERT(!list_empty(&exist->add_list)); ASSERT(!list_empty(&exist->add_list));
list_del(&exist->add_list); list_del_init(&exist->add_list);
} else { } else {
ASSERT(0); ASSERT(0);
} }

View File

@@ -206,13 +206,17 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
nfs_fscache_invalidate(inode, 0); nfs_fscache_invalidate(inode, 0);
flags &= ~NFS_INO_REVAL_FORCED; flags &= ~NFS_INO_REVAL_FORCED;
nfsi->cache_validity |= flags; flags |= nfsi->cache_validity;
if (inode->i_mapping->nrpages == 0) if (inode->i_mapping->nrpages == 0)
nfsi->cache_validity &= ~(NFS_INO_INVALID_DATA | flags &= ~NFS_INO_INVALID_DATA;
NFS_INO_DATA_INVAL_DEFER);
else if (nfsi->cache_validity & NFS_INO_INVALID_DATA) /* pairs with nfs_clear_invalid_mapping()'s smp_load_acquire() */
nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER; smp_store_release(&nfsi->cache_validity, flags);
if (inode->i_mapping->nrpages == 0 ||
nfsi->cache_validity & NFS_INO_INVALID_DATA) {
nfs_ooo_clear(nfsi);
}
trace_nfs_set_cache_invalid(inode, 0); trace_nfs_set_cache_invalid(inode, 0);
} }
EXPORT_SYMBOL_GPL(nfs_set_cache_invalid); EXPORT_SYMBOL_GPL(nfs_set_cache_invalid);
@@ -677,9 +681,10 @@ static int nfs_vmtruncate(struct inode * inode, loff_t offset)
trace_nfs_size_truncate(inode, offset); trace_nfs_size_truncate(inode, offset);
i_size_write(inode, offset); i_size_write(inode, offset);
/* Optimisation */ /* Optimisation */
if (offset == 0) if (offset == 0) {
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_DATA | NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_DATA;
NFS_INO_DATA_INVAL_DEFER); nfs_ooo_clear(NFS_I(inode));
}
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE; NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@@ -1099,7 +1104,7 @@ void nfs_inode_attach_open_context(struct nfs_open_context *ctx)
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (list_empty(&nfsi->open_files) && if (list_empty(&nfsi->open_files) &&
(nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)) nfs_ooo_test(nfsi))
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA | nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA |
NFS_INO_REVAL_FORCED); NFS_INO_REVAL_FORCED);
list_add_tail_rcu(&ctx->list, &nfsi->open_files); list_add_tail_rcu(&ctx->list, &nfsi->open_files);
@@ -1329,6 +1334,13 @@ int nfs_clear_invalid_mapping(struct address_space *mapping)
TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
if (ret) if (ret)
goto out; goto out;
smp_rmb(); /* pairs with smp_wmb() below */
if (test_bit(NFS_INO_INVALIDATING, bitlock))
continue;
/* pairs with nfs_set_cache_invalid()'s smp_store_release() */
if (!(smp_load_acquire(&nfsi->cache_validity) & NFS_INO_INVALID_DATA))
goto out;
/* Slow-path that double-checks with spinlock held */
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (test_bit(NFS_INO_INVALIDATING, bitlock)) { if (test_bit(NFS_INO_INVALIDATING, bitlock)) {
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@@ -1342,8 +1354,8 @@ int nfs_clear_invalid_mapping(struct address_space *mapping)
set_bit(NFS_INO_INVALIDATING, bitlock); set_bit(NFS_INO_INVALIDATING, bitlock);
smp_wmb(); smp_wmb();
nfsi->cache_validity &= nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
~(NFS_INO_INVALID_DATA | NFS_INO_DATA_INVAL_DEFER); nfs_ooo_clear(nfsi);
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
trace_nfs_invalidate_mapping_enter(inode); trace_nfs_invalidate_mapping_enter(inode);
ret = nfs_invalidate_mapping(inode, mapping); ret = nfs_invalidate_mapping(inode, mapping);
@@ -1554,6 +1566,7 @@ void nfs_fattr_init(struct nfs_fattr *fattr)
fattr->gencount = nfs_inc_attr_generation_counter(); fattr->gencount = nfs_inc_attr_generation_counter();
fattr->owner_name = NULL; fattr->owner_name = NULL;
fattr->group_name = NULL; fattr->group_name = NULL;
fattr->mdsthreshold = NULL;
} }
EXPORT_SYMBOL_GPL(nfs_fattr_init); EXPORT_SYMBOL_GPL(nfs_fattr_init);
@@ -1805,6 +1818,66 @@ static int nfs_inode_finish_partial_attr_update(const struct nfs_fattr *fattr,
return 0; return 0;
} }
static void nfs_ooo_merge(struct nfs_inode *nfsi,
u64 start, u64 end)
{
int i, cnt;
if (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)
/* No point merging anything */
return;
if (!nfsi->ooo) {
nfsi->ooo = kmalloc(sizeof(*nfsi->ooo), GFP_ATOMIC);
if (!nfsi->ooo) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
return;
}
nfsi->ooo->cnt = 0;
}
/* add this range, merging if possible */
cnt = nfsi->ooo->cnt;
for (i = 0; i < cnt; i++) {
if (end == nfsi->ooo->gap[i].start)
end = nfsi->ooo->gap[i].end;
else if (start == nfsi->ooo->gap[i].end)
start = nfsi->ooo->gap[i].start;
else
continue;
/* Remove 'i' from table and loop to insert the new range */
cnt -= 1;
nfsi->ooo->gap[i] = nfsi->ooo->gap[cnt];
i = -1;
}
if (start != end) {
if (cnt >= ARRAY_SIZE(nfsi->ooo->gap)) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
kfree(nfsi->ooo);
nfsi->ooo = NULL;
return;
}
nfsi->ooo->gap[cnt].start = start;
nfsi->ooo->gap[cnt].end = end;
cnt += 1;
}
nfsi->ooo->cnt = cnt;
}
static void nfs_ooo_record(struct nfs_inode *nfsi,
struct nfs_fattr *fattr)
{
/* This reply was out-of-order, so record in the
* pre/post change id, possibly cancelling
* gaps created when iversion was jumpped forward.
*/
if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) &&
(fattr->valid & NFS_ATTR_FATTR_PRECHANGE))
nfs_ooo_merge(nfsi,
fattr->change_attr,
fattr->pre_change_attr);
}
static int nfs_refresh_inode_locked(struct inode *inode, static int nfs_refresh_inode_locked(struct inode *inode,
struct nfs_fattr *fattr) struct nfs_fattr *fattr)
{ {
@@ -1815,8 +1888,12 @@ static int nfs_refresh_inode_locked(struct inode *inode,
if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode)) if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode))
ret = nfs_update_inode(inode, fattr); ret = nfs_update_inode(inode, fattr);
else if (attr_cmp == 0) else {
ret = nfs_check_inode_attributes(inode, fattr); nfs_ooo_record(NFS_I(inode), fattr);
if (attr_cmp == 0)
ret = nfs_check_inode_attributes(inode, fattr);
}
trace_nfs_refresh_inode_exit(inode, ret); trace_nfs_refresh_inode_exit(inode, ret);
return ret; return ret;
@@ -1907,6 +1984,8 @@ int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fa
if (attr_cmp < 0) if (attr_cmp < 0)
return 0; return 0;
if ((fattr->valid & NFS_ATTR_FATTR) == 0 || !attr_cmp) { if ((fattr->valid & NFS_ATTR_FATTR) == 0 || !attr_cmp) {
/* Record the pre/post change info before clearing PRECHANGE */
nfs_ooo_record(NFS_I(inode), fattr);
fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE
| NFS_ATTR_FATTR_PRESIZE | NFS_ATTR_FATTR_PRESIZE
| NFS_ATTR_FATTR_PREMTIME | NFS_ATTR_FATTR_PREMTIME
@@ -2061,6 +2140,15 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
/* More cache consistency checks */ /* More cache consistency checks */
if (fattr->valid & NFS_ATTR_FATTR_CHANGE) { if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
if (!have_writers && nfsi->ooo && nfsi->ooo->cnt == 1 &&
nfsi->ooo->gap[0].end == inode_peek_iversion_raw(inode)) {
/* There is one remaining gap that hasn't been
* merged into iversion - do that now.
*/
inode_set_iversion_raw(inode, nfsi->ooo->gap[0].start);
kfree(nfsi->ooo);
nfsi->ooo = NULL;
}
if (!inode_eq_iversion_raw(inode, fattr->change_attr)) { if (!inode_eq_iversion_raw(inode, fattr->change_attr)) {
/* Could it be a race with writeback? */ /* Could it be a race with writeback? */
if (!(have_writers || have_delegation)) { if (!(have_writers || have_delegation)) {
@@ -2082,8 +2170,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
dprintk("NFS: change_attr change on server for file %s/%ld\n", dprintk("NFS: change_attr change on server for file %s/%ld\n",
inode->i_sb->s_id, inode->i_sb->s_id,
inode->i_ino); inode->i_ino);
} else if (!have_delegation) } else if (!have_delegation) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER; nfs_ooo_record(nfsi, fattr);
nfs_ooo_merge(nfsi, inode_peek_iversion_raw(inode),
fattr->change_attr);
}
inode_set_iversion_raw(inode, fattr->change_attr); inode_set_iversion_raw(inode, fattr->change_attr);
} }
} else { } else {
@@ -2237,6 +2328,7 @@ struct inode *nfs_alloc_inode(struct super_block *sb)
return NULL; return NULL;
nfsi->flags = 0UL; nfsi->flags = 0UL;
nfsi->cache_validity = 0UL; nfsi->cache_validity = 0UL;
nfsi->ooo = NULL;
#if IS_ENABLED(CONFIG_NFS_V4) #if IS_ENABLED(CONFIG_NFS_V4)
nfsi->nfs4_acl = NULL; nfsi->nfs4_acl = NULL;
#endif /* CONFIG_NFS_V4 */ #endif /* CONFIG_NFS_V4 */
@@ -2249,6 +2341,7 @@ EXPORT_SYMBOL_GPL(nfs_alloc_inode);
void nfs_free_inode(struct inode *inode) void nfs_free_inode(struct inode *inode)
{ {
kfree(NFS_I(inode)->ooo);
kmem_cache_free(nfs_inode_cachep, NFS_I(inode)); kmem_cache_free(nfs_inode_cachep, NFS_I(inode));
} }
EXPORT_SYMBOL_GPL(nfs_free_inode); EXPORT_SYMBOL_GPL(nfs_free_inode);

View File

@@ -866,7 +866,15 @@ static int nfs_request_mount(struct fs_context *fc,
* Now ask the mount server to map our export path * Now ask the mount server to map our export path
* to a file handle. * to a file handle.
*/ */
status = nfs_mount(&request, ctx->timeo, ctx->retrans); if ((request.protocol == XPRT_TRANSPORT_UDP) ==
!(ctx->flags & NFS_MOUNT_TCP))
/*
* NFS protocol and mount protocol are both UDP or neither UDP
* so timeouts are compatible. Use NFS timeouts for MOUNT
*/
status = nfs_mount(&request, ctx->timeo, ctx->retrans);
else
status = nfs_mount(&request, NFS_UNSPEC_TIMEO, NFS_UNSPEC_RETRANS);
if (status != 0) { if (status != 0) {
dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n", dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
request.hostname, status); request.hostname, status);

View File

@@ -2040,8 +2040,7 @@ static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc,
rc = 0; rc = 0;
ocfs2_xa_cleanup_value_truncate(loc, "removing", ocfs2_xa_cleanup_value_truncate(loc, "removing",
orig_clusters); orig_clusters);
if (rc) goto out;
goto out;
} }
} }

View File

@@ -457,10 +457,6 @@ static vm_fault_t mmap_vmcore_fault(struct vm_fault *vmf)
#endif #endif
} }
static const struct vm_operations_struct vmcore_mmap_ops = {
.fault = mmap_vmcore_fault,
};
/** /**
* vmcore_alloc_buf - allocate buffer in vmalloc memory * vmcore_alloc_buf - allocate buffer in vmalloc memory
* @size: size of buffer * @size: size of buffer
@@ -488,6 +484,11 @@ static inline char *vmcore_alloc_buf(size_t size)
* virtually contiguous user-space in ELF layout. * virtually contiguous user-space in ELF layout.
*/ */
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
static const struct vm_operations_struct vmcore_mmap_ops = {
.fault = mmap_vmcore_fault,
};
/* /*
* remap_oldmem_pfn_checked - do remap_oldmem_pfn_range replacing all pages * remap_oldmem_pfn_checked - do remap_oldmem_pfn_range replacing all pages
* reported as not being ram with the zero page. * reported as not being ram with the zero page.

View File

@@ -90,7 +90,7 @@ static int __rpc_method(char *rpc_name)
int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name) int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name)
{ {
struct ksmbd_session_rpc *entry; struct ksmbd_session_rpc *entry, *old;
struct ksmbd_rpc_command *resp; struct ksmbd_rpc_command *resp;
int method; int method;
@@ -106,16 +106,19 @@ int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name)
entry->id = ksmbd_ipc_id_alloc(); entry->id = ksmbd_ipc_id_alloc();
if (entry->id < 0) if (entry->id < 0)
goto free_entry; goto free_entry;
xa_store(&sess->rpc_handle_list, entry->id, entry, GFP_KERNEL); old = xa_store(&sess->rpc_handle_list, entry->id, entry, GFP_KERNEL);
if (xa_is_err(old))
goto free_id;
resp = ksmbd_rpc_open(sess, entry->id); resp = ksmbd_rpc_open(sess, entry->id);
if (!resp) if (!resp)
goto free_id; goto erase_xa;
kvfree(resp); kvfree(resp);
return entry->id; return entry->id;
free_id: erase_xa:
xa_erase(&sess->rpc_handle_list, entry->id); xa_erase(&sess->rpc_handle_list, entry->id);
free_id:
ksmbd_rpc_id_free(entry->id); ksmbd_rpc_id_free(entry->id);
free_entry: free_entry:
kfree(entry); kfree(entry);
@@ -174,6 +177,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
unsigned long id; unsigned long id;
struct ksmbd_session *sess; struct ksmbd_session *sess;
down_write(&sessions_table_lock);
down_write(&conn->session_lock); down_write(&conn->session_lock);
xa_for_each(&conn->sessions, id, sess) { xa_for_each(&conn->sessions, id, sess) {
if (atomic_read(&sess->refcnt) == 0 && if (atomic_read(&sess->refcnt) == 0 &&
@@ -187,6 +191,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
} }
} }
up_write(&conn->session_lock); up_write(&conn->session_lock);
up_write(&sessions_table_lock);
} }
int ksmbd_session_register(struct ksmbd_conn *conn, int ksmbd_session_register(struct ksmbd_conn *conn,
@@ -228,7 +233,6 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
} }
} }
} }
up_write(&sessions_table_lock);
down_write(&conn->session_lock); down_write(&conn->session_lock);
xa_for_each(&conn->sessions, id, sess) { xa_for_each(&conn->sessions, id, sess) {
@@ -248,6 +252,7 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
} }
} }
up_write(&conn->session_lock); up_write(&conn->session_lock);
up_write(&sessions_table_lock);
} }
struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn, struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,

View File

@@ -238,11 +238,11 @@ static void __handle_ksmbd_work(struct ksmbd_work *work,
} while (is_chained == true); } while (is_chained == true);
send: send:
if (work->sess)
ksmbd_user_session_put(work->sess);
if (work->tcon) if (work->tcon)
ksmbd_tree_connect_put(work->tcon); ksmbd_tree_connect_put(work->tcon);
smb3_preauth_hash_rsp(work); smb3_preauth_hash_rsp(work);
if (work->sess)
ksmbd_user_session_put(work->sess);
if (work->sess && work->sess->enc && work->encrypted && if (work->sess && work->sess->enc && work->encrypted &&
conn->ops->encrypt_resp) { conn->ops->encrypt_resp) {
rc = conn->ops->encrypt_resp(work); rc = conn->ops->encrypt_resp(work);

View File

@@ -190,6 +190,39 @@ struct nfs_inode {
/* Open contexts for shared mmap writes */ /* Open contexts for shared mmap writes */
struct list_head open_files; struct list_head open_files;
/* Keep track of out-of-order replies.
* The ooo array contains start/end pairs of
* numbers from the changeid sequence when
* the inode's iversion has been updated.
* It also contains end/start pair (i.e. reverse order)
* of sections of the changeid sequence that have
* been seen in replies from the server.
* Normally these should match and when both
* A:B and B:A are found in ooo, they are both removed.
* And if a reply with A:B causes an iversion update
* of A:B, then neither are added.
* When a reply has pre_change that doesn't match
* iversion, then the changeid pair and any consequent
* change in iversion ARE added. Later replies
* might fill in the gaps, or possibly a gap is caused
* by a change from another client.
* When a file or directory is opened, if the ooo table
* is not empty, then we assume the gaps were due to
* another client and we invalidate the cached data.
*
* We can only track a limited number of concurrent gaps.
* Currently that limit is 16.
* We allocate the table on demand. If there is insufficient
* memory, then we probably cannot cache the file anyway
* so there is no loss.
*/
struct {
int cnt;
struct {
u64 start, end;
} gap[16];
} *ooo;
#if IS_ENABLED(CONFIG_NFS_V4) #if IS_ENABLED(CONFIG_NFS_V4)
struct nfs4_cached_acl *nfs4_acl; struct nfs4_cached_acl *nfs4_acl;
/* NFSv4 state */ /* NFSv4 state */
@@ -616,6 +649,20 @@ nfs_fileid_to_ino_t(u64 fileid)
return ino; return ino;
} }
static inline void nfs_ooo_clear(struct nfs_inode *nfsi)
{
nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER;
kfree(nfsi->ooo);
nfsi->ooo = NULL;
}
static inline bool nfs_ooo_test(struct nfs_inode *nfsi)
{
return (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER) ||
(nfsi->ooo && nfsi->ooo->cnt > 0);
}
#define NFS_JUKEBOX_RETRY_TIME (5 * HZ) #define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
/* We need to block new opens while a file is being unlinked. /* We need to block new opens while a file is being unlinked.

View File

@@ -252,12 +252,19 @@ static inline void tick_dep_set_task(struct task_struct *tsk,
if (tick_nohz_full_enabled()) if (tick_nohz_full_enabled())
tick_nohz_dep_set_task(tsk, bit); tick_nohz_dep_set_task(tsk, bit);
} }
static inline void tick_dep_clear_task(struct task_struct *tsk, static inline void tick_dep_clear_task(struct task_struct *tsk,
enum tick_dep_bits bit) enum tick_dep_bits bit)
{ {
if (tick_nohz_full_enabled()) if (tick_nohz_full_enabled())
tick_nohz_dep_clear_task(tsk, bit); tick_nohz_dep_clear_task(tsk, bit);
} }
static inline void tick_dep_init_task(struct task_struct *tsk)
{
atomic_set(&tsk->tick_dep_mask, 0);
}
static inline void tick_dep_set_signal(struct task_struct *tsk, static inline void tick_dep_set_signal(struct task_struct *tsk,
enum tick_dep_bits bit) enum tick_dep_bits bit)
{ {
@@ -291,6 +298,7 @@ static inline void tick_dep_set_task(struct task_struct *tsk,
enum tick_dep_bits bit) { } enum tick_dep_bits bit) { }
static inline void tick_dep_clear_task(struct task_struct *tsk, static inline void tick_dep_clear_task(struct task_struct *tsk,
enum tick_dep_bits bit) { } enum tick_dep_bits bit) { }
static inline void tick_dep_init_task(struct task_struct *tsk) { }
static inline void tick_dep_set_signal(struct task_struct *tsk, static inline void tick_dep_set_signal(struct task_struct *tsk,
enum tick_dep_bits bit) { } enum tick_dep_bits bit) { }
static inline void tick_dep_clear_signal(struct signal_struct *signal, static inline void tick_dep_clear_signal(struct signal_struct *signal,

View File

@@ -135,7 +135,8 @@ static inline long get_rlimit_value(struct ucounts *ucounts, enum rlimit_type ty
long inc_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v); long inc_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v);
bool dec_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v); bool dec_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v);
long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type); long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type,
bool override_rlimit);
void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum rlimit_type type); void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum rlimit_type type);
bool is_rlimit_overlimit(struct ucounts *ucounts, enum rlimit_type type, unsigned long max); bool is_rlimit_overlimit(struct ucounts *ucounts, enum rlimit_type type, unsigned long max);

View File

@@ -97,6 +97,7 @@
#include <linux/scs.h> #include <linux/scs.h>
#include <linux/io_uring.h> #include <linux/io_uring.h>
#include <linux/bpf.h> #include <linux/bpf.h>
#include <linux/tick.h>
#include <linux/cpufreq_times.h> #include <linux/cpufreq_times.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
@@ -2286,6 +2287,7 @@ static __latent_entropy struct task_struct *copy_process(
acct_clear_integrals(p); acct_clear_integrals(p);
posix_cputimers_init(&p->posix_cputimers); posix_cputimers_init(&p->posix_cputimers);
tick_dep_init_task(p);
p->io_context = NULL; p->io_context = NULL;
audit_set_context(p, NULL); audit_set_context(p, NULL);

View File

@@ -430,7 +430,8 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t gfp_flags,
*/ */
rcu_read_lock(); rcu_read_lock();
ucounts = task_ucounts(t); ucounts = task_ucounts(t);
sigpending = inc_rlimit_get_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING); sigpending = inc_rlimit_get_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING,
override_rlimit);
rcu_read_unlock(); rcu_read_unlock();
if (!sigpending) if (!sigpending)
return NULL; return NULL;

View File

@@ -307,7 +307,8 @@ void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum rlimit_type type)
do_dec_rlimit_put_ucounts(ucounts, NULL, type); do_dec_rlimit_put_ucounts(ucounts, NULL, type);
} }
long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type) long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type,
bool override_rlimit)
{ {
/* Caller must hold a reference to ucounts */ /* Caller must hold a reference to ucounts */
struct ucounts *iter; struct ucounts *iter;
@@ -317,10 +318,11 @@ long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type)
for (iter = ucounts; iter; iter = iter->ns->ucounts) { for (iter = ucounts; iter; iter = iter->ns->ucounts) {
long new = atomic_long_add_return(1, &iter->rlimit[type]); long new = atomic_long_add_return(1, &iter->rlimit[type]);
if (new < 0 || new > max) if (new < 0 || new > max)
goto unwind; goto dec_unwind;
if (iter == ucounts) if (iter == ucounts)
ret = new; ret = new;
max = get_userns_rlimit_max(iter->ns, type); if (!override_rlimit)
max = get_userns_rlimit_max(iter->ns, type);
/* /*
* Grab an extra ucount reference for the caller when * Grab an extra ucount reference for the caller when
* the rlimit count was previously 0. * the rlimit count was previously 0.
@@ -334,7 +336,6 @@ long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type)
dec_unwind: dec_unwind:
dec = atomic_long_sub_return(1, &iter->rlimit[type]); dec = atomic_long_sub_return(1, &iter->rlimit[type]);
WARN_ON_ONCE(dec < 0); WARN_ON_ONCE(dec < 0);
unwind:
do_dec_rlimit_put_ucounts(ucounts, iter, type); do_dec_rlimit_put_ucounts(ucounts, iter, type);
return 0; return 0;
} }

View File

@@ -2762,7 +2762,7 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter,
if (unlikely(!iov_iter_count(iter))) if (unlikely(!iov_iter_count(iter)))
return 0; return 0;
iov_iter_truncate(iter, inode->i_sb->s_maxbytes); iov_iter_truncate(iter, inode->i_sb->s_maxbytes - iocb->ki_pos);
folio_batch_init(&fbatch); folio_batch_init(&fbatch);
trace_android_vh_filemap_read(filp, iocb->ki_pos, iov_iter_count(iter)); trace_android_vh_filemap_read(filp, iocb->ki_pos, iov_iter_count(iter));

View File

@@ -112,9 +112,6 @@ struct dst_entry *dst_destroy(struct dst_entry * dst)
child = xdst->child; child = xdst->child;
} }
#endif #endif
if (!(dst->flags & DST_NOCOUNT))
dst_entries_add(dst->ops, -1);
if (dst->ops->destroy) if (dst->ops->destroy)
dst->ops->destroy(dst); dst->ops->destroy(dst);
netdev_put(dst->dev, &dst->dev_tracker); netdev_put(dst->dev, &dst->dev_tracker);
@@ -164,6 +161,12 @@ void dst_dev_put(struct dst_entry *dst)
} }
EXPORT_SYMBOL(dst_dev_put); EXPORT_SYMBOL(dst_dev_put);
static void dst_count_dec(struct dst_entry *dst)
{
if (!(dst->flags & DST_NOCOUNT))
dst_entries_add(dst->ops, -1);
}
void dst_release(struct dst_entry *dst) void dst_release(struct dst_entry *dst)
{ {
if (dst) { if (dst) {
@@ -173,8 +176,10 @@ void dst_release(struct dst_entry *dst)
if (WARN_ONCE(newrefcnt < 0, "dst_release underflow")) if (WARN_ONCE(newrefcnt < 0, "dst_release underflow"))
net_warn_ratelimited("%s: dst:%p refcnt:%d\n", net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
__func__, dst, newrefcnt); __func__, dst, newrefcnt);
if (!newrefcnt) if (!newrefcnt){
dst_count_dec(dst);
call_rcu_hurry(&dst->rcu_head, dst_destroy_rcu); call_rcu_hurry(&dst->rcu_head, dst_destroy_rcu);
}
} }
} }
EXPORT_SYMBOL(dst_release); EXPORT_SYMBOL(dst_release);
@@ -188,8 +193,10 @@ void dst_release_immediate(struct dst_entry *dst)
if (WARN_ONCE(newrefcnt < 0, "dst_release_immediate underflow")) if (WARN_ONCE(newrefcnt < 0, "dst_release_immediate underflow"))
net_warn_ratelimited("%s: dst:%p refcnt:%d\n", net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
__func__, dst, newrefcnt); __func__, dst, newrefcnt);
if (!newrefcnt) if (!newrefcnt){
dst_count_dec(dst);
dst_destroy(dst); dst_destroy(dst);
}
} }
} }
EXPORT_SYMBOL(dst_release_immediate); EXPORT_SYMBOL(dst_release_immediate);

View File

@@ -245,9 +245,7 @@ ieee80211_get_max_required_bw(struct ieee80211_sub_if_data *sdata,
enum nl80211_chan_width max_bw = NL80211_CHAN_WIDTH_20_NOHT; enum nl80211_chan_width max_bw = NL80211_CHAN_WIDTH_20_NOHT;
struct sta_info *sta; struct sta_info *sta;
lockdep_assert_wiphy(sdata->local->hw.wiphy); list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
list_for_each_entry(sta, &sdata->local->sta_list, list) {
if (sdata != sta->sdata && if (sdata != sta->sdata &&
!(sta->sdata->bss && sta->sdata->bss == sdata->bss)) !(sta->sdata->bss && sta->sdata->bss == sdata->bss))
continue; continue;

View File

@@ -660,7 +660,7 @@ static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
bool disable_mu_mimo = false; bool disable_mu_mimo = false;
struct ieee80211_sub_if_data *other; struct ieee80211_sub_if_data *other;
list_for_each_entry(other, &local->interfaces, list) { list_for_each_entry_rcu(other, &local->interfaces, list) {
if (other->vif.bss_conf.mu_mimo_owner) { if (other->vif.bss_conf.mu_mimo_owner) {
disable_mu_mimo = true; disable_mu_mimo = true;
break; break;

View File

@@ -501,7 +501,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
* the scan was in progress; if there was none this will * the scan was in progress; if there was none this will
* just be a no-op for the particular interface. * just be a no-op for the particular interface.
*/ */
list_for_each_entry(sdata, &local->interfaces, list) { list_for_each_entry_rcu(sdata, &local->interfaces, list) {
if (ieee80211_sdata_running(sdata)) if (ieee80211_sdata_running(sdata))
ieee80211_queue_work(&sdata->local->hw, &sdata->work); ieee80211_queue_work(&sdata->local->hw, &sdata->work);
} }

View File

@@ -767,9 +767,7 @@ static void __iterate_interfaces(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE; bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
list_for_each_entry_rcu(sdata, &local->interfaces, list, list_for_each_entry_rcu(sdata, &local->interfaces, list) {
lockdep_is_held(&local->iflist_mtx) ||
lockdep_is_held(&local->hw.wiphy->mtx)) {
switch (sdata->vif.type) { switch (sdata->vif.type) {
case NL80211_IFTYPE_MONITOR: case NL80211_IFTYPE_MONITOR:
if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))

View File

@@ -89,6 +89,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *addr) struct mptcp_pm_addr_entry *addr)
{ {
struct mptcp_pm_addr_entry *entry, *tmp; struct mptcp_pm_addr_entry *entry, *tmp;
struct sock *sk = (struct sock *)msk;
list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) { list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) {
if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) { if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) {
@@ -96,7 +97,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
* be used multiple times (e.g. fullmesh mode). * be used multiple times (e.g. fullmesh mode).
*/ */
list_del_rcu(&entry->list); list_del_rcu(&entry->list);
kfree(entry); sock_kfree_s(sk, entry, sizeof(*entry));
msk->pm.local_addr_used--; msk->pm.local_addr_used--;
return 0; return 0;
} }

View File

@@ -1995,9 +1995,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
struct nlattr *nest, *sched_nest; struct nlattr *nest, *sched_nest;
unsigned int i; unsigned int i;
oper = rtnl_dereference(q->oper_sched);
admin = rtnl_dereference(q->admin_sched);
opt.num_tc = netdev_get_num_tc(dev); opt.num_tc = netdev_get_num_tc(dev);
memcpy(opt.prio_tc_map, dev->prio_tc_map, sizeof(opt.prio_tc_map)); memcpy(opt.prio_tc_map, dev->prio_tc_map, sizeof(opt.prio_tc_map));
@@ -2024,18 +2021,23 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
nla_put_u32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay)) nla_put_u32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay))
goto options_error; goto options_error;
rcu_read_lock();
oper = rtnl_dereference(q->oper_sched);
admin = rtnl_dereference(q->admin_sched);
if (taprio_dump_tc_entries(q, skb)) if (taprio_dump_tc_entries(q, skb))
goto options_error; goto options_error_rcu;
if (oper && dump_schedule(skb, oper)) if (oper && dump_schedule(skb, oper))
goto options_error; goto options_error_rcu;
if (!admin) if (!admin)
goto done; goto done;
sched_nest = nla_nest_start_noflag(skb, TCA_TAPRIO_ATTR_ADMIN_SCHED); sched_nest = nla_nest_start_noflag(skb, TCA_TAPRIO_ATTR_ADMIN_SCHED);
if (!sched_nest) if (!sched_nest)
goto options_error; goto options_error_rcu;
if (dump_schedule(skb, admin)) if (dump_schedule(skb, admin))
goto admin_error; goto admin_error;
@@ -2043,11 +2045,15 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
nla_nest_end(skb, sched_nest); nla_nest_end(skb, sched_nest);
done: done:
rcu_read_unlock();
return nla_nest_end(skb, nest); return nla_nest_end(skb, nest);
admin_error: admin_error:
nla_nest_cancel(skb, sched_nest); nla_nest_cancel(skb, sched_nest);
options_error_rcu:
rcu_read_unlock();
options_error: options_error:
nla_nest_cancel(skb, nest); nla_nest_cancel(skb, nest);

View File

@@ -3752,7 +3752,7 @@ enum sctp_disposition sctp_sf_ootb(struct net *net,
} }
ch = (struct sctp_chunkhdr *)ch_end; ch = (struct sctp_chunkhdr *)ch_end;
} while (ch_end < skb_tail_pointer(skb)); } while (ch_end + sizeof(*ch) < skb_tail_pointer(skb));
if (ootb_shut_ack) if (ootb_shut_ack)
return sctp_sf_shut_8_4_5(net, ep, asoc, type, arg, commands); return sctp_sf_shut_8_4_5(net, ep, asoc, type, arg, commands);

View File

@@ -2351,6 +2351,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
case -EHOSTUNREACH: case -EHOSTUNREACH:
case -EADDRINUSE: case -EADDRINUSE:
case -ENOBUFS: case -ENOBUFS:
case -ENOTCONN:
break; break;
default: default:
printk("%s: connect returned unhandled error %d\n", printk("%s: connect returned unhandled error %d\n",

View File

@@ -549,6 +549,7 @@ static void hvs_destruct(struct vsock_sock *vsk)
vmbus_hvsock_device_unregister(chan); vmbus_hvsock_device_unregister(chan);
kfree(hvs); kfree(hvs);
vsk->trans = NULL;
} }
static int hvs_dgram_bind(struct vsock_sock *vsk, struct sockaddr_vm *addr) static int hvs_dgram_bind(struct vsock_sock *vsk, struct sockaddr_vm *addr)

View File

@@ -813,6 +813,7 @@ void virtio_transport_destruct(struct vsock_sock *vsk)
struct virtio_vsock_sock *vvs = vsk->trans; struct virtio_vsock_sock *vvs = vsk->trans;
kfree(vvs); kfree(vvs);
vsk->trans = NULL;
} }
EXPORT_SYMBOL_GPL(virtio_transport_destruct); EXPORT_SYMBOL_GPL(virtio_transport_destruct);

View File

@@ -772,8 +772,11 @@ ascend_to_node:
for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) { for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
ptr = READ_ONCE(node->slots[slot]); ptr = READ_ONCE(node->slots[slot]);
if (assoc_array_ptr_is_meta(ptr) && node->back_pointer) if (assoc_array_ptr_is_meta(ptr)) {
goto descend_to_node; if (node->back_pointer ||
assoc_array_ptr_is_shortcut(ptr))
goto descend_to_node;
}
if (!keyring_ptr_is_keyring(ptr)) if (!keyring_ptr_is_keyring(ptr))
continue; continue;

View File

@@ -244,7 +244,7 @@ int amdtp_tscm_init(struct amdtp_stream *s, struct fw_unit *unit,
err = amdtp_stream_init(s, unit, dir, flags, fmt, err = amdtp_stream_init(s, unit, dir, flags, fmt,
process_ctx_payloads, sizeof(struct amdtp_tscm)); process_ctx_payloads, sizeof(struct amdtp_tscm));
if (err < 0) if (err < 0)
return 0; return err;
if (dir == AMDTP_OUT_STREAM) { if (dir == AMDTP_OUT_STREAM) {
// Use fixed value for FDF field. // Use fixed value for FDF field.

View File

@@ -205,8 +205,6 @@ static void cx_auto_shutdown(struct hda_codec *codec)
{ {
struct conexant_spec *spec = codec->spec; struct conexant_spec *spec = codec->spec;
snd_hda_gen_shutup_speakers(codec);
/* Turn the problematic codec into D3 to avoid spurious noises /* Turn the problematic codec into D3 to avoid spurious noises
from the internal speaker during (and after) reboot */ from the internal speaker during (and after) reboot */
cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, false); cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, false);

View File

@@ -10015,6 +10015,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x28c1, "Clevo V370VND", ALC2XX_FIXUP_HEADSET_MIC),
SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),

View File

@@ -339,6 +339,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 15 2022"), DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 15 2022"),
} }
}, },
{
.driver_data = &acp6x_card,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"),
DMI_MATCH(DMI_PRODUCT_NAME, "Xiaomi Book Pro 14 2022"),
}
},
{ {
.driver_data = &acp6x_card, .driver_data = &acp6x_card,
.matches = { .matches = {

View File

@@ -943,7 +943,7 @@ static int stm32_spdifrx_remove(struct platform_device *pdev)
{ {
struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev); struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev);
if (spdifrx->ctrl_chan) if (!IS_ERR(spdifrx->ctrl_chan))
dma_release_channel(spdifrx->ctrl_chan); dma_release_channel(spdifrx->ctrl_chan);
if (spdifrx->dmab) if (spdifrx->dmab)

View File

@@ -1205,6 +1205,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
} }
break; break;
case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */ case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */
case USB_ID(0x03f0, 0x654a): /* HP 320 FHD Webcam */
if (!strcmp(kctl->id.name, "Mic Capture Volume")) { if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
usb_audio_info(chip, usb_audio_info(chip,
"set resolution quirk: cval->res = 16\n"); "set resolution quirk: cval->res = 16\n");

View File

@@ -2014,6 +2014,8 @@ struct usb_audio_quirk_flags_table {
static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
/* Device matches */ /* Device matches */
DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */
QUIRK_FLAG_GET_SAMPLE_RATE),
DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */ DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */
QUIRK_FLAG_IGNORE_CTL_ERROR), QUIRK_FLAG_IGNORE_CTL_ERROR),
DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */ DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */

View File

@@ -16,6 +16,8 @@ static int handle_thermal_sample(struct nl_msg *n, void *arg)
struct thermal_handler_param *thp = arg; struct thermal_handler_param *thp = arg;
struct thermal_handler *th = thp->th; struct thermal_handler *th = thp->th;
arg = thp->arg;
genlmsg_parse(nlh, 0, attrs, THERMAL_GENL_ATTR_MAX, NULL); genlmsg_parse(nlh, 0, attrs, THERMAL_GENL_ATTR_MAX, NULL);
switch (genlhdr->cmd) { switch (genlhdr->cmd) {

View File

@@ -12,12 +12,10 @@
#include "test_signals.h" #include "test_signals.h"
#include "test_signals_utils.h" #include "test_signals_utils.h"
struct tdescr *current; struct tdescr *current = &tde;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
current = &tde;
ksft_print_msg("%s :: %s\n", current->name, current->descr); ksft_print_msg("%s :: %s\n", current->name, current->descr);
if (test_setup(current) && test_init(current)) { if (test_setup(current) && test_init(current)) {
test_run(current); test_run(current);