aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink/af_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/netlink/af_netlink.c')
-rw-r--r--net/netlink/af_netlink.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index dc9f8c2ab1d..c68888b2575 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1629,7 +1629,7 @@ skip:
1629/** 1629/**
1630 * nelink_run_queue - Process netlink receive queue. 1630 * nelink_run_queue - Process netlink receive queue.
1631 * @sk: Netlink socket containing the queue 1631 * @sk: Netlink socket containing the queue
1632 * @qlen: Place to store queue length upon entry 1632 * @qlen: Initial queue length
1633 * @cb: Callback function invoked for each netlink message found 1633 * @cb: Callback function invoked for each netlink message found
1634 * 1634 *
1635 * Processes as much as there was in the queue upon entry and invokes 1635 * Processes as much as there was in the queue upon entry and invokes
@@ -1639,35 +1639,37 @@ skip:
1639 * returns with a qlen != 0. 1639 * returns with a qlen != 0.
1640 * 1640 *
1641 * qlen must be initialized to 0 before the initial entry, afterwards 1641 * qlen must be initialized to 0 before the initial entry, afterwards
1642 * the function may be called repeatedly until qlen reaches 0. 1642 * the function may be called repeatedly until the returned qlen is 0.
1643 * 1643 *
1644 * The callback function may return -EINTR to signal that processing 1644 * The callback function may return -EINTR to signal that processing
1645 * of netlink messages shall be interrupted. In this case the message 1645 * of netlink messages shall be interrupted. In this case the message
1646 * currently being processed will NOT be requeued onto the receive 1646 * currently being processed will NOT be requeued onto the receive
1647 * queue. 1647 * queue.
1648 */ 1648 */
1649void netlink_run_queue(struct sock *sk, unsigned int *qlen, 1649unsigned int netlink_run_queue(struct sock *sk, unsigned int qlen,
1650 int (*cb)(struct sk_buff *, struct nlmsghdr *)) 1650 int (*cb)(struct sk_buff *, struct nlmsghdr *))
1651{ 1651{
1652 struct sk_buff *skb; 1652 struct sk_buff *skb;
1653 1653
1654 if (!*qlen || *qlen > skb_queue_len(&sk->sk_receive_queue)) 1654 if (!qlen || qlen > skb_queue_len(&sk->sk_receive_queue))
1655 *qlen = skb_queue_len(&sk->sk_receive_queue); 1655 qlen = skb_queue_len(&sk->sk_receive_queue);
1656 1656
1657 for (; *qlen; (*qlen)--) { 1657 for (; qlen; qlen--) {
1658 skb = skb_dequeue(&sk->sk_receive_queue); 1658 skb = skb_dequeue(&sk->sk_receive_queue);
1659 if (netlink_rcv_skb(skb, cb)) { 1659 if (netlink_rcv_skb(skb, cb)) {
1660 if (skb->len) 1660 if (skb->len)
1661 skb_queue_head(&sk->sk_receive_queue, skb); 1661 skb_queue_head(&sk->sk_receive_queue, skb);
1662 else { 1662 else {
1663 kfree_skb(skb); 1663 kfree_skb(skb);
1664 (*qlen)--; 1664 qlen--;
1665 } 1665 }
1666 break; 1666 break;
1667 } 1667 }
1668 1668
1669 kfree_skb(skb); 1669 kfree_skb(skb);
1670 } 1670 }
1671
1672 return qlen;
1671} 1673}
1672 1674
1673/** 1675/**