[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v4 19/20] vdpa: Add asid attribute to vdpa device
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH v4 19/20] vdpa: Add asid attribute to vdpa device |
Date: |
Thu, 31 Mar 2022 20:04:09 +0200 |
We can configure ASID per group, but we still use asid 0 for every vdpa
device. Multiple asid support for cvq will be introduced in next
patches.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
include/hw/virtio/vhost-vdpa.h | 3 +++
hw/virtio/vhost-vdpa.c | 47 ++++++++++++++++++++++++----------
net/vhost-vdpa.c | 10 ++++++--
3 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h
index f1ba46a860..921edbf77b 100644
--- a/include/hw/virtio/vhost-vdpa.h
+++ b/include/hw/virtio/vhost-vdpa.h
@@ -28,10 +28,13 @@ typedef struct vhost_vdpa {
int device_fd;
int index;
uint32_t msg_type;
+ uint32_t asid;
bool iotlb_batch_begin_sent;
MemoryListener listener;
struct vhost_vdpa_iova_range iova_range;
uint64_t acked_features;
+ /* one past the last vq index of this virtqueue group */
+ int vq_group_index_end;
bool shadow_vqs_enabled;
/* IOVA mapping used by the Shadow Virtqueue */
VhostIOVATree *iova_tree;
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
index 600d006d6e..bd06662cee 100644
--- a/hw/virtio/vhost-vdpa.c
+++ b/hw/virtio/vhost-vdpa.c
@@ -79,6 +79,9 @@ static int vhost_vdpa_dma_map(struct vhost_vdpa *v, hwaddr
iova, hwaddr size,
int ret = 0;
msg.type = v->msg_type;
+ if (v->dev->backend_cap & BIT_ULL(VHOST_BACKEND_F_IOTLB_ASID)) {
+ msg.asid = v->asid;
+ }
msg.iotlb.iova = iova;
msg.iotlb.size = size;
msg.iotlb.uaddr = (uint64_t)(uintptr_t)vaddr;
@@ -104,6 +107,9 @@ static int vhost_vdpa_dma_unmap(struct vhost_vdpa *v,
hwaddr iova,
int fd = v->device_fd;
int ret = 0;
+ if (v->dev->backend_cap & BIT_ULL(VHOST_BACKEND_F_IOTLB_ASID)) {
+ msg.asid = v->asid;
+ }
msg.type = v->msg_type;
msg.iotlb.iova = iova;
msg.iotlb.size = size;
@@ -129,6 +135,10 @@ static void vhost_vdpa_listener_begin_batch(struct
vhost_vdpa *v)
.iotlb.type = VHOST_IOTLB_BATCH_BEGIN,
};
+ if (v->dev->backend_cap & BIT_ULL(VHOST_BACKEND_F_IOTLB_ASID)) {
+ msg.asid = v->asid;
+ }
+
if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
error_report("failed to write, fd=%d, errno=%d (%s)",
fd, errno, strerror(errno));
@@ -161,6 +171,9 @@ static void vhost_vdpa_listener_commit(MemoryListener
*listener)
}
msg.type = v->msg_type;
+ if (dev->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_ASID)) {
+ msg.asid = v->asid;
+ }
msg.iotlb.type = VHOST_IOTLB_BATCH_END;
if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
@@ -675,7 +688,8 @@ static int vhost_vdpa_set_backend_cap(struct vhost_dev *dev)
{
uint64_t features;
uint64_t f = 0x1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2 |
- 0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH;
+ 0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH |
+ 0x1ULL << VHOST_BACKEND_F_IOTLB_ASID;
int r;
if (vhost_vdpa_call(dev, VHOST_GET_BACKEND_FEATURES, &features)) {
@@ -1098,7 +1112,9 @@ static bool vhost_vdpa_svqs_stop(struct vhost_dev *dev)
static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started)
{
struct vhost_vdpa *v = dev->opaque;
- bool ok;
+ bool vq_group_end, ok;
+ int r = 0;
+
trace_vhost_vdpa_dev_start(dev, started);
if (started) {
@@ -1116,21 +1132,26 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev,
bool started)
vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs);
}
- if (dev->vq_index + dev->nvqs != dev->vq_index_end) {
- return 0;
+ vq_group_end = dev->vq_index + dev->nvqs == v->vq_group_index_end;
+ if (vq_group_end && started) {
+ memory_listener_register(&v->listener, &address_space_memory);
}
- if (started) {
- memory_listener_register(&v->listener, &address_space_memory);
- return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
- } else {
- vhost_vdpa_reset_device(dev);
- vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
- VIRTIO_CONFIG_S_DRIVER);
- memory_listener_unregister(&v->listener);
+ if (dev->vq_index + dev->nvqs == dev->vq_index_end) {
+ if (started) {
+ r = vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
+ } else {
+ vhost_vdpa_reset_device(dev);
+ vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
+ VIRTIO_CONFIG_S_DRIVER);
+ }
+ }
- return 0;
+ if (vq_group_end && !started) {
+ memory_listener_unregister(&v->listener);
}
+
+ return r;
}
static int vhost_vdpa_set_log_base(struct vhost_dev *dev, uint64_t base,
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index 6dc0ae8614..fae9a43b86 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -323,6 +323,8 @@ static NetClientState *net_vhost_vdpa_init(NetClientState
*peer,
int vdpa_device_fd,
int queue_pair_index,
int nvqs,
+ uint32_t asid,
+ int vq_group_end,
bool is_datapath,
bool svq,
VhostIOVATree *iova_tree)
@@ -344,6 +346,8 @@ static NetClientState *net_vhost_vdpa_init(NetClientState
*peer,
s->vhost_vdpa.device_fd = vdpa_device_fd;
s->vhost_vdpa.index = queue_pair_index;
s->vhost_vdpa.shadow_vqs_enabled = svq;
+ s->vhost_vdpa.vq_group_index_end = vq_group_end;
+ s->vhost_vdpa.asid = asid;
if (!is_datapath) {
s->vhost_vdpa.shadow_vq_ops = &vhost_vdpa_net_svq_ops;
}
@@ -454,7 +458,8 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char
*name,
for (i = 0; i < queue_pairs; i++) {
ncs[i] = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
- vdpa_device_fd, i, 2, true, opts->x_svq,
+ vdpa_device_fd, i, 2, 0,
+ queue_pairs + has_cvq, true, opts->x_svq,
iova_tree);
if (!ncs[i])
goto err;
@@ -462,7 +467,8 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char
*name,
if (has_cvq) {
nc = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
- vdpa_device_fd, i, 1, false, opts->x_svq,
+ vdpa_device_fd, i, 1, 0,
+ queue_pairs + has_cvq, false, opts->x_svq,
iova_tree);
if (!nc)
goto err;
--
2.27.0
- [RFC PATCH v4 09/20] virtio: Make virtqueue_alloc_element non-static, (continued)
- [RFC PATCH v4 09/20] virtio: Make virtqueue_alloc_element non-static, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 10/20] vhost: Add SVQElement, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 11/20] vhost: Add custom used buffer callback, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 12/20] vdpa: control virtqueue support on shadow virtqueue, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 13/20] vhost: Add vhost_iova_tree_find, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 14/20] vdpa: Add map/unmap operation callback to SVQ, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 15/20] vhost: Add vhost_svq_inject, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 17/20] vdpa: Add vhost_vdpa_start_control_svq, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 16/20] vdpa: add NetClientState->start() callback, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 18/20] vhost: Update kernel headers, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 19/20] vdpa: Add asid attribute to vdpa device,
Eugenio Pérez <=
- [RFC PATCH v4 20/20] vdpa: Add x-cvq-svq, Eugenio Pérez, 2022/03/31