public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* Re: assumptions in acpi drivers
@ 2009-10-10 13:16 Alan Jenkins
  2009-10-10 14:39 ` Bjorn Helgaas
  0 siblings, 1 reply; 6+ messages in thread
From: Alan Jenkins @ 2009-10-10 13:16 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: linux-acpi

>> @@ -315,9 +312,6 @@ static int lis3lv02d_add(struct acpi_device *device)
>>
>>  static int lis3lv02d_remove(struct acpi_device *device, int type)
>>  {
>> -	if (!device)
>> -		return -EINVAL;
>> -
>>  	lis3lv02d_joystick_disable();
>>  	lis3lv02d_poweroff(&lis3_dev);
>
> Same basic issue as the kfree comments below; the fact that this
> remove method doesn't reference "device" is a symptom of a driver
> structure problem (beyond the scope of this patch, obviously).
>

>> @@ -1306,9 +1303,6 @@ end:
>>
>>  static int asus_hotk_remove(struct acpi_device *device, int type)
>>  {
>> -	if (!device || !acpi_driver_data(device))
>> -		return -EINVAL;
>> -
>>  	kfree(hotk->name);
>>  	kfree(hotk);
>
> Separate issue: we should kfree acpi_driver_data(device) here,
> not "hotk".  In general, the "remove" should deal with per-device
> data, not globals.  This driver only deals with a single instance,
> so they happen to be the same in this case, but you have to read
> more of the driver to verify that.
>

>> @@ -1276,9 +1274,6 @@ fail_platform_driver:
>>
>>  static int eeepc_hotk_remove(struct acpi_device *device, int type)
>>  {
>> -	if (!device || !acpi_driver_data(device))
>> -		return -EINVAL;
>> -
>>  	eeepc_backlight_exit();
>>  	eeepc_rfkill_exit();
>>  	eeepc_input_exit();
>
> The current upstream version of this function also has the kfree
> issue.  You're patching a different version, so it might be fixed
> there already.  But it seems like all these hotkey drivers (and the
> accelerometer driver) use the same pattern of assuming they'll only
> see a single device, and then they make assumptions like "hotk ==
> acpi_driver_data(device)".  That's just a bad example for people
> to follow, and might not even be true for things like accelerometers
> where you could imagine having more than one.

I've been thinking about this.  Frankly, I can't imagine a machine
having multiple ACPI accelerometer devices with the same interface.
It doesn't make sense to have multiple instances of any of the drivers
under /platform/.  And many of them create platform devices with fixed
names, so we can't pretend it would work.

Perhaps the best approach is to remove the references to
device->driverdata, and consistently use "hotk" or equivalent.  The
_core_ acpi devices would always provide correct examples of how to
use driverdata.

But we do need to make sure we don't crash if some strange machine has
multiple matching acpi devices.  Something like this -

static atomic_t device_present;

add():
        if (atomic_inc_return(&device_present) != 1)
                 return -EBUSY;

remove():
        atomic_dec(&device_present);


Regards
Alan

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-10-16  9:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-10 13:16 assumptions in acpi drivers Alan Jenkins
2009-10-10 14:39 ` Bjorn Helgaas
2009-10-11 13:39   ` Alan Jenkins
2009-10-12  4:07     ` Bjorn Helgaas
2009-10-16  4:36       ` Dmitry Torokhov
2009-10-16  9:13         ` Alan Jenkins

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox