lkml.org 
[lkml]   [2017]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH v4 2/4] ACPICA: Tables: Add mechanism to allow to balance late stage acpi_get_table() independently
    Date
    On Tuesday, May 09, 2017 01:57:41 PM Lv Zheng wrote:
    > For all frequent late stage acpi_get_table() clone invocations, we should
    > only change them altogether, otherwise, excessive acpi_put_table() could
    > unexpectedly unmap the table used by the other users. Thus the current plan
    > is to change all acpi_get_table() clones together or to change none of
    > them. However in practical, this is not convenient as this can prevent
    > kernel developers' efforts of improving the late stage code quality before
    > waiting for the ACPICA upstream to improve first.
    >
    > This patch adds a validation count threashold, when it is reached, the
    > validation count can no longer be incremented/decremented to invalidate the
    > table descriptor (means preventing table unmappings) so that acpi_put_table()
    > balance changes can be done independently to each others. Lv Zheng.
    >
    > Cc: Dan Williams <dan.j.williams@intel.com>
    > Signed-off-by: Lv Zheng <lv.zheng@intel.com>
    > ---
    > drivers/acpi/acpica/tbutils.c | 24 +++++++++++++++---------
    > include/acpi/actbl.h | 9 +++++++++
    > 2 files changed, 24 insertions(+), 9 deletions(-)
    >
    > diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c
    > index 7abe665..04beafc 100644
    > --- a/drivers/acpi/acpica/tbutils.c
    > +++ b/drivers/acpi/acpica/tbutils.c
    > @@ -416,9 +416,13 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc,
    > }
    > }
    >
    > - table_desc->validation_count++;
    > - if (table_desc->validation_count == 0) {
    > - table_desc->validation_count--;
    > + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) {
    > + table_desc->validation_count++;
    > + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) {
    > + ACPI_WARNING((AE_INFO,
    > + "Table %p, Validation count overflows\n",
    > + table_desc));
    > + }
    > }
    >
    > *out_table = table_desc->pointer;
    > @@ -445,13 +449,15 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc)
    >
    > ACPI_FUNCTION_TRACE(acpi_tb_put_table);
    >
    > - if (table_desc->validation_count == 0) {
    > - ACPI_WARNING((AE_INFO,
    > - "Table %p, Validation count is zero before decrement\n",
    > - table_desc));
    > - return_VOID;
    > + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) {
    > + table_desc->validation_count--;
    > + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) {

    Is this going to ever trigger?

    We've already verified that validation_count is not 0 and that it is less than
    ACPI_MAX_TABLE_VALIDATIONS and we have decremented it, so how can it be
    greater than or equal to ACPI_MAX_TABLE_VALIDATIONS here?

    > + ACPI_WARNING((AE_INFO,
    > + "Table %p, Validation count underflows\n",
    > + table_desc));
    > + return_VOID;
    > + }
    > }
    > - table_desc->validation_count--;
    >
    > if (table_desc->validation_count == 0) {
    >

    Thanks,
    Rafael

    \
     
     \ /
      Last update: 2017-05-12 23:11    [W:6.702 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site