This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7-Q1:wave5:H.265 编码器:对 RTP 流进行编码时未引用的内核分页请求

Guru**** 2826855 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1624256/am62a7-q1-wave5-h-265-encoder-unreferenced-kernel-paging-request-while-encoding-an-rtp-stream

器件型号: AM62A7-Q1

您好、

我当前运行的是内核 6.12.35。 标签 11.01.04 上的 wave5 代码。 我看到以下内核错误、导致系统挂起。

[  609.727744] Unable to handle kernel paging request at virtual address dead000000000108
[  609.735693] Mem abort info:
[  609.738490]   ESR = 0x0000000096000044
[  609.742241]   EC = 0x25: DABT (current EL), IL = 32 bits
[  609.747553]   SET = 0, FnV = 0
[  609.750608]   EA = 0, S1PTW = 0
[  609.753744]   FSC = 0x04: level 0 translation fault
[  609.758611] Data abort info:
[  609.761484]   ISV = 0, ISS = 0x00000044, ISS2 = 0x00000000
[  609.766958]   CM = 0, WnR = 1, TnD = 0, TagAccess = 0
[  609.771998]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[  609.777298] [dead000000000108] address between user and kernel address ranges
[  609.784419] Internal error: Oops: 0000000096000044 [#1] PREEMPT SMP
[  609.790675] Modules linked in: rpmsg_ctrl rpmsg_char tpm_tis_spi inv_icm42600_spi tpm_tis_core panel_semtech_gs2962 inv_icm42600 inv_sensors_timestamp kfifo_buf
 snd_soc_simple_card crct10dif_ce snd_soc_simple_card_utils snd_soc_adau7002 e5010_jpeg_enc v4l2_jpeg rtc_ti_k3 k3_j72xx_bandgap ti_k3_dsp_remoteproc ti_k3_r5_remo
teproc ti_k3_common j721e_csi2rx wave5 snd_soc_davinci_mcasp cdns_csi2rx snd_soc_ti_udma videobuf2_dma_contig mcrc64 v4l2_mem2mem sa2ul videobuf2_v4l2 ar0823 snd_s
oc_ti_edma v4l2_fwnode videobuf2_memops omap_hwspinlock v4l2_async videobuf2_common snd_soc_ti_sdma videodev mc omap_mailbox at24 ina238 tps65219_pwrbutton spi_oma
p2_mcspi cfg80211 rfkill fuse ipv6
[  609.850492] CPU: 1 UID: 0 PID: 25 Comm: kworker/1:0 Not tainted 6.12.35-g16f5a07f-01131-g2a4b06c4e29a #1
[  609.859958] Hardware name: Benchmark Electronics 4K Camera Proto B (DT)
[  609.866558] Workqueue: events v4l2_m2m_device_run_work [v4l2_mem2mem]
[  609.873013] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[  609.879961] pc : v4l2_m2m_buf_remove_by_idx+0x84/0xe8 [v4l2_mem2mem]
[  609.886313] lr : v4l2_m2m_buf_remove_by_idx+0x28/0xe8 [v4l2_mem2mem]
[  609.892663] sp : ffff800081a4bbd0
[  609.895968] x29: ffff800081a4bbd0 x28: 0000000000000000 x27: 000000000007f800
[  609.903096] x26: 00000000aefd2800 x25: 0000000000000780 x24: ffff0000014efdc8
[  609.910224] x23: ffff0000014efc28 x22: ffff0000014efc00 x21: ffff0000014eff60
[  609.917351] x20: ffff0000014efdc8 x19: ffff000001daf800 x18: 0000000000000000
[  609.924478] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000002
[  609.931605] x14: 0000000000000800 x13: 00000000000001e6 x12: 0000000000000000
[  609.938732] x11: 0000000000000000 x10: 00000000000009d0 x9 : ffff800081a4bcc0
[  609.945859] x8 : ffff800081a4bc88 x7 : 0000000000000000 x6 : ffff0000014eff50
[  609.952986] x5 : dead000000000100 x4 : dead000000000100 x3 : dead000000000122
[  609.960113] x2 : 0000000000000100 x1 : 0000000000000000 x0 : ffff000001dafc00
[  609.967242] Call trace:
[  609.969678]  v4l2_m2m_buf_remove_by_idx+0x84/0xe8 [v4l2_mem2mem]
[  609.975685]  start_encode+0x28c/0x554 [wave5]
[  609.980063]  wave5_vpu_enc_device_run+0x10c/0x230 [wave5]
[  609.985466]  v4l2_m2m_try_run+0x84/0x140 [v4l2_mem2mem]
[  609.990692]  v4l2_m2m_device_run_work+0x14/0x20 [v4l2_mem2mem]
[  609.996522]  process_one_work+0x148/0x28c
[  610.000532]  worker_thread+0x2d0/0x3d8
[  610.004277]  kthread+0x110/0x114
[  610.007500]  ret_from_fork+0x10/0x20
[  610.011074] Code: 91100060 aa0303f3 d2802002 f9424863 (f9000483)
[  610.017154] ---[ end trace 0000000000000000 ]---
[  610.021760] note: kworker/1:0[25] exited with irqs disabled
[  610.027441] note: kworker/1:0[25] exited with preempt_count 1
[  612.029229] ti-sci 44043000.system-controller: Mbox timedout in resp(caller: ti_sci_cmd_get_device_exclusive+0x18/0x24)
[  612.040102] ti-sci 44043000.system-controller: Mbox send fail -110

有什么想法如何解决此问题?

此致、

Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bas:  

    您能给我们提供一种在 EVM 上重现问题的方法吗? 此外、该软件包是否具有您正在测试的更新 GStreamer 版本 (1.24.13)?

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Suren、

    是的。 其中运行了更新后的 gstreamer 1.24.13、以及修改后的 VPAC/TIDL 固件。 我目前无法在 EVM 上重现问题、只是在我们的定制硬件上进行了更长时间的测试。 我将看看是否可以找到在 EVM 上重现问题的方法、但不确定何时会有足够的时间执行此操作。

    我们以每秒 30 帧的速度对两个数据流进行编码、一个 4K 流和一个 1920x1088 流。 相机指向天花板,所以没有什么发生在那里。

    SDK 更新完成后、我将尝试在 EVM 上重现一些时间。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bas。

    我将等待您输入重新生成问题、同时还查看下面的提交、看看它是否已经是您正在验证的 SDK 的一部分、或者是否需要拉入您的设置中。

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/drivers/media/platform/chips-media/wave5?h=ti-linux-6.12.y&id=462e6c68194dc4696ebc3f73754013641903c642

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/drivers/media/platform/chips-media/wave5?h=ti-linux-6.12.y&id=40d7adcd233be37e8db917a9898144d5fe50930f

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它们还不是我的 SDK 的一部分、但我集成了 wave5 的所有补丁。 问题仍然存在。

    我将了解明天能否在 EVM 上找到一种重现问题的方法。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bas:  

    直到您弄清楚要重现几个问题。

    所以您只需让它运行两个编码 — 一个   4K 流和一个 1920x1088 流、每秒 30 帧、假设它们流式传输到网络和长时间运行的测试? 您是否尝试在后台进行任何其他压力测试或执行下电上电测试以重现此问题?

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该应用程序分为两个流:一个 4K 流和一个 1920x1088 流、它们通过多个多标量来缩减规模。 我们还在两个管道中运行两个自定义插件(一个直接在 dmabuffer 上工作的自定义文本覆盖、一个使用媒体签名框架对 h26x 输出流进行签名的自定义插件)。 在这些主管道旁边,我们还有一个运行移动单元的分支,以及一个在必要时可以运行 tidlinferer 的分支(已配置)。 一切都在运行、尽可能使用 dmabuf-import(包括 v4l2h265encs)

    整个流水线以 30fps 的速率运行、除非推理处于活动状态、否则我们会下降到 27-28fps。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren Porwar 、

    我想我知道会发生什么、只是不知道为什么会发生。 是否有机会与具有 Wave5 驱动器详细知识的工程师讨论此问题?

    在函数 start_encode 中的 drivers/media/platform/chips-media/wave5/wav5-VPU-enc.c 中、一旦 wave5_VPU_enc_start_one_frame 返回成功、我们就会在其中的 src_buf 上调用 v4l2_m2M_src_buf_remove_by_idx ()。 这将通过 M2M rdy_queue 查找有问题的缓冲区、然后使用 list_del 将其从 rdy_queue 中删除。 当尝试从 rdy_queue 中删除条目时出现问题、因为当我们删除它时、list_head 的下一个成员已经为空(或至少中毒)。

    rdy_queue 受 spinlock 保护、采用 irqsave、因此我不明白为什么有时会发生这种变化。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bas:

    我的同事 Brandon 共享了一个补丁、供您通过电子邮件进行验证。 请验证并更新结果、如果它有效并解决了问题、那么我们可能需要上游修补程序。

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Suren、

    该补丁当前正在测试中。 以前的崩溃发生在大约 2-3 小时,所以我应该能够给出一个指示,在一天的结束我的时间。 之后、我会让设置一直运行到周末。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bas。  

    请告诉我们周末跑步的进展情况。  

    此致

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brandon 的最新补丁修复了我们发现的比赛条件。 我运行修补程序的稍微修改(较早)的版本已有 3 天、没有出现任何问题。

    From 66dbdc5b5d2dd37a405bdd9111a780ece399550c Mon Sep 17 00:00:00 2001
    From: Brandon Brnich <b-brnich@ti.com>
    Date: Wed, 11 Mar 2026 12:05:18 -0500
    Subject: [PATCH] media: chips-media: wave5: Move src_buf Removal to
     finish_encode
    
    During encoder processing, there is a case where the IRQ response could
    return the buffer back to userspace via v4l2_m2m_buf_done call. In this
    time, userspace could queue up this same buffer before start_encode removes
    the index from the ready queue. This would then lead to a case where the
    buffer in the ready queue could be a self loop due to the
    WRITE_ONCE(prev->next, new) call in __list_add.
    
    When __list_del is finally called, the loop is already made so nothing
    points back to ready queue list head and pointers are poisoned.
    
    A buffer should not be marked as DONE before the buffer is removed from
    m2m ready queue. Move removal entirely to finish_encode.
    
    Signed-off-by: Brandon Brnich <b-brnich@ti.com>
    ---
    
    This bug is very hard to reproduce in simple encode environments. It
    primarily occurs during long run cases where CPU is strained doing other
    forms of computation. Crash log shared below.
    
    I see other drivers removing buffer in their device_run process, but
    they do it before any chance of DONE state transition. Wave5 should do
    the same.
    
    [ 609.879961] pc : v4l2_m2m_buf_remove_by_idx+0x84/0xe8 [v4l2_mem2mem]
    [ 609.886313] lr : v4l2_m2m_buf_remove_by_idx+0x28/0xe8 [v4l2_mem2mem]
    [ 609.892663] sp : ffff800081a4bbd0
    [ 609.895968] x29: ffff800081a4bbd0 x28: 0000000000000000 x27: 000000000007f800
    [ 609.903096] x26: 00000000aefd2800 x25: 0000000000000780 x24: ffff0000014efdc8
    [ 609.910224] x23: ffff0000014efc28 x22: ffff0000014efc00 x21: ffff0000014eff60
    [ 609.917351] x20: ffff0000014efdc8 x19: ffff000001daf800 x18: 0000000000000000
    [ 609.924478] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000002
    [ 609.931605] x14: 0000000000000800 x13: 00000000000001e6 x12: 0000000000000000
    [ 609.938732] x11: 0000000000000000 x10: 00000000000009d0 x9 : ffff800081a4bcc0
    [ 609.945859] x8 : ffff800081a4bc88 x7 : 0000000000000000 x6 : ffff0000014eff50
    [ 609.952986] x5 : dead000000000100 x4 : dead000000000100 x3 : dead000000000122
    [ 609.960113] x2 : 0000000000000100 x1 : 0000000000000000 x0 : ffff000001dafc00
    [ 609.967242] Call trace:
    [ 609.969678] v4l2_m2m_buf_remove_by_idx+0x84/0xe8 [v4l2_mem2mem]
    [ 609.975685] start_encode+0x28c/0x554 [wave5]
    [ 609.980063] wave5_vpu_enc_device_run+0x10c/0x230 [wave5]
    [ 609.985466] v4l2_m2m_try_run+0x84/0x140 [v4l2_mem2mem]
    [ 609.990692] v4l2_m2m_device_run_work+0x14/0x20 [v4l2_mem2mem]
    [ 609.996522] process_one_work+0x148/0x28c
    [ 610.000532] worker_thread+0x2d0/0x3d8
    [ 610.004277] kthread+0x110/0x114
    [ 610.007500] ret_from_fork+0x10/0x20
    
     .../chips-media/wave5/wave5-vpu-enc.c         | 32 +++----------------
     1 file changed, 5 insertions(+), 27 deletions(-)
    
    diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
    index 7613fcdbafed..3e198a7cefb1 100644
    --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
    +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
    @@ -223,17 +223,9 @@ static int start_encode(struct vpu_instance *inst, u32 *fail_res)
     		dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
     		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
     		v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
    -	} else {
    +	} else
     		dev_dbg(inst->dev->dev, "%s: wave5_vpu_enc_start_one_frame success\n",
     			__func__);
    -		/*
    -		 * Remove the source buffer from the ready-queue now and finish
    -		 * it in the videobuf2 framework once the index is returned by the
    -		 * firmware in finish_encode
    -		 */
    -		if (src_buf)
    -			v4l2_m2m_src_buf_remove_by_idx(m2m_ctx, src_buf->vb2_buf.index);
    -	}
     
     	return 0;
     }
    @@ -259,27 +251,13 @@ static void wave5_vpu_enc_finish_encode(struct vpu_instance *inst)
     		__func__,  enc_output_info.pic_type, enc_output_info.recon_frame_index,
     		enc_output_info.enc_src_idx, enc_output_info.enc_pic_byte, enc_output_info.pts);
     
    -	/*
    -	 * The source buffer will not be found in the ready-queue as it has been
    -	 * dropped after sending of the encode firmware command, locate it in
    -	 * the videobuf2 queue directly
    -	 */
     	if (enc_output_info.enc_src_idx >= 0) {
    -		struct vb2_buffer *vb = vb2_get_buffer(v4l2_m2m_get_src_vq(m2m_ctx),
    -						       enc_output_info.enc_src_idx);
    -		if (vb->state != VB2_BUF_STATE_ACTIVE)
    -			dev_warn(inst->dev->dev,
    -				 "%s: encoded buffer (%d) was not in ready queue %i.",
    -				 __func__, enc_output_info.enc_src_idx, vb->state);
    -		else
    -			src_buf = to_vb2_v4l2_buffer(vb);
    -
    -		if (src_buf) {
    +		src_buf = v4l2_m2m_src_buf_remove(m2m_ctx);
    +		if (!src_buf)
    +			dev_warn(inst->dev->dev, "%s: no source buffer found\n", __func__);
    +		else {
     			inst->timestamp = src_buf->vb2_buf.timestamp;
     			v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
    -		} else {
    -			dev_warn(inst->dev->dev, "%s: no source buffer with index: %d found\n",
    -				 __func__, enc_output_info.enc_src_idx);
     		}
     	}
     
    -- 
    2.43.0
    
    

    使用此修补程序、我的问题已得到解决。 感谢 Brandon 和 Suren Porwar 的支持 !

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bas:

    因为修补程序解决了问题。 我现在要关闭该主题。 请随时打开较新的主题以获取任何进一步帮助。

    此致

    Suren