6.12.42-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 151/369 staging: media: atomisp: Fix stack buffer overflow in gmin_get_var_int()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit ee4cf798202d285dcbe85e4467a094c44f5ed8e6 ]
When gmin_get_config_var() calls efi.get_variable() and the EFI variable is larger than the expected buffer size, two behaviors combine to create a stack buffer overflow:
1. gmin_get_config_var() does not return the proper error code when efi.get_variable() fails. It returns the stale 'ret' value from earlier operations instead of indicating the EFI failure.
2. When efi.get_variable() returns EFI_BUFFER_TOO_SMALL, it updates *out_len to the required buffer size but writes no data to the output buffer. However, due to bug #1, gmin_get_var_int() believes the call succeeded.
The caller gmin_get_var_int() then performs:
- Allocates val[CFG_VAR_NAME_MAX + 1] (65 bytes) on stack
- Calls gmin_get_config_var(dev, is_gmin, var, val, &len) with len=64
- If EFI variable is >64 bytes, efi.get_variable() sets len=required_size
- Due to bug #1, thinks call succeeded with len=required_size
- Executes val[len] = 0, writing past end of 65-byte stack buffer
This creates a stack buffer overflow when EFI variables are larger than 64 bytes. Since EFI variables can be controlled by firmware or system configuration, this could potentially be exploited for code execution.
Fix the bug by returning proper error codes from gmin_get_config_var() based on EFI status instead of stale 'ret' value.
The gmin_get_var_int() function is called during device initialization for camera sensor configuration on Intel Bay Trail and Cherry Trail platforms using the atomisp camera stack.
--- .../staging/media/atomisp/pci/atomisp_gmin_platform.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c +5 -4
@@ -1358,14 +1358,15 @@ static int gmin_get_config_var(struct device *maindev,if (efi_rt_services_supported (EFI_RT_SUPPORTED_GET_VARIABLE )) status = efi.get_variable (var16, &GMIN_CFG_VAR_EFI_GUID ,NULL , (unsigned long *)out_len, out); -if (status ==EFI_SUCCESS ) +if (status ==EFI_SUCCESS ) {dev_info (maindev,"found EFI entry for '%s'\n" , var8); -else if (is_gmin) +return 0 ; + } +if (is_gmin)dev_info (maindev,"Failed to find EFI gmin variable %s\n" , var8);else dev_info (maindev,"Failed to find EFI variable %s\n" , var8); - -return ret; +return -ENOENT ; }int gmin_get_var_int (struct device *dev,bool is_gmin,const char *var,int def)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 152/369 fortify: Fix incorrect reporting of read buffer size
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit 94fd44648dae2a5b6149a41faa0b07928c3e1963 ]
When FORTIFY_SOURCE reports about a run-time buffer overread, the wrong buffer size was being shown in the error message. (The bounds checking was correct.)
--- include/linux/fortify-string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/fortify-string.h +1 -1
@@ -596,7 +596,7 @@ __FORTIFY_INLINE bool fortify_memcpy_chk(__kernel_size_t size,if (p_size !=SIZE_MAX && p_size < size)fortify_panic (func,FORTIFY_WRITE , p_size, size, true);else if (q_size !=SIZE_MAX && q_size < size) -fortify_panic (func,FORTIFY_READ , p_size, size, true); +fortify_panic (func,FORTIFY_READ , q_size, size, true);/* * Warn when writing beyond destination field size.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 153/369 PCI: rockchip-host: Fix "Unexpected Completion" log message
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Zhang <[email protected]>
[ Upstream commit fcc5f586c4edbcc10de23fb9b8c0972a84e945cd ]
Fix the debug message for the PCIE_CORE_INT_UCR interrupt to clearly indicate "Unexpected Completion" instead of a duplicate "malformed TLP" message.
--- drivers/pci/controller/pcie-rockchip-host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/pcie-rockchip-host.c +1 -1
@@ -439,7 +439,7 @@ static irqreturn_t rockchip_pcie_subsys_irq_handler(int irq, void *arg)dev_dbg (dev,"malformed TLP received from the link\n" );if (sub_reg &PCIE_CORE_INT_UCR ) -dev_dbg (dev,"malformed TLP received from the link\n" ); +dev_dbg (dev,"Unexpected Completion received from the link\n" );if (sub_reg &PCIE_CORE_INT_FCE )dev_dbg (dev,"an error was observed in the flow control advertisements from the other side\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 154/369 clk: renesas: rzv2h: Fix missing CLK_SET_RATE_PARENT flag for ddiv clocks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lad Prabhakar <[email protected]>
[ Upstream commit 715676d8418062f54d746451294ccce9786c1734 ]
Commit bc4d25fdfadf ("clk: renesas: rzv2h: Add support for dynamic switching divider clocks") missed setting the CLK_SET_RATE_PARENT flag when registering ddiv clocks.
Without this flag, rate changes to the divider clock do not propagate to its parent, potentially resulting in incorrect clock configurations.
Fix this by setting CLK_SET_RATE_PARENT in the clock init data.
--- drivers/clk/renesas/rzv2h-cpg.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/renesas/rzv2h-cpg.c +1 -0
@@ -312,6 +312,7 @@ rzv2h_cpg_ddiv_clk_register(const struct cpg_core_clk *core, init.ops = &rzv2h_ddiv_clk_divider_ops; init.parent_names = &parent_name; init.num_parents =1 ; + init.flags =CLK_SET_RATE_PARENT ; ddiv->priv = priv; ddiv->mon = cfg_ddiv.monbit;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 155/369 crypto: sun8i-ce - fix nents passed to dma_unmap_sg()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit b6cd3cfb5afe49952f8f6be947aeeca9ba0faebb ]
In sun8i_ce_cipher_unprepare(), dma_unmap_sg() is incorrectly called with the number of entries returned by dma_map_sg(), rather than using the original number of entries passed when mapping the scatterlist.
To fix this, stash the original number of entries passed to dma_map_sg() in the request context.
--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +2 -2
@@ -265,8 +265,8 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req } chan->timeout = areq->cryptlen; - rctx->nr_sgs = nr_sgs; - rctx->nr_sgd = nr_sgd; + rctx->nr_sgs = ns; + rctx->nr_sgd = nd;return 0 ; theend_sgs:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 156/369 crypto: qat - use unmanaged allocation for dc_data
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suman Kumar Chakraborty <[email protected]>
[ Upstream commit 4cc871ad0173e8bc22f80e3609e34d546d30ef1a ]
The dc_data structure holds data required for handling compression operations, such as overflow buffers. In this context, the use of managed memory allocation APIs (devm_kzalloc() and devm_kfree()) is not necessary, as these data structures are freed and re-allocated when a device is restarted in adf_dev_down() and adf_dev_up().
Additionally, managed APIs automatically handle memory cleanup when the device is detached, which can lead to conflicts with manual cleanup processes. Specifically, if a device driver invokes the adf_dev_down() function as part of the cleanup registered with devm_add_action_or_reset(), it may attempt to free memory that is also managed by the device's resource management system, potentially leading to a double-free.
This might result in a warning similar to the following when unloading the device specific driver, for example qat_6xxx.ko:
qat_free_dc_data+0x4f/0x60 [intel_qat]
qat_compression_event_handler+0x3d/0x1d0 [intel_qat]
adf_dev_shutdown+0x6d/0x1a0 [intel_qat]
adf_dev_down+0x32/0x50 [intel_qat]
devres_release_all+0xb8/0x110
device_unbind_cleanup+0xe/0x70
device_release_driver_internal+0x1c1/0x200
driver_detach+0x48/0x90
bus_remove_driver+0x74/0xf0
pci_unregister_driver+0x2e/0xb0Use unmanaged memory allocation APIs (kzalloc_node() and kfree()) for the dc_data structure. This ensures that memory is explicitly allocated and freed under the control of the driver code, preventing manual deallocation from interfering with automatic cleanup.
--- drivers/crypto/intel/qat/qat_common/qat_compression.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/intel/qat/qat_common/qat_compression.c +2 -2
@@ -197,7 +197,7 @@ static int qat_compression_alloc_dc_data(struct adf_accel_dev *accel_dev)struct adf_dc_data *dc_data =NULL ;u8 *obuff =NULL ; - dc_data =devm_kzalloc (dev,sizeof (*dc_data),GFP_KERNEL ); + dc_data =kzalloc_node (sizeof (*dc_data),GFP_KERNEL ,dev_to_node (dev));if (!dc_data) goto err;
@@ -235,7 +235,7 @@ static void qat_free_dc_data(struct adf_accel_dev *accel_dev)dma_unmap_single (dev, dc_data->ovf_buff_p, dc_data->ovf_buff_sz,DMA_FROM_DEVICE );kfree_sensitive (dc_data->ovf_buff); -devm_kfree (dev, dc_data); +kfree (dc_data); accel_dev->dc_data =NULL ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 157/369 crypto: marvell/cesa - Fix engine load inaccuracy
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 442134ab30e75b7229c4bfc1ac5641d245cffe27 ]
If an error occurs during queueing the engine load will never be decremented. Fix this by moving the engine load adjustment into the cleanup function.
--- drivers/crypto/marvell/cesa/cipher.c | 4 +++- drivers/crypto/marvell/cesa/hash.c | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/crypto/marvell/cesa/cipher.c +3 -1
@@ -75,9 +75,12 @@ mv_cesa_skcipher_dma_cleanup(struct skcipher_request *req)static inline void mv_cesa_skcipher_cleanup (struct skcipher_request *req) {struct mv_cesa_skcipher_req *creq =skcipher_request_ctx (req); +struct mv_cesa_engine *engine = creq->base.engine;if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ )mv_cesa_skcipher_dma_cleanup (req); + +atomic_sub (req->cryptlen, &engine->load); }static void mv_cesa_skcipher_std_step (struct skcipher_request *req)
@@ -212,7 +215,6 @@ mv_cesa_skcipher_complete(struct crypto_async_request *req)struct mv_cesa_engine *engine = creq->base.engine;unsigned int ivsize; -atomic_sub (skreq->cryptlen, &engine->load); ivsize =crypto_skcipher_ivsize (crypto_skcipher_reqtfm (skreq));if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ ) {
drivers/crypto/marvell/cesa/hash.c +3 -2
@@ -110,9 +110,12 @@ static inline void mv_cesa_ahash_dma_cleanup(struct ahash_request *req)static inline void mv_cesa_ahash_cleanup (struct ahash_request *req) {struct mv_cesa_ahash_req *creq =ahash_request_ctx (req); +struct mv_cesa_engine *engine = creq->base.engine;if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ )mv_cesa_ahash_dma_cleanup (req); + +atomic_sub (req->nbytes, &engine->load); }static void mv_cesa_ahash_last_cleanup (struct ahash_request *req)
@@ -395,8 +398,6 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req) } } } - -atomic_sub (ahashreq->nbytes, &engine->load); } static void mv_cesa_ahash_prepare(struct crypto_async_request *req,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 158/369 crypto: qat - allow enabling VFs in the absence of IOMMU
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ahsan Atta <[email protected]>
[ Upstream commit 53669ff591d4deb2d80eed4c07593ad0c0b45899 ]
The commit ca88a2bdd4dd ("crypto: qat - allow disabling SR-IOV VFs") introduced an unnecessary change that prevented enabling SR-IOV when IOMMU is disabled. In certain scenarios, it is desirable to enable SR-IOV even in the absence of IOMMU. Thus, restoring the previous functionality to allow VFs to be enumerated in the absence of IOMMU.
--- drivers/crypto/intel/qat/qat_common/adf_sriov.c | 1 - 1 file changed, 1 deletion(-)
drivers/crypto/intel/qat/qat_common/adf_sriov.c +0 -1
@@ -155,7 +155,6 @@ static int adf_do_enable_sriov(struct adf_accel_dev *accel_dev)if (!device_iommu_mapped (&GET_DEV (accel_dev))) {dev_warn (&GET_DEV (accel_dev),"IOMMU should be enabled for SR-IOV to work correctly\n" ); -return -EINVAL ; }if (adf_dev_started (accel_dev)) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 159/369 crypto: qat - fix state restore for banks with exceptions
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Svyatoslav Pankratov <[email protected]>
[ Upstream commit 254923ca8715f623704378266815b6d14eb26194 ]
Change the logic in the restore function to properly handle bank exceptions.
The check for exceptions in the saved state should be performed before conducting any other ringstat register checks.
If a bank was saved with an exception, the ringstat will have the appropriate rp_halt/rp_exception bits set, causing the driver to exit the restore process with an error. Instead, the restore routine should first check the ringexpstat register, and if any exception was raised, it should stop further checks and return without any error. In other words, if a ring pair is in an exception state at the source, it should be restored the same way at the destination but without raising an error.
Even though this approach might lead to losing the exception state during migration, the driver will log the exception from the saved state during the restore process.
--- .../intel/qat/qat_common/adf_gen4_hw_data.c | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-)
drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c +22 -7
@@ -585,6 +585,28 @@ static int bank_state_restore(struct adf_hw_csr_ops *ops, void __iomem *base, ops->write_csr_int_srcsel_w_val (base, bank, state->iaintflagsrcsel0); ops->write_csr_exp_int_en (base, bank, state->ringexpintenable); ops->write_csr_int_col_ctl (base, bank, state->iaintcolctl); + +/* +* Verify whether any exceptions were raised during the bank save process. +* If exceptions occurred, the status and exception registers cannot +* be directly restored. Consequently, further restoration is not +* feasible, and the current state of the ring should be maintained. +*/ + val = state->ringexpstat; +if (val) { +pr_info ("QAT: Bank %u state not fully restored due to exception in saved state (%#x)\n" , + bank, val); +return 0 ; + } + +/* Ensure that the restoration process completed without exceptions */ + tmp_val = ops->read_csr_exp_stat (base, bank); +if (tmp_val) { +pr_err ("QAT: Bank %u restored with exception: %#x\n" , + bank, tmp_val); +return -EFAULT ; + } + ops->write_csr_ring_srv_arb_en (base, bank, state->ringsrvarben);/* Check that all ring statuses match the saved state. */
@@ -618,13 +640,6 @@ static int bank_state_restore(struct adf_hw_csr_ops *ops, void __iomem *base,if (ret)return ret; - tmp_val = ops->read_csr_exp_stat (base, bank); - val = state->ringexpstat; -if (tmp_val && !val) { -pr_err ("QAT: Bank was restored with exception: 0x%x\n" , val); -return -EINVAL ; - } -return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 160/369 mtd: fix possible integer overflow in erase_xfer()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Stepchenko <[email protected]>
[ Upstream commit 9358bdb9f9f54d94ceafc650deffefd737d19fdd ]
The expression '1 << EraseUnitSize' is evaluated in int, which causes a negative result when shifting by 31 - the upper bound of the valid range [10, 31], enforced by scan_header(). This leads to incorrect extension when storing the result in 'erase->len' (uint64_t), producing a large unexpected value.
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/mtd/ftl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ftl.c +1 -1
@@ -344,7 +344,7 @@ static int erase_xfer(partition_t *part,return -ENOMEM ; erase->addr = xfer->Offset; - erase->len =1 << part->header.EraseUnitSize; + erase->len =1ULL << part->header.EraseUnitSize; ret =mtd_erase (part->mbd.mtd, erase);if (!ret) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 161/369 clk: davinci: Add NULL check in davinci_lpsc_clk_register()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henry Martin <[email protected]>
[ Upstream commit 13de464f445d42738fe18c9a28bab056ba3a290a ]
devm_kasprintf() returns NULL when memory allocation fails. Currently, davinci_lpsc_clk_register() does not check for this case, which results in a NULL pointer dereference.
Add NULL check after devm_kasprintf() to prevent this issue and ensuring no resources are left allocated.
--- drivers/clk/davinci/psc.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/clk/davinci/psc.c +5 -0
@@ -277,6 +277,11 @@ davinci_lpsc_clk_register(struct device *dev, const char *name, lpsc->pm_domain.name =devm_kasprintf (dev,GFP_KERNEL ,"%s: %s" ,best_dev_name (dev), name); +if (!lpsc->pm_domain.name) { +clk_hw_unregister (&lpsc->hw); +kfree (lpsc); +return ERR_PTR (-ENOMEM ); + } lpsc->pm_domain.attach_dev = davinci_psc_genpd_attach_dev; lpsc->pm_domain.detach_dev = davinci_psc_genpd_detach_dev; lpsc->pm_domain.flags =GENPD_FLAG_PM_CLK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 162/369 media: v4l2-ctrls: Fix H264 SEPARATE_COLOUR_PLANE check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Cowgill <[email protected]>
[ Upstream commit 803b9eabc649c778986449eb0596e5ffeb7a8aed ]
The separate_colour_plane_flag element is only present in the SPS if chroma_format_idc == 3, so the corresponding flag should be disabled whenever that is not the case and not just on profiles where chroma_format_idc is not present.
--- drivers/media/v4l2-core/v4l2-ctrls-core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/media/v4l2-core/v4l2-ctrls-core.c +4 -4
@@ -897,12 +897,12 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, p_h264_sps->flags &= ~V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS ; - -if (p_h264_sps->chroma_format_idc <3 ) - p_h264_sps->flags &= - ~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE ; } +if (p_h264_sps->chroma_format_idc <3 ) + p_h264_sps->flags &= + ~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE ; +if (p_h264_sps->flags &V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY ) p_h264_sps->flags &= ~V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 163/369 clk: xilinx: vcu: unregister pll_post only if registered correctly
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rohit Visavalia <[email protected]>
[ Upstream commit 3b0abc443ac22f7d4f61ddbbbbc5dbb06c87139d ]
If registration of pll_post is failed, it will be set to NULL or ERR, unregistering same will fail with following call trace:
Unable to handle kernel NULL pointer dereference at virtual address 008 pc : clk_hw_unregister+0xc/0x20 lr : clk_hw_unregister_fixed_factor+0x18/0x30 sp : ffff800011923850 ... Call trace: clk_hw_unregister+0xc/0x20 clk_hw_unregister_fixed_factor+0x18/0x30 xvcu_unregister_clock_provider+0xcc/0xf4 [xlnx_vcu] xvcu_probe+0x2bc/0x53c [xlnx_vcu]
--- drivers/clk/xilinx/xlnx_vcu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/xilinx/xlnx_vcu.c +2 -2
@@ -587,8 +587,8 @@ static void xvcu_unregister_clock_provider(struct xvcu_device *xvcu)xvcu_clk_hw_unregister_leaf (hws[CLK_XVCU_ENC_MCU ]);if (!IS_ERR_OR_NULL (hws[CLK_XVCU_ENC_CORE ]))xvcu_clk_hw_unregister_leaf (hws[CLK_XVCU_ENC_CORE ]); - -clk_hw_unregister_fixed_factor (xvcu->pll_post); +if (!IS_ERR_OR_NULL (xvcu->pll_post)) +clk_hw_unregister_fixed_factor (xvcu->pll_post); }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 164/369 power: supply: cpcap-charger: Fix null check for power_supply_get_by_name
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit d9fa3aae08f99493e67fb79413c0e95d30fca5e9 ]
In the cpcap_usb_detect() function, the power_supply_get_by_name() function may return NULL instead of an error pointer. To prevent potential null pointer dereferences, Added a null check.
--- drivers/power/supply/cpcap-charger.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/power/supply/cpcap-charger.c +2 -3
@@ -688,9 +688,8 @@ static void cpcap_usb_detect(struct work_struct *work)struct power_supply *battery; battery =power_supply_get_by_name ("battery" ); -if (IS_ERR_OR_NULL (battery)) { -dev_err (ddata->dev,"battery power_supply not available %li\n" , -PTR_ERR (battery)); +if (!battery) { +dev_err (ddata->dev,"battery power_supply not available\n" );return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 165/369 power: supply: max14577: Handle NULL pdata when CONFIG_OF is not set
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit 2937f5d2e24eefef8cb126244caec7fe3307f724 ]
When the kernel is not configured CONFIG_OF, the max14577_charger_dt_init function returns NULL. Fix the max14577_charger_probe functionby returning -ENODATA instead of potentially passing a NULL pointer to PTR_ERR.
This fixes the below smatch warning:max14577_charger_probe() warn: passing zero to 'PTR_ERR'
--- drivers/power/supply/max14577_charger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/power/supply/max14577_charger.c +2 -2
@@ -501,7 +501,7 @@ static struct max14577_charger_platform_data *max14577_charger_dt_init(static struct max14577_charger_platform_data *max14577_charger_dt_init (struct platform_device *pdev) { -return NULL ; +return ERR_PTR (-ENODATA ); }#endif /* CONFIG_OF */
@@ -572,7 +572,7 @@ static int max14577_charger_probe(struct platform_device *pdev) chg->max14577 = max14577; chg->pdata =max14577_charger_dt_init (pdev); -if (IS_ERR_OR_NULL (chg->pdata)) +if (IS_ERR (chg->pdata))return PTR_ERR (chg->pdata); ret =max14577_charger_reg_init (chg);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 166/369 crypto: arm/aes-neonbs - work around gcc-15 warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit d5fa96dc5590915f060fee3209143313e4f5b03b ]
I get a very rare -Wstringop-overread warning with gcc-15 for one function in aesbs_ctr_encrypt():
arch/arm/crypto/aes-neonbs-glue.c: In function 'ctr_encrypt':arch/arm/crypto/aes-neonbs-glue.c:212:1446: error: '__builtin_memcpy' offset [17, 2147483647] is out of the bounds [0, 16] of object 'buf' with type 'u8[16]' {aka 'unsigned char[16]'} [-Werror=array-bounds=]
212 | src = dst = memcpy(buf + sizeof(buf) - bytes,arch/arm/crypto/aes-neonbs-glue.c: In function 'ctr_encrypt':arch/arm/crypto/aes-neonbs-glue.c:218:17: error: 'aesbs_ctr_encrypt' reading 1 byte from a region of size 0 [-Werror=stringop-overread]
218 | aesbs_ctr_encrypt(dst, src, ctx->rk, ctx->rounds, bytes, walk.iv);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 2 of type 'const u8[0]' {aka 'const unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 3 of type 'const u8[0]' {aka 'const unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 6 of type 'u8[0]' {aka 'unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:36:17: note: in a call to function 'aesbs_ctr_encrypt'
36 | asmlinkage void aesbs_ctr_encrypt(u8 out[], u8 const in[], u8 const rk[],
This could happen in theory if walk.nbytes is larger than INT_MAX and gets converted to a negative local variable.
Keep the type unsigned like the orignal nbytes to be sure there is no integer overflow.
--- arch/arm/crypto/aes-neonbs-glue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/crypto/aes-neonbs-glue.c +1 -1
@@ -232,7 +232,7 @@ static int ctr_encrypt(struct skcipher_request *req)while (walk.nbytes >0 ) {const u8 *src = walk.src.virt.addr;u8 *dst = walk.dst.virt.addr; -int bytes = walk.nbytes; +unsigned int bytes = walk.nbytes;if (unlikely (bytes <AES_BLOCK_SIZE )) src = dst = memcpy(buf + sizeof(buf) - bytes,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 167/369 PCI: endpoint: pci-epf-vntb: Return -ENOENT if pci_epc_get_next_free_bar() fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jerome Brunet <[email protected]>
[ Upstream commit 7ea488cce73263231662e426639dd3e836537068 ]
According the function documentation of epf_ntb_init_epc_bar(), the function should return an error code on error. However, it returns -1 when no BAR is available i.e., when pci_epc_get_next_free_bar() fails.
Return -ENOENT instead.
--- drivers/pci/endpoint/functions/pci-epf-vntb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/endpoint/functions/pci-epf-vntb.c +1 -1
@@ -700,7 +700,7 @@ static int epf_ntb_init_epc_bar(struct epf_ntb *ntb) barno =pci_epc_get_next_free_bar (epc_features, barno);if (barno <0 ) {dev_err (dev,"Fail to get NTB function BAR\n" ); -return barno; +return -ENOENT ; } ntb->epf_ntb_bar[bar] = barno; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 168/369 pinctrl: sunxi: Fix memory leak on krealloc failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit e3507c56cbb208d4f160942748c527ef6a528ba1 ]
In sunxi_pctrl_dt_node_to_map(), when krealloc() fails to resize the pinctrl_map array, the function returns -ENOMEM directly without freeing the previously allocated *map buffer. This results in a memory leak of the original kmalloc_array allocation.
--- drivers/pinctrl/sunxi/pinctrl-sunxi.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/pinctrl/sunxi/pinctrl-sunxi.c +8 -3
@@ -395,6 +395,7 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,const char *function, *pin_prop;const char *group;int ret, npins, nmaps, configlen =0 , i =0 ; +struct pinctrl_map *new_map; *map =NULL ; *num_maps =0 ;
@@ -469,9 +470,13 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,* We know have the number of maps we need, we can resize our * map array */ - *map =krealloc (*map, i *sizeof (struct pinctrl_map ),GFP_KERNEL ); -if (!*map) -return -ENOMEM ; + new_map =krealloc (*map, i *sizeof (struct pinctrl_map ),GFP_KERNEL ); +if (!new_map) { + ret = -ENOMEM ; + goto err_free_map; + } + + *map = new_map;return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 169/369 pinctrl: berlin: fix memory leak in berlin_pinctrl_build_state()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 8f6f303551100291bf2c1e1ccc66b758fffb1168 ]
In the original implementation, krealloc() failure handling incorrectly assigned the original memory pointer to NULL after kfree(), causing a memory leak when reallocation failed.
--- drivers/pinctrl/berlin/berlin.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/pinctrl/berlin/berlin.c +6 -2
@@ -204,6 +204,7 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)const struct berlin_desc_group *desc_group;const struct berlin_desc_function *desc_function;int i, max_functions =0 ; +struct pinfunction *new_functions; pctrl->nfunctions =0 ;
@@ -229,12 +230,15 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev) } } - pctrl->functions =krealloc (pctrl->functions, + new_functions =krealloc (pctrl->functions, pctrl->nfunctions *sizeof (*pctrl->functions),GFP_KERNEL ); -if (!pctrl->functions) +if (!new_functions) { +kfree (pctrl->functions);return -ENOMEM ; + } + pctrl->functions = new_functions;/* map functions to theirs groups */ for (i =0 ; i < pctrl->desc->ngroups; i++) { desc_group = pctrl->desc->groups + i;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 170/369 dmaengine: mmp: Fix again Wvoid-pointer-to-enum-cast warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit a0b1589b62e2fcfb112996e0f4d5593bd2edf069 ]
This was fixed and re-introduced. 'type' is an enum, thus cast of pointer on 64-bit compile test with W=1 causes:
mmp_tdma.c:644:9: error: cast to smaller integer type 'enum mmp_tdma_type' from 'const void *' [-Werror,-Wvoid-pointer-to-enum-cast]
--- drivers/dma/mmp_tdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/mmp_tdma.c +1 -1
@@ -641,7 +641,7 @@ static int mmp_tdma_probe(struct platform_device *pdev)int chan_num =TDMA_CHANNEL_NUM ;struct gen_pool *pool =NULL ; - type = (enum mmp_tdma_type )device_get_match_data (&pdev->dev); + type = (kernel_ulong_t )device_get_match_data (&pdev->dev);/* always have couple channels */ tdev =devm_kzalloc (&pdev->dev,sizeof (*tdev),GFP_KERNEL );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 171/369 phy: qualcomm: phy-qcom-eusb2-repeater: Dont zero-out registers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Weiss <[email protected]>
[ Upstream commit 31bc94de76026c527f82c238f414539a14f0f3e6 ]
Zeroing out registers does not happen in the downstream kernel, and will "tune" the repeater in surely unexpected ways since most registers don't have a reset value of 0x0.
Stop doing that and instead just set the registers that are in the init sequence (though long term I don't think there's actually PMIC-specific init sequences, there's board specific tuning, but that's a story for another day).
--- .../phy/qualcomm/phy-qcom-eusb2-repeater.c | 87 +++++++------------ 1 file changed, 32 insertions(+), 55 deletions(-)
drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c +32 -55
@@ -37,32 +37,13 @@#define EUSB2_TUNE_EUSB_EQU 0x5A#define EUSB2_TUNE_EUSB_HS_COMP_CUR 0x5B -enum eusb2_reg_layout { -TUNE_EUSB_HS_COMP_CUR , -TUNE_EUSB_EQU , -TUNE_EUSB_SLEW , -TUNE_USB2_HS_COMP_CUR , -TUNE_USB2_PREEM , -TUNE_USB2_EQU , -TUNE_USB2_SLEW , -TUNE_SQUELCH_U , -TUNE_HSDISC , -TUNE_RES_FSDIF , -TUNE_IUSB2 , -TUNE_USB2_CROSSOVER , -NUM_TUNE_FIELDS , - -FORCE_VAL_5 =NUM_TUNE_FIELDS , -FORCE_EN_5 , - -EN_CTL1 , - -RPTR_STATUS , -LAYOUT_SIZE , +struct eusb2_repeater_init_tbl_reg { +unsigned int reg; +unsigned int value; };struct eusb2_repeater_cfg { -const u32 *init_tbl; +const struct eusb2_repeater_init_tbl_reg *init_tbl;int init_tbl_num;const char *const *vreg_list;int num_vregs;
@@ -82,16 +63,16 @@ static const char * const pm8550b_vreg_l[] = { "vdd18", "vdd3", }; -static const u32 pm8550b_init_tbl[NUM_TUNE_FIELDS ] = { - [TUNE_IUSB2 ] =0x8 , - [TUNE_SQUELCH_U ] =0x3 , - [TUNE_USB2_PREEM ] =0x5 , +static const struct eusb2_repeater_init_tbl_reg pm8550b_init_tbl[] = { + {EUSB2_TUNE_IUSB2 ,0x8 }, + {EUSB2_TUNE_SQUELCH_U ,0x3 }, + {EUSB2_TUNE_USB2_PREEM ,0x5 }, }; -static const u32 smb2360_init_tbl[NUM_TUNE_FIELDS ] = { - [TUNE_IUSB2 ] =0x5 , - [TUNE_SQUELCH_U ] =0x3 , - [TUNE_USB2_PREEM ] =0x2 , +static const struct eusb2_repeater_init_tbl_reg smb2360_init_tbl[] = { + {EUSB2_TUNE_IUSB2 ,0x5 }, + {EUSB2_TUNE_SQUELCH_U ,0x3 }, + {EUSB2_TUNE_USB2_PREEM ,0x2 }, };static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -129,17 +110,10 @@ static int eusb2_repeater_init(struct phy *phy)struct eusb2_repeater *rptr =phy_get_drvdata (phy);struct device_node *np = rptr->dev->of_node;struct regmap *regmap = rptr->regmap; -const u32 *init_tbl = rptr->cfg->init_tbl; -u8 tune_usb2_preem = init_tbl[TUNE_USB2_PREEM ]; -u8 tune_hsdisc = init_tbl[TUNE_HSDISC ]; -u8 tune_iusb2 = init_tbl[TUNE_IUSB2 ];u32 base = rptr->base; -u32 val; +u32 poll_val;int ret; - -of_property_read_u8 (np,"qcom,tune-usb2-amplitude" , &tune_iusb2); -of_property_read_u8 (np,"qcom,tune-usb2-disc-thres" , &tune_hsdisc); -of_property_read_u8 (np,"qcom,tune-usb2-preem" , &tune_usb2_preem); +u8 val; ret =regulator_bulk_enable (rptr->cfg->num_vregs, rptr->vregs);if (ret)
@@ -147,21 +121,24 @@ static int eusb2_repeater_init(struct phy *phy)regmap_write (regmap, base +EUSB2_EN_CTL1 ,EUSB2_RPTR_EN ); -regmap_write (regmap, base +EUSB2_TUNE_EUSB_HS_COMP_CUR , init_tbl[TUNE_EUSB_HS_COMP_CUR ]); -regmap_write (regmap, base +EUSB2_TUNE_EUSB_EQU , init_tbl[TUNE_EUSB_EQU ]); -regmap_write (regmap, base +EUSB2_TUNE_EUSB_SLEW , init_tbl[TUNE_EUSB_SLEW ]); -regmap_write (regmap, base +EUSB2_TUNE_USB2_HS_COMP_CUR , init_tbl[TUNE_USB2_HS_COMP_CUR ]); -regmap_write (regmap, base +EUSB2_TUNE_USB2_EQU , init_tbl[TUNE_USB2_EQU ]); -regmap_write (regmap, base +EUSB2_TUNE_USB2_SLEW , init_tbl[TUNE_USB2_SLEW ]); -regmap_write (regmap, base +EUSB2_TUNE_SQUELCH_U , init_tbl[TUNE_SQUELCH_U ]); -regmap_write (regmap, base +EUSB2_TUNE_RES_FSDIF , init_tbl[TUNE_RES_FSDIF ]); -regmap_write (regmap, base +EUSB2_TUNE_USB2_CROSSOVER , init_tbl[TUNE_USB2_CROSSOVER ]); - -regmap_write (regmap, base +EUSB2_TUNE_USB2_PREEM , tune_usb2_preem); -regmap_write (regmap, base +EUSB2_TUNE_HSDISC , tune_hsdisc); -regmap_write (regmap, base +EUSB2_TUNE_IUSB2 , tune_iusb2); - - ret =regmap_read_poll_timeout (regmap, base +EUSB2_RPTR_STATUS , val, val &RPTR_OK ,10 ,5 ); +/* Write registers from init table */ +for (int i =0 ; i < rptr->cfg->init_tbl_num; i++) +regmap_write (regmap, base + rptr->cfg->init_tbl[i].reg, + rptr->cfg->init_tbl[i].value); + +/* Override registers from devicetree values */ +if (!of_property_read_u8 (np,"qcom,tune-usb2-amplitude" , &val)) +regmap_write (regmap, base +EUSB2_TUNE_USB2_PREEM , val); + +if (!of_property_read_u8 (np,"qcom,tune-usb2-disc-thres" , &val)) +regmap_write (regmap, base +EUSB2_TUNE_HSDISC , val); + +if (!of_property_read_u8 (np,"qcom,tune-usb2-preem" , &val)) +regmap_write (regmap, base +EUSB2_TUNE_IUSB2 , val); + +/* Wait for status OK */ + ret =regmap_read_poll_timeout (regmap, base +EUSB2_RPTR_STATUS , poll_val, + poll_val &RPTR_OK ,10 ,5 );if (ret)dev_err (rptr->dev,"initialization timed-out\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 172/369 fanotify: sanitize handle_type values when reporting fid
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
[ Upstream commit 8631e01c2c5d1fe6705bcc0d733a0b7a17d3daac ]
Unlike file_handle, type and len of struct fanotify_fh are u8. Traditionally, filesystem return handle_type < 0xff, but there is no enforecement for that in vfs.
Add a sanity check in fanotify to avoid truncating handle_type if its value is > 0xff.
--- fs/notify/fanotify/fanotify.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/notify/fanotify/fanotify.c +7 -1
@@ -441,7 +441,13 @@ static int fanotify_encode_fh(struct fanotify_fh *fh, struct inode *inode, dwords = fh_len >>2 ; type =exportfs_encode_fid (inode, buf, &dwords); err = -EINVAL ; -if (type <=0 || type ==FILEID_INVALID || fh_len != dwords <<2 ) +/* +* Unlike file_handle, type and len of struct fanotify_fh are u8. +* Traditionally, filesystem return handle_type < 0xff, but there +* is no enforecement for that in vfs. +*/ +BUILD_BUG_ON (MAX_HANDLE_SZ >0xff ||FILEID_INVALID >0xff ); +if (type <=0 || type >=FILEID_INVALID || fh_len != dwords <<2 ) goto out_err; fh->type = type;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 173/369 clk: clk-axi-clkgen: fix fpfd_max frequency for zynq
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sá <[email protected]>
[ Upstream commit ce8a9096699500e2c5bca09dde27b16edda5f636 ]
The fpfd_max frequency should be set to 450 MHz instead of 300 MHz. Well, it actually depends on the platform speed grade but we are being conservative for ultrascale so let's be consistent. In a following change we will set these limits at runtime.
--- drivers/clk/clk-axi-clkgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/clk-axi-clkgen.c +1 -1
@@ -118,7 +118,7 @@ static const struct axi_clkgen_limits axi_clkgen_zynqmp_default_limits = {static const struct axi_clkgen_limits axi_clkgen_zynq_default_limits = { .fpfd_min =10000 , - .fpfd_max =300000 , + .fpfd_max =450000 , .fvco_min =600000 , .fvco_max =1200000 , };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 174/369 Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 1db50f7b7a793670adcf062df9ff27798829d963 ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/infiniband/hw/erdma/erdma_verbs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/hw/erdma/erdma_verbs.c +2 -1
@@ -597,7 +597,8 @@ static struct erdma_mtt *erdma_create_cont_mtt(struct erdma_dev *dev,static void erdma_destroy_mtt_buf_sg (struct erdma_dev *dev,struct erdma_mtt *mtt) { -dma_unmap_sg (&dev->pdev->dev, mtt->sglist, mtt->nsg,DMA_TO_DEVICE ); +dma_unmap_sg (&dev->pdev->dev, mtt->sglist, +DIV_ROUND_UP (mtt->size,PAGE_SIZE ),DMA_TO_DEVICE );vfree (mtt->sglist); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 175/369 perf tools: Fix use-after-free in help_unknown_cmd()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 1fdf938168c4d26fa279d4f204768690d1f9c4ae ]
Currently perf aborts when it finds an invalid command. I guess it depends on the environment as I have some custom commands in the path.
$ perf bad-command perf: 'bad-command' is not a perf-command. See 'perf --help'. Aborted (core dumped)
It's because the exclude_cmds() in libsubcmd has a use-after-free when it removes some entries. After copying one to another entry, it keeps the pointer in the both position. And the next copy operation will free the later one but it's the same entry in the previous one.
For example, let's say cmds = { A, B, C, D, E } and excludes = { B, E }.
ci cj ei cmds-name excludes
-----------+--------------------
0 0 0 | A B : cmp < 0, ci == cj 1 1 0 | B B : cmp == 0 2 1 1 | C E : cmp < 0, ci != cj
At this point, it frees cmds->names[1] and cmds->names[1] is assigned to cmds->names[2].
3 2 1 | D E : cmp < 0, ci != cj
Now it frees cmds->names[2] but it's the same as cmds->names[1]. So accessing cmds->names[1] will be invalid.
This makes the subcmd tests succeed.
$ perf test subcmd 69: libsubcmd help tests : 69.1: Load subcmd names : Ok 69.2: Uniquify subcmd names : Ok 69.3: Exclude duplicate subcmd names : Ok
--- tools/lib/subcmd/help.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
tools/lib/subcmd/help.c +7 -5
@@ -9,6 +9,7 @@#include <sys/stat.h> #include <unistd.h> #include <dirent.h> +#include <assert.h> #include "subcmd-util.h" #include "help.h" #include "exec-cmd.h"
@@ -82,10 +83,11 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes) ci++; cj++; }else { -zfree (&cmds->names[cj]); - cmds->names[cj++] = cmds->names[ci++]; + cmds->names[cj++] = cmds->names[ci]; + cmds->names[ci++] =NULL ; } }else if (cmp ==0 ) { +zfree (&cmds->names[ci]); ci++; ei++; }else if (cmp >0 ) {
@@ -94,12 +96,12 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes) }if (ci != cj) {while (ci < cmds->cnt) { -zfree (&cmds->names[cj]); - cmds->names[cj++] = cmds->names[ci++]; + cmds->names[cj++] = cmds->names[ci]; + cmds->names[ci++] =NULL ; } }for (ci = cj; ci < cmds->cnt; ci++) -zfree (&cmds->names[ci]); +assert (cmds->names[ci] ==NULL ); cmds->cnt = cj; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 176/369 perf dso: Add missed dso__put to dso__load_kcore
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 63a088e999de3f431f87d9a367933da894ddb613 ]
The kcore loading creates a set of list nodes that have reference counted references to maps of the kcore. The list node freeing in the success path wasn't releasing the maps, add the missing puts. It is unclear why this leak was being missed by leak sanitizer.
--- tools/perf/util/symbol.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/symbol.c +1 -0
@@ -1405,6 +1405,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map, goto out_err; } } +map__zput (new_node->map);free (new_node); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 177/369 mtd: spi-nor: spansion: Fixup params->set_4byte_addr_mode for SEMPER
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takahiro Kuwano <[email protected]>
[ Upstream commit a45ab839f52f3f00ac3dae18a50e902efd216de2 ]
Infineon SEMPER flash family does not support E9h opcode as Exit 4-byte mode (EX4B). Therefore, params->set_4byte_addr_mode is not determined by BFPT parse. Fixup it up by introducing vendor specific EX4B opcode (B8h) and function.
--- drivers/mtd/spi-nor/spansion.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
drivers/mtd/spi-nor/spansion.c +31 -0
@@ -17,6 +17,7 @@#define SPINOR_OP_CLSR 0x30/* Clear status register 1 */ #define SPINOR_OP_CLPEF 0x82/* Clear program/erase failure flags */ +#define SPINOR_OP_CYPRESS_EX4B 0xB8/* Exit 4-byte address mode */ #define SPINOR_OP_CYPRESS_DIE_ERASE 0x61/* Chip (die) erase */ #define SPINOR_OP_RD_ANY_REG 0x65/* Read any register */ #define SPINOR_OP_WR_ANY_REG 0x71/* Write any register */
@@ -58,6 +59,13 @@ SPI_MEM_OP_DUMMY(ndummy, 0), \ SPI_MEM_OP_DATA_IN(1, buf, 0)) +#define CYPRESS_NOR_EN4B_EX4B_OP (enable) \ + SPI_MEM_OP(SPI_MEM_OP_CMD(enable ? SPINOR_OP_EN4B : \ + SPINOR_OP_CYPRESS_EX4B, 0), \ + SPI_MEM_OP_NO_ADDR, \ + SPI_MEM_OP_NO_DUMMY, \ + SPI_MEM_OP_NO_DATA) +#define SPANSION_OP (opcode) \ SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 0), \ SPI_MEM_OP_NO_ADDR, \
@@ -356,6 +364,20 @@ static int cypress_nor_quad_enable_volatile(struct spi_nor *nor)return 0 ; } +static int cypress_nor_set_4byte_addr_mode (struct spi_nor *nor,bool enable) +{ +int ret; +struct spi_mem_op op =CYPRESS_NOR_EN4B_EX4B_OP (enable); + +spi_nor_spimem_setup_op (nor, &op, nor->reg_proto); + + ret =spi_mem_exec_op (nor->spimem, &op); +if (ret) +dev_dbg (nor->dev,"error %d setting 4-byte mode\n" , ret); + +return ret; +} +/** * cypress_nor_determine_addr_mode_by_sr1() - Determine current address mode * (3 or 4-byte) by querying status
@@ -526,6 +548,9 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,struct spi_mem_op op;int ret; +/* Assign 4-byte address mode method that is not determined in BFPT */ + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; + ret =cypress_nor_set_addr_mode_nbytes (nor);if (ret)return ret;
@@ -591,6 +616,9 @@ s25hx_t_post_bfpt_fixup(struct spi_nor *nor, {int ret; +/* Assign 4-byte address mode method that is not determined in BFPT */ + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; + ret =cypress_nor_set_addr_mode_nbytes (nor);if (ret)return ret;
@@ -718,6 +746,9 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,const struct sfdp_parameter_header *bfpt_header, const struct sfdp_bfpt *bfpt) { +/* Assign 4-byte address mode method that is not determined in BFPT */ + nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode; +return cypress_nor_set_addr_mode_nbytes (nor); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 178/369 perf sched: Make sure it frees the usage string
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 10d9b89203765fb776512742c13af8dd92821842 ]
The parse_options_subcommand() allocates the usage string based on the given subcommands. So it should reach the end of the function to free the string to prevent memory leaks.
--- tools/perf/builtin-sched.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
tools/perf/builtin-sched.c +13 -12
@@ -3891,9 +3891,9 @@ int cmd_sched(int argc, const char **argv)* Aliased to 'perf script' for now: */ if (!strcmp (argv[0 ],"script" )) { -return cmd_script (argc, argv); + ret =cmd_script (argc, argv); }else if (strlen (argv[0 ]) >2 &&strstarts ("record" , argv[0 ])) { -return __cmd_record (argc, argv); + ret =__cmd_record (argc, argv); }else if (strlen (argv[0 ]) >2 &&strstarts ("latency" , argv[0 ])) { sched.tp_handler = &lat_ops;if (argc >1 ) {
@@ -3902,7 +3902,7 @@ int cmd_sched(int argc, const char **argv)usage_with_options (latency_usage, latency_options); }setup_sorting (&sched, latency_options, latency_usage); -return perf_sched__lat (&sched); + ret =perf_sched__lat (&sched); }else if (!strcmp (argv[0 ],"map" )) {if (argc) { argc =parse_options (argc, argv, map_options, map_usage,0 );
@@ -3913,13 +3913,14 @@ int cmd_sched(int argc, const char **argv) sched.map.task_names =strlist__new (sched.map.task_name,NULL );if (sched.map.task_names ==NULL ) {fprintf (stderr,"Failed to parse task names\n" ); -return -1 ; + ret =-1 ; + goto out; } } } sched.tp_handler = &map_ops;setup_sorting (&sched, latency_options, latency_usage); -return perf_sched__map (&sched); + ret =perf_sched__map (&sched); }else if (strlen (argv[0 ]) >2 &&strstarts ("replay" , argv[0 ])) { sched.tp_handler = &replay_ops;if (argc) {
@@ -3927,7 +3928,7 @@ int cmd_sched(int argc, const char **argv)if (argc)usage_with_options (replay_usage, replay_options); } -return perf_sched__replay (&sched); + ret =perf_sched__replay (&sched); }else if (!strcmp (argv[0 ],"timehist" )) {if (argc) { argc = parse_options(argc, argv, timehist_options,
@@ -3943,19 +3944,19 @@ int cmd_sched(int argc, const char **argv)parse_options_usage (NULL , timehist_options,"w" , true);if (sched.show_next)parse_options_usage (NULL , timehist_options,"n" , true); -return -EINVAL ; + ret = -EINVAL ; + goto out; } ret =symbol__validate_sym_arguments (); -if (ret) -return ret; - -return perf_sched__timehist (&sched); +if (!ret) + ret =perf_sched__timehist (&sched); }else {usage_with_options (sched_usage, sched_options); } +out:/* free usage string allocated by parse_options_subcommand */ free ((void *)sched_usage[0 ]); -return 0 ; +return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 179/369 perf sched: Free thread->priv using priv_destructor
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit aa9fdd106bab8c478d37eba5703c0950ad5c0d4f ]
In many perf sched subcommand saves priv data structure in the thread but it forgot to free them. As it's an opaque type with 'void *', it needs to register that knows how to free the data. In this case, just regular 'free()' is fine.
--- tools/perf/builtin-sched.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/builtin-sched.c +2 -0
@@ -3887,6 +3887,8 @@ int cmd_sched(int argc, const char **argv)if (!argc)usage_with_options (sched_usage, sched_options); +thread__set_priv_destructor (free); +/* * Aliased to 'perf script' for now: */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 180/369 perf sched: Fix memory leaks in perf sched map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit dc3a80c98884d86389b3b572c50ccc7f502cd41b ]
It maintains per-cpu pointers for the current thread but it doesn't release the refcounts.
--- tools/perf/builtin-sched.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
tools/perf/builtin-sched.c +20 -11
@@ -1639,6 +1639,7 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,const char *color =PERF_COLOR_NORMAL ;char stimestamp[32 ];const char *str; +int ret =-1 ;BUG_ON (this_cpu.cpu >=MAX_CPUS || this_cpu.cpu <0 );
@@ -1669,17 +1670,20 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel, sched_in =map__findnew_thread (sched, machine,-1 , next_pid); sched_out =map__findnew_thread (sched, machine,-1 , prev_pid);if (sched_in ==NULL || sched_out ==NULL ) -return -1 ; + goto out; tr =thread__get_runtime (sched_in); -if (tr ==NULL ) { -thread__put (sched_in); -return -1 ; - } +if (tr ==NULL ) + goto out; + +thread__put (sched->curr_thread[this_cpu.cpu]); +thread__put (sched->curr_out_thread[this_cpu.cpu]); sched->curr_thread[this_cpu.cpu] =thread__get (sched_in); sched->curr_out_thread[this_cpu.cpu] =thread__get (sched_out); + ret =0 ; + str =thread__comm_str (sched_in); new_shortname =0 ;if (!tr->shortname[0 ]) {
@@ -1774,12 +1778,10 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,color_fprintf (stdout, color,"\n" ); out: -if (sched->map.task_name) -thread__put (sched_out); - +thread__put (sched_out);thread__put (sched_in); -return 0 ; +return ret; } static int process_sched_switch_event(const struct perf_tool *tool,
@@ -3546,10 +3548,10 @@ static int perf_sched__map(struct perf_sched *sched) sched->curr_out_thread =calloc (MAX_CPUS ,sizeof (*(sched->curr_out_thread)));if (!sched->curr_out_thread) -return rc; + goto out_free_curr_thread;if (setup_cpus_switch_event (sched)) - goto out_free_curr_thread; + goto out_free_curr_out_thread;if (setup_map_cpus (sched)) goto out_free_cpus_switch_event;
@@ -3580,7 +3582,14 @@ static int perf_sched__map(struct perf_sched *sched) out_free_cpus_switch_event:free_cpus_switch_event (sched); +out_free_curr_out_thread: +for (int i =0 ; i <MAX_CPUS ; i++) +thread__put (sched->curr_out_thread[i]); +zfree (&sched->curr_out_thread); + out_free_curr_thread: +for (int i =0 ; i <MAX_CPUS ; i++) +thread__put (sched->curr_thread[i]);zfree (&sched->curr_thread);return rc; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 181/369 perf sched: Fix memory leaks for evsel->priv in timehist
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 117e5c33b1c44037af016d77ce6c0b086d55535f ]
It uses evsel->priv to save per-cpu timing information. It should be freed when the evsel is released.
Add the priv destructor for evsel same as thread to handle that.
--- tools/perf/builtin-sched.c | 12 ++++++++++++ tools/perf/util/evsel.c | 11 +++++++++++ tools/perf/util/evsel.h | 2 ++ 3 files changed, 25 insertions(+)
tools/perf/builtin-sched.c +12 -0
@@ -2025,6 +2025,16 @@ static u64 evsel__get_time(struct evsel *evsel, u32 cpu)return r->last_time[cpu]; } +static void timehist__evsel_priv_destructor (void *priv) +{ +struct evsel_runtime *r = priv; + +if (r) { +free (r->last_time); +free (r); + } +} +static int comm_width =30 ;static char *timehist_get_commstr (struct thread *thread)
@@ -3278,6 +3288,8 @@ static int perf_sched__timehist(struct perf_sched *sched)setup_pager (); +evsel__set_priv_destructor (timehist__evsel_priv_destructor); +/* prefer sched_waking if it is captured */ if (evlist__find_tracepoint_by_name (session->evlist,"sched:sched_waking" )) handlers[1 ].handler = timehist_sched_wakeup_ignore;
tools/perf/util/evsel.c +11 -0
@@ -1477,6 +1477,15 @@ static void evsel__free_config_terms(struct evsel *evsel)free_config_terms (&evsel->config_terms); } +static void (*evsel__priv_destructor)(void *priv); + +void evsel__set_priv_destructor (void (*destructor)(void *priv)) +{ +assert (evsel__priv_destructor ==NULL ); + + evsel__priv_destructor = destructor; +} +void evsel__exit (struct evsel *evsel) {assert (list_empty (&evsel->core.node));
@@ -1502,6 +1511,8 @@ void evsel__exit(struct evsel *evsel)hashmap__free (evsel->per_pkg_mask); evsel->per_pkg_mask =NULL ;zfree (&evsel->metric_events); +if (evsel__priv_destructor) +evsel__priv_destructor (evsel->priv); perf_evsel__object.fini (evsel);if (evsel__tool_event (evsel) ==PERF_TOOL_SYSTEM_TIME ||evsel__tool_event (evsel) ==PERF_TOOL_USER_TIME )
tools/perf/util/evsel.h +2 -0
@@ -282,6 +282,8 @@ void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);void evsel__exit (struct evsel *evsel);void evsel__delete (struct evsel *evsel); +void evsel__set_priv_destructor (void (*destructor)(void *priv)); +struct callchain_param ; void evsel__config(struct evsel *evsel, struct record_opts *opts,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 182/369 perf sched: Use RC_CHK_EQUAL() to compare pointers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 7a4002ec9e0fced907179da94f67c3082d7b4162 ]
So that it can check two pointers to the same object properly when REFCNT_CHECKING is on.
--- tools/perf/builtin-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-sched.c +1 -1
@@ -999,7 +999,7 @@ thread_atoms_search(struct rb_root_cached *root, struct thread *thread,else if (cmp <0 ) node = node->rb_right;else { -BUG_ON (thread != atoms->thread); +BUG_ON (!RC_CHK_EQUAL (thread, atoms->thread));return atoms; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 183/369 perf sched: Fix memory leaks in perf sched latency
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit e68b1c0098b959cb88afce5c93dd6a9324e6da78 ]
The work_atoms should be freed after use. Add free_work_atoms() to make sure to release all. It should use list_splice_init() when merging atoms to prevent accessing invalid pointers.
--- tools/perf/builtin-sched.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-)
tools/perf/builtin-sched.c +24 -3
@@ -1116,6 +1116,21 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp) atoms->nb_atoms++; } +static void free_work_atoms (struct work_atoms *atoms) +{ +struct work_atom *atom, *tmp; + +if (atoms ==NULL ) +return ; + +list_for_each_entry_safe (atom, tmp, &atoms->work_list, list) { +list_del (&atom->list); +free (atom); + } +thread__zput (atoms->thread); +free (atoms); +} + static int latency_switch_event(struct perf_sched *sched, struct evsel *evsel, struct perf_sample *sample,
@@ -3390,13 +3405,13 @@ static void __merge_work_atoms(struct rb_root_cached *root, struct work_atoms *d this->total_runtime += data->total_runtime; this->nb_atoms += data->nb_atoms; this->total_lat += data->total_lat; -list_splice (&data->work_list, &this->work_list); +list_splice_init (&data->work_list, &this->work_list);if (this->max_lat < data->max_lat) { this->max_lat = data->max_lat; this->max_lat_start = data->max_lat_start; this->max_lat_end = data->max_lat_end; } -zfree (&data); +free_work_atoms (data);return ; } }
@@ -3475,7 +3490,6 @@ static int perf_sched__lat(struct perf_sched *sched) work_list = rb_entry(next, struct work_atoms, node);output_lat_thread (sched, work_list); next =rb_next (next); -thread__zput (work_list->thread); }printf (" -----------------------------------------------------------------------------------------------------------------\n" );
@@ -3489,6 +3503,13 @@ static int perf_sched__lat(struct perf_sched *sched) rc =0 ; +while ((next =rb_first_cached (&sched->sorted_atom_root))) { +struct work_atoms *data; + + data = rb_entry(next, struct work_atoms, node); +rb_erase_cached (next, &sched->sorted_atom_root); +free_work_atoms (data); + } out_free_cpus_switch_event:free_cpus_switch_event (sched);return rc;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 184/369 RDMA/hns: Fix double destruction of rsv_qp
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit c6957b95ecc5b63c5a4bb4ecc28af326cf8f6dc8 ]
rsv_qp may be double destroyed in error flow, first in free_mr_init(), and then in hns_roce_exit(). Fix it by moving the free_mr_init() call into hns_roce_v2_init().
list_del corruption, ffff589732eb9b50->next is LIST_POISON1 (dead000000000100)
WARNING: CPU: 8 PID: 1047115 at lib/list_debug.c:53 __list_del_entry_valid+0x148/0x240 ... Call trace: __list_del_entry_valid+0x148/0x240 hns_roce_qp_remove+0x4c/0x3f0 [hns_roce_hw_v2] hns_roce_v2_destroy_qp_common+0x1dc/0x5f4 [hns_roce_hw_v2] hns_roce_v2_destroy_qp+0x22c/0x46c [hns_roce_hw_v2] free_mr_exit+0x6c/0x120 [hns_roce_hw_v2] hns_roce_v2_exit+0x170/0x200 [hns_roce_hw_v2] hns_roce_exit+0x118/0x350 [hns_roce_hw_v2] __hns_roce_hw_v2_init_instance+0x1c8/0x304 [hns_roce_hw_v2] hns_roce_hw_v2_reset_notify_init+0x170/0x21c [hns_roce_hw_v2] hns_roce_hw_v2_reset_notify+0x6c/0x190 [hns_roce_hw_v2] hclge_notify_roce_client+0x6c/0x160 [hclge] hclge_reset_rebuild+0x150/0x5c0 [hclge] hclge_reset+0x10c/0x140 [hclge] hclge_reset_subtask+0x80/0x104 [hclge] hclge_reset_service_task+0x168/0x3ac [hclge] hclge_service_task+0x50/0x100 [hclge] process_one_work+0x250/0x9a0 worker_thread+0x324/0x990 kthread+0x190/0x210 ret_from_fork+0x10/0x18
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 25 +++++++++++----------- drivers/infiniband/hw/hns/hns_roce_main.c | 6 +++--- 2 files changed, 16 insertions(+), 15 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +13 -12
@@ -2971,14 +2971,22 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev) {int ret; +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) { + ret =free_mr_init (hr_dev); +if (ret) { +dev_err (hr_dev->dev,"failed to init free mr!\n" ); +return ret; + } + } +/* The hns ROCEE requires the extdb info to be cleared before using */ ret =hns_roce_clear_extdb_list_info (hr_dev);if (ret) -return ret; + goto err_clear_extdb_failed; ret =get_hem_table (hr_dev);if (ret) -return ret; + goto err_clear_extdb_failed;if (hr_dev->is_vf)return 0 ;
@@ -2993,6 +3001,9 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev) err_llm_init_failed:put_hem_table (hr_dev); +err_clear_extdb_failed: +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) +free_mr_exit (hr_dev);return ret; }
@@ -7027,21 +7038,11 @@ static int __hns_roce_hw_v2_init_instance(struct hnae3_handle *handle) goto error_failed_roce_init; } -if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) { - ret =free_mr_init (hr_dev); -if (ret) { -dev_err (hr_dev->dev,"failed to init free mr!\n" ); - goto error_failed_free_mr_init; - } - } handle->priv = hr_dev;return 0 ; -error_failed_free_mr_init: -hns_roce_exit (hr_dev); - error_failed_roce_init:kfree (hr_dev->priv);
drivers/infiniband/hw/hns/hns_roce_main.c +3 -3
@@ -965,6 +965,9 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)spin_lock_init (&hr_dev->sm_lock); +INIT_LIST_HEAD (&hr_dev->qp_list); +spin_lock_init (&hr_dev->qp_list_lock); +if (hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_CQ_RECORD_DB || hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_QP_RECORD_DB ) {INIT_LIST_HEAD (&hr_dev->pgdir_list);
@@ -1132,9 +1135,6 @@ int hns_roce_init(struct hns_roce_dev *hr_dev) } } -INIT_LIST_HEAD (&hr_dev->qp_list); -spin_lock_init (&hr_dev->qp_list_lock); - ret =hns_roce_register_device (hr_dev);if (ret) goto error_failed_register_device;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 185/369 RDMA/hns: Fix HW configurations not cleared in error flow
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit 998b41cb20b02c4e28ac558e4e7f8609d659ec05 ]
hns_roce_clear_extdb_list_info() will eventually do some HW configurations through FW, and they need to be cleared by calling hns_roce_function_clear() when the initialization fails.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -1
@@ -2986,7 +2986,7 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev) ret =get_hem_table (hr_dev);if (ret) - goto err_clear_extdb_failed; + goto err_get_hem_table_failed;if (hr_dev->is_vf)return 0 ;
@@ -3001,6 +3001,8 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev) err_llm_init_failed:put_hem_table (hr_dev); +err_get_hem_table_failed: +hns_roce_function_clear (hr_dev); err_clear_extdb_failed:if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 )free_mr_exit (hr_dev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 186/369 crypto: ccp - Fix locking on alloc failure handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Kardashevskiy <[email protected]>
[ Upstream commit b4abeccb8d39db7d9b51cb0098d6458760b30a75 ]
The __snp_alloc_firmware_pages() helper allocates pages in the firmware state (alloc + rmpupdate). In case of failed rmpupdate, it tries reclaiming pages with already changed state. This requires calling the PSP firmware and since there is sev_cmd_mutex to guard such calls, the helper takes a "locked" parameter so specify if the lock needs to be held.
Most calls happen from snp_alloc_firmware_page() which executes without the lock. However
commit 24512afa4336 ("crypto: ccp: Handle the legacy TMR allocation when SNP is enabled")
switched sev_fw_alloc() from alloc_pages() (which does not call the PSP) to __snp_alloc_firmware_pages() (which does) but did not account for the fact that sev_fw_alloc() is called from __sev_platform_init_locked() (via __sev_platform_init_handle_tmr()) and executes with the lock held.
Add a "locked" parameter to __snp_alloc_firmware_pages().
Make sev_fw_alloc() use the new parameter to prevent potential deadlock in rmp_mark_pages_firmware() if rmpupdate() failed.
--- drivers/crypto/ccp/sev-dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/crypto/ccp/sev-dev.c +4 -4
@@ -424,7 +424,7 @@ static int rmp_mark_pages_firmware(unsigned long paddr, unsigned int npages, booreturn rc; } -static struct page *__snp_alloc_firmware_pages (gfp_t gfp_mask,int order) +static struct page *__snp_alloc_firmware_pages (gfp_t gfp_mask,int order,bool locked) {unsigned long npages =1ul << order, paddr;struct sev_device *sev;
@@ -443,7 +443,7 @@ static struct page *__snp_alloc_firmware_pages(gfp_t gfp_mask, int order)return page; paddr =__pa ((unsigned long )page_address (page)); -if (rmp_mark_pages_firmware (paddr, npages, false)) +if (rmp_mark_pages_firmware (paddr, npages, locked))return NULL ;return page;
@@ -453,7 +453,7 @@ void *snp_alloc_firmware_page(gfp_t gfp_mask) {struct page *page; - page =__snp_alloc_firmware_pages (gfp_mask,0 ); + page =__snp_alloc_firmware_pages (gfp_mask,0 , false);return page ?page_address (page) :NULL ; }
@@ -488,7 +488,7 @@ static void *sev_fw_alloc(unsigned long len) {struct page *page; - page =__snp_alloc_firmware_pages (GFP_KERNEL ,get_order (len)); + page =__snp_alloc_firmware_pages (GFP_KERNEL ,get_order (len), true);if (!page)return NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 187/369 crypto: inside-secure - Fix `dma_unmap_sg()` nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit cb7fa6b6fc71e0c801e271aa498e2f19e6df2931 ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/crypto/inside-secure/safexcel_hash.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/crypto/inside-secure/safexcel_hash.c +6 -2
@@ -249,7 +249,9 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv,safexcel_complete (priv, ring);if (sreq->nents) { -dma_unmap_sg (priv->dev, areq->src, sreq->nents,DMA_TO_DEVICE ); +dma_unmap_sg (priv->dev, areq->src, +sg_nents_for_len (areq->src, areq->nbytes), +DMA_TO_DEVICE ); sreq->nents =0 ; }
@@ -497,7 +499,9 @@ static int safexcel_ahash_send_req(struct crypto_async_request *async, int ring, DMA_FROM_DEVICE); unmap_sg:if (req->nents) { -dma_unmap_sg (priv->dev, areq->src, req->nents,DMA_TO_DEVICE ); +dma_unmap_sg (priv->dev, areq->src, +sg_nents_for_len (areq->src, areq->nbytes), +DMA_TO_DEVICE ); req->nents =0 ; } cdesc_rollback:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 188/369 crypto: ccp - Fix crash when rebind ccp device for ccp.ko
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mengbiao Xiong <[email protected]>
[ Upstream commit 181698af38d3f93381229ad89c09b5bd0496661a ]
When CONFIG_CRYPTO_DEV_CCP_DEBUGFS is enabled, rebinding the ccp device causes the following crash:
$ echo '0000:0a:00.2' > /sys/bus/pci/drivers/ccp/unbind $ echo '0000:0a:00.2' > /sys/bus/pci/drivers/ccp/bind
[ 204.976930] BUG: kernel NULL pointer dereference, address: 0000000000000098 [ 204.978026] #PF: supervisor write access in kernel mode [ 204.979126] #PF: error_code(0x0002) - not-present page [ 204.980226] PGD 0 P4D 0 [ 204.981317] Oops: Oops: 0002 [#1] SMP NOPTI ... [ 204.997852] Call Trace: [ 204.999074] <TASK> [ 205.000297] start_creating+0x9f/0x1c0 [ 205.001533] debugfs_create_dir+0x1f/0x170 [ 205.002769] ? srso_return_thunk+0x5/0x5f [ 205.004000] ccp5_debugfs_setup+0x87/0x170 [ccp] [ 205.005241] ccp5_init+0x8b2/0x960 [ccp] [ 205.006469] ccp_dev_init+0xd4/0x150 [ccp] [ 205.007709] sp_init+0x5f/0x80 [ccp] [ 205.008942] sp_pci_probe+0x283/0x2e0 [ccp] [ 205.010165] ? srso_return_thunk+0x5/0x5f [ 205.011376] local_pci_probe+0x4f/0xb0 [ 205.012584] pci_device_probe+0xdb/0x230 [ 205.013810] really_probe+0xed/0x380 [ 205.015024] __driver_probe_device+0x7e/0x160 [ 205.016240] device_driver_attach+0x2f/0x60 [ 205.017457] bind_store+0x7c/0xb0 [ 205.018663] drv_attr_store+0x28/0x40 [ 205.019868] sysfs_kf_write+0x5f/0x70 [ 205.021065] kernfs_fop_write_iter+0x145/0x1d0 [ 205.022267] vfs_write+0x308/0x440 [ 205.023453] ksys_write+0x6d/0xe0 [ 205.024616] __x64_sys_write+0x1e/0x30 [ 205.025778] x64_sys_call+0x16ba/0x2150 [ 205.026942] do_syscall_64+0x56/0x1e0 [ 205.028108] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 205.029276] RIP: 0033:0x7fbc36f10104 [ 205.030420] Code: 89 02 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 8d 05 e1 08 2e 00 8b 00 85 c0 75 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 f3 c3 66 90 41 54 55 49 89 d4 53 48 89 f5
This patch sets ccp_debugfs_dir to NULL after destroying it in ccp5_debugfs_destroy, allowing the directory dentry to be recreated when rebinding the ccp device.
Tested on AMD Ryzen 7 1700X.
--- drivers/crypto/ccp/ccp-debugfs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/crypto/ccp/ccp-debugfs.c +3 -0
@@ -319,5 +319,8 @@ void ccp5_debugfs_setup(struct ccp_device *ccp)void ccp5_debugfs_destroy (void ) { +mutex_lock (&ccp_debugfs_lock);debugfs_remove_recursive (ccp_debugfs_dir); + ccp_debugfs_dir =NULL ; +mutex_unlock (&ccp_debugfs_lock); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 189/369 RDMA/hns: Get message length of ack_req from FW
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 2c2ec0106c0f1f12d4eefd11de318ac47557a750 ]
ACK_REQ_FREQ indicates the number of packets (after MTU fragmentation) HW sends before setting an ACK request. When MTU is greater than or equal to 1024, the current ACK_REQ_FREQ value causes HW to request an ACK for every MTU fragment. The processing of a large number of ACKs severely impacts HW performance when sending large size payloads.
Get message length of ack_req from FW so that we can adjust this parameter according to different situations. There are several constraints for ACK_REQ_FREQ:
1. mtu * (2 ^ ACK_REQ_FREQ) should not be too large, otherwise it may cause some unexpected retries when sending large payload.
2. ACK_REQ_FREQ should be larger than or equal to LP_PKTN_INI.
3. ACK_REQ_FREQ must be equal to LP_PKTN_INI when using LDCP or HC3 congestion control algorithm.
--- drivers/infiniband/hw/hns/hns_roce_device.h | 1 + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 45 ++++++++++++++++----- drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 8 +++- 3 files changed, 43 insertions(+), 11 deletions(-)
drivers/infiniband/hw/hns/hns_roce_device.h +1 -0
@@ -856,6 +856,7 @@ struct hns_roce_caps {u16 default_ceq_arm_st;u8 cong_cap;enum hns_roce_cong_type default_cong_type; +u32 max_ack_req_msg_len; };enum hns_roce_device_state {
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +35 -10
100 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_hw_v2.h +7 -1
@@ -1168,7 +1168,8 @@ struct hns_roce_cfg_gmv_tb_b {#define GMV_TB_B_SMAC_H GMV_TB_B_FIELD_LOC(47, 32)#define GMV_TB_B_SGID_IDX GMV_TB_B_FIELD_LOC(71, 64) -#define HNS_ROCE_QUERY_PF_CAPS_CMD_NUM 5 +#define HNS_ROCE_QUERY_PF_CAPS_CMD_NUM_HIP08 5 +#define HNS_ROCE_QUERY_PF_CAPS_CMD_NUM 6struct hns_roce_query_pf_caps_a {u8 number_ports;u8 local_ca_ack_delay;
@@ -1280,6 +1281,11 @@ struct hns_roce_query_pf_caps_e {__le16 aeq_period; }; +struct hns_roce_query_pf_caps_f { +__le32 max_ack_req_msg_len; +__le32 rsv[5 ]; +}; +#define PF_CAPS_E_FIELD_LOC (h, l) \ FIELD_LOC(struct hns_roce_query_pf_caps_e, h, l)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 190/369 RDMA/hns: Fix accessing uninitialized resources
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 278c18a4a78a9a6bf529ef45ccde512a5686ea9d ]
hr_dev->pgdir_list and hr_dev->pgdir_mutex won't be initialized if CQ/QP record db are not enabled, but they are also needed when using SRQ with SRQ record db enabled. Simplified the logic by always initailizing the reosurces.
--- drivers/infiniband/hw/hns/hns_roce_main.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
drivers/infiniband/hw/hns/hns_roce_main.c +4 -12
@@ -947,10 +947,7 @@ static int hns_roce_init_hem(struct hns_roce_dev *hr_dev)static void hns_roce_teardown_hca (struct hns_roce_dev *hr_dev) {hns_roce_cleanup_bitmap (hr_dev); - -if (hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_CQ_RECORD_DB || - hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_QP_RECORD_DB ) -mutex_destroy (&hr_dev->pgdir_mutex); +mutex_destroy (&hr_dev->pgdir_mutex); }/**
@@ -968,11 +965,8 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)INIT_LIST_HEAD (&hr_dev->qp_list);spin_lock_init (&hr_dev->qp_list_lock); -if (hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_CQ_RECORD_DB || - hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_QP_RECORD_DB ) { -INIT_LIST_HEAD (&hr_dev->pgdir_list); -mutex_init (&hr_dev->pgdir_mutex); - } +INIT_LIST_HEAD (&hr_dev->pgdir_list); +mutex_init (&hr_dev->pgdir_mutex);hns_roce_init_uar_table (hr_dev);
@@ -1004,9 +998,7 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev) err_uar_table_free:ida_destroy (&hr_dev->uar_ida.ida); -if (hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_CQ_RECORD_DB || - hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_QP_RECORD_DB ) -mutex_destroy (&hr_dev->pgdir_mutex); +mutex_destroy (&hr_dev->pgdir_mutex);return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 191/369 RDMA/hns: Drop GFP_NOWARN
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 5338abb299f0cd764edf78a7e71a0b746af35030 ]
GFP_NOWARN silences all warnings on dma_alloc_coherent() failure, which might otherwise help with troubleshooting.
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +5 -13
@@ -249,15 +249,12 @@ int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev, }static struct hns_roce_hem *hns_roce_alloc_hem (struct hns_roce_dev *hr_dev, -unsigned long hem_alloc_size, -gfp_t gfp_mask) +unsigned long hem_alloc_size) {struct hns_roce_hem *hem;int order;void *buf; -WARN_ON (gfp_mask & __GFP_HIGHMEM); - order =get_order (hem_alloc_size);if (PAGE_SIZE << order != hem_alloc_size) { dev_err(hr_dev->dev, "invalid hem_alloc_size: %lu!\n",
@@ -265,13 +262,12 @@ static struct hns_roce_hem *hns_roce_alloc_hem(struct hns_roce_dev *hr_dev,return NULL ; } - hem =kmalloc (sizeof (*hem), - gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN)); + hem =kmalloc (sizeof (*hem),GFP_KERNEL );if (!hem)return NULL ; buf =dma_alloc_coherent (hr_dev->dev, hem_alloc_size, - &hem->dma, gfp_mask); + &hem->dma,GFP_KERNEL );if (!buf) goto fail;
@@ -378,7 +374,6 @@ static int alloc_mhop_hem(struct hns_roce_dev *hr_dev, {u32 bt_size = mhop->bt_chunk_size;struct device *dev = hr_dev->dev; -gfp_t flag;u64 bt_ba;u32 size;int ret;
@@ -417,8 +412,7 @@ static int alloc_mhop_hem(struct hns_roce_dev *hr_dev,* alloc bt space chunk for MTT/CQE. */ size = table->type <HEM_TYPE_MTT ? mhop->buf_chunk_size : bt_size; - flag =GFP_KERNEL | __GFP_NOWARN; - table->hem[index->buf] =hns_roce_alloc_hem (hr_dev, size, flag); + table->hem[index->buf] =hns_roce_alloc_hem (hr_dev, size);if (!table->hem[index->buf]) { ret = -ENOMEM ; goto err_alloc_hem;
@@ -546,9 +540,7 @@ int hns_roce_table_get(struct hns_roce_dev *hr_dev, goto out; } - table->hem[i] =hns_roce_alloc_hem (hr_dev, - table->table_chunk_size, -GFP_KERNEL | __GFP_NOWARN); + table->hem[i] =hns_roce_alloc_hem (hr_dev, table->table_chunk_size);if (!table->hem[i]) { ret = -ENOMEM ; goto out;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 192/369 RDMA/hns: Fix -Wframe-larger-than issue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 79d56805c5068f2bc81518043e043c3dedd1c82a ]
Fix -Wframe-larger-than issue by allocating memory for qpc struct with kzalloc() instead of using stack memory.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +10 -5
@@ -5371,11 +5371,10 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, {struct hns_roce_dev *hr_dev =to_hr_dev (ibqp->device);struct hns_roce_qp *hr_qp =to_hr_qp (ibqp); -struct hns_roce_v2_qp_context ctx[2 ]; -struct hns_roce_v2_qp_context *context = ctx; -struct hns_roce_v2_qp_context *qpc_mask = ctx +1 ; +struct hns_roce_v2_qp_context *context; +struct hns_roce_v2_qp_context *qpc_mask;struct ib_device *ibdev = &hr_dev->ib_dev; -int ret; +int ret = -ENOMEM ;if (attr_mask & ~IB_QP_ATTR_STANDARD_BITS )return -EOPNOTSUPP ;
@@ -5386,7 +5385,11 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,* we should set all bits of the relevant fields in context mask to * 0 at the same time, else set them to 0x1. */ -memset (context,0 , hr_dev->caps.qpc_sz); + context =kvzalloc (sizeof (*context),GFP_KERNEL ); + qpc_mask =kvzalloc (sizeof (*qpc_mask),GFP_KERNEL ); +if (!context || !qpc_mask) + goto out; +memset (qpc_mask,0xff , hr_dev->caps.qpc_sz); ret = hns_roce_v2_set_abs_fields(ibqp, attr, attr_mask, cur_state,
@@ -5428,6 +5431,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,clear_qp (hr_qp); out: +kvfree (qpc_mask); +kvfree (context);return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 193/369 kernel: trace: preemptirq_delay_test: use offstack cpu mask
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit adc353c0bfb243ebfd29b6222fa3bf149169a6de ]
A CPU mask on the stack is broken for large values of CONFIG_NR_CPUS:
kernel/trace/preemptirq_delay_test.c: In function ‘preemptirq_delay_run’:kernel/trace/preemptirq_delay_test.c:143:1: error: the frame size of 8512 bytes is larger than 1536 bytes [-Werror=frame-larger-than=]
Fall back to dynamic allocation here.
--- kernel/trace/preemptirq_delay_test.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
kernel/trace/preemptirq_delay_test.c +9 -4
@@ -117,12 +117,15 @@ static int preemptirq_delay_run(void *data) {int i;int s =MIN (burst_size,NR_TEST_FUNCS ); -struct cpumask cpu_mask; +cpumask_var_t cpu_mask; + +if (!alloc_cpumask_var (&cpu_mask,GFP_KERNEL )) +return -ENOMEM ;if (cpu_affinity >-1 ) { -cpumask_clear (&cpu_mask); -cpumask_set_cpu (cpu_affinity, &cpu_mask); -if (set_cpus_allowed_ptr (current, &cpu_mask)) +cpumask_clear (cpu_mask); +cpumask_set_cpu (cpu_affinity, cpu_mask); +if (set_cpus_allowed_ptr (current, cpu_mask))pr_err ("cpu_affinity:%d, failed\n" , cpu_affinity); }
@@ -139,6 +142,8 @@ static int preemptirq_delay_run(void *data)__set_current_state (TASK_RUNNING ); +free_cpumask_var (cpu_mask); +return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 194/369 proc: use the same treatment to check proc_lseek as ones for proc_read_iter et.al
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: wangzijie <[email protected]>
[ Upstream commit ff7ec8dc1b646296f8d94c39339e8d3833d16c05 ]
Check pde->proc_ops->proc_lseek directly may cause UAF in rmmod scenario. It's a gap in proc_reg_open() after commit 654b33ada4ab("proc: fix UAF in proc_get_inode()"). Followed by AI Viro's suggestion, fix it in same manner.
--- fs/proc/generic.c | 2 ++ fs/proc/inode.c | 2 +- fs/proc/internal.h | 5 +++++ include/linux/proc_fs.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-)
fs/proc/generic.c +2 -0
@@ -567,6 +567,8 @@ static void pde_set_flags(struct proc_dir_entry *pde)if (pde->proc_ops->proc_compat_ioctl) pde->flags |= PROC_ENTRY_proc_compat_ioctl;#endif +if (pde->proc_ops->proc_lseek) + pde->flags |= PROC_ENTRY_proc_lseek; } struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
fs/proc/inode.c +1 -1
@@ -473,7 +473,7 @@ static int proc_reg_open(struct inode *inode, struct file *file) typeof_member(struct proc_ops, proc_open) open;struct pde_opener *pdeo; -if (!pde->proc_ops->proc_lseek) +if (!pde_has_proc_lseek (pde)) file->f_mode &= ~FMODE_LSEEK ;if (pde_is_permanent (pde)) {
fs/proc/internal.h +5 -0
@@ -99,6 +99,11 @@ static inline bool pde_has_proc_compat_ioctl(const struct proc_dir_entry *pde)#endif } +static inline bool pde_has_proc_lseek (const struct proc_dir_entry *pde) +{ +return pde->flags & PROC_ENTRY_proc_lseek; +} +extern struct kmem_cache *proc_dir_entry_cache;void pde_free (struct proc_dir_entry *pde);
include/linux/proc_fs.h +1 -0
@@ -27,6 +27,7 @@ enum { PROC_ENTRY_proc_read_iter =1U <<1 , PROC_ENTRY_proc_compat_ioctl =1U <<2 , + PROC_ENTRY_proc_lseek = 1U << 3, }; struct proc_ops {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 195/369 pinmux: fix race causing mux_owner NULL with active mux_usecount
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mukesh Ojha <[email protected]>
[ Upstream commit 0b075c011032f88d1cfde3b45d6dcf08b44140eb ]
commit 5a3e85c3c397 ("pinmux: Use sequential access to access desc->pinmux data") tried to address the issue when two client of the same gpio calls pinctrl_select_state() for the same functionality, was resulting in NULL pointer issue while accessing desc->mux_owner. However, issue was not completely fixed due to the way it was handled and it can still result in the same NULL pointer.
The issue occurs due to the following interleaving:
cpu0 (process A) cpu1 (process B)
pin_request() { pin_free() {
mutex_lock()
desc->mux_usecount--; //becomes 0
..
mutex_unlock()mutex_lock(desc->mux) desc->mux_usecount++; // becomes 1 desc->mux_owner = owner; mutex_unlock(desc->mux)
mutex_lock(desc->mux)
desc->mux_owner = NULL;
mutex_unlock(desc->mux)This sequence leads to a state where the pin appears to be in use (mux_usecount == 1) but has no owner (mux_owner == NULL), which can cause NULL pointer on next pin_request on the same pin.
Ensure that updates to mux_usecount and mux_owner are performed atomically under the same lock. Only clear mux_owner when mux_usecount reaches zero and no new owner has been assigned.
--- drivers/pinctrl/pinmux.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/pinctrl/pinmux.c +9 -11
@@ -236,18 +236,7 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,if (desc->mux_usecount)return NULL ; } - } - -/* -* If there is no kind of request function for the pin we just assume -* we got it by default and proceed. -*/ -if (gpio_range && ops->gpio_disable_free) - ops->gpio_disable_free (pctldev, gpio_range, pin); -else if (ops->free) - ops->free (pctldev, pin); - scoped_guard(mutex, &desc->mux_lock) {if (gpio_range) { owner = desc->gpio_owner; desc->gpio_owner =NULL ;
@@ -258,6 +247,15 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin, } } +/* +* If there is no kind of request function for the pin we just assume +* we got it by default and proceed. +*/ +if (gpio_range && ops->gpio_disable_free) + ops->gpio_disable_free (pctldev, gpio_range, pin); +else if (ops->free) + ops->free (pctldev, pin); +module_put (pctldev->owner);return owner;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 196/369 perf tests bp_account: Fix leaked file descriptor
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Yan <[email protected]>
[ Upstream commit 4a6cdecaa1497f1fbbd1d5307a225b6ca5a62a90 ]
Since the commit e9846f5ead26 ("perf test: In forked mode add check that fds aren't leaked"), the test "Breakpoint accounting" reports the error:
# perf test -vvv "Breakpoint accounting" 20: Breakpoint accounting: --- start --- test child forked, pid 373 failed opening event 0 failed opening event 0 watchpoints count 4, breakpoints count 6, has_ioctl 1, share 0 wp 0 created wp 1 created wp 2 created wp 3 created wp 0 modified to bp wp max created ---- end(0) ---- Leak of file descriptor 7 that opened: 'anon_inode:[perf_event]'
A watchpoint's file descriptor was not properly released. This patch fixes the leak.
--- tools/perf/tests/bp_account.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/tests/bp_account.c +1 -0
@@ -104,6 +104,7 @@ static int bp_accounting(int wp_cnt, int share) fd_wp =wp_event ((void *)&the_var, &attr_new);TEST_ASSERT_VAL ("failed to create max wp\n" , fd_wp !=-1 );pr_debug ("wp max created\n" ); +close (fd_wp); }for (i =0 ; i < wp_cnt; i++)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 197/369 RDMA/mana_ib: Fix DSCP value in modify QP
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shiraz Saleem <[email protected]>
[ Upstream commit 62de0e67328e9503459a24b9343c3358937cdeef ]
Convert the traffic_class in GRH to a DSCP value as required by the HW.
--- drivers/infiniband/hw/mana/qp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mana/qp.c +1 -1
@@ -561,7 +561,7 @@ static int mana_ib_gd_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, req.ah_attr.dest_port =ROCE_V2_UDP_DPORT ; req.ah_attr.src_port =rdma_get_udp_sport (attr->ah_attr.grh.flow_label, ibqp->qp_num, attr->dest_qp_num); - req.ah_attr.traffic_class = attr->ah_attr.grh.traffic_class; + req.ah_attr.traffic_class = attr->ah_attr.grh.traffic_class >>2 ; req.ah_attr.hop_limit = attr->ah_attr.grh.hop_limit; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 198/369 clk: thead: th1520-ap: Correctly refer the parent of osc_12m
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao Zi <[email protected]>
[ Upstream commit d274c77ffa202b70ad01d579f33b73b4de123375 ]
The "osc_12m" fixed factor clock refers the external oscillator by setting clk_parent_data.fw_name to osc_24m, which is obviously wrong since no clock-names property is allowed for compatible thead,th1520-clk-ap.
Refer the oscillator as parent by index instead.
--- drivers/clk/thead/clk-th1520-ap.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/clk/thead/clk-th1520-ap.c +8 -1
@@ -582,7 +582,14 @@ static const struct clk_parent_data peri2sys_apb_pclk_pd[] = { { .hw = &peri2sys_apb_pclk.common.hw } }; -static CLK_FIXED_FACTOR_FW_NAME(osc12m_clk, "osc_12m", "osc_24m", 2, 1, 0); +static struct clk_fixed_factor osc12m_clk = { + .div =2 , + .mult =1 , + .hw.init =CLK_HW_INIT_PARENTS_DATA ("osc_12m" , + osc_24m_clk, + &clk_fixed_factor_ops, +0 ), +};static const char *const out_parents[] = {"osc_24m" ,"osc_12m" };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 199/369 clk: sunxi-ng: v3s: Fix de clock definition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
[ Upstream commit e8ab346f9907a1a3aa2f0e5decf849925c06ae2e ]
The de clock is marked with CLK_SET_RATE_PARENT, which is really not necessary (as confirmed from experimentation) and significantly restricts flexibility for other clocks using the same parent.
In addition the source selection (parent) field is marked as using 2 bits, when it the documentation reports that it uses 3.
Fix both issues in the de clock definition.
--- drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +1 -2
@@ -347,8 +347,7 @@ static SUNXI_CCU_GATE(dram_ohci_clk, "dram-ohci", "dram",static const char *const de_parents[] = {"pll-video" ,"pll-periph0" }; static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de", de_parents, -0x104 ,0 ,4 ,24 ,2 ,BIT (31 ), - CLK_SET_RATE_PARENT); + 0x104, 0, 4, 24, 3, BIT(31), 0);static const char *const tcon_parents[] = {"pll-video" }; static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 200/369 scsi: ibmvscsi_tgt: Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 023a293b9cd0bb86a9b50cd7688a3d9d266826db ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/scsi/ibmvscsi_tgt/libsrp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/scsi/ibmvscsi_tgt/libsrp.c +4 -2
@@ -184,7 +184,8 @@ static int srp_direct_data(struct ibmvscsis_cmd *cmd, struct srp_direct_buf *md, err =rdma_io (cmd, sg, nsg, md,1 , dir, len);if (dma_map) -dma_unmap_sg (iue->target->dev, sg, nsg,DMA_BIDIRECTIONAL ); +dma_unmap_sg (iue->target->dev, sg, cmd->se_cmd.t_data_nents, +DMA_BIDIRECTIONAL );return err; }
@@ -256,7 +257,8 @@ static int srp_indirect_data(struct ibmvscsis_cmd *cmd, struct srp_cmd *srp_cmd, err =rdma_io (cmd, sg, nsg, md, nmd, dir, len);if (dma_map) -dma_unmap_sg (iue->target->dev, sg, nsg,DMA_BIDIRECTIONAL ); +dma_unmap_sg (iue->target->dev, sg, cmd->se_cmd.t_data_nents, +DMA_BIDIRECTIONAL ); free_mem:if (token && dma_map) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 201/369 scsi: elx: efct: Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 3a988d0b65d7d1713ce7596eae288a293f3b938e ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/scsi/elx/efct/efct_lio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/elx/efct/efct_lio.c +1 -1
@@ -382,7 +382,7 @@ efct_lio_sg_unmap(struct efct_io *io)return ;dma_unmap_sg (&io->efct->pci->dev, cmd->t_data_sg, - ocp->seg_map_cnt, cmd->data_direction); + cmd->t_data_nents, cmd->data_direction); ocp->seg_map_cnt =0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 202/369 scsi: mvsas: Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 0141618727bc929fe868153d21797f10ce5bef3f ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/scsi/mvsas/mv_sas.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/mvsas/mv_sas.c +2 -2
@@ -828,7 +828,7 @@ static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmfdev_printk (KERN_ERR , mvi->dev,"mvsas prep failed[%d]!\n" , rc);if (!sas_protocol_ata (task->task_proto))if (n_elem) -dma_unmap_sg (mvi->dev, task->scatter, n_elem, +dma_unmap_sg (mvi->dev, task->scatter, task->num_scatter, task->data_dir); prep_out:return rc;
@@ -874,7 +874,7 @@ static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task,if (!sas_protocol_ata (task->task_proto))if (slot->n_elem)dma_unmap_sg (mvi->dev, task->scatter, - slot->n_elem, task->data_dir); + task->num_scatter, task->data_dir);switch (task->task_proto) {case SAS_PROTOCOL_SMP :
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 203/369 scsi: isci: Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 063bec4444d54e5f35d11949c5c90eaa1ff84c11 ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/scsi/isci/request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/isci/request.c +1 -1
@@ -2904,7 +2904,7 @@ static void isci_request_io_request_complete(struct isci_host *ihost, task->total_xfer_len, task->data_dir); else /* unmap the sgl dma addresses */ dma_unmap_sg(&ihost->pdev->dev, task->scatter, - request->num_sg_entries, task->data_dir); + task->num_scatter, task->data_dir);break ;case SAS_PROTOCOL_SMP : {struct scatterlist *sg = &task->smp_task.smp_req;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 204/369 watchdog: ziirave_wdt: check record length in ziirave_firm_verify()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 8b61d8ca751bc15875b50e0ff6ac3ba0cf95a529 ]
The "rec->len" value comes from the firmware. We generally do trust firmware, but it's always better to double check. If the length value is too large it would lead to memory corruption when we set "data[i] = ret;"
--- drivers/watchdog/ziirave_wdt.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/watchdog/ziirave_wdt.c +3 -0
@@ -302,6 +302,9 @@ static int ziirave_firm_verify(struct watchdog_device *wdd,const u16 len =be16_to_cpu (rec->len);const u32 addr =be32_to_cpu (rec->addr); +if (len >sizeof (data)) +return -EINVAL ; +if (ziirave_firm_addr_readonly (addr))continue ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 205/369 ext4: Make sure BH_New bit is cleared in ->write_end handler
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
[ Upstream commit 91b8ca8b26729b729dda8a4eddb9aceaea706f37 ]
Currently we clear BH_New bit in case of error and also in the standard ext4_write_end() handler (in block_commit_write()). However ext4_journalled_write_end() misses this clearing and thus we are leaving stale BH_New bits behind. Generally ext4_block_write_begin() clears these bits before any harm can be done but in case blocksize < pagesize and we hit some error when processing a page with these stale bits, we'll try to zero buffers with these stale BH_New bits and jbd2 will complain (as buffers were not prepared for writing in this transaction). Fix the problem by clearing BH_New bits in ext4_journalled_write_end() and WARN if ext4_block_write_begin() sees stale BH_New bits.
--- fs/ext4/inline.c | 2 ++ fs/ext4/inode.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-)
fs/ext4/inline.c +2 -0
@@ -606,6 +606,7 @@ static int ext4_convert_inline_data_to_extent(struct address_space *mapping, }else ret =ext4_block_write_begin (handle, folio, from, to, ext4_get_block); +clear_buffer_new (folio_buffers (folio));if (!ret &&ext4_should_journal_data (inode)) { ret = ext4_walk_page_buffers(handle, inode,
@@ -867,6 +868,7 @@ static int ext4_da_convert_inline_data_to_extent(struct address_space *mapping,return ret; } +clear_buffer_new (folio_buffers (folio));folio_mark_dirty (folio);folio_mark_uptodate (folio);ext4_clear_inode_state (inode,EXT4_STATE_MAY_INLINE_DATA );
fs/ext4/inode.c +2 -1
@@ -1056,7 +1056,7 @@ int ext4_block_write_begin(handle_t *handle, struct folio *folio, }continue ; } -if (buffer_new (bh)) +if (WARN_ON_ONCE (buffer_new (bh)))clear_buffer_new (bh);if (!buffer_mapped (bh)) {WARN_ON (bh->b_size != blocksize);
@@ -1272,6 +1272,7 @@ static int write_end_fn(handle_t *handle, struct inode *inode, ret =ext4_dirty_journalled_data (handle, bh);clear_buffer_meta (bh);clear_buffer_prio (bh); +clear_buffer_new (bh);return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 206/369 clk: at91: sam9x7: update pll clk ranges
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varshini Rajendran <[email protected]>
[ Upstream commit c7f7ddbd27d55fa552a7269b7bae539adc2a3d46 ]
Update the min, max ranges of the PLL clocks according to the latest datasheet to be coherent in the driver. This patch solves the issues in configuring the clocks related to peripherals with the desired frequency within the range.
--- drivers/clk/at91/sam9x7.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/clk/at91/sam9x7.c +10 -10
@@ -61,44 +61,44 @@ static const struct clk_master_layout sam9x7_master_layout = {/* Fractional PLL core output range. */ static const struct clk_range plla_core_outputs[] = { - { .min =375000000 , .max =1600000000 }, + { .min =800000000 , .max =1600000000 }, };static const struct clk_range upll_core_outputs[] = { - { .min =600000000 , .max =1200000000 }, + { .min =600000000 , .max =960000000 }, };static const struct clk_range lvdspll_core_outputs[] = { - { .min =400000000 , .max =800000000 }, + { .min =600000000 , .max =1200000000 }, };static const struct clk_range audiopll_core_outputs[] = { - { .min =400000000 , .max =800000000 }, + { .min =600000000 , .max =1200000000 }, };static const struct clk_range plladiv2_core_outputs[] = { - { .min =375000000 , .max =1600000000 }, + { .min =800000000 , .max =1600000000 }, };/* Fractional PLL output range. */ static const struct clk_range plla_outputs[] = { - { .min =732421 , .max =800000000 }, + { .min =400000000 , .max =800000000 }, };static const struct clk_range upll_outputs[] = { - { .min =300000000 , .max =600000000 }, + { .min =300000000 , .max =480000000 }, };static const struct clk_range lvdspll_outputs[] = { - { .min =10000000 , .max =800000000 }, + { .min =175000000 , .max =550000000 }, };static const struct clk_range audiopll_outputs[] = { - { .min =10000000 , .max =800000000 }, + { .min =0 , .max =300000000 }, };static const struct clk_range plladiv2_outputs[] = { - { .min =366210 , .max =400000000 }, + { .min =200000000 , .max =400000000 }, };/* PLL characteristics. */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 207/369 hwrng: mtk - handle devm_pm_runtime_enable errors
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit 522a242a18adc5c63a24836715dbeec4dc3faee1 ]
Although unlikely, devm_pm_runtime_enable() call might fail, so handle the return value.
--- drivers/char/hw_random/mtk-rng.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/char/hw_random/mtk-rng.c +3 -1
@@ -142,7 +142,9 @@ static int mtk_rng_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, priv);pm_runtime_set_autosuspend_delay (&pdev->dev,RNG_AUTOSUSPEND_TIMEOUT );pm_runtime_use_autosuspend (&pdev->dev); -devm_pm_runtime_enable (&pdev->dev); + ret =devm_pm_runtime_enable (&pdev->dev); +if (ret) +return ret;dev_info (&pdev->dev,"registered RNG driver\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 208/369 crypto: keembay - Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 01951a7dc5ac1a37e5fb7d86ea7eb2dfbf96e8b6 ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/crypto/intel/keembay/keembay-ocs-hcu-core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/crypto/intel/keembay/keembay-ocs-hcu-core.c +7 -1
@@ -68,6 +68,7 @@ struct ocs_hcu_ctx {* @sg_data_total: Total data in the SG list at any time. * @sg_data_offset: Offset into the data of the current individual SG node. * @sg_dma_nents: Number of sg entries mapped in dma_list. +* @nents: Number of entries in the scatterlist. */ struct ocs_hcu_rctx {struct ocs_hcu_dev *hcu_dev;
@@ -91,6 +92,7 @@ struct ocs_hcu_rctx {unsigned int sg_data_total;unsigned int sg_data_offset;unsigned int sg_dma_nents; +unsigned int nents; };/**
@@ -199,7 +201,7 @@ static void kmb_ocs_hcu_dma_cleanup(struct ahash_request *req,/* Unmap req->src (if mapped). */ if (rctx->sg_dma_nents) { -dma_unmap_sg (dev, req->src, rctx->sg_dma_nents,DMA_TO_DEVICE ); +dma_unmap_sg (dev, req->src, rctx->nents,DMA_TO_DEVICE ); rctx->sg_dma_nents =0 ; }
@@ -260,6 +262,10 @@ static int kmb_ocs_dma_prepare(struct ahash_request *req) rc = -ENOMEM ; goto cleanup; } + +/* Save the value of nents to pass to dma_unmap_sg. */ + rctx->nents = nents; +/* * The value returned by dma_map_sg() can be < nents; so update * nents accordingly.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 209/369 crypto: img-hash - Fix dma_unmap_sg() nents value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 34b283636181ce02c52633551f594fec9876bec7 ]
The dma_unmap_sg() functions should be called with the same nents as the dma_map_sg(), not the value the map function returned.
--- drivers/crypto/img-hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/img-hash.c +1 -1
@@ -436,7 +436,7 @@ static int img_hash_write_via_dma_stop(struct img_hash_dev *hdev)struct img_hash_request_ctx *ctx =ahash_request_ctx (hdev->req);if (ctx->flags &DRIVER_FLAGS_SG ) -dma_unmap_sg (hdev->dev, ctx->sg, ctx->dma_ct,DMA_TO_DEVICE ); +dma_unmap_sg (hdev->dev, ctx->sg,1 ,DMA_TO_DEVICE );return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 210/369 crypto: qat - disable ZUC-256 capability for QAT GEN5
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bairavi Alagappan <[email protected]>
[ Upstream commit d956692c7dd523b331d4556ee03def8dd02609dc ]
The ZUC-256 EEA (encryption) and EIA (integrity) algorithms are not supported on QAT GEN5 devices, as their current implementation does not align with the NIST specification. Earlier versions of the ZUC-256 specification used a different initialization scheme, which has since been revised to comply with the 5G specification.
Due to this misalignment with the updated specification, remove support for ZUC-256 EEA and EIA for QAT GEN5 by masking out the ZUC-256 capability.
--- drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c +1 -8
@@ -199,7 +199,6 @@ static u32 get_accel_cap(struct adf_accel_dev *accel_dev)ICP_ACCEL_CAPABILITIES_SM4 |ICP_ACCEL_CAPABILITIES_AES_V2 |ICP_ACCEL_CAPABILITIES_ZUC | -ICP_ACCEL_CAPABILITIES_ZUC_256 |ICP_ACCEL_CAPABILITIES_WIRELESS_CRYPTO_EXT |ICP_ACCEL_CAPABILITIES_EXT_ALGCHAIN ;
@@ -231,17 +230,11 @@ static u32 get_accel_cap(struct adf_accel_dev *accel_dev)if (fusectl1 &ICP_ACCEL_GEN4_MASK_WCP_WAT_SLICE ) { capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_ZUC ; - capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_ZUC_256 ; capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_WIRELESS_CRYPTO_EXT ; } -if (fusectl1 &ICP_ACCEL_GEN4_MASK_EIA3_SLICE ) { +if (fusectl1 &ICP_ACCEL_GEN4_MASK_EIA3_SLICE ) capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_ZUC ; - capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_ZUC_256 ; - } - -if (fusectl1 &ICP_ACCEL_GEN4_MASK_ZUC_256_SLICE ) - capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_ZUC_256 ; capabilities_asym =ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC | ICP_ACCEL_CAPABILITIES_SM2 |
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 211/369 soundwire: stream: restore params when prepare ports fail
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bard Liao <[email protected]>
[ Upstream commit dba7d9dbfdc4389361ff3a910e767d3cfca22587 ]
The bus->params should be restored if the stream is failed to prepare. The issue exists since beginning. The Fixes tag just indicates the first commit that the commit can be applied to.
--- drivers/soundwire/stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soundwire/stream.c +1 -1
@@ -1414,7 +1414,7 @@ static int _sdw_prepare_stream(struct sdw_stream_runtime *stream,if (ret <0 ) {dev_err (bus->dev,"Prepare port(s) failed ret = %d\n" , ret); -return ret; + goto restore_params; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 212/369 PCI: endpoint: pci-epf-vntb: Fix the incorrect usage of __iomem attribute
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 61ae7f8694fb4b57a8c02a1a8d2b601806afc999 ]
__iomem attribute is supposed to be used only with variables holding the MMIO pointer. But here, 'mw_addr' variable is just holding a 'void *' returned by pci_epf_alloc_space(). So annotating it with __iomem is clearly wrong. Hence, drop the attribute.
This also fixes the below sparse warning:
drivers/pci/endpoint/functions/pci-epf-vntb.c:524:17: warning: incorrect type in assignment (different address spaces)
drivers/pci/endpoint/functions/pci-epf-vntb.c:524:17: expected void [noderef] __iomem *mw_addr
drivers/pci/endpoint/functions/pci-epf-vntb.c:524:17: got void *
drivers/pci/endpoint/functions/pci-epf-vntb.c:530:21: warning: incorrect type in assignment (different address spaces)
drivers/pci/endpoint/functions/pci-epf-vntb.c:530:21: expected unsigned int [usertype] *epf_db
drivers/pci/endpoint/functions/pci-epf-vntb.c:530:21: got void [noderef] __iomem *mw_addr
drivers/pci/endpoint/functions/pci-epf-vntb.c:542:38: warning: incorrect type in argument 2 (different address spaces)
drivers/pci/endpoint/functions/pci-epf-vntb.c:542:38: expected void *addr
drivers/pci/endpoint/functions/pci-epf-vntb.c:542:38: got void [noderef] __iomem *mw_addr
--- drivers/pci/endpoint/functions/pci-epf-vntb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/endpoint/functions/pci-epf-vntb.c +1 -1
@@ -530,7 +530,7 @@ static int epf_ntb_db_bar_init(struct epf_ntb *ntb)struct device *dev = &ntb->epf->dev;int ret;struct pci_epf_bar *epf_bar; -void __iomem *mw_addr; +void *mw_addr;enum pci_barno barno;size_t size =sizeof (u32) * ntb->db_count;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 213/369 clk: imx95-blk-ctl: Fix synchronous abort
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurentiu Palcu <[email protected]>
[ Upstream commit b08217a257215ed9130fce93d35feba66b49bf0a ]
When enabling runtime PM for clock suppliers that also belong to a power domain, the following crash is thrown:
error: synchronous external abort: 0000000096000010 [#1] PREEMPT SMP
Workqueue: events_unbound deferred_probe_work_func pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : clk_mux_get_parent+0x60/0x90 lr : clk_core_reparent_orphans_nolock+0x58/0xd8 Call trace: clk_mux_get_parent+0x60/0x90 clk_core_reparent_orphans_nolock+0x58/0xd8 of_clk_add_hw_provider.part.0+0x90/0x100 of_clk_add_hw_provider+0x1c/0x38 imx95_bc_probe+0x2e0/0x3f0 platform_probe+0x70/0xd8
Enabling runtime PM without explicitly resuming the device caused the power domain cut off after clk_register() is called. As a result, a crash happens when the clock hardware provider is added and attempts to access the BLK_CTL register.
Fix this by using devm_pm_runtime_enable() instead of pm_runtime_enable() and getting rid of the pm_runtime_disable() in the cleanup path.
--- drivers/clk/imx/clk-imx95-blk-ctl.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/clk/imx/clk-imx95-blk-ctl.c +7 -6
@@ -323,8 +323,10 @@ static int imx95_bc_probe(struct platform_device *pdev)if (!clk_hw_data)return -ENOMEM ; -if (bc_data->rpm_enabled) -pm_runtime_enable (&pdev->dev); +if (bc_data->rpm_enabled) { +devm_pm_runtime_enable (&pdev->dev); +pm_runtime_resume_and_get (&pdev->dev); + } clk_hw_data->num = bc_data->num_clks; hws = clk_hw_data->hws;
@@ -364,8 +366,10 @@ static int imx95_bc_probe(struct platform_device *pdev) goto cleanup; } -if (pm_runtime_enabled (bc->dev)) +if (pm_runtime_enabled (bc->dev)) { +pm_runtime_put_sync (&pdev->dev);clk_disable_unprepare (bc->clk_apb); + }return 0 ;
@@ -376,9 +380,6 @@ static int imx95_bc_probe(struct platform_device *pdev)clk_hw_unregister (hws[i]); } -if (bc_data->rpm_enabled) -pm_runtime_disable (&pdev->dev); -return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 214/369 remoteproc: xlnx: Disable unsupported features
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tanmay Shah <[email protected]>
[ Upstream commit 699cdd706290208d47bd858a188b030df2e90357 ]
AMD-Xilinx platform driver does not support iommu or recovery mechanism yet. Disable both features in platform driver.
--- drivers/remoteproc/xlnx_r5_remoteproc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/remoteproc/xlnx_r5_remoteproc.c +2 -0
@@ -906,6 +906,8 @@ static struct zynqmp_r5_core *zynqmp_r5_add_rproc_core(struct device *cdev)rproc_coredump_set_elf_info (r5_rproc,ELFCLASS32 ,EM_ARM ); + r5_rproc->recovery_disabled = true; + r5_rproc->has_iommu = false; r5_rproc->auto_boot = false; r5_core = r5_rproc->priv; r5_core->dev = cdev;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 215/369 fs/orangefs: Allow 2 more characters in do_c_string()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 2138e89cb066b40386b1d9ddd61253347d356474 ]
The do_k_string() and do_c_string() functions do essentially the same thing which is they add a string and a comma onto the end of an existing string. At the end, the caller will overwrite the last comma with a newline. Later, in orangefs_kernel_debug_init(), we add a newline to the string.
The change to do_k_string() is just cosmetic. I moved the "- 1" to the other side of the comparison and made it "+ 1". This has no effect on runtime, I just wanted the functions to match each other and the rest of the file.
However in do_c_string(), I removed the "- 2" which allows us to print two extra characters. I noticed this issue while reviewing the code and I doubt affects anything in real life. My guess is that this was double counting the comma and the newline. The "+ 1" accounts for the newline, and the caller will delete the final comma which ensures there is enough space for the newline.
Removing the "- 2" lets us print 2 more characters, but mainly it makes the code more consistent and understandable for reviewers.
--- fs/orangefs/orangefs-debugfs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/orangefs/orangefs-debugfs.c +3 -3
@@ -728,8 +728,8 @@ static void do_k_string(void *k_mask, int index)if (*mask & s_kmod_keyword_mask_map[index].mask_val) {if ((strlen (kernel_debug_string) + -strlen (s_kmod_keyword_mask_map[index].keyword)) - <ORANGEFS_MAX_DEBUG_STRING_LEN -1 ) { +strlen (s_kmod_keyword_mask_map[index].keyword) +1 ) + <ORANGEFS_MAX_DEBUG_STRING_LEN ) {strcat (kernel_debug_string, s_kmod_keyword_mask_map[index].keyword);strcat (kernel_debug_string,"," );
@@ -756,7 +756,7 @@ static void do_c_string(void *c_mask, int index) (mask->mask2 & cdm_array[index].mask2)) {if ((strlen (client_debug_string) +strlen (cdm_array[index].keyword) +1 ) - <ORANGEFS_MAX_DEBUG_STRING_LEN -2 ) { + <ORANGEFS_MAX_DEBUG_STRING_LEN ) {strcat (client_debug_string, cdm_array[index].keyword);strcat (client_debug_string,"," );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 216/369 dmaengine: mv_xor: Fix missing check after DMA map and missing unmap
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 60095aca6b471b7b7a79c80b7395f7e4e414b479 ]
The DMA map functions can fail and should be tested for errors.
In case of error, unmap the already mapped regions.
--- drivers/dma/mv_xor.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/dma/mv_xor.c +19 -2
@@ -1061,8 +1061,16 @@ mv_xor_channel_add(struct mv_xor_device *xordev,*/ mv_chan->dummy_src_addr =dma_map_single (dma_dev->dev, mv_chan->dummy_src,MV_XOR_MIN_BYTE_COUNT ,DMA_FROM_DEVICE ); +if (dma_mapping_error (dma_dev->dev, mv_chan->dummy_src_addr)) +return ERR_PTR (-ENOMEM ); + mv_chan->dummy_dst_addr =dma_map_single (dma_dev->dev, mv_chan->dummy_dst,MV_XOR_MIN_BYTE_COUNT ,DMA_TO_DEVICE ); +if (dma_mapping_error (dma_dev->dev, mv_chan->dummy_dst_addr)) { + ret = -ENOMEM ; + goto err_unmap_src; + } +/* allocate coherent memory for hardware descriptors * note: writecombine gives slightly better performance, but
@@ -1071,8 +1079,10 @@ mv_xor_channel_add(struct mv_xor_device *xordev, mv_chan->dma_desc_pool_virt =dma_alloc_wc (&pdev->dev,MV_XOR_POOL_SIZE , &mv_chan->dma_desc_pool,GFP_KERNEL ); -if (!mv_chan->dma_desc_pool_virt) -return ERR_PTR (-ENOMEM ); +if (!mv_chan->dma_desc_pool_virt) { + ret = -ENOMEM ; + goto err_unmap_dst; + }/* discover transaction capabilities from the platform data */ dma_dev->cap_mask = cap_mask;
@@ -1155,6 +1165,13 @@ mv_xor_channel_add(struct mv_xor_device *xordev, err_free_dma:dma_free_coherent (&pdev->dev,MV_XOR_POOL_SIZE , mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool); +err_unmap_dst: +dma_unmap_single (dma_dev->dev, mv_chan->dummy_dst_addr, +MV_XOR_MIN_BYTE_COUNT ,DMA_TO_DEVICE ); +err_unmap_src: +dma_unmap_single (dma_dev->dev, mv_chan->dummy_src_addr, +MV_XOR_MIN_BYTE_COUNT ,DMA_FROM_DEVICE ); +return ERR_PTR (ret); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 217/369 dmaengine: nbpfaxi: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit c6ee78fc8f3e653bec427cfd06fec7877ee782bd ]
The DMA map functions can fail and should be tested for errors. If the mapping fails, unmap and return an error.
--- drivers/dma/nbpfaxi.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/dma/nbpfaxi.c +13 -0
@@ -711,6 +711,9 @@ static int nbpf_desc_page_alloc(struct nbpf_channel *chan)list_add_tail (&ldesc->node, &lhead); ldesc->hwdesc_dma_addr =dma_map_single (dchan->device->dev, hwdesc,sizeof (*hwdesc),DMA_TO_DEVICE ); +if (dma_mapping_error (dchan->device->dev, + ldesc->hwdesc_dma_addr)) + goto unmap_error;dev_dbg (dev,"%s(): mapped 0x%p to %pad\n" , __func__, hwdesc, &ldesc->hwdesc_dma_addr);
@@ -737,6 +740,16 @@ static int nbpf_desc_page_alloc(struct nbpf_channel *chan)spin_unlock_irq (&chan->lock);return ARRAY_SIZE (dpage->desc); + +unmap_error: +while (i--) { + ldesc--; hwdesc--; + +dma_unmap_single (dchan->device->dev, ldesc->hwdesc_dma_addr, +sizeof (hwdesc),DMA_TO_DEVICE ); + } + +return -ENOMEM ; }static void nbpf_desc_put (struct nbpf_desc *desc)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 218/369 ASoC: fsl_xcvr: get channel status data when PHY is not exists
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit ca592e20659e0304ebd8f4dabb273da4f9385848 ]
There is no PHY for the XCVR module on i.MX93, the channel status needs to be obtained from FSL_XCVR_RX_CS_DATA_* registers. And channel status acknowledge (CSA) bit should be set once channel status is processed.
--- sound/soc/fsl/fsl_xcvr.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
sound/soc/fsl/fsl_xcvr.c +20 -0
@@ -1239,6 +1239,26 @@ static irqreturn_t irq0_isr(int irq, void *devid)/* clear CS control register */ memset_io (reg_ctrl,0 ,sizeof (val)); } + }else { +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_0 , + (u32 *)&xcvr->rx_iec958.status[0 ]); +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_1 , + (u32 *)&xcvr->rx_iec958.status[4 ]); +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_2 , + (u32 *)&xcvr->rx_iec958.status[8 ]); +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_3 , + (u32 *)&xcvr->rx_iec958.status[12 ]); +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_4 , + (u32 *)&xcvr->rx_iec958.status[16 ]); +regmap_read (xcvr->regmap,FSL_XCVR_RX_CS_DATA_5 , + (u32 *)&xcvr->rx_iec958.status[20 ]); +for (i =0 ; i <6 ; i++) { + val = *(u32 *)(xcvr->rx_iec958.status + i *4 ); + *(u32 *)(xcvr->rx_iec958.status + i *4 ) = +bitrev32 (val); + } +regmap_set_bits (xcvr->regmap,FSL_XCVR_RX_DPTH_CTRL , +FSL_XCVR_RX_DPTH_CTRL_CSA ); } }if (isr &FSL_XCVR_IRQ_NEW_UD ) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 219/369 sh: Do not use hyphen in exported variable name
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
[ Upstream commit c32969d0362a790fbc6117e0b6a737a7e510b843 ]
arch/sh/Makefile defines and exports ld-bfd to be used by arch/sh/boot/compressed/Makefile and arch/sh/boot/romimage/Makefile. However some shells, including dash, will not pass through environment variables whose name includes a hyphen. Usually GNU make does not use a shell to recurse, but if e.g. $(srctree) contains '~' it will use a shell here.
Other instances of this problem were previously fixed by commits 2bfbe7881ee0 "kbuild: Do not use hyphen in exported variable name" and 82977af93a0d "sh: rename suffix-y to suffix_y".
Rename the variable to ld_bfd.
References: https://buildd.debian.org/status/fetch.php?pkg=linux&arch=sh4&ver=4.13%7Erc5-1%7Eexp1&stamp=1502943967&raw=0
--- arch/sh/Makefile | 10 +++++----- arch/sh/boot/compressed/Makefile | 4 ++-- arch/sh/boot/romimage/Makefile | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-)
arch/sh/Makefile +5 -5
@@ -103,16 +103,16 @@ UTS_MACHINE := sh LDFLAGS_vmlinux += -e _stext ifdef CONFIG_CPU_LITTLE_ENDIAN -ld-bfd := elf32-sh-linux -LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld-bfd) +ld_bfd := elf32-sh-linux +LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld_bfd) KBUILD_LDFLAGS += -EL else -ld-bfd := elf32-shbig-linux -LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld-bfd) +ld_bfd := elf32-shbig-linux +LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld_bfd) KBUILD_LDFLAGS += -EB endif -export ld-bfd +export ld_bfd # Mach groups machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se
arch/sh/boot/compressed/Makefile +2 -2
@@ -27,7 +27,7 @@ endif ccflags-remove-$(CONFIG_MCOUNT) += -pg -LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \ +LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(IMAGE_OFFSET) -e startup \ -T $(obj)/../../kernel/vmlinux.lds KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
@@ -51,7 +51,7 @@ $(obj)/vmlinux.bin.lzo: $(obj)/vmlinux.bin FORCE OBJCOPYFLAGS += -R .empty_zero_page -LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T +LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix_y) FORCE $(call if_changed,ld)
arch/sh/boot/romimage/Makefile +2 -2
@@ -13,7 +13,7 @@ mmcif-obj-$(CONFIG_CPU_SUBTYPE_SH7724) := $(obj)/mmcif-sh7724.o load-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-load-y) obj-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-obj-y) -LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(load-y) -e romstart \ +LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(load-y) -e romstart \ -T $(obj)/../../kernel/vmlinux.lds $(obj)/vmlinux: $(obj)/head.o $(obj-y) $(obj)/piggy.o FORCE
@@ -24,7 +24,7 @@ OBJCOPYFLAGS += -j .empty_zero_page $(obj)/zeropage.bin: vmlinux FORCE $(call if_changed,objcopy) -LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T +LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/zeropage.bin arch/sh/boot/zImage FORCE $(call if_changed,ld)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 220/369 perf tools: Remove libtraceevent in .gitignore
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Pei <[email protected]>
[ Upstream commit af470fb532fc803c4c582d15b4bd394682a77a15 ]
The libtraceevent has been removed from the source tree, and .gitignore needs to be updated as well.
--- tools/perf/.gitignore | 2 -- 1 file changed, 2 deletions(-)
tools/perf/.gitignore +0 -2
@@ -48,8 +48,6 @@ libbpf/ libperf/ libsubcmd/ libsymbol/ -libtraceevent/ -libtraceevent_plugins/ fixdep Documentation/doc.dep python_ext_build/
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 221/369 crypto: qat - fix DMA direction for compression on GEN2 devices
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit d41d75fe1b751ee6b347bf1cb1cfe9accc4fcb12 ]
QAT devices perform an additional integrity check during compression by decompressing the output. Starting from QAT GEN4, this verification is done in-line by the hardware. However, on GEN2 devices, the hardware reads back the compressed output from the destination buffer and performs a decompression operation using it as the source.
In the current QAT driver, destination buffers are always marked as write-only. This is incorrect for QAT GEN2 compression, where the buffer is also read during verification. Since commit 6f5dc7658094 ("iommu/vt-d: Restore WO permissions on second-level paging entries"), merged in v6.16-rc1, write-only permissions are strictly enforced, leading to DMAR errors when using QAT GEN2 devices for compression, if VT-d is enabled.
Mark the destination buffers as DMA_BIDIRECTIONAL. This ensures compatibility with GEN2 devices, even though it is not required for QAT GEN4 and later.
--- drivers/crypto/intel/qat/qat_common/qat_bl.c | 6 +++--- drivers/crypto/intel/qat/qat_common/qat_compression.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/crypto/intel/qat/qat_common/qat_bl.c +3 -3
@@ -38,7 +38,7 @@ void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,for (i =0 ; i < blout->num_mapped_bufs; i++) {dma_unmap_single (dev, blout->buffers[i].addr, blout->buffers[i].len, -DMA_FROM_DEVICE ); +DMA_BIDIRECTIONAL ); }dma_unmap_single (dev, blpout, sz_out,DMA_TO_DEVICE );
@@ -162,7 +162,7 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev, } buffers[y].addr =dma_map_single (dev,sg_virt (sg) + left, sg->length - left, -DMA_FROM_DEVICE ); +DMA_BIDIRECTIONAL );if (unlikely (dma_mapping_error (dev, buffers[y].addr))) goto err_out; buffers[y].len = sg->length;
@@ -204,7 +204,7 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,if (!dma_mapping_error (dev, buflout->buffers[i].addr))dma_unmap_single (dev, buflout->buffers[i].addr, buflout->buffers[i].len, -DMA_FROM_DEVICE ); +DMA_BIDIRECTIONAL ); }if (!buf->sgl_dst_valid)
drivers/crypto/intel/qat/qat_common/qat_compression.c +2 -2
@@ -205,7 +205,7 @@ static int qat_compression_alloc_dc_data(struct adf_accel_dev *accel_dev)if (!obuff) goto err; - obuff_p =dma_map_single (dev, obuff, ovf_buff_sz,DMA_FROM_DEVICE ); + obuff_p =dma_map_single (dev, obuff, ovf_buff_sz,DMA_BIDIRECTIONAL );if (unlikely (dma_mapping_error (dev, obuff_p))) goto err;
@@ -233,7 +233,7 @@ static void qat_free_dc_data(struct adf_accel_dev *accel_dev)return ;dma_unmap_single (dev, dc_data->ovf_buff_p, dc_data->ovf_buff_sz, -DMA_FROM_DEVICE ); +DMA_BIDIRECTIONAL );kfree_sensitive (dc_data->ovf_buff);kfree (dc_data); accel_dev->dc_data =NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 222/369 crypto: qat - fix seq_file position update in adf_ring_next()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 6908c5f4f066a0412c3d9a6f543a09fa7d87824b ]
The adf_ring_next() function in the QAT debug transport interface fails to correctly update the position index when reaching the end of the ring elements. This triggers the following kernel warning when reading ring files, such as /sys/kernel/debug/qat_c6xx_<D:B:D:F>/transport/bank_00/ring_00:
[27725.022965] seq_file: buggy .next function adf_ring_next [intel_qat] did not update position index
Ensure that the *pos index is incremented before returning NULL when after the last element in the ring is found, satisfying the seq_file API requirements and preventing the warning.
--- drivers/crypto/intel/qat/qat_common/adf_transport_debug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/crypto/intel/qat/qat_common/adf_transport_debug.c +3 -1
@@ -31,8 +31,10 @@ static void *adf_ring_next(struct seq_file *sfile, void *v, loff_t *pos)struct adf_etr_ring_data *ring = sfile->private;if (*pos >= (ADF_SIZE_TO_RING_SIZE_IN_BYTES (ring->ring_size) / -ADF_MSG_SIZE_TO_BYTES (ring->msg_size))) +ADF_MSG_SIZE_TO_BYTES (ring->msg_size))) { + (*pos)++;return NULL ; + }return ring->base_addr + (ADF_MSG_SIZE_TO_BYTES (ring->msg_size) * (*pos)++);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 223/369 fbdev: imxfb: Check fb_add_videomode to prevent null-ptr-deref
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenyuan Yang <[email protected]>
[ Upstream commit da11e6a30e0bb8e911288bdc443b3dc8f6a7cac7 ]
fb_add_videomode() can fail with -ENOMEM when its internal kmalloc() cannot allocate a struct fb_modelist. If that happens, the modelist stays empty but the driver continues to register. Add a check for its return value to prevent poteintial null-ptr-deref, which is similar to the commit 17186f1f90d3 ("fbdev:
Fix do_register_framebuffer to prevent null-ptr-deref in fb_videomode_to_var").
--- drivers/video/fbdev/imxfb.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/video/fbdev/imxfb.c +7 -2
@@ -1007,8 +1007,13 @@ static int imxfb_probe(struct platform_device *pdev) info->fix.smem_start = fbi->map_dma;INIT_LIST_HEAD (&info->modelist); -for (i =0 ; i < fbi->num_modes; i++) -fb_add_videomode (&fbi->mode[i].mode, &info->modelist); +for (i =0 ; i < fbi->num_modes; i++) { + ret =fb_add_videomode (&fbi->mode[i].mode, &info->modelist); +if (ret) { +dev_err (&pdev->dev,"Failed to add videomode\n" ); + goto failed_cmap; + } + }/* * This makes sure that our colour bitfield
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 224/369 jfs: fix metapage reference count leak in dbAllocCtl
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Yu <[email protected]>
[ Upstream commit 856db37592021e9155384094e331e2d4589f28b1 ]
In dbAllocCtl(), read_metapage() increases the reference count of the metapage. However, when dp->tree.budmin < 0, the function returns -EIO without calling release_metapage() to decrease the reference count, leading to a memory leak.
Add release_metapage(mp) before the error return to properly manage the metapage reference count and prevent the leak.
--- fs/jfs/jfs_dmap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/jfs/jfs_dmap.c +3 -1
@@ -1809,8 +1809,10 @@ dbAllocCtl(struct bmap * bmp, s64 nblocks, int l2nb, s64 blkno, s64 * results)return -EIO ; dp = (struct dmap *) mp->data; -if (dp->tree.budmin <0 ) +if (dp->tree.budmin <0 ) { +release_metapage (mp);return -EIO ; + }/* try to allocate the blocks. */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 225/369 mtd: rawnand: atmel: Fix dma_mapping_error() address
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit e1e6b933c56b1e9fda93caa0b8bae39f3f421e5c ]
It seems like what was intended is to test if the dma_map of the previous line failed but the wrong dma address was passed.
Rule: add
--- drivers/mtd/nand/raw/atmel/nand-controller.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/atmel/nand-controller.c +1 -1
@@ -373,7 +373,7 @@ static int atmel_nand_dma_transfer(struct atmel_nand_controller *nc,dma_cookie_t cookie; buf_dma =dma_map_single (nc->dev, buf, len, dir); -if (dma_mapping_error (nc->dev, dev_dma)) { +if (dma_mapping_error (nc->dev, buf_dma)) {dev_err (nc->dev,"Failed to prepare a buffer for DMA access\n" ); goto err;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 226/369 mtd: rawnand: rockchip: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 3b36f86dc47261828f96f826077131a35dd825fd ]
The DMA map functions can fail and should be tested for errors.
--- drivers/mtd/nand/raw/rockchip-nand-controller.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/mtd/nand/raw/rockchip-nand-controller.c +15 -0
@@ -656,9 +656,16 @@ static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf, dma_data =dma_map_single (nfc->dev, (void *)nfc->page_buf, mtd->writesize,DMA_TO_DEVICE ); +if (dma_mapping_error (nfc->dev, dma_data)) +return -ENOMEM ; + dma_oob =dma_map_single (nfc->dev, nfc->oob_buf, ecc->steps * oob_step,DMA_TO_DEVICE ); +if (dma_mapping_error (nfc->dev, dma_oob)) { +dma_unmap_single (nfc->dev, dma_data, mtd->writesize,DMA_TO_DEVICE ); +return -ENOMEM ; + }reinit_completion (&nfc->done);writel (INT_DMA , nfc->regs + nfc->cfg->int_en_off);
@@ -772,9 +779,17 @@ static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *buf, int oob_on, dma_data =dma_map_single (nfc->dev, nfc->page_buf, mtd->writesize,DMA_FROM_DEVICE ); +if (dma_mapping_error (nfc->dev, dma_data)) +return -ENOMEM ; + dma_oob =dma_map_single (nfc->dev, nfc->oob_buf, ecc->steps * oob_step,DMA_FROM_DEVICE ); +if (dma_mapping_error (nfc->dev, dma_oob)) { +dma_unmap_single (nfc->dev, dma_data, mtd->writesize, +DMA_FROM_DEVICE ); +return -ENOMEM ; + }/* * The first blocks (4, 8 or 16 depending on the device)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 227/369 mtd: rawnand: atmel: set pmecc data setup time
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Balamanikandan Gunasundar <[email protected]>
[ Upstream commit f552a7c7e0a14215cb8a6fd89e60fa3932a74786 ]
Setup the pmecc data setup time as 3 clock cycles for 133MHz as recommended by the datasheet.
--- drivers/mtd/nand/raw/atmel/pmecc.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/mtd/nand/raw/atmel/pmecc.c +6 -0
@@ -143,6 +143,7 @@ struct atmel_pmecc_caps {int nstrengths;int el_offset;bool correct_erased_chunks; +bool clk_ctrl; };struct atmel_pmecc {
@@ -843,6 +844,10 @@ static struct atmel_pmecc *atmel_pmecc_create(struct platform_device *pdev,if (IS_ERR (pmecc->regs.errloc))return ERR_CAST (pmecc->regs.errloc); +/* pmecc data setup time */ +if (caps->clk_ctrl) +writel (PMECC_CLK_133MHZ , pmecc->regs.base +ATMEL_PMECC_CLK ); +/* Disable all interrupts before registering the PMECC handler. */ writel (0xffffffff , pmecc->regs.base +ATMEL_PMECC_IDR );atmel_pmecc_reset (pmecc);
@@ -896,6 +901,7 @@ static struct atmel_pmecc_caps at91sam9g45_caps = { .strengths = atmel_pmecc_strengths, .nstrengths = 5, .el_offset = 0x8c, + .clk_ctrl = true, };static struct atmel_pmecc_caps sama5d4_caps = {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 228/369 drm/xe/vf: Disable CSC support on VF
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukasz Laguna <[email protected]>
[ Upstream commit f62408efc8669b82541295a4611494c8c8c52684 ]
CSC is not accessible by VF drivers, so disable its support flag on VF to prevent further initialization attempts.
--- drivers/gpu/drm/xe/xe_device.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/xe/xe_device.c +1 -0
@@ -549,6 +549,7 @@ static void update_device_info(struct xe_device *xe)/* disable features that are not available/applicable to VFs */ if (IS_SRIOV_VF (xe)) { xe->info.probe_display =0 ; + xe->info.has_heci_cscfi =0 ; xe->info.has_heci_gscfi =0 ; xe->info.skip_guc_pc =1 ; xe->info.skip_pcode =1 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 229/369 selftests: ALSA: fix memory leak in utimer test
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangYuli <[email protected]>
[ Upstream commit 6260da046819b7bda828bacae148fc8856fdebd7 ]
Free the malloc'd buffer in TEST_F(timer_f, utimer) to prevent memory leak.
--- tools/testing/selftests/alsa/utimer-test.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/alsa/utimer-test.c +1 -0
@@ -135,6 +135,7 @@ TEST_F(timer_f, utimer) {pthread_join (ticking_thread,NULL );ASSERT_EQ (total_ticks,TICKS_COUNT );pclose (rfp); +free (buf); }TEST (wrong_timers_test) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 230/369 perf record: Cache build-ID of hit DSOs only
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 6235ce77749f45cac27f630337e2fdf04e8a6c73 ]
It post-processes samples to find which DSO has samples. Based on that info, it can save used DSOs in the build-ID cache directory. But for some reason, it saves all DSOs without checking the hit mark. Skipping unused DSOs can give some speedup especially with --buildid-mmap being default.
On my idle machine, time perf record -a sleep 1 goes down from 3 sec to 1.5 sec with this change.
--- tools/perf/util/build-id.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/build-id.c +1 -1
@@ -864,7 +864,7 @@ static int dso__cache_build_id(struct dso *dso, struct machine *machine,char *allocated_name =NULL ;int ret =0 ; -if (!dso__has_build_id (dso)) +if (!dso__has_build_id (dso) || !dso__hit (dso))return 0 ;if (dso__is_kcore (dso)) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 231/369 vdpa/mlx5: Fix needs_teardown flag calculation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit 6f0f3d7fc4e05797b801ded4910a64d16db230e9 ]
needs_teardown is a device flag that indicates when virtual queues need to be recreated. This happens for certain configuration changes: queue size and some specific features.
Currently, the needs_teardown state can be incorrectly reset by subsequent .set_vq_num() calls. For example, for 1 rx VQ with size 512 and 1 tx VQ with size 256:
.set_vq_num(0, 512) -> sets needs_teardown to true (rx queue has a
non-default size)
.set_vq_num(1, 256) -> sets needs_teardown to false (tx queue has a
default size)
This change takes into account the previous value of the needs_teardown flag when re-calculating it during VQ size configuration.
Message-Id: <[email protected]>
--- drivers/vdpa/mlx5/net/mlx5_vnet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vdpa/mlx5/net/mlx5_vnet.c +1 -1
@@ -2491,7 +2491,7 @@ static void mlx5_vdpa_set_vq_num(struct vdpa_device *vdev, u16 idx, u32 num) } mvq = &ndev->vqs[idx]; - ndev->needs_teardown = num != mvq->num_ent; + ndev->needs_teardown |= num != mvq->num_ent; mvq->num_ent = num; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 232/369 vhost-scsi: Fix log flooding with target does not exist errors
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Christie <[email protected]>
[ Upstream commit 69cd720a8a5e9ef0f05ce5dd8c9ea6e018245c82 ]
As part of the normal initiator side scanning the guest's scsi layer will loop over all possible targets and send an inquiry. Since the max number of targets for virtio-scsi is 256, this can result in 255 error messages about targets not existing if you only have a single target. When there's more than 1 vhost-scsi device each with a single target, then you get N * 255 log messages.
It looks like the log message was added by accident in:
commit 3f8ca2e115e5 ("vhost/scsi: Extract common handling code from control queue handler")
when we added common helpers. Then in:
commit 09d7583294aa ("vhost/scsi: Use common handling code in request queue handler")
we converted the scsi command processing path to use the new helpers so we started to see the extra log messages during scanning.
The patches were just making some code common but added the vq_err call and I'm guessing the patch author forgot to enable the vq_err call (vq_err is implemented by pr_debug which defaults to off). So this patch removes the call since it's expected to hit this path during device discovery.
Message-Id: <[email protected]>
--- drivers/vhost/scsi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/vhost/scsi.c +1 -3
@@ -1088,10 +1088,8 @@ vhost_scsi_get_req(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc,/* validated at handler entry */ vs_tpg =vhost_vq_get_backend (vq); tpg =READ_ONCE (vs_tpg[*vc->target]); -if (unlikely (!tpg)) { -vq_err (vq,"Target 0x%x does not exist\n" , *vc->target); +if (unlikely (!tpg)) goto out; - } }if (tpgp)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 233/369 vdpa/mlx5: Fix release of uninitialized resources on error path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit cc51a66815999afb7e9cd845968de4fdf07567b7 ]
The commit in the fixes tag made sure that mlx5_vdpa_free() is the single entrypoint for removing the vdpa device resources added in mlx5_vdpa_dev_add(), even in the cleanup path of mlx5_vdpa_dev_add().
This means that all functions from mlx5_vdpa_free() should be able to handle uninitialized resources. This was not the case though:mlx5_vdpa_destroy_mr_resources() and mlx5_cmd_cleanup_async_ctx() were not able to do so. This caused the splat below when adding a vdpa device without a MAC address.
This patch fixes these remaining issues:
- Makes mlx5_vdpa_destroy_mr_resources() return early if called on uninitialized resources.
- Moves mlx5_cmd_init_async_ctx() early on during device addition because it can't fail. This means that mlx5_cmd_cleanup_async_ctx() also can't fail. To mirror this, move the call site of mlx5_cmd_cleanup_async_ctx() in mlx5_vdpa_free().
An additional comment was added in mlx5_vdpa_free() to document the expectations of functions called from this context.
Splat:
mlx5_core 0000:b5:03.2: mlx5_vdpa_dev_add:3950:(pid 2306) warning: No mac address provisioned?
------------[ cut here ]------------ WARNING: CPU: 13 PID: 2306 at kernel/workqueue.c:4207 __flush_work+0x9a/0xb0 [...] Call Trace: <TASK> ? __try_to_del_timer_sync+0x61/0x90 ? __timer_delete_sync+0x2b/0x40 mlx5_vdpa_destroy_mr_resources+0x1c/0x40 [mlx5_vdpa] mlx5_vdpa_free+0x45/0x160 [mlx5_vdpa] vdpa_release_dev+0x1e/0x50 [vdpa] device_release+0x31/0x90 kobject_cleanup+0x37/0x130 mlx5_vdpa_dev_add+0x327/0x890 [mlx5_vdpa] vdpa_nl_cmd_dev_add_set_doit+0x2c1/0x4d0 [vdpa] genl_family_rcv_msg_doit+0xd8/0x130 genl_family_rcv_msg+0x14b/0x220 ? __pfx_vdpa_nl_cmd_dev_add_set_doit+0x10/0x10 [vdpa] genl_rcv_msg+0x47/0xa0 ? __pfx_genl_rcv_msg+0x10/0x10 netlink_rcv_skb+0x53/0x100 genl_rcv+0x24/0x40 netlink_unicast+0x27b/0x3b0 netlink_sendmsg+0x1f7/0x430 __sys_sendto+0x1fa/0x210 ? ___pte_offset_map+0x17/0x160 ? next_uptodate_folio+0x85/0x2b0 ? percpu_counter_add_batch+0x51/0x90 ? filemap_map_pages+0x515/0x660 __x64_sys_sendto+0x20/0x30 do_syscall_64+0x7b/0x2c0 ? do_read_fault+0x108/0x220 ? do_pte_missing+0x14a/0x3e0 ? __handle_mm_fault+0x321/0x730 ? count_memcg_events+0x13f/0x180 ? handle_mm_fault+0x1fb/0x2d0 ? do_user_addr_fault+0x20c/0x700 ? syscall_exit_work+0x104/0x140 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7f0c25b0feca [...] ---[ end trace 0000000000000000 ]---
Message-Id: <[email protected]>
--- drivers/vdpa/mlx5/core/mr.c | 3 +++ drivers/vdpa/mlx5/net/mlx5_vnet.c | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-)
drivers/vdpa/mlx5/core/mr.c +3 -0
@@ -908,6 +908,9 @@ void mlx5_vdpa_destroy_mr_resources(struct mlx5_vdpa_dev *mvdev) {struct mlx5_vdpa_mr_resources *mres = &mvdev->mres; +if (!mres->wq_gc) +return ; +atomic_set (&mres->shutdown,1 );flush_delayed_work (&mres->gc_dwork_ent);
drivers/vdpa/mlx5/net/mlx5_vnet.c +6 -4
@@ -3432,15 +3432,17 @@ static void mlx5_vdpa_free(struct vdpa_device *vdev) ndev =to_mlx5_vdpa_ndev (mvdev); +/* Functions called here should be able to work with +* uninitialized resources. +*/ free_fixed_resources (ndev);mlx5_vdpa_clean_mrs (mvdev);mlx5_vdpa_destroy_mr_resources (&ndev->mvdev); -mlx5_cmd_cleanup_async_ctx (&mvdev->async_ctx); -if (!is_zero_ether_addr (ndev->config.mac)) { pfmdev =pci_get_drvdata (pci_physfn (mvdev->mdev->pdev));mlx5_mpfs_del_mac (pfmdev, ndev->config.mac); } +mlx5_cmd_cleanup_async_ctx (&mvdev->async_ctx);mlx5_vdpa_free_resources (&ndev->mvdev);free_irqs (ndev);kfree (ndev->event_cbs);
@@ -3888,6 +3890,8 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, mvdev->actual_features = (device_features &BIT_ULL (VIRTIO_F_VERSION_1 )); +mlx5_cmd_init_async_ctx (mdev, &mvdev->async_ctx); + ndev->vqs =kcalloc (max_vqs,sizeof (*ndev->vqs),GFP_KERNEL ); ndev->event_cbs =kcalloc (max_vqs +1 ,sizeof (*ndev->event_cbs),GFP_KERNEL );if (!ndev->vqs || !ndev->event_cbs) {
@@ -3960,8 +3964,6 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, ndev->rqt_size =1 ; } -mlx5_cmd_init_async_ctx (mdev, &mvdev->async_ctx); - ndev->mvdev.mlx_features = device_features; mvdev->vdev.dma_dev = &mdev->pdev->dev; err =mlx5_vdpa_alloc_resources (&ndev->mvdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 234/369 vdpa: Fix IDR memory leak in VDUSE module exit
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anders Roxell <[email protected]>
[ Upstream commit d9ea58b5dc6b4b50fbb6a10c73f840e8b10442b7 ]
Add missing idr_destroy() call in vduse_exit() to properly free the vduse_idr radix tree nodes. Without this, module load/unload cycles leak 576-byte radix tree node allocations, detectable by kmemleak as:
unreferenced object (size 576):
backtrace:
[<ffffffff81234567>] radix_tree_node_alloc+0xa0/0xf0
[<ffffffff81234568>] idr_get_free+0x128/0x280The vduse_idr is initialized via DEFINE_IDR() at line 136 and used throughout the VDUSE (vDPA Device in Userspace) driver for device ID management. The fix follows the documented pattern in lib/idr.c and matches the cleanup approach used by other drivers.
This leak was discovered through comprehensive module testing with cumulative kmemleak detection across 10 load/unload iterations per module.
Message-Id: <[email protected]>
--- drivers/vdpa/vdpa_user/vduse_dev.c | 1 + 1 file changed, 1 insertion(+)
drivers/vdpa/vdpa_user/vduse_dev.c +1 -0
@@ -2215,6 +2215,7 @@ static void vduse_exit(void)cdev_del (&vduse_ctrl_cdev);unregister_chrdev_region (vduse_major,VDUSE_DEV_MAX );class_unregister (&vduse_class); +idr_destroy (&vduse_idr); }module_exit (vduse_exit);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 235/369 vhost: Reintroduce kthread API and add mode selection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cindy Lu <[email protected]>
[ Upstream commit 7d9896e9f6d02d8aa85e63f736871f96c59a5263 ]
Since commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads"), the vhost uses vhost_task and operates as a child of the owner thread. This is required for correct CPU usage accounting, especially when using containers.
However, this change has caused confusion for some legacy userspace applications, and we didn't notice until it's too late.
Unfortunately, it's too late to revert - we now have userspace depending both on old and new behaviour :(
To address the issue, reintroduce kthread mode for vhost workers and provide a configuration to select between kthread and task worker.
- Add 'fork_owner' parameter to vhost_dev to let users select kthread or task mode. Default mode is task mode(VHOST_FORK_OWNER_TASK).
- Reintroduce kthread mode support:
* Bring back the original vhost_worker() implementation, and renamed to vhost_run_work_kthread_list().
* Add cgroup support for the kthread
* Introduce struct vhost_worker_ops:
- Encapsulates create / stop / wake‑up callbacks.
- vhost_worker_create() selects the proper ops according to inherit_owner.
- Userspace configuration interface:
* New IOCTLs:
- VHOST_SET_FORK_FROM_OWNER lets userspace select task mode (VHOST_FORK_OWNER_TASK) or kthread mode (VHOST_FORK_OWNER_KTHREAD)
- VHOST_GET_FORK_FROM_OWNER reads the current worker mode
* Expose module parameter 'fork_from_owner_default' to allow system administrators to configure the default mode for vhost workers
* Kconfig option CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL controls whether these IOCTLs and the parameter are available
- The VHOST_NEW_WORKER functionality requires fork_owner to be set to true, with validation added to ensure proper configuration
This partially reverts or improves upon:
commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads") commit 1cdaafa1b8b4 ("vhost: replace single worker pointer with xarray")
Message-Id: <[email protected]>
--- drivers/vhost/Kconfig | 18 +++ drivers/vhost/vhost.c | 244 ++++++++++++++++++++++++++++++++++--- drivers/vhost/vhost.h | 22 ++++ include/uapi/linux/vhost.h | 29 +++++ 4 files changed, 295 insertions(+), 18 deletions(-)
drivers/vhost/Kconfig +18 -0
@@ -94,4 +94,22 @@ config VHOST_CROSS_ENDIAN_LEGACY If unsure, say "N". +config VHOST_ENABLE_FORK_OWNER_CONTROL + bool "Enable VHOST_ENABLE_FORK_OWNER_CONTROL" + default y + help + This option enables two IOCTLs: VHOST_SET_FORK_FROM_OWNER and + VHOST_GET_FORK_FROM_OWNER. These allow userspace applications + to modify the vhost worker mode for vhost devices. + + Also expose module parameter 'fork_from_owner_default' to allow users + to configure the default mode for vhost workers. + + By default, `VHOST_ENABLE_FORK_OWNER_CONTROL` is set to `y`, + users can change the worker thread mode as needed. + If this config is disabled (n),the related IOCTLs and parameters will + be unavailable. + + If unsure, say "Y". + endif
drivers/vhost/vhost.c +226 -18
330 lines not on this page · raw message
drivers/vhost/vhost.h +22 -0
@@ -26,7 +26,18 @@ struct vhost_work {unsigned long flags; }; +struct vhost_worker ; +struct vhost_dev ; + +struct vhost_worker_ops { +int (*create)(struct vhost_worker *worker,struct vhost_dev *dev, +const char *name); +void (*stop)(struct vhost_worker *worker); +void (*wakeup)(struct vhost_worker *worker); +}; +struct vhost_worker { +struct task_struct *kthread_task;struct vhost_task *vtsk;struct vhost_dev *dev;/* Used to serialize device wide flushing with worker swapping. */
@@ -36,6 +47,7 @@ struct vhost_worker {u32 id;int attachment_cnt;bool killed; +const struct vhost_worker_ops *ops; };/* Poll a file (eventfd or socket) */
@@ -176,6 +188,16 @@ struct vhost_dev {int byte_weight;struct xarray worker_xa;bool use_worker; +/* +* If fork_owner is true we use vhost_tasks to create +* the worker so all settings/limits like cgroups, NPROC, +* scheduler, etc are inherited from the owner. If false, +* we use kthreads and only attach to the same cgroups +* as the owner for compat with older kernels. +* here we use true as default value. +* The default value is set by fork_from_owner_default +*/ +bool fork_owner;int (*msg_handler)(struct vhost_dev *dev,u32 asid,struct vhost_iotlb_msg *msg); };
include/uapi/linux/vhost.h +29 -0
@@ -235,4 +235,33 @@*/ #define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x82, \ struct vhost_vring_state) + +/* fork_owner values for vhost */ +#define VHOST_FORK_OWNER_KTHREAD 0 +#define VHOST_FORK_OWNER_TASK 1 + +/** +* VHOST_SET_FORK_FROM_OWNER - Set the fork_owner flag for the vhost device, +* This ioctl must called before VHOST_SET_OWNER. +* Only available when CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y +* +* @param fork_owner: An 8-bit value that determines the vhost thread mode +* +* When fork_owner is set to VHOST_FORK_OWNER_TASK(default value): +* - Vhost will create vhost worker as tasks forked from the owner, +* inheriting all of the owner's attributes. +* +* When fork_owner is set to VHOST_FORK_OWNER_KTHREAD: +* - Vhost will create vhost workers as kernel threads. +*/ +#define VHOST_SET_FORK_FROM_OWNER _IOW(VHOST_VIRTIO, 0x83, __u8) + +/** +* VHOST_GET_FORK_OWNER - Get the current fork_owner flag for the vhost device. +* Only available when CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y +* +* @return: An 8-bit value indicating the current thread mode. +*/ +#define VHOST_GET_FORK_FROM_OWNER _IOR(VHOST_VIRTIO, 0x84, __u8) +#endif
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 236/369 bpf: Check flow_dissector ctx accesses are aligned
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Chaignon <[email protected]>
[ Upstream commit ead3d7b2b6afa5ee7958620c4329982a7d9c2b78 ]
flow_dissector_is_valid_access doesn't check that the context access is aligned. As a consequence, an unaligned access within one of the exposed field is considered valid and later rejected by flow_dissector_convert_ctx_access when we try to convert it.
The later rejection is problematic because it's reported as a verifier bug with a kernel warning and doesn't point to the right instruction in verifier logs.
--- net/core/filter.c | 3 +++ 1 file changed, 3 insertions(+)
net/core/filter.c +3 -0
@@ -9407,6 +9407,9 @@ static bool flow_dissector_is_valid_access(int off, int size,if (off <0 || off >=sizeof (struct __sk_buff ))return false; +if (off % size !=0 ) +return false; +if (type ==BPF_WRITE )return false;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 237/369 bpf: Check netfilter ctx accesses are aligned
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Chaignon <[email protected]>
[ Upstream commit 9e6448f7b1efb27f8d508b067ecd33ed664a4246 ]
Similarly to the previous patch fixing the flow_dissector ctx accesses, nf_is_valid_access also doesn't check that ctx accesses are aligned. Contrary to flow_dissector programs, netfilter programs don't have context conversion. The unaligned ctx accesses are therefore allowed by the verifier.
--- net/netfilter/nf_bpf_link.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/nf_bpf_link.c +3 -0
@@ -295,6 +295,9 @@ static bool nf_is_valid_access(int off, int size, enum bpf_access_type type,if (off <0 || off >=sizeof (struct bpf_nf_ctx ))return false; +if (off % size !=0 ) +return false; +if (type ==BPF_WRITE )return false;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 238/369 apparmor: ensure WB_HISTORY_SIZE value is a power of 2
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryan Lee <[email protected]>
[ Upstream commit 6c055e62560b958354625604293652753d82bcae ]
WB_HISTORY_SIZE was defined to be a value not a power of 2, despite a comment in the declaration of struct match_workbuf stating it is and a modular arithmetic usage in the inc_wb_pos macro assuming that it is. Bump WB_HISTORY_SIZE's value up to 32 and add a BUILD_BUG_ON_NOT_POWER_OF_2 line to ensure that any future changes to the value of WB_HISTORY_SIZE respect this requirement.
--- security/apparmor/include/match.h | 3 ++- security/apparmor/match.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
security/apparmor/include/match.h +2 -1
@@ -135,7 +135,8 @@ aa_state_t aa_dfa_matchn_until(struct aa_dfa *dfa, aa_state_t start,void aa_dfa_free_kref (struct kref *kref); -#define WB_HISTORY_SIZE 24 +/* This needs to be a power of 2 */ +#define WB_HISTORY_SIZE 32struct match_workbuf {unsigned int count;unsigned int pos;
security/apparmor/match.c +1 -0
@@ -626,6 +626,7 @@ aa_state_t aa_dfa_matchn_until(struct aa_dfa *dfa, aa_state_t start,#define inc_wb_pos (wb) \ do { \ + BUILD_BUG_ON_NOT_POWER_OF_2(WB_HISTORY_SIZE); \ wb->pos = (wb->pos + 1) & (WB_HISTORY_SIZE - 1); \ wb->len = (wb->len + 1) & (WB_HISTORY_SIZE - 1); \ } while (0)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 239/369 apparmor: fix loop detection used in conflicting attachment resolution
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryan Lee <[email protected]>
[ Upstream commit a88db916b8c77552f49f7d9f8744095ea01a268f ]
Conflicting attachment resolution is based on the number of states traversed to reach an accepting state in the attachment DFA, accounting for DFA loops traversed during the matching process. However, the loop counting logic had multiple bugs:
- The inc_wb_pos macro increments both position and length, but length is supposed to saturate upon hitting buffer capacity, instead of wrapping around.
- If no revisited state is found when traversing the history, is_loop would still return true, as if there was a loop found the length of the history buffer, instead of returning false and signalling that no loop was found. As a result, the adjustment step of aa_dfa_leftmatch would sometimes produce negative counts with loop- free DFAs that traversed enough states.
- The iteration in the is_loop for loop is supposed to stop before i = wb->len, so the conditional should be < instead of <=.
This patch fixes the above bugs as well as the following nits:
- The count and size fields in struct match_workbuf were not used, so they can be removed.
- The history buffer in match_workbuf semantically stores aa_state_t and not unsigned ints, even if aa_state_t is currently unsigned int.
- The local variables in is_loop are counters, and thus should be unsigned ints instead of aa_state_t's.
--- security/apparmor/include/match.h | 5 +---- security/apparmor/match.c | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-)
security/apparmor/include/match.h +1 -4
@@ -138,15 +138,12 @@ void aa_dfa_free_kref(struct kref *kref);/* This needs to be a power of 2 */ #define WB_HISTORY_SIZE 32struct match_workbuf { -unsigned int count;unsigned int pos;unsigned int len; -unsigned int size;/* power of 2, same as history size */ -unsigned int history[WB_HISTORY_SIZE ]; +aa_state_t history[WB_HISTORY_SIZE ]; };#define DEFINE_MATCH_WB (N ) \ struct match_workbuf N = { \ - .count = 0, \ .pos = 0, \ .len = 0, \ }
security/apparmor/match.c +11 -11
@@ -624,35 +624,35 @@ aa_state_t aa_dfa_matchn_until(struct aa_dfa *dfa, aa_state_t start,return state; } -#define inc_wb_pos (wb) \ -do { \ +#define inc_wb_pos (wb) \ +do { \ BUILD_BUG_ON_NOT_POWER_OF_2(WB_HISTORY_SIZE); \ wb->pos = (wb->pos + 1) & (WB_HISTORY_SIZE - 1); \ - wb->len = (wb->len + 1) & (WB_HISTORY_SIZE - 1); \ + wb->len = (wb->len + 1) > WB_HISTORY_SIZE ? WB_HISTORY_SIZE : \ + wb->len + 1; \ } while (0)/* For DFAs that don't support extended tagging of states */ +/* adjust is only set if is_loop returns true */ static bool is_loop (struct match_workbuf *wb,aa_state_t state,unsigned int *adjust) { -aa_state_t pos = wb->pos; -aa_state_t i; +int pos = wb->pos; +int i;if (wb->history[pos] < state)return false; -for (i =0 ; i <= wb->len; i++) { +for (i =0 ; i < wb->len; i++) {if (wb->history[pos] == state) { *adjust = i;return true; } -if (pos ==0 ) - pos =WB_HISTORY_SIZE ; - pos--; +/* -1 wraps to WB_HISTORY_SIZE - 1 */ + pos = (pos -1 ) & (WB_HISTORY_SIZE -1 ); } - *adjust = i; -return true; +return false; } static aa_state_t leftmatch_fb(struct aa_dfa *dfa, aa_state_t start,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 240/369 apparmor: Fix unaligned memory accesses in KUnit test
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit c68804199dd9d63868497a27b5da3c3cd15356db ]
The testcase triggers some unnecessary unaligned memory accesses on the
parisc architecture:
Kernel: unaligned access to 0x12f28e27 in policy_unpack_test_init+0x180/0x374 (iir 0x0cdc1280)
Kernel: unaligned access to 0x12f28e67 in policy_unpack_test_init+0x270/0x374 (iir 0x64dc00ce)
Use the existing helper functions put_unaligned_le32() and put_unaligned_le16() to avoid such warnings on architectures which prefer aligned memory accesses.
--- security/apparmor/policy_unpack_test.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
security/apparmor/policy_unpack_test.c +4 -2
@@ -9,6 +9,8 @@#include "include/policy.h" #include "include/policy_unpack.h" +#include <linux/unaligned.h> +#define TEST_STRING_NAME "TEST_STRING"#define TEST_STRING_DATA "testing"#define TEST_STRING_BUF_OFFSET \
@@ -80,7 +82,7 @@ static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf, *(buf +1 ) =strlen (TEST_U32_NAME ) +1 ;strscpy (buf +3 ,TEST_U32_NAME , e->end - (void *)(buf +3 )); *(buf +3 +strlen (TEST_U32_NAME ) +1 ) =AA_U32 ; - *((__le32 *)(buf +3 +strlen (TEST_U32_NAME ) +2 )) =cpu_to_le32 (TEST_U32_DATA ); +put_unaligned_le32 (TEST_U32_DATA , buf +3 +strlen (TEST_U32_NAME ) +2 ); buf = e->start +TEST_NAMED_U64_BUF_OFFSET ; *buf =AA_NAME ;
@@ -103,7 +105,7 @@ static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf, *(buf +1 ) =strlen (TEST_ARRAY_NAME ) +1 ;strscpy (buf +3 ,TEST_ARRAY_NAME , e->end - (void *)(buf +3 )); *(buf +3 +strlen (TEST_ARRAY_NAME ) +1 ) =AA_ARRAY ; - *((__le16 *)(buf +3 +strlen (TEST_ARRAY_NAME ) +2 )) =cpu_to_le16 (TEST_ARRAY_SIZE ); +put_unaligned_le16 (TEST_ARRAY_SIZE , buf +3 +strlen (TEST_ARRAY_NAME ) +2 );return e; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 241/369 module: Restore the moduleparam prefix length check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Pavlu <[email protected]>
[ Upstream commit bdc877ba6b7ff1b6d2ebeff11e63da4a50a54854 ]
The moduleparam code allows modules to provide their own definition of MODULE_PARAM_PREFIX, instead of using the default KBUILD_MODNAME ".".
Commit 730b69d22525 ("module: check kernel param length at compile time, not runtime") added a check to ensure the prefix doesn't exceed MODULE_NAME_LEN, as this is what param_sysfs_builtin() expects.
Later, commit 58f86cc89c33 ("VERIFY_OCTAL_PERMISSIONS: stricter checking for sysfs perms.") removed this check, but there is no indication this was intentional.
Since the check is still useful for param_sysfs_builtin() to function properly, reintroduce it in __module_param_call(), but in a modernized form using static_assert().
While here, clean up the __module_param_call() comments. In particular, remove the comment "Default value instead of permissions?", which comes from commit 9774a1f54f17 ("[PATCH] Compile-time check re world-writeable module params"). This comment was related to the test variable __param_perm_check_##name, which was removed in the previously mentioned commit 58f86cc89c33.
--- include/linux/moduleparam.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
include/linux/moduleparam.h +2 -3
@@ -282,10 +282,9 @@ struct kparam_array#define __moduleparam_const const#endif -/* This is the fundamental function for registering boot/module -parameters. */ +/* This is the fundamental function for registering boot/module parameters. */ #define __module_param_call (prefix, name, ops, arg, perm, level, flags) \ -/* Default value instead of permissions? */ \ + static_assert(sizeof(""prefix) - 1 <= MAX_PARAM_PREFIX_LEN); \ static const char __param_str_##name[] = prefix #name; \ static struct kernel_param __moduleparam_const __param_##name \ __used __section("__param") \
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 242/369 ucount: fix atomic_long_inc_below() argument type
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uros Bizjak <[email protected]>
[ Upstream commit f8cd9193b62e92ad25def5370ca8ea2bc7585381 ]
The type of u argument of atomic_long_inc_below() should be long to avoid unwanted truncation to int.
The patch fixes the wrong argument type of an internal function to prevent unwanted argument truncation. It fixes an internal locking primitive; it should not have any direct effect on userspace.
Mark said
: AFAICT there's no problem in practice because atomic_long_inc_below() : is only used by inc_ucount(), and it looks like the value is : constrained between 0 and INT_MAX.
:
: In inc_ucount() the limit value is taken from
: user_namespace::ucount_max[], and AFAICT that's only written by : sysctls, to the table setup by setup_userns_sysctls(), where : UCOUNT_ENTRY() limits the value between 0 and INT_MAX.
:
: This is certainly a cleanup, but there might be no functional issue in : practice as above.
--- kernel/ucount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/ucount.c +1 -1
@@ -212,7 +212,7 @@ void put_ucounts(struct ucounts *ucounts) } } -static inline bool atomic_long_inc_below (atomic_long_t *v,int u) +static inline bool atomic_long_inc_below (atomic_long_t *v,long u) {long c, old; c =atomic_long_read (v);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 243/369 rtc: ds1307: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit cf6eb547a24af7ad7bbd2abe9c5327f956bbeae8 ]
When ds3231_clk_sqw_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-ds1307.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-ds1307.c +1 -1
@@ -1466,7 +1466,7 @@ static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,return ds3231_clk_sqw_rates[i]; } -return 0 ; +return ds3231_clk_sqw_rates[ARRAY_SIZE (ds3231_clk_sqw_rates) -1 ]; } static int ds3231_clk_sqw_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 244/369 rtc: hym8563: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit d0a518eb0a692a2ab8357e844970660c5ea37720 ]
When hym8563_clkout_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-hym8563.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-hym8563.c +1 -1
@@ -294,7 +294,7 @@ static long hym8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate,if (clkout_rates[i] <= rate)return clkout_rates[i]; -return 0 ; +return clkout_rates[0 ]; } static int hym8563_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 245/369 rtc: nct3018y: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit 437c59e4b222cd697b4cf95995d933e7d583c5f1 ]
When nct3018y_clkout_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-nct3018y.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-nct3018y.c +1 -1
@@ -376,7 +376,7 @@ static long nct3018y_clkout_round_rate(struct clk_hw *hw, unsigned long rate,if (clkout_rates[i] <= rate)return clkout_rates[i]; -return 0 ; +return clkout_rates[0 ]; } static int nct3018y_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 246/369 rtc: pcf85063: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit 186ae1869880e58bb3f142d222abdb35ecb4df0f ]
When pcf85063_clkout_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-pcf85063.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-pcf85063.c +1 -1
@@ -410,7 +410,7 @@ static long pcf85063_clkout_round_rate(struct clk_hw *hw, unsigned long rate,if (clkout_rates[i] <= rate)return clkout_rates[i]; -return 0 ; +return clkout_rates[0 ]; } static int pcf85063_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 247/369 rtc: pcf8563: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit 906726a5efeefe0ef0103ccff5312a09080c04ae ]
When pcf8563_clkout_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-pcf8563.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-pcf8563.c +1 -1
@@ -386,7 +386,7 @@ static long pcf8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate,if (clkout_rates[i] <= rate)return clkout_rates[i]; -return 0 ; +return clkout_rates[0 ]; } static int pcf8563_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 248/369 rtc: rv3028: fix incorrect maximum clock rate handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit b574acb3cf7591d2513a9f29f8c2021ad55fb881 ]
When rv3028_clkout_round_rate() is called with a requested rate higher than the highest supported rate, it currently returns 0, which disables the clock. According to the clk API, round_rate() should instead return the highest supported rate. Update the function to return the maximum supported rate in this case.
--- drivers/rtc/rtc-rv3028.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-rv3028.c +1 -1
@@ -738,7 +738,7 @@ static long rv3028_clkout_round_rate(struct clk_hw *hw, unsigned long rate,if (clkout_rates[i] <= rate)return clkout_rates[i]; -return 0 ; +return clkout_rates[0 ]; } static int rv3028_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 249/369 f2fs: turn off one_time when forcibly set to foreground GC
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit 8142daf8a53806689186ee255cc02f89af7f8890 ]
one_time mode is only for background GC. So, we need to set it back to false when foreground GC is enforced.
--- fs/f2fs/gc.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/gc.c +1 -0
@@ -1899,6 +1899,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)/* Let's run FG_GC, if we don't have enough space. */ if (has_not_enough_free_secs (sbi,0 ,0 )) { gc_type =FG_GC ; + gc_control->one_time = false;/* * For example, if there are many prefree_segments below given
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 250/369 f2fs: fix bio memleak when committing super block
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sheng Yong <[email protected]>
[ Upstream commit 554d9b7242a73d701ce121ac81bb578a3fca538e ]
When committing new super block, bio is allocated but not freed, and kmemleak complains:
unreferenced object 0xffff88801d185600 (size 192):
comm "kworker/3:2", pid 128, jiffies 4298624992
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 80 67 c3 00 81 88 ff ff .........g......
01 08 06 00 00 00 00 00 00 00 00 00 01 00 00 00 ................
backtrace (crc 650ecdb1):
kmem_cache_alloc_noprof+0x3a9/0x460
mempool_alloc_noprof+0x12f/0x310
bio_alloc_bioset+0x1e2/0x7e0
__f2fs_commit_super+0xe0/0x370
f2fs_commit_super+0x4ed/0x8c0
f2fs_record_error_work+0xc7/0x190
process_one_work+0x7db/0x1970
worker_thread+0x518/0xea0
kthread+0x359/0x690
ret_from_fork+0x34/0x70
ret_from_fork_asm+0x1a/0x30The issue can be reproduced by:
mount /dev/vda /mnt
i=0
while :; do
echo '[h]abc' > /sys/fs/f2fs/vda/extension_list
echo '[h]!abc' > /sys/fs/f2fs/vda/extension_list
echo scan > /sys/kernel/debug/kmemleak
dmesg | grep "new suspected memory leaks"
[ $? -eq 0 ] && break
i=$((i + 1))
echo "$i"
done
umount /mnt--- fs/f2fs/super.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/super.c +1 -0
@@ -3388,6 +3388,7 @@ static int __f2fs_commit_super(struct f2fs_sb_info *sbi, struct folio *folio,f2fs_bug_on (sbi,1 ); ret =submit_bio_wait (bio); +bio_put (bio);folio_end_writeback (folio);return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 251/369 f2fs: fix KMSAN uninit-value in extent_info usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abinash Singh <[email protected]>
[ Upstream commit 154467f4ad033473e5c903a03e7b9bca7df9a0fa ]
KMSAN reported a use of uninitialized value in __is_extent_mergeable()
and __is_back_mergeable() via the read extent tree path.
The root cause is that get_read_extent_info() only initializes three fields (fofs, blk, len) of struct extent_info, leaving the remaining fields uninitialized. This leads to undefined behavior when those fields are accessed later, especially during extent merging.
Fix it by zero-initializing the extent_info struct before population.
--- fs/f2fs/extent_cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/extent_cache.c +1 -1
@@ -381,7 +381,7 @@ void f2fs_init_read_extent_tree(struct inode *inode, struct page *ipage)struct f2fs_extent *i_ext = &F2FS_INODE (ipage)->i_ext;struct extent_tree *et;struct extent_node *en; -struct extent_info ei; +struct extent_info ei = {0 };if (!__may_extent_tree (inode,EX_READ )) {/* drop largest read extent */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 252/369 f2fs: fix to check upper boundary for value of gc_boost_zoned_gc_percent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: yohan.joung <[email protected]>
[ Upstream commit 10dcaa56ef93f2a45e4c3fec27d8e1594edad110 ]
to check the upper boundary when setting gc_boost_zoned_gc_percent
--- fs/f2fs/sysfs.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/f2fs/sysfs.c +7 -0
@@ -623,6 +623,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"gc_boost_zoned_gc_percent" )) { +if (t >100 ) +return -EINVAL ; + *ui = (unsigned int )t; +return count; + } +#ifdef CONFIG_F2FS_IOSTAT if (!strcmp (a->attr.name,"iostat_enable" )) { sbi->iostat_enable = !!t;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 253/369 f2fs: fix to check upper boundary for gc_valid_thresh_ratio
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 7a96d1d73ce9de5041e891a623b722f900651561 ]
This patch adds missing upper boundary check while setting gc_valid_thresh_ratio via sysfs.
--- fs/f2fs/sysfs.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/f2fs/sysfs.c +7 -0
@@ -630,6 +630,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"gc_valid_thresh_ratio" )) { +if (t >100 ) +return -EINVAL ; + *ui = (unsigned int )t; +return count; + } +#ifdef CONFIG_F2FS_IOSTAT if (!strcmp (a->attr.name,"iostat_enable" )) { sbi->iostat_enable = !!t;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 254/369 f2fs: fix to check upper boundary for gc_no_zoned_gc_percent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit a919ae794ad2dc6d04b3eea2f9bc86332c1630cc ]
This patch adds missing upper boundary check while setting gc_no_zoned_gc_percent via sysfs.
--- fs/f2fs/sysfs.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/f2fs/sysfs.c +7 -0
@@ -623,6 +623,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"gc_no_zoned_gc_percent" )) { +if (t >100 ) +return -EINVAL ; + *ui = (unsigned int )t; +return count; + } +if (!strcmp (a->attr.name,"gc_boost_zoned_gc_percent" )) {if (t >100 )return -EINVAL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 255/369 f2fs: doc: fix wrong quota mount option description
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 81b6ecca2f15922e8d653dc037df5871e754be6e ]
We should use "{usr,grp,prj}jquota=" to disable journaled quota, rather than using off{usr,grp,prj}jquota.
--- Documentation/filesystems/f2fs.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
Documentation/filesystems/f2fs.rst +3 -3
@@ -235,9 +235,9 @@ usrjquota=<file> Appoint specified file and type during mount, so that quota grpjquota=<file> information can be properly updated during recovery flow, prjjquota=<file> <quota file>: must be in root directory; jqfmt=<quota type> <quota type>: [vfsold,vfsv0,vfsv1]. -offusrjquota Turn off user journalled quota. -offgrpjquota Turn off group journalled quota. -offprjjquota Turn off project journalled quota. +usrjquota= Turn off user journalled quota. +grpjquota= Turn off group journalled quota. +prjjquota= Turn off project journalled quota. quota Enable plain user disk quota accounting. noquota Disable all plain disk quota option. alloc_mode=%s Adjust block allocation policy, which supports "reuse"
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 256/369 f2fs: fix to avoid UAF in f2fs_sync_inode_meta()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 7c30d79930132466f5be7d0b57add14d1a016bda ]
syzbot reported an UAF issue as below: [1] [2]
[1] https://syzkaller.appspot.com/text?tag=CrashReport&x=16594c60580000
==================================================================
BUG: KASAN: use-after-free in __list_del_entry_valid+0xa6/0x130 lib/list_debug.c:62 Read of size 8 at addr ffff888100567dc8 by task kworker/u4:0/8 CPU: 1 PID: 8 Comm: kworker/u4:0 Tainted: G W 6.1.129-syzkaller-00017-g642656a36791 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025 Workqueue: writeback wb_workfn (flush-7:0) Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x151/0x1b7 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:316 [inline] print_report+0x158/0x4e0 mm/kasan/report.c:427 kasan_report+0x13c/0x170 mm/kasan/report.c:531 __asan_report_load8_noabort+0x14/0x20 mm/kasan/report_generic.c:351 __list_del_entry_valid+0xa6/0x130 lib/list_debug.c:62 __list_del_entry include/linux/list.h:134 [inline] list_del_init include/linux/list.h:206 [inline] f2fs_inode_synced+0x100/0x2e0 fs/f2fs/super.c:1553 f2fs_update_inode+0x72/0x1c40 fs/f2fs/inode.c:588 f2fs_update_inode_page+0x135/0x170 fs/f2fs/inode.c:706 f2fs_write_inode+0x416/0x790 fs/f2fs/inode.c:734 write_inode fs/fs-writeback.c:1460 [inline] __writeback_single_inode+0x4cf/0xb80 fs/fs-writeback.c:1677 writeback_sb_inodes+0xb32/0x1910 fs/fs-writeback.c:1903 __writeback_inodes_wb+0x118/0x3f0 fs/fs-writeback.c:1974 wb_writeback+0x3da/0xa00 fs/fs-writeback.c:2081 wb_check_background_flush fs/fs-writeback.c:2151 [inline] wb_do_writeback fs/fs-writeback.c:2239 [inline] wb_workfn+0xbba/0x1030 fs/fs-writeback.c:2266 process_one_work+0x73d/0xcb0 kernel/workqueue.c:2299 worker_thread+0xa60/0x1260 kernel/workqueue.c:2446 kthread+0x26d/0x300 kernel/kthread.c:386 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295 </TASK> Allocated by task 298: kasan_save_stack mm/kasan/common.c:45 [inline] kasan_set_track+0x4b/0x70 mm/kasan/common.c:52 kasan_save_alloc_info+0x1f/0x30 mm/kasan/generic.c:505 __kasan_slab_alloc+0x6c/0x80 mm/kasan/common.c:333 kasan_slab_alloc include/linux/kasan.h:202 [inline] slab_post_alloc_hook+0x53/0x2c0 mm/slab.h:768 slab_alloc_node mm/slub.c:3421 [inline] slab_alloc mm/slub.c:3431 [inline] __kmem_cache_alloc_lru mm/slub.c:3438 [inline] kmem_cache_alloc_lru+0x102/0x270 mm/slub.c:3454 alloc_inode_sb include/linux/fs.h:3255 [inline] f2fs_alloc_inode+0x2d/0x350 fs/f2fs/super.c:1437 alloc_inode fs/inode.c:261 [inline] iget_locked+0x18c/0x7e0 fs/inode.c:1373 f2fs_iget+0x55/0x4ca0 fs/f2fs/inode.c:486 f2fs_lookup+0x3c1/0xb50 fs/f2fs/namei.c:484 __lookup_slow+0x2b9/0x3e0 fs/namei.c:1689 lookup_slow+0x5a/0x80 fs/namei.c:1706 walk_component+0x2e7/0x410 fs/namei.c:1997 lookup_last fs/namei.c:2454 [inline] path_lookupat+0x16d/0x450 fs/namei.c:2478 filename_lookup+0x251/0x600 fs/namei.c:2507 vfs_statx+0x107/0x4b0 fs/stat.c:229 vfs_fstatat fs/stat.c:267 [inline] vfs_lstat include/linux/fs.h:3434 [inline] __do_sys_newlstat fs/stat.c:423 [inline] __se_sys_newlstat+0xda/0x7c0 fs/stat.c:417 __x64_sys_newlstat+0x5b/0x70 fs/stat.c:417 x64_sys_call+0x52/0x9a0 arch/x86/include/generated/asm/syscalls_64.h:7 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x3b/0x80 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x68/0xd2 Freed by task 0: kasan_save_stack mm/kasan/common.c:45 [inline] kasan_set_track+0x4b/0x70 mm/kasan/common.c:52 kasan_save_free_info+0x2b/0x40 mm/kasan/generic.c:516 ____kasan_slab_free+0x131/0x180 mm/kasan/common.c:241 __kasan_slab_free+0x11/0x20 mm/kasan/common.c:249 kasan_slab_free include/linux/kasan.h:178 [inline] slab_free_hook mm/slub.c:1745 [inline] slab_free_freelist_hook mm/slub.c:1771 [inline] slab_free mm/slub.c:3686 [inline] kmem_cache_free+0x291/0x560 mm/slub.c:3711 f2fs_free_inode+0x24/0x30 fs/f2fs/super.c:1584 i_callback+0x4b/0x70 fs/inode.c:250 rcu_do_batch+0x552/0xbe0 kernel/rcu/tree.c:2297 rcu_core+0x502/0xf40 kernel/rcu/tree.c:2557 rcu_core_si+0x9/0x10 kernel/rcu/tree.c:2574 handle_softirqs+0x1db/0x650 kernel/softirq.c:624 __do_softirq kernel/softirq.c:662 [inline] invoke_softirq kernel/softirq.c:479 [inline] __irq_exit_rcu+0x52/0xf0 kernel/softirq.c:711 irq_exit_rcu+0x9/0x10 kernel/softirq.c:723 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1118 [inline] sysvec_apic_timer_interrupt+0xa9/0xc0 arch/x86/kernel/apic/apic.c:1118 asm_sysvec_apic_timer_interrupt+0x1b/0x20 arch/x86/include/asm/idtentry.h:691 Last potentially related work creation: kasan_save_stack+0x3b/0x60 mm/kasan/common.c:45 __kasan_record_aux_stack+0xb4/0xc0 mm/kasan/generic.c:486 kasan_record_aux_stack_noalloc+0xb/0x10 mm/kasan/generic.c:496 __call_rcu_common kernel/rcu/tree.c:2807 [inline] call_rcu+0xdc/0x10f0 kernel/rcu/tree.c:2926 destroy_inode fs/inode.c:316 [inline] evict+0x87d/0x930 fs/inode.c:720 iput_final fs/inode.c:1834 [inline] iput+0x616/0x690 fs/inode.c:1860 do_unlinkat+0x4e1/0x920 fs/namei.c:4396 __do_sys_unlink fs/namei.c:4437 [inline] __se_sys_unlink fs/namei.c:4435 [inline] __x64_sys_unlink+0x49/0x50 fs/namei.c:4435 x64_sys_call+0x289/0x9a0 arch/x86/include/generated/asm/syscalls_64.h:88 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x3b/0x80 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x68/0xd2 The buggy address belongs to the object at ffff888100567a10 which belongs to the cache f2fs_inode_cache of size 1360
The buggy address is located 952 bytes inside of
1360-byte region [ffff888100567a10, ffff888100567f60)
The buggy address belongs to the physical page: page:ffffea0004015800 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x100560 head:ffffea0004015800 order:3 compound_mapcount:0 compound_pincount:0 flags: 0x4000000000010200(slab|head|zone=1) raw: 4000000000010200 0000000000000000 dead000000000122 ffff8881002c4d80 raw: 0000000000000000 0000000080160016 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 3, migratetype Reclaimable, gfp_mask 0xd2050(__GFP_IO|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_RECLAIMABLE), pid 298, tgid 298 (syz-executor330), ts 26489303743, free_ts 0 set_page_owner include/linux/page_owner.h:33 [inline] post_alloc_hook+0x213/0x220 mm/page_alloc.c:2637 prep_new_page+0x1b/0x110 mm/page_alloc.c:2644 get_page_from_freelist+0x3a98/0x3b10 mm/page_alloc.c:4539 __alloc_pages+0x234/0x610 mm/page_alloc.c:5837 alloc_slab_page+0x6c/0xf0 include/linux/gfp.h:-1 allocate_slab mm/slub.c:1962 [inline] new_slab+0x90/0x3e0 mm/slub.c:2015 ___slab_alloc+0x6f9/0xb80 mm/slub.c:3203 __slab_alloc+0x5d/0xa0 mm/slub.c:3302 slab_alloc_node mm/slub.c:3387 [inline] slab_alloc mm/slub.c:3431 [inline] __kmem_cache_alloc_lru mm/slub.c:3438 [inline] kmem_cache_alloc_lru+0x149/0x270 mm/slub.c:3454 alloc_inode_sb include/linux/fs.h:3255 [inline] f2fs_alloc_inode+0x2d/0x350 fs/f2fs/super.c:1437 alloc_inode fs/inode.c:261 [inline] iget_locked+0x18c/0x7e0 fs/inode.c:1373 f2fs_iget+0x55/0x4ca0 fs/f2fs/inode.c:486 f2fs_fill_super+0x5360/0x6dc0 fs/f2fs/super.c:4488 mount_bdev+0x282/0x3b0 fs/super.c:1445 f2fs_mount+0x34/0x40 fs/f2fs/super.c:4743 legacy_get_tree+0xf1/0x190 fs/fs_context.c:632
page_owner free stack trace missing
Memory state around the buggy address:
ffff888100567c80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888100567d00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff888100567d80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff888100567e00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888100567e80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================[2] https://syzkaller.appspot.com/text?tag=CrashLog&x=13654c60580000
[ 24.675720][ T28] audit: type=1400 audit(1745327318.732:72): avc: denied { write } for pid=298 comm="syz-executor399" name="/" dev="loop0" ino=3 scontext=root:sysadm_r:sysadm_t tcontext=system_u:object_r:unlabeled_t tclass=dir permissive=1
[ 24.705426][ T296] ------------[ cut here ]------------
[ 24.706608][ T28] audit: type=1400 audit(1745327318.732:73): avc: denied { remove_name } for pid=298 comm="syz-executor399" name="file0" dev="loop0" ino=4 scontext=root:sysadm_r:sysadm_t tcontext=system_u:object_r:unlabeled_t tclass=dir permissive=1
[ 24.711550][ T296] WARNING: CPU: 0 PID: 296 at fs/f2fs/inode.c:847 f2fs_evict_inode+0x1262/0x1540
[ 24.734141][ T28] audit: type=1400 audit(1745327318.732:74): avc: denied { rename } for pid=298 comm="syz-executor399" name="file0" dev="loop0" ino=4 scontext=root:sysadm_r:sysadm_t tcontext=system_u:object_r:unlabeled_t tclass=dir permissive=1
[ 24.742969][ T296] Modules linked in:
[ 24.765201][ T28] audit: type=1400 audit(1745327318.732:75): avc: denied { add_name } for pid=298 comm="syz-executor399" name="bus" scontext=root:sysadm_r:sysadm_t tcontext=system_u:object_r:unlabeled_t tclass=dir permissive=1
[ 24.768847][ T296] CPU: 0 PID: 296 Comm: syz-executor399 Not tainted 6.1.129-syzkaller-00017-g642656a36791 #0
[ 24.799506][ T296] Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025
[ 24.809401][ T296] RIP: 0010:f2fs_evict_inode+0x1262/0x1540
[ 24.815018][ T296] Code: 34 70 4a ff eb 0d e8 2d 70 4a ff 4d 89 e5 4c 8b 64 24 18 48 8b 5c 24 28 4c 89 e7 e8 78 38 03 00 e9 84 fc ff ff e8 0e 70 4a ff <0f> 0b 4c 89 f7 be 08 00 00 00 e8 7f 21 92 ff f0 41 80 0e 04 e9 61
[ 24.834584][ T296] RSP: 0018:ffffc90000db7a40 EFLAGS: 00010293
[ 24.840465][ T296] RAX: ffffffff822aca42 RBX: 0000000000000002 RCX: ffff888110948000
[ 24.848291][ T296] RDX: 0000000000000000 RSI: 0000000000000002 RDI: 0000000000000000
[ 24.856064][ T296] RBP: ffffc90000db7bb0 R08: ffffffff822ac6a8 R09: ffffed10200b005d
[ 24.864073][ T296] R10: 0000000000000000 R11: dffffc0000000001 R12: ffff888100580000
[ 24.871812][ T296] R13: dffffc0000000000 R14: ffff88810fef4078 R15: 1ffff920001b6f5cThe root cause is w/ a fuzzed image, f2fs may missed to clear FI_DIRTY_INODE flag for target inode, after f2fs_evict_inode(), the inode is still linked in sbi->inode_list[DIRTY_META] global list, once it triggers checkpoint, f2fs_sync_inode_meta() may access the released inode.
In f2fs_evict_inode(), let's always call f2fs_inode_synced() to clear FI_DIRTY_INODE flag and drop inode from global dirty list to avoid this UAF issue.
--- fs/f2fs/inode.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
fs/f2fs/inode.c +6 -2
@@ -918,8 +918,12 @@ void f2fs_evict_inode(struct inode *inode)if (likely (!f2fs_cp_error (sbi) && !is_sbi_flag_set (sbi,SBI_CP_DISABLED )))f2fs_bug_on (sbi,is_inode_flag_set (inode,FI_DIRTY_INODE )); -else -f2fs_inode_synced (inode); + +/* +* anyway, it needs to remove the inode from sbi->inode_list[DIRTY_META] +* list to avoid UAF in f2fs_sync_inode_meta() during checkpoint. +*/ +f2fs_inode_synced (inode);/* for the case f2fs_new_inode() was failed, .i_ino is zero, skip it */ if (inode->i_ino)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 257/369 f2fs: fix to avoid panic in f2fs_evict_inode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit a509a55f8eecc8970b3980c6f06886bbff0e2f68 ]
As syzbot [1] reported as below:
R10: 0000000000000100 R11: 0000000000000206 R12: 00007ffe17473450
R13: 00007f28b1c10854 R14: 000000000000dae5 R15: 00007ffe17474520
</TASK> ---[ end trace 0000000000000000 ]--- ================================================================== BUG: KASAN: use-after-free in __list_del_entry_valid+0xa6/0x130 lib/list_debug.c:62 Read of size 8 at addr ffff88812d962278 by task syz-executor/564 CPU: 1 PID: 564 Comm: syz-executor Tainted: G W 6.1.129-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025 Call Trace: <TASK> __dump_stack+0x21/0x24 lib/dump_stack.c:88 dump_stack_lvl+0xee/0x158 lib/dump_stack.c:106 print_address_description+0x71/0x210 mm/kasan/report.c:316 print_report+0x4a/0x60 mm/kasan/report.c:427 kasan_report+0x122/0x150 mm/kasan/report.c:531 __asan_report_load8_noabort+0x14/0x20 mm/kasan/report_generic.c:351 __list_del_entry_valid+0xa6/0x130 lib/list_debug.c:62 __list_del_entry include/linux/list.h:134 [inline] list_del_init include/linux/list.h:206 [inline] f2fs_inode_synced+0xf7/0x2e0 fs/f2fs/super.c:1531 f2fs_update_inode+0x74/0x1c40 fs/f2fs/inode.c:585 f2fs_update_inode_page+0x137/0x170 fs/f2fs/inode.c:703 f2fs_write_inode+0x4ec/0x770 fs/f2fs/inode.c:731 write_inode fs/fs-writeback.c:1460 [inline] __writeback_single_inode+0x4a0/0xab0 fs/fs-writeback.c:1677 writeback_single_inode+0x221/0x8b0 fs/fs-writeback.c:1733 sync_inode_metadata+0xb6/0x110 fs/fs-writeback.c:2789 f2fs_sync_inode_meta+0x16d/0x2a0 fs/f2fs/checkpoint.c:1159 block_operations fs/f2fs/checkpoint.c:1269 [inline] f2fs_write_checkpoint+0xca3/0x2100 fs/f2fs/checkpoint.c:1658 kill_f2fs_super+0x231/0x390 fs/f2fs/super.c:4668 deactivate_locked_super+0x98/0x100 fs/super.c:332 deactivate_super+0xaf/0xe0 fs/super.c:363 cleanup_mnt+0x45f/0x4e0 fs/namespace.c:1186 __cleanup_mnt+0x19/0x20 fs/namespace.c:1193 task_work_run+0x1c6/0x230 kernel/task_work.c:203 exit_task_work include/linux/task_work.h:39 [inline] do_exit+0x9fb/0x2410 kernel/exit.c:871 do_group_exit+0x210/0x2d0 kernel/exit.c:1021 __do_sys_exit_group kernel/exit.c:1032 [inline] __se_sys_exit_group kernel/exit.c:1030 [inline] __x64_sys_exit_group+0x3f/0x40 kernel/exit.c:1030 x64_sys_call+0x7b4/0x9a0 arch/x86/include/generated/asm/syscalls_64.h:232 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x68/0xd2 RIP: 0033:0x7f28b1b8e169 Code: Unable to access opcode bytes at 0x7f28b1b8e13f. RSP: 002b:00007ffe174710a8 EFLAGS: 00000246 ORIG_RAX: 00000000000000e7 RAX: ffffffffffffffda RBX: 00007f28b1c10879 RCX: 00007f28b1b8e169 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000001 RBP: 0000000000000002 R08: 00007ffe1746ee47 R09: 00007ffe17472360 R10: 0000000000000009 R11: 0000000000000246 R12: 00007ffe17472360 R13: 00007f28b1c10854 R14: 000000000000dae5 R15: 00007ffe17474520 </TASK> Allocated by task 569: kasan_save_stack mm/kasan/common.c:45 [inline] kasan_set_track+0x4b/0x70 mm/kasan/common.c:52 kasan_save_alloc_info+0x25/0x30 mm/kasan/generic.c:505 __kasan_slab_alloc+0x72/0x80 mm/kasan/common.c:328 kasan_slab_alloc include/linux/kasan.h:201 [inline] slab_post_alloc_hook+0x4f/0x2c0 mm/slab.h:737 slab_alloc_node mm/slub.c:3398 [inline] slab_alloc mm/slub.c:3406 [inline] __kmem_cache_alloc_lru mm/slub.c:3413 [inline] kmem_cache_alloc_lru+0x104/0x220 mm/slub.c:3429 alloc_inode_sb include/linux/fs.h:3245 [inline] f2fs_alloc_inode+0x2d/0x340 fs/f2fs/super.c:1419 alloc_inode fs/inode.c:261 [inline] iget_locked+0x186/0x880 fs/inode.c:1373 f2fs_iget+0x55/0x4c60 fs/f2fs/inode.c:483 f2fs_lookup+0x366/0xab0 fs/f2fs/namei.c:487 __lookup_slow+0x2a3/0x3d0 fs/namei.c:1690 lookup_slow+0x57/0x70 fs/namei.c:1707 walk_component+0x2e6/0x410 fs/namei.c:1998 lookup_last fs/namei.c:2455 [inline] path_lookupat+0x180/0x490 fs/namei.c:2479 filename_lookup+0x1f0/0x500 fs/namei.c:2508 vfs_statx+0x10b/0x660 fs/stat.c:229 vfs_fstatat fs/stat.c:267 [inline] vfs_lstat include/linux/fs.h:3424 [inline] __do_sys_newlstat fs/stat.c:423 [inline] __se_sys_newlstat+0xd5/0x350 fs/stat.c:417 __x64_sys_newlstat+0x5b/0x70 fs/stat.c:417 x64_sys_call+0x393/0x9a0 arch/x86/include/generated/asm/syscalls_64.h:7 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x68/0xd2 Freed by task 13: kasan_save_stack mm/kasan/common.c:45 [inline] kasan_set_track+0x4b/0x70 mm/kasan/common.c:52 kasan_save_free_info+0x31/0x50 mm/kasan/generic.c:516 ____kasan_slab_free+0x132/0x180 mm/kasan/common.c:236 __kasan_slab_free+0x11/0x20 mm/kasan/common.c:244 kasan_slab_free include/linux/kasan.h:177 [inline] slab_free_hook mm/slub.c:1724 [inline] slab_free_freelist_hook+0xc2/0x190 mm/slub.c:1750 slab_free mm/slub.c:3661 [inline] kmem_cache_free+0x12d/0x2a0 mm/slub.c:3683 f2fs_free_inode+0x24/0x30 fs/f2fs/super.c:1562 i_callback+0x4c/0x70 fs/inode.c:250 rcu_do_batch+0x503/0xb80 kernel/rcu/tree.c:2297 rcu_core+0x5a2/0xe70 kernel/rcu/tree.c:2557 rcu_core_si+0x9/0x10 kernel/rcu/tree.c:2574 handle_softirqs+0x178/0x500 kernel/softirq.c:578 run_ksoftirqd+0x28/0x30 kernel/softirq.c:945 smpboot_thread_fn+0x45a/0x8c0 kernel/smpboot.c:164 kthread+0x270/0x310 kernel/kthread.c:376 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295 Last potentially related work creation: kasan_save_stack+0x3a/0x60 mm/kasan/common.c:45 __kasan_record_aux_stack+0xb6/0xc0 mm/kasan/generic.c:486 kasan_record_aux_stack_noalloc+0xb/0x10 mm/kasan/generic.c:496 call_rcu+0xd4/0xf70 kernel/rcu/tree.c:2845 destroy_inode fs/inode.c:316 [inline] evict+0x7da/0x870 fs/inode.c:720 iput_final fs/inode.c:1834 [inline] iput+0x62b/0x830 fs/inode.c:1860 do_unlinkat+0x356/0x540 fs/namei.c:4397 __do_sys_unlink fs/namei.c:4438 [inline] __se_sys_unlink fs/namei.c:4436 [inline] __x64_sys_unlink+0x49/0x50 fs/namei.c:4436 x64_sys_call+0x958/0x9a0 arch/x86/include/generated/asm/syscalls_64.h:88 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x68/0xd2 The buggy address belongs to the object at ffff88812d961f20 which belongs to the cache f2fs_inode_cache of size 1200
The buggy address is located 856 bytes inside of
1200-byte region [ffff88812d961f20, ffff88812d9623d0)
The buggy address belongs to the physical page: page:ffffea0004b65800 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x12d960 head:ffffea0004b65800 order:2 compound_mapcount:0 compound_pincount:0 flags: 0x4000000000010200(slab|head|zone=1) raw: 4000000000010200 0000000000000000 dead000000000122 ffff88810a94c500 raw: 0000000000000000 00000000800c000c 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 2, migratetype Reclaimable, gfp_mask 0x1d2050(__GFP_IO|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_HARDWALL|__GFP_RECLAIMABLE), pid 569, tgid 568 (syz.2.16), ts 55943246141, free_ts 0 set_page_owner include/linux/page_owner.h:31 [inline] post_alloc_hook+0x1d0/0x1f0 mm/page_alloc.c:2532 prep_new_page mm/page_alloc.c:2539 [inline] get_page_from_freelist+0x2e63/0x2ef0 mm/page_alloc.c:4328 __alloc_pages+0x235/0x4b0 mm/page_alloc.c:5605 alloc_slab_page include/linux/gfp.h:-1 [inline] allocate_slab mm/slub.c:1939 [inline] new_slab+0xec/0x4b0 mm/slub.c:1992 ___slab_alloc+0x6f6/0xb50 mm/slub.c:3180 __slab_alloc+0x5e/0xa0 mm/slub.c:3279 slab_alloc_node mm/slub.c:3364 [inline] slab_alloc mm/slub.c:3406 [inline] __kmem_cache_alloc_lru mm/slub.c:3413 [inline] kmem_cache_alloc_lru+0x13f/0x220 mm/slub.c:3429 alloc_inode_sb include/linux/fs.h:3245 [inline] f2fs_alloc_inode+0x2d/0x340 fs/f2fs/super.c:1419 alloc_inode fs/inode.c:261 [inline] iget_locked+0x186/0x880 fs/inode.c:1373 f2fs_iget+0x55/0x4c60 fs/f2fs/inode.c:483 f2fs_fill_super+0x3ad7/0x6bb0 fs/f2fs/super.c:4293 mount_bdev+0x2ae/0x3e0 fs/super.c:1443 f2fs_mount+0x34/0x40 fs/f2fs/super.c:4642 legacy_get_tree+0xea/0x190 fs/fs_context.c:632 vfs_get_tree+0x89/0x260 fs/super.c:1573 do_new_mount+0x25a/0xa20 fs/namespace.c:3056
page_owner free stack trace missing
Memory state around the buggy address:
ffff88812d962100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88812d962180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff88812d962200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88812d962280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88812d962300: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================[1] https://syzkaller.appspot.com/x/report.txt?x=13448368580000
This bug can be reproduced w/ the reproducer [2], once we enable CONFIG_F2FS_CHECK_FS config, the reproducer will trigger panic as below, so the direct reason of this bug is the same as the one below patch [3] fixed.
kernel BUG at fs/f2fs/inode.c:857!
RIP: 0010:f2fs_evict_inode+0x1204/0x1a20 Call Trace: <TASK> evict+0x32a/0x7a0 do_unlinkat+0x37b/0x5b0 __x64_sys_unlink+0xad/0x100 do_syscall_64+0x5a/0xb0 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 RIP: 0010:f2fs_evict_inode+0x1204/0x1a20
[2] https://syzkaller.appspot.com/x/repro.c?x=17495ccc580000
[3] https://lore.kernel.org/linux-f2fs-devel/[email protected]
Tracepoints before panic:
f2fs_unlink_enter: dev = (7,0), dir ino = 3, i_size = 4096, i_blocks = 8, name = file1f2fs_unlink_exit: dev = (7,0), ino = 7, ret = 0f2fs_evict_inode: dev = (7,0), ino = 7, pino = 3, i_mode = 0x81ed, i_size = 10, i_nlink = 0, i_blocks = 0, i_advise = 0x0f2fs_truncate_node: dev = (7,0), ino = 7, nid = 8, block_address = 0x3c05
f2fs_unlink_enter: dev = (7,0), dir ino = 3, i_size = 4096, i_blocks = 8, name = file3f2fs_unlink_exit: dev = (7,0), ino = 8, ret = 0f2fs_evict_inode: dev = (7,0), ino = 8, pino = 3, i_mode = 0x81ed, i_size = 9000, i_nlink = 0, i_blocks = 24, i_advise = 0x4f2fs_truncate: dev = (7,0), ino = 8, pino = 3, i_mode = 0x81ed, i_size = 0, i_nlink = 0, i_blocks = 24, i_advise = 0x4 f2fs_truncate_blocks_enter: dev = (7,0), ino = 8, i_size = 0, i_blocks = 24, start file offset = 0f2fs_truncate_blocks_exit: dev = (7,0), ino = 8, ret = -2
The root cause is: in the fuzzed image, dnode #8 belongs to inode #7, after inode #7 eviction, dnode #8 was dropped.
However there is dirent that has ino #8, so, once we unlink file3, in f2fs_evict_inode(), both f2fs_truncate() and f2fs_update_inode_page() will fail due to we can not load node #8, result in we missed to call f2fs_inode_synced() to clear inode dirty status.
Let's fix this by calling f2fs_inode_synced() in error path of f2fs_evict_inode().
PS: As I verified, the reproducer [2] can trigger this bug in v6.1.129, but it failed in v6.16-rc4, this is because the testcase will stop due to other corruption has been detected by f2fs:
F2FS-fs (loop0): inconsistent node block, node_type:2, nid:8, node_footer[nid:8,ino:8,ofs:0,cpver:5013063228981249506,blkaddr:15366] F2FS-fs (loop0): f2fs_lookup: inode (ino=9) has zero i_nlink
--- fs/f2fs/inode.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
fs/f2fs/inode.c +13 -0
@@ -902,6 +902,19 @@ void f2fs_evict_inode(struct inode *inode)f2fs_update_inode_page (inode);if (dquot_initialize_needed (inode))set_sbi_flag (sbi,SBI_QUOTA_NEED_REPAIR ); + +/* +* If both f2fs_truncate() and f2fs_update_inode_page() failed +* due to fuzzed corrupted inode, call f2fs_inode_synced() to +* avoid triggering later f2fs_bug_on(). +*/ +if (is_inode_flag_set (inode,FI_DIRTY_INODE )) { +f2fs_warn (sbi, +"f2fs_evict_inode: inode is dirty, ino:%lu" , + inode->i_ino); +f2fs_inode_synced (inode); +set_sbi_flag (sbi,SBI_NEED_FSCK ); + } }if (freeze_protected)sb_end_intwrite (inode->i_sb);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 258/369 f2fs: fix to avoid out-of-boundary access in devs.path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 5661998536af52848cc4d52a377e90368196edea ]
- touch /mnt/f2fs/012345678901234567890123456789012345678901234567890123
- truncate -s $((1024*1024*1024)) \
/mnt/f2fs/012345678901234567890123456789012345678901234567890123
- touch /mnt/f2fs/file
- truncate -s $((1024*1024*1024)) /mnt/f2fs/file
- mkfs.f2fs /mnt/f2fs/012345678901234567890123456789012345678901234567890123 \
-c /mnt/f2fs/file
- mount /mnt/f2fs/012345678901234567890123456789012345678901234567890123 \
/mnt/f2fs/loop
[16937.192225] F2FS-fs (loop0): Mount Device [ 0]: /mnt/f2fs/012345678901234567890123456789012345678901234567890123\xff\x01, 511, 0 - 3ffff [16937.192268] F2FS-fs (loop0): Failed to find devices
If device path length equals to MAX_PATH_LEN, sbi->devs.path[] may not end up w/ null character due to path array is fully filled, So accidently, fields locate after path[] may be treated as part of device path, result in parsing wrong device path.
struct f2fs_dev_info {
...
char path[MAX_PATH_LEN];
...
};
Let's add one byte space for sbi->devs.path[] to store null character of device path string.
--- fs/f2fs/f2fs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/f2fs.h +1 -1
@@ -1260,7 +1260,7 @@ struct f2fs_bio_info {struct f2fs_dev_info {struct file *bdev_file;struct block_device *bdev; -char path[MAX_PATH_LEN ]; +char path[MAX_PATH_LEN +1 ];unsigned int total_segments;block_t start_blk;block_t end_blk;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 259/369 f2fs: vm_unmap_ram() may be called from an invalid context
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Prusakowski <[email protected]>
[ Upstream commit 08a7efc5b02a0620ae16aa9584060e980a69cb55 ]
When testing F2FS with xfstests using UFS backed virtual disks the kernel complains sometimes that f2fs_release_decomp_mem() calls vm_unmap_ram() from an invalid context. Example trace from f2fs/007 test:
f2fs/007 5s ... [12:59:38][ 8.902525] run fstests f2fs/007
[ 11.468026] BUG: sleeping function called from invalid context at mm/vmalloc.c:2978 [ 11.471849] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 68, name: irq/22-ufshcd [ 11.475357] preempt_count: 1, expected: 0 [ 11.476970] RCU nest depth: 0, expected: 0 [ 11.478531] CPU: 0 UID: 0 PID: 68 Comm: irq/22-ufshcd Tainted: G W 6.16.0-rc5-xfstests-ufs-g40f92e79b0aa #9 PREEMPT(none) [ 11.478535] Tainted: [W]=WARN [ 11.478536] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 11.478537] Call Trace: [ 11.478543] <TASK> [ 11.478545] dump_stack_lvl+0x4e/0x70 [ 11.478554] __might_resched.cold+0xaf/0xbe [ 11.478557] vm_unmap_ram+0x21/0xb0 [ 11.478560] f2fs_release_decomp_mem+0x59/0x80 [ 11.478563] f2fs_free_dic+0x18/0x1a0 [ 11.478565] f2fs_finish_read_bio+0xd7/0x290 [ 11.478570] blk_update_request+0xec/0x3b0 [ 11.478574] ? sbitmap_queue_clear+0x3b/0x60 [ 11.478576] scsi_end_request+0x27/0x1a0 [ 11.478582] scsi_io_completion+0x40/0x300 [ 11.478583] ufshcd_mcq_poll_cqe_lock+0xa3/0xe0 [ 11.478588] ufshcd_sl_intr+0x194/0x1f0 [ 11.478592] ufshcd_threaded_intr+0x68/0xb0 [ 11.478594] ? __pfx_irq_thread_fn+0x10/0x10 [ 11.478599] irq_thread_fn+0x20/0x60 [ 11.478602] ? __pfx_irq_thread_fn+0x10/0x10 [ 11.478603] irq_thread+0xb9/0x180 [ 11.478605] ? __pfx_irq_thread_dtor+0x10/0x10 [ 11.478607] ? __pfx_irq_thread+0x10/0x10 [ 11.478609] kthread+0x10a/0x230 [ 11.478614] ? __pfx_kthread+0x10/0x10 [ 11.478615] ret_from_fork+0x7e/0xd0 [ 11.478619] ? __pfx_kthread+0x10/0x10 [ 11.478621] ret_from_fork_asm+0x1a/0x30 [ 11.478623] </TASK>
This patch modifies in_task() check inside f2fs_read_end_io() to also check if interrupts are disabled. This ensures that pages are unmapped asynchronously in an interrupt handler.
--- fs/f2fs/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/data.c +1 -1
@@ -287,7 +287,7 @@ static void f2fs_read_end_io(struct bio *bio) {struct f2fs_sb_info *sbi =F2FS_P_SB (bio_first_page_all (bio));struct bio_post_read_ctx *ctx; -bool intask =in_task (); +bool intask =in_task () && !irqs_disabled ();iostat_update_and_unbind_ctx (bio); ctx = bio->bi_private;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 260/369 f2fs: fix to update upper_p in __get_secs_required() correctly
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 6840faddb65683b4e7bd8196f177b038a1e19faf ]
Commit 1acd73edbbfe ("f2fs: fix to account dirty data in __get_secs_required()") missed to calculate upper_p w/ data_secs, fix it.
--- fs/f2fs/segment.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/segment.h +1 -1
@@ -636,7 +636,7 @@ static inline void __get_secs_required(struct f2fs_sb_info *sbi,if (lower_p) *lower_p = node_secs + dent_secs + data_secs;if (upper_p) - *upper_p = node_secs + dent_secs + + *upper_p = node_secs + dent_secs + data_secs + (node_blocks ?1 :0 ) + (dent_blocks ?1 :0 ) + (data_blocks ?1 :0 );if (curseg_p)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 261/369 f2fs: fix to calculate dirty data during has_not_enough_free_secs()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit e194e140ab7de2ce2782e64b9e086a43ca6ff4f2 ]
In lfs mode, dirty data needs OPU, we'd better calculate lower_p and upper_p w/ them during has_not_enough_free_secs(), otherwise we may encounter out-of-space issue due to we missed to reclaim enough free section w/ foreground gc.
--- fs/f2fs/segment.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/f2fs/segment.h +1 -2
@@ -626,8 +626,7 @@ static inline void __get_secs_required(struct f2fs_sb_info *sbi,unsigned int dent_blocks = total_dent_blocks %CAP_BLKS_PER_SEC (sbi);unsigned int data_blocks =0 ; -if (f2fs_lfs_mode (sbi) && -unlikely (is_sbi_flag_set (sbi,SBI_CP_DISABLED ))) { +if (f2fs_lfs_mode (sbi)) { total_data_blocks =get_pages (sbi,F2FS_DIRTY_DATA ); data_secs = total_data_blocks /CAP_BLKS_PER_SEC (sbi); data_blocks = total_data_blocks %CAP_BLKS_PER_SEC (sbi);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 262/369 f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 1005a3ca28e90c7a64fa43023f866b960a60f791 ]
w/ "mode=lfs" mount option, generic/299 will cause system panic as below:
------------[ cut here ]------------ kernel BUG at fs/f2fs/segment.c:2835! Call Trace: <TASK> f2fs_allocate_data_block+0x6f4/0xc50 f2fs_map_blocks+0x970/0x1550 f2fs_iomap_begin+0xb2/0x1e0 iomap_iter+0x1d6/0x430 __iomap_dio_rw+0x208/0x9a0 f2fs_file_write_iter+0x6b3/0xfa0 aio_write+0x15d/0x2e0 io_submit_one+0x55e/0xab0 __x64_sys_io_submit+0xa5/0x230 do_syscall_64+0x84/0x2f0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0010:new_curseg+0x70f/0x720
The root cause of we run out-of-space is: in f2fs_map_blocks(), f2fs may trigger foreground gc only if it allocates any physical block, it will be a little bit later when there is multiple threads writing data w/ aio/dio/bufio method in parallel, since we always use OPU in lfs mode, so f2fs_map_blocks() does block allocations aggressively.
In order to fix this issue, let's give a chance to trigger foreground gc in prior to block allocation in f2fs_map_blocks().
--- fs/f2fs/data.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/f2fs/data.c +4 -1
@@ -1573,8 +1573,11 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag) end = pgofs + maxblocks; next_dnode: -if (map->m_may_create) +if (map->m_may_create) { +if (f2fs_lfs_mode (sbi)) +f2fs_balance_fs (sbi, true);f2fs_map_lock (sbi, flag); + }/* When reading holes, we need its node page */ set_new_dnode (&dn, inode,NULL ,NULL ,0 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 263/369 exfat: fdatasync flag should be same like generic_write_sync()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhengxu Zhang <[email protected]>
[ Upstream commit 2f2d42a17b5a6711378d39df74f1f69a831c5d4e ]
Test: androbench by default setting, use 64GB sdcard.
the random write speed:
without this patch 3.5MB/s
with this patch 7MB/s
After patch "11a347fb6cef", the random write speed decreased significantly. the .write_iter() interface had been modified, and check the differences with generic_file_write_iter(), when calling generic_write_sync() and exfat_file_write_iter() to call vfs_fsync_range(), the fdatasync flag is wrong, and make not use the fdatasync mode, and make random write speed decreased. So use generic_write_sync() instead of vfs_fsync_range().
--- fs/exfat/file.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
fs/exfat/file.c +2 -3
@@ -623,9 +623,8 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)if (pos > valid_size) pos = valid_size; -if (iocb_is_dsync (iocb) && iocb->ki_pos > pos) { -ssize_t err =vfs_fsync_range (file, pos, iocb->ki_pos -1 , - iocb->ki_flags &IOCB_SYNC ); +if (iocb->ki_pos > pos) { +ssize_t err =generic_write_sync (iocb, iocb->ki_pos - pos);if (err <0 )return err; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 264/369 i2c: muxes: mule: Fix an error handling path in mule_i2c_mux_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 33ac5155891cab165c93b51b0e22e153eacc2ee7 ]
If an error occurs in the loop that creates the device adapters, then a reference to 'dev' still needs to be released.
Use for_each_child_of_node_scoped() to both fix the issue and save one line of code.
--- drivers/i2c/muxes/i2c-mux-mule.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/i2c/muxes/i2c-mux-mule.c +1 -2
@@ -47,7 +47,6 @@ static int mule_i2c_mux_probe(struct platform_device *pdev)struct mule_i2c_reg_mux *priv;struct i2c_client *client;struct i2c_mux_core *muxc; -struct device_node *dev;unsigned int readback;int ndev, ret;bool old_fw;
@@ -95,7 +94,7 @@ static int mule_i2c_mux_probe(struct platform_device *pdev) "Failed to register mux remove\n");/* Create device adapters */ -for_each_child_of_node (mux_dev->of_node, dev) { +for_each_child_of_node_scoped (mux_dev->of_node, dev) {u32 reg; ret =of_property_read_u32 (dev,"reg" , ®);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 265/369 vfio: Fix unbalanced vfio_df_close call in no-iommu mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Pan <[email protected]>
[ Upstream commit b25e271b377999191b12f0afbe1861edcf57e3fe ]
For devices with no-iommu enabled in IOMMUFD VFIO compat mode, the group open path skips vfio_df_open(), leaving open_count at 0. This causes a warning in vfio_assert_device_open(device) when vfio_df_close() is called during group close.
The correct behavior is to skip only the IOMMUFD bind in the device open path for no-iommu devices. Commit 6086efe73498 omitted vfio_df_open(), which was too broad. This patch restores the previous behavior, ensuring the vfio_df_open is called in the group open path.
--- drivers/vfio/group.c | 7 +++---- drivers/vfio/iommufd.c | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-)
drivers/vfio/group.c +3 -4
@@ -194,11 +194,10 @@ static int vfio_df_group_open(struct vfio_device_file *df)* implies they expected translation to exist */ if (!capable (CAP_SYS_RAWIO ) || -vfio_iommufd_device_has_compat_ioas (device, df->iommufd)) +vfio_iommufd_device_has_compat_ioas (device, df->iommufd)) { ret = -EPERM ; -else - ret =0 ; - goto out_put_kvm; + goto out_put_kvm; + } } ret =vfio_df_open (df);
drivers/vfio/iommufd.c +4 -0
@@ -25,6 +25,10 @@ int vfio_df_iommufd_bind(struct vfio_device_file *df)lockdep_assert_held (&vdev->dev_set->lock); +/* Returns 0 to permit device opening under noiommu mode */ +if (vfio_device_is_noiommu (vdev)) +return 0 ; +return vdev->ops->bind_iommufd (vdev, ictx, &df->devid); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 266/369 vfio: Prevent open_count decrement to negative
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Pan <[email protected]>
[ Upstream commit 982ddd59ed97dc7e63efd97ed50273ffb817bd41 ]
When vfio_df_close() is called with open_count=0, it triggers a warning in vfio_assert_device_open() but still decrements open_count to -1. This allows a subsequent open to incorrectly pass the open_count == 0 check, leading to unintended behavior, such as setting df->access_granted = true.
For example, running an IOMMUFD compat no-IOMMU device with VFIO tests
(https://github.com/awilliam/tests/blob/master/vfio-noiommu-pci-device-open.c)
results in a warning and a failed VFIO_GROUP_GET_DEVICE_FD ioctl on the first run, but the second run succeeds incorrectly.
Add checks to avoid decrementing open_count below zero.
--- drivers/vfio/vfio_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/vfio/vfio_main.c +2 -1
@@ -583,7 +583,8 @@ void vfio_df_close(struct vfio_device_file *df)lockdep_assert_held (&device->dev_set->lock); -vfio_assert_device_open (device); +if (!vfio_assert_device_open (device)) +return ;if (device->open_count ==1 )vfio_df_device_last_close (df); device->open_count--;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 267/369 vfio/pds: Fix missing detach_ioas op
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit fe24d5bc635e103a517ec201c3cb571eeab8be2f ]
When CONFIG_IOMMUFD is enabled and a device is bound to the pds_vfio_pci driver, the following WARN_ON() trace is seen and probe fails:
WARNING: CPU: 0 PID: 5040 at drivers/vfio/vfio_main.c:317 __vfio_register_dev+0x130/0x140 [vfio]
<...>pds_vfio_pci 0000:08:00.1: probe with driver pds_vfio_pci failed with error -22
This is because the driver's vfio_device_ops.detach_ioas isn't set.
Fix this by using the generic vfio_iommufd_physical_detach_ioas function.
--- drivers/vfio/pci/pds/vfio_dev.c | 1 + 1 file changed, 1 insertion(+)
drivers/vfio/pci/pds/vfio_dev.c +1 -0
@@ -204,6 +204,7 @@ static const struct vfio_device_ops pds_vfio_ops = { .bind_iommufd = vfio_iommufd_physical_bind, .unbind_iommufd = vfio_iommufd_physical_unbind, .attach_ioas = vfio_iommufd_physical_attach_ioas, + .detach_ioas = vfio_iommufd_physical_detach_ioas, };const struct vfio_device_ops *pds_vfio_ops_info (void )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 268/369 vfio/pci: Separate SR-IOV VF dev_set
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Williamson <[email protected]>
[ Upstream commit e908f58b6beb337cbe4481d52c3f5c78167b1aab ]
In the below noted Fixes commit we introduced a reflck mutex to allow better scaling between devices for open and close. The reflck was based on the hot reset granularity, device level for root bus devices which cannot support hot reset or bus/slot reset otherwise. Overlooked in this were SR-IOV VFs, where there's also no bus reset option, but the default for a non-root-bus, non-slot-based device is bus level reflck granularity.
The reflck mutex has since become the dev_set mutex (via commit 2cd8b14aaa66 ("vfio/pci: Move to the device set infrastructure")) and is our defacto serialization for various operations and ioctls. It still seems to be the case though that sets of vfio-pci devices really only need serialization relative to hot resets affecting the entire set, which is not relevant to SR-IOV VFs. As described in the Closes link below, this serialization contributes to startup latency when multiple VFs sharing the same "bus" are opened concurrently.
Mark the device itself as the basis of the dev_set for SR-IOV VFs.
--- drivers/vfio/pci/vfio_pci_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vfio/pci/vfio_pci_core.c +1 -1
@@ -2153,7 +2153,7 @@ int vfio_pci_core_register_device(struct vfio_pci_core_device *vdev)return -EBUSY ; } -if (pci_is_root_bus (pdev->bus)) { +if (pci_is_root_bus (pdev->bus) || pdev->is_virtfn) { ret =vfio_assign_device_set (&vdev->vdev, vdev); }else if (!pci_probe_reset_slot (pdev->slot)) { ret =vfio_assign_device_set (&vdev->vdev, pdev->slot);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 269/369 scsi: mpt3sas: Fix a fw_event memory leak
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Henzl <[email protected]>
[ Upstream commit 3e90b38781e3bdd651edaf789585687611638862 ]
In _mpt3sas_fw_work() the fw_event reference is removed, it should also be freed in all cases.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -2
@@ -10790,8 +10790,7 @@ _mpt3sas_fw_work(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)break ;case MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST :_scsih_pcie_topology_change_event (ioc, fw_event); - ioc->current_event =NULL ; -return ; +break ; } out:fw_event_work_put (fw_event);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 270/369 scsi: Revert "scsi: iscsi: Fix HW conn removal use after free"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Lingfeng <[email protected]>
[ Upstream commit 7bdc68921481c19cd8c85ddf805a834211c19e61 ]
This reverts commit c577ab7ba5f3bf9062db8a58b6e89d4fe370447e.
The invocation of iscsi_put_conn() in iscsi_iter_destory_conn_fn() is used to free the initial reference counter of iscsi_cls_conn. For non-qla4xxx cases, the ->destroy_conn() callback (e.g., iscsi_conn_teardown) will call iscsi_remove_conn() and iscsi_put_conn() to remove the connection from the children list of session and free the connection at last. However for qla4xxx, it is not the case. The ->destroy_conn() callback of qla4xxx will keep the connection in the session conn_list and doesn't use iscsi_put_conn() to free the initial reference counter. Therefore, it seems necessary to keep the iscsi_put_conn() in the iscsi_iter_destroy_conn_fn(), otherwise, there will be memory leak problem.
--- drivers/scsi/scsi_transport_iscsi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/scsi_transport_iscsi.c +2 -0
@@ -2170,6 +2170,8 @@ static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data)return 0 ;iscsi_remove_conn (iscsi_dev_to_conn (dev)); +iscsi_put_conn (iscsi_dev_to_conn (dev)); +return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 271/369 scsi: ufs: core: Use link recovery when h8 exit fails during runtime resume
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seunghui Lee <[email protected]>
[ Upstream commit 35dabf4503b94a697bababe94678a8bc989c3223 ]
If the h8 exit fails during runtime resume process, the runtime thread enters runtime suspend immediately and the error handler operates at the same time. It becomes stuck and cannot be recovered through the error handler. To fix this, use link recovery instead of the error handler.
--- drivers/ufs/core/ufshcd.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/ufs/core/ufshcd.c +9 -1
@@ -4337,7 +4337,7 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) hba->uic_async_done =NULL ;if (reenable_intr)ufshcd_enable_intr (hba,UIC_COMMAND_COMPL ); -if (ret) { +if (ret && !hba->pm_op_in_progress) {ufshcd_set_link_broken (hba);ufshcd_schedule_eh_work (hba); }
@@ -4345,6 +4345,14 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)spin_unlock_irqrestore (hba->host->host_lock, flags);mutex_unlock (&hba->uic_cmd_mutex); +/* +* If the h8 exit fails during the runtime resume process, it becomes +* stuck and cannot be recovered through the error handler. To fix +* this, use link recovery instead of the error handler. +*/ +if (ret && hba->pm_op_in_progress) + ret =ufshcd_link_recovery (hba); +return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 272/369 scsi: sd: Make sd shutdown issue START STOP UNIT appropriately
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Salomon Dushimirimana <[email protected]>
[ Upstream commit 8e48727c26c4d839ff9b4b73d1cae486bea7fe19 ]
Commit aa3998dbeb3a ("ata: libata-scsi: Disable scsi device manage_system_start_stop") enabled libata EH to manage device power mode trasitions for system suspend/resume and removed the flag from ata_scsi_dev_config. However, since the sd_shutdown() function still relies on the manage_system_start_stop flag, a spin-down command is not issued to the disk with command "echo 1 > /sys/block/sdb/device/delete"
sd_shutdown() can be called for both system/runtime start stop operations, so utilize the manage_run_time_start_stop flag set in the ata_scsi_dev_config and issue a spin-down command during disk removal when the system is running. This is in addition to when the system is powering off and manage_shutdown flag is set. The manage_system_start_stop flag will still be used for drivers that still set the flag.
--- drivers/scsi/sd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/sd.c +3 -1
@@ -4179,7 +4179,9 @@ static void sd_shutdown(struct device *dev)if ((system_state !=SYSTEM_RESTART && sdkp->device->manage_system_start_stop) || (system_state ==SYSTEM_POWER_OFF && - sdkp->device->manage_shutdown)) { + sdkp->device->manage_shutdown) || + (system_state ==SYSTEM_RUNNING && + sdkp->device->manage_runtime_start_stop)) {sd_printk (KERN_NOTICE , sdkp,"Stopping disk\n" );sd_start_stop_device (sdkp,0 ); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 273/369 kconfig: qconf: fix ConfigList::updateListAllforAll()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 721bfe583c52ba1ea74b3736a31a9dcfe6dd6d95 ]
ConfigList::updateListForAll() and ConfigList::updateListAllforAll() are identical.
Commit f9b918fae678 ("kconfig: qconf: move ConfigView::updateList(All) to ConfigList class") was a misconversion.
--- scripts/kconfig/qconf.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/kconfig/qconf.cc +1 -1
@@ -481,7 +481,7 @@ void ConfigList::updateListAllForAll() while (it.hasNext()) { ConfigList *list = it.next(); - list->updateList(); + list->updateListAll(); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 274/369 sched/psi: Fix psi_seq initialization
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit 99b773d720aeea1ef2170dce5fcfa80649e26b78 ]
With the seqcount moved out of the group into a global psi_seq, re-initializing the seqcount on group creation is causing seqcount corruption.
--- kernel/sched/psi.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
kernel/sched/psi.c +1 -5
@@ -172,7 +172,7 @@ struct psi_group psi_system = { .pcpu = &system_group_pcpu, }; -static DEFINE_PER_CPU(seqcount_t, psi_seq); +static DEFINE_PER_CPU(seqcount_t, psi_seq) = SEQCNT_ZERO(psi_seq);static inline void psi_write_begin (int cpu) {
@@ -200,11 +200,7 @@ static void poll_timer_fn(struct timer_list *t);static void group_init (struct psi_group *group) { -int cpu; - group->enabled = true; -for_each_possible_cpu (cpu) -seqcount_init (per_cpu_ptr (&psi_seq, cpu)); group->avg_last_update =sched_clock (); group->avg_next_update = group->avg_last_update + psi_period;mutex_init (&group->avgs_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 275/369 PCI: pnv_php: Clean up allocated IRQs on unplug
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit 4668619092554e1b95c9a5ac2941ca47ba6d548a ]
When the root of a nested PCIe bridge configuration is unplugged, the pnv_php driver leaked the allocated IRQ resources for the child bridges' hotplug event notifications, resulting in a panic.
Fix this by walking all child buses and deallocating all its IRQ resources before calling pci_hp_remove_devices().
Also modify the lifetime of the workqueue at struct pnv_php_slot::wq so that it is only destroyed in pnv_php_free_slot(), instead of pnv_php_disable_irq(). This is required since pnv_php_disable_irq() will now be called by workers triggered by hot unplug interrupts, so the workqueue needs to stay allocated.
The abridged kernel panic that occurs without this patch is as follows:
WARNING: CPU: 0 PID: 687 at kernel/irq/msi.c:292 msi_device_data_release+0x6c/0x9c CPU: 0 UID: 0 PID: 687 Comm: bash Not tainted 6.14.0-rc5+ #2 Call Trace: msi_device_data_release+0x34/0x9c (unreliable) release_nodes+0x64/0x13c devres_release_all+0xc0/0x140 device_del+0x2d4/0x46c pci_destroy_dev+0x5c/0x194 pci_hp_remove_devices+0x90/0x128 pci_hp_remove_devices+0x44/0x128 pnv_php_disable_slot+0x54/0xd4 power_write_file+0xf8/0x18c pci_slot_attr_store+0x40/0x5c sysfs_kf_write+0x64/0x78 kernfs_fop_write_iter+0x1b0/0x290 vfs_write+0x3bc/0x50c ksys_write+0x84/0x140 system_call_exception+0x124/0x230 system_call_vectored_common+0x15c/0x2ec
--- drivers/pci/hotplug/pnv_php.c | 96 ++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 19 deletions(-)
drivers/pci/hotplug/pnv_php.c +77 -19
@@ -3,6 +3,7 @@* PCI Hotplug Driver for PowerPC PowerNV platform. * * Copyright Gavin Shan, IBM Corporation 2016. +* Copyright (C) 2025 Raptor Engineering, LLC */ #include <linux/bitfield.h>
@@ -36,8 +37,10 @@ static void pnv_php_register(struct device_node *dn);static void pnv_php_unregister_one (struct device_node *dn);static void pnv_php_unregister (struct device_node *dn); +static void pnv_php_enable_irq (struct pnv_php_slot *php_slot); +static void pnv_php_disable_irq (struct pnv_php_slot *php_slot, -bool disable_device) +bool disable_device,bool disable_msi) {struct pci_dev *pdev = php_slot->pdev;u16 ctrl;
@@ -53,19 +56,15 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, php_slot->irq =0 ; } -if (php_slot->wq) { -destroy_workqueue (php_slot->wq); - php_slot->wq =NULL ; - } - -if (disable_device) { +if (disable_device || disable_msi) {if (pdev->msix_enabled)pci_disable_msix (pdev);else if (pdev->msi_enabled)pci_disable_msi (pdev); + } +if (disable_device)pci_disable_device (pdev); - } }static void pnv_php_free_slot (struct kref *kref)
@@ -74,7 +73,8 @@ static void pnv_php_free_slot(struct kref *kref) struct pnv_php_slot, kref);WARN_ON (!list_empty (&php_slot->children)); -pnv_php_disable_irq (php_slot, false); +pnv_php_disable_irq (php_slot, false, false); +destroy_workqueue (php_slot->wq);kfree (php_slot->name);kfree (php_slot); }
@@ -561,8 +561,58 @@ static int pnv_php_reset_slot(struct hotplug_slot *slot, bool probe)static int pnv_php_enable_slot (struct hotplug_slot *slot) {struct pnv_php_slot *php_slot =to_pnv_php_slot (slot); +u32 prop32; +int ret; + + ret =pnv_php_enable (php_slot, true); +if (ret) +return ret; + +/* (Re-)enable interrupt if the slot supports surprise hotplug */ + ret =of_property_read_u32 (php_slot->dn,"ibm,slot-surprise-pluggable" , + &prop32); +if (!ret && prop32) +pnv_php_enable_irq (php_slot); -return pnv_php_enable (php_slot, true); +return 0 ; +} + +/* +* Disable any hotplug interrupts for all slots on the provided bus, as well as +* all downstream slots in preparation for a hot unplug. +*/ +static int pnv_php_disable_all_irqs (struct pci_bus *bus) +{ +struct pci_bus *child_bus; +struct pci_slot *slot; + +/* First go down child buses */ +list_for_each_entry (child_bus, &bus->children, node) +pnv_php_disable_all_irqs (child_bus); + +/* Disable IRQs for all pnv_php slots on this bus */ +list_for_each_entry (slot, &bus->slots, list) { +struct pnv_php_slot *php_slot =to_pnv_php_slot (slot->hotplug); + +pnv_php_disable_irq (php_slot, false, true); + } + +return 0 ; +} + +/* +* Disable any hotplug interrupts for all downstream slots on the provided +* bus in preparation for a hot unplug. +*/ +static int pnv_php_disable_all_downstream_irqs (struct pci_bus *bus) +{ +struct pci_bus *child_bus; + +/* Go down child buses, recursively deactivating their IRQs */ +list_for_each_entry (child_bus, &bus->children, node) +pnv_php_disable_all_irqs (child_bus); + +return 0 ; }static int pnv_php_disable_slot (struct hotplug_slot *slot)
@@ -579,6 +629,13 @@ static int pnv_php_disable_slot(struct hotplug_slot *slot) php_slot->state != PNV_PHP_STATE_REGISTERED)return 0 ; +/* +* Free all IRQ resources from all child slots before remove. +* Note that we do not disable the root slot IRQ here as that +* would also deactivate the slot hot (re)plug interrupt! +*/ +pnv_php_disable_all_downstream_irqs (php_slot->bus); +/* Remove all devices behind the slot */ pci_lock_rescan_remove ();pci_hp_remove_devices (php_slot->bus);
@@ -647,6 +704,15 @@ static struct pnv_php_slot *pnv_php_alloc_slot(struct device_node *dn)return NULL ; } +/* Allocate workqueue for this slot's interrupt handling */ + php_slot->wq =alloc_workqueue ("pciehp-%s" ,0 ,0 , php_slot->name); +if (!php_slot->wq) { +SLOT_WARN (php_slot,"Cannot alloc workqueue\n" ); +kfree (php_slot->name); +kfree (php_slot); +return NULL ; + } +if (dn->child &&PCI_DN (dn->child)) php_slot->slot_no =PCI_SLOT (PCI_DN (dn->child)->devfn);else
@@ -843,14 +909,6 @@ static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq)u16 sts, ctrl;int ret; -/* Allocate workqueue */ - php_slot->wq =alloc_workqueue ("pciehp-%s" ,0 ,0 , php_slot->name); -if (!php_slot->wq) { -SLOT_WARN (php_slot,"Cannot alloc workqueue\n" ); -pnv_php_disable_irq (php_slot, true); -return ; - } -/* Check PDC (Presence Detection Change) is broken or not */ ret =of_property_read_u32 (php_slot->dn,"ibm,slot-broken-pdc" , &broken_pdc);
@@ -869,7 +927,7 @@ static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) ret =request_irq (irq, pnv_php_interrupt,IRQF_SHARED , php_slot->name, php_slot);if (ret) { -pnv_php_disable_irq (php_slot, true); +pnv_php_disable_irq (php_slot, true, true);SLOT_WARN (php_slot,"Error %d enabling IRQ %d\n" , ret, irq);return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 276/369 PCI: pnv_php: Work around switches with broken presence detection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit 80f9fc2362797538ebd4fd70a1dfa838cc2c2cdb ]
The Microsemi Switchtec PM8533 PFX 48xG3 [11f8:8533] PCIe switch system was observed to incorrectly assert the Presence Detect Set bit in its capabilities when tested on a Raptor Computing Systems Blackbird system, resulting in the hot insert path never attempting a rescan of the bus and any downstream devices not being re-detected.
Work around this by additionally checking whether the PCIe data link is active or not when performing presence detection on downstream switches' ports, similar to the pciehp_hpc.c driver.
--- drivers/pci/hotplug/pnv_php.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/pci/hotplug/pnv_php.c +27 -0
@@ -391,6 +391,20 @@ static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)return 0 ; } +static int pcie_check_link_active (struct pci_dev *pdev) +{ +u16 lnk_status; +int ret; + + ret =pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); +if (ret ==PCIBIOS_DEVICE_NOT_FOUND ||PCI_POSSIBLE_ERROR (lnk_status)) +return -ENODEV ; + + ret = !!(lnk_status &PCI_EXP_LNKSTA_DLLLA ); + +return ret; +} +static int pnv_php_get_adapter_state (struct hotplug_slot *slot,u8 *state) {struct pnv_php_slot *php_slot =to_pnv_php_slot (slot);
@@ -403,6 +417,19 @@ static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)*/ ret =pnv_pci_get_presence_state (php_slot->id, &presence);if (ret >=0 ) { +if (pci_pcie_type (php_slot->pdev) ==PCI_EXP_TYPE_DOWNSTREAM && + presence ==OPAL_PCI_SLOT_EMPTY ) { +/* +* Similar to pciehp_hpc, check whether the Link Active +* bit is set to account for broken downstream bridges +* that don't properly assert Presence Detect State, as +* was observed on the Microsemi Switchtec PM8533 PFX +* [11f8:8533]. +*/ +if (pcie_check_link_active (php_slot->pdev) >0 ) + presence =OPAL_PCI_SLOT_PRESENT ; + } + *state = presence; ret =0 ; }else {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 277/369 powerpc/eeh: Export eeh_unfreeze_pe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit e82b34eed04b0ddcff4548b62633467235672fd3 ]
The PowerNV hotplug driver needs to be able to clear any frozen PE(s) on the PHB after suprise removal of a downstream device.
Export the eeh_unfreeze_pe() symbol to allow implementation of this functionality in the php_nv module.
--- arch/powerpc/kernel/eeh.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kernel/eeh.c +1 -0
@@ -1139,6 +1139,7 @@ int eeh_unfreeze_pe(struct eeh_pe *pe)return ret; } +EXPORT_SYMBOL_GPL (eeh_unfreeze_pe);static struct pci_device_id eeh_reset_ids[] = {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 278/369 powerpc/eeh: Make EEH driver device hotplug safe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit 1010b4c012b0d78dfb9d3132b49aa2ef024a07a7 ]
Multiple race conditions existed between the PCIe hotplug driver and the EEH driver, leading to a variety of kernel oopses of the same general nature:
<pcie device unplug>
<eeh driver trigger>
<hotplug removal trigger>
<pcie tree reconfiguration>
<eeh recovery next step>
<oops in EEH driver bus iteration loop>
A second class of oops is also seen when the underlying bus disappears during device recovery.
Refactor the EEH module to be PCI rescan and remove safe. Also clean up a few minor formatting / readability issues.
--- arch/powerpc/kernel/eeh_driver.c | 48 +++++++++++++++++++++----------- arch/powerpc/kernel/eeh_pe.c | 10 ++++--- 2 files changed, 38 insertions(+), 20 deletions(-)
arch/powerpc/kernel/eeh_driver.c +32 -16
@@ -257,13 +257,12 @@ static void eeh_pe_report_edev(struct eeh_dev *edev, eeh_report_fn fn,struct pci_driver *driver;enum pci_ers_result new_result; -pci_lock_rescan_remove (); pdev = edev->pdev;if (pdev)get_device (&pdev->dev); -pci_unlock_rescan_remove ();if (!pdev) {eeh_edev_info (edev,"no device" ); + *result =PCI_ERS_RESULT_DISCONNECT ;return ; }device_lock (&pdev->dev);
@@ -304,8 +303,9 @@ static void eeh_pe_report(const char *name, struct eeh_pe *root,struct eeh_dev *edev, *tmp;pr_info ("EEH: Beginning: '%s'\n" , name); - eeh_for_each_pe(root, pe) eeh_pe_for_each_dev(pe, edev, tmp) -eeh_pe_report_edev (edev, fn, result); +eeh_for_each_pe (root, pe) +eeh_pe_for_each_dev (pe, edev, tmp) +eeh_pe_report_edev (edev, fn, result);if (result)pr_info ("EEH: Finished:'%s' with aggregate recovery state:'%s'\n" , name,pci_ers_result_name (*result));
@@ -383,6 +383,8 @@ static void eeh_dev_restore_state(struct eeh_dev *edev, void *userdata)if (!edev)return ; +pci_lock_rescan_remove (); +/* * The content in the config space isn't saved because * the blocked config space on some adapters. We have
@@ -393,14 +395,19 @@ static void eeh_dev_restore_state(struct eeh_dev *edev, void *userdata)if (list_is_last (&edev->entry, &edev->pe->edevs))eeh_pe_restore_bars (edev->pe); +pci_unlock_rescan_remove ();return ; } pdev =eeh_dev_to_pci_dev (edev); -if (!pdev) +if (!pdev) { +pci_unlock_rescan_remove ();return ; + }pci_restore_state (pdev); + +pci_unlock_rescan_remove (); }/**
@@ -647,9 +654,7 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus,if (any_passed || driver_eeh_aware || (pe->type &EEH_PE_VF )) {eeh_pe_dev_traverse (pe, eeh_rmv_device, rmv_data); }else { -pci_lock_rescan_remove ();pci_hp_remove_devices (bus); -pci_unlock_rescan_remove (); }/*
@@ -665,8 +670,6 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus,if (rc)return rc; -pci_lock_rescan_remove (); -/* Restore PE */ eeh_ops->configure_bridge (pe);eeh_pe_restore_bars (pe);
@@ -674,7 +677,6 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus,/* Clear frozen state */ rc =eeh_clear_pe_frozen_state (pe, false);if (rc) { -pci_unlock_rescan_remove ();return rc; }
@@ -709,7 +711,6 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus, pe->tstamp = tstamp; pe->freeze_count = cnt; -pci_unlock_rescan_remove ();return 0 ; }
@@ -843,10 +844,13 @@ void eeh_handle_normal_event(struct eeh_pe *pe) {LIST_HEAD_INIT(rmv_data.removed_vf_list), 0};int devices =0 ; +pci_lock_rescan_remove (); + bus =eeh_pe_bus_get (pe);if (!bus) {pr_err ("%s: Cannot find PCI bus for PHB#%x-PE#%x\n" , __func__, pe->phb->global_number, pe->addr); +pci_unlock_rescan_remove ();return ; }
@@ -1094,10 +1098,15 @@ void eeh_handle_normal_event(struct eeh_pe *pe)eeh_pe_state_clear (pe,EEH_PE_PRI_BUS , true);eeh_pe_dev_mode_mark (pe,EEH_DEV_REMOVED ); -pci_lock_rescan_remove (); -pci_hp_remove_devices (bus); -pci_unlock_rescan_remove (); + bus =eeh_pe_bus_get (pe); +if (bus) +pci_hp_remove_devices (bus); +else +pr_err ("%s: PCI bus for PHB#%x-PE#%x disappeared\n" , + __func__, pe->phb->global_number, pe->addr); +/* The passed PE should no longer be used */ +pci_unlock_rescan_remove ();return ; }
@@ -1114,6 +1123,8 @@ void eeh_handle_normal_event(struct eeh_pe *pe)eeh_clear_slot_attention (edev->pdev);eeh_pe_state_clear (pe,EEH_PE_RECOVERING , true); + +pci_unlock_rescan_remove (); }/**
@@ -1132,6 +1143,7 @@ void eeh_handle_special_event(void)unsigned long flags;int rc; +pci_lock_rescan_remove (); do { rc = eeh_ops->next_error(&pe);
@@ -1171,10 +1183,12 @@ void eeh_handle_special_event(void)break ;case EEH_NEXT_ERR_NONE : +pci_unlock_rescan_remove ();return ;default :pr_warn ("%s: Invalid value %d from next_error()\n" , __func__, rc); +pci_unlock_rescan_remove ();return ; }
@@ -1186,7 +1200,9 @@ void eeh_handle_special_event(void)if (rc ==EEH_NEXT_ERR_FROZEN_PE || rc ==EEH_NEXT_ERR_FENCED_PHB ) {eeh_pe_state_mark (pe,EEH_PE_RECOVERING ); +pci_unlock_rescan_remove ();eeh_handle_normal_event (pe); +pci_lock_rescan_remove (); }else {eeh_for_each_pe (pe, tmp_pe)eeh_pe_for_each_dev (tmp_pe, edev, tmp_edev)
@@ -1199,7 +1215,6 @@ void eeh_handle_special_event(void) eeh_report_failure, NULL);eeh_set_channel_state (pe, pci_channel_io_perm_failure); -pci_lock_rescan_remove ();list_for_each_entry (hose, &hose_list, list_node) { phb_pe =eeh_phb_pe_get (hose); if (!phb_pe ||
@@ -1218,7 +1233,6 @@ void eeh_handle_special_event(void) }pci_hp_remove_devices (bus); } -pci_unlock_rescan_remove (); }/*
@@ -1228,4 +1242,6 @@ void eeh_handle_special_event(void)if (rc ==EEH_NEXT_ERR_DEAD_IOC )break ; }while (rc !=EEH_NEXT_ERR_NONE ); + +pci_unlock_rescan_remove (); }
arch/powerpc/kernel/eeh_pe.c +6 -4
@@ -671,10 +671,12 @@ static void eeh_bridge_check_link(struct eeh_dev *edev) eeh_ops->write_config (edev, cap +PCI_EXP_LNKCTL ,2 , val);/* Check link */ -if (!edev->pdev->link_active_reporting) { -eeh_edev_dbg (edev,"No link reporting capability\n" ); -msleep (1000 ); -return ; +if (edev->pdev) { +if (!edev->pdev->link_active_reporting) { +eeh_edev_dbg (edev,"No link reporting capability\n" ); +msleep (1000 ); +return ; + } }/* Wait the link is up until timeout (5s) */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 279/369 PCI: pnv_php: Fix surprise plug detection and recovery
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit a2a2a6fc2469524caa713036297c542746d148dc ]
The existing PowerNV hotplug code did not handle surprise plug events correctly, leading to a complete failure of the hotplug system after device removal and a required reboot to detect new devices.
This comes down to two issues:
1) When a device is surprise removed, often the bridge upstream port will cause a PE freeze on the PHB. If this freeze is not cleared, the MSI interrupts from the bridge hotplug notification logic will not be received by the kernel, stalling all plug events on all slots associated with the PE.
2) When a device is removed from a slot, regardless of surprise or programmatic removal, the associated PHB/PE ls left frozen. If this freeze is not cleared via a fundamental reset, skiboot is unable to clear the freeze and cannot retrain / rescan the slot. This also requires a reboot to clear the freeze and redetect the device in the slot.
Issue the appropriate unfreeze and rescan commands on hotplug events, and don't oops on hotplug if pci_bus_to_OF_node() returns NULL.
--- arch/powerpc/kernel/pci-hotplug.c | 3 + drivers/pci/hotplug/pnv_php.c | 110 +++++++++++++++++++++++++++++- 2 files changed, 110 insertions(+), 3 deletions(-)
arch/powerpc/kernel/pci-hotplug.c +3 -0
@@ -141,6 +141,9 @@ void pci_hp_add_devices(struct pci_bus *bus)struct pci_controller *phb;struct device_node *dn =pci_bus_to_OF_node (bus); +if (!dn) +return ; + phb =pci_bus_to_host (bus); mode =PCI_PROBE_NORMAL ;
drivers/pci/hotplug/pnv_php.c +107 -3
148 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 280/369 pNFS/flexfiles: dont attempt pnfs on fatal DS errors
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tigran Mkrtchyan <[email protected]>
[ Upstream commit f06bedfa62d57f7b67d44aacd6badad2e13a803f ]
When an applications get killed (SIGTERM/SIGINT) while pNFS client performs a connection to DS, client ends in an infinite loop of connect-disconnect. This
source of the issue, it that flexfilelayoutdev#nfs4_ff_layout_prepare_ds gets an error on nfs4_pnfs_ds_connect with status ERESTARTSYS, which is set by rpc_signal_task, but the error is treated as transient, thus retried.
The issue is reproducible with Ctrl+C the following script(there should be ~1000 files in a directory, client should must not have any connections to DSes):
``` echo 3 > /proc/sys/vm/drop_caches for i in * do head -1 $i done ```
The change aims to propagate the nfs4_ff_layout_prepare_ds error state to the caller that can decide whatever this is a retryable error or not.
--- fs/nfs/flexfilelayout/flexfilelayout.c | 26 ++++++++++++++--------- fs/nfs/flexfilelayout/flexfilelayoutdev.c | 6 +++--- 2 files changed, 19 insertions(+), 13 deletions(-)
fs/nfs/flexfilelayout/flexfilelayout.c +16 -10
@@ -761,14 +761,14 @@ ff_layout_choose_ds_for_read(struct pnfs_layout_segment *lseg, {struct nfs4_ff_layout_segment *fls =FF_LAYOUT_LSEG (lseg);struct nfs4_ff_layout_mirror *mirror; -struct nfs4_pnfs_ds *ds; +struct nfs4_pnfs_ds *ds =ERR_PTR (-EAGAIN );u32 idx;/* mirrors are initially sorted by efficiency */ for (idx = start_idx; idx < fls->mirror_array_cnt; idx++) { mirror =FF_LAYOUT_COMP (lseg, idx); ds =nfs4_ff_layout_prepare_ds (lseg, mirror, false); -if (!ds) +if (IS_ERR (ds))continue ; if (check_device &&
@@ -776,10 +776,10 @@ ff_layout_choose_ds_for_read(struct pnfs_layout_segment *lseg,continue ; *best_idx = idx; -return ds; +break ; } -return NULL ; +return ds; } static struct nfs4_pnfs_ds *
@@ -941,7 +941,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,for (i =0 ; i < pgio->pg_mirror_count; i++) { mirror =FF_LAYOUT_COMP (pgio->pg_lseg, i); ds =nfs4_ff_layout_prepare_ds (pgio->pg_lseg, mirror, true); -if (!ds) { +if (IS_ERR (ds)) {if (!ff_layout_no_fallback_to_mds (pgio->pg_lseg)) goto out_mds;pnfs_generic_pg_cleanup (pgio);
@@ -1848,6 +1848,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)u32 idx = hdr->pgio_mirror_idx;int vers;struct nfs_fh *fh; +bool ds_fatal_error = false; dprintk("--> %s ino %lu pgbase %u req %zu@%llu\n", __func__, hdr->inode->i_ino,
@@ -1855,8 +1856,10 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr) mirror =FF_LAYOUT_COMP (lseg, idx); ds =nfs4_ff_layout_prepare_ds (lseg, mirror, false); -if (!ds) +if (IS_ERR (ds)) { + ds_fatal_error =nfs_error_is_fatal (PTR_ERR (ds)); goto out_failed; + } ds_clnt =nfs4_ff_find_or_create_ds_client (mirror, ds->ds_clp, hdr->inode);
@@ -1904,7 +1907,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)return PNFS_ATTEMPTED ; out_failed: -if (ff_layout_avoid_mds_available_ds (lseg)) +if (ff_layout_avoid_mds_available_ds (lseg) && !ds_fatal_error)return PNFS_TRY_AGAIN ; trace_pnfs_mds_fallback_read_pagelist(hdr->inode, hdr->args.offset, hdr->args.count,
@@ -1926,11 +1929,14 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)int vers;struct nfs_fh *fh;u32 idx = hdr->pgio_mirror_idx; +bool ds_fatal_error = false; mirror =FF_LAYOUT_COMP (lseg, idx); ds =nfs4_ff_layout_prepare_ds (lseg, mirror, true); -if (!ds) +if (IS_ERR (ds)) { + ds_fatal_error =nfs_error_is_fatal (PTR_ERR (ds)); goto out_failed; + } ds_clnt =nfs4_ff_find_or_create_ds_client (mirror, ds->ds_clp, hdr->inode);
@@ -1981,7 +1987,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)return PNFS_ATTEMPTED ; out_failed: -if (ff_layout_avoid_mds_available_ds (lseg)) +if (ff_layout_avoid_mds_available_ds (lseg) && !ds_fatal_error)return PNFS_TRY_AGAIN ; trace_pnfs_mds_fallback_write_pagelist(hdr->inode, hdr->args.offset, hdr->args.count,
@@ -2024,7 +2030,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how) idx =calc_ds_index_from_commit (lseg, data->ds_commit_index); mirror =FF_LAYOUT_COMP (lseg, idx); ds =nfs4_ff_layout_prepare_ds (lseg, mirror, true); -if (!ds) +if (IS_ERR (ds)) goto out_err; ds_clnt = nfs4_ff_find_or_create_ds_client(mirror, ds->ds_clp,
fs/nfs/flexfilelayout/flexfilelayoutdev.c +3 -3
@@ -370,11 +370,11 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, struct nfs4_ff_layout_mirror *mirror, bool fail_return) { -struct nfs4_pnfs_ds *ds =NULL ; +struct nfs4_pnfs_ds *ds;struct inode *ino = lseg->pls_layout->plh_inode;struct nfs_server *s =NFS_SERVER (ino);unsigned int max_payload; -int status; +int status = -EAGAIN ;if (!ff_layout_init_mirror_ds (lseg->pls_layout, mirror)) goto noconnect;
@@ -418,7 +418,7 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,ff_layout_send_layouterror (lseg);if (fail_return || !ff_layout_has_available_ds (lseg))pnfs_error_mark_layout_for_return (ino, lseg); - ds =NULL ; + ds =ERR_PTR (status); out:return ds; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 281/369 sched: Add test_and_clear_wake_up_bit() and atomic_dec_and_wake_up()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 52d633def56c10fe3e82a2c5d88c3ecb3f4e4852 ]
There are common patterns in the kernel of using test_and_clear_bit() before wake_up_bit(), and atomic_dec_and_test() before wake_up_var().
These combinations don't need extra barriers but sometimes include them unnecessarily.
To help avoid the unnecessary barriers and to help discourage the general use of wake_up_bit/var (which is a fragile interface) introduce two combined functions which implement these patterns.
Also add store_release_wake_up() which supports the task of simply setting a non-atomic variable and sending a wakeup. This pattern requires barriers which are often omitted.
Stable-dep-of: 1db3a48e83bb ("NFS: Fix wakeup of __nfs_lookup_revalidate() in unblock_revalidate()")
--- include/linux/wait_bit.h | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+)
include/linux/wait_bit.h +60 -0
@@ -335,4 +335,64 @@ static inline void clear_and_wake_up_bit(int bit, void *word) wake_up_bit(word, bit); } +/** +* test_and_clear_wake_up_bit - clear a bit if it was set: wake up anyone waiting on that bit +* @bit: the bit of the word being waited on +* @word: the address of memory containing that bit +* +* If the bit is set and can be atomically cleared, any tasks waiting in +* wait_on_bit() or similar will be woken. This call has the same +* complete ordering semantics as test_and_clear_bit(). Any changes to +* memory made before this call are guaranteed to be visible after the +* corresponding wait_on_bit() completes. +* +* Returns %true if the bit was successfully set and the wake up was sent. +*/ +static inline bool test_and_clear_wake_up_bit (int bit,unsigned long *word) +{ +if (!test_and_clear_bit (bit, word)) +return false; +/* no extra barrier required */ +wake_up_bit (word, bit); +return true; +} + +/** +* atomic_dec_and_wake_up - decrement an atomic_t and if zero, wake up waiters +* @var: the variable to dec and test +* +* Decrements the atomic variable and if it reaches zero, send a wake_up to any +* processes waiting on the variable. +* +* This function has the same complete ordering semantics as atomic_dec_and_test. +* +* Returns %true is the variable reaches zero and the wake up was sent. +*/ + +static inline bool atomic_dec_and_wake_up (atomic_t *var) +{ +if (!atomic_dec_and_test (var)) +return false; +/* No extra barrier required */ +wake_up_var (var); +return true; +} + +/** +* store_release_wake_up - update a variable and send a wake_up +* @var: the address of the variable to be updated and woken +* @val: the value to store in the variable. +* +* Store the given value in the variable send a wake up to any tasks +* waiting on the variable. All necessary barriers are included to ensure +* the task calling wait_var_event() sees the new value and all values +* written to memory before this call. +*/ +#define store_release_wake_up (var, val) \ +do { \ + smp_store_release(var, val); \ + smp_mb(); \ + wake_up_var(var); \ +} while (0) +#endif /* _LINUX_WAIT_BIT_H */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 282/369 NFS: Fix wakeup of __nfs_lookup_revalidate() in unblock_revalidate()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 1db3a48e83bb64a70bf27263b7002585574a9c2d ]
Use store_release_wake_up() to add the appropriate memory barrier before calling wake_up_var(&dentry->d_fsdata).
--- fs/nfs/dir.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/nfs/dir.c +1 -3
@@ -1837,9 +1837,7 @@ static void block_revalidate(struct dentry *dentry)static void unblock_revalidate (struct dentry *dentry) { -/* store_release ensures wait_var_event() sees the update */ -smp_store_release (&dentry->d_fsdata,NULL ); -wake_up_var (&dentry->d_fsdata); +store_release_wake_up (&dentry->d_fsdata,NULL ); }/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 283/369 NFS: Fix filehandle bounds checking in nfs_fh_to_dentry()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit ef93a685e01a281b5e2a25ce4e3428cf9371a205 ]
The function needs to check the minimal filehandle length before it can access the embedded filehandle.
--- fs/nfs/export.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/nfs/export.c +9 -2
@@ -66,14 +66,21 @@ nfs_fh_to_dentry(struct super_block *sb, struct fid *fid, {struct nfs_fattr *fattr =NULL ;struct nfs_fh *server_fh =nfs_exp_embedfh (fid->raw); -size_t fh_size = offsetof(struct nfs_fh , data) + server_fh->size; +size_t fh_size = offsetof(struct nfs_fh , data);const struct nfs_rpc_ops *rpc_ops;struct dentry *dentry;struct inode *inode; -int len =EMBED_FH_OFF +XDR_QUADLEN (fh_size); +int len =EMBED_FH_OFF ;u32 *p = fid->raw;int ret; +/* Initial check of bounds */ +if (fh_len < len +XDR_QUADLEN (fh_size) || + fh_len >XDR_QUADLEN (NFS_MAXFHSIZE )) +return NULL ; +/* Calculate embedded filehandle size */ + fh_size += server_fh->size; + len +=XDR_QUADLEN (fh_size);/* NULL translates to ESTALE */ if (fh_len < len || fh_type != len)return NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 284/369 NFSv4.2: another fix for listxattr
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olga Kornievskaia <[email protected]>
[ Upstream commit 9acb237deff7667b0f6b10fe6b1b70c4429ea049 ]
Currently, when the server supports NFS4.1 security labels then security.selinux label in included twice. Instead, only add it when the server doesn't possess security label support.
--- fs/nfs/nfs4proc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/nfs/nfs4proc.c +6 -4
@@ -10819,7 +10819,7 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {static ssize_t nfs4_listxattr (struct dentry *dentry,char *list,size_t size) { -ssize_t error, error2, error3, error4; +ssize_t error, error2, error3, error4 =0 ;size_t left = size; error =generic_listxattr (dentry, list, left);
@@ -10847,9 +10847,11 @@ static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) left -= error3; } - error4 =security_inode_listsecurity (d_inode (dentry), list, left); -if (error4 <0 ) -return error4; +if (!nfs_server_capable (d_inode (dentry),NFS_CAP_SECURITY_LABEL )) { + error4 =security_inode_listsecurity (d_inode (dentry), list, left); +if (error4 <0 ) +return error4; + } error += error2 + error3 + error4;if (size && error > size)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 285/369 NFS: Fixup allocation flags for nfsiods __GFP_NORETRY
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Coddington <[email protected]>
[ Upstream commit 99765233ab42bf7a4950377ad7894dce8a5c0e60 ]
If the NFS client is doing writeback from a workqueue context, avoid using __GFP_NORETRY for allocations if the task has set PF_MEMALLOC_NOIO or PF_MEMALLOC_NOFS. The combination of these flags makes memory allocation failures much more likely.
We've seen those allocation failures show up when the loopback driver is doing writeback from a workqueue to a file on NFS, where memory allocation failure results in errors or corruption within the loopback device's filesystem.
--- fs/nfs/internal.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/nfs/internal.h +6 -3
@@ -668,9 +668,12 @@ nfs_write_match_verf(const struct nfs_writeverf *verf,static inline gfp_t nfs_io_gfp_mask (void ) { -if (current->flags &PF_WQ_WORKER ) -return GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN; -return GFP_KERNEL ; +gfp_t ret =current_gfp_context (GFP_KERNEL ); + +/* For workers __GFP_NORETRY only with __GFP_IO or __GFP_FS */ +if ((current->flags &PF_WQ_WORKER ) && ret ==GFP_KERNEL ) + ret |= __GFP_NORETRY | __GFP_NOWARN; +return ret; }/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 286/369 md/md-cluster: handle REMOVE message earlier
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heming Zhao <[email protected]>
[ Upstream commit 948b1fe12005d39e2b49087b50e5ee55c9a8f76f ]
Commit a1fd37f97808 ("md: Don't wait for MD_RECOVERY_NEEDED for HOT_REMOVE_DISK ioctl") introduced a regression in the md_cluster module. (Failed cases 02r1_Manage_re-add & 02r10_Manage_re-add)
Consider a 2-node cluster:
- node1 set faulty & remove command on a disk.
- node2 must correctly update the array metadata.
Before a1fd37f97808, on node1, the delay between msg:METADATA_UPDATED (triggered by faulty) and msg:REMOVE was sufficient for node2 to reload the disk info (written by node1).
After a1fd37f97808, node1 no longer waits between faulty and remove, causing it to send msg:REMOVE while node2 is still reloading disk info. This often results in node2 failing to remove the faulty disk.
== how to trigger ==
set up a 2-node cluster (node1 & node2) with disks vdc & vdd.
on node1:
mdadm -CR /dev/md0 -l1 -b clustered -n2 /dev/vdc /dev/vdd --assume-clean ssh node2-ip mdadm -A /dev/md0 /dev/vdc /dev/vdd
mdadm --manage /dev/md0 --fail /dev/vdc --remove /dev/vdc
check array status on both nodes with "mdadm -D /dev/md0". node1 output:
Number Major Minor RaidDevice State
- 0 0 0 removed
1 254 48 1 active sync /dev/vdd
node2 output:
Number Major Minor RaidDevice State
- 0 0 0 removed
1 254 48 1 active sync /dev/vdd
0 254 32 - faulty /dev/vdc
--- drivers/md/md.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/md/md.c +6 -3
@@ -9702,8 +9702,8 @@ void md_check_recovery(struct mddev *mddev)* remove disk. */ rdev_for_each_safe (rdev, tmp, mddev) { -if (test_and_clear_bit (ClusterRemove, &rdev->flags) && - rdev->raid_disk <0 ) +if (rdev->raid_disk <0 && +test_and_clear_bit (ClusterRemove, &rdev->flags))md_kick_rdev_from_array (rdev); } }
@@ -10000,8 +10000,11 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)/* Check for change of roles in the active devices */ rdev_for_each_safe (rdev2, tmp, mddev) { -if (test_bit (Faulty, &rdev2->flags)) +if (test_bit (Faulty, &rdev2->flags)) { +if (test_bit (ClusterRemove, &rdev2->flags)) +set_bit (MD_RECOVERY_NEEDED , &mddev->recovery);continue ; + }/* Check if the roles changed */ role =le16_to_cpu (sb->dev_roles[rdev2->desc_nr]);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 287/369 netpoll: prevent hanging NAPI when netcons gets enabled
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 2da4def0f487f24bbb0cece3bb2bcdcb918a0b72 ]
Paolo spotted hangs in NIPA running driver tests against virtio. The tests hang in virtnet_close() -> virtnet_napi_tx_disable().
The problem is only reproducible if running multiple of our tests in sequence (I used TEST_PROGS="xdp.py ping.py netcons_basic.sh \netpoll_basic.py stats.py"). Initial suspicion was that this is a simple case of double-disable of NAPI, but instrumenting the code reveals:
Deadlocked on NAPI ffff888007cd82c0 (virtnet_poll_tx):
state: 0x37, disabled: false, owner: 0, listed: false, weight: 64
The NAPI was not in fact disabled, owner is 0 (rather than -1), so the NAPI "thinks" it's scheduled for CPU 0 but it's not listed (!list_empty(&n->poll_list) => false). It seems odd that normal NAPI processing would wedge itself like this.
Better suspicion is that netpoll gets enabled while NAPI is polling, and also grabs the NAPI instance. This confuses napi_complete_done():
[netpoll] [normal NAPI]
napi_poll()
have = netpoll_poll_lock()
rcu_access_pointer(dev->npinfo)
return NULL # no netpoll
__napi_poll()
->poll(->weight)
poll_napi()
cmpxchg(->poll_owner, -1, cpu)
poll_one_napi()
set_bit(NAPI_STATE_NPSVC, ->state)
napi_complete_done()
if (NAPIF_STATE_NPSVC)
return false
# exit without clearing SCHEDThis feels very unlikely, but perhaps virtio has some interactions with the hypervisor in the NAPI ->poll that makes the race window larger?
Best I could to to prove the theory was to add and trigger this warning in napi_poll (just before netpoll_poll_unlock()):
WARN_ONCE(!have && rcu_access_pointer(n->dev->npinfo) &&
napi_is_scheduled(n) && list_empty(&n->poll_list),
"NAPI race with netpoll %px", n);If this warning hits the next virtio_close() will hang.
This patch survived 30 test iterations without a hang (without it the longest clean run was around 10). Credit for triggering this goes to Breno's recent netconsole tests.
--- net/core/netpoll.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/core/netpoll.c +7 -0
@@ -784,6 +784,13 @@ int netpoll_setup(struct netpoll *np)if (err) goto put;rtnl_unlock (); + +/* Make sure all NAPI polls which started before dev->npinfo +* was visible have exited before we start calling NAPI poll. +* NAPI skips locking if dev->npinfo is NULL. +*/ +synchronize_rcu (); +return 0 ; put:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 288/369 phy: mscc: Fix parsing of unicast frames
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Horatiu Vultur <[email protected]>
[ Upstream commit 6fb5ff63b35b7e849cc8510957f25753f87f63d2 ]
According to the 1588 standard, it is possible to use both unicast and multicast frames to send the PTP information. It was noticed that if the frames were unicast they were not processed by the analyzer meaning that they were not timestamped. Therefore fix this to match also these unicast frames.
--- drivers/net/phy/mscc/mscc_ptp.c | 1 + drivers/net/phy/mscc/mscc_ptp.h | 1 + 2 files changed, 2 insertions(+)
drivers/net/phy/mscc/mscc_ptp.c +1 -0
@@ -897,6 +897,7 @@ static int vsc85xx_eth1_conf(struct phy_device *phydev, enum ts_blk blk, get_unaligned_be32(ptp_multicast)); }else { val |=ANA_ETH1_FLOW_ADDR_MATCH2_ANY_MULTICAST ; + val |=ANA_ETH1_FLOW_ADDR_MATCH2_ANY_UNICAST ;vsc85xx_ts_write_csr (phydev, blk,MSCC_ANA_ETH1_FLOW_ADDR_MATCH2 (0 ), val); vsc85xx_ts_write_csr(phydev, blk,
drivers/net/phy/mscc/mscc_ptp.h +1 -0
@@ -98,6 +98,7 @@#define MSCC_ANA_ETH1_FLOW_ADDR_MATCH2 (x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 3)#define ANA_ETH1_FLOW_ADDR_MATCH2_MASK_MASK GENMASK(22, 20)#define ANA_ETH1_FLOW_ADDR_MATCH2_ANY_MULTICAST 0x400000 +#define ANA_ETH1_FLOW_ADDR_MATCH2_ANY_UNICAST 0x200000#define ANA_ETH1_FLOW_ADDR_MATCH2_FULL_ADDR 0x100000#define ANA_ETH1_FLOW_ADDR_MATCH2_SRC_DEST_MASK GENMASK(17, 16)#define ANA_ETH1_FLOW_ADDR_MATCH2_SRC_DEST 0x020000
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 289/369 net: ipa: add IPA v5.1 and v5.5 to ipa_version_string()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Weiss <[email protected]>
[ Upstream commit f2aa00e4f65efcf25ff6bc8198e21f031e7b9b1b ]
Handle the case for v5.1 and v5.5 instead of returning "0.0".
Also reword the comment below since I don't see any evidence of such a check happening, and - since 5.5 has been missing - can happen.
--- drivers/net/ipa/ipa_sysfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ipa/ipa_sysfs.c +5 -1
@@ -37,8 +37,12 @@ static const char *ipa_version_string(struct ipa *ipa)return "4.11" ;case IPA_VERSION_5_0 :return "5.0" ; +case IPA_VERSION_5_1 : +return "5.1" ; +case IPA_VERSION_5_5 : +return "5.5" ;default : -return "0.0" ;/* Won't happen (checked at probe time) */ +return "0.0" ;/* Should not happen */ } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 290/369 pptp: ensure minimal skb length in pptp_xmit()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit de9c4861fb42f0cd72da844c3c34f692d5895b7b ]
Commit aabc6596ffb3 ("net: ppp: Add bound checking for skb data on ppp_sync_txmung") fixed ppp_sync_txmunge()
We need a similar fix in pptp_xmit(), otherwise we might read uninit data as reported by syzbot.
BUG: KMSAN: uninit-value in pptp_xmit+0xc34/0x2720 drivers/net/ppp/pptp.c:193 pptp_xmit+0xc34/0x2720 drivers/net/ppp/pptp.c:193 ppp_channel_bridge_input drivers/net/ppp/ppp_generic.c:2290 [inline] ppp_input+0x1d6/0xe60 drivers/net/ppp/ppp_generic.c:2314 pppoe_rcv_core+0x1e8/0x760 drivers/net/ppp/pppoe.c:379 sk_backlog_rcv+0x142/0x420 include/net/sock.h:1148 __release_sock+0x1d3/0x330 net/core/sock.c:3213 release_sock+0x6b/0x270 net/core/sock.c:3767 pppoe_sendmsg+0x15d/0xcb0 drivers/net/ppp/pppoe.c:904 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg+0x330/0x3d0 net/socket.c:727 ____sys_sendmsg+0x893/0xd80 net/socket.c:2566 ___sys_sendmsg+0x271/0x3b0 net/socket.c:2620 __sys_sendmmsg+0x2d9/0x7c0 net/socket.c:2709
--- drivers/net/ppp/pptp.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/net/ppp/pptp.c +9 -6
@@ -159,9 +159,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)int len;unsigned char *data;__u32 seq_recv; - - -struct rtable *rt; +struct rtable *rt =NULL ;struct net_device *tdev;struct iphdr *iph;int max_headroom;
@@ -179,16 +177,20 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)if (skb_headroom (skb) < max_headroom ||skb_cloned (skb) ||skb_shared (skb)) {struct sk_buff *new_skb =skb_realloc_headroom (skb, max_headroom); -if (!new_skb) { -ip_rt_put (rt); + +if (!new_skb) goto tx_error; - } +if (skb->sk)skb_set_owner_w (new_skb, skb->sk);consume_skb (skb); skb = new_skb; } +/* Ensure we can safely access protocol field and LCP code */ +if (!pskb_may_pull (skb,3 )) + goto tx_error; + data = skb->data; islcp = ((data[0 ] <<8 ) + data[1 ]) ==PPP_LCP &&1 <= data[2 ] && data[2 ] <=7 ;
@@ -262,6 +264,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)return 1 ; tx_error: +ip_rt_put (rt);kfree_skb (skb);return 1 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 291/369 nvmet: initialize discovery subsys after debugfs is initialized
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohamed Khalfella <[email protected]>
[ Upstream commit 528589947c1802b9357c2a9b96d88cc4a11cd88b ]
During nvme target initialization discovery subsystem is initialized before "nvmet" debugfs directory is created. This results in discovery subsystem debugfs directory to be created in debugfs root directory.
nvmet_init() ->
nvmet_init_discovery() ->
nvmet_subsys_alloc() ->
nvmet_debugfs_subsys_setup()In other words, the codepath above is exeucted before nvmet_debugfs is created. We get /sys/kernel/debug/nqn.2014-08.org.nvmexpress.discovery instead of /sys/kernel/debug/nvmet/nqn.2014-08.org.nvmexpress.discovery. Move nvmet_init_discovery() call after nvmet_init_debugfs() to fix it.
--- drivers/nvme/target/core.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/nvme/target/core.c +6 -6
@@ -1714,24 +1714,24 @@ static int __init nvmet_init(void)if (!nvmet_wq) goto out_free_buffered_work_queue; - error =nvmet_init_discovery (); + error =nvmet_init_debugfs ();if (error) goto out_free_nvmet_work_queue; - error =nvmet_init_debugfs (); + error =nvmet_init_discovery ();if (error) - goto out_exit_discovery; + goto out_exit_debugfs; error =nvmet_init_configfs ();if (error) - goto out_exit_debugfs; + goto out_exit_discovery;return 0 ; -out_exit_debugfs: -nvmet_exit_debugfs (); out_exit_discovery:nvmet_exit_discovery (); +out_exit_debugfs: +nvmet_exit_debugfs (); out_free_nvmet_work_queue:destroy_workqueue (nvmet_wq); out_free_buffered_work_queue:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 292/369 s390/ap: Unmask SLCF bit in card and queue ap functions sysfs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harald Freudenberger <[email protected]>
[ Upstream commit 123b7c7c2ba725daf3bfa5ce421d65b92cb5c075 ]
The SLCF bit ("stateless command filtering") introduced with CEX8 cards was because of the function mask's default value suppressed when user space read the ap function for an AP card or queue. Unmask this bit so that user space applications like lszcrypt can evaluate and list this feature.
--- arch/s390/include/asm/ap.h | 2 +- drivers/s390/crypto/ap_bus.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/s390/include/asm/ap.h +1 -1
@@ -103,7 +103,7 @@ struct ap_tapq_hwinfo { unsigned int accel : 1; /* A */ unsigned int ep11 : 1; /* X */ unsigned int apxa : 1; /* APXA */ - unsigned int : 1; + unsigned int slcf : 1; /* Cmd filtering avail. */ unsigned int class : 8; unsigned int bs : 2; /* SE bind/assoc */ unsigned int : 14;
drivers/s390/crypto/ap_bus.h +1 -1
@@ -180,7 +180,7 @@ struct ap_card {atomic64_t total_request_count;/* # requests ever for this AP device.*/ }; -#define TAPQ_CARD_HWINFO_MASK 0xFEFF0000FFFF0F0FUL +#define TAPQ_CARD_HWINFO_MASK 0xFFFF0000FFFF0F0FUL#define ASSOC_IDX_INVALID 0x10000#define to_ap_card (x) container_of((x), struct ap_card, ap_dev.device)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 293/369 netlink: specs: ethtool: fix module EEPROM input/output arguments
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 01051012887329ea78eaca19b1d2eac4c9f601b5 ]
Module (SFP) eeprom GET has a lot of input params, they are all mistakenly listed as output in the spec. Looks like kernel doesn't output them at all. Correct what are the inputs and what the outputs.
--- Documentation/netlink/specs/ethtool.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
Documentation/netlink/specs/ethtool.yaml +3 -3
@@ -1682,9 +1682,6 @@ operations: do: &module-eeprom-get-op request: - attributes: - - header - reply: attributes: - header - offset
@@ -1692,6 +1689,9 @@ operations: - page - bank - i2c-address + reply: + attributes: + - header - data dump: *module-eeprom-get-op -
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 294/369 block: Fix default IO priority if there is no IO context
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit e2ba58ccc9099514380c3300cbc0750b5055fc1c ]
Upstream commit 53889bcaf536 ("block: make __get_task_ioprio() easier to read") changes the IO priority returned to the caller if no IO context is defined for the task. Prior to this commit, the returned IO priority was determined by task_nice_ioclass() and task_nice_ioprio(). Now it is always IOPRIO_DEFAULT, which translates to IOPRIO_CLASS_NONE with priority
0. However, task_nice_ioclass() returns IOPRIO_CLASS_IDLE, IOPRIO_CLASS_RT, or IOPRIO_CLASS_BE depending on the task scheduling policy, and task_nice_ioprio() returns a value determined by task_nice(). This causes regressions in test code checking the IO priority and class of IO operations on tasks with no IO context.
Fix the problem by returning the IO priority calculated from task_nice_ioclass() and task_nice_ioprio() if no IO context is defined to match earlier behavior.
--- include/linux/ioprio.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/linux/ioprio.h +2 -1
@@ -60,7 +60,8 @@ static inline int __get_task_ioprio(struct task_struct *p)int prio;if (!ioc) -return IOPRIO_DEFAULT ; +return IOPRIO_PRIO_VALUE (task_nice_ioclass (p), +task_nice_ioprio (p));if (p != current)lockdep_assert_held (&p->alloc_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 295/369 block: ensure discard_granularity is zero when discard is not supported
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit fad6551fcf537375702b9af012508156a16a1ff7 ]
Documentation/ABI/stable/sysfs-block states:
What: /sys/block/<disk>/queue/discard_granularity [...]
A discard_granularity of 0 means that the device does not support discard functionality.
but this got broken when sorting out the block limits updates. Fix this by setting the discard_granularity limit to zero when the combined max_discard_sectors is zero.
--- block/blk-settings.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
block/blk-settings.c +10 -3
@@ -320,12 +320,19 @@ static int blk_validate_limits(struct queue_limits *lim) lim->max_discard_sectors =min (lim->max_hw_discard_sectors, lim->max_user_discard_sectors); +/* +* When discard is not supported, discard_granularity should be reported +* as 0 to userspace. +*/ +if (lim->max_discard_sectors) + lim->discard_granularity = +max (lim->discard_granularity, lim->physical_block_size); +else + lim->discard_granularity =0 ; +if (!lim->max_discard_segments) lim->max_discard_segments =1 ; -if (lim->discard_granularity < lim->physical_block_size) - lim->discard_granularity = lim->physical_block_size; -/* * By default there is no limit on the segment boundary alignment, * but if there is one it can't be smaller than the page size as
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 296/369 ASoC: tas2781: Fix the wrong step for TLV on tas2781
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baojun Xu <[email protected]>
[ Upstream commit 9843cf7b6fd6f938c16fde51e86dd0e3ddbefb12 ]
The step for TLV on tas2781, should be 50 (-0.5dB).
--- include/sound/tas2781-tlv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/sound/tas2781-tlv.h +1 -1
@@ -15,7 +15,7 @@#ifndef __TAS2781_TLV_H__#define __TAS2781_TLV_H__ -static const __maybe_unused DECLARE_TLV_DB_SCALE(dvc_tlv, -10000, 100, 0); +static const __maybe_unused DECLARE_TLV_DB_SCALE(dvc_tlv, -10000, 50, 0); static const __maybe_unused DECLARE_TLV_DB_SCALE(amp_vol_tlv, 1100, 50, 0);#endif
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 297/369 spi: cs42l43: Property entry should be a null-terminated array
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Trimmer <[email protected]>
[ Upstream commit ffcfd071eec7973e58c4ffff7da4cb0e9ca7b667 ]
The software node does not specify a count of property entries, so the array must be null-terminated.
When unterminated, this can lead to a fault in the downstream cs35l56 amplifier driver, because the node parse walks off the end of the array into unknown memory.
--- drivers/spi/spi-cs42l43.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-cs42l43.c +1 -1
@@ -265,7 +265,7 @@ static struct spi_board_info *cs42l43_create_bridge_amp(struct cs42l43_spi *privstruct spi_board_info *info;if (spkid >=0 ) { - props =devm_kmalloc (priv->dev,sizeof (*props),GFP_KERNEL ); + props =devm_kcalloc (priv->dev,2 ,sizeof (*props),GFP_KERNEL );if (!props)return NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 298/369 net/mlx5: Correctly set gso_segs when LRO is used
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Paasch <[email protected]>
[ Upstream commit 77bf1c55b2acc7fa3734b14f4561e3d75aea1a90 ]
When gso_segs is left at 0, a number of assumptions will end up being incorrect throughout the stack.
For example, in the GRO-path, we set NAPI_GRO_CB()->count to gso_segs. So, if a non-LRO'ed packet followed by an LRO'ed packet is being processed in GRO, the first one will have NAPI_GRO_CB()->count set to 1 and the next one to 0 (in dev_gro_receive()).
Since commit 531d0d32de3e
("net/mlx5: Correctly set gso_size when LRO is used")
these packets will get merged (as their gso_size now matches). So, we end up in gro_complete() with NAPI_GRO_CB()->count == 1 and thus don't call inet_gro_complete(). Meaning, checksum-validation in tcp_checksum_complete() will fail with a "hw csum failure".
Even before the above mentioned commit, incorrect gso_segs means that other things like TCP's accounting of incoming packets (tp->segs_in, data_segs_in, rcv_ooopack) will be incorrect. Which means that if one does bytes_received/data_segs_in, the result will be bigger than the MTU.
Fix this by initializing gso_segs correctly when LRO is used.
--- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +1 -0
@@ -1569,6 +1569,7 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,unsigned int hdrlen =mlx5e_lro_update_hdr (skb, cqe, cqe_bcnt);skb_shinfo (skb)->gso_size =DIV_ROUND_UP (cqe_bcnt - hdrlen, lro_num_seg); +skb_shinfo (skb)->gso_segs = lro_num_seg;/* Subtract one since we already counted this as one * "regular" packet in mlx5e_complete_rx_cqe() */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 299/369 ipv6: reject malicious packets in ipv6_gso_segment()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d45cf1e7d7180256e17c9ce88e32e8061a7887fe ]
syzbot was able to craft a packet with very long IPv6 extension headers leading to an overflow of skb->transport_header.
This 16bit field has a limited range.
Add skb_reset_transport_header_careful() helper and use it from ipv6_gso_segment()
WARNING: CPU: 0 PID: 5871 at ./include/linux/skbuff.h:3032 skb_reset_transport_header include/linux/skbuff.h:3032 [inline] WARNING: CPU: 0 PID: 5871 at ./include/linux/skbuff.h:3032 ipv6_gso_segment+0x15e2/0x21e0 net/ipv6/ip6_offload.c:151 Modules linked in: CPU: 0 UID: 0 PID: 5871 Comm: syz-executor211 Not tainted 6.16.0-rc6-syzkaller-g7abc678e3084 #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/12/2025 RIP: 0010:skb_reset_transport_header include/linux/skbuff.h:3032 [inline] RIP: 0010:ipv6_gso_segment+0x15e2/0x21e0 net/ipv6/ip6_offload.c:151 Call Trace: <TASK> skb_mac_gso_segment+0x31c/0x640 net/core/gso.c:53 nsh_gso_segment+0x54a/0xe10 net/nsh/nsh.c:110 skb_mac_gso_segment+0x31c/0x640 net/core/gso.c:53 __skb_gso_segment+0x342/0x510 net/core/gso.c:124 skb_gso_segment include/net/gso.h:83 [inline] validate_xmit_skb+0x857/0x11b0 net/core/dev.c:3950 validate_xmit_skb_list+0x84/0x120 net/core/dev.c:4000 sch_direct_xmit+0xd3/0x4b0 net/sched/sch_generic.c:329 __dev_xmit_skb net/core/dev.c:4102 [inline] __dev_queue_xmit+0x17b6/0x3a70 net/core/dev.c:4679
--- include/linux/skbuff.h | 23 +++++++++++++++++++++++ net/ipv6/ip6_offload.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-)
include/linux/skbuff.h +23 -0
@@ -2991,6 +2991,29 @@ static inline void skb_reset_transport_header(struct sk_buff *skb) skb->transport_header = skb->data - skb->head; } +/** +* skb_reset_transport_header_careful - conditionally reset transport header +* @skb: buffer to alter +* +* Hardened version of skb_reset_transport_header(). +* +* Returns: true if the operation was a success. +*/ +static inline bool __must_check +skb_reset_transport_header_careful (struct sk_buff *skb) +{ +long offset = skb->data - skb->head; + + if (unlikely(offset != (typeof(skb->transport_header))offset)) +return false; + + if (unlikely(offset == (typeof(skb->transport_header))~0U)) +return false; + + skb->transport_header = offset; +return true; +} +static inline void skb_set_transport_header (struct sk_buff *skb,const int offset) {
net/ipv6/ip6_offload.c +3 -1
@@ -148,7 +148,9 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, ops =rcu_dereference (inet6_offloads[proto]);if (likely (ops && ops->callbacks.gso_segment)) { -skb_reset_transport_header (skb); +if (!skb_reset_transport_header_careful (skb)) + goto out; + segs = ops->callbacks.gso_segment (skb, features);if (!segs) skb->network_header =skb_mac_header (skb) + nhoff - skb->head;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 300/369 net: mdio: mdio-bcm-unimac: Correct rate fallback logic
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fainelli <[email protected]>
[ Upstream commit a81649a4efd382497bf3d34a623360263adc6993 ]
When the parent clock is a gated clock which has multiple parents, the clock provider (clk-scmi typically) might return a rate of 0 since there is not one of those particular parent clocks that should be chosen for returning a rate. Prior to ee975351cf0c ("net: mdio: mdio-bcm-unimac:
Manage clock around I/O accesses"), we would not always be passing a clock reference depending upon how mdio-bcm-unimac was instantiated. In that case, we would take the fallback path where the rate is hard coded to 250MHz.
Make sure that we still fallback to using a fixed rate for the divider calculation, otherwise we simply ignore the desired MDIO bus clock frequency which can prevent us from interfacing with Ethernet PHYs properly.
--- drivers/net/mdio/mdio-bcm-unimac.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/mdio/mdio-bcm-unimac.c +2 -3
@@ -209,10 +209,9 @@ static int unimac_mdio_clk_set(struct unimac_mdio_priv *priv)if (ret)return ret; -if (!priv->clk) + rate =clk_get_rate (priv->clk); +if (!rate) rate =250000000 ; -else - rate =clk_get_rate (priv->clk); div = (rate / (2 * priv->clk_freq)) -1 ;if (div & ~MDIO_CLK_DIV_MASK ) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 301/369 net: drop UFO packets in udp_rcv_segment()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Liang <[email protected]>
[ Upstream commit d46e51f1c78b9ab9323610feb14238d06d46d519 ]
When sending a packet with virtio_net_hdr to tun device, if the gso_type in virtio_net_hdr is SKB_GSO_UDP and the gso_size is less than udphdr size, below crash may happen.
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:4572! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 0 UID: 0 PID: 62 Comm: mytest Not tainted 6.16.0-rc7 #203 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 RIP: 0010:skb_pull_rcsum+0x8e/0xa0 Code: 00 00 5b c3 cc cc cc cc 8b 93 88 00 00 00 f7 da e8 37 44 38 00 f7 d8 89 83 88 00 00 00 48 8b 83 c8 00 00 00 5b c3 cc cc cc cc <0f> 0b 0f 0b 66 66 2e 0f 1f 84 00 000 RSP: 0018:ffffc900001fba38 EFLAGS: 00000297 RAX: 0000000000000004 RBX: ffff8880040c1000 RCX: ffffc900001fb948 RDX: ffff888003e6d700 RSI: 0000000000000008 RDI: ffff88800411a062 RBP: ffff8880040c1000 R08: 0000000000000000 R09: 0000000000000001 R10: ffff888003606c00 R11: 0000000000000001 R12: 0000000000000000 R13: ffff888004060900 R14: ffff888004050000 R15: ffff888004060900 FS: 000000002406d3c0(0000) GS:ffff888084a19000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020000040 CR3: 0000000004007000 CR4: 00000000000006f0 Call Trace: <TASK> udp_queue_rcv_one_skb+0x176/0x4b0 net/ipv4/udp.c:2445 udp_queue_rcv_skb+0x155/0x1f0 net/ipv4/udp.c:2475 udp_unicast_rcv_skb+0x71/0x90 net/ipv4/udp.c:2626 __udp4_lib_rcv+0x433/0xb00 net/ipv4/udp.c:2690 ip_protocol_deliver_rcu+0xa6/0x160 net/ipv4/ip_input.c:205 ip_local_deliver_finish+0x72/0x90 net/ipv4/ip_input.c:233 ip_sublist_rcv_finish+0x5f/0x70 net/ipv4/ip_input.c:579 ip_sublist_rcv+0x122/0x1b0 net/ipv4/ip_input.c:636 ip_list_rcv+0xf7/0x130 net/ipv4/ip_input.c:670 __netif_receive_skb_list_core+0x21d/0x240 net/core/dev.c:6067 netif_receive_skb_list_internal+0x186/0x2b0 net/core/dev.c:6210 napi_complete_done+0x78/0x180 net/core/dev.c:6580 tun_get_user+0xa63/0x1120 drivers/net/tun.c:1909 tun_chr_write_iter+0x65/0xb0 drivers/net/tun.c:1984 vfs_write+0x300/0x420 fs/read_write.c:593 ksys_write+0x60/0xd0 fs/read_write.c:686 do_syscall_64+0x50/0x1c0 arch/x86/entry/syscall_64.c:63 </TASK>
To trigger gso segment in udp_queue_rcv_skb(), we should also set option UDP_ENCAP_ESPINUDP to enable udp_sk(sk)->encap_rcv. When the encap_rcv hook return 1 in udp_queue_rcv_one_skb(), udp_csum_pull_header() will try to pull udphdr, but the skb size has been segmented to gso size, which leads to this crash.
Previous commit cf329aa42b66 ("udp: cope with UDP GRO packet misdirection") introduces segmentation in UDP receive path only for GRO, which was never intended to be used for UFO, so drop UFO packets in udp_rcv_segment().
--- include/net/udp.h | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
include/net/udp.h +18 -6
@@ -461,6 +461,16 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk, {netdev_features_t features =NETIF_F_SG ;struct sk_buff *segs; +int drop_count; + +/* +* Segmentation in UDP receive path is only for UDP GRO, drop udp +* fragmentation offload (UFO) packets. +*/ +if (skb_shinfo (skb)->gso_type &SKB_GSO_UDP ) { + drop_count =1 ; + goto drop; + }/* Avoid csum recalculation by skb_segment unless userspace explicitly * asks for the final checksum values
@@ -484,16 +494,18 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk,*/ segs =__skb_gso_segment (skb, features, false);if (IS_ERR_OR_NULL (segs)) { -int segs_nr =skb_shinfo (skb)->gso_segs; - -atomic_add (segs_nr, &sk->sk_drops); -SNMP_ADD_STATS (__UDPX_MIB (sk, ipv4),UDP_MIB_INERRORS , segs_nr); -kfree_skb (skb); -return NULL ; + drop_count =skb_shinfo (skb)->gso_segs; + goto drop; }consume_skb (skb);return segs; + +drop: +atomic_add (drop_count, &sk->sk_drops); +SNMP_ADD_STATS (__UDPX_MIB (sk, ipv4),UDP_MIB_INERRORS , drop_count); +kfree_skb (skb); +return NULL ; }static inline void udp_post_segment_fix_csum (struct sk_buff *skb)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 302/369 net/sched: taprio: enforce minimum value for picos_per_byte
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takamitsu Iwai <[email protected]>
[ Upstream commit ae8508b25def57982493c48694ef135973bfabe0 ]
Syzbot reported a WARNING in taprio_get_start_time().
When link speed is 470,589 or greater, q->picos_per_byte becomes too small, causing length_to_duration(q, ETH_ZLEN) to return zero.
This zero value leads to validation failures in fill_sched_entry() and parse_taprio_schedule(), allowing arbitrary values to be assigned to entry->interval and cycle_time. As a result, sched->cycle can become zero.
Since SPEED_800000 is the largest defined speed in include/uapi/linux/ethtool.h, this issue can occur in realistic scenarios.
To ensure length_to_duration() returns a non-zero value for minimum-sized Ethernet frames (ETH_ZLEN = 60), picos_per_byte must be at least 17 (60 * 17 > PSEC_PER_NSEC which is 1000).
This patch enforces a minimum value of 17 for picos_per_byte when the calculated value would be lower, and adds a warning message to inform users that scheduling accuracy may be affected at very high link speeds.
--- net/sched/sch_taprio.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
net/sched/sch_taprio.c +18 -3
@@ -43,6 +43,11 @@ static struct static_key_false taprio_have_working_mqprio;#define TAPRIO_SUPPORTED_FLAGS \ (TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST | TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD)#define TAPRIO_FLAGS_INVALID U32_MAX +/* Minimum value for picos_per_byte to ensure non-zero duration +* for minimum-sized Ethernet frames (ETH_ZLEN = 60). +* 60 * 17 > PSEC_PER_NSEC (1000) +*/ +#define TAPRIO_PICOS_PER_BYTE_MIN 17struct sched_entry {/* Durations between this GCL entry and the GCL entry where the
@@ -1284,7 +1289,8 @@ static void taprio_start_sched(struct Qdisc *sch, }static void taprio_set_picos_per_byte (struct net_device *dev, -struct taprio_sched *q) +struct taprio_sched *q, +struct netlink_ext_ack *extack) {struct ethtool_link_ksettings ecmd;int speed =SPEED_10 ;
@@ -1300,6 +1306,15 @@ static void taprio_set_picos_per_byte(struct net_device *dev, skip: picos_per_byte = (USEC_PER_SEC *8 ) / speed; +if (picos_per_byte <TAPRIO_PICOS_PER_BYTE_MIN ) { +if (!extack) +pr_warn ("Link speed %d is too high. Schedule may be inaccurate.\n" , + speed); +NL_SET_ERR_MSG_FMT_MOD (extack, +"Link speed %d is too high. Schedule may be inaccurate." , + speed); + picos_per_byte =TAPRIO_PICOS_PER_BYTE_MIN ; + }atomic64_set (&q->picos_per_byte, picos_per_byte); netdev_dbg(dev, "taprio: set %s's picos_per_byte to: %lld, linkspeed: %d\n",
@@ -1324,7 +1339,7 @@ static int taprio_dev_notifier(struct notifier_block *nb, unsigned long event,if (dev !=qdisc_dev (q->root))continue ; -taprio_set_picos_per_byte (dev, q); +taprio_set_picos_per_byte (dev, q,NULL ); stab =rtnl_dereference (q->root->stab);
@@ -1848,7 +1863,7 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, q->flags = taprio_flags;/* Needed for length_to_duration() during netlink attribute parsing */ -taprio_set_picos_per_byte (dev, q); +taprio_set_picos_per_byte (dev, q, extack); err =taprio_parse_mqprio_opt (dev, mqprio, extack, q->flags);if (err <0 )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 303/369 sunrpc: fix client side handling of tls alerts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olga Kornievskaia <[email protected]>
[ Upstream commit cc5d59081fa26506d02de2127ab822f40d88bc5a ]
A security exploit was discovered in NFS over TLS in tls_alert_recv due to its assumption that there is valid data in the msghdr's iterator's kvec.
Instead, this patch proposes the rework how control messages are setup and used by sock_recvmsg().
If no control message structure is setup, kTLS layer will read and process TLS data record types. As soon as it encounters a TLS control message, it would return an error. At that point, NFS can setup a kvec backed control buffer and read in the control message such as a TLS alert. Scott found that a msg iterator can advance the kvec pointer as a part of the copy process thus we need to revert the iterator before calling into the tls_alert_recv.
--- net/sunrpc/xprtsock.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-)
net/sunrpc/xprtsock.c +30 -10
@@ -358,7 +358,7 @@ xs_alloc_sparse_pages(struct xdr_buf *buf, size_t want, gfp_t gfp)static int xs_sock_process_cmsg (struct socket *sock,struct msghdr *msg, -struct cmsghdr *cmsg,int ret) +unsigned int *msg_flags,struct cmsghdr *cmsg,int ret) {u8 content_type =tls_get_record_type (sock->sk, cmsg);u8 level, description;
@@ -371,7 +371,7 @@ xs_sock_process_cmsg(struct socket *sock, struct msghdr *msg,* record, even though there might be more frames * waiting to be decrypted. */ - msg->msg_flags &= ~MSG_EOR ; + *msg_flags &= ~MSG_EOR ;break ;case TLS_RECORD_TYPE_ALERT :tls_alert_recv (sock->sk, msg, &level, &description);
@@ -386,19 +386,33 @@ xs_sock_process_cmsg(struct socket *sock, struct msghdr *msg, }static int -xs_sock_recv_cmsg (struct socket *sock,struct msghdr *msg,int flags) +xs_sock_recv_cmsg (struct socket *sock,unsigned int *msg_flags,int flags) {union {struct cmsghdr cmsg;u8 buf[CMSG_SPACE (sizeof (u8))]; } u; +u8 alert[2 ]; +struct kvec alert_kvec = { + .iov_base = alert, + .iov_len =sizeof (alert), + }; +struct msghdr msg = { + .msg_flags = *msg_flags, + .msg_control = &u, + .msg_controllen =sizeof (u), + };int ret; - msg->msg_control = &u; - msg->msg_controllen =sizeof (u); - ret =sock_recvmsg (sock, msg, flags); -if (msg->msg_controllen !=sizeof (u)) - ret =xs_sock_process_cmsg (sock, msg, &u.cmsg, ret); +iov_iter_kvec (&msg.msg_iter,ITER_DEST , &alert_kvec,1 , + alert_kvec.iov_len); + ret =sock_recvmsg (sock, &msg, flags); +if (ret >0 && +tls_get_record_type (sock->sk, &u.cmsg) ==TLS_RECORD_TYPE_ALERT ) { +iov_iter_revert (&msg.msg_iter, ret); + ret =xs_sock_process_cmsg (sock, &msg, msg_flags, &u.cmsg, + -EAGAIN ); + }return ret; }
@@ -408,7 +422,13 @@ xs_sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags, size_t seek)ssize_t ret;if (seek !=0 )iov_iter_advance (&msg->msg_iter, seek); - ret =xs_sock_recv_cmsg (sock, msg, flags); + ret =sock_recvmsg (sock, msg, flags); +/* Handle TLS inband control message lazily */ +if (msg->msg_flags &MSG_CTRUNC ) { + msg->msg_flags &= ~(MSG_CTRUNC |MSG_EOR ); +if (ret ==0 || ret == -EIO ) + ret =xs_sock_recv_cmsg (sock, &msg->msg_flags, flags); + }return ret >0 ? ret + seek : ret; }
@@ -434,7 +454,7 @@ xs_read_discard(struct socket *sock, struct msghdr *msg, int flags, size_t count) {iov_iter_discard (&msg->msg_iter,ITER_DEST , count); -return xs_sock_recv_cmsg (sock, msg, flags); +return xs_sock_recvmsg (sock, msg, flags,0 ); }#if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 304/369 x86/irq: Plug vector setup race
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
[ Upstream commit ce0b5eedcb753697d43f61dd2e27d68eb5d3150f ]
Hogan reported a vector setup race, which overwrites the interrupt descriptor in the per CPU vector array resulting in a disfunctional device.
CPU0 CPU1
interrupt is raised in APIC IRR but not handled
free_irq()
per_cpu(vector_irq, CPU1)[vector] = VECTOR_SHUTDOWN;
request_irq() common_interrupt() d = this_cpu_read(vector_irq[vector]);
per_cpu(vector_irq, CPU1)[vector] = desc;
if (d == VECTOR_SHUTDOWN)
this_cpu_write(vector_irq[vector], VECTOR_UNUSED);free_irq() cannot observe the pending vector in the CPU1 APIC as there is no way to query the remote CPUs APIC IRR.
This requires that request_irq() uses the same vector/CPU as the one which was freed, but this also can be triggered by a spurious interrupt.
Interestingly enough this problem managed to be hidden for more than a decade.
Prevent this by reevaluating vector_irq under the vector lock, which is held by the interrupt activation code when vector_irq is updated.
To avoid ifdeffery or IS_ENABLED() nonsense, move the [un]lock_vector_lock() declarations out under the CONFIG_IRQ_DOMAIN_HIERARCHY guard as it's only provided when CONFIG_X86_LOCAL_APIC=y.
The current CONFIG_IRQ_DOMAIN_HIERARCHY guard is selected by CONFIG_X86_LOCAL_APIC, but can also be selected by other parts of the Kconfig system, which makes 32-bit UP builds with CONFIG_X86_LOCAL_APIC=n fail.
Can we just get rid of this !APIC nonsense once and forever?
--- arch/x86/include/asm/hw_irq.h | 12 ++++--- arch/x86/kernel/irq.c | 63 ++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 20 deletions(-)
arch/x86/include/asm/hw_irq.h +7 -5
@@ -92,8 +92,6 @@ struct irq_cfg {extern struct irq_cfg *irq_cfg (unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data); -extern void lock_vector_lock (void ); -extern void unlock_vector_lock (void );#ifdef CONFIG_SMP extern void vector_schedule_cleanup (struct irq_cfg *);extern void irq_complete_move (struct irq_cfg *cfg);
@@ -101,12 +99,16 @@ extern void irq_complete_move(struct irq_cfg *cfg);static inline void vector_schedule_cleanup (struct irq_cfg *c) { }static inline void irq_complete_move (struct irq_cfg *c) { }#endif -extern void apic_ack_edge (struct irq_data *data); -#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ +#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */ + +#ifdef CONFIG_X86_LOCAL_APIC +extern void lock_vector_lock (void ); +extern void unlock_vector_lock (void ); +#else static inline void lock_vector_lock (void ) {}static inline void unlock_vector_lock (void ) {} -#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */ +#endif /* Statistics */ extern atomic_t irq_err_count;
arch/x86/kernel/irq.c +48 -15
81 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 305/369 benet: fix BUG when creating VFs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Schmidt <[email protected]>
[ Upstream commit 5a40f8af2ba1b9bdf46e2db10e8c9710538fbc63 ]
benet crashes as soon as SRIOV VFs are created:
kernel BUG at mm/vmalloc.c:3457!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 4 UID: 0 PID: 7408 Comm: test.sh Kdump: loaded Not tainted 6.16.0+ #1 PREEMPT(voluntary) [...] RIP: 0010:vunmap+0x5f/0x70 [...] Call Trace: <TASK> __iommu_dma_free+0xe8/0x1c0 be_cmd_set_mac_list+0x3fe/0x640 [be2net] be_cmd_set_mac+0xaf/0x110 [be2net] be_vf_eth_addr_config+0x19f/0x330 [be2net] be_vf_setup+0x4f7/0x990 [be2net] be_pci_sriov_configure+0x3a1/0x470 [be2net] sriov_numvfs_store+0x20b/0x380 kernfs_fop_write_iter+0x354/0x530 vfs_write+0x9b9/0xf60 ksys_write+0xf3/0x1d0 do_syscall_64+0x8c/0x3d0
be_cmd_set_mac_list() calls dma_free_coherent() under a spin_lock_bh. Fix it by freeing only after the lock has been released.
--- drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/emulex/benet/be_cmds.c +1 -1
@@ -3852,8 +3852,8 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, status =be_mcc_notify_wait (adapter); err: -dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);spin_unlock_bh (&adapter->mcc_lock); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);return status; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 306/369 net/sched: mqprio: fix stack out-of-bounds write in tc entry parsing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maher Azzouzi <[email protected]>
[ Upstream commit ffd2dc4c6c49ff4f1e5d34e454a6a55608104c17 ]
TCA_MQPRIO_TC_ENTRY_INDEX is validated using NLA_POLICY_MAX(NLA_U32, TC_QOPT_MAX_QUEUE), which allows the value TC_QOPT_MAX_QUEUE (16). This leads to a 4-byte out-of-bounds stack write in the fp[] array, which only has room for 16 elements (0–15).
Fix this by changing the policy to allow only up to TC_QOPT_MAX_QUEUE - 1.
--- net/sched/sch_mqprio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_mqprio.c +1 -1
@@ -152,7 +152,7 @@ static int mqprio_parse_opt(struct net_device *dev, struct tc_mqprio_qopt *qopt,static const struct nla_policy mqprio_tc_entry_policy[TCA_MQPRIO_TC_ENTRY_MAX +1 ] = { [TCA_MQPRIO_TC_ENTRY_INDEX ] =NLA_POLICY_MAX (NLA_U32 , -TC_QOPT_MAX_QUEUE ), +TC_QOPT_MAX_QUEUE -1 ), [TCA_MQPRIO_TC_ENTRY_FP ] =NLA_POLICY_RANGE (NLA_U32 ,TC_FP_EXPRESS ,TC_FP_PREEMPTIBLE ),
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 307/369 s390/mm: Allocate page table with PAGE_SIZE granularity
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sumanth Korikkar <[email protected]>
[ Upstream commit daa8af80d283ee9a7d42dd6f164a65036665b9d4 ]
Make vmem_pte_alloc() consistent by always allocating page table of PAGE_SIZE granularity, regardless of whether page_table_alloc() (with slab) or memblock_alloc() is used. This ensures page table can be fully freed when the corresponding page table entries are removed.
--- arch/s390/mm/vmem.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/s390/mm/vmem.c +2 -3
@@ -63,13 +63,12 @@ void *vmem_crst_alloc(unsigned long val)pte_t __ref *vmem_pte_alloc (void ) { -unsigned long size =PTRS_PER_PTE *sizeof (pte_t);pte_t *pte;if (slab_is_available ()) - pte = (pte_t *)page_table_alloc (&init_mm); + pte = (pte_t *)page_table_alloc (&init_mm);else - pte = (pte_t *)memblock_alloc (size, size); + pte = (pte_t *)memblock_alloc (PAGE_SIZE ,PAGE_SIZE );if (!pte)return NULL ;memset64 ((u64 *)pte, _PAGE_INVALID,PTRS_PER_PTE );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 308/369 eth: fbnic: remove the debugging trick of super high page bias
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit e407fceeaf1b2959892b4fc9b584843d3f2bfc05 ]
Alex added page bias of LONG_MAX, which is admittedly quite a clever way of catching overflows of the pp ref count. The page pool code was "optimized" to leave the ref at 1 for freed pages so it can't catch basic bugs by itself any more. (Something we should probably address under DEBUG_NET...)
Unfortunately for fbnic since commit f7dc3248dcfb ("skbuff: Optimization of SKB coalescing for page pool") core _may_ actually take two extra pp refcounts, if one of them is returned before driver gives up the bias the ret < 0 check in page_pool_unref_netmem() will trigger.
While at it add a FBNIC_ to the name of the driver constant.
--- drivers/net/ethernet/meta/fbnic/fbnic_txrx.c | 4 ++-- drivers/net/ethernet/meta/fbnic/fbnic_txrx.h | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-)
drivers/net/ethernet/meta/fbnic/fbnic_txrx.c +2 -2
@@ -389,8 +389,8 @@ static void fbnic_page_pool_init(struct fbnic_ring *ring, unsigned int idx, {struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx]; -page_pool_fragment_page (page,PAGECNT_BIAS_MAX ); - rx_buf->pagecnt_bias =PAGECNT_BIAS_MAX ; +page_pool_fragment_page (page,FBNIC_PAGECNT_BIAS_MAX ); + rx_buf->pagecnt_bias =FBNIC_PAGECNT_BIAS_MAX ; rx_buf->page = page; }
drivers/net/ethernet/meta/fbnic/fbnic_txrx.h +2 -4
@@ -59,10 +59,8 @@ struct fbnic_queue_stats {struct u64_stats_sync syncp; }; -/* Pagecnt bias is long max to reserve the last bit to catch overflow -* cases where if we overcharge the bias it will flip over to be negative. -*/ -#define PAGECNT_BIAS_MAX LONG_MAX +#define FBNIC_PAGECNT_BIAS_MAX PAGE_SIZE +struct fbnic_rx_buf {struct page *page;long pagecnt_bias;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 309/369 irqchip: Build IMX_MU_MSI only on ARM
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 3b6a18f0da8720d612d8a682ea5c55870da068e0 ]
Compile-testing IMX_MU_MSI on x86 without PCI_MSI support results in a build failure:
drivers/gpio/gpio-sprd.c:8:include/linux/gpio/driver.h:41:33: error: field 'msiinfo' has incomplete type drivers/iommu/iommufd/viommu.c:4:include/linux/msi.h:528:33: error: field 'alloc_info' has incomplete type
Tighten the dependency further to only allow compile testing on Arm. This could be refined further to allow certain x86 configs.
This was submitted before to address a different build failure, which was fixed differently, but the problem has now returned in a different form.
--- drivers/irqchip/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/irqchip/Kconfig +1 -0
@@ -506,6 +506,7 @@ config IMX_MU_MSI tristate "i.MX MU used as MSI controller" depends on OF && HAS_IOMEM depends on ARCH_MXC || COMPILE_TEST + depends on ARM || ARM64 default m if ARCH_MXC select IRQ_DOMAIN select IRQ_DOMAIN_HIERARCHY
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 310/369 ALSA: hda/ca0132: Fix missing error handling in ca0132_alt_select_out()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 9f320dfb0ffc555aa2eac8331dee0c2c16f67633 ]
There are a couple of cases where the error is ignored or the error code isn't propagated in ca0132_alt_select_out(). Fix those.
--- sound/pci/hda/patch_ca0132.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
sound/pci/hda/patch_ca0132.c +4 -1
@@ -4802,7 +4802,8 @@ static int ca0132_alt_select_out(struct hda_codec *codec)if (err <0 ) goto exit; -if (ca0132_alt_select_out_quirk_set (codec) <0 ) + err =ca0132_alt_select_out_quirk_set (codec); +if (err <0 ) goto exit;switch (spec->cur_out_type) {
@@ -4892,6 +4893,8 @@ static int ca0132_alt_select_out(struct hda_codec *codec) spec->bass_redirection_val); else err =ca0132_alt_surround_set_bass_redirection (codec,0 ); +if (err <0 ) + goto exit;/* Unmute DSP now that we're done with output selection. */ err = dspio_set_uint_param(codec, 0x96,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 311/369 smb: server: remove separate empty_recvmsg_queue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 01027a62b508c48c762096f347de925eedcbd008 ]
There's no need to maintain two lists, we can just have a single list of receive buffers, which are free to use.
--- fs/smb/server/transport_rdma.c | 60 +++++----------------------------- 1 file changed, 8 insertions(+), 52 deletions(-)
fs/smb/server/transport_rdma.c +8 -52
@@ -128,9 +128,6 @@ struct smb_direct_transport {spinlock_t recvmsg_queue_lock;struct list_head recvmsg_queue; -spinlock_t empty_recvmsg_queue_lock; -struct list_head empty_recvmsg_queue; -int send_credit_target;atomic_t send_credits;spinlock_t lock_new_recv_credits;
@@ -275,32 +272,6 @@ static void put_recvmsg(struct smb_direct_transport *t,spin_unlock (&t->recvmsg_queue_lock); } -static struct -smb_direct_recvmsg *get_empty_recvmsg (struct smb_direct_transport *t) -{ -struct smb_direct_recvmsg *recvmsg =NULL ; - -spin_lock (&t->empty_recvmsg_queue_lock); -if (!list_empty (&t->empty_recvmsg_queue)) { - recvmsg =list_first_entry (&t->empty_recvmsg_queue, - struct smb_direct_recvmsg, list); -list_del (&recvmsg->list); - } -spin_unlock (&t->empty_recvmsg_queue_lock); -return recvmsg; -} - -static void put_empty_recvmsg (struct smb_direct_transport *t, -struct smb_direct_recvmsg *recvmsg) -{ -ib_dma_unmap_single (t->cm_id->device, recvmsg->sge.addr, - recvmsg->sge.length,DMA_FROM_DEVICE ); - -spin_lock (&t->empty_recvmsg_queue_lock); -list_add_tail (&recvmsg->list, &t->empty_recvmsg_queue); -spin_unlock (&t->empty_recvmsg_queue_lock); -} -static void enqueue_reassembly (struct smb_direct_transport *t,struct smb_direct_recvmsg *recvmsg,int data_length)
@@ -385,9 +356,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)spin_lock_init (&t->recvmsg_queue_lock);INIT_LIST_HEAD (&t->recvmsg_queue); -spin_lock_init (&t->empty_recvmsg_queue_lock); -INIT_LIST_HEAD (&t->empty_recvmsg_queue); -init_waitqueue_head (&t->wait_send_pending);atomic_set (&t->send_pending,0 );
@@ -553,7 +521,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) wc->opcode);smb_direct_disconnect_rdma_connection (t); } -put_empty_recvmsg (t, recvmsg); +put_recvmsg (t, recvmsg);return ; }
@@ -567,7 +535,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)switch (recvmsg->type) {case SMB_DIRECT_MSG_NEGOTIATE_REQ :if (wc->byte_len <sizeof (struct smb_direct_negotiate_req )) { -put_empty_recvmsg (t, recvmsg); +put_recvmsg (t, recvmsg);return ; } t->negotiation_requested = true;
@@ -584,7 +552,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (wc->byte_len < offsetof(struct smb_direct_data_transfer , padding)) { -put_empty_recvmsg (t, recvmsg); +put_recvmsg (t, recvmsg);return ; }
@@ -592,7 +560,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (data_length) {if (wc->byte_len <sizeof (struct smb_direct_data_transfer ) + (u64 )data_length) { -put_empty_recvmsg (t, recvmsg); +put_recvmsg (t, recvmsg);return ; }
@@ -612,7 +580,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) avail_recvmsg_count = t->count_avail_recvmsg;spin_unlock (&t->receive_credit_lock); }else { -put_empty_recvmsg (t, recvmsg); +put_recvmsg (t, recvmsg);spin_lock (&t->receive_credit_lock); receive_credits = --(t->recv_credits);
@@ -810,7 +778,6 @@ static void smb_direct_post_recv_credits(struct work_struct *work)struct smb_direct_recvmsg *recvmsg;int receive_credits, credits =0 ;int ret; -int use_free =1 ;spin_lock (&t->receive_credit_lock); receive_credits = t->recv_credits;
@@ -818,18 +785,9 @@ static void smb_direct_post_recv_credits(struct work_struct *work)if (receive_credits < t->recv_credit_target) {while (true) { -if (use_free) - recvmsg =get_free_recvmsg (t); -else - recvmsg =get_empty_recvmsg (t); -if (!recvmsg) { -if (use_free) { - use_free =0 ; -continue ; - }else { -break ; - } - } + recvmsg =get_free_recvmsg (t); +if (!recvmsg) +break ; recvmsg->type =SMB_DIRECT_MSG_DATA_TRANSFER ; recvmsg->first_segment = false;
@@ -1805,8 +1763,6 @@ static void smb_direct_destroy_pools(struct smb_direct_transport *t)while ((recvmsg =get_free_recvmsg (t)))mempool_free (recvmsg, t->recvmsg_mempool); -while ((recvmsg =get_empty_recvmsg (t))) -mempool_free (recvmsg, t->recvmsg_mempool);mempool_destroy (t->recvmsg_mempool); t->recvmsg_mempool =NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 312/369 smb: server: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit afb4108c92898350e66b9a009692230bcdd2ac73 ]
In case of failures either ib_dma_map_single() might not be called yet or ib_dma_unmap_single() was already called.
We should make sure put_recvmsg() only calls ib_dma_unmap_single() if needed.
--- fs/smb/server/transport_rdma.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/smb/server/transport_rdma.c +9 -2
@@ -264,8 +264,13 @@ smb_direct_recvmsg *get_free_recvmsg(struct smb_direct_transport *t)static void put_recvmsg (struct smb_direct_transport *t,struct smb_direct_recvmsg *recvmsg) { -ib_dma_unmap_single (t->cm_id->device, recvmsg->sge.addr, - recvmsg->sge.length,DMA_FROM_DEVICE ); +if (likely (recvmsg->sge.length !=0 )) { +ib_dma_unmap_single (t->cm_id->device, + recvmsg->sge.addr, + recvmsg->sge.length, +DMA_FROM_DEVICE ); + recvmsg->sge.length =0 ; + }spin_lock (&t->recvmsg_queue_lock);list_add (&recvmsg->list, &t->recvmsg_queue);
@@ -637,6 +642,7 @@ static int smb_direct_post_recv(struct smb_direct_transport *t,ib_dma_unmap_single (t->cm_id->device, recvmsg->sge.addr, recvmsg->sge.length,DMA_FROM_DEVICE ); + recvmsg->sge.length =0 ;smb_direct_disconnect_rdma_connection (t);return ret; }
@@ -1818,6 +1824,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)if (!recvmsg) goto err; recvmsg->transport = t; + recvmsg->sge.length =0 ;list_add (&recvmsg->list, &t->recvmsg_queue); } t->count_avail_recvmsg = t->recv_credit_max;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 313/369 smb: server: let recv_done() consistently call put_recvmsg/smb_direct_disconnect_rdma_connection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit cfe76fdbb9729c650f3505d9cfb2f70ddda2dbdc ]
We should call put_recvmsg() before smb_direct_disconnect_rdma_connection() in order to call it before waking up the callers.
In all error cases we should call smb_direct_disconnect_rdma_connection() in order to avoid stale connections.
--- fs/smb/server/transport_rdma.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
fs/smb/server/transport_rdma.c +13 -5
@@ -520,13 +520,13 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) t = recvmsg->transport;if (wc->status !=IB_WC_SUCCESS || wc->opcode !=IB_WC_RECV ) { +put_recvmsg (t, recvmsg);if (wc->status !=IB_WC_WR_FLUSH_ERR ) {pr_err ("Recv error. status='%s (%d)' opcode=%d\n" ,ib_wc_status_msg (wc->status), wc->status, wc->opcode);smb_direct_disconnect_rdma_connection (t); } -put_recvmsg (t, recvmsg);return ; }
@@ -541,6 +541,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)case SMB_DIRECT_MSG_NEGOTIATE_REQ :if (wc->byte_len <sizeof (struct smb_direct_negotiate_req )) {put_recvmsg (t, recvmsg); +smb_direct_disconnect_rdma_connection (t);return ; } t->negotiation_requested = true;
@@ -548,7 +549,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) t->status =SMB_DIRECT_CS_CONNECTED ;enqueue_reassembly (t, recvmsg,0 );wake_up_interruptible (&t->wait_status); -break ; +return ;case SMB_DIRECT_MSG_DATA_TRANSFER : {struct smb_direct_data_transfer *data_transfer = (struct smb_direct_data_transfer *)recvmsg->packet;
@@ -558,6 +559,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (wc->byte_len < offsetof(struct smb_direct_data_transfer , padding)) {put_recvmsg (t, recvmsg); +smb_direct_disconnect_rdma_connection (t);return ; }
@@ -566,6 +568,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (wc->byte_len <sizeof (struct smb_direct_data_transfer ) + (u64 )data_length) {put_recvmsg (t, recvmsg); +smb_direct_disconnect_rdma_connection (t);return ; }
@@ -608,11 +611,16 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (is_receive_credit_post_required (receive_credits, avail_recvmsg_count))mod_delayed_work (smb_direct_wq, &t->post_recv_credits_work,0 ); -break ; +return ; } -default : -break ; } + +/* +* This is an internal error! +*/ +WARN_ON_ONCE (recvmsg->type !=SMB_DIRECT_MSG_DATA_TRANSFER ); +put_recvmsg (t, recvmsg); +smb_direct_disconnect_rdma_connection (t); } static int smb_direct_post_recv(struct smb_direct_transport *t,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 314/369 smb: server: let recv_done() avoid touching data_transfer after cleanup/move
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit a6c015b7ac2d8c5233337e5793f50d04fac17669 ]
Calling enqueue_reassembly() and wake_up_interruptible(&t->wait_reassembly_queue) or put_receive_buffer() means the recvmsg/data_transfer pointer might get re-used by another thread, which means these should be
the last operations before calling return.
--- fs/smb/server/transport_rdma.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/smb/server/transport_rdma.c +7 -5
@@ -580,16 +580,11 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)else t->full_packet_received = true; -enqueue_reassembly (t, recvmsg, (int )data_length); -wake_up_interruptible (&t->wait_reassembly_queue); -spin_lock (&t->receive_credit_lock); receive_credits = --(t->recv_credits); avail_recvmsg_count = t->count_avail_recvmsg;spin_unlock (&t->receive_credit_lock); }else { -put_recvmsg (t, recvmsg); -spin_lock (&t->receive_credit_lock); receive_credits = --(t->recv_credits); avail_recvmsg_count = ++(t->count_avail_recvmsg);
@@ -611,6 +606,13 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (is_receive_credit_post_required (receive_credits, avail_recvmsg_count))mod_delayed_work (smb_direct_wq, &t->post_recv_credits_work,0 ); + +if (data_length) { +enqueue_reassembly (t, recvmsg, (int )data_length); +wake_up_interruptible (&t->wait_reassembly_queue); + }else +put_recvmsg (t, recvmsg); +return ; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 315/369 smb: client: let send_done() cleanup before calling smbd_disconnect_rdma_connection()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 5349ae5e05fa37409fd48a1eb483b199c32c889b ]
We should call ib_dma_unmap_single() and mempool_free() before calling smbd_disconnect_rdma_connection().
And smbd_disconnect_rdma_connection() needs to be the last function to call as all other state might already be gone after it returns.
--- fs/smb/client/smbdirect.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
fs/smb/client/smbdirect.c +8 -6
@@ -281,18 +281,20 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)log_rdma_send (INFO ,"smbd_request 0x%p completed wc->status=%d\n" , request, wc->status); -if (wc->status !=IB_WC_SUCCESS || wc->opcode !=IB_WC_SEND ) { -log_rdma_send (ERR ,"wc->status=%d wc->opcode=%d\n" , - wc->status, wc->opcode); -smbd_disconnect_rdma_connection (request->info); - } -for (i =0 ; i < request->num_sge; i++)ib_dma_unmap_single (sc->ib.dev, request->sge[i].addr, request->sge[i].length,DMA_TO_DEVICE ); +if (wc->status !=IB_WC_SUCCESS || wc->opcode !=IB_WC_SEND ) { +log_rdma_send (ERR ,"wc->status=%d wc->opcode=%d\n" , + wc->status, wc->opcode); +mempool_free (request, info->request_mempool); +smbd_disconnect_rdma_connection (info); +return ; + } +if (atomic_dec_and_test (&request->info->send_pending))wake_up (&request->info->wait_send_pending);
Signature · 1 line
2.39.5