diff mbox series

drm/i915/ttm: don't leak the ccs state

Message ID 20220727164346.282407-1-matthew.auld@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/ttm: don't leak the ccs state | expand

Commit Message

Matthew Auld July 27, 2022, 4:43 p.m. UTC
The kernel only manages the ccs state with lmem-only objects, however
the kernel should still take care not to leak the CCS state from the
previous user.

Fixes: 48760ffe923a ("drm/i915/gt: Clear compress metadata for Flat-ccs objects")
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_migrate.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

Comments

Ramalingam C July 27, 2022, 11:16 p.m. UTC | #1
> -----Original Message-----
> From: Auld, Matthew <matthew.auld@intel.com>
> Sent: Wednesday, July 27, 2022 10:14 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: dri-devel@lists.freedesktop.org; Thomas Hellström <thomas.hellstrom@linux.intel.com>; C,
> Ramalingam <ramalingam.c@intel.com>
> Subject: [PATCH] drm/i915/ttm: don't leak the ccs state
> 
> The kernel only manages the ccs state with lmem-only objects, however the kernel should still take
> care not to leak the CCS state from the previous user.
> 
> Fixes: 48760ffe923a ("drm/i915/gt: Clear compress metadata for Flat-ccs objects")
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Ramalingam C <ramalingam.c@intel.com>
> ---
>  drivers/gpu/drm/i915/gt/intel_migrate.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c
> index a69b244f14d0..9a0814422ba4 100644
> --- a/drivers/gpu/drm/i915/gt/intel_migrate.c
> +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
> @@ -708,7 +708,7 @@ intel_context_migrate_copy(struct intel_context *ce,
>  	u8 src_access, dst_access;
>  	struct i915_request *rq;
>  	int src_sz, dst_sz;
> -	bool ccs_is_src;
> +	bool ccs_is_src, overwrite_ccs;
>  	int err;
> 
>  	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
> @@ -749,6 +749,8 @@ intel_context_migrate_copy(struct intel_context *ce,
>  			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
>  	}
> 
> +	overwrite_ccs = HAS_FLAT_CCS(i915) && !ccs_bytes_to_cpy &&
> +dst_is_lmem;
> +
>  	src_offset = 0;
>  	dst_offset = CHUNK_SZ;
>  	if (HAS_64K_PAGES(ce->engine->i915)) { @@ -852,6 +854,25 @@
> intel_context_migrate_copy(struct intel_context *ce,
>  			if (err)
>  				goto out_rq;
>  			ccs_bytes_to_cpy -= ccs_sz;
> +		} else if (overwrite_ccs) {
> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
> +			if (err)
> +				goto out_rq;
> +
> +			/*
> +			 * While we can't always restore/manage the CCS state,
> +			 * we still need to ensure we don't leak the CCS state
> +			 * from the previous user, so make sure we overwrite it
> +			 * with something.
> +			 */
> +			err = emit_copy_ccs(rq, dst_offset, INDIRECT_ACCESS,
> +					    dst_offset, DIRECT_ACCESS, len);
> +			if (err)
> +				goto out_rq;
> +
> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
> +			if (err)
> +				goto out_rq;
The change is looking good to the purpose. But shouldn't this be the part of lmem allocation itself?

Ram.
>  		}
> 
>  		/* Arbitration is re-enabled between requests. */
> --
> 2.37.1
Matthew Auld July 28, 2022, 8:08 a.m. UTC | #2
On 28/07/2022 00:16, C, Ramalingam wrote:
>> -----Original Message-----
>> From: Auld, Matthew <matthew.auld@intel.com>
>> Sent: Wednesday, July 27, 2022 10:14 PM
>> To: intel-gfx@lists.freedesktop.org
>> Cc: dri-devel@lists.freedesktop.org; Thomas Hellström <thomas.hellstrom@linux.intel.com>; C,
>> Ramalingam <ramalingam.c@intel.com>
>> Subject: [PATCH] drm/i915/ttm: don't leak the ccs state
>>
>> The kernel only manages the ccs state with lmem-only objects, however the kernel should still take
>> care not to leak the CCS state from the previous user.
>>
>> Fixes: 48760ffe923a ("drm/i915/gt: Clear compress metadata for Flat-ccs objects")
>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>> Cc: Ramalingam C <ramalingam.c@intel.com>
>> ---
>>   drivers/gpu/drm/i915/gt/intel_migrate.c | 23 ++++++++++++++++++++++-
>>   1 file changed, 22 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c
>> index a69b244f14d0..9a0814422ba4 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_migrate.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
>> @@ -708,7 +708,7 @@ intel_context_migrate_copy(struct intel_context *ce,
>>   	u8 src_access, dst_access;
>>   	struct i915_request *rq;
>>   	int src_sz, dst_sz;
>> -	bool ccs_is_src;
>> +	bool ccs_is_src, overwrite_ccs;
>>   	int err;
>>
>>   	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
>> @@ -749,6 +749,8 @@ intel_context_migrate_copy(struct intel_context *ce,
>>   			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
>>   	}
>>
>> +	overwrite_ccs = HAS_FLAT_CCS(i915) && !ccs_bytes_to_cpy &&
>> +dst_is_lmem;
>> +
>>   	src_offset = 0;
>>   	dst_offset = CHUNK_SZ;
>>   	if (HAS_64K_PAGES(ce->engine->i915)) { @@ -852,6 +854,25 @@
>> intel_context_migrate_copy(struct intel_context *ce,
>>   			if (err)
>>   				goto out_rq;
>>   			ccs_bytes_to_cpy -= ccs_sz;
>> +		} else if (overwrite_ccs) {
>> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
>> +			if (err)
>> +				goto out_rq;
>> +
>> +			/*
>> +			 * While we can't always restore/manage the CCS state,
>> +			 * we still need to ensure we don't leak the CCS state
>> +			 * from the previous user, so make sure we overwrite it
>> +			 * with something.
>> +			 */
>> +			err = emit_copy_ccs(rq, dst_offset, INDIRECT_ACCESS,
>> +					    dst_offset, DIRECT_ACCESS, len);
>> +			if (err)
>> +				goto out_rq;
>> +
>> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
>> +			if (err)
>> +				goto out_rq;
> The change is looking good to the purpose. But shouldn't this be the part of lmem allocation itself?

Hmm, what do you mean by the lmem allocation itself? The scenarios I had 
in mind here were:

- { lmem, smem } buffer, object is allocated in smem (like with initial 
mmap) and then moved to lmem (smem -> lmem).

- { lmem, smem } buffer, object is allocated in lmem, but then evicted 
to smem. Object then moved back to lmem (smem -> lmem).

- { lmem, smem} buffer with CPU_ACCESS flag on small-bar system, object 
is allocated in non-mappable lmem, and them moved to the mappable part 
of lmem on fault (lmem -> lmem).

In all the above cases the CCS state is left uninitialised, AFAICT.

> 
> Ram.
>>   		}
>>
>>   		/* Arbitration is re-enabled between requests. */
>> --
>> 2.37.1
>
Ramalingam C July 28, 2022, 9:36 a.m. UTC | #3
> -----Original Message-----
> From: Auld, Matthew <matthew.auld@intel.com>
> Sent: Thursday, July 28, 2022 1:38 PM
> To: C, Ramalingam <ramalingam.c@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: dri-devel@lists.freedesktop.org; Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Subject: Re: [PATCH] drm/i915/ttm: don't leak the ccs state
> 
> On 28/07/2022 00:16, C, Ramalingam wrote:
> >> -----Original Message-----
> >> From: Auld, Matthew <matthew.auld@intel.com>
> >> Sent: Wednesday, July 27, 2022 10:14 PM
> >> To: intel-gfx@lists.freedesktop.org
> >> Cc: dri-devel@lists.freedesktop.org; Thomas Hellström
> >> <thomas.hellstrom@linux.intel.com>; C, Ramalingam
> >> <ramalingam.c@intel.com>
> >> Subject: [PATCH] drm/i915/ttm: don't leak the ccs state
> >>
> >> The kernel only manages the ccs state with lmem-only objects, however
> >> the kernel should still take care not to leak the CCS state from the previous user.
> >>
> >> Fixes: 48760ffe923a ("drm/i915/gt: Clear compress metadata for
> >> Flat-ccs objects")
> >> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> >> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> >> Cc: Ramalingam C <ramalingam.c@intel.com>
> >> ---
> >>   drivers/gpu/drm/i915/gt/intel_migrate.c | 23 ++++++++++++++++++++++-
> >>   1 file changed, 22 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c
> >> b/drivers/gpu/drm/i915/gt/intel_migrate.c
> >> index a69b244f14d0..9a0814422ba4 100644
> >> --- a/drivers/gpu/drm/i915/gt/intel_migrate.c
> >> +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
> >> @@ -708,7 +708,7 @@ intel_context_migrate_copy(struct intel_context *ce,
> >>   	u8 src_access, dst_access;
> >>   	struct i915_request *rq;
> >>   	int src_sz, dst_sz;
> >> -	bool ccs_is_src;
> >> +	bool ccs_is_src, overwrite_ccs;
> >>   	int err;
> >>
> >>   	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
> >> @@ -749,6 +749,8 @@ intel_context_migrate_copy(struct intel_context *ce,
> >>   			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
> >>   	}
> >>
> >> +	overwrite_ccs = HAS_FLAT_CCS(i915) && !ccs_bytes_to_cpy &&
> >> +dst_is_lmem;
> >> +
> >>   	src_offset = 0;
> >>   	dst_offset = CHUNK_SZ;
> >>   	if (HAS_64K_PAGES(ce->engine->i915)) { @@ -852,6 +854,25 @@
> >> intel_context_migrate_copy(struct intel_context *ce,
> >>   			if (err)
> >>   				goto out_rq;
> >>   			ccs_bytes_to_cpy -= ccs_sz;
> >> +		} else if (overwrite_ccs) {
> >> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
> >> +			if (err)
> >> +				goto out_rq;
> >> +
> >> +			/*
> >> +			 * While we can't always restore/manage the CCS state,
> >> +			 * we still need to ensure we don't leak the CCS state
> >> +			 * from the previous user, so make sure we overwrite it
> >> +			 * with something.
> >> +			 */
> >> +			err = emit_copy_ccs(rq, dst_offset, INDIRECT_ACCESS,
> >> +					    dst_offset, DIRECT_ACCESS, len);
> >> +			if (err)
> >> +				goto out_rq;
> >> +
> >> +			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
> >> +			if (err)
> >> +				goto out_rq;
> > The change is looking good to the purpose. But shouldn't this be the part of lmem allocation itself?
> 
> Hmm, what do you mean by the lmem allocation itself? The scenarios I had in mind here were:
> 
> - { lmem, smem } buffer, object is allocated in smem (like with initial
> mmap) and then moved to lmem (smem -> lmem).
> 
> - { lmem, smem } buffer, object is allocated in lmem, but then evicted to smem. Object then moved
> back to lmem (smem -> lmem).
> 
> - { lmem, smem} buffer with CPU_ACCESS flag on small-bar system, object is allocated in non-
> mappable lmem, and them moved to the mappable part of lmem on fault (lmem -> lmem).
> 
> In all the above cases the CCS state is left uninitialised, AFAICT.

As we discussed offline, this will clear the ccs state(old) of the dst lmem in case of migration
from smem to lmem of smem+lmem obj. this seems to be right place to fix the info leak of
previous ccs state.

Reviewed-by: Ramalingam C <ramalingam.c@intel.com>

> 
> >
> > Ram.
> >>   		}
> >>
> >>   		/* Arbitration is re-enabled between requests. */
> >> --
> >> 2.37.1
> >
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c
index a69b244f14d0..9a0814422ba4 100644
--- a/drivers/gpu/drm/i915/gt/intel_migrate.c
+++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
@@ -708,7 +708,7 @@  intel_context_migrate_copy(struct intel_context *ce,
 	u8 src_access, dst_access;
 	struct i915_request *rq;
 	int src_sz, dst_sz;
-	bool ccs_is_src;
+	bool ccs_is_src, overwrite_ccs;
 	int err;
 
 	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
@@ -749,6 +749,8 @@  intel_context_migrate_copy(struct intel_context *ce,
 			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
 	}
 
+	overwrite_ccs = HAS_FLAT_CCS(i915) && !ccs_bytes_to_cpy && dst_is_lmem;
+
 	src_offset = 0;
 	dst_offset = CHUNK_SZ;
 	if (HAS_64K_PAGES(ce->engine->i915)) {
@@ -852,6 +854,25 @@  intel_context_migrate_copy(struct intel_context *ce,
 			if (err)
 				goto out_rq;
 			ccs_bytes_to_cpy -= ccs_sz;
+		} else if (overwrite_ccs) {
+			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
+			if (err)
+				goto out_rq;
+
+			/*
+			 * While we can't always restore/manage the CCS state,
+			 * we still need to ensure we don't leak the CCS state
+			 * from the previous user, so make sure we overwrite it
+			 * with something.
+			 */
+			err = emit_copy_ccs(rq, dst_offset, INDIRECT_ACCESS,
+					    dst_offset, DIRECT_ACCESS, len);
+			if (err)
+				goto out_rq;
+
+			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
+			if (err)
+				goto out_rq;
 		}
 
 		/* Arbitration is re-enabled between requests. */