Skip to content

Commit

Permalink
Merge tag 'net-pull-request' of https://github.com/jasowang/qemu into…
Browse files Browse the repository at this point in the history
… staging

# gpg: Signature made Tue 15 Mar 2022 05:58:55 GMT
# gpg:                using RSA key EF04965B398D6211
# gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [marginal]
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 215D 46F4 8246 689E C77F  3562 EF04 965B 398D 6211

* tag 'net-pull-request' of https://github.com/jasowang/qemu:
  vdpa: Expose VHOST_F_LOG_ALL on SVQ
  vdpa: Never set log_base addr if SVQ is enabled
  vdpa: Adapt vhost_vdpa_get_vring_base to SVQ
  vdpa: Add custom IOTLB translations to SVQ
  vhost: Add VhostIOVATree
  util: add iova_tree_find_iova
  util: Add iova_tree_alloc_map
  vhost: Shadow virtqueue buffers forwarding
  vdpa: adapt vhost_ops callbacks to svq
  virtio: Add vhost_svq_get_vring_addr
  vhost: Add vhost_svq_valid_features to shadow vq
  vhost: Add Shadow VirtQueue call forwarding capabilities
  vhost: Add Shadow VirtQueue kick forwarding capabilities
  vhost: Add VhostShadowVirtqueue
  virtio-net: fix map leaking on error during receive

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 15, 2022
2 parents 6f4fe14 + 12a195f commit a72ada1
Show file tree
Hide file tree
Showing 10 changed files with 1,584 additions and 17 deletions.
1 change: 1 addition & 0 deletions hw/net/virtio-net.c
Expand Up @@ -1870,6 +1870,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,

err:
for (j = 0; j < i; j++) {
virtqueue_detach_element(q->rx_vq, elems[j], lens[j]);
g_free(elems[j]);
}

Expand Down
2 changes: 1 addition & 1 deletion hw/virtio/meson.build
Expand Up @@ -11,7 +11,7 @@ softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-stub.c'))

virtio_ss = ss.source_set()
virtio_ss.add(files('virtio.c'))
virtio_ss.add(when: 'CONFIG_VHOST', if_true: files('vhost.c', 'vhost-backend.c'))
virtio_ss.add(when: 'CONFIG_VHOST', if_true: files('vhost.c', 'vhost-backend.c', 'vhost-shadow-virtqueue.c', 'vhost-iova-tree.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER', if_true: files('vhost-user.c'))
virtio_ss.add(when: 'CONFIG_VHOST_VDPA', if_true: files('vhost-vdpa.c'))
virtio_ss.add(when: 'CONFIG_VIRTIO_BALLOON', if_true: files('virtio-balloon.c'))
Expand Down
110 changes: 110 additions & 0 deletions hw/virtio/vhost-iova-tree.c
@@ -0,0 +1,110 @@
/*
* vhost software live migration iova tree
*
* SPDX-FileCopyrightText: Red Hat, Inc. 2021
* SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#include "qemu/osdep.h"
#include "qemu/iova-tree.h"
#include "vhost-iova-tree.h"

#define iova_min_addr qemu_real_host_page_size

/**
* VhostIOVATree, able to:
* - Translate iova address
* - Reverse translate iova address (from translated to iova)
* - Allocate IOVA regions for translated range (linear operation)
*/
struct VhostIOVATree {
/* First addressable iova address in the device */
uint64_t iova_first;

/* Last addressable iova address in the device */
uint64_t iova_last;

/* IOVA address to qemu memory maps. */
IOVATree *iova_taddr_map;
};

/**
* Create a new IOVA tree
*
* Returns the new IOVA tree
*/
VhostIOVATree *vhost_iova_tree_new(hwaddr iova_first, hwaddr iova_last)
{
VhostIOVATree *tree = g_new(VhostIOVATree, 1);

/* Some devices do not like 0 addresses */
tree->iova_first = MAX(iova_first, iova_min_addr);
tree->iova_last = iova_last;

tree->iova_taddr_map = iova_tree_new();
return tree;
}

/**
* Delete an iova tree
*/
void vhost_iova_tree_delete(VhostIOVATree *iova_tree)
{
iova_tree_destroy(iova_tree->iova_taddr_map);
g_free(iova_tree);
}

/**
* Find the IOVA address stored from a memory address
*
* @tree: The iova tree
* @map: The map with the memory address
*
* Return the stored mapping, or NULL if not found.
*/
const DMAMap *vhost_iova_tree_find_iova(const VhostIOVATree *tree,
const DMAMap *map)
{
return iova_tree_find_iova(tree->iova_taddr_map, map);
}

/**
* Allocate a new mapping
*
* @tree: The iova tree
* @map: The iova map
*
* Returns:
* - IOVA_OK if the map fits in the container
* - IOVA_ERR_INVALID if the map does not make sense (like size overflow)
* - IOVA_ERR_NOMEM if tree cannot allocate more space.
*
* It returns assignated iova in map->iova if return value is VHOST_DMA_MAP_OK.
*/
int vhost_iova_tree_map_alloc(VhostIOVATree *tree, DMAMap *map)
{
/* Some vhost devices do not like addr 0. Skip first page */
hwaddr iova_first = tree->iova_first ?: qemu_real_host_page_size;

if (map->translated_addr + map->size < map->translated_addr ||
map->perm == IOMMU_NONE) {
return IOVA_ERR_INVALID;
}

/* Allocate a node in IOVA address */
return iova_tree_alloc_map(tree->iova_taddr_map, map, iova_first,
tree->iova_last);
}

/**
* Remove existing mappings from iova tree
*
* @iova_tree: The vhost iova tree
* @map: The map to remove
*/
void vhost_iova_tree_remove(VhostIOVATree *iova_tree, const DMAMap *map)
{
iova_tree_remove(iova_tree->iova_taddr_map, map);
}
27 changes: 27 additions & 0 deletions hw/virtio/vhost-iova-tree.h
@@ -0,0 +1,27 @@
/*
* vhost software live migration iova tree
*
* SPDX-FileCopyrightText: Red Hat, Inc. 2021
* SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#ifndef HW_VIRTIO_VHOST_IOVA_TREE_H
#define HW_VIRTIO_VHOST_IOVA_TREE_H

#include "qemu/iova-tree.h"
#include "exec/memory.h"

typedef struct VhostIOVATree VhostIOVATree;

VhostIOVATree *vhost_iova_tree_new(uint64_t iova_first, uint64_t iova_last);
void vhost_iova_tree_delete(VhostIOVATree *iova_tree);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(VhostIOVATree, vhost_iova_tree_delete);

const DMAMap *vhost_iova_tree_find_iova(const VhostIOVATree *iova_tree,
const DMAMap *map);
int vhost_iova_tree_map_alloc(VhostIOVATree *iova_tree, DMAMap *map);
void vhost_iova_tree_remove(VhostIOVATree *iova_tree, const DMAMap *map);

#endif

0 comments on commit a72ada1

Please sign in to comment.