You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VHOST_USER_PROTOCOL_F_HOST_NOTIFIER工作机制与mlx5 vDPA回调疑问

MLX5 vDPA驱动中VHOST_USER_PROTOCOL_F_HOST_NOTIFIER特性机制与kickfd回调疑问

我正在研究mlx5 vDPA驱动代码,其中一段代码为kickfd注册了回调函数mlx5_vdpa_virtq_kick_handler:

/* Setup doorbell mapping. */
virtq->intr_handle.fd = vq.kickfd;
if (virtq->intr_handle.fd == -1) {
    DRV_LOG(WARNING, "Virtq %d kickfd is invalid.", index);
} else {
    virtq->intr_handle.type = RTE_INTR_HANDLE_EXT;
    if (rte_intr_callback_register(&virtq->intr_handle,
                        mlx5_vdpa_virtq_kick_handler,
                        virtq)) {
        virtq->intr_handle.fd = -1;
        DRV_LOG(ERR, "Failed to register virtq %d interrupt.",
            index);
        goto error;
    } else {
        DRV_LOG(DEBUG, "Register fd %d interrupt for virtq %d.",
            virtq->intr_handle.fd, index);
    }
}

该回调函数会调用rte_vhost_host_notifier_ctrl,构造VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG类型的VhostUserMsg并发送给QEMU:

struct VhostUserMsg msg = {
    .request.slave = VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG,
    .flags = VHOST_USER_VERSION | VHOST_USER_NEED_REPLY,
    .size = sizeof(msg.payload.area),
    .payload.area = {
        .u64 = index & VHOST_USER_VRING_IDX_MASK,
        .size = size,
        .offset = offset,
    },
};

if (fd < 0)
    msg.payload.area.u64 |= VHOST_USER_VRING_NOFD_MASK;
else {
    msg.fds[0] = fd;
    msg.fd_num = 1;
} 

对应补丁对VHOST_USER_PROTOCOL_F_HOST_NOTIFIER特性的说明如下:

This patch introduces VHOST_USER_PROTOCOL_F_HOST_NOTIFIER.
With this feature negotiated, vhost-user backend can register
memory region based host notifiers. And it will allow the guest
driver in the VM to notify the hardware accelerator at the
vhost-user backend directly.

从驱动打印日志可以看到,每个virtq仅打印一次门铃触发信息:

mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 0.
mlx5_vdpa: Register fd 76 interrupt for virtq 0.
mlx5_vdpa: vid 0 virtq 0 was created successfully.
mlx5_vdpa: Virtq 0 notifier state is enabled.
mlx5_vdpa: Ring virtq 0 doorbell.
mlx5_vdpa: vid 0: Init last_avail_idx=0, last_used_idx=0 for virtq 1.
mlx5_vdpa: Register fd 81 interrupt for virtq 1.
mlx5_vdpa: vid 0 virtq 1 was created successfully.
mlx5_vdpa: Virtq 1 notifier state is enabled.
mlx5_vdpa: Ring virtq 1 doorbell.
mlx5_vdpa: vDPA device 0 was configured.

我对代码功能有基本了解,但存在两个核心疑问:

  • 请明确VHOST_USER_PROTOCOL_F_HOST_NOTIFIER特性的具体工作机制
  • 为何kickfd的回调函数仅触发一次,后续的kick操作不再走这个回调?

内容的提问来源于stack exchange,提问作者Tuesday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:42:17