Skip to content

pfc触发段错误 #286

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions