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.

[参考译文] Linux/TMS320DM8148:重 UDP 负载上的内核严重错误

Guru**** 2541610 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/603236/linux-tms320dm8148-kernel-panic-on-heavy-udp-load

器件型号:TMS320DM8148

工具/软件:Linux

我使用 DVR_RDK 4.1接收未压缩的视频数据。   网络堆栈大小设置如下:

  • sysctl -w net.core.rmem_max=33554432
  • sysctl -w net.core.wmem_max=33554432
  • sysctl -w net.core.rmem_default=33554432
  • sysctl -w net.core.wmem_default=33554432
  • sysctl -w net.ipv4.udp_mem='4096 87380 33554432'
  • sysctl -w net.ipv1.route.flush=1

每个数据包为 1300字节(UDP)、每个数据流的传输速率为 每秒12800个数据包。   它可用于2个流、但 如果添加第三个流、则会导致页面分配失败。  如何解决此问题?

vidapp:页面分配失败。 顺序:0、模式:0x4020
回溯:
[ ](dump_backtrace+0x0/0x110)从[ ](dump_stack+0x18/0x1c)
 R6:c04b5ee0 R5:00000000 R4:00004020 R3:60000193
[ ](dump_stack+0x0/0x1c)从[ ](__alloc_pages_nodemASK+0x4fc/0x560)
[ ](__alloc_pages_nodemASK+0x0/0x560)从[ ](new_slab+0x7c/0x200)
[ ](new_slab+0x0/0x200)从[ ](__slab_alloc.clone.66+0x114/0x1e0)
 r8:c02cde60 r7:00000020 r6:00000000 r5:c4802400 r4:00000000
r3:003ffff
[ ](__slab_alloc.clone.66+0x0/0x1e0)、来自[ ](_kmalloc_track_caller_0x84/0xc8)
 r8:c02cde60 r7:00000000 r6:a0000113 r5:00000020 r4:c4802400
r3:c05f2060
[ ](_kmalloc_track_caller_0x0/0xc8)、来自[ ](_alloc_skb+0x58/0xe8)
 r8:c02cde60 r7:00000020 r6:000006c0 r5:c4802100 r4:c3e96180
r3:c05f2018
[ ](__alloc_skb+0x0/0xe8)来自[ ](__netdev_alloc_skb+0x24/0x4c)
[ ](__netdev_alloc_skb+0x0/0x4c)来自[ ](cpsw_rx_handler + 0xc0/0x13c)
 R4:c4916000 r3:00000003
[ ](cpsw_rx_handler + 0x0/0x13c)、来自[ ](_cpdma_chan_free+0x88/0x8c)
 R7:00020000 R6:c3977f40 R5:c3978380 R4:60000113
[ ](_cpdma_chan_free+0x0/0x8c)从[ ](_cpdma_chan_process+0xFC/0x110)
[ ](_cpdma_chan_process+0x0/0x110)从[ ](cpdma_chan_process+0x30/0x54)
 R7:00000000 R6:00000040 R5:00000001 R4:c3978380
[ ](cpdma_chan_process+0x0/0x54)从[ ](cpsw_poll+0x34/0xa0)
 r6:00000040 r5:c4916370 r4:c4916360 r3:c0274044
[ ](cpsw_poll+0x0/0xa0)从[ ](net_rx_action+0x6c/0x15c)
 r8:00000040 r7:0000010e R6:00000001 r5:c04b5f40 r4:c4916370
r3:c0274044
[ ](net_rx_action+0x0/0x15c)从[ ](__do_softirq+0x84/0x114)
[ ](__do_softirq+0x0/0x114)从[ ](IRQ_EXIT+0x48/0x98)
[ ](IRQ_EXIT+0x0/0x98)、来自[ ](ASM_DE_IRQ+0x7c/0x9C)
[ ](ASM_DE_IRQ+0x0/0x9C)从[ ](_IRQ_USR+0x3c/0xa0)
异常堆栈(0xc1fe9fb0至0xc1fe9ff8)
9fa0:                                    00000001 00000514 00000514 00000001
9fc0:50ec84d8 50ec8490 4013f550 00000152 003d0f00 4014b3d8 00000000 50ec7e24
9fe0:50ec7e0c 50ec78e8 00010cf0 000106a0 60000010 ffff
 r5:fa200000 r4:ffffff
MEM 信息:
每个 CPU 的正常值:
CPU   0:Hi:  18、btch:  3 USD:  3
Active_anon:1083 inactive_anon:22 isoled_anon:0
 active_file:344 inactive_file:680 isoled_file:32
 unevicable:0脏:0写回:0不稳定:0
 免费:104 slab_reimclable:343 slab_unreimclable:5107
 已映射:477 shmem:50个可页面:111个回弹:0
正常可用:416KB 最小值:1112KB 低电平:1388KB 高电平:1668KB ACTIVE_ANON:4332KB INACTIVE_ANON:88KB ACTIVE_FILE:1376kB INACTIVE_FILE:2720KB UNEVICODE:0KB STRELABLED (ANON):0KB INSTRAME (FILE):128KB LOWATD:77824KB RAB_RELABLED:0KB RADE_RELLEVATD:032KB INCLKb:0KB INCLKKB_RELABLEM:0KB INCLINCLKLEMRELK:0KB INCLINCLINCLINK_RELABLEM:0KB:0KB INCLINCLINCLINCLINKKB_CLIND:0KB:0KB RAME:0KB 否
lowmem_reserve[]:0 0 0
正常:52*4KB 12*8KB 1*16KB 1*32KB 1*64KB 0*128KB 0*256KB 0*512KB 0*1024KB 0*2048KB 0*4096KB =416KB
1092页级总页数
32768页 RAM
224个免费页面
14558保留页
2344层块页面
1777页已共享
0页交换缓存
slub:无法在节点-1上分配内存(GFP=0x20)
 高速缓存:kmalloc-2048、对象大小:2048、缓冲区大小:2048、默认顺序:2、最小顺序:0
 节点0:厚层:1028、objs:8134、free: 0

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

    似乎这是已知的、但在 cpsw 驱动程序中、但我找不到补丁。  下面是布线的其余部分:

    ------ [在此处剪切]-----
    警告:在 drivers/net/cpsw.c:725 cpsw_rx_handler + 0x134/0x140 ()
    链接的模块:VPSS OSA_kernmod syslink
    回溯:
    [ ](dump_backtrace+0x0/0x110)从[ ](dump_stack+0x18/0x1c)
     R7:00000000 R6:c02817b0 R5:c044bb99 R4:000002d5
    [ ](dump_stack+0x0/0x1c)从[ ](WARN_RASPEK_COMMON + 0x54/0x6c)
    [ ](warn_slESpath_common+0x0/0x6c)、来自[ ](WARN_RASPEK_NULL_0x24/0x2C)
     R9:0000000a R8:0000053e r7:00000000 R6:00000000 R5:c42a4600
    r4:c4916000
    [ ](warn_slESpath_null+0x0/0x2C)、来自[ ](cpsw_rx_handler + 0x134/0x140)
    [ ](cpsw_rx_handler + 0x0/0x140)、来自[ ](_cpdma_chan_free+0x88/0x8c)
     R8:00020000 r7:c42a4600 R6:c3996380 R5:c3995f40 R4:60000113
    [ ](_cpdma_chan_free+0x0/0x8c)从[ ](_cpdma_chan_process+0x10c/0x124)
    [ ](_cpdma_chan_process+0x0/0x124)从[ ](cpdma_chan_process+0x30/0x50)
    [ ](cpdma_chan_process+0x0/0x50)从[ ](cpsw_poll+0x34/0xa0)
     R7:00000001 R6:00000040 R5:c4916360 R4:00000000
    [ ](cpsw_poll+0x0/0xa0)从[ ](Net_Rx_ACTION +0x58/0x154)
     R9:0000000a R8:0000012a r7:00000001 R6:00000002 R5:00000040
    R4:c4916370
    [ ](net_rx_action+0x0/0x154)从[ ](__do_softirq+0x80/0x108)
    [ ](__do_softirq+0x0/0x108)从[ ](IRQ_EXIT+0x48/0x94)
    [ ](IRQ_EXIT+0x0/0x94)、来自[ ](ASM_DE_IRQ+0x80/0xa0)
    [ ](ASM_DE_IRQ+0x0/0xa0)从[ ](_IRQ_USR+0x3c/0xa0)
    异常堆栈(0xc1c7ffb0至0xc1c7fff8)
    ffa0:                                    505ba8f8 001be604 0000022c 00000140
    ffc0:505bb4d8 505bb490 40178550 00000152 003d0f00 401843d8 00000000 505ba8ac
    ffe0:505babc0 505ba888 000121ac 00009ee8 20000010 ffff
     r5:fa200000 r4:ffffff
    --[结束线迹524c8480b22df6e7 ]-->

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

    确保您的代码库中包含以下 git 树中所有 EtherNet/Cpsw 相关的补丁:

    arago-project.org/.../

    另请参阅以下 wiki 页面:

    processors.wiki.ti.com/.../TI81XX_PSP_04.04.00.02_Feature_Performance_Guide
    processors.wiki.ti.com/.../TI81XX_UDP_Performance_Improvement

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    内核为2.6.37、并且已经具有 git 树中的修补程序。

    我已经尝试启用中断起搏并增加网络大小队列和套接字缓冲队列、但仍然遇到相同的故障。

    我还没有尝试将 DMA 描述符从内部 BD RAM 移动到 DDR 位置。 如何操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Farrah、

    您可以探索最新的 CPSW 驱动程序、并检查是否可以在代码库中反向移植它:

    TI-PROCESSOR-SDK-LINUX-AM335x-EVM-03.03.00.04/board-support/linux-4.4.4.41/drivers/net/ti/cpsw.c

    有关如何将 DMA 描述符传输到外部 DDR3存储器、请查看 DM814x TRM。

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

    [引用用户="Farrah Rashid "]

    每个数据包为 1300字节(UDP)、每个数据流的传输速率为 每秒12800个数据包。   它可用于2个流、但 如果添加第三个流、则会导致页面分配失败。  如何解决此问题?

    vidapp:页面分配失败。 顺序:0、模式:0x4020

    [/报价]

    这也可能是内存不足问题、而不是性能问题。 您可以尝试解决这一问题、通过引导 args 为 Linux 内核提供更多内存。 有关更多信息、请参阅以下指针:

    linux-dm81xx/mm/page_alloc.c
    linux-dm81xx/Documentation/fault-in注入/fault-injection.txt

    此致、
    帕维尔

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

    processors.wiki.ti.com/.../TI81XX_PSP_04.04.00.02_Feature_Performance_Guide
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试通过将 mem=128M 增大到 mem=256M 来增大内存、但它导致系统无法正常启动。 我怀疑这是一个低内存问题、但如果 Linux 内核无法为它们分配空间、它会丢弃 UDP 数据包??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Farrah、

    如果接收缓冲区已满、UDP 数据包将丢失。 但在您的情况下、您无法分配内存(用于接收缓冲区或与第三个 UDP 流相关的其他内容)。 对于 UDP 数据包丢弃、您应该成功分配接收缓冲区、然后该缓冲区的填满速度对于处理程序来说太快。

    您可能会分配过多的空间(第一个和第二个流具有非常大的缓冲区)、因此没有剩余空间用于第三个流。 您是否在第1和/或第2个数据流中有任何数据包丢弃? 是否可以尝试减少第1个和第2个流使用的内存?

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

    您好、Pavel、

    视频应用的设计基于 DM8148开发套件随附的设计、即新数据包被分配存储器并汇编到一个帧中、然后复制到 预分配给 显示的存储器缓冲区中。  我尝试更改应用程序、以便 套接字仅侦听 UDP 端口、但不处理任何数据( 应用程序未  分配 UDP 或显示缓冲区)、但我仍然会得到内核转储。

    法拉