|
|
357786 |
From 6f1ec0b51c03a266c26f3108bbdf45987f01b53f Mon Sep 17 00:00:00 2001
|
|
|
357786 |
From: "plai@redhat.com" <plai@redhat.com>
|
|
|
357786 |
Date: Thu, 21 Jun 2018 18:54:41 +0200
|
|
|
357786 |
Subject: [PATCH 32/57] vhost: allow backends to filter memory sections
|
|
|
357786 |
|
|
|
357786 |
RH-Author: plai@redhat.com
|
|
|
357786 |
Message-id: <1529607285-9942-7-git-send-email-plai@redhat.com>
|
|
|
357786 |
Patchwork-id: 80941
|
|
|
357786 |
O-Subject: [RHEL7.6 PATCH BZ 1526645 06/10] vhost: allow backends to filter memory sections
|
|
|
357786 |
Bugzilla: 1526645
|
|
|
357786 |
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
357786 |
RH-Acked-by: Maxime Coquelin <maxime.coquelin@redhat.com>
|
|
|
357786 |
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
357786 |
|
|
|
357786 |
From: Tiwei Bie <tiwei.bie@intel.com>
|
|
|
357786 |
|
|
|
357786 |
This patch introduces a vhost op for vhost backends to allow
|
|
|
357786 |
them to filter the memory sections that they can handle.
|
|
|
357786 |
|
|
|
357786 |
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
|
|
|
357786 |
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
357786 |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
357786 |
(cherry picked from commit 988a27754bbbc45698f7acb54352e5a1ae699514)
|
|
|
357786 |
Signed-off-by: Paul Lai <plai@redhat.com>
|
|
|
357786 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
357786 |
---
|
|
|
357786 |
hw/virtio/vhost-user.c | 11 +++++++++++
|
|
|
357786 |
hw/virtio/vhost.c | 9 +++++++--
|
|
|
357786 |
include/hw/virtio/vhost-backend.h | 4 ++++
|
|
|
357786 |
3 files changed, 22 insertions(+), 2 deletions(-)
|
|
|
357786 |
|
|
|
357786 |
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
|
|
|
357786 |
index 85d8fd2..ebb946a 100644
|
|
|
357786 |
--- a/hw/virtio/vhost-user.c
|
|
|
357786 |
+++ b/hw/virtio/vhost-user.c
|
|
|
357786 |
@@ -1620,6 +1620,16 @@ vhost_user_crypto_close_session(struct vhost_dev *dev, uint64_t session_id)
|
|
|
357786 |
return 0;
|
|
|
357786 |
}
|
|
|
357786 |
|
|
|
357786 |
+static bool vhost_user_mem_section_filter(struct vhost_dev *dev,
|
|
|
357786 |
+ MemoryRegionSection *section)
|
|
|
357786 |
+{
|
|
|
357786 |
+ bool result;
|
|
|
357786 |
+
|
|
|
357786 |
+ result = memory_region_get_fd(section->mr) >= 0;
|
|
|
357786 |
+
|
|
|
357786 |
+ return result;
|
|
|
357786 |
+}
|
|
|
357786 |
+
|
|
|
357786 |
const VhostOps user_ops = {
|
|
|
357786 |
.backend_type = VHOST_BACKEND_TYPE_USER,
|
|
|
357786 |
.vhost_backend_init = vhost_user_init,
|
|
|
357786 |
@@ -1650,4 +1660,5 @@ const VhostOps user_ops = {
|
|
|
357786 |
.vhost_set_config = vhost_user_set_config,
|
|
|
357786 |
.vhost_crypto_create_session = vhost_user_crypto_create_session,
|
|
|
357786 |
.vhost_crypto_close_session = vhost_user_crypto_close_session,
|
|
|
357786 |
+ .vhost_backend_mem_section_filter = vhost_user_mem_section_filter,
|
|
|
357786 |
};
|
|
|
357786 |
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
|
|
|
357786 |
index 9d5850a..1ae68ff 100644
|
|
|
357786 |
--- a/hw/virtio/vhost.c
|
|
|
357786 |
+++ b/hw/virtio/vhost.c
|
|
|
357786 |
@@ -386,7 +386,7 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
|
|
|
357786 |
return r;
|
|
|
357786 |
}
|
|
|
357786 |
|
|
|
357786 |
-static bool vhost_section(MemoryRegionSection *section)
|
|
|
357786 |
+static bool vhost_section(struct vhost_dev *dev, MemoryRegionSection *section)
|
|
|
357786 |
{
|
|
|
357786 |
bool result;
|
|
|
357786 |
bool log_dirty = memory_region_get_dirty_log_mask(section->mr) &
|
|
|
357786 |
@@ -399,6 +399,11 @@ static bool vhost_section(MemoryRegionSection *section)
|
|
|
357786 |
*/
|
|
|
357786 |
result &= !log_dirty;
|
|
|
357786 |
|
|
|
357786 |
+ if (result && dev->vhost_ops->vhost_backend_mem_section_filter) {
|
|
|
357786 |
+ result &=
|
|
|
357786 |
+ dev->vhost_ops->vhost_backend_mem_section_filter(dev, section);
|
|
|
357786 |
+ }
|
|
|
357786 |
+
|
|
|
357786 |
trace_vhost_section(section->mr->name, result);
|
|
|
357786 |
return result;
|
|
|
357786 |
}
|
|
|
357786 |
@@ -632,7 +637,7 @@ static void vhost_region_addnop(MemoryListener *listener,
|
|
|
357786 |
struct vhost_dev *dev = container_of(listener, struct vhost_dev,
|
|
|
357786 |
memory_listener);
|
|
|
357786 |
|
|
|
357786 |
- if (!vhost_section(section)) {
|
|
|
357786 |
+ if (!vhost_section(dev, section)) {
|
|
|
357786 |
return;
|
|
|
357786 |
}
|
|
|
357786 |
vhost_region_add_section(dev, section);
|
|
|
357786 |
diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h
|
|
|
357786 |
index 5dac61f..81283ec 100644
|
|
|
357786 |
--- a/include/hw/virtio/vhost-backend.h
|
|
|
357786 |
+++ b/include/hw/virtio/vhost-backend.h
|
|
|
357786 |
@@ -101,6 +101,9 @@ typedef int (*vhost_crypto_create_session_op)(struct vhost_dev *dev,
|
|
|
357786 |
typedef int (*vhost_crypto_close_session_op)(struct vhost_dev *dev,
|
|
|
357786 |
uint64_t session_id);
|
|
|
357786 |
|
|
|
357786 |
+typedef bool (*vhost_backend_mem_section_filter_op)(struct vhost_dev *dev,
|
|
|
357786 |
+ MemoryRegionSection *section);
|
|
|
357786 |
+
|
|
|
357786 |
typedef struct VhostOps {
|
|
|
357786 |
VhostBackendType backend_type;
|
|
|
357786 |
vhost_backend_init vhost_backend_init;
|
|
|
357786 |
@@ -138,6 +141,7 @@ typedef struct VhostOps {
|
|
|
357786 |
vhost_set_config_op vhost_set_config;
|
|
|
357786 |
vhost_crypto_create_session_op vhost_crypto_create_session;
|
|
|
357786 |
vhost_crypto_close_session_op vhost_crypto_close_session;
|
|
|
357786 |
+ vhost_backend_mem_section_filter_op vhost_backend_mem_section_filter;
|
|
|
357786 |
} VhostOps;
|
|
|
357786 |
|
|
|
357786 |
extern const VhostOps user_ops;
|
|
|
357786 |
--
|
|
|
357786 |
1.8.3.1
|
|
|
357786 |
|