Message ID | 55DDB45D.2030901@arm.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Marc nad Lorenzo, First of all appologies for breaking arm64 (again) and thank you for debugging effort. I own you. > - count is only incremented when max_entries != 0, as you noticed You are right, sorry for that, it's fixed in v3. > - With max_entries != 0, count now represent the sum of all matches > Is that expected? I have no strong opinion on that one. All of the x86 ACPI entries handling only checks for count < 0, or uses count from the acpi_subtable_proc structure (and that's why I didn't noticed the mainline breakage). If you think it's not correct or less usable than other approach, let me know. > - The proc iteration stops after the first match. Why? So, the initial implementation of the acpi_parse_entries accepted single handler for the ACPI table. Now, with this change, assumption is that different handlers for different tables/subtables are passed, meaning only one can meet entry->type == proc[i].id condition. mainline breakage). This approach saves one local varaible, but I don't think this is ultimate argument :) > - The test for max_entries is done inside the proc loop. Why? That's obviously wrong in context of the overall wrong counting. > [...] this should be documented and agreed upon. I've added description with assumptions. Again, if you think it's not correct, let me know. Tomasz Nowicki wrote: > should acpi_table_parse_entries suppose to be removed above? Thanks for pointing this out. I've missed implementation of acpi_table_parse_entries when was backporting initial patch. I've added it back. Cheers, Lukasz -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 1217e41..f06327f 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -249,19 +249,24 @@ acpi_parse_entries(char *id, unsigned long table_size, while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) < table_end) { + bool match = false; + + if (max_entries && count >= max_entries) + break; for (i = 0; i < proc_num; i++) { if (entry->type != proc[i].id) continue; - if (max_entries && count++ >= max_entries) - continue; if (proc[i].handler(entry, table_end)) { proc[i].count = -EINVAL; return -EINVAL; } proc[i].count++; - break; + match = true; } + if (match) + count++; + /* * If entry->length is 0, break from this loop to avoid * infinite loop.