6.14.6-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 146/183 net: vertexcom: mse102x: Add range check for CMD_RTS
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit d4dda902dac194e3231a1ed0f76c6c3b6340ba8a ]
Since there is no protection in the SPI protocol against electrical interferences, the driver shouldn't blindly trust the length payload of CMD_RTS. So introduce a bounds check for incoming frames.
--- drivers/net/ethernet/vertexcom/mse102x.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/vertexcom/mse102x.c +4 -2
@@ -6,6 +6,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/if_vlan.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linux/kernel.h>
@@ -337,8 +338,9 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse) } rxlen = cmd_resp &LEN_MASK ; -if (!rxlen) { -net_dbg_ratelimited ("%s: No frame length defined\n" , __func__); +if (rxlen <ETH_ZLEN || rxlen >VLAN_ETH_FRAME_LEN ) { +net_dbg_ratelimited ("%s: Invalid frame length: %d\n" , __func__, + rxlen); mse->stats.invalid_len++;return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 147/183 net: vertexcom: mse102x: Fix RX error handling
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit ee512922ddd7d64afe2b28830a88f19063217649 ]
In case the CMD_RTS got corrupted by interferences, the MSE102x doesn't allow a retransmission of the command. Instead the Ethernet frame must be shifted out of the SPI FIFO. Since the actual length is unknown, assume the maximum possible value.
--- drivers/net/ethernet/vertexcom/mse102x.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/net/ethernet/vertexcom/mse102x.c +16 -4
@@ -263,7 +263,7 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp, }static int mse102x_rx_frame_spi (struct mse102x_net *mse,u8 *buff, -unsigned int frame_len) +unsigned int frame_len,bool drop) {struct mse102x_net_spi *mses =to_mse102x_spi (mse);struct spi_transfer *xfer = &mses->spi_xfer;
@@ -281,6 +281,9 @@ static int mse102x_rx_frame_spi(struct mse102x_net *mse, u8 *buff,netdev_err (mse->ndev,"%s: spi_sync() failed: %d\n" , __func__, ret); mse->stats.xfer_err++; + }else if (drop) { +netdev_dbg (mse->ndev,"%s: Drop frame\n" , __func__); + ret = -EINVAL ; }else if (*sof !=cpu_to_be16 (DET_SOF )) {netdev_dbg (mse->ndev,"%s: SPI start of frame is invalid (0x%04x)\n" , __func__, *sof);
@@ -308,6 +311,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)struct sk_buff *skb;unsigned int rxalign;unsigned int rxlen; +bool drop = false;__be16 rx =0 ;u16 cmd_resp;u8 *rxpkt;
@@ -330,7 +334,8 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)net_dbg_ratelimited ("%s: Unexpected response (0x%04x)\n" , __func__, cmd_resp); mse->stats.invalid_rts++; -return ; + drop = true; + goto drop; } net_dbg_ratelimited("%s: Unexpected response to first CMD\n",
@@ -342,9 +347,16 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)net_dbg_ratelimited ("%s: Invalid frame length: %d\n" , __func__, rxlen); mse->stats.invalid_len++; -return ; + drop = true; } +/* In case of a invalid CMD_RTS, the frame must be consumed anyway. +* So assume the maximum possible frame length. +*/ +drop: +if (drop) + rxlen =VLAN_ETH_FRAME_LEN ; + rxalign =ALIGN (rxlen +DET_SOF_LEN +DET_DFT_LEN ,4 ); skb =netdev_alloc_skb_ip_align (mse->ndev, rxalign);if (!skb)
@@ -355,7 +367,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)* They are copied, but ignored. */ rxpkt =skb_put (skb, rxlen) -DET_SOF_LEN ; -if (mse102x_rx_frame_spi (mse, rxpkt, rxlen)) { +if (mse102x_rx_frame_spi (mse, rxpkt, rxlen, drop)) { mse->ndev->stats.rx_errors++;dev_kfree_skb (skb);return ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 148/183 mm, slab: clean up slab->obj_exts always
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhenhua Huang <[email protected]>
commit be8250786ca94952a19ce87f98ad9906448bc9ef upstream.
When memory allocation profiling is disabled at runtime or due to an error, shutdown_mem_profiling() is called: slab->obj_exts which previously allocated remains.
It won't be cleared by unaccount_slab() because of mem_alloc_profiling_enabled() not true. It's incorrect, slab->obj_exts should always be cleaned up in unaccount_slab() to avoid following error:
[...]BUG: Bad page state in process...
..
[...]page dumped because: page still charged to cgroup
[surenb: fixed trivial merge conflict in alloc_tagging_slab_alloc_hook(), skipped inlining free_slab_obj_exts() as it's already inline in 6.14]
--- mm/slub.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-)
mm/slub.c +7 -20
@@ -2025,18 +2025,6 @@ static inline void free_slab_obj_exts(st slab->obj_exts = 0; } -static inline bool need_slab_obj_ext (void ) -{ -if (mem_alloc_profiling_enabled ()) -return true; - -/* -* CONFIG_MEMCG creates vector of obj_cgroup objects conditionally -* inside memcg_slab_post_alloc_hook. No other users for now. -*/ -return false; -} -#else /* CONFIG_SLAB_OBJ_EXT */ static inline void init_slab_obj_exts (struct slab *slab)
@@ -2053,11 +2041,6 @@ static inline void free_slab_obj_exts(st { } -static inline bool need_slab_obj_ext (void ) -{ -return false; -} -#endif /* CONFIG_SLAB_OBJ_EXT */ #ifdef CONFIG_MEM_ALLOC_PROFILING
@@ -2089,7 +2072,7 @@ prepare_slab_obj_exts_hook(struct kmem_cstatic inline void alloc_tagging_slab_alloc_hook (struct kmem_cache *s,void *object,gfp_t flags) { -if (need_slab_obj_ext ()) { +if (mem_alloc_profiling_enabled ()) {struct slabobj_ext *obj_exts; obj_exts =prepare_slab_obj_exts_hook (s, flags, object);
@@ -2565,8 +2548,12 @@ static __always_inline void account_slab static __always_inline void unaccount_slab(struct slab *slab, int order,struct kmem_cache *s) { -if (memcg_kmem_online () ||need_slab_obj_ext ()) -free_slab_obj_exts (slab); +/* +* The slab object extensions should now be freed regardless of +* whether mem_alloc_profiling_enabled() or not because profiling +* might have been disabled after slab->obj_exts got allocated. +*/ +free_slab_obj_exts (slab);mod_node_page_state (slab_pgdat (slab),cache_vmstat_idx (s), -(PAGE_SIZE << order));
Greg Kroah-Hartman
maintainerPATCH 149/183 accel/ivpu: Abort all jobs after command queue unregister
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
commit 5bbccadaf33eea2b879d8326ad59ae0663be47d1 upstream.
With hardware scheduler it is not expected to receive JOB_DONE notifications from NPU FW for the jobs aborted due to command queue destroy JSM command.
Remove jobs submitted to unregistered command queue from submitted_jobs_xa to avoid triggering a TDR in such case.
Add explicit submitted_jobs_lock that protects access to list of submitted jobs which is now used to find jobs to abort.
Move context abort procedure to separate work queue not to slow down handling of IPCs or DCT requests in case where job abort takes longer, especially when destruction of the last job of a specific context results in context release.
[ This backport removes all the lines from upstream commit related to the
command queue UAPI, as it is not present in the 6.14 kernel and should not be backported. ]
--- drivers/accel/ivpu/ivpu_drv.c | 32 ++------------- drivers/accel/ivpu/ivpu_drv.h | 2 drivers/accel/ivpu/ivpu_job.c | 85 +++++++++++++++++++++++++++++++--------- drivers/accel/ivpu/ivpu_job.h | 1 drivers/accel/ivpu/ivpu_mmu.c | 3 - drivers/accel/ivpu/ivpu_sysfs.c | 5 +- 6 files changed, 79 insertions(+), 49 deletions(-)
drivers/accel/ivpu/ivpu_drv.c +6 -26
@@ -36,8 +36,6 @@#define DRIVER_VERSION_STR "1.0.0 " UTS_RELEASE#endif -static struct lock_class_key submitted_jobs_xa_lock_class_key; -int ivpu_dbg_mask;module_param_named (dbg_mask, ivpu_dbg_mask, int,0644 );MODULE_PARM_DESC (dbg_mask,"Driver debug mask. See IVPU_DBG_* macros." );
@@ -465,26 +463,6 @@ static const struct drm_driver driver = .major = 1, }; -static void ivpu_context_abort_invalid (struct ivpu_device *vdev) -{ -struct ivpu_file_priv *file_priv; -unsigned long ctx_id; - -mutex_lock (&vdev->context_list_lock); - -xa_for_each (&vdev->context_xa, ctx_id, file_priv) { -if (!file_priv->has_mmu_faults || file_priv->aborted) -continue ; - -mutex_lock (&file_priv->lock); -ivpu_context_abort_locked (file_priv); - file_priv->aborted = true; -mutex_unlock (&file_priv->lock); - } - -mutex_unlock (&vdev->context_list_lock); -} -static irqreturn_t ivpu_irq_thread_handler (int irq,void *arg) {struct ivpu_device *vdev = arg;
@@ -498,9 +476,6 @@ static irqreturn_t ivpu_irq_thread_handlcase IVPU_HW_IRQ_SRC_IPC :ivpu_ipc_irq_thread_handler (vdev);break ; -case IVPU_HW_IRQ_SRC_MMU_EVTQ : -ivpu_context_abort_invalid (vdev); -break ;case IVPU_HW_IRQ_SRC_DCT :ivpu_pm_dct_irq_thread_handler (vdev);break ;
@@ -617,16 +592,21 @@ static int ivpu_dev_init(struct ivpu_devxa_init_flags (&vdev->context_xa,XA_FLAGS_ALLOC |XA_FLAGS_LOCK_IRQ );xa_init_flags (&vdev->submitted_jobs_xa,XA_FLAGS_ALLOC1 );xa_init_flags (&vdev->db_xa,XA_FLAGS_ALLOC1 ); -lockdep_set_class (&vdev->submitted_jobs_xa.xa_lock, &submitted_jobs_xa_lock_class_key);INIT_LIST_HEAD (&vdev->bo_list); vdev->db_limit.min =IVPU_MIN_DB ; vdev->db_limit.max =IVPU_MAX_DB ; +INIT_WORK (&vdev->context_abort_work, ivpu_context_abort_thread_handler); + ret =drmm_mutex_init (&vdev->drm, &vdev->context_list_lock);if (ret) goto err_xa_destroy; + ret =drmm_mutex_init (&vdev->drm, &vdev->submitted_jobs_lock); +if (ret) + goto err_xa_destroy; + ret =drmm_mutex_init (&vdev->drm, &vdev->bo_list_lock);if (ret) goto err_xa_destroy;
drivers/accel/ivpu/ivpu_drv.h +2 -0
@@ -137,6 +137,7 @@ struct ivpu_device {struct mutex context_list_lock;/* Protects user context addition/removal */ struct xarray context_xa;struct xa_limit context_xa_limit; +struct work_struct context_abort_work;struct xarray db_xa;struct xa_limit db_limit;
@@ -145,6 +146,7 @@ struct ivpu_device {struct mutex bo_list_lock;/* Protects bo_list */ struct list_head bo_list; +struct mutex submitted_jobs_lock;/* Protects submitted_jobs */ struct xarray submitted_jobs_xa;struct ivpu_ipc_consumer job_done_consumer;
drivers/accel/ivpu/ivpu_job.c +66 -19
168 lines not on this page · raw message
drivers/accel/ivpu/ivpu_job.h +1 -0
@@ -66,6 +66,7 @@ void ivpu_cmdq_reset_all_contexts(structvoid ivpu_job_done_consumer_init (struct ivpu_device *vdev);void ivpu_job_done_consumer_fini (struct ivpu_device *vdev); +void ivpu_context_abort_thread_handler (struct work_struct *work);void ivpu_jobs_abort_all (struct ivpu_device *vdev);
drivers/accel/ivpu/ivpu_mmu.c +1 -2
@@ -890,8 +890,7 @@ void ivpu_mmu_irq_evtq_handler(struct ivREGV_WR32 (IVPU_MMU_REG_EVTQ_CONS_SEC , vdev->mmu->evtq.cons); } -if (!kfifo_put (&vdev->hw->irq.fifo,IVPU_HW_IRQ_SRC_MMU_EVTQ )) -ivpu_err_ratelimited (vdev,"IRQ FIFO full\n" ); +queue_work (system_wq, &vdev->context_abort_work); }void ivpu_mmu_evtq_dump (struct ivpu_device *vdev)
drivers/accel/ivpu/ivpu_sysfs.c +3 -2
@@ -30,11 +30,12 @@ npu_busy_time_us_show(struct device *devstruct ivpu_device *vdev =to_ivpu_device (drm);ktime_t total, now =0 ; -xa_lock (&vdev->submitted_jobs_xa); +mutex_lock (&vdev->submitted_jobs_lock); + total = vdev->busy_time;if (!xa_empty (&vdev->submitted_jobs_xa)) now =ktime_sub (ktime_get (), vdev->busy_start_ts); -xa_unlock (&vdev->submitted_jobs_xa); +mutex_unlock (&vdev->submitted_jobs_lock);return sysfs_emit (buf,"%lld\n" ,ktime_to_us (ktime_add (total, now))); }
Greg Kroah-Hartman
maintainerPATCH 150/183 accel/ivpu: Fix locking order in ivpu_job_submit
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
commit ab680dc6c78aa035e944ecc8c48a1caab9f39924 upstream.
Fix deadlock in job submission and abort handling. When a thread aborts currently executing jobs due to a fault, it first locks the global lock protecting submitted_jobs (#1).
After the last job is destroyed, it proceeds to release the related context and locks file_priv (#2). Meanwhile, in the job submission thread, the file_priv lock (#2) is taken first, and then the submitted_jobs lock (#1) is obtained when a job is added to the submitted jobs list.
CPU0 CPU1
---- ----
(for example due to a fault) (jobs submissions keep coming) lock(&vdev->submitted_jobs_lock) #1
ivpu_jobs_abort_all()
job_destroy()
lock(&file_priv->lock) #2
lock(&vdev->submitted_jobs_lock) #1 file_priv_release()
lock(&vdev->context_list_lock)
lock(&file_priv->lock) #2
This order of locking causes a deadlock. To resolve this issue, change the order of locking in ivpu_job_submit().
[ This backport required small adjustments to ivpu_job_submit(),
which lacks support for explicit command queue creation added in 6.15. ]
--- drivers/accel/ivpu/ivpu_job.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
drivers/accel/ivpu/ivpu_job.c +6 -9
@@ -532,6 +532,7 @@ static int ivpu_job_submit(struct ivpu_jif (ret <0 )return ret; +mutex_lock (&vdev->submitted_jobs_lock);mutex_lock (&file_priv->lock); cmdq =ivpu_cmdq_acquire (file_priv, priority);
@@ -539,11 +540,9 @@ static int ivpu_job_submit(struct ivpu_jivpu_warn_ratelimited (vdev,"Failed to get job queue, ctx %d engine %d prio %d\n" , file_priv->ctx.id, job->engine_idx, priority); ret = -EINVAL ; - goto err_unlock_file_priv; + goto err_unlock; } -mutex_lock (&vdev->submitted_jobs_lock); - is_first_job =xa_empty (&vdev->submitted_jobs_xa); ret =xa_alloc_cyclic (&vdev->submitted_jobs_xa, &job->job_id, job, file_priv->job_limit, &file_priv->job_id_next,GFP_KERNEL );
@@ -551,7 +550,7 @@ static int ivpu_job_submit(struct ivpu_jivpu_dbg (vdev,JOB ,"Too many active jobs in ctx %d\n" , file_priv->ctx.id); ret = -EBUSY ; - goto err_unlock_submitted_jobs; + goto err_unlock; } ret =ivpu_cmdq_push_job (cmdq, job);
@@ -574,22 +573,20 @@ static int ivpu_job_submit(struct ivpu_j job->job_id, file_priv->ctx.id, job->engine_idx, priority, job->cmd_buf_vpu_addr, cmdq->jobq->header.tail); -mutex_unlock (&vdev->submitted_jobs_lock);mutex_unlock (&file_priv->lock);if (unlikely (ivpu_test_mode &IVPU_TEST_MODE_NULL_HW )) { -mutex_lock (&vdev->submitted_jobs_lock);ivpu_job_signal_and_destroy (vdev, job->job_id,VPU_JSM_STATUS_SUCCESS ); -mutex_unlock (&vdev->submitted_jobs_lock); } +mutex_unlock (&vdev->submitted_jobs_lock); +return 0 ; err_erase_xa:xa_erase (&vdev->submitted_jobs_xa, job->job_id); -err_unlock_submitted_jobs: +err_unlock:mutex_unlock (&vdev->submitted_jobs_lock); -err_unlock_file_priv:mutex_unlock (&file_priv->lock);ivpu_rpm_put (vdev);return ret;
Greg Kroah-Hartman
maintainerPATCH 151/183 accel/ivpu: Add handling of VPU_JSM_STATUS_MVNCI_CONTEXT_VIOLATION_HW
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
commit dad945c27a42dfadddff1049cf5ae417209a8996 upstream.
Mark as invalid context of a job that returned HW context violation error and queue work that aborts jobs from faulty context. Add engine reset to the context abort thread handler to not only abort currently executing jobs but also to ensure NPU invalid state recovery.
--- drivers/accel/ivpu/ivpu_job.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
drivers/accel/ivpu/ivpu_job.c +25 -0
@@ -482,6 +482,26 @@ static int ivpu_job_signal_and_destroy(slockdep_assert_held (&vdev->submitted_jobs_lock); + job =xa_load (&vdev->submitted_jobs_xa, job_id); +if (!job) +return -ENOENT ; + +if (job_status ==VPU_JSM_STATUS_MVNCI_CONTEXT_VIOLATION_HW ) { +guard (mutex)(&job->file_priv->lock); + +if (job->file_priv->has_mmu_faults) +return 0 ; + +/* +* Mark context as faulty and defer destruction of the job to jobs abort thread +* handler to synchronize between both faults and jobs returning context violation +* status and ensure both are handled in the same way +*/ + job->file_priv->has_mmu_faults = true; +queue_work (system_wq, &vdev->context_abort_work); +return 0 ; + } + job =ivpu_job_remove_from_submitted_jobs (vdev, job_id);if (!job)return -ENOENT ;
@@ -793,6 +813,9 @@ void ivpu_context_abort_thread_handler(sstruct ivpu_job *job;unsigned long id; +if (vdev->fw->sched_mode ==VPU_SCHEDULING_MODE_HW ) +ivpu_jsm_reset_engine (vdev,0 ); +mutex_lock (&vdev->context_list_lock);xa_for_each (&vdev->context_xa, ctx_id, file_priv) {if (!file_priv->has_mmu_faults || file_priv->aborted)
@@ -806,6 +829,8 @@ void ivpu_context_abort_thread_handler(sif (vdev->fw->sched_mode !=VPU_SCHEDULING_MODE_HW )return ; + +ivpu_jsm_hws_resume_engine (vdev,0 );/* * In hardware scheduling mode NPU already has stopped processing jobs * and won't send us any further notifications, thus we have to free job related resources
Greg Kroah-Hartman
maintainerPATCH 152/183 drm/xe: Invalidate L3 read-only cachelines for geometry streams too
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kenneth Graunke <[email protected]>
commit e775278cd75f24a2758c28558c4e41b36c935740 upstream.
Historically, the Vertex Fetcher unit has not been an L3 client. That meant that, when a buffer containing vertex data was written to, it was necessary to issue a PIPE_CONTROL::VF Cache Invalidate to invalidate any VF L2 cachelines associated with that buffer, so the new value would be properly read from memory.
Since Tigerlake and later, VERTEX_BUFFER_STATE and 3DSTATE_INDEX_BUFFER have included an "L3 Bypass Enable" bit which userspace drivers can set to request that the vertex fetcher unit snoop L3. However, unlike most true L3 clients, the "VF Cache Invalidate" bit continues to only invalidate the VF L2 cache - and not any associated L3 lines.
To handle that, PIPE_CONTROL has a new "L3 Read Only Cache Invalidation Bit", which according to the docs, "controls the invalidation of the Geometry streams cached in L3 cache at the top of the pipe." In other words, the vertex and index buffer data that gets cached in L3 when "L3 Bypass Disable" is set.
Mesa always sets L3 Bypass Disable so that the VF unit snoops L3, and whenever it issues a VF Cache Invalidate, it also issues a L3 Read Only Cache Invalidate so that both L2 and L3 vertex data is invalidated.
xe is issuing VF cache invalidates too (which handles cases like CPU writes to a buffer between GPU batches). Because userspace may enable L3 snooping, it needs to issue an L3 Read Only Cache Invalidate as well.
Fixes significant flickering in Firefox on Meteorlake, which was writing to vertex buffers via the CPU between batches; the missing L3 Read Only invalidates were causing the vertex fetcher to read stale data from L3.
--- drivers/gpu/drm/xe/instructions/xe_gpu_commands.h | 1 + drivers/gpu/drm/xe/xe_ring_ops.c | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-)
drivers/gpu/drm/xe/instructions/xe_gpu_commands.h +1 -0
@@ -41,6 +41,7 @@#define GFX_OP_PIPE_CONTROL (len) ((0x3<<29)|(0x3<<27)|(0x2<<24)|((len)-2)) +#define PIPE_CONTROL0_L3_READ_ONLY_CACHE_INVALIDATE BIT(10)/* gen12 */ #define PIPE_CONTROL0_HDC_PIPELINE_FLUSH BIT(9)/* gen12 */ #define PIPE_CONTROL_COMMAND_CACHE_INVALIDATE (1<<29)
drivers/gpu/drm/xe/xe_ring_ops.c +9 -4
@@ -141,7 +141,8 @@ emit_pipe_control(u32 *dw, int i, u32 bistatic int emit_pipe_invalidate (u32 mask_flags,bool invalidate_tlb,u32 *dw,int i) { -u32 flags =PIPE_CONTROL_CS_STALL | +u32 flags0 =0 ; +u32 flags1 =PIPE_CONTROL_CS_STALL |PIPE_CONTROL_COMMAND_CACHE_INVALIDATE |PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE | PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
@@ -152,11 +153,15 @@ static int emit_pipe_invalidate(u32 maskPIPE_CONTROL_STORE_DATA_INDEX ;if (invalidate_tlb) - flags |=PIPE_CONTROL_TLB_INVALIDATE ; + flags1 |=PIPE_CONTROL_TLB_INVALIDATE ; - flags &= ~mask_flags; + flags1 &= ~mask_flags; -return emit_pipe_control (dw, i,0 , flags,LRC_PPHWSP_SCRATCH_ADDR ,0 ); +if (flags1 &PIPE_CONTROL_VF_CACHE_INVALIDATE ) + flags0 |=PIPE_CONTROL0_L3_READ_ONLY_CACHE_INVALIDATE ; + +return emit_pipe_control (dw, i, flags0, flags1, +LRC_PPHWSP_SCRATCH_ADDR ,0 ); } static int emit_store_imm_ppgtt_posted(u64 addr, u64 value,
Greg Kroah-Hartman
maintainerPATCH 153/183 platform/x86: alienware-wmi-wmax: Add support for Alienware m15 R7
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kurt Borja <[email protected]>
commit 246f9bb62016c423972ea7f2335a8e0ed3521cde upstream.
Extend thermal control support to Alienware m15 R7.
--- drivers/platform/x86/dell/alienware-wmi.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/platform/x86/dell/alienware-wmi.c +9 -0
@@ -252,6 +252,15 @@ static const struct dmi_system_id alienw }, { .callback = dmi_matched, + .ident = "Alienware m15 R7", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Alienware" ), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m15 R7"), + }, + .driver_data = &quirk_x_series, + }, + { + .callback = dmi_matched, .ident = "Alienware m16 R1", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
Greg Kroah-Hartman
maintainerPATCH 154/183 ublk: add helper of ublk_need_map_io()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 1d781c0de08c0b35948ad4aaf609a4cc9995d9f6 ]
ublk_need_map_io() is more readable.
--- drivers/block/ublk_drv.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/block/ublk_drv.c +9 -4
@@ -594,6 +594,11 @@ static inline bool ublk_support_user_copreturn ubq->flags &UBLK_F_USER_COPY ; } +static inline bool ublk_need_map_io (const struct ublk_queue *ubq) +{ +return !ublk_support_user_copy (ubq); +} +static inline bool ublk_need_req_ref (const struct ublk_queue *ubq) {/*
@@ -921,7 +926,7 @@ static int ublk_map_io(const struct ublk {const unsigned int rq_bytes =blk_rq_bytes (req); -if (ublk_support_user_copy (ubq)) +if (!ublk_need_map_io (ubq))return rq_bytes;/*
@@ -945,7 +950,7 @@ static int ublk_unmap_io(const struct ub {const unsigned int rq_bytes =blk_rq_bytes (req); -if (ublk_support_user_copy (ubq)) +if (!ublk_need_map_io (ubq))return rq_bytes;if (ublk_need_unmap_req (req)) {
@@ -1914,7 +1919,7 @@ static int __ublk_ch_uring_cmd(struct ioif (io->flags &UBLK_IO_FLAG_OWNED_BY_SRV ) goto out; -if (!ublk_support_user_copy (ubq)) { +if (ublk_need_map_io (ubq)) {/* * FETCH_RQ has to provide IO buffer if NEED GET * DATA is not enabled
@@ -1936,7 +1941,7 @@ static int __ublk_ch_uring_cmd(struct ioif (!(io->flags &UBLK_IO_FLAG_OWNED_BY_SRV )) goto out; -if (!ublk_support_user_copy (ubq)) { +if (ublk_need_map_io (ubq)) {/* * COMMIT_AND_FETCH_REQ has to provide IO buffer if * NEED GET DATA is not enabled or it is Read IO.
Greg Kroah-Hartman
maintainerPATCH 155/183 ublk: properly serialize all FETCH_REQs
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uday Shankar <[email protected]>
[ Upstream commit b69b8edfb27dfa563cd53f590ec42b481f9eb174 ]
Most uring_cmds issued against ublk character devices are serialized because each command affects only one queue, and there is an early check which only allows a single task (the queue's ubq_daemon) to issue uring_cmds against that queue. However, this mechanism does not work for FETCH_REQs, since they are expected before ubq_daemon is set. Since FETCH_REQs are only used at initialization and not in the fast path, serialize them using the per-ublk-device mutex. This fixes a number of data races that were previously possible if a badly behaved ublk server decided to issue multiple FETCH_REQs against the same qid/tag concurrently.
--- drivers/block/ublk_drv.c | 77 +++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 28 deletions(-)
drivers/block/ublk_drv.c +49 -28
@@ -1803,8 +1803,8 @@ static void ublk_nosrv_work(struct work_/* device can only be started after all IOs are ready */ static void ublk_mark_io_ready (struct ublk_device *ub,struct ublk_queue *ubq) + __must_hold(&ub->mutex) { -mutex_lock (&ub->mutex); ubq->nr_io_ready++;if (ublk_queue_ready (ubq)) { ubq->ubq_daemon = current;
@@ -1816,7 +1816,6 @@ static void ublk_mark_io_ready(struct ub }if (ub->nr_queues_ready == ub->dev_info.nr_hw_queues)complete_all (&ub->completion); -mutex_unlock (&ub->mutex); }static inline int ublk_check_cmd_op (u32 cmd_op)
@@ -1855,6 +1854,52 @@ static inline void ublk_prep_cancel(struio_uring_cmd_mark_cancelable (cmd, issue_flags); } +static int ublk_fetch (struct io_uring_cmd *cmd,struct ublk_queue *ubq, +struct ublk_io *io,__u64 buf_addr) +{ +struct ublk_device *ub = ubq->dev; +int ret =0 ; + +/* +* When handling FETCH command for setting up ublk uring queue, +* ub->mutex is the innermost lock, and we won't block for handling +* FETCH, so it is fine even for IO_URING_F_NONBLOCK. +*/ +mutex_lock (&ub->mutex); +/* UBLK_IO_FETCH_REQ is only allowed before queue is setup */ +if (ublk_queue_ready (ubq)) { + ret = -EBUSY ; + goto out; + } + +/* allow each command to be FETCHed at most once */ +if (io->flags &UBLK_IO_FLAG_ACTIVE ) { + ret = -EINVAL ; + goto out; + } + +WARN_ON_ONCE (io->flags &UBLK_IO_FLAG_OWNED_BY_SRV ); + +if (ublk_need_map_io (ubq)) { +/* +* FETCH_RQ has to provide IO buffer if NEED GET +* DATA is not enabled +*/ +if (!buf_addr && !ublk_need_get_data (ubq)) + goto out; + }else if (buf_addr) { +/* User copy requires addr to be unset */ + ret = -EINVAL ; + goto out; + } + +ublk_fill_io_cmd (io, cmd, buf_addr); +ublk_mark_io_ready (ub, ubq); +out: +mutex_unlock (&ub->mutex); +return ret; +} +static int __ublk_ch_uring_cmd (struct io_uring_cmd *cmd,unsigned int issue_flags,const struct ublksrv_io_cmd *ub_cmd)
@@ -1907,33 +1952,9 @@ static int __ublk_ch_uring_cmd(struct io ret = -EINVAL ;switch (_IOC_NR (cmd_op)) {case UBLK_IO_FETCH_REQ : -/* UBLK_IO_FETCH_REQ is only allowed before queue is setup */ -if (ublk_queue_ready (ubq)) { - ret = -EBUSY ; - goto out; - } -/* -* The io is being handled by server, so COMMIT_RQ is expected -* instead of FETCH_REQ -*/ -if (io->flags &UBLK_IO_FLAG_OWNED_BY_SRV ) - goto out; - -if (ublk_need_map_io (ubq)) { -/* -* FETCH_RQ has to provide IO buffer if NEED GET -* DATA is not enabled -*/ -if (!ub_cmd->addr && !ublk_need_get_data (ubq)) - goto out; - }else if (ub_cmd->addr) { -/* User copy requires addr to be unset */ - ret = -EINVAL ; + ret =ublk_fetch (cmd, ubq, io, ub_cmd->addr); +if (ret) goto out; - } - -ublk_fill_io_cmd (io, cmd, ub_cmd->addr); -ublk_mark_io_ready (ub, ubq);break ;case UBLK_IO_COMMIT_AND_FETCH_REQ : req =blk_mq_tag_to_rq (ub->tag_set.tags[ub_cmd->q_id], tag);
Greg Kroah-Hartman
maintainerPATCH 156/183 ublk: move device reset into ublk_ch_release()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 728cbac5fe219d3b8a21a0688a08f2b7f8aeda2b ]
ublk_ch_release() is called after ublk char device is closed, when all uring_cmd are done, so it is perfect fine to move ublk device reset to ublk_ch_release() from ublk_ctrl_start_recovery().
This way can avoid to grab the exiting daemon task_struct too long.
However, reset of the following ublk IO flags has to be moved until ublk io_uring queues are ready:
- ubq->canceling
For requeuing IO in case of ublk_nosrv_dev_should_queue_io() before device is recovered
- ubq->fail_io
For failing IO in case of UBLK_F_USER_RECOVERY_FAIL_IO before device is recovered
- ublk_io->flags
For preventing using io->cmd
With this way, recovery is simplified a lot.
--- drivers/block/ublk_drv.c | 121 +++++++++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 49 deletions(-)
drivers/block/ublk_drv.c +72 -49
@@ -1043,7 +1043,7 @@ static inline struct ublk_uring_cmd_pdustatic inline bool ubq_daemon_is_dying (struct ublk_queue *ubq) { -return ubq->ubq_daemon->flags &PF_EXITING ; +return !ubq->ubq_daemon || ubq->ubq_daemon->flags &PF_EXITING ; }/* todo: handle partial completion */
@@ -1440,6 +1440,37 @@ static const struct blk_mq_ops ublk_mq_o .timeout = ublk_timeout, }; +static void ublk_queue_reinit (struct ublk_device *ub,struct ublk_queue *ubq) +{ +int i; + +/* All old ioucmds have to be completed */ + ubq->nr_io_ready =0 ; + +/* +* old daemon is PF_EXITING, put it now +* +* It could be NULL in case of closing one quisced device. +*/ +if (ubq->ubq_daemon) +put_task_struct (ubq->ubq_daemon); +/* We have to reset it to NULL, otherwise ub won't accept new FETCH_REQ */ + ubq->ubq_daemon =NULL ; + ubq->timeout = false; + +for (i =0 ; i < ubq->q_depth; i++) { +struct ublk_io *io = &ubq->ios[i]; + +/* +* UBLK_IO_FLAG_CANCELED is kept for avoiding to touch +* io->cmd +*/ + io->flags &=UBLK_IO_FLAG_CANCELED ; + io->cmd =NULL ; + io->addr =0 ; + } +} +static int ublk_ch_open (struct inode *inode,struct file *filp) { struct ublk_device *ub = container_of(inode->i_cdev,
@@ -1451,10 +1482,26 @@ static int ublk_ch_open(struct inode *inreturn 0 ; } +static void ublk_reset_ch_dev (struct ublk_device *ub) +{ +int i; + +for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) +ublk_queue_reinit (ub,ublk_get_queue (ub, i)); + +/* set to NULL, otherwise new ubq_daemon cannot mmap the io_cmd_buf */ + ub->mm =NULL ; + ub->nr_queues_ready =0 ; + ub->nr_privileged_daemon =0 ; +} +static int ublk_ch_release (struct inode *inode,struct file *filp) {struct ublk_device *ub = filp->private_data; +/* all uring_cmd has been done now, reset device & ubq */ +ublk_reset_ch_dev (ub); +clear_bit (UB_STATE_OPEN , &ub->state);return 0 ; }
@@ -1801,6 +1848,24 @@ static void ublk_nosrv_work(struct work_ublk_cancel_dev (ub); } +/* reset ublk io_uring queue & io flags */ +static void ublk_reset_io_flags (struct ublk_device *ub) +{ +int i, j; + +for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) { +struct ublk_queue *ubq =ublk_get_queue (ub, i); + +/* UBLK_IO_FLAG_CANCELED can be cleared now */ +spin_lock (&ubq->cancel_lock); +for (j =0 ; j < ubq->q_depth; j++) + ubq->ios[j].flags &= ~UBLK_IO_FLAG_CANCELED ; +spin_unlock (&ubq->cancel_lock); + ubq->canceling = false; + ubq->fail_io = false; + } +} +/* device can only be started after all IOs are ready */ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq) __must_hold(&ub->mutex)
@@ -1814,8 +1879,12 @@ static void ublk_mark_io_ready(struct ubif (capable (CAP_SYS_ADMIN )) ub->nr_privileged_daemon++; } -if (ub->nr_queues_ready == ub->dev_info.nr_hw_queues) + +if (ub->nr_queues_ready == ub->dev_info.nr_hw_queues) { +/* now we are ready for handling ublk io request */ +ublk_reset_io_flags (ub);complete_all (&ub->completion); + } }static inline int ublk_check_cmd_op (u32 cmd_op)
@@ -2866,42 +2935,15 @@ static int ublk_ctrl_set_params(struct ureturn ret; } -static void ublk_queue_reinit (struct ublk_device *ub,struct ublk_queue *ubq) -{ -int i; - -WARN_ON_ONCE (!(ubq->ubq_daemon &&ubq_daemon_is_dying (ubq))); - -/* All old ioucmds have to be completed */ - ubq->nr_io_ready =0 ; -/* old daemon is PF_EXITING, put it now */ -put_task_struct (ubq->ubq_daemon); -/* We have to reset it to NULL, otherwise ub won't accept new FETCH_REQ */ - ubq->ubq_daemon =NULL ; - ubq->timeout = false; - -for (i =0 ; i < ubq->q_depth; i++) { -struct ublk_io *io = &ubq->ios[i]; - -/* forget everything now and be ready for new FETCH_REQ */ - io->flags =0 ; - io->cmd =NULL ; - io->addr =0 ; - } -} -static int ublk_ctrl_start_recovery (struct ublk_device *ub,struct io_uring_cmd *cmd) {const struct ublksrv_ctrl_cmd *header =io_uring_sqe_cmd (cmd->sqe);int ret = -EINVAL ; -int i;mutex_lock (&ub->mutex);if (ublk_nosrv_should_stop_dev (ub)) goto out_unlock; -if (!ub->nr_queues_ready) - goto out_unlock;/* * START_RECOVERY is only allowd after: *
@@ -2925,12 +2967,6 @@ static int ublk_ctrl_start_recovery(stru goto out_unlock; }pr_devel ("%s: start recovery for dev id %d.\n" , __func__, header->dev_id); -for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) -ublk_queue_reinit (ub,ublk_get_queue (ub, i)); -/* set to NULL, otherwise new ubq_daemon cannot mmap the io_cmd_buf */ - ub->mm =NULL ; - ub->nr_queues_ready =0 ; - ub->nr_privileged_daemon =0 ;init_completion (&ub->completion); ret =0 ; out_unlock:
@@ -2944,7 +2980,6 @@ static int ublk_ctrl_end_recovery(structconst struct ublksrv_ctrl_cmd *header =io_uring_sqe_cmd (cmd->sqe);int ublksrv_pid = (int )header->data[0 ];int ret = -EINVAL ; -int i;pr_devel ("%s: Waiting for new ubq_daemons(nr: %d) are ready, dev id %d...\n" , __func__, ub->dev_info.nr_hw_queues, header->dev_id);
@@ -2964,22 +2999,10 @@ static int ublk_ctrl_end_recovery(struct goto out_unlock; } ub->dev_info.ublksrv_pid = ublksrv_pid; + ub->dev_info.state =UBLK_S_DEV_LIVE ;pr_devel ("%s: new ublksrv_pid %d, dev id %d\n" , __func__, ublksrv_pid, header->dev_id); - -blk_mq_quiesce_queue (ub->ub_disk->queue); - ub->dev_info.state =UBLK_S_DEV_LIVE ; -for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) { -struct ublk_queue *ubq =ublk_get_queue (ub, i); - - ubq->canceling = false; - ubq->fail_io = false; - } -blk_mq_unquiesce_queue (ub->ub_disk->queue); -pr_devel ("%s: queue unquiesced, dev id %d.\n" , - __func__, header->dev_id);blk_mq_kick_requeue_list (ub->ub_disk->queue); - ret =0 ; out_unlock:mutex_unlock (&ub->mutex);
Greg Kroah-Hartman
maintainerPATCH 157/183 ublk: improve detection and handling of ublk server exit
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uday Shankar <[email protected]>
[ Upstream commit 82a8a30c581bbbe653d33c6ce2ef67e3072c7f12 ]
There are currently two ways in which ublk server exit is detected by ublk_drv:
1. uring_cmd cancellation. If there are any outstanding uring_cmds which have not been completed to the ublk server when it exits, io_uring calls the uring_cmd callback with a special cancellation flag as the issuing task is exiting.
2. I/O timeout. This is needed in addition to the above to handle the "saturated queue" case, when all I/Os for a given queue are in the ublk server, and therefore there are no outstanding uring_cmds to cancel when the ublk server exits.
There are a couple of issues with this approach:
- It is complex and inelegant to have two methods to detect the same condition
- The second method detects ublk server exit only after a long delay (~30s, the default timeout assigned by the block layer). This delays the nosrv behavior from kicking in and potential subsequent recovery of the device.
The second issue is brought to light with the new test_generic_06 which will be added in following patch. It fails before this fix:
selftests: ublk: test_generic_06.sh
dev id is 0
dd: error writing '/dev/ublkb0': Input/output error 1+0 records in
0+0 records out
0 bytes copied, 30.0611 s, 0.0 kB/s
DEAD
dd took 31 seconds to exit (>= 5s tolerance)! generic_06 : [FAIL]
Fix this by instead detecting and handling ublk server exit in the character file release callback. This has several advantages:
- This one place can handle both saturated and unsaturated queues. Thus, it replaces both preexisting methods of detecting ublk server exit.
- It runs quickly on ublk server exit - there is no 30s delay.
- It starts the process of removing task references in ublk_drv. This is needed if we want to relax restrictions in the driver like letting only one thread serve each queue
There is also the disadvantage that the character file release callback can also be triggered by intentional close of the file, which is a significant behavior change. Preexisting ublk servers (libublksrv) are dependent on the ability to open/close the file multiple times. To address this, only transition to a nosrv state if the file is released while the ublk device is live. This allows for programs to open/close the file multiple times during setup. It is still a behavior change if a ublk server decides to close/reopen the file while the device is LIVE (i.e. while it is responsible for serving I/O), but that would be highly unusual. This behavior is in line with what is done by FUSE, which is very similar to ublk in that a userspace daemon is providing services traditionally provided by the kernel.
With this change in, the new test (and all other selftests, and all ublksrv tests) pass:
selftests: ublk: test_generic_06.sh
dev id is 0
dd: error writing '/dev/ublkb0': Input/output error 1+0 records in
0+0 records out
0 bytes copied, 0.0376731 s, 0.0 kB/s
DEADgeneric_04 : [PASS]
--- drivers/block/ublk_drv.c | 223 ++++++++++++++++++++++++++--------------------- 1 file changed, 124 insertions(+), 99 deletions(-)
drivers/block/ublk_drv.c +124 -99
@@ -194,8 +194,6 @@ struct ublk_device {struct completion completion;unsigned int nr_queues_ready;unsigned int nr_privileged_daemon; - -struct work_struct nosrv_work; };/* header of ublk_params */
@@ -204,7 +202,10 @@ struct ublk_params_header {__u32 types; }; -static bool ublk_abort_requests (struct ublk_device *ub,struct ublk_queue *ubq); + +static void ublk_stop_dev_unlocked (struct ublk_device *ub); +static void ublk_abort_queue (struct ublk_device *ub,struct ublk_queue *ubq); +static void __ublk_quiesce_dev (struct ublk_device *ub);static inline unsigned int ublk_req_build_flags (struct request *req); static inline struct ublksrv_io_desc *ublk_get_iod(struct ublk_queue *ubq,
@@ -1306,8 +1307,6 @@ static void ublk_queue_cmd_list(struct ustatic enum blk_eh_timer_return ublk_timeout (struct request *rq) {struct ublk_queue *ubq = rq->mq_hctx->driver_data; -unsigned int nr_inflight =0 ; -int i;if (ubq->flags &UBLK_F_UNPRIVILEGED_DEV ) {if (!ubq->timeout) {
@@ -1318,26 +1317,6 @@ static enum blk_eh_timer_return ublk_timreturn BLK_EH_DONE ; } -if (!ubq_daemon_is_dying (ubq)) -return BLK_EH_RESET_TIMER ; - -for (i =0 ; i < ubq->q_depth; i++) { -struct ublk_io *io = &ubq->ios[i]; - -if (!(io->flags &UBLK_IO_FLAG_ACTIVE )) - nr_inflight++; - } - -/* cancelable uring_cmd can't help us if all commands are in-flight */ -if (nr_inflight == ubq->q_depth) { -struct ublk_device *ub = ubq->dev; - -if (ublk_abort_requests (ub, ubq)) { -schedule_work (&ub->nosrv_work); - } -return BLK_EH_DONE ; - } -return BLK_EH_RESET_TIMER ; }
@@ -1495,13 +1474,105 @@ static void ublk_reset_ch_dev(struct ubl ub->nr_privileged_daemon =0 ; } +static struct gendisk *ublk_get_disk (struct ublk_device *ub) +{ +struct gendisk *disk; + +spin_lock (&ub->lock); + disk = ub->ub_disk; +if (disk) +get_device (disk_to_dev (disk)); +spin_unlock (&ub->lock); + +return disk; +} + +static void ublk_put_disk (struct gendisk *disk) +{ +if (disk) +put_device (disk_to_dev (disk)); +} +static int ublk_ch_release (struct inode *inode,struct file *filp) {struct ublk_device *ub = filp->private_data; +struct gendisk *disk; +int i; + +/* +* disk isn't attached yet, either device isn't live, or it has +* been removed already, so we needn't to do anything +*/ + disk =ublk_get_disk (ub); +if (!disk) + goto out; + +/* +* All uring_cmd are done now, so abort any request outstanding to +* the ublk server +* +* This can be done in lockless way because ublk server has been +* gone +* +* More importantly, we have to provide forward progress guarantee +* without holding ub->mutex, otherwise control task grabbing +* ub->mutex triggers deadlock +* +* All requests may be inflight, so ->canceling may not be set, set +* it now. +*/ +for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) { +struct ublk_queue *ubq =ublk_get_queue (ub, i); + + ubq->canceling = true; +ublk_abort_queue (ub, ubq); + } +blk_mq_kick_requeue_list (disk->queue); + +/* +* All infligh requests have been completed or requeued and any new +* request will be failed or requeued via `->canceling` now, so it is +* fine to grab ub->mutex now. +*/ +mutex_lock (&ub->mutex); + +/* double check after grabbing lock */ +if (!ub->ub_disk) + goto unlock; + +/* +* Transition the device to the nosrv state. What exactly this +* means depends on the recovery flags +*/ +blk_mq_quiesce_queue (disk->queue); +if (ublk_nosrv_should_stop_dev (ub)) { +/* +* Allow any pending/future I/O to pass through quickly +* with an error. This is needed because del_gendisk +* waits for all pending I/O to complete +*/ +for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) +ublk_get_queue (ub, i)->force_abort = true; +blk_mq_unquiesce_queue (disk->queue); + +ublk_stop_dev_unlocked (ub); + }else { +if (ublk_nosrv_dev_should_queue_io (ub)) { +__ublk_quiesce_dev (ub); + }else { + ub->dev_info.state =UBLK_S_DEV_FAIL_IO ; +for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) +ublk_get_queue (ub, i)->fail_io = true; + } +blk_mq_unquiesce_queue (disk->queue); + } +unlock: +mutex_unlock (&ub->mutex); +ublk_put_disk (disk);/* all uring_cmd has been done now, reset device & ubq */ ublk_reset_ch_dev (ub); - +out:clear_bit (UB_STATE_OPEN , &ub->state);return 0 ; }
@@ -1597,37 +1668,22 @@ static void ublk_abort_queue(struct ublk }/* Must be called when queue is frozen */ -static bool ublk_mark_queue_canceling (struct ublk_queue *ubq) +static void ublk_mark_queue_canceling (struct ublk_queue *ubq) { -bool canceled; -spin_lock (&ubq->cancel_lock); - canceled = ubq->canceling; -if (!canceled) +if (!ubq->canceling) ubq->canceling = true;spin_unlock (&ubq->cancel_lock); - -return canceled; } -static bool ublk_abort_requests (struct ublk_device *ub,struct ublk_queue *ubq) +static void ublk_start_cancel (struct ublk_queue *ubq) { -bool was_canceled = ubq->canceling; -struct gendisk *disk; - -if (was_canceled) -return false; - -spin_lock (&ub->lock); - disk = ub->ub_disk; -if (disk) -get_device (disk_to_dev (disk)); -spin_unlock (&ub->lock); +struct ublk_device *ub = ubq->dev; +struct gendisk *disk =ublk_get_disk (ub);/* Our disk has been dead */ if (!disk) -return false; - +return ;/* * Now we are serialized with ublk_queue_rq() *
@@ -1636,15 +1692,9 @@ static bool ublk_abort_requests(struct u* touch completed uring_cmd */ blk_mq_quiesce_queue (disk->queue); - was_canceled =ublk_mark_queue_canceling (ubq); -if (!was_canceled) { -/* abort queue is for making forward progress */ -ublk_abort_queue (ub, ubq); - } +ublk_mark_queue_canceling (ubq);blk_mq_unquiesce_queue (disk->queue); -put_device (disk_to_dev (disk)); - -return !was_canceled; +ublk_put_disk (disk); } static void ublk_cancel_cmd(struct ublk_queue *ubq, struct ublk_io *io,
@@ -1668,6 +1718,17 @@ static void ublk_cancel_cmd(struct ublk_/* * The ublk char device won't be closed when calling cancel fn, so both * ublk device and queue are guaranteed to be live +* +* Two-stage cancel: +* +* - make every active uring_cmd done in ->cancel_fn() +* +* - aborting inflight ublk IO requests in ublk char device release handler, +* which depends on 1st stage because device can only be closed iff all +* uring_cmd are done +* +* Do _not_ try to acquire ub->mutex before all inflight requests are +* aborted, otherwise deadlock may be caused. */ static void ublk_uring_cmd_cancel_fn (struct io_uring_cmd *cmd,unsigned int issue_flags)
@@ -1675,8 +1736,6 @@ static void ublk_uring_cmd_cancel_fn(strstruct ublk_uring_cmd_pdu *pdu =ublk_get_uring_cmd_pdu (cmd);struct ublk_queue *ubq = pdu->ubq;struct task_struct *task; -struct ublk_device *ub; -bool need_schedule;struct ublk_io *io;if (WARN_ON_ONCE (!ubq))
@@ -1689,16 +1748,12 @@ static void ublk_uring_cmd_cancel_fn(strif (WARN_ON_ONCE (task && task != ubq->ubq_daemon))return ; - ub = ubq->dev; - need_schedule =ublk_abort_requests (ub, ubq); +if (!ubq->canceling) +ublk_start_cancel (ubq); io = &ubq->ios[pdu->tag];WARN_ON_ONCE (io->cmd != cmd);ublk_cancel_cmd (ubq, io, issue_flags); - -if (need_schedule) { -schedule_work (&ub->nosrv_work); - } }static inline bool ublk_queue_ready (struct ublk_queue *ubq)
@@ -1757,13 +1812,11 @@ static void __ublk_quiesce_dev(struct ub __func__, ub->dev_info.dev_id, ub->dev_info.state ==UBLK_S_DEV_LIVE ? "LIVE" : "QUIESCED"); -blk_mq_quiesce_queue (ub->ub_disk->queue);/* mark every queue as canceling */ for (i =0 ; i < ub->dev_info.nr_hw_queues; i++)ublk_get_queue (ub, i)->canceling = true;ublk_wait_tagset_rqs_idle (ub); ub->dev_info.state =UBLK_S_DEV_QUIESCED ; -blk_mq_unquiesce_queue (ub->ub_disk->queue); }static void ublk_force_abort_dev (struct ublk_device *ub)
@@ -1800,50 +1853,25 @@ static struct gendisk *ublk_detach_disk(return disk; } -static void ublk_stop_dev (struct ublk_device *ub) +static void ublk_stop_dev_unlocked (struct ublk_device *ub) + __must_hold(&ub->mutex) {struct gendisk *disk; -mutex_lock (&ub->mutex);if (ub->dev_info.state ==UBLK_S_DEV_DEAD ) - goto unlock; +return ; +if (ublk_nosrv_dev_should_queue_io (ub))ublk_force_abort_dev (ub);del_gendisk (ub->ub_disk); disk =ublk_detach_disk (ub);put_disk (disk); - unlock: -mutex_unlock (&ub->mutex); -ublk_cancel_dev (ub); } -static void ublk_nosrv_work (struct work_struct *work) +static void ublk_stop_dev (struct ublk_device *ub) { -struct ublk_device *ub = - container_of(work, struct ublk_device, nosrv_work); -int i; - -if (ublk_nosrv_should_stop_dev (ub)) { -ublk_stop_dev (ub); -return ; - } -mutex_lock (&ub->mutex); -if (ub->dev_info.state !=UBLK_S_DEV_LIVE ) - goto unlock; - -if (ublk_nosrv_dev_should_queue_io (ub)) { -__ublk_quiesce_dev (ub); - }else { -blk_mq_quiesce_queue (ub->ub_disk->queue); - ub->dev_info.state =UBLK_S_DEV_FAIL_IO ; -for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) { -ublk_get_queue (ub, i)->fail_io = true; - } -blk_mq_unquiesce_queue (ub->ub_disk->queue); - } - - unlock: +ublk_stop_dev_unlocked (ub);mutex_unlock (&ub->mutex);ublk_cancel_dev (ub); }
@@ -2419,7 +2447,6 @@ static int ublk_add_tag_set(struct ublk_static void ublk_remove (struct ublk_device *ub) {ublk_stop_dev (ub); -cancel_work_sync (&ub->nosrv_work);cdev_device_del (&ub->cdev, &ub->cdev_dev);ublk_put_device (ub); ublks_added--;
@@ -2693,7 +2720,6 @@ static int ublk_ctrl_add_dev(struct io_u goto out_unlock;mutex_init (&ub->mutex);spin_lock_init (&ub->lock); -INIT_WORK (&ub->nosrv_work, ublk_nosrv_work); ret =ublk_alloc_dev_number (ub, header->dev_id);if (ret <0 )
@@ -2828,7 +2854,6 @@ static inline void ublk_ctrl_cmd_dump(ststatic int ublk_ctrl_stop_dev (struct ublk_device *ub) {ublk_stop_dev (ub); -cancel_work_sync (&ub->nosrv_work);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 158/183 ublk: remove __ublk_quiesce_dev()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 736b005b413a172670711ee17cab3c8ccab83223 ]
Remove __ublk_quiesce_dev() and open code for updating device state as QUIESCED.
We needn't to drain inflight requests in __ublk_quiesce_dev() any more, because all inflight requests are aborted in ublk char device release handler.
Also we needn't to set ->canceling in __ublk_quiesce_dev() any more because it is done unconditionally now in ublk_ch_release().
--- drivers/block/ublk_drv.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
drivers/block/ublk_drv.c +2 -17
@@ -205,7 +205,6 @@ struct ublk_params_header {static void ublk_stop_dev_unlocked (struct ublk_device *ub);static void ublk_abort_queue (struct ublk_device *ub,struct ublk_queue *ubq); -static void __ublk_quiesce_dev (struct ublk_device *ub);static inline unsigned int ublk_req_build_flags (struct request *req); static inline struct ublksrv_io_desc *ublk_get_iod(struct ublk_queue *ubq,
@@ -1558,7 +1557,8 @@ static int ublk_ch_release(struct inodeublk_stop_dev_unlocked (ub); }else {if (ublk_nosrv_dev_should_queue_io (ub)) { -__ublk_quiesce_dev (ub); +/* ->canceling is set and all requests are aborted */ + ub->dev_info.state =UBLK_S_DEV_QUIESCED ; }else { ub->dev_info.state =UBLK_S_DEV_FAIL_IO ;for (i =0 ; i < ub->dev_info.nr_hw_queues; i++)
@@ -1804,21 +1804,6 @@ static void ublk_wait_tagset_rqs_idle(st } } -static void __ublk_quiesce_dev (struct ublk_device *ub) -{ -int i; - -pr_devel ("%s: quiesce ub: dev_id %d state %s\n" , - __func__, ub->dev_info.dev_id, - ub->dev_info.state ==UBLK_S_DEV_LIVE ? -"LIVE" :"QUIESCED" ); -/* mark every queue as canceling */ -for (i =0 ; i < ub->dev_info.nr_hw_queues; i++) -ublk_get_queue (ub, i)->canceling = true; -ublk_wait_tagset_rqs_idle (ub); - ub->dev_info.state =UBLK_S_DEV_QUIESCED ; -} -static void ublk_force_abort_dev (struct ublk_device *ub) {int i;
Greg Kroah-Hartman
maintainerPATCH 159/183 ublk: simplify aborting ublk request
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit e63d2228ef831af36f963b3ab8604160cfff84c1 ]
Now ublk_abort_queue() is moved to ublk char device release handler, meantime our request queue is "quiesced" because either ->canceling was set from uring_cmd cancel function or all IOs are inflight and can't be completed by ublk server, things becomes easy much:
- all uring_cmd are done, so we needn't to mark io as UBLK_IO_FLAG_ABORTED for handling completion from uring_cmd
- ublk char device is closed, no one can hold IO request reference any more,
so we can simply complete this request or requeue it for ublk_nosrv_should_reissue_outstanding.
--- drivers/block/ublk_drv.c | 82 +++++++++++------------------------------------ 1 file changed, 20 insertions(+), 62 deletions(-)
drivers/block/ublk_drv.c +20 -62
@@ -116,15 +116,6 @@ struct ublk_uring_cmd_pdu {#define UBLK_IO_FLAG_OWNED_BY_SRV 0x02/* -* IO command is aborted, so this flag is set in case of -* !UBLK_IO_FLAG_ACTIVE. -* -* After this flag is observed, any pending or new incoming request -* associated with this io command will be failed immediately -*/ -#define UBLK_IO_FLAG_ABORTED 0x04 - -/* * UBLK_IO_FLAG_NEED_GET_DATA is set because IO command requires * get data buffer address from ublksrv. *
@@ -1054,12 +1045,6 @@ static inline void __ublk_complete_rq(stunsigned int unmapped_bytes;blk_status_t res =BLK_STS_OK ; -/* called from ublk_abort_queue() code path */ -if (io->flags &UBLK_IO_FLAG_ABORTED ) { - res =BLK_STS_IOERR ; - goto exit; - } -/* failed read IO if nothing is read */ if (!io->res &&req_op (req) ==REQ_OP_READ ) io->res = -EIO ;
@@ -1109,47 +1094,6 @@ static void ublk_complete_rq(struct kref__ublk_complete_rq (req); } -static void ublk_do_fail_rq (struct request *req) -{ -struct ublk_queue *ubq = req->mq_hctx->driver_data; - -if (ublk_nosrv_should_reissue_outstanding (ubq->dev)) -blk_mq_requeue_request (req, false); -else -__ublk_complete_rq (req); -} - -static void ublk_fail_rq_fn (struct kref *ref) -{ - struct ublk_rq_data *data = container_of(ref, struct ublk_rq_data, - ref); -struct request *req =blk_mq_rq_from_pdu (data); - -ublk_do_fail_rq (req); -} - -/* -* Since ublk_rq_task_work_cb always fails requests immediately during -* exiting, __ublk_fail_req() is only called from abort context during -* exiting. So lock is unnecessary. -* -* Also aborting may not be started yet, keep in mind that one failed -* request may be issued by block layer again. -*/ -static void __ublk_fail_req (struct ublk_queue *ubq,struct ublk_io *io, -struct request *req) -{ -WARN_ON_ONCE (io->flags &UBLK_IO_FLAG_ACTIVE ); - -if (ublk_need_req_ref (ubq)) { -struct ublk_rq_data *data =blk_mq_rq_to_pdu (req); - -kref_put (&data->ref, ublk_fail_rq_fn); - }else { -ublk_do_fail_rq (req); - } -} -static void ubq_complete_io_cmd (struct ublk_io *io,int res,unsigned issue_flags) {
@@ -1639,10 +1583,26 @@ static void ublk_commit_completion(strucublk_put_req_ref (ubq, req); } +static void __ublk_fail_req (struct ublk_queue *ubq,struct ublk_io *io, +struct request *req) +{ +WARN_ON_ONCE (io->flags &UBLK_IO_FLAG_ACTIVE ); + +if (ublk_nosrv_should_reissue_outstanding (ubq->dev)) +blk_mq_requeue_request (req, false); +else { + io->res = -EIO ; +__ublk_complete_rq (req); + } +} +/* -* Called from ubq_daemon context via cancel fn, meantime quiesce ublk -* blk-mq queue, so we are called exclusively with blk-mq and ubq_daemon -* context, so everything is serialized. +* Called from ublk char device release handler, when any uring_cmd is +* done, meantime request queue is "quiesced" since all inflight requests +* can't be completed because ublk server is dead. +* +* So no one can hold our request IO reference any more, simply ignore the +* reference, and complete the request immediately */ static void ublk_abort_queue (struct ublk_device *ub,struct ublk_queue *ubq) {
@@ -1659,10 +1619,8 @@ static void ublk_abort_queue(struct ublk* will do it */ rq =blk_mq_tag_to_rq (ub->tag_set.tags[ubq->q_id], i); -if (rq &&blk_mq_request_started (rq)) { - io->flags |=UBLK_IO_FLAG_ABORTED ; +if (rq &&blk_mq_request_started (rq))__ublk_fail_req (ubq, io, rq); - } } } }
Greg Kroah-Hartman
maintainerPATCH 160/183 ublk: fix race between io_uring_cmd_complete_in_task and ublk_cancel_cmd
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit f40139fde5278d81af3227444fd6e76a76b9506d ]
ublk_cancel_cmd() calls io_uring_cmd_done() to complete uring_cmd, but we may have scheduled task work via io_uring_cmd_complete_in_task() for dispatching request, then kernel crash can be triggered.
Fix it by not trying to canceling the command if ublk block request is started.
--- drivers/block/ublk_drv.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/block/ublk_drv.c +21 -6
@@ -1655,14 +1655,31 @@ static void ublk_start_cancel(struct ublublk_put_disk (disk); } -static void ublk_cancel_cmd (struct ublk_queue *ubq,struct ublk_io *io, +static void ublk_cancel_cmd (struct ublk_queue *ubq,unsigned tag,unsigned int issue_flags) { +struct ublk_io *io = &ubq->ios[tag]; +struct ublk_device *ub = ubq->dev; +struct request *req;bool done;if (!(io->flags &UBLK_IO_FLAG_ACTIVE ))return ; +/* +* Don't try to cancel this command if the request is started for +* avoiding race between io_uring_cmd_done() and +* io_uring_cmd_complete_in_task(). +* +* Either the started request will be aborted via __ublk_abort_rq(), +* then this uring_cmd is canceled next time, or it will be done in +* task work function ublk_dispatch_req() because io_uring guarantees +* that ublk_dispatch_req() is always called +*/ + req =blk_mq_tag_to_rq (ub->tag_set.tags[ubq->q_id], tag); +if (req &&blk_mq_request_started (req)) +return ; +spin_lock (&ubq->cancel_lock); done = !!(io->flags &UBLK_IO_FLAG_CANCELED );if (!done)
@@ -1694,7 +1711,6 @@ static void ublk_uring_cmd_cancel_fn(strstruct ublk_uring_cmd_pdu *pdu =ublk_get_uring_cmd_pdu (cmd);struct ublk_queue *ubq = pdu->ubq;struct task_struct *task; -struct ublk_io *io;if (WARN_ON_ONCE (!ubq))return ;
@@ -1709,9 +1725,8 @@ static void ublk_uring_cmd_cancel_fn(strif (!ubq->canceling)ublk_start_cancel (ubq); - io = &ubq->ios[pdu->tag]; -WARN_ON_ONCE (io->cmd != cmd); -ublk_cancel_cmd (ubq, io, issue_flags); +WARN_ON_ONCE (ubq->ios[pdu->tag].cmd != cmd); +ublk_cancel_cmd (ubq, pdu->tag, issue_flags); }static inline bool ublk_queue_ready (struct ublk_queue *ubq)
@@ -1724,7 +1739,7 @@ static void ublk_cancel_queue(struct ublint i;for (i =0 ; i < ubq->q_depth; i++) -ublk_cancel_cmd (ubq, &ubq->ios[i],IO_URING_F_UNLOCKED ); +ublk_cancel_cmd (ubq, i,IO_URING_F_UNLOCKED ); }/* Cancel all pending commands, must be called after del_gendisk() returns */
Greg Kroah-Hartman
maintainerPATCH 161/183 sch_htb: make htb_qlen_notify() idempotent
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit 5ba8b837b522d7051ef81bacf3d95383ff8edce5 upstream.
htb_qlen_notify() always deactivates the HTB class and in fact could trigger a warning if it is already deactivated. Therefore, it is not idempotent and not friendly to its callers, like fq_codel_dequeue().
Let's make it idempotent to ease qdisc_tree_reduce_backlog() callers' life.
--- net/sched/sch_htb.c | 2 ++ 1 file changed, 2 insertions(+)
net/sched/sch_htb.c +2 -0
@@ -1485,6 +1485,8 @@ static void htb_qlen_notify(struct Qdisc {struct htb_class *cl = (struct htb_class *)arg; +if (!cl->prio_activity) +return ;htb_deactivate (qdisc_priv (sch), cl); }
Greg Kroah-Hartman
maintainerPATCH 162/183 sch_drr: make drr_qlen_notify() idempotent
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit df008598b3a00be02a8051fde89ca0fbc416bd55 upstream.
drr_qlen_notify() always deletes the DRR class from its active list with list_del(), therefore, it is not idempotent and not friendly to its callers, like fq_codel_dequeue().
Let's make it idempotent to ease qdisc_tree_reduce_backlog() callers' life. Also change other list_del()'s to list_del_init() just to be extra safe.
--- net/sched/sch_drr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/sched/sch_drr.c +4 -3
@@ -110,6 +110,7 @@ static int drr_change_class(struct Qdiscreturn -ENOBUFS ;gnet_stats_basic_sync_init (&cl->bstats); +INIT_LIST_HEAD (&cl->alist); cl->common.classid = classid; cl->quantum = quantum; cl->qdisc = qdisc_create_dflt(sch->dev_queue,
@@ -234,7 +235,7 @@ static void drr_qlen_notify(struct Qdisc {struct drr_class *cl = (struct drr_class *)arg; -list_del (&cl->alist); +list_del_init (&cl->alist); } static int drr_dump_class(struct Qdisc *sch, unsigned long arg,
@@ -393,7 +394,7 @@ static struct sk_buff *drr_dequeue(strucif (unlikely (skb ==NULL )) goto out;if (cl->qdisc->q.qlen ==0 ) -list_del (&cl->alist); +list_del_init (&cl->alist);bstats_update (&cl->bstats, skb);qdisc_bstats_update (sch, skb);
@@ -434,7 +435,7 @@ static void drr_reset_qdisc(struct Qdiscfor (i =0 ; i < q->clhash.hashsize; i++) {hlist_for_each_entry (cl, &q->clhash.hash[i], common.hnode) {if (cl->qdisc->q.qlen) -list_del (&cl->alist); +list_del_init (&cl->alist);qdisc_reset (cl->qdisc); } }
Greg Kroah-Hartman
maintainerPATCH 163/183 sch_hfsc: make hfsc_qlen_notify() idempotent
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit 51eb3b65544c9efd6a1026889ee5fb5aa62da3bb upstream.
hfsc_qlen_notify() is not idempotent either and not friendly to its callers, like fq_codel_dequeue(). Let's make it idempotent to ease qdisc_tree_reduce_backlog() callers' life:
1. update_vf() decreases cl->cl_nactive, so we can check whether it is non-zero before calling it.
2. eltree_remove() always removes RB node cl->el_node, but we can use RB_EMPTY_NODE() + RB_CLEAR_NODE() to make it safe.
--- net/sched/sch_hfsc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/sched/sch_hfsc.c +6 -2
@@ -203,7 +203,10 @@ eltree_insert(struct hfsc_class *cl)static inline void eltree_remove (struct hfsc_class *cl) { -rb_erase (&cl->el_node, &cl->sched->eligible); +if (!RB_EMPTY_NODE (&cl->el_node)) { +rb_erase (&cl->el_node, &cl->sched->eligible); +RB_CLEAR_NODE (&cl->el_node); + } } static inline void
@@ -1225,7 +1228,8 @@ hfsc_qlen_notify(struct Qdisc *sch, unsi/* vttree is now handled in update_vf() so that update_vf(cl, 0, 0) * needs to be called explicitly to remove a class from vttree. */ -update_vf (cl,0 ,0 ); +if (cl->cl_nactive) +update_vf (cl,0 ,0 );if (cl->cl_flags &HFSC_RSC )eltree_remove (cl); }
Greg Kroah-Hartman
maintainerPATCH 164/183 sch_qfq: make qfq_qlen_notify() idempotent
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit 55f9eca4bfe30a15d8656f915922e8c98b7f0728 upstream.
qfq_qlen_notify() always deletes its class from its active list with list_del_init() _and_ calls qfq_deactivate_agg() when the whole list becomes empty.
To make it idempotent, just skip everything when it is not in the active list.
Also change other list_del()'s to list_del_init() just to be extra safe.
--- net/sched/sch_qfq.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/sched/sch_qfq.c +5 -2
@@ -352,7 +352,7 @@ static void qfq_deactivate_class(structstruct qfq_aggregate *agg = cl->agg; -list_del (&cl->alist);/* remove from RR queue of the aggregate */ +list_del_init (&cl->alist);/* remove from RR queue of the aggregate */ if (list_empty (&agg->active))/* agg is now inactive */ qfq_deactivate_agg (q, agg); }
@@ -479,6 +479,7 @@ static int qfq_change_class(struct Qdiscgnet_stats_basic_sync_init (&cl->bstats); cl->common.classid = classid; cl->deficit = lmax; +INIT_LIST_HEAD (&cl->alist); cl->qdisc =qdisc_create_dflt (sch->dev_queue, &pfifo_qdisc_ops, classid,NULL );
@@ -987,7 +988,7 @@ static struct sk_buff *agg_dequeue(struc cl->deficit -= (int ) len;if (cl->qdisc->q.qlen ==0 )/* no more packets, remove from list */ -list_del (&cl->alist); +list_del_init (&cl->alist);else if (cl->deficit <qdisc_pkt_len (cl->qdisc->ops->peek (cl->qdisc))) { cl->deficit += agg->lmax;list_move_tail (&cl->alist, &agg->active);
@@ -1418,6 +1419,8 @@ static void qfq_qlen_notify(struct Qdiscstruct qfq_sched *q =qdisc_priv (sch);struct qfq_class *cl = (struct qfq_class *)arg; +if (list_empty (&cl->alist)) +return ;qfq_deactivate_class (q, cl); }
Greg Kroah-Hartman
maintainerPATCH 165/183 sch_ets: make est_qlen_notify() idempotent
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit a7a15f39c682ac4268624da2abdb9114bdde96d5 upstream.
est_qlen_notify() deletes its class from its active list with list_del() when qlen is 0, therefore, it is not idempotent and not friendly to its callers, like fq_codel_dequeue().
Let's make it idempotent to ease qdisc_tree_reduce_backlog() callers' life. Also change other list_del()'s to list_del_init() just to be extra safe.
--- net/sched/sch_ets.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/sched/sch_ets.c +4 -4
@@ -298,7 +298,7 @@ static void ets_class_qlen_notify(struct* to remove them. */ if (!ets_class_is_strict (q, cl) && sch->q.qlen) -list_del (&cl->alist); +list_del_init (&cl->alist); } static int ets_class_dump(struct Qdisc *sch, unsigned long arg,
@@ -491,7 +491,7 @@ static struct sk_buff *ets_qdisc_dequeueif (unlikely (!skb)) goto out;if (cl->qdisc->q.qlen ==0 ) -list_del (&cl->alist); +list_del_init (&cl->alist);return ets_qdisc_dequeue_skb (sch, skb); }
@@ -660,7 +660,7 @@ static int ets_qdisc_change(struct Qdisc }for (i = q->nbands; i < oldbands; i++) {if (i >= q->nstrict && q->classes[i].qdisc->q.qlen) -list_del (&q->classes[i].alist); +list_del_init (&q->classes[i].alist);qdisc_tree_flush_backlog (q->classes[i].qdisc); }WRITE_ONCE (q->nstrict, nstrict);
@@ -716,7 +716,7 @@ static void ets_qdisc_reset(struct Qdiscfor (band = q->nstrict; band < q->nbands; band++) {if (q->classes[band].qdisc->q.qlen) -list_del (&q->classes[band].alist); +list_del_init (&q->classes[band].alist); }for (band =0 ; band < q->nbands; band++)qdisc_reset (q->classes[band].qdisc);
Greg Kroah-Hartman
maintainerPATCH 166/183 firmware: arm_scmi: Balance device refcount when destroying devices
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cristian Marussi <[email protected]>
[ Upstream commit 9ca67840c0ddf3f39407339624cef824a4f27599 ]
Using device_find_child() to lookup the proper SCMI device to destroy causes an unbalance in device refcount, since device_find_child() calls an implicit get_device(): this, in turns, inhibits the call of the provided release methods upon devices destruction.
As a consequence, one of the structures that is not freed properly upon destruction is the internal struct device_private dev->p populated by the drivers subsystem core.
KMemleak detects this situation since loading/unloding some SCMI driver causes related devices to be created/destroyed without calling any device_release method.
unreferenced object 0xffff00000f583800 (size 512):
comm "insmod", pid 227, jiffies 4294912190 hex dump (first 32 bytes):
00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N..........
ff ff ff ff ff ff ff ff 60 36 1d 8a 00 80 ff ff ........`6......
backtrace (crc 114e2eed):
kmemleak_alloc+0xbc/0xd8
__kmalloc_cache_noprof+0x2dc/0x398
device_add+0x954/0x12d0
device_register+0x28/0x40
__scmi_device_create.part.0+0x1bc/0x380
scmi_device_create+0x2d0/0x390
scmi_create_protocol_devices+0x74/0xf8
scmi_device_request_notifier+0x1f8/0x2a8
notifier_call_chain+0x110/0x3b0
blocking_notifier_call_chain+0x70/0xb0
scmi_driver_register+0x350/0x7f0
0xffff80000a3b3038
do_one_initcall+0x12c/0x730
do_init_module+0x1dc/0x640
load_module+0x4b20/0x5b70
init_module_from_file+0xec/0x158$ ./scripts/faddr2line ./vmlinux device_add+0x954/0x12d0 device_add+0x954/0x12d0: kmalloc_noprof at include/linux/slab.h:901 (inlined by) kzalloc_noprof at include/linux/slab.h:1037 (inlined by) device_private_init at drivers/base/core.c:3510 (inlined by) device_add at drivers/base/core.c:3561
Balance device refcount by issuing a put_device() on devices found via device_find_child().
Message-Id: <[email protected]>
--- drivers/firmware/arm_scmi/bus.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/firmware/arm_scmi/bus.c +3 -0
@@ -260,6 +260,9 @@ static struct scmi_device *scmi_child_dev_find(struct device *parent,if (!dev)return NULL ; +/* Drop the refcnt bumped implicitly by device_find_child */ +put_device (dev); +return to_scmi_dev (dev); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 167/183 firmware: arm_ffa: Skip Rx buffer ownership release if not acquired
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
[ Upstream commit 4567bdaaaaa1744da3d7da07d9aca2f941f5b4e5 ]
Completion of the FFA_PARTITION_INFO_GET ABI transfers the ownership of the caller’s Rx buffer from the producer(typically partition mnager) to the consumer(this driver/OS). FFA_RX_RELEASE transfers the ownership from the consumer back to the producer.
However, when we set the flag to just return the count of partitions deployed in the system corresponding to the specified UUID while invoking FFA_PARTITION_INFO_GET, the Rx buffer ownership shouldn't be transferred to this driver. We must be able to skip transferring back the ownership to the partition manager when we request just to get the count of the partitions as the buffers are not acquired in this case.
Firmware may return FFA_RET_DENIED or other error for the ffa_rx_release() in such cases.
Message-Id: <[email protected]>
--- drivers/firmware/arm_ffa/driver.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/firmware/arm_ffa/driver.c +2 -1
@@ -280,7 +280,8 @@ __ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3,memcpy (buffer + idx, drv_info->rx_buffer + idx * sz, buf_sz); -ffa_rx_release (); +if (!(flags &PARTITION_INFO_GET_RETURN_COUNT_ONLY )) +ffa_rx_release ();mutex_unlock (&drv_info->rx_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 168/183 arm64: dts: imx95: Correct the range of PCIe app-reg region
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit 02e4232998db357bb8199778722d81ffcff0cb98 ]
Correct the range of PCIe app-reg region from 0x2000 to 0x4000 refer to SerDes_SS memory map of i.MX95 Rerference Manual.
--- arch/arm64/boot/dts/freescale/imx95.dtsi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/freescale/imx95.dtsi +4 -4
@@ -1542,7 +1542,7 @@ reg = <0 0x4c300000 0 0x10000>, <0 0x60100000 0 0xfe00000>, <0 0x4c360000 0 0x10000>, - <0 0x4c340000 0 0x2000>; + <0 0x4c340000 0 0x4000>; reg-names = "dbi", "config", "atu", "app"; ranges = <0x81000000 0x0 0x00000000 0x0 0x6ff00000 0 0x00100000>, <0x82000000 0x0 0x10000000 0x9 0x10000000 0 0x10000000>;
@@ -1582,7 +1582,7 @@ reg = <0 0x4c300000 0 0x10000>, <0 0x4c360000 0 0x1000>, <0 0x4c320000 0 0x1000>, - <0 0x4c340000 0 0x2000>, + <0 0x4c340000 0 0x4000>, <0 0x4c370000 0 0x10000>, <0x9 0 1 0>; reg-names = "dbi","atu", "dbi2", "app", "dma", "addr_space";
@@ -1609,7 +1609,7 @@ reg = <0 0x4c380000 0 0x10000>, <8 0x80100000 0 0xfe00000>, <0 0x4c3e0000 0 0x10000>, - <0 0x4c3c0000 0 0x2000>; + <0 0x4c3c0000 0 0x4000>; reg-names = "dbi", "config", "atu", "app"; ranges = <0x81000000 0 0x00000000 0x8 0x8ff00000 0 0x00100000>, <0x82000000 0 0x10000000 0xa 0x10000000 0 0x10000000>;
@@ -1649,7 +1649,7 @@ reg = <0 0x4c380000 0 0x10000>, <0 0x4c3e0000 0 0x1000>, <0 0x4c3a0000 0 0x1000>, - <0 0x4c3c0000 0 0x2000>, + <0 0x4c3c0000 0 0x4000>, <0 0x4c3f0000 0 0x10000>, <0xa 0 1 0>; reg-names = "dbi", "atu", "dbi2", "app", "dma", "addr_space";
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 169/183 ARM: dts: opos6ul: add ksz8081 phy properties
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sébastien Szymanski <[email protected]>
[ Upstream commit 6e1a7bc8382b0d4208258f7d2a4474fae788dd90 ]
Commit c7e73b5051d6 ("ARM: imx: mach-imx6ul: remove 14x14 EVK specific PHY fixup") removed a PHY fixup that setted the clock mode and the LED mode.
Make the Ethernet interface work again by doing as advised in the commit's log, set clock mode and the LED mode in the device tree.
--- arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6ul.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6ul.dtsi +3 -0
@@ -40,6 +40,9 @@ reg = <1>; interrupt-parent = <&gpio4>; interrupts = <16 IRQ_TYPE_LEVEL_LOW>; + micrel,led-mode = <1>; + clocks = <&clks IMX6UL_CLK_ENET_REF>; + clock-names = "rmii-ref"; status = "okay"; }; };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 170/183 arm64: dts: st: Adjust interrupt-controller for stm32mp25 SoCs
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Bruel <[email protected]>
[ Upstream commit de2b2107d5a41a91ab603e135fb6e408abbee28e ]
Use gic-400 compatible and remove address-cells = <1> on aarch64
--- arch/arm64/boot/dts/st/stm32mp251.dtsi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/arm64/boot/dts/st/stm32mp251.dtsi +1 -2
@@ -115,9 +115,8 @@ }; intc: interrupt-controller@4ac00000 { - compatible = "arm,cortex-a7-gic"; + compatible = "arm,gic-400"; #interrupt-cells = <3>; - #address-cells = <1>; interrupt-controller; reg = <0x0 0x4ac10000 0x0 0x1000>, <0x0 0x4ac20000 0x0 0x2000>,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 171/183 arm64: dts: st: Use 128kB size for aliased GIC400 register access on stm32mp25 SoCs
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Bruel <[email protected]>
[ Upstream commit 06c231fe953a26f4bc9d7a37ba1b9b288a59c7c2 ]
Adjust the size of 8kB GIC regions to 128kB so that each 4kB is mapped 16 times over a 64kB region.
The offset is then adjusted in the irq-gic driver.
see commit 12e14066f4835 ("irqchip/GIC: Add workaround for aliased GIC400")
--- arch/arm64/boot/dts/st/stm32mp251.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/st/stm32mp251.dtsi +3 -3
@@ -119,9 +119,9 @@ #interrupt-cells = <3>; interrupt-controller; reg = <0x0 0x4ac10000 0x0 0x1000>, - <0x0 0x4ac20000 0x0 0x2000>, - <0x0 0x4ac40000 0x0 0x2000>, - <0x0 0x4ac60000 0x0 0x2000>; + <0x0 0x4ac20000 0x0 0x20000>, + <0x0 0x4ac40000 0x0 0x20000>, + <0x0 0x4ac60000 0x0 0x20000>; }; psci {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 172/183 block: introduce zone capacity helper
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
[ Upstream commit c1a79b1a583654f24b17da81ba868b0064077243 ]
{bdev,disk}_zone_capacity() takes block_device or gendisk and sector position and returns the zone capacity of the corresponding zone.
With that, move disk_nr_zones() and blk_zone_plug_bio() to consolidate them in the same #ifdef block.
Stable-dep-of: 866bafae59ec ("btrfs: zoned: skip reporting zone for new block group")
--- include/linux/blkdev.h | 67 ++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 22 deletions(-)
include/linux/blkdev.h +45 -22
@@ -691,23 +691,6 @@ static inline bool blk_queue_is_zoned(struct request_queue *q) (q->limits.features &BLK_FEAT_ZONED ); } -#ifdef CONFIG_BLK_DEV_ZONED -static inline unsigned int disk_nr_zones (struct gendisk *disk) -{ -return disk->nr_zones; -} -bool blk_zone_plug_bio (struct bio *bio,unsigned int nr_segs); -#else /* CONFIG_BLK_DEV_ZONED */ -static inline unsigned int disk_nr_zones (struct gendisk *disk) -{ -return 0 ; -} -static inline bool blk_zone_plug_bio (struct bio *bio,unsigned int nr_segs) -{ -return false; -} -#endif /* CONFIG_BLK_DEV_ZONED */ -static inline unsigned int disk_zone_no (struct gendisk *disk,sector_t sector) {if (!blk_queue_is_zoned (disk->queue))
@@ -715,11 +698,6 @@ static inline unsigned int disk_zone_no(struct gendisk *disk, sector_t sector)return sector >>ilog2 (disk->queue->limits.chunk_sectors); } -static inline unsigned int bdev_nr_zones (struct block_device *bdev) -{ -return disk_nr_zones (bdev->bd_disk); -} -static inline unsigned int bdev_max_open_zones (struct block_device *bdev) {return bdev->bd_disk->queue->limits.max_open_zones;
@@ -826,6 +804,51 @@ static inline u64 sb_bdev_nr_blocks(struct super_block *sb) (sb->s_blocksize_bits -SECTOR_SHIFT ); } +#ifdef CONFIG_BLK_DEV_ZONED +static inline unsigned int disk_nr_zones (struct gendisk *disk) +{ +return disk->nr_zones; +} +bool blk_zone_plug_bio (struct bio *bio,unsigned int nr_segs); + +/** +* disk_zone_capacity - returns the zone capacity of zone containing @sector +* @disk: disk to work with +* @sector: sector number within the querying zone +* +* Returns the zone capacity of a zone containing @sector. @sector can be any +* sector in the zone. +*/ +static inline unsigned int disk_zone_capacity (struct gendisk *disk, +sector_t sector) +{ +sector_t zone_sectors = disk->queue->limits.chunk_sectors; + +if (sector + zone_sectors >=get_capacity (disk)) +return disk->last_zone_capacity; +return disk->zone_capacity; +} +static inline unsigned int bdev_zone_capacity (struct block_device *bdev, +sector_t pos) +{ +return disk_zone_capacity (bdev->bd_disk, pos); +} +#else /* CONFIG_BLK_DEV_ZONED */ +static inline unsigned int disk_nr_zones (struct gendisk *disk) +{ +return 0 ; +} +static inline bool blk_zone_plug_bio (struct bio *bio,unsigned int nr_segs) +{ +return false; +} +#endif /* CONFIG_BLK_DEV_ZONED */ + +static inline unsigned int bdev_nr_zones (struct block_device *bdev) +{ +return disk_nr_zones (bdev->bd_disk); +} +int bdev_disk_changed (struct gendisk *disk,bool invalidate);void put_disk (struct gendisk *disk);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 173/183 btrfs: zoned: skip reporting zone for new block group
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
[ Upstream commit 866bafae59ecffcf1840d846cd79740be29f21d6 ]
There is a potential deadlock if we do report zones in an IO context, detailed in below lockdep report. When one process do a report zones and another process freezes the block device, the report zones side cannot allocate a tag because the freeze is already started. This can thus result in new block group creation to hang forever, blocking the write path.
Thankfully, a new block group should be created on empty zones. So, reporting the zones is not necessary and we can set the write pointer = 0 and load the zone capacity from the block layer using bdev_zone_capacity() helper.
======================================================
WARNING: possible circular locking dependency detected
6.14.0-rc1 #252 Not tainted
------------------------------------------------------
modprobe/1110 is trying to acquire lock:
ffff888100ac83e0 ((work_completion)(&(&wb->dwork)->work)){+.+.}-{0:0}, at: __flush_work+0x38f/0xb60
but task is already holding lock:
ffff8881205b6f20 (&q->q_usage_counter(queue)#16){++++}-{0:0}, at: sd_remove+0x85/0x130
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 (&q->q_usage_counter(queue)#16){++++}-{0:0}:
blk_queue_enter+0x3d9/0x500
blk_mq_alloc_request+0x47d/0x8e0
scsi_execute_cmd+0x14f/0xb80
sd_zbc_do_report_zones+0x1c1/0x470
sd_zbc_report_zones+0x362/0xd60
blkdev_report_zones+0x1b1/0x2e0
btrfs_get_dev_zones+0x215/0x7e0 [btrfs]
btrfs_load_block_group_zone_info+0x6d2/0x2c10 [btrfs]
btrfs_make_block_group+0x36b/0x870 [btrfs]
btrfs_create_chunk+0x147d/0x2320 [btrfs]
btrfs_chunk_alloc+0x2ce/0xcf0 [btrfs]
start_transaction+0xce6/0x1620 [btrfs]
btrfs_uuid_scan_kthread+0x4ee/0x5b0 [btrfs]
kthread+0x39d/0x750
ret_from_fork+0x30/0x70
ret_from_fork_asm+0x1a/0x30-> #2 (&fs_info->dev_replace.rwsem){++++}-{4:4}:
down_read+0x9b/0x470
btrfs_map_block+0x2ce/0x2ce0 [btrfs]
btrfs_submit_chunk+0x2d4/0x16c0 [btrfs]
btrfs_submit_bbio+0x16/0x30 [btrfs]
btree_write_cache_pages+0xb5a/0xf90 [btrfs]
do_writepages+0x17f/0x7b0
__writeback_single_inode+0x114/0xb00
writeback_sb_inodes+0x52b/0xe00
wb_writeback+0x1a7/0x800
wb_workfn+0x12a/0xbd0
process_one_work+0x85a/0x1460
worker_thread+0x5e2/0xfc0
kthread+0x39d/0x750
ret_from_fork+0x30/0x70
ret_from_fork_asm+0x1a/0x30-> #1 (&fs_info->zoned_meta_io_lock){+.+.}-{4:4}:
__mutex_lock+0x1aa/0x1360
btree_write_cache_pages+0x252/0xf90 [btrfs]
do_writepages+0x17f/0x7b0
__writeback_single_inode+0x114/0xb00
writeback_sb_inodes+0x52b/0xe00
wb_writeback+0x1a7/0x800
wb_workfn+0x12a/0xbd0
process_one_work+0x85a/0x1460
worker_thread+0x5e2/0xfc0
kthread+0x39d/0x750
ret_from_fork+0x30/0x70
ret_from_fork_asm+0x1a/0x30-> #0 ((work_completion)(&(&wb->dwork)->work)){+.+.}-{0:0}:
__lock_acquire+0x2f52/0x5ea0
lock_acquire+0x1b1/0x540
__flush_work+0x3ac/0xb60
wb_shutdown+0x15b/0x1f0
bdi_unregister+0x172/0x5b0
del_gendisk+0x841/0xa20
sd_remove+0x85/0x130
device_release_driver_internal+0x368/0x520
bus_remove_device+0x1f1/0x3f0
device_del+0x3bd/0x9c0
__scsi_remove_device+0x272/0x340
scsi_forget_host+0xf7/0x170
scsi_remove_host+0xd2/0x2a0
sdebug_driver_remove+0x52/0x2f0 [scsi_debug]
device_release_driver_internal+0x368/0x520
bus_remove_device+0x1f1/0x3f0
device_del+0x3bd/0x9c0
device_unregister+0x13/0xa0
sdebug_do_remove_host+0x1fb/0x290 [scsi_debug]
scsi_debug_exit+0x17/0x70 [scsi_debug]
__do_sys_delete_module.isra.0+0x321/0x520
do_syscall_64+0x93/0x180
entry_SYSCALL_64_after_hwframe+0x76/0x7eother info that might help us debug this:
Chain exists of: (work_completion)(&(&wb->dwork)->work) --> &fs_info->dev_replace.rwsem --> &q->q_usage_counter(queue)#16 Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&q->q_usage_counter(queue)#16);
lock(&fs_info->dev_replace.rwsem);
lock(&q->q_usage_counter(queue)#16);lock((work_completion)(&(&wb->dwork)->work));
*** DEADLOCK ***
5 locks held by modprobe/1110:
#0: ffff88811f7bc108 (&dev->mutex){....}-{4:4}, at: device_release_driver_internal+0x8f/0x520 #1: ffff8881022ee0e0 (&shost->scan_mutex){+.+.}-{4:4}, at: scsi_remove_host+0x20/0x2a0 #2: ffff88811b4c4378 (&dev->mutex){....}-{4:4}, at: device_release_driver_internal+0x8f/0x520 #3: ffff8881205b6f20 (&q->q_usage_counter(queue)#16){++++}-{0:0}, at: sd_remove+0x85/0x130 #4: ffffffffa3284360 (rcu_read_lock){....}-{1:3}, at: __flush_work+0xda/0xb60
stack backtrace: CPU: 0 UID: 0 PID: 1110 Comm: modprobe Not tainted 6.14.0-rc1 #252 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x6a/0x90 print_circular_bug.cold+0x1e0/0x274 check_noncircular+0x306/0x3f0 ? __pfx_check_noncircular+0x10/0x10 ? mark_lock+0xf5/0x1650 ? __pfx_check_irq_usage+0x10/0x10 ? lockdep_lock+0xca/0x1c0 ? __pfx_lockdep_lock+0x10/0x10 __lock_acquire+0x2f52/0x5ea0 ? __pfx___lock_acquire+0x10/0x10 ? __pfx_mark_lock+0x10/0x10 lock_acquire+0x1b1/0x540 ? __flush_work+0x38f/0xb60 ? __pfx_lock_acquire+0x10/0x10 ? __pfx_lock_release+0x10/0x10 ? mark_held_locks+0x94/0xe0 ? __flush_work+0x38f/0xb60 __flush_work+0x3ac/0xb60 ? __flush_work+0x38f/0xb60 ? __pfx_mark_lock+0x10/0x10 ? __pfx___flush_work+0x10/0x10 ? __pfx_wq_barrier_func+0x10/0x10 ? __pfx___might_resched+0x10/0x10 ? mark_held_locks+0x94/0xe0 wb_shutdown+0x15b/0x1f0 bdi_unregister+0x172/0x5b0 ? __pfx_bdi_unregister+0x10/0x10 ? up_write+0x1ba/0x510 del_gendisk+0x841/0xa20 ? __pfx_del_gendisk+0x10/0x10 ? _raw_spin_unlock_irqrestore+0x35/0x60 ? __pm_runtime_resume+0x79/0x110 sd_remove+0x85/0x130 device_release_driver_internal+0x368/0x520 ? kobject_put+0x5d/0x4a0 bus_remove_device+0x1f1/0x3f0 device_del+0x3bd/0x9c0 ? __pfx_device_del+0x10/0x10 __scsi_remove_device+0x272/0x340 scsi_forget_host+0xf7/0x170 scsi_remove_host+0xd2/0x2a0 sdebug_driver_remove+0x52/0x2f0 [scsi_debug] ? kernfs_remove_by_name_ns+0xc0/0xf0 device_release_driver_internal+0x368/0x520 ? kobject_put+0x5d/0x4a0 bus_remove_device+0x1f1/0x3f0 device_del+0x3bd/0x9c0 ? __pfx_device_del+0x10/0x10 ? __pfx___mutex_unlock_slowpath+0x10/0x10 device_unregister+0x13/0xa0 sdebug_do_remove_host+0x1fb/0x290 [scsi_debug] scsi_debug_exit+0x17/0x70 [scsi_debug] __do_sys_delete_module.isra.0+0x321/0x520 ? __pfx___do_sys_delete_module.isra.0+0x10/0x10 ? __pfx_slab_free_after_rcu_debug+0x10/0x10 ? kasan_save_stack+0x2c/0x50 ? kasan_record_aux_stack+0xa3/0xb0 ? __call_rcu_common.constprop.0+0xc4/0xfb0 ? kmem_cache_free+0x3a0/0x590 ? __x64_sys_close+0x78/0xd0 do_syscall_64+0x93/0x180 ? lock_is_held_type+0xd5/0x130 ? __call_rcu_common.constprop.0+0x3c0/0xfb0 ? lockdep_hardirqs_on+0x78/0x100 ? __call_rcu_common.constprop.0+0x3c0/0xfb0 ? __pfx___call_rcu_common.constprop.0+0x10/0x10 ? kmem_cache_free+0x3a0/0x590 ? lockdep_hardirqs_on_prepare+0x16d/0x400 ? do_syscall_64+0x9f/0x180 ? lockdep_hardirqs_on+0x78/0x100 ? do_syscall_64+0x9f/0x180 ? __pfx___x64_sys_openat+0x10/0x10 ? lockdep_hardirqs_on_prepare+0x16d/0x400 ? do_syscall_64+0x9f/0x180 ? lockdep_hardirqs_on+0x78/0x100 ? do_syscall_64+0x9f/0x180 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7f436712b68b RSP: 002b:00007ffe9f1a8658 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 00005559b367fd80 RCX: 00007f436712b68b RDX: 0000000000000000 RSI: 0000000000000800 RDI: 00005559b367fde8 RBP: 00007ffe9f1a8680 R08: 1999999999999999 R09: 0000000000000000 R10: 00007f43671a5fe0 R11: 0000000000000206 R12: 0000000000000000 R13: 00007ffe9f1a86b0 R14: 0000000000000000 R15: 0000000000000000 </TASK>
--- fs/btrfs/zoned.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
fs/btrfs/zoned.c +16 -2
@@ -1277,7 +1277,7 @@ struct zone_info {static int btrfs_load_zone_info (struct btrfs_fs_info *fs_info,int zone_idx,struct zone_info *info,unsigned long *active, -struct btrfs_chunk_map *map) +struct btrfs_chunk_map *map,bool new) {struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace;struct btrfs_device *device;
@@ -1307,6 +1307,8 @@ static int btrfs_load_zone_info(struct btrfs_fs_info *fs_info, int zone_idx,return 0 ; } +ASSERT (!new ||btrfs_dev_is_empty_zone (device, info->physical)); +/* This zone will be used for allocation, so mark this zone non-empty. */ btrfs_dev_clear_zone_empty (device, info->physical);
@@ -1319,6 +1321,18 @@ static int btrfs_load_zone_info(struct btrfs_fs_info *fs_info, int zone_idx,* to determine the allocation offset within the zone. */ WARN_ON (!IS_ALIGNED (info->physical, fs_info->zone_size)); + +if (new) { +sector_t capacity; + + capacity =bdev_zone_capacity (device->bdev, info->physical >>SECTOR_SHIFT ); +up_read (&dev_replace->rwsem); + info->alloc_offset =0 ; + info->capacity = capacity <<SECTOR_SHIFT ; + +return 0 ; + } + nofs_flag =memalloc_nofs_save (); ret =btrfs_get_dev_zone (device, info->physical, &zone);memalloc_nofs_restore (nofs_flag);
@@ -1588,7 +1602,7 @@ int btrfs_load_block_group_zone_info(struct btrfs_block_group *cache, bool new) }for (i =0 ; i < map->num_stripes; i++) { - ret =btrfs_load_zone_info (fs_info, i, &zone_info[i], active, map); + ret =btrfs_load_zone_info (fs_info, i, &zone_info[i], active, map, new);if (ret) goto out;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 174/183 kernel: param: rename locate_module_kobject
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Saini <[email protected]>
[ Upstream commit bbc9462f0cb0c8917a4908e856731708f0cee910 ]
The locate_module_kobject() function looks up an existing module_kobject for a given module name. If it cannot find the corresponding module_kobject, it creates one for the given name.
This commit renames locate_module_kobject() to lookup_or_create_module_kobject() to better describe its operations.
This doesn't change anything functionality wise.
Stable-dep-of: f95bbfe18512 ("drivers: base: handle module_kobject creation")
--- kernel/params.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/params.c +3 -3
@@ -763,7 +763,7 @@ void destroy_params(const struct kernel_param *params, unsigned num) params[i].ops->free (params[i].arg); } -static struct module_kobject *__init locate_module_kobject (const char *name) +static struct module_kobject *__init lookup_or_create_module_kobject (const char *name) {struct module_kobject *mk;struct kobject *kobj;
@@ -805,7 +805,7 @@ static void __init kernel_add_sysfs_param(const char *name,struct module_kobject *mk;int err; - mk =locate_module_kobject (name); + mk =lookup_or_create_module_kobject (name);if (!mk)return ;
@@ -876,7 +876,7 @@ static void __init version_sysfs_builtin(void)int err;for (vattr = __start___modver; vattr < __stop___modver; vattr++) { - mk =locate_module_kobject (vattr->module_name); + mk =lookup_or_create_module_kobject (vattr->module_name);if (mk) { err =sysfs_create_file (&mk->kobj, &vattr->mattr.attr);WARN_ON_ONCE (err);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 175/183 kernel: globalize lookup_or_create_module_kobject()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Saini <[email protected]>
[ Upstream commit 7c76c813cfc42a7376378a0c4b7250db2eebab81 ]
lookup_or_create_module_kobject() is marked as static and __init, to make it global drop static keyword.
Since this function can be called from non-init code, use __modinit instead of __init, __modinit marker will make it __init if CONFIG_MODULES is not defined.
Stable-dep-of: f95bbfe18512 ("drivers: base: handle module_kobject creation")
--- include/linux/module.h | 2 ++ kernel/params.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
include/linux/module.h +2 -0
@@ -162,6 +162,8 @@ extern void cleanup_module(void);#define __INITRODATA_OR_MODULE __INITRODATA#endif /*CONFIG_MODULES*/ +struct module_kobject *lookup_or_create_module_kobject (const char *name); +/* Generic info of form tag = "info" */ #define MODULE_INFO (tag, info) __MODULE_INFO(tag, tag, info)
kernel/params.c +1 -1
@@ -763,7 +763,7 @@ void destroy_params(const struct kernel_param *params, unsigned num) params[i].ops->free (params[i].arg); } -static struct module_kobject *__init lookup_or_create_module_kobject (const char *name) +struct module_kobject __modinit * lookup_or_create_module_kobject(const char *name) {struct module_kobject *mk;struct kobject *kobj;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 176/183 drivers: base: handle module_kobject creation
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Saini <[email protected]>
[ Upstream commit f95bbfe18512c5c018720468959edac056a17196 ]
module_add_driver() relies on module_kset list for /sys/module/<built-in-module>/drivers directory creation.
Since,
commit 96a1a2412acba ("kernel/params.c: defer most of param_sysfs_init() to late_initcall time") drivers which are initialized from subsys_initcall() or any other
higher precedence initcall couldn't find the related kobject entry
in the module_kset list because module_kset is not fully populated
by the time module_add_driver() refers it. As a consequence,module_add_driver() returns early without calling make_driver_name().
Therefore, /sys/module/<built-in-module>/drivers is never created.
Fix this issue by letting module_add_driver() handle module_kobject creation itself.
--- drivers/base/module.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/base/module.c +5 -8
@@ -42,16 +42,13 @@ int module_add_driver(struct module *mod, const struct device_driver *drv)if (mod) mk = &mod->mkobj;else if (drv->mod_name) { -struct kobject *mkobj; - -/* Lookup built-in module entry in /sys/modules */ - mkobj =kset_find_obj (module_kset, drv->mod_name); -if (mkobj) { - mk = container_of(mkobj, struct module_kobject, kobj); +/* Lookup or create built-in module entry in /sys/modules */ + mk =lookup_or_create_module_kobject (drv->mod_name); +if (mk) {/* remember our module structure */ drv->p->mkobj = mk; -/* kset_find_obj took a reference */ -kobject_put (mkobj); +/* lookup_or_create_module_kobject took a reference */ +kobject_put (&mk->kobj); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 177/183 btrfs: expose per-inode stable writes flag
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qu Wenruo <[email protected]>
[ Upstream commit ecde48a1a6b3256bd49db8780bf37556b157783c ]
The address space flag AS_STABLE_WRITES determine if FGP_STABLE for will wait for the folio to finish its writeback.
For btrfs, due to the default data checksum behavior, if we modify the folio while it's still under writeback, it will cause data checksum mismatch. Thus for quite some call sites we manually call folio_wait_writeback() to prevent such problem from happening.
Currently there is only one call site inside btrfs really utilizing FGP_STABLE, and in that case we also manually call folio_wait_writeback() to do the waiting.
But it's better to properly expose the stable writes flag to a per-inode basis, to allow call sites to fully benefit from FGP_STABLE flag. E.g. for inodes with NODATASUM allowing beginning dirtying the page without waiting for writeback.
This involves:
- Update the mapping's stable write flag when setting/clearing NODATASUM inode flag using ioctl
This only works for empty files, so it should be fine.
- Update the mapping's stable write flag when reading an inode from disk
- Remove the explicit folio_wait_writeback() for FGP_BEGINWRITE call site
Stable-dep-of: 48c1d1bb525b ("btrfs: fix the inode leak in btrfs_iget()")
--- fs/btrfs/btrfs_inode.h | 8 ++++++++ fs/btrfs/file.c | 1 - fs/btrfs/inode.c | 2 ++ fs/btrfs/ioctl.c | 1 + 4 files changed, 11 insertions(+), 1 deletion(-)
fs/btrfs/btrfs_inode.h +8 -0
@@ -516,6 +516,14 @@ static inline void btrfs_assert_inode_locked(struct btrfs_inode *inode)lockdep_assert_held (&inode->vfs_inode.i_rwsem); } +static inline void btrfs_update_inode_mapping_flags (struct btrfs_inode *inode) +{ +if (inode->flags &BTRFS_INODE_NODATASUM ) +mapping_clear_stable_writes (inode->vfs_inode.i_mapping); +else +mapping_set_stable_writes (inode->vfs_inode.i_mapping); +} +/* Array of bytes with variable length, hexadecimal format 0x1234 */ #define CSUM_FMT "0x%*phN"#define CSUM_FMT_VALUE (size, bytes) size, bytes
fs/btrfs/file.c +0 -1
@@ -874,7 +874,6 @@ static noinline int prepare_one_folio(struct inode *inode, struct folio **folio_ ret =PTR_ERR (folio);return ret; } -folio_wait_writeback (folio);/* Only support page sized folio yet. */ ASSERT (folio_order (folio) ==0 ); ret =set_folio_extent_mapped (folio);
fs/btrfs/inode.c +2 -0
@@ -3925,6 +3925,7 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)btrfs_inode_split_flags (btrfs_inode_flags (leaf, inode_item), &BTRFS_I (inode)->flags, &BTRFS_I (inode)->ro_flags); +btrfs_update_inode_mapping_flags (BTRFS_I (inode)); cache_index:/*
@@ -6340,6 +6341,7 @@ int btrfs_create_new_inode(struct btrfs_trans_handle *trans,if (btrfs_test_opt (fs_info,NODATACOW ))BTRFS_I (inode)->flags |=BTRFS_INODE_NODATACOW |BTRFS_INODE_NODATASUM ; +btrfs_update_inode_mapping_flags (BTRFS_I (inode)); } ret =btrfs_insert_inode_locked (inode);
fs/btrfs/ioctl.c +1 -0
@@ -393,6 +393,7 @@ int btrfs_fileattr_set(struct mnt_idmap *idmap, update_flags: binode->flags = binode_flags; +btrfs_update_inode_mapping_flags (binode);btrfs_sync_inode_flags_to_i_flags (inode);inode_inc_iversion (inode);inode_set_ctime_current (inode);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 178/183 btrfs: pass struct btrfs_inode to btrfs_read_locked_inode()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Sterba <[email protected]>
[ Upstream commit d36f84a849c7685099594815a1e5a48db62c243d ]
Pass a struct btrfs_inode to btrfs_read_locked_inode() as it's an internal interface, allowing to remove some use of BTRFS_I.
Stable-dep-of: 48c1d1bb525b ("btrfs: fix the inode leak in btrfs_iget()")
--- fs/btrfs/inode.c | 119 +++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 61 deletions(-)
fs/btrfs/inode.c +58 -61
@@ -3846,12 +3846,13 @@ static int btrfs_add_inode_to_root(struct btrfs_inode *inode, bool prealloc)* * On failure clean up the inode. */ -static int btrfs_read_locked_inode (struct inode *inode,struct btrfs_path *path) +static int btrfs_read_locked_inode (struct btrfs_inode *inode,struct btrfs_path *path) { -struct btrfs_fs_info *fs_info =inode_to_fs_info (inode); +struct btrfs_root *root = inode->root; +struct btrfs_fs_info *fs_info = root->fs_info;struct extent_buffer *leaf;struct btrfs_inode_item *inode_item; -struct btrfs_root *root =BTRFS_I (inode)->root; +struct inode *vfs_inode = &inode->vfs_inode;struct btrfs_key location;unsigned long ptr;int maybe_acls;
@@ -3860,17 +3861,17 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)bool filled = false;int first_xattr_slot; - ret =btrfs_init_file_extent_tree (BTRFS_I (inode)); + ret =btrfs_init_file_extent_tree (inode);if (ret) goto out; - ret =btrfs_fill_inode (inode, &rdev); + ret =btrfs_fill_inode (vfs_inode, &rdev);if (!ret) filled = true;ASSERT (path); -btrfs_get_inode_key (BTRFS_I (inode), &location); +btrfs_get_inode_key (inode, &location); ret =btrfs_lookup_inode (NULL , root, path, &location,0 );if (ret) {
@@ -3890,42 +3891,41 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path) inode_item =btrfs_item_ptr (leaf, path->slots[0 ], struct btrfs_inode_item); - inode->i_mode =btrfs_inode_mode (leaf, inode_item); -set_nlink (inode,btrfs_inode_nlink (leaf, inode_item)); -i_uid_write (inode,btrfs_inode_uid (leaf, inode_item)); -i_gid_write (inode,btrfs_inode_gid (leaf, inode_item)); -btrfs_i_size_write (BTRFS_I (inode),btrfs_inode_size (leaf, inode_item)); -btrfs_inode_set_file_extent_range (BTRFS_I (inode),0 , -round_up (i_size_read (inode), fs_info->sectorsize)); - -inode_set_atime (inode,btrfs_timespec_sec (leaf, &inode_item->atime), + vfs_inode->i_mode =btrfs_inode_mode (leaf, inode_item); +set_nlink (vfs_inode,btrfs_inode_nlink (leaf, inode_item)); +i_uid_write (vfs_inode,btrfs_inode_uid (leaf, inode_item)); +i_gid_write (vfs_inode,btrfs_inode_gid (leaf, inode_item)); +btrfs_i_size_write (inode,btrfs_inode_size (leaf, inode_item)); +btrfs_inode_set_file_extent_range (inode,0 , +round_up (i_size_read (vfs_inode), fs_info->sectorsize)); + +inode_set_atime (vfs_inode,btrfs_timespec_sec (leaf, &inode_item->atime),btrfs_timespec_nsec (leaf, &inode_item->atime)); -inode_set_mtime (inode,btrfs_timespec_sec (leaf, &inode_item->mtime), +inode_set_mtime (vfs_inode,btrfs_timespec_sec (leaf, &inode_item->mtime),btrfs_timespec_nsec (leaf, &inode_item->mtime)); -inode_set_ctime (inode,btrfs_timespec_sec (leaf, &inode_item->ctime), +inode_set_ctime (vfs_inode,btrfs_timespec_sec (leaf, &inode_item->ctime),btrfs_timespec_nsec (leaf, &inode_item->ctime)); -BTRFS_I (inode)->i_otime_sec =btrfs_timespec_sec (leaf, &inode_item->otime); -BTRFS_I (inode)->i_otime_nsec =btrfs_timespec_nsec (leaf, &inode_item->otime); + inode->i_otime_sec =btrfs_timespec_sec (leaf, &inode_item->otime); + inode->i_otime_nsec =btrfs_timespec_nsec (leaf, &inode_item->otime); -inode_set_bytes (inode,btrfs_inode_nbytes (leaf, inode_item)); -BTRFS_I (inode)->generation =btrfs_inode_generation (leaf, inode_item); -BTRFS_I (inode)->last_trans =btrfs_inode_transid (leaf, inode_item); +inode_set_bytes (vfs_inode,btrfs_inode_nbytes (leaf, inode_item)); + inode->generation =btrfs_inode_generation (leaf, inode_item); + inode->last_trans =btrfs_inode_transid (leaf, inode_item); -inode_set_iversion_queried (inode, -btrfs_inode_sequence (leaf, inode_item)); - inode->i_generation =BTRFS_I (inode)->generation; - inode->i_rdev =0 ; +inode_set_iversion_queried (vfs_inode,btrfs_inode_sequence (leaf, inode_item)); + vfs_inode->i_generation = inode->generation; + vfs_inode->i_rdev =0 ; rdev =btrfs_inode_rdev (leaf, inode_item); -if (S_ISDIR (inode->i_mode)) -BTRFS_I (inode)->index_cnt = (u64)-1 ; +if (S_ISDIR (vfs_inode->i_mode)) + inode->index_cnt = (u64)-1 ;btrfs_inode_split_flags (btrfs_inode_flags (leaf, inode_item), - &BTRFS_I (inode)->flags, &BTRFS_I (inode)->ro_flags); -btrfs_update_inode_mapping_flags (BTRFS_I (inode)); + &inode->flags, &inode->ro_flags); +btrfs_update_inode_mapping_flags (inode); cache_index:/*
@@ -3937,9 +3937,8 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)* This is required for both inode re-read from disk and delayed inode * in the delayed_nodes xarray. */ -if (BTRFS_I (inode)->last_trans ==btrfs_get_fs_generation (fs_info)) -set_bit (BTRFS_INODE_NEEDS_FULL_SYNC , - &BTRFS_I (inode)->runtime_flags); +if (inode->last_trans ==btrfs_get_fs_generation (fs_info)) +set_bit (BTRFS_INODE_NEEDS_FULL_SYNC , &inode->runtime_flags);/* * We don't persist the id of the transaction where an unlink operation
@@ -3968,7 +3967,7 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)* transaction commits on fsync if our inode is a directory, or if our * inode is not a directory, logging its parent unnecessarily. */ -BTRFS_I (inode)->last_unlink_trans =BTRFS_I (inode)->last_trans; + inode->last_unlink_trans = inode->last_trans;/* * Same logic as for last_unlink_trans. We don't persist the generation
@@ -3976,15 +3975,15 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)* operation, so after eviction and reloading the inode we must be * pessimistic and assume the last transaction that modified the inode. */ -BTRFS_I (inode)->last_reflink_trans =BTRFS_I (inode)->last_trans; + inode->last_reflink_trans = inode->last_trans; path->slots[0 ]++; -if (inode->i_nlink !=1 || +if (vfs_inode->i_nlink !=1 || path->slots[0 ] >=btrfs_header_nritems (leaf)) goto cache_acl;btrfs_item_key_to_cpu (leaf, &location, path->slots[0 ]); -if (location.objectid !=btrfs_ino (BTRFS_I (inode))) +if (location.objectid !=btrfs_ino (inode)) goto cache_acl; ptr =btrfs_item_ptr_offset (leaf, path->slots[0 ]);
@@ -3992,13 +3991,12 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)struct btrfs_inode_ref *ref; ref = (struct btrfs_inode_ref *)ptr; -BTRFS_I (inode)->dir_index =btrfs_inode_ref_index (leaf, ref); + inode->dir_index =btrfs_inode_ref_index (leaf, ref); }else if (location.type ==BTRFS_INODE_EXTREF_KEY ) {struct btrfs_inode_extref *extref; extref = (struct btrfs_inode_extref *)ptr; -BTRFS_I (inode)->dir_index =btrfs_inode_extref_index (leaf, - extref); + inode->dir_index =btrfs_inode_extref_index (leaf, extref); } cache_acl:/*
@@ -4006,50 +4004,49 @@ static int btrfs_read_locked_inode(struct inode *inode, struct btrfs_path *path)* any xattrs or acls */ maybe_acls =acls_after_inode_item (leaf, path->slots[0 ], -btrfs_ino (BTRFS_I (inode)), &first_xattr_slot); +btrfs_ino (inode), &first_xattr_slot);if (first_xattr_slot !=-1 ) { path->slots[0 ] = first_xattr_slot; - ret =btrfs_load_inode_props (inode, path); + ret =btrfs_load_inode_props (vfs_inode, path);if (ret)btrfs_err (fs_info,"error loading props for ino %llu (root %llu): %d" , -btrfs_ino (BTRFS_I (inode)), -btrfs_root_id (root), ret); +btrfs_ino (inode),btrfs_root_id (root), ret); }if (!maybe_acls) -cache_no_acl (inode); +cache_no_acl (vfs_inode); -switch (inode->i_mode &S_IFMT ) { +switch (vfs_inode->i_mode &S_IFMT ) {case S_IFREG : - inode->i_mapping->a_ops = &btrfs_aops; - inode->i_fop = &btrfs_file_operations; - inode->i_op = &btrfs_file_inode_operations; + vfs_inode->i_mapping->a_ops = &btrfs_aops; + vfs_inode->i_fop = &btrfs_file_operations; + vfs_inode->i_op = &btrfs_file_inode_operations;break ;case S_IFDIR : - inode->i_fop = &btrfs_dir_file_operations; - inode->i_op = &btrfs_dir_inode_operations; + vfs_inode->i_fop = &btrfs_dir_file_operations; + vfs_inode->i_op = &btrfs_dir_inode_operations;break ;case S_IFLNK : - inode->i_op = &btrfs_symlink_inode_operations; -inode_nohighmem (inode); - inode->i_mapping->a_ops = &btrfs_aops; + vfs_inode->i_op = &btrfs_symlink_inode_operations; +inode_nohighmem (vfs_inode); + vfs_inode->i_mapping->a_ops = &btrfs_aops;break ;default : - inode->i_op = &btrfs_special_inode_operations; -init_special_inode (inode, inode->i_mode, rdev); + vfs_inode->i_op = &btrfs_special_inode_operations; +init_special_inode (vfs_inode, vfs_inode->i_mode, rdev);break ; } -btrfs_sync_inode_flags_to_i_flags (inode); +btrfs_sync_inode_flags_to_i_flags (vfs_inode); - ret =btrfs_add_inode_to_root (BTRFS_I (inode), true); + ret =btrfs_add_inode_to_root (inode, true);if (ret) goto out;return 0 ; out: -iget_failed (inode); +iget_failed (vfs_inode);return ret; }
@@ -5636,7 +5633,7 @@ struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,if (!(inode->i_state &I_NEW ))return inode; - ret =btrfs_read_locked_inode (inode, path); + ret =btrfs_read_locked_inode (BTRFS_I (inode), path);if (ret)return ERR_PTR (ret);
@@ -5664,7 +5661,7 @@ struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)if (!path)return ERR_PTR (-ENOMEM ); - ret =btrfs_read_locked_inode (inode, path); + ret =btrfs_read_locked_inode (BTRFS_I (inode), path);btrfs_free_path (path);if (ret)return ERR_PTR (ret);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 179/183 btrfs: pass struct btrfs_inode to btrfs_iget_locked()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Sterba <[email protected]>
[ Upstream commit 4ea2fb9c628b55929bbc380d8c18733d1d027f1d ]
Pass a struct btrfs_inode to btrfs_inode() as it's an internal interface, allowing to remove some use of BTRFS_I.
Stable-dep-of: 48c1d1bb525b ("btrfs: fix the inode leak in btrfs_iget()")
--- fs/btrfs/inode.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-)
fs/btrfs/inode.c +16 -14
@@ -5601,7 +5601,7 @@ static int btrfs_find_actor(struct inode *inode, void *opaque) args->root ==BTRFS_I (inode)->root; } -static struct inode *btrfs_iget_locked (u64 ino,struct btrfs_root *root) +static struct btrfs_inode *btrfs_iget_locked (u64 ino,struct btrfs_root *root) {struct inode *inode;struct btrfs_iget_args args;
@@ -5613,7 +5613,9 @@ static struct inode *btrfs_iget_locked(u64 ino, struct btrfs_root *root) inode =iget5_locked_rcu (root->fs_info->sb, hashval, btrfs_find_actor, btrfs_init_locked_inode, (void *)&args); -return inode; +if (!inode) +return NULL ; +return BTRFS_I (inode); }/*
@@ -5623,22 +5625,22 @@ static struct inode *btrfs_iget_locked(u64 ino, struct btrfs_root *root)struct inode *btrfs_iget_path (u64 ino,struct btrfs_root *root,struct btrfs_path *path) { -struct inode *inode; +struct btrfs_inode *inode;int ret; inode =btrfs_iget_locked (ino, root);if (!inode)return ERR_PTR (-ENOMEM ); -if (!(inode->i_state &I_NEW )) -return inode; +if (!(inode->vfs_inode.i_state &I_NEW )) +return &inode->vfs_inode; - ret =btrfs_read_locked_inode (BTRFS_I (inode), path); + ret =btrfs_read_locked_inode (inode, path);if (ret)return ERR_PTR (ret); -unlock_new_inode (inode); -return inode; +unlock_new_inode (&inode->vfs_inode); +return &inode->vfs_inode; }/*
@@ -5646,7 +5648,7 @@ struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,*/ struct inode *btrfs_iget (u64 ino,struct btrfs_root *root) { -struct inode *inode; +struct btrfs_inode *inode;struct btrfs_path *path;int ret;
@@ -5654,20 +5656,20 @@ struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)if (!inode)return ERR_PTR (-ENOMEM ); -if (!(inode->i_state &I_NEW )) -return inode; +if (!(inode->vfs_inode.i_state &I_NEW )) +return &inode->vfs_inode; path =btrfs_alloc_path ();if (!path)return ERR_PTR (-ENOMEM ); - ret =btrfs_read_locked_inode (BTRFS_I (inode), path); + ret =btrfs_read_locked_inode (inode, path);btrfs_free_path (path);if (ret)return ERR_PTR (ret); -unlock_new_inode (inode); -return inode; +unlock_new_inode (&inode->vfs_inode); +return &inode->vfs_inode; } static struct inode *new_simple_dir(struct inode *dir,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 180/183 btrfs: fix the inode leak in btrfs_iget()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Penglei Jiang <[email protected]>
[ Upstream commit 48c1d1bb525b1c44b8bdc8e7ec5629cb6c2b9fc4 ]
[BUG]
There is a bug report that a syzbot reproducer can lead to the following busy inode at unmount time:
BTRFS info (device loop1): last unmount of filesystem 1680000e-3c1e-4c46-84b6-56bd3909af50
VFS: Busy inodes after unmount of loop1 (btrfs)
------------[ cut here ]------------ kernel BUG at fs/super.c:650! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 0 UID: 0 PID: 48168 Comm: syz-executor Not tainted 6.15.0-rc2-00471-g119009db2674 #2 PREEMPT(full) Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:generic_shutdown_super+0x2e9/0x390 fs/super.c:650 Call Trace: <TASK> kill_anon_super+0x3a/0x60 fs/super.c:1237 btrfs_kill_super+0x3b/0x50 fs/btrfs/super.c:2099 deactivate_locked_super+0xbe/0x1a0 fs/super.c:473 deactivate_super fs/super.c:506 [inline] deactivate_super+0xe2/0x100 fs/super.c:502 cleanup_mnt+0x21f/0x440 fs/namespace.c:1435 task_work_run+0x14d/0x240 kernel/task_work.c:227 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline] exit_to_user_mode_loop kernel/entry/common.c:114 [inline] exit_to_user_mode_prepare include/linux/entry-common.h:329 [inline] __syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline] syscall_exit_to_user_mode+0x269/0x290 kernel/entry/common.c:218 do_syscall_64+0xd4/0x250 arch/x86/entry/syscall_64.c:100 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK>
[CAUSE]
When btrfs_alloc_path() failed, btrfs_iget() directly returned without releasing the inode already allocated by btrfs_iget_locked().
This results the above busy inode and trigger the kernel BUG.
[FIX]
Fix it by calling iget_failed() if btrfs_alloc_path() failed.
If we hit error inside btrfs_read_locked_inode(), it will properly call iget_failed(), so nothing to worry about.
Although the iget_failed() cleanup inside btrfs_read_locked_inode() is a break of the normal error handling scheme, let's fix the obvious bug and backport first, then rework the error handling later.
--- fs/btrfs/inode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/btrfs/inode.c +3 -1
@@ -5660,8 +5660,10 @@ struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)return &inode->vfs_inode; path =btrfs_alloc_path (); -if (!path) +if (!path) { +iget_failed (&inode->vfs_inode);return ERR_PTR (-ENOMEM ); + } ret =btrfs_read_locked_inode (inode, path);btrfs_free_path (path);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 181/183 drm/amd/display: Add scoped mutexes for amdgpu_dm_dhcp
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit 6b675ab8efbf2bcee25be29e865455c56e246401 ]
[Why]
Guards automatically release mutex when it goes out of scope making code easier to follow.
[How]
Replace all use of mutex_lock()/mutex_unlock() with guard(mutex).
Stable-dep-of: be593d9d91c5 ("drm/amd/display: Fix slab-use-after-free in hdcp")
--- .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 37 +++++-------------- 1 file changed, 10 insertions(+), 27 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +10 -27
@@ -172,7 +172,7 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,struct mod_hdcp_display_adjustment display_adjust;unsigned int conn_index = aconnector->base.index; -mutex_lock (&hdcp_w->mutex); +guard (mutex)(&hdcp_w->mutex); hdcp_w->aconnector[conn_index] = aconnector;memset (&link_adjust,0 ,sizeof (link_adjust));
@@ -209,7 +209,6 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,mod_hdcp_update_display (&hdcp_w->hdcp, conn_index, &link_adjust, &display_adjust, &hdcp_w->output);process_output (hdcp_w); -mutex_unlock (&hdcp_w->mutex); } static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,
@@ -220,7 +219,7 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,struct drm_connector_state *conn_state = aconnector->base.state;unsigned int conn_index = aconnector->base.index; -mutex_lock (&hdcp_w->mutex); +guard (mutex)(&hdcp_w->mutex); hdcp_w->aconnector[conn_index] = aconnector;/* the removal of display will invoke auth reset -> hdcp destroy and
@@ -239,7 +238,6 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,mod_hdcp_remove_display (&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output);process_output (hdcp_w); -mutex_unlock (&hdcp_w->mutex); }void hdcp_reset_display (struct hdcp_workqueue *hdcp_work,unsigned int link_index)
@@ -247,7 +245,7 @@ void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_indestruct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];unsigned int conn_index; -mutex_lock (&hdcp_w->mutex); +guard (mutex)(&hdcp_w->mutex);mod_hdcp_reset_connection (&hdcp_w->hdcp, &hdcp_w->output);
@@ -259,8 +257,6 @@ void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_inde }process_output (hdcp_w); - -mutex_unlock (&hdcp_w->mutex); }void hdcp_handle_cpirq (struct hdcp_workqueue *hdcp_work,unsigned int link_index)
@@ -277,7 +273,7 @@ static void event_callback(struct work_struct *work) hdcp_work = container_of(to_delayed_work(work), struct hdcp_workqueue, callback_dwork); -mutex_lock (&hdcp_work->mutex); +guard (mutex)(&hdcp_work->mutex);cancel_delayed_work (&hdcp_work->callback_dwork);
@@ -285,8 +281,6 @@ static void event_callback(struct work_struct *work) &hdcp_work->output);process_output (hdcp_work); - -mutex_unlock (&hdcp_work->mutex); }static void event_property_update (struct work_struct *work)
@@ -323,7 +317,7 @@ static void event_property_update(struct work_struct *work)continue ;drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); -mutex_lock (&hdcp_work->mutex); +guard (mutex)(&hdcp_work->mutex);if (conn_state->commit) { ret = wait_for_completion_interruptible_timeout(&conn_state->commit->hw_done,
@@ -355,7 +349,6 @@ static void event_property_update(struct work_struct *work)drm_hdcp_update_content_protection (connector,DRM_MODE_CONTENT_PROTECTION_DESIRED ); } -mutex_unlock (&hdcp_work->mutex);drm_modeset_unlock (&dev->mode_config.connection_mutex); } }
@@ -368,7 +361,7 @@ static void event_property_validate(struct work_struct *work)struct amdgpu_dm_connector *aconnector;unsigned int conn_index; -mutex_lock (&hdcp_work->mutex); +guard (mutex)(&hdcp_work->mutex);for (conn_index =0 ; conn_index <AMDGPU_DM_MAX_DISPLAY_INDEX ; conn_index++) {
@@ -408,8 +401,6 @@ static void event_property_validate(struct work_struct *work)schedule_work (&hdcp_work->property_update_work); } } - -mutex_unlock (&hdcp_work->mutex); }static void event_watchdog_timer (struct work_struct *work)
@@ -420,7 +411,7 @@ static void event_watchdog_timer(struct work_struct *work) struct hdcp_workqueue, watchdog_timer_dwork); -mutex_lock (&hdcp_work->mutex); +guard (mutex)(&hdcp_work->mutex);cancel_delayed_work (&hdcp_work->watchdog_timer_dwork);
@@ -429,8 +420,6 @@ static void event_watchdog_timer(struct work_struct *work) &hdcp_work->output);process_output (hdcp_work); - -mutex_unlock (&hdcp_work->mutex); }static void event_cpirq (struct work_struct *work)
@@ -439,13 +428,11 @@ static void event_cpirq(struct work_struct *work) hdcp_work = container_of(work, struct hdcp_workqueue, cpirq_work); -mutex_lock (&hdcp_work->mutex); +guard (mutex)(&hdcp_work->mutex);mod_hdcp_process_event (&hdcp_work->hdcp,MOD_HDCP_EVENT_CPIRQ , &hdcp_work->output);process_output (hdcp_work); - -mutex_unlock (&hdcp_work->mutex); }void hdcp_destroy (struct kobject *kobj,struct hdcp_workqueue *hdcp_work)
@@ -479,7 +466,7 @@ static bool enable_assr(void *handle, struct dc_link *link) dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf; -mutex_lock (&psp->dtm_context.mutex); +guard (mutex)(&psp->dtm_context.mutex);memset (dtm_cmd,0 ,sizeof (struct ta_dtm_shared_memory )); dtm_cmd->cmd_id =TA_DTM_COMMAND__TOPOLOGY_ASSR_ENABLE ;
@@ -494,8 +481,6 @@ static bool enable_assr(void *handle, struct dc_link *link) res = false; } -mutex_unlock (&psp->dtm_context.mutex); -return res; }
@@ -557,13 +542,11 @@ static void update_config(void *handle, struct cp_psp_stream_config *config) (!!aconnector->base.state) ? aconnector->base.state->hdcp_content_type : -1); -mutex_lock (&hdcp_w->mutex); +guard (mutex)(&hdcp_w->mutex);mod_hdcp_add_display (&hdcp_w->hdcp, link, display, &hdcp_w->output);process_output (hdcp_w); -mutex_unlock (&hdcp_w->mutex); - }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 182/183 drm/amd/display: Fix slab-use-after-free in hdcp
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Bainbridge <[email protected]>
[ Upstream commit be593d9d91c5a3a363d456b9aceb71029aeb3f1d ]
The HDCP code in amdgpu_dm_hdcp.c copies pointers to amdgpu_dm_connector objects without incrementing the kref reference counts. When using a USB-C dock, and the dock is unplugged, the corresponding amdgpu_dm_connector objects are freed, creating dangling pointers in the HDCP code. When the dock is plugged back, the dangling pointers are dereferenced, resulting in a slab-use-after-free:
[ 66.775837] BUG: KASAN: slab-use-after-free in event_property_validate+0x42f/0x6c0 [amdgpu] [ 66.776171] Read of size 4 at addr ffff888127804120 by task kworker/0:1/10
[ 66.776179] CPU: 0 UID: 0 PID: 10 Comm: kworker/0:1 Not tainted 6.14.0-rc7-00180-g54505f727a38-dirty #233 [ 66.776183] Hardware name: HP HP Pavilion Aero Laptop 13-be0xxx/8916, BIOS F.17 12/18/2024 [ 66.776186] Workqueue: events event_property_validate [amdgpu] [ 66.776494] Call Trace: [ 66.776496] <TASK> [ 66.776497] dump_stack_lvl+0x70/0xa0 [ 66.776504] print_report+0x175/0x555 [ 66.776507] ? __virt_addr_valid+0x243/0x450 [ 66.776510] ? kasan_complete_mode_report_info+0x66/0x1c0 [ 66.776515] kasan_report+0xeb/0x1c0 [ 66.776518] ? event_property_validate+0x42f/0x6c0 [amdgpu] [ 66.776819] ? event_property_validate+0x42f/0x6c0 [amdgpu] [ 66.777121] __asan_report_load4_noabort+0x14/0x20 [ 66.777124] event_property_validate+0x42f/0x6c0 [amdgpu] [ 66.777342] ? __lock_acquire+0x6b40/0x6b40 [ 66.777347] ? enable_assr+0x250/0x250 [amdgpu] [ 66.777571] process_one_work+0x86b/0x1510 [ 66.777575] ? pwq_dec_nr_in_flight+0xcf0/0xcf0 [ 66.777578] ? assign_work+0x16b/0x280 [ 66.777580] ? lock_is_held_type+0xa3/0x130 [ 66.777583] worker_thread+0x5c0/0xfa0 [ 66.777587] ? process_one_work+0x1510/0x1510 [ 66.777588] kthread+0x3a2/0x840 [ 66.777591] ? kthread_is_per_cpu+0xd0/0xd0 [ 66.777594] ? trace_hardirqs_on+0x4f/0x60 [ 66.777597] ? _raw_spin_unlock_irq+0x27/0x60 [ 66.777599] ? calculate_sigpending+0x77/0xa0 [ 66.777602] ? kthread_is_per_cpu+0xd0/0xd0 [ 66.777605] ret_from_fork+0x40/0x90 [ 66.777607] ? kthread_is_per_cpu+0xd0/0xd0 [ 66.777609] ret_from_fork_asm+0x11/0x20 [ 66.777614] </TASK>
[ 66.777643] Allocated by task 10: [ 66.777646] kasan_save_stack+0x39/0x60 [ 66.777649] kasan_save_track+0x14/0x40 [ 66.777652] kasan_save_alloc_info+0x37/0x50 [ 66.777655] __kasan_kmalloc+0xbb/0xc0 [ 66.777658] __kmalloc_cache_noprof+0x1c8/0x4b0 [ 66.777661] dm_dp_add_mst_connector+0xdd/0x5c0 [amdgpu] [ 66.777880] drm_dp_mst_port_add_connector+0x47e/0x770 [drm_display_helper] [ 66.777892] drm_dp_send_link_address+0x1554/0x2bf0 [drm_display_helper] [ 66.777901] drm_dp_check_and_send_link_address+0x187/0x1f0 [drm_display_helper] [ 66.777909] drm_dp_mst_link_probe_work+0x2b8/0x410 [drm_display_helper] [ 66.777917] process_one_work+0x86b/0x1510 [ 66.777919] worker_thread+0x5c0/0xfa0 [ 66.777922] kthread+0x3a2/0x840 [ 66.777925] ret_from_fork+0x40/0x90 [ 66.777927] ret_from_fork_asm+0x11/0x20
[ 66.777932] Freed by task 1713: [ 66.777935] kasan_save_stack+0x39/0x60 [ 66.777938] kasan_save_track+0x14/0x40 [ 66.777940] kasan_save_free_info+0x3b/0x60 [ 66.777944] __kasan_slab_free+0x52/0x70 [ 66.777946] kfree+0x13f/0x4b0 [ 66.777949] dm_dp_mst_connector_destroy+0xfa/0x150 [amdgpu] [ 66.778179] drm_connector_free+0x7d/0xb0 [ 66.778184] drm_mode_object_put.part.0+0xee/0x160 [ 66.778188] drm_mode_object_put+0x37/0x50 [ 66.778191] drm_atomic_state_default_clear+0x220/0xd60 [ 66.778194] __drm_atomic_state_free+0x16e/0x2a0 [ 66.778197] drm_mode_atomic_ioctl+0x15ed/0x2ba0 [ 66.778200] drm_ioctl_kernel+0x17a/0x310 [ 66.778203] drm_ioctl+0x584/0xd10 [ 66.778206] amdgpu_drm_ioctl+0xd2/0x1c0 [amdgpu] [ 66.778375] __x64_sys_ioctl+0x139/0x1a0 [ 66.778378] x64_sys_call+0xee7/0xfb0 [ 66.778381] do_syscall_64+0x87/0x140 [ 66.778385] entry_SYSCALL_64_after_hwframe+0x4b/0x53
Fix this by properly incrementing and decrementing the reference counts when making and deleting copies of the amdgpu_dm_connector pointers.
(Mario: rebase on current code and update fixes tag)
--- .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +16 -3
@@ -173,6 +173,9 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,unsigned int conn_index = aconnector->base.index;guard (mutex)(&hdcp_w->mutex); +drm_connector_get (&aconnector->base); +if (hdcp_w->aconnector[conn_index]) +drm_connector_put (&hdcp_w->aconnector[conn_index]->base); hdcp_w->aconnector[conn_index] = aconnector;memset (&link_adjust,0 ,sizeof (link_adjust));
@@ -220,7 +223,6 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,unsigned int conn_index = aconnector->base.index;guard (mutex)(&hdcp_w->mutex); - hdcp_w->aconnector[conn_index] = aconnector;/* the removal of display will invoke auth reset -> hdcp destroy and * we'd expect the Content Protection (CP) property changed back to
@@ -236,7 +238,10 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work, }mod_hdcp_remove_display (&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output); - +if (hdcp_w->aconnector[conn_index]) { +drm_connector_put (&hdcp_w->aconnector[conn_index]->base); + hdcp_w->aconnector[conn_index] =NULL ; + }process_output (hdcp_w); }
@@ -254,6 +259,10 @@ void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_indefor (conn_index =0 ; conn_index <AMDGPU_DM_MAX_DISPLAY_INDEX ; conn_index++) { hdcp_w->encryption_status[conn_index] =MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF ; +if (hdcp_w->aconnector[conn_index]) { +drm_connector_put (&hdcp_w->aconnector[conn_index]->base); + hdcp_w->aconnector[conn_index] =NULL ; + } }process_output (hdcp_w);
@@ -489,6 +498,7 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)struct hdcp_workqueue *hdcp_work = handle;struct amdgpu_dm_connector *aconnector = config->dm_stream_ctx;int link_index = aconnector->dc_link->link_index; +unsigned int conn_index = aconnector->base.index;struct mod_hdcp_display *display = &hdcp_work[link_index].display;struct mod_hdcp_link *link = &hdcp_work[link_index].link;struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
@@ -545,7 +555,10 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)guard (mutex)(&hdcp_w->mutex);mod_hdcp_add_display (&hdcp_w->hdcp, link, display, &hdcp_w->output); - +drm_connector_get (&aconnector->base); +if (hdcp_w->aconnector[conn_index]) +drm_connector_put (&hdcp_w->aconnector[conn_index]->base); + hdcp_w->aconnector[conn_index] = aconnector;process_output (hdcp_w); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 183/183 bcachefs: Change btree_insert_node() assertion to error
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kent Overstreet <[email protected]>
commit 63c3b8f616cc95bb1fcc6101c92485d41c535d7c upstream.
Debug for https://github.com/koverstreet/bcachefs/issues/843
Print useful debug info and go emergency read-only.
--- fs/bcachefs/btree_update_interior.c | 17 ++++++++++++++++- fs/bcachefs/error.c | 8 ++++++++ fs/bcachefs/error.h | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-)
fs/bcachefs/btree_update_interior.c +16 -1
@@ -35,6 +35,8 @@ static const char * const bch2_btree_upd NULL }; +static void bch2_btree_update_to_text (struct printbuf *,struct btree_update *); +static int bch2_btree_insert_node (struct btree_update *,struct btree_trans *,btree_path_idx_t ,struct btree *,struct keylist *);static void bch2_btree_update_add_new_node (struct btree_update *,struct btree *);
@@ -1782,11 +1784,24 @@ static int bch2_btree_insert_node(structint ret;lockdep_assert_held (&c->gc_lock); -BUG_ON (!btree_node_intent_locked (path, b->c.level));BUG_ON (!b->c.level);BUG_ON (!as || as->b);bch2_verify_keylist_sorted (keys); +if (!btree_node_intent_locked (path, b->c.level)) { +struct printbuf buf =PRINTBUF ; +bch2_log_msg_start (c, &buf); +prt_printf (&buf,"%s(): node not locked at level %u\n" , + __func__, b->c.level); +bch2_btree_update_to_text (&buf, as); +bch2_btree_path_to_text (&buf, trans, path_idx); + +bch2_print_string_as_lines (KERN_ERR , buf.buf); +printbuf_exit (&buf); +bch2_fs_emergency_read_only (c); +return -EIO ; + } + ret =bch2_btree_node_lock_write (trans, path, &b->c);if (ret)return ret;
fs/bcachefs/error.c +8 -0
@@ -11,6 +11,14 @@#define FSCK_ERR_RATELIMIT_NR 10 +void bch2_log_msg_start (struct bch_fs *c,struct printbuf *out) +{ +#ifdef BCACHEFS_LOG_PREFIX +prt_printf (out,bch2_log_msg (c,"" )); +#endif +printbuf_indent_add (out,2 ); +} +bool bch2_inconsistent_error (struct bch_fs *c) {set_bit (BCH_FS_error, &c->flags);
fs/bcachefs/error.h +2 -0
@@ -18,6 +18,8 @@ struct work_struct;/* Error messages: */ +void bch2_log_msg_start (struct bch_fs *,struct printbuf *); +/* * Inconsistency errors: The on disk data is inconsistent. If these occur during * initial recovery, they don't indicate a bug in the running code - we walk all
Hi Greg
no regressions here on x86_64 (RKL, Intel 11th Gen. CPU)
Thanks
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 6.14.6-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: a33747967783a6e6a8ab7c22905712408f5b8eef
* git describe: v6.14.5-184-ga33747967783
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.14.y/build/v6.14.5-184-ga33747967783
## Test Regressions (compared to v6.14.3-550-g25b40e24731f)
## Metric Regressions (compared to v6.14.3-550-g25b40e24731f)
## Test Fixes (compared to v6.14.3-550-g25b40e24731f)
## Metric Fixes (compared to v6.14.3-550-g25b40e24731f)
## Test result summary
total: 138622, pass: 114363, fail: 5571, skip: 18324, xfail: 364
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 139 total, 137 passed, 2 failed
* arm64: 56 total, 55 passed, 1 failed
* i386: 18 total, 16 passed, 2 failed
* mips: 34 total, 33 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 40 total, 40 passed, 0 failed
* riscv: 25 total, 22 passed, 3 failed
* s390: 22 total, 22 passed, 0 failed
* sh: 5 total, 5 passed, 0 failed
* sparc: 4 total, 3 passed, 1 failed
* x86_64: 49 total, 42 passed, 7 failed
## Test suites summary
* boot
* commands
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-exec
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-rust
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-x86
* kunit
* kvm-unit-tests
* lava
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-build-clang
* log-parser-build-gcc
* log-parser-test
* ltp-capability
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* perf
* rcutorture
* rt-tests-cyclicdeadline
* rt-tests-pi-stress
* rt-tests-pmqtest
* rt-tests-rt-migrate-test
* rt-tests-signaltest
--
Linaro LKFT
https://lkft.linaro.org
AMD Ryzen 5 5600 6-Core Processor:
https://www.inet.se/produkt/5304697/amd-ryzen-5-5600-3-5-ghz-35mb on a
https://www.gigabyte.com/Motherboard/B550-AORUS-ELITE-V2-rev-12
https://www.inet.se/produkt/1903406/gigabyte-b550-aorus-elite-v2
motherboard :)
running Arch Linux with the testing repos enabled:
https://archlinux.org/ https://archboot.com/
https://wiki.archlinux.org/title/Arch_Testing_Team
Den ons 7 maj 2025 kl 20:50 skrev Greg Kroah-Hartman <[email protected]>:
Quoted 777 lines
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:Greg Kroah-Hartman <[email protected]>
Linux 6.14.6-rc1Kent Overstreet <[email protected]>
bcachefs: Changebtree_insert_node()assertion to errorChris Bainbridge <[email protected]>
drm/amd/display: Fix slab-use-after-free in hdcpMario Limonciello <[email protected]>
drm/amd/display: Add scoped mutexes foramdgpu_dm_dhcpPenglei Jiang <[email protected]>
btrfs: fix the inode leak inbtrfs_iget()David Sterba <[email protected]>
btrfs: pass structbtrfs_inodetobtrfs_iget_locked()David Sterba <[email protected]>
btrfs: pass structbtrfs_inodetobtrfs_read_locked_inode()Qu Wenruo <[email protected]>
btrfs: expose per-inode stable writes flagShyam Saini <[email protected]>
drivers: base: handlemodule_kobjectcreationShyam Saini <[email protected]>
kernel: globalizelookup_or_create_module_kobject()Shyam Saini <[email protected]>
kernel: param: renamelocate_module_kobjectNaohiro Aota <[email protected]>
btrfs: zoned: skip reporting zone for new block groupNaohiro Aota <[email protected]>
block: introduce zone capacity helperChristian Bruel <[email protected]>
arm64: dts: st: Use 128kB size for aliased GIC400 register access on stm32mp25 SoCsChristian Bruel <[email protected]>
arm64: dts: st: Adjust interrupt-controller for stm32mp25 SoCsSébastien Szymanski <[email protected]>
ARM: dts: opos6ul: add ksz8081 phy propertiesRichard Zhu <[email protected]>
arm64: dts: imx95: Correct the range of PCIe app-reg regionSudeep Holla <[email protected]>
firmware:arm_ffa: Skip Rx buffer ownership release if not acquiredCristian Marussi <[email protected]>
firmware:arm_scmi: Balance device refcount when destroying devicesCong Wang <[email protected]>
sch_ets: makeest_qlen_notify()idempotentCong Wang <[email protected]>
sch_qfq: makeqfq_qlen_notify()idempotentCong Wang <[email protected]>
sch_hfsc: makehfsc_qlen_notify()idempotentCong Wang <[email protected]>
sch_drr: makedrr_qlen_notify()idempotentCong Wang <[email protected]>
sch_htb: makehtb_qlen_notify()idempotentMing Lei <[email protected]>
ublk: fix race betweenio_uring_cmd_complete_in_taskandublk_cancel_cmdMing Lei <[email protected]>
ublk: simplify aborting ublk requestMing Lei <[email protected]>
ublk: remove__ublk_quiesce_dev()Uday Shankar <[email protected]>
ublk: improve detection and handling of ublk server exitMing Lei <[email protected]>
ublk: move device reset intoublk_ch_release()Uday Shankar <[email protected]>
ublk: properly serialize allFETCH_REQsMing Lei <[email protected]>
ublk: add helper ofublk_need_map_io()Kurt Borja <[email protected]>
platform/x86: alienware-wmi-wmax: Add support for Alienware m15 R7Kenneth Graunke <[email protected]>
drm/xe: Invalidate L3 read-only cachelines for geometry streams tooKarol Wachowski <[email protected]>
accel/ivpu: Add handling ofVPU_JSM_STATUS_MVNCI_CONTEXT_VIOLATION_HWKarol Wachowski <[email protected]>
accel/ivpu: Fix locking order inivpu_job_submitKarol Wachowski <[email protected]>
accel/ivpu: Abort all jobs after command queue unregisterZhenhua Huang <[email protected]>
mm, slab: clean up slab->obj_exts alwaysStefan Wahren <[email protected]>
net: vertexcom: mse102x: Fix RX error handlingStefan Wahren <[email protected]>
net: vertexcom: mse102x: Add range check forCMD_RTSStefan Wahren <[email protected]>
net: vertexcom: mse102x: FixLEN_MASKStefan Wahren <[email protected]>
net: vertexcom: mse102x: Fix possible stuck of SPI interruptJian Shen <[email protected]>
net: hns3: defer callingptp_clock_register()Hao Lan <[email protected]>
net: hns3: fixed debugfstm_qsetsizeYonglong Liu <[email protected]>
net: hns3: fix an interrupt residual problemJian Shen <[email protected]>
net: hns3: store rx VLAN tag offload state for VFSathesh B Edara <[email protected]>
octeon_ep: Fix host hang issue during device rebootMattias Barthel <[email protected]>
net: fec: ERR007885 Workaround for conventional TXThangaraj Samynathan <[email protected]>
net: lan743x: Fix memleak issue when GSO enabledSagi Maimon <[email protected]>
ptp: ocp: Fix NULL dereference in Adva board SMA sysfs operationsJibin Zhang <[email protected]>
net: usesock_gen_put()whensk_stateisTCP_TIME_WAITVadim Fedorenko <[email protected]>
bnxt_en: fix module unload sequenceAlexander Stein <[email protected]>
ASoC: simple-card-utils: Fix pointer check ingraph_util_parse_link_directionOlivier Moysan <[email protected]>
ASoC: stm32: sai: add a check on minimal kernel frequencyOlivier Moysan <[email protected]>
ASoC: stm32: sai: skip useless iterations on kernel rate loopAlistair Francis <[email protected]>
nvmet-tcp: selectCONFIG_TLSfromCONFIG_NVME_TARGET_TCP_TLSAlistair Francis <[email protected]>
nvme-tcp: selectCONFIG_TLSfromCONFIG_NVME_TCP_TLSMichael Liang <[email protected]>
nvme-tcp: fix premature queue removal and I/O failoverMichael Chan <[email protected]>
bnxt_en: Fix ethtool -d byte order for 32-bit valuesShruti Parab <[email protected]>
bnxt_en: Fix out-of-boundmemcpy()during ethtool -wShruti Parab <[email protected]>
bnxt_en: Fix coredump logic to free allocated bufferKashyap Desai <[email protected]>
bnxt_en: callpci_alloc_irq_vectors()afterbnxt_reserve_rings()Somnath Kotur <[email protected]>
bnxt_en: Add missingskb_mark_for_recycle()inbnxt_rx_vlan()Kalesh AP <[email protected]>
bnxt_en: Fix ethtool selftest output in one of the failure casesShravya KN <[email protected]>
bnxt_en: Fix error handling path inbnxt_init_chip()Takashi Iwai <[email protected]>
ALSA: hda/realtek: Fix built-mic regression on other ASUS modelsFelix Fietkau <[email protected]>
net: ipv6: fix UDPv6 GSO segmentation with NATVladimir Oltean <[email protected]>
net: dsa: felix: fix broken taprio gate states after clock jumpChad Monroe <[email protected]>
net: ethernet:mtk_eth_soc: fix SER panic with 4GB+ RAMJacob Keller <[email protected]>
igc: fix lock order inigc_ptp_resetLarysa Zaremba <[email protected]>
idpf: protect shutdown from resetMichal Swiatkowski <[email protected]>
idpf: fix potential memory leak onkcalloc()failureDa Xue <[email protected]>
net: mdio: mux-meson-gxl: set reversed bit when using internal phySimon Horman <[email protected]>
net: dlink: Correct endianness handling ofled_modeRussell Cloran <[email protected]>
drm/mipi-dbi: Fix blanking for non-16 bit formatsMaxime Ripard <[email protected]>
drm/tests: shmem: Fix memleakKeith Busch <[email protected]>
nvme-pci: fix queue unquiesce check onslot_resetTakashi Iwai <[email protected]>
ALSA: ump: Fix buffer overflow at UMP SysEx message conversionMaulik Shah <[email protected]>
pinctrl: qcom: Fix PINGROUP definition for sm8750John Harrison <[email protected]>
drm/xe/guc: Fix capture of steering registersKeoseong Park <[email protected]>
scsi: ufs: core: Remove redundantquery_completetraceMadhu Chittim <[email protected]>
idpf: fix offloads support for encapsulated packetsXuanqiang Luo <[email protected]>
ice: Check VF VSI Pointer Value inice_vc_add_fdir_fltr()Paul Greenwalt <[email protected]>
ice: fix Get Tx Topology AQ command error on E830Karol Kolacinski <[email protected]>
ice: Remove unnecessaryice_is_e8xx()functionsKarol Kolacinski <[email protected]>
ice: Don't check device type when checking GNSS presenceVictor Nogueira <[email protected]>
net_sched: qfq: Fix double list add in class with netem as child qdiscVictor Nogueira <[email protected]>
net_sched: ets: Fix double list add in class with netem as child qdiscVictor Nogueira <[email protected]>
net_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdiscVictor Nogueira <[email protected]>
net_sched: drr: Fix double list add in class with netem as child qdiscShannon Nelson <[email protected]>
pds_core: remove write-after-free ofclient_idShannon Nelson <[email protected]>
pds_core: specifyauxiliary_deviceto be createdShannon Nelson <[email protected]>
pds_core: makepdsc_auxbus_dev_del()voidDaniel Golle <[email protected]>
net: ethernet:mtk_eth_soc: syncmtk_clks_source_namearrayLouis-Alexis Eyraud <[email protected]>
net: ethernet: mtk-star-emac: rearm interrupts inrx_pollonly when advisedLouis-Alexis Eyraud <[email protected]>
net: ethernet: mtk-star-emac: fix spinlock recursion issues on rx/tx pollJustin Lai <[email protected]>
rtase: Modify the condition used to detect overflow inrtase_calc_time_mitigationVadim Fedorenko <[email protected]>
bnxt_en: improve TX timestamping FIFO configurationSathesh B Edara <[email protected]>
octeon_ep_vf: Resolve netdevice usage count issueVladimir Oltean <[email protected]>
net: mscc: ocelot: delete PVID VLAN when readding it as non-PVIDPauli Virtanen <[email protected]>
Bluetooth: L2CAP: copy RX timestamp to new fragmentsKiran K <[email protected]>
Bluetooth:btintel_pcie: Add additional to checks to clear TX/RX pathsEn-Wei Wu <[email protected]>
Bluetooth: btusb: avoid NULL pointer dereference inskb_dequeue()Kiran K <[email protected]>
Bluetooth:btintel_pcie: Avoid redundant buffer allocationLuiz Augusto von Dentz <[email protected]>
Bluetooth:hci_conn: Fix not setting timeout for BIG Create SyncLuiz Augusto von Dentz <[email protected]>
Bluetooth:hci_conn: Fix not settingconn_timeoutfor Broadcast ReceiverViresh Kumar <[email protected]>
cpufreq: ACPI: Re-sync CPU boost state on system resumeViresh Kumar <[email protected]>
cpufreq: acpi: Set policy->boost_supportedViresh Kumar <[email protected]>
cpufreq: Introduce policy->boost_supported flagVenkata Prasad Potturu <[email protected]>
ASoC: amd: acp: Fix NULL pointer deref inacp_i2s_set_tdm_slotRaju Rangoju <[email protected]>
spi: spi-mem: Add fix to avoid divide errorKarol Wachowski <[email protected]>
accel/ivpu: Correct DCT interrupt handlingChris Mi <[email protected]>
net/mlx5: E-switch, Fix error handling for enabling roceCosmin Ratiu <[email protected]>
net/mlx5e: Fix lock order inmlx5e_tx_reporter_ptpsq_unhealthy_recoverJianbo Liu <[email protected]>
net/mlx5e: TC, Continue the attr process even if encap entry is invalidMaor Gottlieb <[email protected]>
net/mlx5: E-Switch, Initialize MAC Address for Default GIDVlad Dogaru <[email protected]>
net/mlx5e: Use custom tunnel header for vxlan gbpe.kubanski <[email protected]>
xsk: Fix offset calculation in unaligned modee.kubanski <[email protected]>
xsk: Fix race condition inAF_XDPgeneric RX pathIdo Schimmel <[email protected]>
vxlan: vnifilter: Fix unlocked deletion of default FDB entryMadhavan Srinivasan <[email protected]>
powerpc/boot: Fix dash warningMurad Masimov <[email protected]>
wifi: plfxlc: Remove erroneous assert inplfxlc_mac_releaseEmmanuel Grumbach <[email protected]>
wifi: iwlwifi: fix the check for the SCRATCH register upon resumeEmmanuel Grumbach <[email protected]>
wifi: iwlwifi: don't warn if the NIC is gone in resumeJohannes Berg <[email protected]>
wifi: iwlwifi: back off on continuous errorsChen Linxuan <[email protected]>
drm/i915/pxp: fix undefined reference to `intel_pxp_gsccs_is_ready_for_sessions'Kailang Yang <[email protected]>
ALSA: hda/realtek - Enable speaker for HP platformAneesh Kumar K.V (Arm) <[email protected]>
iommu/arm-smmu-v3: Add missing S2FWB feature detectionChenyuan Yang <[email protected]>
ASoC: Intel:sof_sdw: Add NULL check inasoc_sdw_rt_dmic_rtd_init()Madhavan Srinivasan <[email protected]>
powerpc/boot: Check for ld-option supportHui Wang <[email protected]>
pinctrl: imx: Return NULL if no group is matched and foundAnthony Iliopoulos <[email protected]>
powerpc64/ftrace: fix module loading without patchable function entriesDonet Tom <[email protected]>
book3s64/radix : Align section vmemmap start address toPAGE_SIZESheetal <[email protected]>
ASoC: soc-pcm: Fixhw_params()and DAPM widget sequenceNico Pache <[email protected]>
firmware:cs_dsp: tests: Depend onFW_CS_DSPrather then enabling itRichard Fitzgerald <[email protected]>
ASoC: cs-amp-lib-test: Don't selectSND_SOC_CS_AMP_LIBGeert Uytterhoeven <[email protected]>
ASoC: soc-core: Stop usingof_property_read_bool()for non-boolean propertiesLeo Li <[email protected]>
drm/amd/display: Default IPS toRCG_IN_ACTIVE_IPS2_IN_OFFAlan Huang <[email protected]>
bcachefs: Remove incorrect__counted_byannotationJeongjun Park <[email protected]>
tracing: Fix oob write intrace_seq_to_buffer()Rafael J. Wysocki <[email protected]>
cpufreq: Fix setting policy limits when frequency tables are usedRafael J. Wysocki <[email protected]>
cpufreq: Avoid using inconsistent policy->min and policy->maxJethro Donaldson <[email protected]>
smb: client: fix zero length for mkdir POSIX create contextSean Heelan <[email protected]>
ksmbd: fix use-after-free in session logoffSean Heelan <[email protected]>
ksmbd: fix use-after-free in kerberos authenticationNamjae Jeon <[email protected]>
ksmbd: fix use-after-free inksmbd_session_rpc_openShouye Liu <[email protected]>
platform/x86/intel-uncore-freq: Fix missing uncore sysfs during CPU hotplugMario Limonciello <[email protected]>
platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cyclesNicolin Chen <[email protected]>
iommu: Fix two issues iniommu_copy_struct_from_user()Mingcong Bai <[email protected]>
iommu/vt-d: Apply quirk_iommu_igfx for 8086:0044 (QM57/QS57)Balbir Singh <[email protected]>
iommu/arm-smmu-v3: Fixpgsize_bitfor sva domainsNicolin Chen <[email protected]>
iommu/arm-smmu-v3: Fixiommu_device_probebug due to duplicated stream idsPavel Paklov <[email protected]>
iommu/amd: Fix potential buffer overflow inparse_ivrs_acpihidJanne Grunau <[email protected]>
drm: SelectDRM_KMS_HELPERfromDRM_DEBUG_DP_MST_TOPOLOGY_REFSLijo Lazar <[email protected]>
drm/amdgpu: Fix offset for HDP remap in nbio v7.11Benjamin Marzinski <[email protected]>
dm: always update the array size inrealloc_argvon successMikulas Patocka <[email protected]>
dm-integrity: fix a warning on invalid table lineLongPing Wei <[email protected]>
dm-bufio: don't schedule in atomic contextArd Biesheuvel <[email protected]>
x86/boot/sev: Support memory acceptance in the EFI stub under SVSMWentao Liang <[email protected]>
wifi: brcm80211: fmac: Add error handling forbrcmf_usb_dl_writeimage()Steven Rostedt <[email protected]>
tracing: Do not taketrace_event_seminprint_event_fields()Aaron Kling <[email protected]>
spi: tegra114: Don't failset_cs_timingwhen delays are zeroRuslan Piasetskyi <[email protected]>
mmc:renesas_sdhi: Fix error handling inrenesas_sdhi_probeWei Yang <[email protected]>
mm/memblock: repeat setting reserved region nid if array is doubledWei Yang <[email protected]>
mm/memblock: pass size instead of end tomemblock_set_node()Stephan Gerhold <[email protected]>
irqchip/qcom-mpm: Prevent crash when trying to handle non-wake GPIOsVishal Badole <[email protected]>
amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offloadSean Christopherson <[email protected]>
perf/x86/intel: KVM: MaskPEBS_ENABLEloaded for guest with vCPU's value.Kan Liang <[email protected]>
perf/x86/intel: Only check the group flag for X86 leaderChristian Marangi <[email protected]>
pinctrl: airoha: fix wrong PHY LED mapping and PHY2 LED definesHelge Deller <[email protected]>
parisc: Fix double SIGFPE crashWill Deacon <[email protected]>
arm64: errata: Add missing sentinels to Spectre-BHB MIDR arraysClark Wang <[email protected]>
i2c: imx-lpi2c: Fix clock count when probe defersNiravkumar L Rabara <[email protected]>
EDAC/altera: Set DDR and SDMMC interrupt mask before registrationNiravkumar L Rabara <[email protected]>
EDAC/altera: Test the correct error reg offsetPhilipp Stanner <[email protected]>
drm/nouveau: FixWARN_ONinnouveau_fence_context_kill()Tvrtko Ursulin <[email protected]>
drm/fdinfo: Protect against driver unbindSrinivas Pandruvada <[email protected]>
cpufreq:intel_pstate: Unchecked MSR aceess in legacy modeDave Chen <[email protected]>
btrfs: fix COW handling inrun_delalloc_nocow()Josef Bacik <[email protected]>
btrfs: adjust subpage bit start based on sectorsizeClaudiu Beznea <[email protected]>
ASoC: renesas: rz-ssi: UseNOIRQ_SYSTEM_SLEEP_PM_OPS()Joachim Priesner <[email protected]>
ALSA: usb-audio: Add second USB ID for Jabra Evolve 65 headsetGeoffrey D. Bennett <[email protected]>
ALSA: usb-audio: Add retry on-EPROTOfromusb_set_interface()Chris Chiu <[email protected]>
ALSA: hda/realtek - Add more HP laptops which need mute led fixupChristian Heusel <[email protected]>
Revert "rndis_host: Flag RNDIS modems as WWAN devices"-------------
Diffstat:
Makefile | 4 +- .../boot/dts/nxp/imx/imx6ul-imx6ull-opos6ul.dtsi | 3 + arch/arm64/boot/dts/freescale/imx95.dtsi | 8 +- arch/arm64/boot/dts/st/stm32mp251.dtsi | 9 +- arch/arm64/kernel/proton-pack.c | 2 + arch/parisc/math-emu/driver.c | 16 +- arch/powerpc/boot/wrapper | 6 +- arch/powerpc/kernel/module_64.c | 4 - arch/powerpc/mm/book3s64/radix_pgtable.c | 17 +- arch/x86/boot/compressed/mem.c | 5 +- arch/x86/boot/compressed/sev.c | 40 ++ arch/x86/boot/compressed/sev.h | 2 + arch/x86/events/core.c | 2 +- arch/x86/events/intel/core.c | 2 +- arch/x86/events/perf_event.h | 9 +- drivers/accel/ivpu/ivpu_drv.c | 32 +- drivers/accel/ivpu/ivpu_drv.h | 2 + drivers/accel/ivpu/ivpu_hw_btrs.h | 2 +- drivers/accel/ivpu/ivpu_job.c | 111 ++++- drivers/accel/ivpu/ivpu_job.h | 1 + drivers/accel/ivpu/ivpu_mmu.c | 3 +- drivers/accel/ivpu/ivpu_pm.c | 18 +- drivers/accel/ivpu/ivpu_sysfs.c | 5 +- drivers/base/module.c | 13 +- drivers/block/ublk_drv.c | 552 +++++++++++---------- drivers/bluetooth/btintel_pcie.c | 57 ++- drivers/bluetooth/btusb.c | 101 ++-- drivers/cpufreq/acpi-cpufreq.c | 14 + drivers/cpufreq/cpufreq.c | 42 +- drivers/cpufreq/cpufreq_ondemand.c | 3 +- drivers/cpufreq/freq_table.c | 10 +- drivers/cpufreq/intel_pstate.c | 3 + drivers/edac/altera_edac.c | 9 +- drivers/edac/altera_edac.h | 2 + drivers/firmware/arm_ffa/driver.c | 3 +- drivers/firmware/arm_scmi/bus.c | 3 + drivers/firmware/cirrus/Kconfig | 5 +- drivers/gpu/drm/Kconfig | 2 +- drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c | 2 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 - .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 56 +-- drivers/gpu/drm/drm_file.c | 6 + drivers/gpu/drm/drm_mipi_dbi.c | 6 +- drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h | 8 +- drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +- drivers/gpu/drm/tests/drm_gem_shmem_test.c | 3 + drivers/gpu/drm/xe/instructions/xe_gpu_commands.h | 1 + drivers/gpu/drm/xe/xe_guc_capture.c | 2 +- drivers/gpu/drm/xe/xe_ring_ops.c | 13 +- drivers/i2c/busses/i2c-imx-lpi2c.c | 4 +- drivers/iommu/amd/init.c | 8 + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 6 + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 21 +- drivers/iommu/intel/iommu.c | 4 +- drivers/irqchip/irq-qcom-mpm.c | 3 + drivers/md/dm-bufio.c | 9 +- drivers/md/dm-integrity.c | 2 +- drivers/md/dm-table.c | 5 +- drivers/mmc/host/renesas_sdhi_core.c | 10 +- drivers/net/dsa/ocelot/felix_vsc9959.c | 5 +- drivers/net/ethernet/amd/pds_core/auxbus.c | 39 +- drivers/net/ethernet/amd/pds_core/core.h | 7 +- drivers/net/ethernet/amd/pds_core/devlink.c | 7 +- drivers/net/ethernet/amd/pds_core/main.c | 11 +- drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 9 +- drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 24 +- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 11 +- drivers/net/ethernet/amd/xgbe/xgbe.h | 4 + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 +- drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c | 30 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 38 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 29 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 1 + drivers/net/ethernet/dlink/dl2k.c | 2 +- drivers/net/ethernet/dlink/dl2k.h | 2 +- drivers/net/ethernet/freescale/fec_main.c | 7 +- drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 2 +- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 82 ++- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 13 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 25 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 1 + drivers/net/ethernet/intel/ice/ice.h | 5 - drivers/net/ethernet/intel/ice/ice_common.c | 208 ++++---- drivers/net/ethernet/intel/ice/ice_common.h | 7 +- drivers/net/ethernet/intel/ice/ice_ddp.c | 10 +- drivers/net/ethernet/intel/ice/ice_gnss.c | 31 +- drivers/net/ethernet/intel/ice/ice_gnss.h | 4 +- drivers/net/ethernet/intel/ice/ice_lib.c | 2 +- drivers/net/ethernet/intel/ice/ice_ptp.c | 137 ++--- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 235 +++------ drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 11 +- drivers/net/ethernet/intel/ice/ice_type.h | 9 - drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c | 5 + drivers/net/ethernet/intel/idpf/idpf.h | 18 +- drivers/net/ethernet/intel/idpf/idpf_lib.c | 76 ++- drivers/net/ethernet/intel/idpf/idpf_main.c | 1 + drivers/net/ethernet/intel/igc/igc_ptp.c | 6 +- .../net/ethernet/marvell/octeon_ep/octep_main.c | 2 +- .../ethernet/marvell/octeon_ep_vf/octep_vf_main.c | 4 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 18 +- drivers/net/ethernet/mediatek/mtk_star_emac.c | 13 +- .../ethernet/mellanox/mlx5/core/en/reporter_tx.c | 6 +- .../ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c | 32 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 5 +- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 5 +- drivers/net/ethernet/mellanox/mlx5/core/rdma.c | 11 +- drivers/net/ethernet/mellanox/mlx5/core/rdma.h | 4 +- drivers/net/ethernet/microchip/lan743x_main.c | 8 +- drivers/net/ethernet/microchip/lan743x_main.h | 1 + drivers/net/ethernet/mscc/ocelot.c | 6 + drivers/net/ethernet/realtek/rtase/rtase_main.c | 4 +- drivers/net/ethernet/vertexcom/mse102x.c | 36 +- drivers/net/mdio/mdio-mux-meson-gxl.c | 3 +- drivers/net/usb/rndis_host.c | 16 +- drivers/net/vxlan/vxlan_vnifilter.c | 8 +- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 6 +- drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 1 + drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 28 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 +- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 24 +- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 9 +- drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 16 +- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 2 +- drivers/net/wireless/purelifi/plfxlc/mac.c | 1 - drivers/nvme/host/Kconfig | 1 + drivers/nvme/host/pci.c | 2 +- drivers/nvme/host/tcp.c | 31 +- drivers/nvme/target/Kconfig | 1 + drivers/pinctrl/freescale/pinctrl-imx.c | 6 +- drivers/pinctrl/mediatek/pinctrl-airoha.c | 159 +++--- drivers/pinctrl/qcom/pinctrl-sm8750.c | 4 +- drivers/platform/x86/amd/pmc/pmc.c | 7 +- drivers/platform/x86/dell/alienware-wmi.c | 9 + .../x86/intel/uncore-frequency/uncore-frequency.c | 13 +- drivers/ptp/ptp_ocp.c | 52 +- drivers/spi/spi-mem.c | 6 +- drivers/spi/spi-tegra114.c | 6 +- drivers/ufs/core/ufshcd.c | 2 - fs/bcachefs/btree_update_interior.c | 17 +- fs/bcachefs/error.c | 8 + fs/bcachefs/error.h | 2 + fs/bcachefs/xattr_format.h | 8 +- fs/btrfs/btrfs_inode.h | 8 + fs/btrfs/extent_io.c | 2 +- fs/btrfs/file.c | 1 - fs/btrfs/inode.c | 152 +++--- fs/btrfs/ioctl.c | 1 + fs/btrfs/zoned.c | 18 +- fs/smb/client/smb2pdu.c | 1 + fs/smb/server/auth.c | 14 +- fs/smb/server/mgmt/user_session.c | 20 +- fs/smb/server/mgmt/user_session.h | 1 + fs/smb/server/smb2pdu.c | 9 - include/linux/blkdev.h | 67 ++- include/linux/cpufreq.h | 86 ++-- include/linux/iommu.h | 8 +- include/linux/module.h | 2 + include/net/bluetooth/hci.h | 4 +- include/net/bluetooth/hci_core.h | 20 +- include/net/bluetooth/hci_sync.h | 3 + include/net/xdp_sock.h | 3 - include/net/xsk_buff_pool.h | 4 +- include/sound/ump_convert.h | 2 +- kernel/params.c | 6 +- kernel/trace/trace.c | 5 +- kernel/trace/trace_output.c | 4 +- mm/memblock.c | 12 +- mm/slub.c | 27 +- net/bluetooth/hci_conn.c | 181 +------ net/bluetooth/hci_event.c | 15 +- net/bluetooth/hci_sync.c | 150 +++++- net/bluetooth/iso.c | 26 +- net/bluetooth/l2cap_core.c | 3 + net/ipv4/tcp_offload.c | 2 +- net/ipv4/udp_offload.c | 61 ++- net/ipv6/tcpv6_offload.c | 2 +- net/sched/sch_drr.c | 16 +- net/sched/sch_ets.c | 17 +- net/sched/sch_hfsc.c | 10 +- net/sched/sch_htb.c | 2 + net/sched/sch_qfq.c | 18 +- net/xdp/xsk.c | 6 +- net/xdp/xsk_buff_pool.c | 1 + sound/pci/hda/patch_realtek.c | 23 +- sound/soc/amd/acp/acp-i2s.c | 2 +- sound/soc/codecs/Kconfig | 5 +- sound/soc/generic/simple-card-utils.c | 4 +- sound/soc/renesas/rz-ssi.c | 2 +- sound/soc/sdw_utils/soc_sdw_rt_dmic.c | 2 + sound/soc/soc-core.c | 32 +- sound/soc/soc-pcm.c | 5 +- sound/soc/stm/stm32_sai_sub.c | 16 +- sound/usb/endpoint.c | 7 + sound/usb/format.c | 3 +- 194 files changed, 2373 insertions(+), 1773 deletions(-)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.14:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.14.6-rc1-ga33747967783
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra186-p3509-0000+p3636-0001, tegra194-p2972-0000,
tegra194-p3509-0000+p3668-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
6.14.6-rc1 tested.
Build successfully completed.
Boot successfully completed.
No dmesg regressions.
Video output normal.
Sound output normal.
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
[ 0.000000] Linux version 6.14.6-rc1rv-ga33747967783
(takeshi@ThinkPadX1Gen10J0764) (gcc (GCC) 15.1.1 20250425, GNU ld (GNU Binutils) 2.44.0) #1 SMP PREEMPT_DYNAMIC Thu May 8 20:39:36 JST 2025
Thanks
Quoted 8 lines · On Wed, 07 May 2025 20:37:25 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
Boot-tested under QEMU for Rust x86_64, arm64 and riscv64; built-tested for loongarch64:
Thanks!
Cheers,
Miguel
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Am 07.05.2025 um 20:37 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Builds, boots and works on my 2-socket Ivy Bridge Xeon E5-2697 v2 server. No dmesg oddities or regressions found.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.14.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.14.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.14.6 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 May 2025 18:37:41 +0000. Anything received after that time might be too late.
Tested on a ThinkPad E14 Gen 3 with a AMD Ryzen 5 5500U CPU and on the Steam Deck (LCD variant) aswell as a Framework Desktop.