mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-02-11 16:45:14 +07:00
drm/i915/gvt: clear the vGPU reset logic
Releasing shadow PPGTT pages is not enough when vGPU reset, the guest page table tracking data should has same life-cycle with all the shadow PPGTT pages; Otherwise there is no chance to re-shadow the PPGTT pages without free the guest page table tracking data. This patch clear the PPGTT reset logic and make the vGPU reset in working order. v2: refactor some logic to avoid code duplicated. v3: remove useless macro and add comments from Christophe. v4: keep reset logic in reset function. Signed-off-by: Ping Gao <ping.a.gao@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
This commit is contained in:
parent
bab0593043
commit
da9cc8de22
@ -2015,6 +2015,22 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
|
||||
return create_scratch_page_tree(vgpu);
|
||||
}
|
||||
|
||||
static void intel_vgpu_free_mm(struct intel_vgpu *vgpu, int type)
|
||||
{
|
||||
struct list_head *pos, *n;
|
||||
struct intel_vgpu_mm *mm;
|
||||
|
||||
list_for_each_safe(pos, n, &vgpu->gtt.mm_list_head) {
|
||||
mm = container_of(pos, struct intel_vgpu_mm, list);
|
||||
if (mm->type == type) {
|
||||
vgpu->gvt->gtt.mm_free_page_table(mm);
|
||||
list_del(&mm->list);
|
||||
list_del(&mm->lru_list);
|
||||
kfree(mm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_vgpu_clean_gtt - clean up per-vGPU graphics memory virulization
|
||||
* @vgpu: a vGPU
|
||||
@ -2027,19 +2043,11 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
|
||||
*/
|
||||
void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct list_head *pos, *n;
|
||||
struct intel_vgpu_mm *mm;
|
||||
|
||||
ppgtt_free_all_shadow_page(vgpu);
|
||||
release_scratch_page_tree(vgpu);
|
||||
|
||||
list_for_each_safe(pos, n, &vgpu->gtt.mm_list_head) {
|
||||
mm = container_of(pos, struct intel_vgpu_mm, list);
|
||||
vgpu->gvt->gtt.mm_free_page_table(mm);
|
||||
list_del(&mm->list);
|
||||
list_del(&mm->lru_list);
|
||||
kfree(mm);
|
||||
}
|
||||
intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
|
||||
intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_GGTT);
|
||||
}
|
||||
|
||||
static void clean_spt_oos(struct intel_gvt *gvt)
|
||||
@ -2322,6 +2330,13 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu, bool dmlr)
|
||||
int i;
|
||||
|
||||
ppgtt_free_all_shadow_page(vgpu);
|
||||
|
||||
/* Shadow pages are only created when there is no page
|
||||
* table tracking data, so remove page tracking data after
|
||||
* removing the shadow pages.
|
||||
*/
|
||||
intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
|
||||
|
||||
if (!dmlr)
|
||||
return;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user