mirror of https://github.com/xemu-project/xemu.git
vhost: allow backends to filter memory sections
This patch introduces a vhost op for vhost backends to allow them to filter the memory sections that they can handle. Signed-off-by: Tiwei Bie <tiwei.bie@intel.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
63b88968f1
commit
988a27754b
|
@ -1620,6 +1620,16 @@ vhost_user_crypto_close_session(struct vhost_dev *dev, uint64_t session_id)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vhost_user_mem_section_filter(struct vhost_dev *dev,
|
||||||
|
MemoryRegionSection *section)
|
||||||
|
{
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
result = memory_region_get_fd(section->mr) >= 0;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
const VhostOps user_ops = {
|
const VhostOps user_ops = {
|
||||||
.backend_type = VHOST_BACKEND_TYPE_USER,
|
.backend_type = VHOST_BACKEND_TYPE_USER,
|
||||||
.vhost_backend_init = vhost_user_init,
|
.vhost_backend_init = vhost_user_init,
|
||||||
|
@ -1650,4 +1660,5 @@ const VhostOps user_ops = {
|
||||||
.vhost_set_config = vhost_user_set_config,
|
.vhost_set_config = vhost_user_set_config,
|
||||||
.vhost_crypto_create_session = vhost_user_crypto_create_session,
|
.vhost_crypto_create_session = vhost_user_crypto_create_session,
|
||||||
.vhost_crypto_close_session = vhost_user_crypto_close_session,
|
.vhost_crypto_close_session = vhost_user_crypto_close_session,
|
||||||
|
.vhost_backend_mem_section_filter = vhost_user_mem_section_filter,
|
||||||
};
|
};
|
||||||
|
|
|
@ -386,7 +386,7 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool vhost_section(MemoryRegionSection *section)
|
static bool vhost_section(struct vhost_dev *dev, MemoryRegionSection *section)
|
||||||
{
|
{
|
||||||
bool result;
|
bool result;
|
||||||
bool log_dirty = memory_region_get_dirty_log_mask(section->mr) &
|
bool log_dirty = memory_region_get_dirty_log_mask(section->mr) &
|
||||||
|
@ -399,6 +399,11 @@ static bool vhost_section(MemoryRegionSection *section)
|
||||||
*/
|
*/
|
||||||
result &= !log_dirty;
|
result &= !log_dirty;
|
||||||
|
|
||||||
|
if (result && dev->vhost_ops->vhost_backend_mem_section_filter) {
|
||||||
|
result &=
|
||||||
|
dev->vhost_ops->vhost_backend_mem_section_filter(dev, section);
|
||||||
|
}
|
||||||
|
|
||||||
trace_vhost_section(section->mr->name, result);
|
trace_vhost_section(section->mr->name, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -632,7 +637,7 @@ static void vhost_region_addnop(MemoryListener *listener,
|
||||||
struct vhost_dev *dev = container_of(listener, struct vhost_dev,
|
struct vhost_dev *dev = container_of(listener, struct vhost_dev,
|
||||||
memory_listener);
|
memory_listener);
|
||||||
|
|
||||||
if (!vhost_section(section)) {
|
if (!vhost_section(dev, section)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vhost_region_add_section(dev, section);
|
vhost_region_add_section(dev, section);
|
||||||
|
|
|
@ -101,6 +101,9 @@ typedef int (*vhost_crypto_create_session_op)(struct vhost_dev *dev,
|
||||||
typedef int (*vhost_crypto_close_session_op)(struct vhost_dev *dev,
|
typedef int (*vhost_crypto_close_session_op)(struct vhost_dev *dev,
|
||||||
uint64_t session_id);
|
uint64_t session_id);
|
||||||
|
|
||||||
|
typedef bool (*vhost_backend_mem_section_filter_op)(struct vhost_dev *dev,
|
||||||
|
MemoryRegionSection *section);
|
||||||
|
|
||||||
typedef struct VhostOps {
|
typedef struct VhostOps {
|
||||||
VhostBackendType backend_type;
|
VhostBackendType backend_type;
|
||||||
vhost_backend_init vhost_backend_init;
|
vhost_backend_init vhost_backend_init;
|
||||||
|
@ -138,6 +141,7 @@ typedef struct VhostOps {
|
||||||
vhost_set_config_op vhost_set_config;
|
vhost_set_config_op vhost_set_config;
|
||||||
vhost_crypto_create_session_op vhost_crypto_create_session;
|
vhost_crypto_create_session_op vhost_crypto_create_session;
|
||||||
vhost_crypto_close_session_op vhost_crypto_close_session;
|
vhost_crypto_close_session_op vhost_crypto_close_session;
|
||||||
|
vhost_backend_mem_section_filter_op vhost_backend_mem_section_filter;
|
||||||
} VhostOps;
|
} VhostOps;
|
||||||
|
|
||||||
extern const VhostOps user_ops;
|
extern const VhostOps user_ops;
|
||||||
|
|
Loading…
Reference in New Issue