vdpa: map shadow vrings with MAP_SHARED

The vdpa devices that use va addresses neeeds these maps shared.
Otherwise, vhost_vdpa checks will refuse to accept the maps.

The mmap call will always return a page aligned address, so removing the
qemu_memalign call.  Keeping the ROUND_UP for the size as we still need
to DMA-map them in full.

Not applying fixes tag as it never worked with va devices.

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Message-Id: <20230602143854.1879091-4-eperezma@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Eugenio Pérez 2023-06-02 16:38:54 +02:00 committed by Michael S. Tsirkin
parent 915bf6ccd7
commit babf8b8712
2 changed files with 17 additions and 17 deletions

View file

@ -649,7 +649,7 @@ void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd)
void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev, void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev,
VirtQueue *vq, VhostIOVATree *iova_tree) VirtQueue *vq, VhostIOVATree *iova_tree)
{ {
size_t desc_size, driver_size, device_size; size_t desc_size;
event_notifier_set_handler(&svq->hdev_call, vhost_svq_handle_call); event_notifier_set_handler(&svq->hdev_call, vhost_svq_handle_call);
svq->next_guest_avail_elem = NULL; svq->next_guest_avail_elem = NULL;
@ -662,14 +662,14 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev,
svq->vring.num = virtio_queue_get_num(vdev, virtio_get_queue_index(vq)); svq->vring.num = virtio_queue_get_num(vdev, virtio_get_queue_index(vq));
svq->num_free = svq->vring.num; svq->num_free = svq->vring.num;
driver_size = vhost_svq_driver_area_size(svq); svq->vring.desc = mmap(NULL, vhost_svq_driver_area_size(svq),
device_size = vhost_svq_device_area_size(svq); PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
svq->vring.desc = qemu_memalign(qemu_real_host_page_size(), driver_size); -1, 0);
desc_size = sizeof(vring_desc_t) * svq->vring.num; desc_size = sizeof(vring_desc_t) * svq->vring.num;
svq->vring.avail = (void *)((char *)svq->vring.desc + desc_size); svq->vring.avail = (void *)((char *)svq->vring.desc + desc_size);
memset(svq->vring.desc, 0, driver_size); svq->vring.used = mmap(NULL, vhost_svq_device_area_size(svq),
svq->vring.used = qemu_memalign(qemu_real_host_page_size(), device_size); PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
memset(svq->vring.used, 0, device_size); -1, 0);
svq->desc_state = g_new0(SVQDescState, svq->vring.num); svq->desc_state = g_new0(SVQDescState, svq->vring.num);
svq->desc_next = g_new0(uint16_t, svq->vring.num); svq->desc_next = g_new0(uint16_t, svq->vring.num);
for (unsigned i = 0; i < svq->vring.num - 1; i++) { for (unsigned i = 0; i < svq->vring.num - 1; i++) {
@ -712,8 +712,8 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq)
svq->vq = NULL; svq->vq = NULL;
g_free(svq->desc_next); g_free(svq->desc_next);
g_free(svq->desc_state); g_free(svq->desc_state);
qemu_vfree(svq->vring.desc); munmap(svq->vring.desc, vhost_svq_driver_area_size(svq));
qemu_vfree(svq->vring.used); munmap(svq->vring.used, vhost_svq_device_area_size(svq));
event_notifier_set_handler(&svq->hdev_call, NULL); event_notifier_set_handler(&svq->hdev_call, NULL);
} }

View file

@ -205,8 +205,8 @@ static void vhost_vdpa_cleanup(NetClientState *nc)
{ {
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc); VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
qemu_vfree(s->cvq_cmd_out_buffer); munmap(s->cvq_cmd_out_buffer, vhost_vdpa_net_cvq_cmd_page_len());
qemu_vfree(s->status); munmap(s->status, vhost_vdpa_net_cvq_cmd_page_len());
if (s->vhost_net) { if (s->vhost_net) {
vhost_net_cleanup(s->vhost_net); vhost_net_cleanup(s->vhost_net);
g_free(s->vhost_net); g_free(s->vhost_net);
@ -903,12 +903,12 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
vhost_vdpa_net_valid_svq_features(features, vhost_vdpa_net_valid_svq_features(features,
&s->vhost_vdpa.migration_blocker); &s->vhost_vdpa.migration_blocker);
} else if (!is_datapath) { } else if (!is_datapath) {
s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(), s->cvq_cmd_out_buffer = mmap(NULL, vhost_vdpa_net_cvq_cmd_page_len(),
vhost_vdpa_net_cvq_cmd_page_len()); PROT_READ | PROT_WRITE,
memset(s->cvq_cmd_out_buffer, 0, vhost_vdpa_net_cvq_cmd_page_len()); MAP_SHARED | MAP_ANONYMOUS, -1, 0);
s->status = qemu_memalign(qemu_real_host_page_size(), s->status = mmap(NULL, vhost_vdpa_net_cvq_cmd_page_len(),
vhost_vdpa_net_cvq_cmd_page_len()); PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
memset(s->status, 0, vhost_vdpa_net_cvq_cmd_page_len()); -1, 0);
s->vhost_vdpa.shadow_vq_ops = &vhost_vdpa_net_svq_ops; s->vhost_vdpa.shadow_vq_ops = &vhost_vdpa_net_svq_ops;
s->vhost_vdpa.shadow_vq_ops_opaque = s; s->vhost_vdpa.shadow_vq_ops_opaque = s;