radv: add radv_sc_read() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 29 Oct 2019 06:43:40 +0000 (17:43 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 30 Oct 2019 04:49:58 +0000 (04:49 +0000)
This is a function with timeout support for reading from the pipe
between processes used for secure compile.

Initially we hardcode the timeout to 5 seconds. We can adjust the
timeout limit in future if needed.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h

index b02483bb94902c0f8354c35931bdc9de98fbfb27..38ff0eb740d87dea68183634af1e8166d3c559c5 100644 (file)
@@ -1994,6 +1994,45 @@ static int install_seccomp_filter() {
        return 0;
 }
 
+/* Helper function with timeout support for reading from the pipe between
+ * processes used for secure compile.
+ */
+bool radv_sc_read(int fd, void *buf, size_t size, bool timeout)
+{
+       fd_set fds;
+       struct timeval tv;
+
+       FD_ZERO(&fds);
+       FD_SET(fd, &fds);
+
+       while (true) {
+               /* We can't rely on the value of tv after calling select() so
+                * we must reset it on each iteration of the loop.
+                */
+               tv.tv_sec = 5;
+               tv.tv_usec = 0;
+
+               int rval = select(fd + 1, &fds, NULL, NULL, timeout ? &tv : NULL);
+
+               if (rval == -1) {
+                       /* select error */
+                       return false;
+               } else if (rval) {
+                       ssize_t bytes_read = read(fd, buf, size);
+                       if (bytes_read < 0)
+                               return false;
+
+                       buf += bytes_read;
+                       size -= bytes_read;
+                       if (size == 0)
+                               return true;
+               } else {
+                       /* select timeout */
+                       return false;
+               }
+       }
+}
+
 static void run_secure_compile_device(struct radv_device *device, unsigned process,
                                      int *fd_secure_input, int *fd_secure_output)
 {
index 12f192ed200ccb442158ca177e2219bd034014f8..99cffc1f1b994009bc8ef9fd0beaaa50cebb7765 100644 (file)
@@ -1151,6 +1151,9 @@ radv_initialise_ds_surface(struct radv_device *device,
                           struct radv_ds_buffer_info *ds,
                           struct radv_image_view *iview);
 
+bool
+radv_sc_read(int fd, void *buf, size_t size, bool timeout);
+
 /**
  * Attachment state when recording a renderpass instance.
  *