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.

[参考译文] AM6422:AM6442 上 PCIe DMA 的性能吞吐量查询 (x86 RC 至 AM64x EP)

Guru**** 2867040 points

Other Parts Discussed in Thread: AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1631856/am6422-performance-throughput-inquiry-for-pcie-dma-on-am642-x86-rc-to-am64x-ep

器件型号: AM6422
主题: AM6442 中讨论的其他器件

环境详细信息:
根复合体 (RC):x86 PC  
端点 (EP):AM6442 EVM
驱动程序:PCI_ENDPOINT_TEST(主机)和 PCI-EPF-TEST (EP)
测试工具:pcitest 实用程序  

问题描述:  
我们正在使用标准 Linux 内核 PCIe 端点框架评估 PCIe DMA 性能。
虽然功能测试(读取/写入/复制)成功、但观察到的吞吐量明显低于理论链路速度、尤其是在 RC 读取操作期间。
我们还观察到 4MB 传输限制、我们想确认此 SoC 的默认配置是预期的。

观察到的结果(1MB 传输大小):  
 使用命令:  
 
 pcitest -w -s 1024000 -d -D /dev/pci_endpoint_test.1.0
 登录 EP:  
 Root@am64xx-EVM:/sys/kernel/config/pci_ep #[ 2104.503794]
[2104.503794]========= RC 写入 START ==========
[ 2104.509932] RC DST_ADDR:0xffe00000 大小:1024000 标志:0x1
[ 2104.528790]写入:CRC32 = 0x30e52816
[2104.535761] PCI_EPF_TEST PCI_EPF_TEST.0:写入=>大小:1024000 B、DMA:是、时间:0.003231745 s、速率:316856 kb/s
[2104.546277]写入:传输完成
[2104.550029]========= RC 写入成功===========
[2104.550029]

 pcitest -r -s 1024000 -d -D /dev/pci_endpoint_test.1.0
 登录 EP:
 Root@am64xx-EVM:/sys/kernel/config/pci_ep #[ 2112.227794]
[2112.227794]======== RC 读取开始==========
[ 2112.233845] RC SRC_ADDR:0xffe00000 大小:1024000 标志:0x1
[2112.250984] PCI_EPF_TEST PCI_EPF_TEST.0:读取=>大小:1024000 B、DMA:是、时间:0.010639380 s、速率:96246 kb/s
[ 2112.261983]读取:预期 CRC = 0x1f016f 计算得出的 CRC = 0x1f016f
[2112.268386]读取:CRC 成功
[2112.271405]=========== RC 读取成功===========
[2112.271405]

 
向 TI 团队提出的问题:  
1.预期吞吐量:这些速率(316 Mb/s 写入速度/96 Mb/s 读取速度)是否与 TI 的 AM64x PCIe 内部基准测试一致?
2、为什么 RC 读取((EP 到 RC 写入)比 RC 写入((RC 到 EP 读取)要慢得多(~3 倍)?  
3. 4MB 限制:我们无法执行大于 4MB 的功能传输。 这在器件树或 AM64x 上内核的分配器中是否受限?

谢谢、

Charan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1. 预期吞吐量:这些速率(316 Mb/s 写入速度/96 Mb/s 读取速度)是否与 TI 针对 AM64x PCIe 的内部基准测试一致?

    借助 pcitest 实用程序、TI 也测量了类似的吞吐量:
     pcitest -w -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量 317953KB/s
     pcitest -r -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量 111103 kb/s

    但是、为了精确测量、需要更新 PCI-EPF-TEST.c 驱动程序以重复传输多次迭代并测量整个迭代的平均吞吐量。 这是因为 DMA 设置开销使吞吐量看起来低于实际水平。 使用一次性 DMA 设置的重复传输将对整个迭代中的设置开销损失求平均值。 另一种方法是单独测量传输时间、不包括 DMA 设置时间。 其差值为:

    diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
    index eeb7fbc2d67a..6d186650a2d3 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-test.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
    @@ -109,6 +109,8 @@ static void pci_epf_test_dma_callback(void *param)
      * @len: The size of the data transfer
      * @dma_remote: remote RC physical address
      * @dir: DMA transfer direction
    + * @start: Pointer to timespec64 structure that shall store transfer start time
    + * @end: Pointer to timespec64 structure that shall store transfer end time
      *
      * Function that uses dmaengine API to transfer data between PCIe EP and remote
      * PCIe RC. The source and destination address can be a physical address given
    @@ -119,7 +121,9 @@ static void pci_epf_test_dma_callback(void *param)
     static int pci_epf_test_data_transfer(struct pci_epf_test *epf_test,
     				      dma_addr_t dma_dst, dma_addr_t dma_src,
     				      size_t len, dma_addr_t dma_remote,
    -				      enum dma_transfer_direction dir)
    +				      enum dma_transfer_direction dir,
    +				      struct timespec64 *start,
    +				      struct timespec64 *end)
     {
     	struct dma_chan *chan = (dir == DMA_MEM_TO_DEV) ?
     				 epf_test->dma_chan_tx : epf_test->dma_chan_rx;
    @@ -165,6 +169,8 @@ static int pci_epf_test_data_transfer(struct pci_epf_test *epf_test,
     	tx->callback_param = epf_test;
     	epf_test->transfer_cookie = dmaengine_submit(tx);
    
    +	ktime_get_ts64(start);
    +
     	ret = dma_submit_error(epf_test->transfer_cookie);
     	if (ret) {
     		dev_err(dev, "Failed to do DMA tx_submit %d\n", ret);
    @@ -178,6 +184,8 @@ static int pci_epf_test_data_transfer(struct pci_epf_test *epf_test,
     		goto terminate;
     	}
    
    +	ktime_get_ts64(end);
    +
     	if (epf_test->transfer_status == DMA_ERROR) {
     		dev_err(dev, "DMA transfer failed\n");
     		ret = -EIO;
    @@ -362,7 +370,6 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
     		goto err_dst_addr;
     	}
    
    -	ktime_get_ts64(&start);
     	if (reg->flags & FLAG_USE_DMA) {
     		if (!dma_has_cap(DMA_MEMCPY, epf_test->dma_chan_tx->device->cap_mask)) {
     			dev_err(dev, "DMA controller doesn't support MEMCPY\n");
    @@ -372,7 +379,7 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
    
     		ret = pci_epf_test_data_transfer(epf_test, dst_phys_addr,
     						 src_phys_addr, reg->size, 0,
    -						 DMA_MEM_TO_MEM);
    +						 DMA_MEM_TO_MEM, &start, &end);
     		if (ret)
     			dev_err(dev, "Data transfer failed\n");
     	} else {
    @@ -384,11 +391,12 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
     			goto err_map_addr;
     		}
    
    +		ktime_get_ts64(&start);
     		memcpy_fromio(buf, src_addr, reg->size);
     		memcpy_toio(dst_addr, buf, reg->size);
    +		ktime_get_ts64(&end);
     		kfree(buf);
     	}
    -	ktime_get_ts64(&end);
     	pci_epf_test_print_rate(epf_test, "COPY", reg->size, &start, &end,
     				reg->flags & FLAG_USE_DMA);
    
    @@ -457,13 +465,12 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
     			goto err_dma_map;
     		}
    
    -		ktime_get_ts64(&start);
     		ret = pci_epf_test_data_transfer(epf_test, dst_phys_addr,
     						 phys_addr, reg->size,
    -						 reg->src_addr, DMA_DEV_TO_MEM);
    +						 reg->src_addr, DMA_DEV_TO_MEM,
    +						 &start, &end);
     		if (ret)
     			dev_err(dev, "Data transfer failed\n");
    -		ktime_get_ts64(&end);
    
     		dma_unmap_single(dma_dev, dst_phys_addr, reg->size,
     				 DMA_FROM_DEVICE);
    @@ -544,15 +551,12 @@ static void pci_epf_test_write(struct pci_epf_test *epf_test,
     			goto err_dma_map;
     		}
    
    -		ktime_get_ts64(&start);
    -
     		ret = pci_epf_test_data_transfer(epf_test, phys_addr,
     						 src_phys_addr, reg->size,
     						 reg->dst_addr,
    -						 DMA_MEM_TO_DEV);
    +						 DMA_MEM_TO_DEV, &start, &end);
     		if (ret)
     			dev_err(dev, "Data transfer failed\n");
    -		ktime_get_ts64(&end);
    
     		dma_unmap_single(dma_dev, src_phys_addr, reg->size,
     				 DMA_TO_DEVICE);

    2. 为什么 RC 读取((EP 到 RC 写入)比 RC 写入((RC 到 EP 读取)明显慢(~3 倍)?  [/报价]

    写入和读取被反转。 在读取测试中、数据从 RC 的缓冲区移动到 EP 的缓冲区。 在写入测试中、数据从 EP 的缓冲区移动到 RC 的缓冲区。 两者之间的速度差异是由于写入测试/传输的“发布性质“造成的。 请注意以下事项、了解何时将读取测试视为完成、以及何时将写入测试视为完成:

    读取测试=> EP 上的 DMA 通过 PCIe 总线发出读取事务以从 RC 的缓冲区获取数据、仅当数据已移入 EP 的缓冲区时才视为完成
    写入测试=> EP 上的 DMA 从 EP 的缓冲区中获取数据、并通过 PCIe 总线发出写入事务以将数据写入 RC 的缓冲区。 PCIe 中的写入已发布、没有与它们相关的完成。 EP 缓冲区的最后一个数据块已由 EP 上的 DMA 控制器发送到 PCIe EP 控制器时、它会认为事务已完成。

    3. 4MB 限制:我们无法执行大于 4MB 的功能传输。 这在器件树或 AM64x 上内核的分配器中是否受限?

    drivers/pci/endpoint/functions/PCI-EPF-test.c 中的以下行指定端点的每个物理功能中每个条的大小:

    static size_t bar_size[] = { 512, 512, 1024, 16384, 131072, 1048576 };

    例如、请尝试将上述内容更新为 8 MB、并检查是否启用 8 MB 或更多的传输。

    此致、
    Siddharth。

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

    您好 Siddharth、

    很抱歉耽误响应。

    进行您建议的更改后,我们观察到数据传输吞吐量如下:  
    pcitest -w -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量 348 MB/s
     pcitest -r -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量  106 MB/s

    您能否确认 这些速率(348 Mb/s 写入速度/106 Mb/s 读取速度)是否与 TI 的 AM64x PCIe 内部基准测试一致?

    谢谢、

    Charan

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

    您好、Charan、

    在进行您建议的更改后、我们观察到以下数据传输吞吐量:  
    pcitest -w -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量 348 MB/s
     pcitest -r -s 1024000 -d -D /dev/pci_endpoint_test.1.0 =>吞吐量  106 MB/s

    您能否确认 这些速率(348 Mb/s 写入速度/106 Mb/s 读取速度)是否与 TI 的 AM64x PCIe 内部基准测试一致?

    是、但测试中的缓冲区大小为 1MB。 您是否能够尝试使用较大的传输尺寸?

    此致、
    Siddharth。