Re: assumptions in acpi drivers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/10/09, Bjorn Helgaas <bjorn.helgaas@xxxxxx> wrote:
> On Sat, 2009-10-10 at 14:16 +0100, Alan Jenkins wrote:
>
>> > 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.
>
> I think the best pattern is something like this:
>
>     struct acpi_device *singleton;
>
>     xxx_add(struct acpi_device *device, ...)
>     {
> 	if (singleton)
> 		return -EINVAL;
>
> 	xxx_data = kzalloc(...);
> 	xxx_data->foo = 0;
>
> 	device->driver_data = xxx_data;
> 	singleton = xxx_data;
> 	return 0;
>     }
>
>     xxx_remove(struct acpi_device *device)
>     {
> 	kfree(acpi_driver_data(device));
>     }
>
> That way the assumption that there's only a single device is confined to
> the add() method.  That makes the rest of the driver easier to read and
> verify because it looks like every other ACPI driver.
>
> Bjorn

Ok, you've prodded me enough to try converting eeepc-laptop.

Doesn't the singleton pattern need to be thread-safe though?  I don't
see any global lock (or a driver-specific one) in device_bind_driver()
or acpi_bind_device().  That's why I suggested atomics earlier.

Regards
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux