void rtnl_unlock(void) { mutex_unlock(&rtnl_mutex); if (rtnl && rtnl->sk_receive_queue.qlen) rtnl->sk_data_ready(rtnl, 0); netdev_run_todo(); }
static void rtnetlink_rcv(struct sock *sk, int len) { do { struct sk_buff *skb; if (rtnl_shlock_nowait()) return; while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { if (rtnetlink_rcv_skb(skb)) { if (skb->len) skb_queue_head(&sk->sk_receive_queue, skb); else kfree_skb(skb); break; } kfree_skb(skb); } up(&rtnl_sem); netdev_run_todo(); } while (rtnl && rtnl->sk_receive_queue.qlen); }
static void rtnetlink_rcv(struct sock *sk, int len) { unsigned int qlen = 0; do { rtnl_lock(); netlink_run_queue(sk, &qlen, &rtnetlink_rcv_msg); up(&rtnl_sem); netdev_run_todo(); } while (qlen); }
static void rtnetlink_rcv(struct sock *sk, int len) { unsigned int qlen = 0; do { mutex_lock(&rtnl_mutex); netlink_run_queue(sk, &qlen, &rtnetlink_rcv_msg); mutex_unlock(&rtnl_mutex); netdev_run_todo(); } while (qlen); }
void rtnl_unlock(void) { rtnl_shunlock(); netdev_run_todo(); }