[igt-dev] [PATCH i-g-t] tests/dumb_buffer: page_size for create_clear

Chris Wilson chris at chris-wilson.co.uk
Wed Feb 5 14:01:47 UTC 2020


Quoting Ramalingam C (2020-02-05 13:55:32)
> For the dumb_buffer at clear_create test we need to detect the correct page
> size for the buffer size calculation.
> 
> We create the least sized buffer and see the page aligned size returned
> from kernel, which is minimum page size kernel will allocate.
> 
> Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
> cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  tests/dumb_buffer.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/tests/dumb_buffer.c b/tests/dumb_buffer.c
> index ad854c0696e7..de0501873e59 100644
> --- a/tests/dumb_buffer.c
> +++ b/tests/dumb_buffer.c
> @@ -52,8 +52,6 @@
>  
>  IGT_TEST_DESCRIPTION("This is a test for the generic dumb buffer interface.");
>  
> -#define PAGE_SIZE 4096
> -
>  static int __dumb_create(int fd, struct drm_mode_create_dumb *create)
>  {
>         int err = 0;
> @@ -225,6 +223,7 @@ struct thread_clear {
>         _Atomic(uint64_t) max;
>         int timeout;
>         int fd;
> +       unsigned long page_size;
>  };
>  
>  #define MAX_PAGE_TO_REQUEST    102400
> @@ -247,14 +246,12 @@ static void *thread_clear(void *data)
>  
>                 for (uint64_t _npages = npages; npages > 0; npages -= _npages) {
>                         create.bpp = 32;
> -                       create.width = PAGE_SIZE / (create.bpp / 8);
> +                       create.width = arg->page_size / (create.bpp / 8);
>                         _npages = npages <= MAX_PAGE_TO_REQUEST ? npages :
>                                   MAX_PAGE_TO_REQUEST;
>                         create.height = _npages;
>  
>                         dumb_create(fd, &create);
> -                       igt_assert_eq(PAGE_SIZE * create.height, create.size);
> -
>                         ptr = dumb_map(fd,
>                                        create.handle, create.size,
>                                        PROT_WRITE);
> @@ -286,7 +283,7 @@ static void sigprobe(int sig)
>         longjmp(sigjmp, sig);
>  }
>  
> -static uint64_t estimate_largest_dumb_buffer(int fd)
> +static uint64_t estimate_largest_dumb_buffer(int fd, unsigned long page_size)
>  {
>         sighandler_t old_sigbus = signal(SIGBUS, sigprobe);
>         sighandler_t old_sigsegv = signal(SIGSEGV, sigprobe);
> @@ -307,7 +304,7 @@ static uint64_t estimate_largest_dumb_buffer(int fd)
>  
>                 igt_info("Largest dumb buffer sucessfully created: %'"PRIu64" bytes\n",
>                          largest);
> -               return largest / PAGE_SIZE;
> +               return largest / page_size;
>         }
>  
>         for (create.height = 1; create.height; create.height *= 2) {
> @@ -334,13 +331,23 @@ static void always_clear(int fd, int timeout)
>         struct thread_clear arg = {
>                 .fd = fd,
>                 .timeout = timeout,
> -               .max = estimate_largest_dumb_buffer(fd), /* in pages */
>         };
>         const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
> +       struct drm_mode_create_dumb create = {
> +               .bpp = 32,
> +               .width = 1, /* in pixels */
> +               .height = 1, /* in rows */
> +       };
>         unsigned long checked;
>         pthread_t thread[ncpus];
>         void *result;
>  
> +       dumb_create(fd, &create);
> +       arg.page_size = create.size;
> +       dumb_destroy(fd, create.handle);

Push this to its own function so we can document the intent concisely.
arg.page_size = probe_page_size(fd) ?

> +       arg.max = estimate_largest_dumb_buffer(fd, arg.page_size);

But we might as well return bytes here and / arg.page_size ourselves.
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the igt-dev mailing list