drm/i915/gvt: fix double free bug in split_2MB_gtt_entry
commit 4a61648af68f5ba4884f0e3b494ee1cabc4b6620 upstream.
If intel_gvt_dma_map_guest_page failed, it will call
ppgtt_invalidate_spt, which will finally free the spt.
But the caller function ppgtt_populate_spt_by_guest_entry
does not notice that, it will free spt again in its error
path.
Fix this by canceling the mapping of DMA address and freeing sub_spt.
Besides, leave the handle of spt destroy to caller function instead
of callee function when error occurs.
Fixes: b901b252b6
("drm/i915/gvt: Add 2M huge gtt support")
Signed-off-by: Zheng Wang <zyytlz.wz@163.com>
Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20221229165641.1192455-1-zyytlz.wz@163.com
Signed-off-by: Ovidiu Panait <ovidiu.panait@eng.windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
100cf2af1b
commit
787ef0db01
@ -1186,10 +1186,8 @@ static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
|
|||||||
for_each_shadow_entry(sub_spt, &sub_se, sub_index) {
|
for_each_shadow_entry(sub_spt, &sub_se, sub_index) {
|
||||||
ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu,
|
ret = intel_gvt_hypervisor_dma_map_guest_page(vgpu,
|
||||||
start_gfn + sub_index, PAGE_SIZE, &dma_addr);
|
start_gfn + sub_index, PAGE_SIZE, &dma_addr);
|
||||||
if (ret) {
|
if (ret)
|
||||||
ppgtt_invalidate_spt(spt);
|
goto err;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
sub_se.val64 = se->val64;
|
sub_se.val64 = se->val64;
|
||||||
|
|
||||||
/* Copy the PAT field from PDE. */
|
/* Copy the PAT field from PDE. */
|
||||||
@ -1208,6 +1206,17 @@ static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
|
|||||||
ops->set_pfn(se, sub_spt->shadow_page.mfn);
|
ops->set_pfn(se, sub_spt->shadow_page.mfn);
|
||||||
ppgtt_set_shadow_entry(spt, se, index);
|
ppgtt_set_shadow_entry(spt, se, index);
|
||||||
return 0;
|
return 0;
|
||||||
|
err:
|
||||||
|
/* Cancel the existing addess mappings of DMA addr. */
|
||||||
|
for_each_present_shadow_entry(sub_spt, &sub_se, sub_index) {
|
||||||
|
gvt_vdbg_mm("invalidate 4K entry\n");
|
||||||
|
ppgtt_invalidate_pte(sub_spt, &sub_se);
|
||||||
|
}
|
||||||
|
/* Release the new allocated spt. */
|
||||||
|
trace_spt_change(sub_spt->vgpu->id, "release", sub_spt,
|
||||||
|
sub_spt->guest_page.gfn, sub_spt->shadow_page.type);
|
||||||
|
ppgtt_free_spt(sub_spt);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int split_64KB_gtt_entry(struct intel_vgpu *vgpu,
|
static int split_64KB_gtt_entry(struct intel_vgpu *vgpu,
|
||||||
|
Loading…
Reference in New Issue
Block a user