}
 }
 
+static inline void
+double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
+{
+       if (hb1 <= hb2) {
+               spin_unlock(&hb2->lock);
+               if (hb1 < hb2)
+                       spin_unlock(&hb1->lock);
+       } else { /* hb1 > hb2 */
+               spin_unlock(&hb1->lock);
+               spin_unlock(&hb2->lock);
+       }
+}
+
 /*
  * Wake up waiters matching bitset queued on this futex (uaddr).
  */
        if (unlikely(op_ret < 0)) {
                u32 dummy;
 
-               spin_unlock(&hb1->lock);
-               if (hb1 != hb2)
-                       spin_unlock(&hb2->lock);
+               double_unlock_hb(hb1, hb2);
 
 #ifndef CONFIG_MMU
                /*
                ret += op_ret;
        }
 
-       spin_unlock(&hb1->lock);
-       if (hb1 != hb2)
-               spin_unlock(&hb2->lock);
+       double_unlock_hb(hb1, hb2);
 out_put_keys:
        put_futex_key(fshared, &key2);
 out_put_key1:
                ret = get_futex_value_locked(&curval, uaddr1);
 
                if (unlikely(ret)) {
-                       spin_unlock(&hb1->lock);
-                       if (hb1 != hb2)
-                               spin_unlock(&hb2->lock);
+                       double_unlock_hb(hb1, hb2);
 
                        put_futex_key(fshared, &key2);
                        put_futex_key(fshared, &key1);
        }
 
 out_unlock:
-       spin_unlock(&hb1->lock);
-       if (hb1 != hb2)
-               spin_unlock(&hb2->lock);
+       double_unlock_hb(hb1, hb2);
 
        /* drop_futex_key_refs() must be called outside the spinlocks. */
        while (--drop_count >= 0)