Skip to content

Commit

Permalink
ACPI: Do not export hid/modalias sysfs file for ACPI objects without …
Browse files Browse the repository at this point in the history
…a HID

Boot and compile tested.
The fact that pnp.ids can now be empty needs testing on some
further machines, though.

This should handle a "modprobe is wrongly called by udev" issue:
https://bugzilla.kernel.org/show_bug.cgi?id=19162

Modaliase files in
/sys/devices/LNXSYSTM:00/
went down from 113 to 71 on my tested system.

This is a sysfs change, but userspace must already be able to handle it.

Also do not fill up pnp.ids list with a "struct hid"
entry. This comment:
     * This generic ID isn't useful for driver binding, but it provides
     * the useful property that "every acpi_device has an ID."
is still half way true:
Best you never touch pnp.ids list directly or make sure it can be empty,
instead use:
char *acpi_device_hid()
which always returns a value ("device" as a dummy if the object
has no hid).

Signed-off-by: Thomas Renninger <trenn@suse.de>
CC: Zhang Rui <rui.zhang@intel.com>
CC: kay.sievers@vrfy.org
CC: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Thomas Renninger authored and Len Brown committed Oct 1, 2010
1 parent 899611e commit 2b2ae7c
Showing 1 changed file with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ extern struct acpi_device *acpi_root;

#define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent)

/* Should be const */
static char* dummy_hid = "device";

static LIST_HEAD(acpi_device_list);
static LIST_HEAD(acpi_bus_id_list);
DEFINE_MUTEX(acpi_device_lock);
Expand All @@ -49,6 +52,9 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
int count;
struct acpi_hardware_id *id;

if (list_empty(&acpi_dev->pnp.ids))
return 0;

len = snprintf(modalias, size, "acpi:");
size -= len;

Expand Down Expand Up @@ -202,13 +208,15 @@ static int acpi_device_setup_files(struct acpi_device *dev)
goto end;
}

result = device_create_file(&dev->dev, &dev_attr_hid);
if (result)
goto end;
if (!list_empty(&dev->pnp.ids)) {
result = device_create_file(&dev->dev, &dev_attr_hid);
if (result)
goto end;

result = device_create_file(&dev->dev, &dev_attr_modalias);
if (result)
goto end;
result = device_create_file(&dev->dev, &dev_attr_modalias);
if (result)
goto end;
}

/*
* If device has _EJ0, 'eject' file is created that is used to trigger
Expand Down Expand Up @@ -316,6 +324,9 @@ static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env)
struct acpi_device *acpi_dev = to_acpi_device(dev);
int len;

if (list_empty(&acpi_dev->pnp.ids))
return 0;

if (add_uevent_var(env, "MODALIAS="))
return -ENOMEM;
len = create_modalias(acpi_dev, &env->buf[env->buflen - 1],
Expand Down Expand Up @@ -1014,6 +1025,9 @@ char *acpi_device_hid(struct acpi_device *device)
{
struct acpi_hardware_id *hid;

if (list_empty(&device->pnp.ids))
return dummy_hid;

hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list);
return hid->id;
}
Expand Down Expand Up @@ -1142,16 +1156,6 @@ static void acpi_device_set_id(struct acpi_device *device)
acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF);
break;
}

/*
* We build acpi_devices for some objects that don't have _HID or _CID,
* e.g., PCI bridges and slots. Drivers can't bind to these objects,
* but we do use them indirectly by traversing the acpi_device tree.
* This generic ID isn't useful for driver binding, but it provides
* the useful property that "every acpi_device has an ID."
*/
if (list_empty(&device->pnp.ids))
acpi_add_id(device, "device");
}

static int acpi_device_set_context(struct acpi_device *device)
Expand Down

0 comments on commit 2b2ae7c

Please sign in to comment.