• Vishal Verma's avatar
    ACPI: NFIT: fix a potential deadlock during NFIT teardown · fb6df436
    Vishal Verma authored
    Lockdep reports that acpi_nfit_shutdown() may deadlock against an
    opportune acpi_nfit_scrub(). acpi_nfit_scrub () is run from inside a
    'work' and therefore has already acquired workqueue-internal locks. It
    also acquiires acpi_desc->init_mutex. acpi_nfit_shutdown() first
    acquires init_mutex, and was subsequently attempting to cancel any
    pending workqueue items. This reversed locking order causes a potential
    deadlock:
    
        ======================================================
        WARNING: possible circular locking dependency detected
        6.2.0-rc3 #116 Tainted: G           O     N
        ------------------------------------------------------
        libndctl/1958 is trying to acquire lock:
        ffff888129b461c0 ((work_completion)(&(&acpi_desc->dwork)->work)){+.+.}-{0:0}, at: __flush_work+0x43/0x450
    
        but task is already holding lock:
        ffff888129b460e8 (&acpi_desc->init_mutex){+.+.}-{3:3}, at: acpi_nfit_shutdown+0x87/0xd0 [nfit]
    
        which lock already depends on the new lock.
    
        ...
    
        Possible unsafe locking scenario:
    
              CPU0                    CPU1
              ----                    ----
         lock(&acpi_desc->init_mutex);
                                      lock((work_completion)(&(&acpi_desc->dwork)->work));
                                      lock(&acpi_desc->init_mutex);
         lock((work_completion)(&(&acpi_desc->dwork)->work));
    
        *** DEADLOCK ***
    
    Since the workqueue manipulation is protected by its own internal locking,
    the cancellation of pending work doesn't need to be done under
    acpi_desc->init_mutex. Move cancel_delayed_work_sync() outside the
    init_mutex to fix the deadlock. Any work that starts after
    acpi_nfit_shutdown() drops the lock will see ARS_CANCEL, and the
    cancel_delayed_work_sync() will safely flush it out.
    Reported-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarVishal Verma <vishal.l.verma@intel.com>
    Link: https://lore.kernel.org/r/20230112-acpi_nfit_lockdep-v1-1-660be4dd10be@intel.comSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    fb6df436
core.c 93.2 KB