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/TDA2:无法从带有 O_Direct 标志的 OSA_memAllocSR ()缓冲器写入 SSD

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/729926/linux-tda2-cannot-write-to-ssd-from-osa_memallocsr-buffers-with-o_direct-flag

器件型号:TDA2

工具/软件:Linux

大家好、我使用的是 Processor SDK 3.03、这是为具有 TDA2 芯片的定制电路板而构建的。

我们已用例从 SD 卡上的文件中填充 NullSrc 链接中的4个输入缓冲区、并将它们转发到我们用于将这些缓冲区写入 SSD 的链接。 我们已成功地使用 write() API 写入在没有 O_direct 标志的情况下打开的4个文件。 但是、CPU 负载非常高、这会导致帧丢失、我们认为由于文件系统高速缓存过多、我们怀疑正在后台进行缓存。

我们接下来尝试打开带有 O_Direct 标志的文件、但没有写入文件、"dstat"显示没有磁盘活动。 我们仔细研究了它,发现 write()根本没有完成,返回-1。 errno 错误是"错误地址"。 我们知道 O_Direct 的使用需要正确的缓冲区对齐,但我们确保它们以多种方式对齐(将地址打印到控制台以及在此处使用 nifty 技术 :http://www.titov.net/2006/01/02/using-o_largefile-or-o_direct-on-linux ),但没有结果,它会继续返回-1。

我偶然发现了这篇文章: https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/242361#pi320098=3。 它与内核无法看到的 CMEM 池中分配的 SR 缓冲器或类似的缓冲器有关。 是否有任何方法可以将 CMEM 池与内核可以看到的存储器重叠? 或者是否完全有其他东西?

提前感谢您。

此致、

Nick

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

    写入是否在没有 O_Direct 的情况下进行?

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

    是的、我在原始帖子中提到过它。

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

    您能否尝试以下更改并告知我它是否正常工作。

    1.在 VSDK 中更新 apps/build/tda2px/mem_segure_define_linux.xs 中的以下条目
    SR1_buff ECC_ASIL_SIZE = 1*MB;
    SR1_buff ECC QM_SIZE = 1*MB;
    SR1_buff 非 ecc_ASIL_size = 1*MB;


    2.在 VSDK 中将以下行添加到 links_FW/src/HLS/OSA/src/OSA_mem.c
    "#define OSA_BEBUG_MEM"

    3.当您使用 o_direct 写入文件时,请打印要写入的缓冲区的物理地址和虚拟地址。

    完成所有这些更改后、请执行全新构建并发送日志。

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

    Shravan、您好!

    不幸的是,它不起作用。 请在附件中查找日志。

    缓冲区地址为:

    [主机][主机] 261.854328 s:缓冲区0虚拟地址= 0xa1fb3000
    [主机][主机] 261.854328 s:缓冲区0物理地址= 0x84500000
    [host][host ] 261.857561 s:缓冲区1虚拟地址= 0xa21ae000
    [主机][主机] 261.857561 s:缓冲器1物理地址= 0x846fb000
    [主机][主机] 261.860855 s:缓冲区2虚拟地址= 0xa23a9000
    [主机][主机] 261.860855 s:缓冲区2物理地址= 0x848f6000
    [主机][主机] 261.864149 s:缓冲区3虚拟地址= 0xa25a4000
    [主机][主机] 261.864149 s:缓冲区3物理地址= 0x84af1000

    我使用 OSA_memVirt2Phys() API 获得了物理地址。

    此致、

    Nick

    e2e.ti.com/.../log.log

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

    您能否使用 fallocate 写入预分配的文件、而不是使用 O_Direct。 使用 fallocate 分配一个文件(小于2GB)、并尝试在没有 O_Direct 标志的情况下写入该文件。 您应该会看到性能提升(吞吐量应该增加、CPU 负载也必须降低)。

    root# rm -rf test1.yUV
    root# fallocate -l 1G test1.yUV

    请尝试一下、并告诉我们您的观察结果吗?
    从 SR-1使用 O_Direct 进行写入是不可行的(即使我们映射了该区域并将其标记为共享)。 SR-1类似于 I/O 存储器、提供对内核映射页面的访问是一个黑客攻击、不应被允许。

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

    我们已经尝试了您的建议、负载仍然很高(~90%)、并且存在帧下降。

    我们想知道的是 dma_alloc_相干()从何处分配存储器。 我们也无法使用通过该 API 分配的缓冲区中的 O_Direct 标志写入 SSD。 该内存是从 OSA_memAllocSR()分配内存的同一段中分配的吗?

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

    如果未指定器件、dma_alloc_相干 存储器会从 CMA 池分配内存。
    OSA_memAllocSR 从 Linux 向 TI-RTOS (在 M4上运行)发送调用、以分配 SR 中的存储器。 TI-RTOS 分配内存并将物理地址传递给 Linux、基础驱动程序将物理地址转换为文件描述符/虚拟地址。 因此、当调用 OSA_memAllocSR 时、分配来自 TI-RTOS、而不是来自 Linux。

    使用 O_Direct 进行写入时、这两种方法都失败的原因是因为这两种方法都是 I/O 存储器。 这些内存区域被标记为保留、这会阻止内核使用这些内存区域。 因此、必须有一个从用户空间(其中有一个明确的调用来映射保留区域)到内核空间的副本、这会增加负载。

    启用带有 I/O 存储器的 O_Direct 将涉及直接写入内核空间的 I/O 内存、这是一个安全缺陷。

    此致
    Shravan