• Aaron Lu's avatar
    [libata] acpi: make ata_ap_acpi_handle not block · d66af4df
    Aaron Lu authored
    Since commit 30dcf76a, ata_ap_acpi_handle will always do a namespace
    walk, which requires acquiring an acpi namespace mutex. This made it
    impossible to be used when calling path has held a spinlock.
    
    For example, it can occur in the following code path for pata_acpi:
    ata_scsi_queuecmd (ap->lock is acquired)
      __ata_scsi_queuecmd
        ata_scsi_translate
          ata_qc_issue
            pacpi_qc_issue
              ata_acpi_stm
                ata_ap_acpi_handle
                  acpi_get_child
                    acpi_walk_namespace
                      acpi_ut_acquire_mutex (acquire mutex while holding lock)
    This caused scheduling while atomic bug, as reported in bug #56781.
    
    Actually, ata_ap_acpi_handle doesn't have to walk the namespace every
    time it is called, it can simply return the bound acpi handle on the
    corresponding SCSI host. The reason previously it is not done this way
    is, ata_ap_acpi_handle is used in the binding function
    ata_acpi_bind_host by ata_acpi_gtm when the handle is not bound to the
    SCSI host yet. Since we already have the ATA port's handle in its
    binding function, we can simply use it instead of calling
    ata_ap_acpi_handle there. So introduce a new function __ata_acpi_gtm,
    where it will receive an acpi handle param in addition to the ATA port
    which is solely used for debug statement. With this change, we can make
    ata_ap_acpi_handle simply return the bound handle for SCSI host instead
    of walking the acpi namespace now.
    
    Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=56781
    Reported-and-tested-by: <kenzopl@o2.pl>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAaron Lu <aaron.lu@intel.com>
    Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
    d66af4df
libata-acpi.c 27.4 KB