diff mbox

[igt] lib: Assert that the internal gem_create interface matches the ioctl

Message ID 20171003140518.29004-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson Oct. 3, 2017, 2:05 p.m. UTC
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 lib/igt_core.h       | 14 ++++++++++++++
 lib/ioctl_wrappers.c |  4 ++++
 2 files changed, 18 insertions(+)

Comments

Mika Kuoppala Oct. 3, 2017, 2:19 p.m. UTC | #1
Chris Wilson <chris@chris-wilson.co.uk> writes:

> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  lib/igt_core.h       | 14 ++++++++++++++
>  lib/ioctl_wrappers.c |  4 ++++
>  2 files changed, 18 insertions(+)
>
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index f8543d65..f5f65984 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -932,4 +932,18 @@ int igt_system_quiet(const char *command);
>  		free(buf); \
>  	} while (0)
>  
> +/**
> + * igt_typecheck:
> + * @type: The intended type we expect the variable to be
> + * @x: The variable we wish to check
> + *
> + * Performs a *compile-time* check that a variable is of a particular type.
> + */
> +#define igt_typecheck(type, x) ({ \
> +	type __dummy; \
> +        typeof(x) __dummy2; \
> +        (void)(&__dummy == &__dummy2); \
> +        1; \
> +})
> +
>  #endif /* IGT_CORE_H */
> diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> index 87511fc6..0b523fac 100644
> --- a/lib/ioctl_wrappers.c
> +++ b/lib/ioctl_wrappers.c
> @@ -558,6 +558,10 @@ int __gem_create(int fd, uint64_t size, uint32_t *handle)
>  	};
>  	int err = 0;
>  
> +	/* Ensure that our internal interface matches the kernel's */
> +	igt_typecheck(typeof(create.size), size);
> +	igt_typecheck(typeof(create.handle), *handle);

Seems to do what it is missing from the tin :)

Fill the commit message and sprinkle more on the ioctl_wrappers.c?
-Mika

> +
>  	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) == 0)
>  		*handle = create.handle;
>  	else
> -- 
> 2.14.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Chris Wilson Oct. 3, 2017, 2:25 p.m. UTC | #2
Quoting Chris Wilson (2017-10-03 15:05:18)
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  lib/igt_core.h       | 14 ++++++++++++++
>  lib/ioctl_wrappers.c |  4 ++++
>  2 files changed, 18 insertions(+)
> 
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index f8543d65..f5f65984 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -932,4 +932,18 @@ int igt_system_quiet(const char *command);
>                 free(buf); \
>         } while (0)
>  
> +/**
> + * igt_typecheck:
> + * @type: The intended type we expect the variable to be
> + * @x: The variable we wish to check
> + *
> + * Performs a *compile-time* check that a variable is of a particular type.
> + */
> +#define igt_typecheck(type, x) ({ \
> +       type __dummy; \
> +        typeof(x) __dummy2; \
> +        (void)(&__dummy == &__dummy2); \
> +        1; \
> +})
> +
>  #endif /* IGT_CORE_H */
> diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> index 87511fc6..0b523fac 100644
> --- a/lib/ioctl_wrappers.c
> +++ b/lib/ioctl_wrappers.c
> @@ -558,6 +558,10 @@ int __gem_create(int fd, uint64_t size, uint32_t *handle)
>         };
>         int err = 0;
>  
> +       /* Ensure that our internal interface matches the kernel's */
> +       igt_typecheck(typeof(create.size), size);
> +       igt_typecheck(typeof(create.handle), *handle);

Hmm, gcc doesn't allow pointer conversion between unsigned long long and
uint64_t?
-Chris
Chris Wilson Oct. 3, 2017, 2:29 p.m. UTC | #3
Quoting Mika Kuoppala (2017-10-03 15:19:24)
> Chris Wilson <chris@chris-wilson.co.uk> writes:
> 
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> > ---
> >  lib/igt_core.h       | 14 ++++++++++++++
> >  lib/ioctl_wrappers.c |  4 ++++
> >  2 files changed, 18 insertions(+)
> >
> > diff --git a/lib/igt_core.h b/lib/igt_core.h
> > index f8543d65..f5f65984 100644
> > --- a/lib/igt_core.h
> > +++ b/lib/igt_core.h
> > @@ -932,4 +932,18 @@ int igt_system_quiet(const char *command);
> >               free(buf); \
> >       } while (0)
> >  
> > +/**
> > + * igt_typecheck:
> > + * @type: The intended type we expect the variable to be
> > + * @x: The variable we wish to check
> > + *
> > + * Performs a *compile-time* check that a variable is of a particular type.
> > + */
> > +#define igt_typecheck(type, x) ({ \
> > +     type __dummy; \
> > +        typeof(x) __dummy2; \
> > +        (void)(&__dummy == &__dummy2); \
> > +        1; \
> > +})
> > +
> >  #endif /* IGT_CORE_H */
> > diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> > index 87511fc6..0b523fac 100644
> > --- a/lib/ioctl_wrappers.c
> > +++ b/lib/ioctl_wrappers.c
> > @@ -558,6 +558,10 @@ int __gem_create(int fd, uint64_t size, uint32_t *handle)
> >       };
> >       int err = 0;
> >  
> > +     /* Ensure that our internal interface matches the kernel's */
> > +     igt_typecheck(typeof(create.size), size);
> > +     igt_typecheck(typeof(create.handle), *handle);
> 
> Seems to do what it is missing from the tin :)
> 
> Fill the commit message and sprinkle more on the ioctl_wrappers.c?

Testing the waters. Looks sane but gcc doesn't like

igt_typecheck(unsigned long long, size);

and the kernel is using typedef unsigned long long __u64 not uint64_t.
A little bit of a conundrum.
-Chris
diff mbox

Patch

diff --git a/lib/igt_core.h b/lib/igt_core.h
index f8543d65..f5f65984 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -932,4 +932,18 @@  int igt_system_quiet(const char *command);
 		free(buf); \
 	} while (0)
 
+/**
+ * igt_typecheck:
+ * @type: The intended type we expect the variable to be
+ * @x: The variable we wish to check
+ *
+ * Performs a *compile-time* check that a variable is of a particular type.
+ */
+#define igt_typecheck(type, x) ({ \
+	type __dummy; \
+        typeof(x) __dummy2; \
+        (void)(&__dummy == &__dummy2); \
+        1; \
+})
+
 #endif /* IGT_CORE_H */
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 87511fc6..0b523fac 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -558,6 +558,10 @@  int __gem_create(int fd, uint64_t size, uint32_t *handle)
 	};
 	int err = 0;
 
+	/* Ensure that our internal interface matches the kernel's */
+	igt_typecheck(typeof(create.size), size);
+	igt_typecheck(typeof(create.handle), *handle);
+
 	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) == 0)
 		*handle = create.handle;
 	else