[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v8 16/21] vdpa: Add vhost_vdpa_start_control_svq
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH v8 16/21] vdpa: Add vhost_vdpa_start_control_svq |
Date: |
Thu, 19 May 2022 21:13:01 +0200 |
As a first step we only enable CVQ first than others. Future patches add
state restore.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
net/vhost-vdpa.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index 174fec5e77..a66f73ff63 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -188,6 +188,66 @@ static NetClientInfo net_vhost_vdpa_info = {
.check_peer_type = vhost_vdpa_check_peer_type,
};
+static int vhost_vdpa_start_control_svq(VhostShadowVirtqueue *svq,
+ struct vhost_dev *dev)
+{
+ struct vhost_vring_state state = {
+ .index = virtio_get_queue_index(svq->vq),
+ .num = 1,
+ };
+ struct vhost_vdpa *v = dev->opaque;
+ VirtIONet *n = VIRTIO_NET(dev->vdev);
+ uint64_t features = dev->vdev->host_features;
+ int r;
+ size_t num = 0;
+
+ assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
+
+ r = ioctl(v->device_fd, VHOST_VDPA_SET_VRING_ENABLE, &state);
+ if (r < 0) {
+ return -errno;
+ }
+
+ if (features & BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR)) {
+ const struct virtio_net_ctrl_hdr ctrl = {
+ .class = VIRTIO_NET_CTRL_MAC,
+ .cmd = VIRTIO_NET_CTRL_MAC_ADDR_SET,
+ };
+ uint8_t mac[6];
+ virtio_net_ctrl_ack ack;
+ const struct iovec data[] = {
+ {
+ .iov_base = (void *)&ctrl,
+ .iov_len = sizeof(ctrl),
+ },{
+ .iov_base = mac,
+ .iov_len = sizeof(mac),
+ },{
+ .iov_base = &ack,
+ .iov_len = sizeof(ack),
+ }
+ };
+
+ memcpy(mac, n->mac, sizeof(mac));
+ r = vhost_svq_inject(svq, data, 2, 1);
+ if (unlikely(r)) {
+ return r;
+ }
+ num++;
+ }
+
+ while (num) {
+ /*
+ * We can call vhost_svq_poll here because BQL protects calls to run.
+ */
+ size_t used = vhost_svq_poll(svq);
+ assert(used <= num);
+ num -= used;
+ }
+
+ return 0;
+}
+
static void vhost_vdpa_net_handle_ctrl(VirtIODevice *vdev,
const VirtQueueElement *elem)
{
@@ -226,6 +286,7 @@ static void vhost_vdpa_net_handle_ctrl(VirtIODevice *vdev,
static const VhostShadowVirtqueueOps vhost_vdpa_net_svq_ops = {
.used_elem_handler = vhost_vdpa_net_handle_ctrl,
+ .start = vhost_vdpa_start_control_svq,
};
static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
--
2.27.0
- [RFC PATCH v8 05/21] vhost: Add vhost_iova_tree_find, (continued)
- [RFC PATCH v8 05/21] vhost: Add vhost_iova_tree_find, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 06/21] vdpa: Add map/unmap operation callback to SVQ, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 07/21] vhost: move descriptor translation to vhost_svq_vring_write_descs, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 08/21] vhost: Add SVQElement, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 09/21] vhost: Add svq copy desc mode, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 11/21] vhost: Update kernel headers, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 10/21] vhost: Add vhost_svq_inject, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 12/21] vdpa: delay set_vring_ready after DRIVER_OK, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 13/21] vhost: Add ShadowVirtQueueStart operation, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 14/21] vhost: Make possible to check for device exclusive vq group, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 16/21] vdpa: Add vhost_vdpa_start_control_svq,
Eugenio Pérez <=
- [RFC PATCH v8 17/21] vdpa: Add asid attribute to vdpa device, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 18/21] vdpa: Extract get features part from vhost_vdpa_get_max_queue_pairs, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 21/21] vdpa: Add x-cvq-svq, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 15/21] vhost: add vhost_svq_poll, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 19/21] vhost: Add reference counting to vhost_iova_tree, Eugenio Pérez, 2022/05/19
- [RFC PATCH v8 20/21] vdpa: Add x-svq to NetdevVhostVDPAOptions, Eugenio Pérez, 2022/05/19