Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'net-pull-request' of https://github.com/jasowang/qemu into…
… 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
Showing
10 changed files
with
1,584 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Oops, something went wrong.