[PATCH] drm/i915/gvt: addressed guest GPU hang with HWS index mode

Zhang, Xiaolin xiaolin.zhang at intel.com
Wed Apr 3 04:58:30 UTC 2019


On 04/03/2019 11:59 AM, Zhenyu Wang wrote:
> On 2019.04.03 11:31:17 +0800, Xiaolin Zhang wrote:
>> with the introduce of "switch to use HWS indices rather than address",
>> guest GPU hang observed when running workloads which will update the
>> seqno to the real HW HWSP, not vitural GPU HWSP and then cause GPU hang.
>>
>> this patch is to revoke index mode in PIPE_CTRL and MI_FLUSH_DW and
>> patch guest GPU HWSP address value to these commands.
>>
>> Fixes: 54939ea0b("drm/i915: Switch to use HWS indices rather than
>> addresses")
>>
>> Signed-off-by: Xiaolin Zhang <xiaolin.zhang at intel.com>
>> ---
>>  drivers/gpu/drm/i915/gvt/cmd_parser.c | 25 ++++++++++++++++++++++---
>>  1 file changed, 22 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> index b420919279c7..f976777d7bd5 100644
>> --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
>> @@ -1070,6 +1070,18 @@ static struct cmd_interrupt_event cmd_interrupt_events[] = {
>>  	},
>>  };
>>  
>> +static int index_mode_to_gma(struct parser_exec_state *s, u32 index)
>> +{
>> +	u32 gma;
>> +	u32 val;
>> +
>> +	gma = s->vgpu->hws_pga[s->ring_id] + index;
>> +	patch_value(s, cmd_ptr(s, 2), gma);
>> +	val = cmd_val(s, 1) & (~PIPE_CONTROL_STORE_DATA_INDEX);
>> +	patch_value(s, cmd_ptr(s, 1), val);
> MI_FLUSH_DW uses dword 1 for GMA address or index instead of dword 2, although
> index mode flag for them is both at dword 1, but address offset is different,
> and MI_FLUSH_DW has GGTT/PPGTT flag value in dword 1 which should be preserved.
> Looks better just handle in their handlers.
thanks your great point. I missed this detail information in my patch.
will be corrected in patch V2.
>
>> +	return 0;
>> +}
>> +
>>  static int cmd_handler_pipe_control(struct parser_exec_state *s)
>>  {
>>  	int gmadr_bytes = s->vgpu->gvt->device_info.gmadr_bytes_in_cmd;
>> @@ -1098,8 +1110,11 @@ static int cmd_handler_pipe_control(struct parser_exec_state *s)
>>  				/* Store Data Index */
>>  				if (cmd_val(s, 1) & (1 << 21))
>>  					index_mode = true;
>> -				ret |= cmd_address_audit(s, gma, sizeof(u64),
>> -						index_mode);
>> +				if (index_mode)
>> +					ret = index_mode_to_gma(s, gma);
>> +				else
>> +					ret |= cmd_address_audit(s, gma,
>> +						sizeof(u64), index_mode);
>>  			}
>>  		}
>>  	}
>> @@ -1607,7 +1622,11 @@ static int cmd_handler_mi_flush_dw(struct parser_exec_state *s)
>>  		/* Store Data Index */
>>  		if (cmd_val(s, 0) & (1 << 21))
>>  			index_mode = true;
>> -		ret = cmd_address_audit(s, gma, sizeof(u64), index_mode);
>> +		if (index_mode)
>> +			ret = index_mode_to_gma(s, gma);
>> +		else
>> +			ret = cmd_address_audit(s, gma,
>> +					sizeof(u64), index_mode);
>>  	}
>>  	/* Check notify bit */
>>  	if ((cmd_val(s, 0) & (1 << 8)))
>> -- 
>> 2.15.1
>>



More information about the intel-gvt-dev mailing list