Skip to content

Commit 5367cf1

Browse files
committed
Merge tag 'acpi-5.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI fixes from Rafael Wysocki: "These fix a NULL pointer dereference in the CPPC library code and a locking issue related to printing the names of ACPI device nodes in the device properties framework. Specifics: - Fix NULL pointer dereference in the CPPC library code occuring on hybrid systems without CPPC support (Rafael Wysocki). - Avoid attempts to acquire a semaphore with interrupts off when printing the names of ACPI device nodes and clean up code on top of that fix (Sakari Ailus)" * tag 'acpi-5.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI: CPPC: Add NULL pointer check to cppc_get_perf() ACPI: Make acpi_node_get_parent() local ACPI: Get acpi_device's parent from the parent field
2 parents 0ce629b + 2e13e5a commit 5367cf1

File tree

3 files changed

+13
-17
lines changed

3 files changed

+13
-17
lines changed

drivers/acpi/cppc_acpi.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,14 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
998998
static int cppc_get_perf(int cpunum, enum cppc_regs reg_idx, u64 *perf)
999999
{
10001000
struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
1001-
struct cpc_register_resource *reg = &cpc_desc->cpc_regs[reg_idx];
1001+
struct cpc_register_resource *reg;
1002+
1003+
if (!cpc_desc) {
1004+
pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
1005+
return -ENODEV;
1006+
}
1007+
1008+
reg = &cpc_desc->cpc_regs[reg_idx];
10021009

10031010
if (CPC_IN_PCC(reg)) {
10041011
int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpunum);

drivers/acpi/property.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,21 +1084,17 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
10841084
* Returns parent node of an ACPI device or data firmware node or %NULL if
10851085
* not available.
10861086
*/
1087-
struct fwnode_handle *acpi_node_get_parent(const struct fwnode_handle *fwnode)
1087+
static struct fwnode_handle *
1088+
acpi_node_get_parent(const struct fwnode_handle *fwnode)
10881089
{
10891090
if (is_acpi_data_node(fwnode)) {
10901091
/* All data nodes have parent pointer so just return that */
10911092
return to_acpi_data_node(fwnode)->parent;
10921093
} else if (is_acpi_device_node(fwnode)) {
1093-
acpi_handle handle, parent_handle;
1094-
1095-
handle = to_acpi_device_node(fwnode)->handle;
1096-
if (ACPI_SUCCESS(acpi_get_parent(handle, &parent_handle))) {
1097-
struct acpi_device *adev;
1094+
struct device *dev = to_acpi_device_node(fwnode)->dev.parent;
10981095

1099-
if (!acpi_bus_get_device(parent_handle, &adev))
1100-
return acpi_fwnode_handle(adev);
1101-
}
1096+
if (dev)
1097+
return acpi_fwnode_handle(to_acpi_device(dev));
11021098
}
11031099

11041100
return NULL;

include/linux/acpi.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,6 @@ int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,
11821182

11831183
struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
11841184
struct fwnode_handle *child);
1185-
struct fwnode_handle *acpi_node_get_parent(const struct fwnode_handle *fwnode);
11861185

11871186
struct acpi_probe_entry;
11881187
typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,
@@ -1287,12 +1286,6 @@ acpi_get_next_subnode(const struct fwnode_handle *fwnode,
12871286
return NULL;
12881287
}
12891288

1290-
static inline struct fwnode_handle *
1291-
acpi_node_get_parent(const struct fwnode_handle *fwnode)
1292-
{
1293-
return NULL;
1294-
}
1295-
12961289
static inline struct fwnode_handle *
12971290
acpi_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
12981291
struct fwnode_handle *prev)

0 commit comments

Comments
 (0)