drm/i915/gvt: vGPU graphics memory virtualization
The vGPU graphics memory emulation framework is responsible for graphics memory table virtualization. Under virtualization environment, a VM will populate the page table entry with guest page frame number(GPFN/GFN), while HW needs a page table filled with MFN(Machine frame number). The relationship between GFN and MFN(Machine frame number) is managed by hypervisor, while GEN HW doesn't have such knowledge to translate a GFN. To solve this gap, shadow GGTT/PPGTT page table is introdcued. For GGTT, the GFN inside the guest GGTT page table entry will be translated into MFN and written into physical GTT MMIO registers when guest write virtual GTT MMIO registers. For PPGTT, a shadow PPGTT page table will be created and write-protected translated from guest PPGTT page table. And the shadow page table root pointers will be written into the shadow context after a guest workload is shadowed. vGPU graphics memory emulation framework consists: - Per-GEN HW platform page table entry bits extract/de-extract routines. - GTT MMIO register emulation handlers, which will call hypercall to do GFN->MFN translation when guest write GTT MMIO register - PPGTT shadow page table routines, e.g. shadow create/destroy/out-of-sync Signed-off-by: Zhi Wang <zhi.a.wang@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
This commit is contained in:
@@ -39,6 +39,191 @@
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM gvt
|
||||
|
||||
TRACE_EVENT(spt_alloc,
|
||||
TP_PROTO(int id, void *spt, int type, unsigned long mfn,
|
||||
unsigned long gpt_gfn),
|
||||
|
||||
TP_ARGS(id, spt, type, mfn, gpt_gfn),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, id)
|
||||
__field(void *, spt)
|
||||
__field(int, type)
|
||||
__field(unsigned long, mfn)
|
||||
__field(unsigned long, gpt_gfn)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->id = id;
|
||||
__entry->spt = spt;
|
||||
__entry->type = type;
|
||||
__entry->mfn = mfn;
|
||||
__entry->gpt_gfn = gpt_gfn;
|
||||
),
|
||||
|
||||
TP_printk("VM%d [alloc] spt %p type %d mfn 0x%lx gfn 0x%lx\n",
|
||||
__entry->id,
|
||||
__entry->spt,
|
||||
__entry->type,
|
||||
__entry->mfn,
|
||||
__entry->gpt_gfn)
|
||||
);
|
||||
|
||||
TRACE_EVENT(spt_free,
|
||||
TP_PROTO(int id, void *spt, int type),
|
||||
|
||||
TP_ARGS(id, spt, type),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, id)
|
||||
__field(void *, spt)
|
||||
__field(int, type)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->id = id;
|
||||
__entry->spt = spt;
|
||||
__entry->type = type;
|
||||
),
|
||||
|
||||
TP_printk("VM%u [free] spt %p type %d\n",
|
||||
__entry->id,
|
||||
__entry->spt,
|
||||
__entry->type)
|
||||
);
|
||||
|
||||
#define MAX_BUF_LEN 256
|
||||
|
||||
TRACE_EVENT(gma_index,
|
||||
TP_PROTO(const char *prefix, unsigned long gma,
|
||||
unsigned long index),
|
||||
|
||||
TP_ARGS(prefix, gma, index),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"%s gma 0x%lx index 0x%lx\n", prefix, gma, index);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(gma_translate,
|
||||
TP_PROTO(int id, char *type, int ring_id, int pt_level,
|
||||
unsigned long gma, unsigned long gpa),
|
||||
|
||||
TP_ARGS(id, type, ring_id, pt_level, gma, gpa),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d %s ring %d pt_level %d gma 0x%lx -> gpa 0x%lx\n",
|
||||
id, type, ring_id, pt_level, gma, gpa);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(spt_refcount,
|
||||
TP_PROTO(int id, char *action, void *spt, int before, int after),
|
||||
|
||||
TP_ARGS(id, action, spt, before, after),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d [%s] spt %p before %d -> after %d\n",
|
||||
id, action, spt, before, after);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(spt_change,
|
||||
TP_PROTO(int id, char *action, void *spt, unsigned long gfn,
|
||||
int type),
|
||||
|
||||
TP_ARGS(id, action, spt, gfn, type),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d [%s] spt %p gfn 0x%lx type %d\n",
|
||||
id, action, spt, gfn, type);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(gpt_change,
|
||||
TP_PROTO(int id, const char *tag, void *spt, int type, u64 v,
|
||||
unsigned long index),
|
||||
|
||||
TP_ARGS(id, tag, spt, type, v, index),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d [%s] spt %p type %d entry 0x%llx index 0x%lx\n",
|
||||
id, tag, spt, type, v, index);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(oos_change,
|
||||
TP_PROTO(int id, const char *tag, int page_id, void *gpt, int type),
|
||||
|
||||
TP_ARGS(id, tag, page_id, gpt, type),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d [oos %s] page id %d gpt %p type %d\n",
|
||||
id, tag, page_id, gpt, type);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(oos_sync,
|
||||
TP_PROTO(int id, int page_id, void *gpt, int type, u64 v,
|
||||
unsigned long index),
|
||||
|
||||
TP_ARGS(id, page_id, gpt, type, v, index),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array(char, buf, MAX_BUF_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
snprintf(__entry->buf, MAX_BUF_LEN,
|
||||
"VM%d [oos sync] page id %d gpt %p type %d entry 0x%llx index 0x%lx\n",
|
||||
id, page_id, gpt, type, v, index);
|
||||
),
|
||||
|
||||
TP_printk("%s", __entry->buf)
|
||||
);
|
||||
|
||||
#endif /* _GVT_TRACE_H_ */
|
||||
|
||||
/* This part must be out of protection */
|
||||
|
Reference in New Issue
Block a user