From: Timothy Arceri Date: Wed, 13 Nov 2019 03:51:48 +0000 (+1100) Subject: radv: add a secure_compile_open_fifo_fds() helper X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1663bb1f772dacadaec2d80f8286cfb76c4bb200;p=mesa.git radv: add a secure_compile_open_fifo_fds() helper This will be used to create a communication pipe between the user facing device and a freshly forked (per pipeline compile) slim copy of that device. We can't use pipe() here because the fork will not be a direct fork of the user facing process. Instead we use a previously forked copy of the process that was forked at device creation in order to reduce the resources required for the fork and avoid performance issues. Fixes: cff53da3748d ("radv: enable secure compile support") --- diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index dbdaa442c83..20ebc2924de 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -2209,6 +2209,49 @@ static bool radv_close_all_fds(const int *keep_fds, int keep_fd_count) return true; } +static bool secure_compile_open_fifo_fds(struct radv_secure_compile_state *sc, + int *fd_server, int *fd_client, + unsigned process, bool make_fifo) +{ + bool result = false; + char *fifo_server_path = NULL; + char *fifo_client_path = NULL; + + if (asprintf(&fifo_server_path, "/tmp/radv_server_%s_%u", sc->uid, process) == -1) + goto open_fifo_exit; + + if (asprintf(&fifo_client_path, "/tmp/radv_client_%s_%u", sc->uid, process) == -1) + goto open_fifo_exit; + + if (make_fifo) { + int file1 = mkfifo(fifo_server_path, 0666); + if(file1 < 0) + goto open_fifo_exit; + + int file2 = mkfifo(fifo_client_path, 0666); + if(file2 < 0) + goto open_fifo_exit; + } + + *fd_server = open(fifo_server_path, O_RDWR); + if(*fd_server < 1) + goto open_fifo_exit; + + *fd_client = open(fifo_client_path, O_RDWR); + if(*fd_client < 1) { + close(*fd_server); + goto open_fifo_exit; + } + + result = true; + +open_fifo_exit: + free(fifo_server_path); + free(fifo_client_path); + + return result; +} + static void run_secure_compile_device(struct radv_device *device, unsigned process, int fd_secure_input, int fd_secure_output) {