[PATCH v3] drm/i915/gvt: clear the vGPU reset logic
Gao, Ping A
ping.a.gao at intel.com
Tue Feb 21 07:10:37 UTC 2017
On 2017/2/21 14:30, Du, Changbin wrote:
> On Tue, Feb 21, 2017 at 01:37:39PM +0800, Ping Gao wrote:
>> 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.
>>
>> Signed-off-by: Ping Gao <ping.a.gao at intel.com>
>> ---
>> drivers/gpu/drm/i915/gvt/gtt.c | 39 ++++++++++++++++++++++++++++-----------
>> 1 file changed, 28 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
>> index 28c9234..acd02f7 100644
>> --- a/drivers/gpu/drm/i915/gvt/gtt.c
>> +++ b/drivers/gpu/drm/i915/gvt/gtt.c
>> @@ -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);
> A list_for_each_entry_safe can be used here. :)
Thanks for comments, if you has special reason to replace all the
list_for_each_safe in this file, better to cook a separate patch to
address that. Let's keep focus.
>> + 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,18 +2043,18 @@ 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);
>> + /* Shadow pages are only created when there is no page
>> + * table tracking data, so remove page tracking data after
>> + * removing the shadow pages.This comment is for vGPU reset
>> + * path.
>> + */
>> + intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
>> +
>> + if (vgpu->resetting == false) {
>> + intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_GGTT);
>> + release_scratch_page_tree(vgpu);
>> }
> This func may read a little confusing. It try to mix reset work with
> clean work, while the name is 'clean'. How about leave
> intel_vgpu_clean_gtt just do clean work, and add below 2 statements
> into intel_vgpu_reset_gtt()?
> ppgtt_free_all_shadow_page(vgpu);
> intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
I think it's no need to distinguish clear/reset so bound, otherwise
clear and reset function would be has some redundant logic in them.
Reset is also kind of clear.
>
> This is more clear for me.
>
>
>> }
>>
>> @@ -2321,7 +2337,8 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu, bool dmlr)
>> {
>> int i;
>>
>> - ppgtt_free_all_shadow_page(vgpu);
>> + intel_vgpu_clean_gtt(vgpu);
>> +
>> if (!dmlr)
>> return;
>>
>> --
>> 2.7.4
>>
>> _______________________________________________
>> intel-gvt-dev mailing list
>> intel-gvt-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
More information about the intel-gvt-dev
mailing list