Commit 89b59f09 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull more ACPI updates from Rafael Wysocki:
 "These fix a driver bug, clean up two pieces of code and improve the
  fwnode API consistency:

   - Add missing synchronization between interface updates in the ACPI
     battery driver (Rafael Wysocki)

   - Remove open coded check for cpu_feature_enabled() from
     acpi_processor_power_init_bm_check() (Mario Limonciello)

   - Remove redundant rcu_read_lock/unlock() under spinlock from
     ghes_notify_hed() in the ACPI APEI support code (pengdonglin)

   - Make the .get_next_child_node() callback in the ACPI fwnode backend
     skip ACPI devices that are not present for consistency with the
     analogous callback in the OF fwnode backend (Sakari Ailus)"

* tag 'acpi-6.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: property: Return present device nodes only on fwnode interface
  ACPI: APEI: Remove redundant rcu_read_lock/unlock() under spinlock
  ACPI: battery: Add synchronization between interface updates
  x86/acpi/cstate: Remove open coded check for cpu_feature_enabled()
parents abdf766d dd68fd72
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
		 */
		flags->bm_control = 0;
	}
	if (c->x86_vendor == X86_VENDOR_AMD && c->x86 >= 0x17) {
	if (cpu_feature_enabled(X86_FEATURE_ZEN)) {
		/*
		 * For all AMD Zen or newer CPUs that support C3, caches
		 * should not be flushed by software while entering C3
+0 −2
Original line number Diff line number Diff line
@@ -1207,12 +1207,10 @@ static int ghes_notify_hed(struct notifier_block *this, unsigned long event,
	int ret = NOTIFY_DONE;

	spin_lock_irqsave(&ghes_notify_lock_irq, flags);
	rcu_read_lock();
	list_for_each_entry_rcu(ghes, &ghes_hed, list) {
		if (!ghes_proc(ghes))
			ret = NOTIFY_OK;
	}
	rcu_read_unlock();
	spin_unlock_irqrestore(&ghes_notify_lock_irq, flags);

	return ret;
+29 −14
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ enum {

struct acpi_battery {
	struct mutex lock;
	struct mutex sysfs_lock;
	struct mutex update_lock;
	struct power_supply *bat;
	struct power_supply_desc bat_desc;
	struct acpi_device *device;
@@ -904,15 +904,12 @@ static int sysfs_add_battery(struct acpi_battery *battery)

static void sysfs_remove_battery(struct acpi_battery *battery)
{
	mutex_lock(&battery->sysfs_lock);
	if (!battery->bat) {
		mutex_unlock(&battery->sysfs_lock);
	if (!battery->bat)
		return;
	}

	battery_hook_remove_battery(battery);
	power_supply_unregister(battery->bat);
	battery->bat = NULL;
	mutex_unlock(&battery->sysfs_lock);
}

static void find_battery(const struct dmi_header *dm, void *private)
@@ -1072,6 +1069,9 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)

	if (!battery)
		return;

	guard(mutex)(&battery->update_lock);

	old = battery->bat;
	/*
	 * On Acer Aspire V5-573G notifications are sometimes triggered too
@@ -1098,17 +1098,18 @@ static int battery_notify(struct notifier_block *nb,
{
	struct acpi_battery *battery = container_of(nb, struct acpi_battery,
						    pm_nb);
	int result;

	switch (mode) {
	case PM_POST_HIBERNATION:
	case PM_POST_SUSPEND:
	if (mode == PM_POST_SUSPEND || mode == PM_POST_HIBERNATION) {
		guard(mutex)(&battery->update_lock);

		if (!acpi_battery_present(battery))
			return 0;

		if (battery->bat) {
			acpi_battery_refresh(battery);
		} else {
			int result;

			result = acpi_battery_get_info(battery);
			if (result)
				return result;
@@ -1120,7 +1121,6 @@ static int battery_notify(struct notifier_block *nb,

		acpi_battery_init_alarm(battery);
		acpi_battery_get_state(battery);
		break;
	}

	return 0;
@@ -1198,6 +1198,8 @@ static int acpi_battery_update_retry(struct acpi_battery *battery)
{
	int retry, ret;

	guard(mutex)(&battery->update_lock);

	for (retry = 5; retry; retry--) {
		ret = acpi_battery_update(battery, false);
		if (!ret)
@@ -1208,6 +1210,13 @@ static int acpi_battery_update_retry(struct acpi_battery *battery)
	return ret;
}

static void sysfs_battery_cleanup(struct acpi_battery *battery)
{
	guard(mutex)(&battery->update_lock);

	sysfs_remove_battery(battery);
}

static int acpi_battery_add(struct acpi_device *device)
{
	int result = 0;
@@ -1230,7 +1239,7 @@ static int acpi_battery_add(struct acpi_device *device)
	if (result)
		return result;

	result = devm_mutex_init(&device->dev, &battery->sysfs_lock);
	result = devm_mutex_init(&device->dev, &battery->update_lock);
	if (result)
		return result;

@@ -1262,7 +1271,7 @@ static int acpi_battery_add(struct acpi_device *device)
	device_init_wakeup(&device->dev, 0);
	unregister_pm_notifier(&battery->pm_nb);
fail:
	sysfs_remove_battery(battery);
	sysfs_battery_cleanup(battery);

	return result;
}
@@ -1281,6 +1290,9 @@ static void acpi_battery_remove(struct acpi_device *device)

	device_init_wakeup(&device->dev, 0);
	unregister_pm_notifier(&battery->pm_nb);

	guard(mutex)(&battery->update_lock);

	sysfs_remove_battery(battery);
}

@@ -1297,6 +1309,9 @@ static int acpi_battery_resume(struct device *dev)
		return -EINVAL;

	battery->update_time = 0;

	guard(mutex)(&battery->update_lock);

	acpi_battery_update(battery, true);
	return 0;
}
+23 −1
Original line number Diff line number Diff line
@@ -1388,6 +1388,28 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
	return NULL;
}

/*
 * acpi_get_next_present_subnode - Return the next present child node handle
 * @fwnode: Firmware node to find the next child node for.
 * @child: Handle to one of the device's child nodes or a null handle.
 *
 * Like acpi_get_next_subnode(), but the device nodes returned by
 * acpi_get_next_present_subnode() are guaranteed to be present.
 *
 * Returns: The fwnode handle of the next present sub-node.
 */
static struct fwnode_handle *
acpi_get_next_present_subnode(const struct fwnode_handle *fwnode,
			      struct fwnode_handle *child)
{
	do {
		child = acpi_get_next_subnode(fwnode, child);
	} while (is_acpi_device_node(child) &&
		 !acpi_device_is_present(to_acpi_device_node(child)));

	return child;
}

/**
 * acpi_node_get_parent - Return parent fwnode of this fwnode
 * @fwnode: Firmware node whose parent to get
@@ -1722,7 +1744,7 @@ static int acpi_fwnode_irq_get(const struct fwnode_handle *fwnode,
		.property_read_string_array =				\
			acpi_fwnode_property_read_string_array,		\
		.get_parent = acpi_node_get_parent,			\
		.get_next_child_node = acpi_get_next_subnode,		\
		.get_next_child_node = acpi_get_next_present_subnode,	\
		.get_named_child_node = acpi_fwnode_get_named_child_node, \
		.get_name = acpi_fwnode_get_name,			\
		.get_name_prefix = acpi_fwnode_get_name_prefix,		\