From 76377de99bf685ada1fbaf9fe38fb80d88d33aeb Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 12 Aug 2021 17:39:15 +0000 Subject: [PATCH] panfrost: Fix leak of render node fd Transfer ownership of the render node fd to the panfrost_device (minor change to panvk), and then close the file descriptor for the render node bound to the panfrost_device when destroying the panfrost_device. Of all the users of panfrost_open_device, panvk is the only one that correctly closed the fd before. Accordingly, this fixes an fd leak in the Gallium driver (and performance counter utilities). This fix still applies to the Gallium driver when renderonly is in use-- although renderonly closes its own fd, the fd is _duplicated_ in panfrost_drm_winsys.c, so renderonly and panfrost must _both_ close their respective fd to fix the leak. This fixes a crash when running dEQP-EGL for more than two hours. dEQP-EGL creates a new screen for every test case and then immediately destroys it. If destroying a screen leaks the fd, this causes the number of open file descriptors to increase monotonically until the process ends. This will eventually hit the system limit for number of open files and abort the process. This bug was identified while attempting to run the OpenGL ES conformance tests via cts-runner, and then confirmed with `lsof`. With the fix, the number of file descriptors reported by `lsof | wc -l` is now constant while running dEQP-EGL as expected. Signed-off-by: Alyssa Rosenzweig Cc: mesa-stable Part-of: --- src/panfrost/lib/pan_props.c | 2 +- src/panfrost/vulkan/panvk_device.c | 2 -- src/panfrost/vulkan/panvk_private.h | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c index 739ba980d83..08596cb3906 100644 --- a/src/panfrost/lib/pan_props.c +++ b/src/panfrost/lib/pan_props.c @@ -291,5 +291,5 @@ panfrost_close_device(struct panfrost_device *dev) pthread_mutex_destroy(&dev->bo_cache.lock); drmFreeVersion(dev->kernel_version); util_sparse_array_finish(&dev->bo_map); - + close(dev->fd); } diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index 62367ac2692..9321525f373 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -201,7 +201,6 @@ panvk_physical_device_finish(struct panvk_physical_device *device) panvk_meta_cleanup(device); panfrost_close_device(&device->pdev); - close(device->local_fd); if (device->master_fd != -1) close(device->master_fd); @@ -297,7 +296,6 @@ panvk_physical_device_init(struct panvk_physical_device *device, } device->master_fd = master_fd; - device->local_fd = fd; device->pdev.debug = PAN_DBG_TRACE; panfrost_open_device(NULL, fd, &device->pdev); diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 986648fe9c6..30d0b6284fc 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -169,7 +169,6 @@ struct panvk_physical_device { struct wsi_device wsi_device; struct panvk_meta meta; - int local_fd; int master_fd; };