/* Receive messages from netlink socket. */ static void audit_receive(struct sock *sk, int length) { struct sk_buff *skb; unsigned int qlen; down(&audit_netlink_sem); for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) { skb = skb_dequeue(&sk->sk_receive_queue); audit_receive_skb(skb); kfree_skb(skb); } up(&audit_netlink_sem); }
/* Receive messages from netlink socket. */ static void audit_receive(struct sock *sk, int length) { struct sk_buff *skb; unsigned int qlen; mutex_lock(&audit_cmd_mutex); for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) { skb = skb_dequeue(&sk->sk_receive_queue); audit_receive_skb(skb); kfree_skb(skb); } mutex_unlock(&audit_cmd_mutex); }
/* Receive messages from netlink socket. */ static void audit_receive(struct sock *sk, int length) { struct sk_buff *skb; if (down_trylock(&audit_netlink_sem)) return; /* FIXME: this must not cause starvation */ while ((skb = skb_dequeue(&sk->sk_receive_queue))) { if (audit_receive_skb(skb) && skb->len) skb_queue_head(&sk->sk_receive_queue, skb); else kfree_skb(skb); } up(&audit_netlink_sem); }