kms/impl-device: Add function to get a non-master fd

Add meta_kms_impl_device_open_non_privileged_fd() that returns a
non-master file descriptor for a MetaKmsImplDevice.

It'll be required to implement wp_drm_lease_device_v1_send_drm_fd() in a
future commit.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3746>
This commit is contained in:
José Expósito 2024-04-19 16:54:40 +02:00 committed by Marge Bot
parent 4a5fcef38d
commit 4e4d88e537
2 changed files with 49 additions and 0 deletions

View File

@ -20,6 +20,7 @@
#include "backends/native/meta-kms-impl-device.h" #include "backends/native/meta-kms-impl-device.h"
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <glib/gstdio.h> #include <glib/gstdio.h>
#include <linux/dma-buf.h> #include <linux/dma-buf.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -1193,6 +1194,52 @@ meta_kms_impl_device_get_fd (MetaKmsImplDevice *impl_device)
return meta_device_file_get_fd (priv->device_file); return meta_device_file_get_fd (priv->device_file);
} }
/**
* meta_kms_impl_device_open_non_privileged_fd:
* @impl_device: a #MetaKmsImplDevice object
*
* Returns a non-master file descriptor for the given impl_device. The caller is
* responsable of closing the file descriptor.
*
* On error, returns a negative value.
*/
int
meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device)
{
int fd;
const char *path;
MetaKmsImplDevicePrivate *priv =
meta_kms_impl_device_get_instance_private (impl_device);
if (!priv->device_file)
return -1;
path = meta_device_file_get_path (priv->device_file);
fd = open (path, O_RDWR | O_CLOEXEC);
if (fd < 0)
{
meta_topic (META_DEBUG_KMS,
"Error getting non-master fd for device at '%s': %s",
path,
g_strerror (errno));
return -1;
}
if (drmIsMaster (fd))
{
if (drmDropMaster (fd) < 0)
{
meta_topic (META_DEBUG_KMS,
"Error dropping master for device at '%s'",
path);
return -1;
}
}
return fd;
}
/** /**
* meta_kms_impl_device_get_signaled_sync_file: * meta_kms_impl_device_get_signaled_sync_file:
* @impl_device: a #MetaKmsImplDevice object * @impl_device: a #MetaKmsImplDevice object

View File

@ -165,6 +165,8 @@ void meta_kms_impl_device_hold_fd (MetaKmsImplDevice *impl_device);
void meta_kms_impl_device_unhold_fd (MetaKmsImplDevice *impl_device); void meta_kms_impl_device_unhold_fd (MetaKmsImplDevice *impl_device);
int meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device);
int meta_kms_impl_device_get_signaled_sync_file (MetaKmsImplDevice *impl_device); int meta_kms_impl_device_get_signaled_sync_file (MetaKmsImplDevice *impl_device);
MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device, MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,