Skip to content

pfc触发段错误 #286

@xyh522

Description

@xyh522
Image Image

我将配置文件中的PACKET_PAYLOAD_SIZE 9000 改为1000,将buffer_size从32改为9,其余不变相同的一个workload,执行后者报错如图,AI告诉我是pfc resume的时候输入的队列id不对导致的,存在这个问题吗。

PFC 触发链路是:

SwitchNode::SendToDev()
-> CheckAndSendPfc(inDev, qIndex)
-> device->SendPfc(qIndex, 0) // pause

恢复链路是:

SwitchNode::SwitchNotifyDequeue()
-> CheckAndSendResume(inDev, qIndex)
-> device->SendPfc(qIndex, 1) // resume

GPU/NIC 收到 resume 后:

QbbNetDevice::Receive()
-> Resume(qIndex)

问题就在 Resume():

Ptr lastQp = m_rdmaEQ->GetQp(qIndex);

这里的 qIndex 是 PFC 队列号/优先级号,比如 3,不是 RDMA QP 数组下标。
你这次 gdb 里已经看到:

qIndex = 3
node id = 10
node type = 0
RDMA QP count = 2

也就是只有 2 个 QP,却访问 GetQp(3),直接越界段错误。

为什么 BUFFER_SIZE=9 更容易触发?

PFC 阈值这样算:

(buffer_size - total_hdrm - total_rsrv - shared_used_bytes) >> pfc_a_shift[port]

BUFFER_SIZE 从 32MB 改成 9MB,buffer_size 变小,PFC threshold 明显变低,更容易 pause,也更频繁 resume。于是更容易走到这个错误的 Resume(qIndex)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions