[igt-dev] [Intel-gfx] [PATCH i-g-t 3/5] i915: Exercise preemption timeout controls in sysfs

Chris Wilson chris at chris-wilson.co.uk
Fri Feb 28 23:32:54 UTC 2020


Quoting Andi Shyti (2020-02-28 23:27:04)
> Hi Chris,
> 
> > +static int create_ext_ioctl(int i915,
> > +                         struct drm_i915_gem_context_create_ext *arg)
> > +{
> > +     int err;
> > +
> > +     err = 0;
> > +     if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, arg)) {
> > +             err = -errno;
> > +             igt_assume(err);
> > +     }
> > +
> > +     errno = 0;
> > +     return err;
> > +}
> > +
> >  /**
> >   * gem_has_contexts:
> >   * @fd: open i915 drm file descriptor
> > @@ -324,17 +339,14 @@ __gem_context_clone(int i915,
> >               .flags = flags | I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
> >               .extensions = to_user_pointer(&clone),
> >       };
> > -     int err = 0;
> > +     int err;
> >  
> > -     if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &arg)) {
> > -             err = -errno;
> > -             igt_assume(err);
> > -     }
> > +     err = create_ext_ioctl(i915, &arg);
> > +     if (err)
> > +             return err;
> >  
> >       *out = arg.ctx_id;
> > -
> > -     errno = 0;
> > -     return err;
> > +     return 0;
> >  }
> >  
> >  static bool __gem_context_has(int i915, uint32_t share, unsigned int flags)
> > @@ -382,16 +394,8 @@ bool gem_has_context_clone(int i915)
> >               .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
> >               .extensions = to_user_pointer(&ext),
> >       };
> > -     int err;
> > -
> > -     err = 0;
> > -     if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &create)) {
> > -             err = -errno;
> > -             igt_assume(err);
> > -     }
> > -     errno = 0;
> >  
> > -     return err == -ENOENT;
> > +     return create_ext_ioctl(i915, &create) == -ENOENT;
> >  }
> 
> I'd like to see the above in a separate patch.

It's part of the test, I can put it back inside each .c if you prefer.

> > +void dyn_sysfs_engines(int i915, int engines, const char *file,
> > +                    void (*test)(int, int))
> > +{
> > +     char buf[512];
> > +     int len;
> > +
> > +     lseek(engines, 0, SEEK_SET);
> > +     while ((len = syscall(SYS_getdents64, engines, buf, sizeof(buf))) > 0) {
> > +             void *ptr = buf;
> > +
> > +             while (len) {
> > +                     struct linux_dirent64 {
> > +                             ino64_t        d_ino;
> > +                             off64_t        d_off;
> > +                             unsigned short d_reclen;
> > +                             unsigned char  d_type;
> > +                             char           d_name[];
> > +                     } *de = ptr;
> 
> what is the need for having your own linux_dirent64?

fdopendir() takes ownership of the fd, preventing reuse. And
fdopendir(dup()) is getting ridiculous.
-Chris


More information about the igt-dev mailing list