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:
Tiwei Bie 2018-05-24 18:33:31 +08:00 committed by Michael S. Tsirkin
parent 63b88968f1
commit 988a27754b
3 changed files with 22 additions and 2 deletions

View file

@ -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,
}; };

View file

@ -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);

View file

@ -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;