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
相关产品推荐
相关产品推荐

