lkml.org 
[lkml]   [2010]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[152/156] b43: Workaround circular locking in hw-tkip key update callback
    2.6.33-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Michael Buesch <mb@bu3sch.de>

    commit 96869a39399269a776a94812e9fff3d38b47d838 upstream

    The TKIP key update callback is called from the RX path, where the driver
    mutex is already locked. This results in a circular locking bug.
    Avoid this by removing the lock.

    Johannes noted that there is a separate bug: The callback still breaks on SDIO
    hardware, because SDIO hardware access needs to sleep, but we are not allowed
    to sleep in the callback due to mac80211's RCU locking.

    Signed-off-by: Michael Buesch <mb@bu3sch.de>
    Tested-by: Larry Finger <Larry.Finger@lwfinger.net>
    Reported-by: kecsa@kutfo.hit.bme.hu
    Cc: Johannes Berg <johannes@sipsolutions.net>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/net/wireless/b43/main.c | 11 ++++-------
    1 file changed, 4 insertions(+), 7 deletions(-)

    --- a/drivers/net/wireless/b43/main.c
    +++ b/drivers/net/wireless/b43/main.c
    @@ -852,19 +852,16 @@ static void b43_op_update_tkip_key(struc
    if (B43_WARN_ON(!modparam_hwtkip))
    return;

    - mutex_lock(&wl->mutex);
    -
    + /* This is only called from the RX path through mac80211, where
    + * our mutex is already locked. */
    + B43_WARN_ON(!mutex_is_locked(&wl->mutex));
    dev = wl->current_dev;
    - if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
    - goto out_unlock;
    + B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED);

    keymac_write(dev, index, NULL); /* First zero out mac to avoid race */

    rx_tkip_phase1_write(dev, index, iv32, phase1key);
    keymac_write(dev, index, addr);
    -
    -out_unlock:
    - mutex_unlock(&wl->mutex);
    }

    static void do_key_write(struct b43_wldev *dev,



    \
     
     \ /
      Last update: 2010-03-31 01:27    [W:0.034 / U:123.924 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site