vhost, pc, virtio features, fixes, cleanups
New features:
VT-d support for devices behind a bridge
vhost-user migration support
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQEcBAABAgAGBQJWKMrnAAoJECgfDbjSjVRpVL0H/iRc31o00QE4nWBRpxUpf8WJ
V5RWE8qKkDgBha5bS5Nt4vs8K4jkkHGXCbmygMidWph96hUPK8/yHy1A/wmpBibB
5hVSPDK8onavNGJwpaWDrkhd9OhKAaKOuu49T6+VWJGZY/uX5ayqmcN934y0NPUa
4EhH5tyxPpYOYeW9i/VOMQ374gCJcpzYBMug4NJZRyFpfz/b2mzAQtoqw3EsPtB0
vpVJ+fKiCyG39HFKQJW7cL12yBeXOoyhjfDxpumLqwLWMfmde+vJwTFx6wbechgV
aU3jIdvUX8wHCNYaB937NsMaDALoGNqUjbpKnf+xD1w7xr9pwTzdyrGH3rpGLEE=
=+G1+
-----END PGP SIGNATURE-----
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
vhost, pc, virtio features, fixes, cleanups
New features:
VT-d support for devices behind a bridge
vhost-user migration support
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
# gpg: Signature made Thu 22 Oct 2015 12:39:19 BST using RSA key ID D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg: aka "Michael S. Tsirkin <mst@redhat.com>"
* remotes/mst/tags/for_upstream: (37 commits)
hw/isa/lpc_ich9: inject the SMI on the VCPU that is writing to APM_CNT
i386: keep cpu_model field in MachineState uptodate
vhost: set the correct queue index in case of migration with multiqueue
piix: fix resource leak reported by Coverity
seccomp: add memfd_create to whitelist
vhost-user-test: check ownership during migration
vhost-user-test: add live-migration test
vhost-user-test: learn to tweak various qemu arguments
vhost-user-test: wrap server in TestServer struct
vhost-user-test: remove useless static check
vhost-user-test: move wait_for_fds() out
vhost: add migration block if memfd failed
vhost-user: use an enum helper for features mask
vhost user: add rarp sending after live migration for legacy guest
vhost user: add support of live migration
net: add trace_vhost_user_event
vhost-user: document migration log
vhost: use a function for each call
vhost-user: add a migration blocker
vhost-user: send log shm fd along with log_base
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ca3e40e233
45 changed files with 5097 additions and 483 deletions
|
|
@ -49,6 +49,7 @@ typedef struct VTDContextCacheEntry VTDContextCacheEntry;
|
|||
typedef struct IntelIOMMUState IntelIOMMUState;
|
||||
typedef struct VTDAddressSpace VTDAddressSpace;
|
||||
typedef struct VTDIOTLBEntry VTDIOTLBEntry;
|
||||
typedef struct VTDBus VTDBus;
|
||||
|
||||
/* Context-Entry */
|
||||
struct VTDContextEntry {
|
||||
|
|
@ -65,7 +66,7 @@ struct VTDContextCacheEntry {
|
|||
};
|
||||
|
||||
struct VTDAddressSpace {
|
||||
uint8_t bus_num;
|
||||
PCIBus *bus;
|
||||
uint8_t devfn;
|
||||
AddressSpace as;
|
||||
MemoryRegion iommu;
|
||||
|
|
@ -73,6 +74,11 @@ struct VTDAddressSpace {
|
|||
VTDContextCacheEntry context_cache_entry;
|
||||
};
|
||||
|
||||
struct VTDBus {
|
||||
PCIBus* bus; /* A reference to the bus to provide translation for */
|
||||
VTDAddressSpace *dev_as[0]; /* A table of VTDAddressSpace objects indexed by devfn */
|
||||
};
|
||||
|
||||
struct VTDIOTLBEntry {
|
||||
uint64_t gfn;
|
||||
uint16_t domain_id;
|
||||
|
|
@ -114,7 +120,13 @@ struct IntelIOMMUState {
|
|||
GHashTable *iotlb; /* IOTLB */
|
||||
|
||||
MemoryRegionIOMMUOps iommu_ops;
|
||||
VTDAddressSpace **address_spaces[VTD_PCI_BUS_MAX];
|
||||
GHashTable *vtd_as_by_busptr; /* VTDBus objects indexed by PCIBus* reference */
|
||||
VTDBus *vtd_as_by_bus_num[VTD_PCI_BUS_MAX]; /* VTDBus objects indexed by bus number */
|
||||
};
|
||||
|
||||
/* Find the VTD Address space associated with the given bus pointer,
|
||||
* create a new one if none exists
|
||||
*/
|
||||
VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ bool pc_machine_is_smm_enabled(PCMachineState *pcms);
|
|||
void pc_register_ferr_irq(qemu_irq irq);
|
||||
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
|
||||
|
||||
void pc_cpus_init(const char *cpu_model);
|
||||
void pc_cpus_init(PCMachineState *pcms);
|
||||
void pc_hot_add_cpu(const int64_t id, Error **errp);
|
||||
void pc_acpi_init(const char *default_dsdt);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@
|
|||
#ifndef VHOST_BACKEND_H_
|
||||
#define VHOST_BACKEND_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef enum VhostBackendType {
|
||||
VHOST_BACKEND_TYPE_NONE = 0,
|
||||
VHOST_BACKEND_TYPE_KERNEL = 1,
|
||||
|
|
@ -19,21 +21,82 @@ typedef enum VhostBackendType {
|
|||
} VhostBackendType;
|
||||
|
||||
struct vhost_dev;
|
||||
struct vhost_log;
|
||||
struct vhost_memory;
|
||||
struct vhost_vring_file;
|
||||
struct vhost_vring_state;
|
||||
struct vhost_vring_addr;
|
||||
struct vhost_scsi_target;
|
||||
|
||||
typedef int (*vhost_call)(struct vhost_dev *dev, unsigned long int request,
|
||||
void *arg);
|
||||
typedef int (*vhost_backend_init)(struct vhost_dev *dev, void *opaque);
|
||||
typedef int (*vhost_backend_cleanup)(struct vhost_dev *dev);
|
||||
typedef int (*vhost_backend_get_vq_index)(struct vhost_dev *dev, int idx);
|
||||
typedef int (*vhost_backend_set_vring_enable)(struct vhost_dev *dev, int enable);
|
||||
typedef int (*vhost_backend_memslots_limit)(struct vhost_dev *dev);
|
||||
|
||||
typedef int (*vhost_net_set_backend_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_file *file);
|
||||
typedef int (*vhost_scsi_set_endpoint_op)(struct vhost_dev *dev,
|
||||
struct vhost_scsi_target *target);
|
||||
typedef int (*vhost_scsi_clear_endpoint_op)(struct vhost_dev *dev,
|
||||
struct vhost_scsi_target *target);
|
||||
typedef int (*vhost_scsi_get_abi_version_op)(struct vhost_dev *dev,
|
||||
int *version);
|
||||
typedef int (*vhost_set_log_base_op)(struct vhost_dev *dev, uint64_t base,
|
||||
struct vhost_log *log);
|
||||
typedef int (*vhost_set_mem_table_op)(struct vhost_dev *dev,
|
||||
struct vhost_memory *mem);
|
||||
typedef int (*vhost_set_vring_addr_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_addr *addr);
|
||||
typedef int (*vhost_set_vring_endian_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_state *ring);
|
||||
typedef int (*vhost_set_vring_num_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_state *ring);
|
||||
typedef int (*vhost_set_vring_base_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_state *ring);
|
||||
typedef int (*vhost_get_vring_base_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_state *ring);
|
||||
typedef int (*vhost_set_vring_kick_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_file *file);
|
||||
typedef int (*vhost_set_vring_call_op)(struct vhost_dev *dev,
|
||||
struct vhost_vring_file *file);
|
||||
typedef int (*vhost_set_features_op)(struct vhost_dev *dev,
|
||||
uint64_t features);
|
||||
typedef int (*vhost_get_features_op)(struct vhost_dev *dev,
|
||||
uint64_t *features);
|
||||
typedef int (*vhost_set_owner_op)(struct vhost_dev *dev);
|
||||
typedef int (*vhost_reset_device_op)(struct vhost_dev *dev);
|
||||
typedef int (*vhost_get_vq_index_op)(struct vhost_dev *dev, int idx);
|
||||
typedef int (*vhost_set_vring_enable_op)(struct vhost_dev *dev,
|
||||
int enable);
|
||||
typedef bool (*vhost_requires_shm_log_op)(struct vhost_dev *dev);
|
||||
typedef int (*vhost_migration_done_op)(struct vhost_dev *dev,
|
||||
char *mac_addr);
|
||||
|
||||
typedef struct VhostOps {
|
||||
VhostBackendType backend_type;
|
||||
vhost_call vhost_call;
|
||||
vhost_backend_init vhost_backend_init;
|
||||
vhost_backend_cleanup vhost_backend_cleanup;
|
||||
vhost_backend_get_vq_index vhost_backend_get_vq_index;
|
||||
vhost_backend_set_vring_enable vhost_backend_set_vring_enable;
|
||||
vhost_backend_memslots_limit vhost_backend_memslots_limit;
|
||||
vhost_net_set_backend_op vhost_net_set_backend;
|
||||
vhost_scsi_set_endpoint_op vhost_scsi_set_endpoint;
|
||||
vhost_scsi_clear_endpoint_op vhost_scsi_clear_endpoint;
|
||||
vhost_scsi_get_abi_version_op vhost_scsi_get_abi_version;
|
||||
vhost_set_log_base_op vhost_set_log_base;
|
||||
vhost_set_mem_table_op vhost_set_mem_table;
|
||||
vhost_set_vring_addr_op vhost_set_vring_addr;
|
||||
vhost_set_vring_endian_op vhost_set_vring_endian;
|
||||
vhost_set_vring_num_op vhost_set_vring_num;
|
||||
vhost_set_vring_base_op vhost_set_vring_base;
|
||||
vhost_get_vring_base_op vhost_get_vring_base;
|
||||
vhost_set_vring_kick_op vhost_set_vring_kick;
|
||||
vhost_set_vring_call_op vhost_set_vring_call;
|
||||
vhost_set_features_op vhost_set_features;
|
||||
vhost_get_features_op vhost_get_features;
|
||||
vhost_set_owner_op vhost_set_owner;
|
||||
vhost_reset_device_op vhost_reset_device;
|
||||
vhost_get_vq_index_op vhost_get_vq_index;
|
||||
vhost_set_vring_enable_op vhost_set_vring_enable;
|
||||
vhost_requires_shm_log_op vhost_requires_shm_log;
|
||||
vhost_migration_done_op vhost_migration_done;
|
||||
} VhostOps;
|
||||
|
||||
extern const VhostOps user_ops;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ typedef unsigned long vhost_log_chunk_t;
|
|||
struct vhost_log {
|
||||
unsigned long long size;
|
||||
int refcnt;
|
||||
vhost_log_chunk_t log[0];
|
||||
int fd;
|
||||
vhost_log_chunk_t *log;
|
||||
};
|
||||
|
||||
struct vhost_memory;
|
||||
|
|
@ -44,14 +45,14 @@ struct vhost_dev {
|
|||
int nvqs;
|
||||
/* the first virtqueue which would be used by this vhost dev */
|
||||
int vq_index;
|
||||
unsigned long long features;
|
||||
unsigned long long acked_features;
|
||||
unsigned long long backend_features;
|
||||
unsigned long long protocol_features;
|
||||
unsigned long long max_queues;
|
||||
uint64_t features;
|
||||
uint64_t acked_features;
|
||||
uint64_t backend_features;
|
||||
uint64_t protocol_features;
|
||||
uint64_t max_queues;
|
||||
bool started;
|
||||
bool log_enabled;
|
||||
unsigned long long log_size;
|
||||
uint64_t log_size;
|
||||
Error *migration_blocker;
|
||||
bool memory_changed;
|
||||
hwaddr mem_changed_start_addr;
|
||||
|
|
@ -59,6 +60,7 @@ struct vhost_dev {
|
|||
const VhostOps *vhost_ops;
|
||||
void *opaque;
|
||||
struct vhost_log *log;
|
||||
QLIST_ENTRY(vhost_dev) entry;
|
||||
};
|
||||
|
||||
int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
|
||||
|
|
@ -83,4 +85,5 @@ uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
|||
uint64_t features);
|
||||
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||
uint64_t features);
|
||||
bool vhost_has_free_slot(void);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ void vhost_net_ack_features(VHostNetState *net, uint64_t features);
|
|||
bool vhost_net_virtqueue_pending(VHostNetState *net, int n);
|
||||
void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
|
||||
int idx, bool mask);
|
||||
int vhost_net_notify_migration_done(VHostNetState *net, char* mac_addr);
|
||||
VHostNetState *get_vhost_net(NetClientState *nc);
|
||||
|
||||
int vhost_set_vring_enable(NetClientState * nc, int enable);
|
||||
|
|
|
|||
26
include/qemu/memfd.h
Normal file
26
include/qemu/memfd.h
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef QEMU_MEMFD_H
|
||||
#define QEMU_MEMFD_H
|
||||
|
||||
#include "config-host.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef F_LINUX_SPECIFIC_BASE
|
||||
#define F_LINUX_SPECIFIC_BASE 1024
|
||||
#endif
|
||||
|
||||
#ifndef F_ADD_SEALS
|
||||
#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
|
||||
#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
|
||||
|
||||
#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */
|
||||
#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */
|
||||
#define F_SEAL_GROW 0x0004 /* prevent file from growing */
|
||||
#define F_SEAL_WRITE 0x0008 /* prevent writes */
|
||||
#endif
|
||||
|
||||
void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals,
|
||||
int *fd);
|
||||
void qemu_memfd_free(void *ptr, size_t size, int fd);
|
||||
bool qemu_memfd_check(void);
|
||||
|
||||
#endif /* QEMU_MEMFD_H */
|
||||
10
include/qemu/mmap-alloc.h
Normal file
10
include/qemu/mmap-alloc.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef QEMU_MMAP_ALLOC
|
||||
#define QEMU_MMAP_ALLOC
|
||||
|
||||
#include "qemu-common.h"
|
||||
|
||||
void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared);
|
||||
|
||||
void qemu_ram_munmap(void *ptr, size_t size);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue