Search Linux Wireless

[PATCH] iwlwifi: fix bad unlock balance

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[   98.083245] =====================================
[   98.083433] [ BUG: bad unlock balance detected! ]
[   98.083568] -------------------------------------
[   98.083704] pm-hibernate/4366 is trying to release lock (&priv->mutex) at:
[   98.083913] [<c0000000003e5c4c>] .mutex_unlock+0x18/0x2c
[   98.084077] but there are no more locks to release!
[   98.084217] 
[   98.084218] other info that might help us debug this:
[   98.084405] 3 locks held by pm-hibernate/4366:
[   98.084533]  #0:  (&buffer->mutex){--..}, at: [<c00000000013b708>] .sysfs_write_file+0x58/0x19c
[   98.084813]  #1:  (pm_mutex#2){--..}, at: [<c00000000008c130>] .hibernate+0x30/0x248
[   98.085072]  #2:  (dpm_mtx){--..}, at: [<c0000000002ab7e4>] .device_resume+0x44/0x74
[   98.085324] 
[   98.085325] stack backtrace:
[   98.085450] Call Trace:
[   98.085521] [c000000112da7320] [c00000000000e9d8] .show_stack+0x78/0x1a4 (unreliable)
[   98.085764] [c000000112da73d0] [c00000000000eb24] .dump_stack+0x20/0x34
[   98.085966] [c000000112da7450] [c00000000007a764] .print_unlock_inbalance_bug+0xf0/0x11c
[   98.086211] [c000000112da74f0] [c00000000007ded8] .lock_release_non_nested+0x108/0x1e8
[   98.086450] [c000000112da75a0] [c00000000007e16c] .lock_release+0x1b4/0x208
[   98.086662] [c000000112da7650] [c0000000003e5b64] .__mutex_unlock_slowpath+0x104/0x1d4
[   98.086901] [c000000112da76f0] [c0000000003e5c4c] .mutex_unlock+0x18/0x2c
[   98.087109] [c000000112da7770] [d0000000001bff04] .iwl4965_pci_resume+0x8f8/0x92c [iwl4965]


which is pretty obvious:

static int iwl4965_pci_resume(struct pci_dev *pdev)
{
        struct iwl4965_priv *priv = pci_get_drvdata(pdev);
        int err;

        printk(KERN_INFO "Coming out of suspend...\n");   

        pci_set_power_state(pdev, PCI_D0);
        err = pci_enable_device(pdev);
        pci_restore_state(pdev);

        /*
         * Suspend/Resume resets the PCI configuration space, so we have to
         * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
         * from interfering with C3 CPU state. pci_restore_state won't help
         * here since it only restores the first 64 bytes pci config header.
         */
        pci_write_config_byte(pdev, 0x41, 0x00);
 
        iwl4965_resume(priv);
        mutex_unlock(&priv->mutex);                  /*** not locked!! ***/
 
        return 0;
}


The bad unlock was introduced in
c282d1fb959806b3c6644f5e31bd58a7f0b48b1b after both lock and unlock had
been removed in b24d22b1d12c436a86282347868785207cff8a88.

Signed-off-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>

--- everything.orig/drivers/net/wireless/iwlwifi/iwl3945-base.c	2008-01-11 11:21:24.649360569 +0100
+++ everything/drivers/net/wireless/iwlwifi/iwl3945-base.c	2008-01-11 11:21:32.269330729 +0100
@@ -8582,7 +8582,6 @@ static int iwl3945_pci_resume(struct pci
 	pci_write_config_byte(pdev, 0x41, 0x00);
 
 	iwl3945_resume(priv);
-	mutex_unlock(&priv->mutex);
 
 	return 0;
 }
--- everything.orig/drivers/net/wireless/iwlwifi/iwl4965-base.c	2008-01-11 11:21:17.499335721 +0100
+++ everything/drivers/net/wireless/iwlwifi/iwl4965-base.c	2008-01-11 11:21:20.959331923 +0100
@@ -9146,7 +9146,6 @@ static int iwl4965_pci_resume(struct pci
 	pci_write_config_byte(pdev, 0x41, 0x00);
 
 	iwl4965_resume(priv);
-	mutex_unlock(&priv->mutex);
 
 	return 0;
 }


-
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux