[igt-dev] [PATCH i-g-t 1/1] lib/intel_allocator: Check validity of the file descriptor

Petri Latvala petri.latvala at intel.com
Thu Jun 17 06:42:51 UTC 2021


On Thu, Jun 17, 2021 at 08:06:46AM +0200, Zbigniew Kempczyński wrote:
> On Wed, Jun 16, 2021 at 03:05:50PM +0300, Petri Latvala wrote:
> > On Wed, Jun 16, 2021 at 01:37:14PM +0200, Andrzej Turko wrote:
> > > All procedures for opening particular types of allocators
> > > query the gtt size. Even if the user has provided the
> > > boundaries of the address space managed by the allocator,
> > > the query is performed for the sake of validation.
> > > 
> > > gem_aperture_size() called with an invalid id returns a
> > > default value instead of failing. Thus, we need to
> > > additionally check whether the file descriptor is valid.
> > > 
> > > Signed-off-by: Andrzej Turko <andrzej.turko at linux.intel.com>
> > > Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > > ---
> > >  lib/intel_allocator.c | 11 +++++++++++
> > >  1 file changed, 11 insertions(+)
> > > 
> > > diff --git a/lib/intel_allocator.c b/lib/intel_allocator.c
> > > index 96f839d4b..c060e10c3 100644
> > > --- a/lib/intel_allocator.c
> > > +++ b/lib/intel_allocator.c
> > > @@ -166,6 +166,15 @@ static inline void map_entry_free_func(struct igt_map_entry *entry)
> > >  	free(entry->data);
> > >  }
> > >  
> > > +static bool can_report_gtt_size(int fd)
> > > +{
> > > +	struct drm_i915_gem_context_param p = {
> > > +		.param = I915_CONTEXT_PARAM_GTT_SIZE
> > > +	};
> > > +
> > > +	return (__gem_context_get_param(fd, &p) == 0);
> > > +}
> > > +
> > >  static uint64_t __handle_create(struct allocator *al)
> > >  {
> > >  	struct handle_entry *h = malloc(sizeof(*h));
> > > @@ -271,6 +280,8 @@ static struct intel_allocator *intel_allocator_create(int fd,
> > >  {
> > >  	struct intel_allocator *ial = NULL;
> > >  
> > > +	igt_assert(can_report_gtt_size(fd));
> > > +
> > 
> > Is igt_assert correct here (as opposed to igt_require)? Or in other
> > words, is inability to report gtt size a kernel bug or not?
> 
> In this case yes, we want to assert. Let me try to explain the scenario.
> 
> 
> 1. allocator thread acts for children, for example we got 
>    fd i915 == 3 and ctx == 0
> 
> 2. child 1 does: 
>    
>    ahnd = intel_allocator_open(i915 == 3, ctx == 0);
> 
>    -> allocator (inside simple) calls gem_aperture_size(i915)
>       to find out vm size - this works perfect
> 
> 3. child 2 does: 
>    
>    i915 = gem_reopen_driver(i915);
>    ahnd = intel_allocator_open(i915 == 5, ctx == 0);
> 
>    -> allocator does same what child 1, but gem_aperture_size(i915)
>       is called on invalid from allocator process handle. 
>    
> Current implementation of gem_aperture_size() calls 
> gem_global_aperture_size() what resets errno on error returning
> predefined 256MB size.
> 
> We want to avoid such mistakes in the future in allocator. Plan is:
> 
> 1. introduce igt_assert() on such case. Currently does nothing because
>    there's no test who does child 2 scenario (but soon will be).
> 
> 2. put failing test to api_intel_allocator.c (which exercise above 
>    child 2 scenario).
> 
> 3. fix allocator -> drop calling gem_aperture_size() on allocator
>    thread and move it to the caller (it has active fd to kernel).
>    Thats will drop allocator thread i915 fd dependency and this 
>    is what we want.
> 
> One scenario is we cannot handle - two or more children reopens 
> driver. In such case they may have same i915 fd so they starts
> sharing vm instead having separate. But we still have possibility
> to use (i915, vm) as a key so in such scenario we may use child
> pid as vmid, then each child will have separate vm for allocations.
> Or if child will call intel_allocator_init() it will totally 
> drop allocator thread arbitration -> this reinitializes allocator
> data within child so it comes standalone allocator.


Yeah assert sounds more proper then. Although the best would be an
igt_assert_igt_is_broken_dont_blame_the_kernel() but one must use what
one has...


-- 
Petri Latvala


More information about the igt-dev mailing list