diff mbox

intel: Add support for server managed fds

Message ID 1394198018-19616-2-git-send-email-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Hans de Goede March 7, 2014, 1:13 p.m. UTC
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 src/intel_device.c | 19 ++++++-------------
 src/intel_module.c |  4 ++++
 2 files changed, 10 insertions(+), 13 deletions(-)

Comments

Chris Wilson March 7, 2014, 1:18 p.m. UTC | #1
On Fri, Mar 07, 2014 at 02:13:38PM +0100, Hans de Goede wrote:
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  src/intel_device.c | 19 ++++++-------------
>  src/intel_module.c |  4 ++++
>  2 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/src/intel_device.c b/src/intel_device.c
> index d0c8092..b19884c 100644
> --- a/src/intel_device.c
> +++ b/src/intel_device.c
> @@ -240,19 +240,10 @@ static char *get_path(struct xf86_platform_device *dev)
>  #endif
>  
>  
> -#if defined(ODEV_ATTRIB_FD) && 0
> +#if defined(ODEV_ATTRIB_FD)
>  static int get_fd(struct xf86_platform_device *dev)
>  {
> -	const char *str;
> -
> -	if (dev == NULL)
> -		return -1;
> -
> -	str = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_FD);
> -	if (str == NULL)
> -		return -1;
> -
> -	return atoi(str);
> +	return xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_FD, -1);
>  }
>  
>  #else
> @@ -270,7 +261,7 @@ int intel_open_device(int entity_num,
>  {
>  	struct intel_device *dev;
>  	char *local_path;
> -	int fd;
> +	int fd, init_master_count = 0;
>  
>  	if (intel_device_key == -1)
>  		intel_device_key = xf86AllocateEntityPrivateIndex();
> @@ -286,6 +277,8 @@ int intel_open_device(int entity_num,
>  	fd = get_fd(platform);
>  	if (fd == -1)
>  		fd = __intel_open_device(pci, &local_path);
> +	else
> +		init_master_count = 1; /* Server fd is already master */

If we set master_count to non-zero, we won't ever call drmDropMaster
(since our get/put will be unbalanced). Does the server manage
DRM_MASTER across VT switches for this fd?
-Chris
Hans de Goede March 7, 2014, 6:18 p.m. UTC | #2
Hi,

On 03/07/2014 02:18 PM, Chris Wilson wrote:
> On Fri, Mar 07, 2014 at 02:13:38PM +0100, Hans de Goede wrote:
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>  src/intel_device.c | 19 ++++++-------------
>>  src/intel_module.c |  4 ++++
>>  2 files changed, 10 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/intel_device.c b/src/intel_device.c
>> index d0c8092..b19884c 100644
>> --- a/src/intel_device.c
>> +++ b/src/intel_device.c
>> @@ -240,19 +240,10 @@ static char *get_path(struct xf86_platform_device *dev)
>>  #endif
>>  
>>  
>> -#if defined(ODEV_ATTRIB_FD) && 0
>> +#if defined(ODEV_ATTRIB_FD)
>>  static int get_fd(struct xf86_platform_device *dev)
>>  {
>> -	const char *str;
>> -
>> -	if (dev == NULL)
>> -		return -1;
>> -
>> -	str = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_FD);
>> -	if (str == NULL)
>> -		return -1;
>> -
>> -	return atoi(str);
>> +	return xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_FD, -1);
>>  }
>>  
>>  #else
>> @@ -270,7 +261,7 @@ int intel_open_device(int entity_num,
>>  {
>>  	struct intel_device *dev;
>>  	char *local_path;
>> -	int fd;
>> +	int fd, init_master_count = 0;
>>  
>>  	if (intel_device_key == -1)
>>  		intel_device_key = xf86AllocateEntityPrivateIndex();
>> @@ -286,6 +277,8 @@ int intel_open_device(int entity_num,
>>  	fd = get_fd(platform);
>>  	if (fd == -1)
>>  		fd = __intel_open_device(pci, &local_path);
>> +	else
>> +		init_master_count = 1; /* Server fd is already master */
> 
> If we set master_count to non-zero, we won't ever call drmDropMaster
> (since our get/put will be unbalanced). Does the server manage
> DRM_MASTER across VT switches for this fd?

Yes (*), so the never calling drmDropMaster is the intention.

Regards,

Hans

*) Well actually this is done by systemd-logind since it requires root
rights, but from the driver POV the server takes care of it. If we IE
get server managed fds on one of the BSD-s, it will no longer be done
by systemd-logind of course, but all that driver really needs to know
is that the server takes care of this one way or the other.
Chris Wilson March 7, 2014, 8:05 p.m. UTC | #3
On Fri, Mar 07, 2014 at 07:18:29PM +0100, Hans de Goede wrote:
> Hi,
> 
> On 03/07/2014 02:18 PM, Chris Wilson wrote:
> > If we set master_count to non-zero, we won't ever call drmDropMaster
> > (since our get/put will be unbalanced). Does the server manage
> > DRM_MASTER across VT switches for this fd?
> 
> Yes (*), so the never calling drmDropMaster is the intention.

Ok. Looks good, please ping when SUPPORTS_SERVER_FD lands upstream.
-Chris
Chris Wilson March 10, 2014, 10:21 p.m. UTC | #4
On Fri, Mar 07, 2014 at 08:05:19PM +0000, Chris Wilson wrote:
> On Fri, Mar 07, 2014 at 07:18:29PM +0100, Hans de Goede wrote:
> > Hi,
> > 
> > On 03/07/2014 02:18 PM, Chris Wilson wrote:
> > > If we set master_count to non-zero, we won't ever call drmDropMaster
> > > (since our get/put will be unbalanced). Does the server manage
> > > DRM_MASTER across VT switches for this fd?
> > 
> > Yes (*), so the never calling drmDropMaster is the intention.
> 
> Ok. Looks good, please ping when SUPPORTS_SERVER_FD lands upstream.

Bumped the dependency of SUPPORTS_SERVER_FD to 1.15.99.902 and pushed.
Thanks,
-Chris
diff mbox

Patch

diff --git a/src/intel_device.c b/src/intel_device.c
index d0c8092..b19884c 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -240,19 +240,10 @@  static char *get_path(struct xf86_platform_device *dev)
 #endif
 
 
-#if defined(ODEV_ATTRIB_FD) && 0
+#if defined(ODEV_ATTRIB_FD)
 static int get_fd(struct xf86_platform_device *dev)
 {
-	const char *str;
-
-	if (dev == NULL)
-		return -1;
-
-	str = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_FD);
-	if (str == NULL)
-		return -1;
-
-	return atoi(str);
+	return xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_FD, -1);
 }
 
 #else
@@ -270,7 +261,7 @@  int intel_open_device(int entity_num,
 {
 	struct intel_device *dev;
 	char *local_path;
-	int fd;
+	int fd, init_master_count = 0;
 
 	if (intel_device_key == -1)
 		intel_device_key = xf86AllocateEntityPrivateIndex();
@@ -286,6 +277,8 @@  int intel_open_device(int entity_num,
 	fd = get_fd(platform);
 	if (fd == -1)
 		fd = __intel_open_device(pci, &local_path);
+	else
+		init_master_count = 1; /* Server fd is already master */
 	if (fd == -1)
 		goto err_path;
 
@@ -298,7 +291,7 @@  int intel_open_device(int entity_num,
 
 	dev->fd = fd;
 	dev->open_count = 0;
-	dev->master_count = 0;
+	dev->master_count = init_master_count;
 	dev->master_node = local_path;
 	dev->render_node = find_render_node(fd);
 	if (dev->render_node == NULL)
diff --git a/src/intel_module.c b/src/intel_module.c
index 51de62a..02062d1 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -419,6 +419,10 @@  static Bool intel_driver_func(ScrnInfoPtr pScrn,
 #endif
 
 		return TRUE;
+#if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(1,15,99,0,0)
+	case SUPPORTS_SERVER_FDS:
+		return TRUE;	
+#endif
 	default:
 		/* Unknown or deprecated function */
 		return FALSE;