From 0cfad07555312468296ea3bbbcdf99038f58678b Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sun, 16 Sep 2007 16:24:44 -0700 Subject: [PATCH] [NETLINK]: Avoid pointer in netlink_run_queue I was looking at Patrick's fix to inet_diag and it occured to me that we're using a pointer argument to return values unnecessarily in netlink_run_queue. Changing it to return the value will allow the compiler to generate better code since the value won't have to be memory-backed. Signed-off-by: Herbert Xu Signed-off-by: David S. Miller --- include/net/netlink.h | 2 +- net/core/rtnetlink.c | 2 +- net/ipv4/inet_diag.c | 2 +- net/netfilter/nfnetlink.c | 2 +- net/netlink/af_netlink.c | 18 ++++++++++-------- net/netlink/genetlink.c | 2 +- net/xfrm/xfrm_user.c | 2 +- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/net/netlink.h b/include/net/netlink.h index 695e613a20..83113dfcbd 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -220,7 +220,7 @@ struct nl_info { u32 pid; }; -extern void netlink_run_queue(struct sock *sk, unsigned int *qlen, +extern unsigned int netlink_run_queue(struct sock *sk, unsigned int qlen, int (*cb)(struct sk_buff *, struct nlmsghdr *)); extern int nlmsg_notify(struct sock *sk, struct sk_buff *skb, diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 1b9c32d799..739fbad15c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1320,7 +1320,7 @@ static void rtnetlink_rcv(struct sock *sk, int len) do { mutex_lock(&rtnl_mutex); - netlink_run_queue(sk, &qlen, &rtnetlink_rcv_msg); + qlen = netlink_run_queue(sk, qlen, &rtnetlink_rcv_msg); mutex_unlock(&rtnl_mutex); netdev_run_todo(); diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 031cc4856b..b04a6ee5a9 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -845,7 +845,7 @@ static void inet_diag_rcv(struct sock *sk, int len) do { mutex_lock(&inet_diag_mutex); - netlink_run_queue(sk, &qlen, &inet_diag_rcv_msg); + qlen = netlink_run_queue(sk, qlen, &inet_diag_rcv_msg); mutex_unlock(&inet_diag_mutex); } while (qlen); } diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index fa974e8e0c..4aa56e7ff1 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -248,7 +248,7 @@ static void nfnetlink_rcv(struct sock *sk, int len) do { if (nfnl_trylock()) return; - netlink_run_queue(sk, &qlen, nfnetlink_rcv_msg); + qlen = netlink_run_queue(sk, qlen, nfnetlink_rcv_msg); __nfnl_unlock(); } while (qlen); } diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index dc9f8c2ab1..c68888b257 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1629,7 +1629,7 @@ skip: /** * nelink_run_queue - Process netlink receive queue. * @sk: Netlink socket containing the queue - * @qlen: Place to store queue length upon entry + * @qlen: Initial queue length * @cb: Callback function invoked for each netlink message found * * Processes as much as there was in the queue upon entry and invokes @@ -1639,35 +1639,37 @@ skip: * returns with a qlen != 0. * * qlen must be initialized to 0 before the initial entry, afterwards - * the function may be called repeatedly until qlen reaches 0. + * the function may be called repeatedly until the returned qlen is 0. * * The callback function may return -EINTR to signal that processing * of netlink messages shall be interrupted. In this case the message * currently being processed will NOT be requeued onto the receive * queue. */ -void netlink_run_queue(struct sock *sk, unsigned int *qlen, - int (*cb)(struct sk_buff *, struct nlmsghdr *)) +unsigned int netlink_run_queue(struct sock *sk, unsigned int qlen, + int (*cb)(struct sk_buff *, struct nlmsghdr *)) { struct sk_buff *skb; - if (!*qlen || *qlen > skb_queue_len(&sk->sk_receive_queue)) - *qlen = skb_queue_len(&sk->sk_receive_queue); + if (!qlen || qlen > skb_queue_len(&sk->sk_receive_queue)) + qlen = skb_queue_len(&sk->sk_receive_queue); - for (; *qlen; (*qlen)--) { + for (; qlen; qlen--) { skb = skb_dequeue(&sk->sk_receive_queue); if (netlink_rcv_skb(skb, cb)) { if (skb->len) skb_queue_head(&sk->sk_receive_queue, skb); else { kfree_skb(skb); - (*qlen)--; + qlen--; } break; } kfree_skb(skb); } + + return qlen; } /** diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index af8fe26815..07ef5d204a 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -485,7 +485,7 @@ static void genl_rcv(struct sock *sk, int len) do { if (genl_trylock()) return; - netlink_run_queue(sk, &qlen, genl_rcv_msg); + qlen = netlink_run_queue(sk, qlen, genl_rcv_msg); genl_unlock(); } while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen); } diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 1f8e7c22dd..8e10e9098a 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -1887,7 +1887,7 @@ static void xfrm_netlink_rcv(struct sock *sk, int len) do { mutex_lock(&xfrm_cfg_mutex); - netlink_run_queue(sk, &qlen, &xfrm_user_rcv_msg); + qlen = netlink_run_queue(sk, qlen, &xfrm_user_rcv_msg); mutex_unlock(&xfrm_cfg_mutex); } while (qlen); -- 2.39.5