[PATCH] drm/i915/gvt: clear the vGPU reset logic

Gao, Ping A ping.a.gao at intel.com
Mon Feb 20 04:44:39 UTC 2017


On 2017/2/20 11:04, Zhenyu Wang wrote:
> On 2017.02.20 10:01:22 +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.
>>
>> Signed-off-by: Ping Gao <ping.a.gao at intel.com>
>> ---
>>  drivers/gpu/drm/i915/gvt/gtt.c | 33 ++++++++++++++++++++++++++++++++-
>>  1 file changed, 32 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
>> index 28c9234..77fe681 100644
>> --- a/drivers/gpu/drm/i915/gvt/gtt.c
>> +++ b/drivers/gpu/drm/i915/gvt/gtt.c
>> @@ -2309,6 +2309,36 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
>>  }
>>  
>>  /**
>> + * intel_vgpu_reset_ppgtt - free all the ppgtt entries and the
>> + * guest page table tracking data.
>> + * @vgpu: a vGPU
>> + *
>> + * This function is called during vGPU reset.
>> + *
>> + */
>> +static void intel_vgpu_reset_ppgtt(struct intel_vgpu *vgpu)
>> +{
>> +	struct list_head *pos, *n;
>> +	struct intel_vgpu_mm *mm;
>> +
>> +	ppgtt_free_all_shadow_page(vgpu);
>> +
>> +	/* The guest page table tracking data should free also after
>> +	 * free all the shadow pages, otherwise there is no chance
>> +	 * to create those shadow pages again when it's need.
>> +	 */
>> +	list_for_each_safe(pos, n, &vgpu->gtt.mm_list_head) {
>> +		mm = container_of(pos, struct intel_vgpu_mm, list);
>> +		if (mm->type == INTEL_GVT_MM_PPGTT) {
>> +			vgpu->gvt->gtt.mm_free_page_table(mm);
>> +			list_del(&mm->list);
>> +			list_del(&mm->lru_list);
>> +			kfree(mm);
>> +		}
>> +	}
>> +}
>> +
> hmm, could we do some refactor cleanup of this with intel_vgpu_clean_gtt()?
> Don't like more duplicated code.

How about reuse the function intel_vgpu_clean_gtt like below use
vgpu->resetting to distinguish normal usage and reset usage?

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);

    if (vgpu->resetting = =false)
        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_reset_gtt - reset the all GTT related status
>>   * @vgpu: a vGPU
>>   * @dmlr: true for vGPU Device Model Level Reset, false for GT Reset
>> @@ -2321,7 +2351,8 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu, bool dmlr)
>>  {
>>  	int i;
>>  
>> -	ppgtt_free_all_shadow_page(vgpu);
>> +	intel_vgpu_reset_ppgtt(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