|
@@ -4661,8 +4661,12 @@ static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
|
|
|
|
|
|
skb_shinfo(skb)->frag_list = NULL;
|
|
skb_shinfo(skb)->frag_list = NULL;
|
|
|
|
|
|
- /* Queue all fragments atomically */
|
|
|
|
- spin_lock(&queue->lock);
|
|
|
|
|
|
+ /* Queue all fragments atomically. We need to use spin_lock_bh
|
|
|
|
+ * here because of 6LoWPAN links, as there this function is
|
|
|
|
+ * called from softirq and using normal spin lock could cause
|
|
|
|
+ * deadlocks.
|
|
|
|
+ */
|
|
|
|
+ spin_lock_bh(&queue->lock);
|
|
|
|
|
|
__skb_queue_tail(queue, skb);
|
|
__skb_queue_tail(queue, skb);
|
|
|
|
|
|
@@ -4679,7 +4683,7 @@ static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
|
|
__skb_queue_tail(queue, skb);
|
|
__skb_queue_tail(queue, skb);
|
|
} while (list);
|
|
} while (list);
|
|
|
|
|
|
- spin_unlock(&queue->lock);
|
|
|
|
|
|
+ spin_unlock_bh(&queue->lock);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|