[PATCH] drm/i915/gvt: Introduce vGPU mm notifier
Zhi Wang
zhi.a.wang at intel.com
Fri Apr 21 15:32:28 UTC 2017
This patch introduces vGPU mm notifier for clients who may wish to track
guest changing its graphics memory mapping in a vGPU GGTT/PPGTT mm.
Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
---
drivers/gpu/drm/i915/gvt/gtt.c | 63 ++++++++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/i915/gvt/gtt.h | 13 +++++++++
drivers/gpu/drm/i915/gvt/gvt.h | 2 ++
3 files changed, 78 insertions(+)
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index b832bea..d37cc52 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -1570,6 +1570,7 @@ struct intel_vgpu_mm *intel_vgpu_create_mm(struct intel_vgpu *vgpu,
goto fail;
}
+ mm->mm_notifiers = RB_ROOT;
mm->initialized = true;
if (virtual_page_table)
@@ -1807,6 +1808,32 @@ int intel_vgpu_emulate_gtt_mmio_read(struct intel_vgpu *vgpu, unsigned int off,
return ret;
}
+static void notify_mm_mapping_change(struct intel_vgpu_mm *mm, u64 start,
+ u64 end)
+{
+ struct interval_tree_node *it;
+ struct intel_vgpu_mm_notifier *n;
+
+ if (RB_EMPTY_ROOT(&mm->mm_notifiers))
+ return;
+
+ it = interval_tree_iter_first(&mm->mm_notifiers, start, end);
+ do {
+ n = container_of(it, struct intel_vgpu_mm_notifier,
+ node);
+
+ it = interval_tree_iter_next(it, start, end);
+
+ if (!n->mapping_change)
+ continue;
+
+ if (!n->active)
+ continue;
+
+ n->mapping_change(n, start, end);
+ } while (it);
+}
+
static int emulate_gtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
void *p_data, unsigned int bytes)
{
@@ -1848,6 +1875,7 @@ static int emulate_gtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
ops->set_pfn(&m, gvt->gtt.scratch_ggtt_mfn);
}
+ notify_mm_mapping_change(ggtt_mm, gma, gma + GTT_PAGE_SIZE - 1);
ggtt_set_shadow_entry(ggtt_mm, &m, g_gtt_index);
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
return 0;
@@ -2348,3 +2376,38 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu, bool dmlr)
0, PAGE_SIZE);
}
}
+
+/**
+ * intel_vgpu_activate_mm_notifier - activate a vGPU mm notifier
+ * @n: a vGPU mm notifier
+ *
+ * This function is used to start tracking the GMADR mapping change.
+ *
+ * Returns:
+ * Zero on success, negative error code in pointer if failed.
+ */
+int intel_vgpu_activate_mm_notifier(struct intel_vgpu_mm_notifier *n)
+{
+ if (n->active)
+ return -EEXIST;
+
+ n->active = true;
+ interval_tree_insert(&n->node, &n->mm->mm_notifiers);
+
+ return 0;
+}
+
+/**
+ * intel_vgpu_deactivate_mm_notifier - de-activate a vGPU mm notifier
+ * @n: a vGPU mm notifier
+ *
+ * This function is used to stop tracking the GMADR mapping change. If a
+ * client wish to modify the tracking range, it has to stop the tracking
+ * first and then start the tracking again after modifying the range.
+ *
+ */
+void intel_vgpu_deactivate_notifier(struct intel_vgpu_mm_notifier *n)
+{
+ interval_tree_remove(&n->node, &n->mm->mm_notifiers);
+ n->active = false;
+}
diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h
index f88eb5e..95cfe7b 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.h
+++ b/drivers/gpu/drm/i915/gvt/gtt.h
@@ -121,6 +121,18 @@ typedef enum {
GTT_TYPE_MAX,
} intel_gvt_gtt_type_t;
+struct intel_vgpu_mm_notifier {
+ bool active;
+
+ struct intel_vgpu_mm *mm;
+ int (*mapping_change)(struct intel_vgpu_mm_notifier *, u64, u64);
+ struct interval_tree_node node;
+};
+
+extern int intel_vgpu_activate_mm_notifier(struct intel_vgpu_mm_notifier *n);
+
+extern void intel_vgpu_deactivate_mm_notifier(struct intel_vgpu_mm_notifier *n);
+
struct intel_vgpu_mm {
int type;
bool initialized;
@@ -141,6 +153,7 @@ struct intel_vgpu_mm {
atomic_t pincount;
struct list_head lru_list;
struct intel_vgpu *vgpu;
+ struct rb_root mm_notifiers;
};
extern struct intel_gvt_gtt_entry *intel_vgpu_mm_get_entry(
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index becae2f..b3629404 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -33,6 +33,8 @@
#ifndef _GVT_H_
#define _GVT_H_
+#include <linux/interval_tree.h>
+
#include "debug.h"
#include "hypercall.h"
#include "mmio.h"
--
2.7.4
More information about the intel-gvt-dev
mailing list