Skip to contentSkip to conversation

apple-gmux: Assign apple_gmux_data before registering

PATCH In review Lukas Wunner 3 participants 5 messages Nov 9, 2015 – Nov 23, 2015 x86 platform drivers

lore
Share & tools
lore
#0 lore raw

cover apple-gmux: Assign apple_gmux_data before registering

Hi Darren,

the following patch is a useful fix for apple-gmux by Matthew Garrett which is well over a year old but unfortunately never got merged.

The commit message makes it sound as if the fix is only needed for reprobing (in case apple-gmux registers after the DRM drivers). I'm not yet sure if we'll use reprobing or deferred initialization, however the patch is needed even if we go with deferred initialization as it fixes a race condition that is triggered by invoking a handler callback between the call to vga_switcheroo_register_handler() and the assignment of apple_gmux_data.

The patch has seen extensive testing and is actively used by myself and others on various MacBook Pro models.

Could you take a look at the patch and (barring any objections) ack it?

Thanks,

Lukas

Matthew Garrett (1):
apple-gmux: Assign apple_gmux_data before registering

 drivers/platform/x86/apple-gmux.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
Signature · 6 lines
1.8.5.2 (Apple Git-48)

_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
#1 lore raw

PATCH 1/1 apple-gmux: Assign apple_gmux_data before registering

From: Matthew Garrett <[email protected]>

Registering the handler after both GPUs will trigger a DDC switch for connector reprobing. This will oops if apple_gmux_data hasn't already been assigned. Reorder the code to do that.

    [MBP  5,3 2009  nvidia MCP79 + G96        pre-retina  15"]
    [MBP  6,2 2010  intel ILK + nvidia GT216  pre-retina  15"]
    [MBP  9,1 2012  intel IVB + nvidia GK107  pre-retina  15"]
[MBP 8,2 2011 intel SNB + amd turks pre-retina 15"]
    [MBP 11,3 2013  intel HSW + nvidia GK107  retina      15"]
---
 drivers/platform/x86/apple-gmux.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/platform/x86/apple-gmux.c +6 -4
index 976efeb..aa58d41 100644
@@ -588,18 +588,20 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 		gmux_data->gpe = -1;
 	}
 
+	apple_gmux_data = gmux_data;
+	init_completion(&gmux_data->powerchange_done);
+	gmux_enable_interrupts(gmux_data);
+
 	if (vga_switcheroo_register_handler(&gmux_handler)) {
 		ret = -ENODEV;
 		goto err_register_handler;
 	}
 
-	init_completion(&gmux_data->powerchange_done);
-	apple_gmux_data = gmux_data;
-	gmux_enable_interrupts(gmux_data);
-
 	return 0;
 
 err_register_handler:
+	gmux_disable_interrupts(gmux_data);
+	apple_gmux_data = NULL;
 	if (gmux_data->gpe >= 0)
 		acpi_disable_gpe(NULL, gmux_data->gpe);
 err_enable_gpe:
Signature · 6 lines
1.8.5.2 (Apple Git-48)

_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
#3 lore raw
In reply to Lukas Wunner

Hi Lukas,

Please send the patch to the list and maintainers reported by get_maintainer.pl (specifically the platform-driver-x86 list and my infradead ID) so we can have the review on list.

Thanks,

Quoted 29 lines · Lukas Wunner

Hi Darren,

the following patch is a useful fix for apple-gmux by Matthew Garrett which is well over a year old but unfortunately never got merged.

The commit message makes it sound as if the fix is only needed for reprobing (in case apple-gmux registers after the DRM drivers). I'm not yet sure if we'll use reprobing or deferred initialization, however the patch is needed even if we go with deferred initialization as it fixes a race condition that is triggered by invoking a handler callback between the call to vga_switcheroo_register_handler() and the assignment of apple_gmux_data.

The patch has seen extensive testing and is actively used by myself and others on various MacBook Pro models.

Could you take a look at the patch and (barring any objections) ack it?

Thanks,

Lukas

Matthew Garrett (1):
apple-gmux: Assign apple_gmux_data before registering

 drivers/platform/x86/apple-gmux.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
Signature · 6 lines
Darren Hart
Intel Open Source Technology Center
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
#4 lore raw

PATCH 1/1 apple-gmux: Assign apple_gmux_data before registering

In reply to Lukas Wunner

From: Matthew Garrett <[email protected]>

Registering the handler after both GPUs will trigger a DDC switch for connector reprobing. This will oops if apple_gmux_data hasn't already been assigned. Reorder the code to do that.

[Lukas: More generally, this commit fixes a race condition that is triggered by invoking a handler callback between the call to vga_switcheroo_register_handler() and the assignment of apple_gmux_data.]

    [MBP  5,3 2009  nvidia MCP79 + G96        pre-retina  15"]
    [MBP  6,2 2010  intel ILK + nvidia GT216  pre-retina  15"]
    [MBP  9,1 2012  intel IVB + nvidia GK107  pre-retina  15"]
[MBP 8,2 2011 intel SNB + amd turks pre-retina 15"]
    [MBP 11,3 2013  intel HSW + nvidia GK107  retina      15"]
---
 drivers/platform/x86/apple-gmux.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/platform/x86/apple-gmux.c +6 -4
index 976efeb..aa58d41 100644
@@ -588,18 +588,20 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 		gmux_data->gpe = -1;
 	}
 
+	apple_gmux_data = gmux_data;
+	init_completion(&gmux_data->powerchange_done);
+	gmux_enable_interrupts(gmux_data);
+
 	if (vga_switcheroo_register_handler(&gmux_handler)) {
 		ret = -ENODEV;
 		goto err_register_handler;
 	}
 
-	init_completion(&gmux_data->powerchange_done);
-	apple_gmux_data = gmux_data;
-	gmux_enable_interrupts(gmux_data);
-
 	return 0;
 
 err_register_handler:
+	gmux_disable_interrupts(gmux_data);
+	apple_gmux_data = NULL;
 	if (gmux_data->gpe >= 0)
 		acpi_disable_gpe(NULL, gmux_data->gpe);
 err_enable_gpe:
Signature · 1 line
1.8.5.2 (Apple Git-48)
#2 lore raw
In reply to Lukas Wunner
Quoted 17 lines · Lukas Wunner

From: Matthew Garrett <[email protected]>

Registering the handler after both GPUs will trigger a DDC switch for connector reprobing. This will oops if apple_gmux_data hasn't already been assigned. Reorder the code to do that.

[Lukas: More generally, this commit fixes a race condition that is triggered by invoking a handler callback between the call to vga_switcheroo_register_handler() and the assignment of apple_gmux_data.]

    [MBP  5,3 2009  nvidia MCP79 + G96        pre-retina  15"]
    [MBP  6,2 2010  intel ILK + nvidia GT216  pre-retina  15"]
    [MBP  9,1 2012  intel IVB + nvidia GK107  pre-retina  15"]
Quoted 8 lines
[MBP 8,2 2011 intel SNB + amd turks pre-retina 15"]
    [MBP 11,3 2013  intel HSW + nvidia GK107  retina      15"]

My apologies for the delay. Thank you for the testing data and submitting.

I have queued this to testing. Pending success on 0-day, it will land in linux-next shortly (tomorrow most likely) where I hope it will receive additional testing.

Signature · 6 lines
Darren Hart
Intel Open Source Technology Center
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel