Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0cfad075 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

[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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 007e3936
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -220,7 +220,7 @@ struct nl_info {
	u32			pid;
	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 *,
					  int (*cb)(struct sk_buff *,
						    struct nlmsghdr *));
						    struct nlmsghdr *));
extern int		nlmsg_notify(struct sock *sk, struct sk_buff *skb,
extern int		nlmsg_notify(struct sock *sk, struct sk_buff *skb,
+1 −1
Original line number Original line Diff line number Diff line
@@ -1320,7 +1320,7 @@ static void rtnetlink_rcv(struct sock *sk, int len)


	do {
	do {
		mutex_lock(&rtnl_mutex);
		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);
		mutex_unlock(&rtnl_mutex);


		netdev_run_todo();
		netdev_run_todo();
+1 −1
Original line number Original line Diff line number Diff line
@@ -845,7 +845,7 @@ static void inet_diag_rcv(struct sock *sk, int len)


	do {
	do {
		mutex_lock(&inet_diag_mutex);
		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);
		mutex_unlock(&inet_diag_mutex);
	} while (qlen);
	} while (qlen);
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -248,7 +248,7 @@ static void nfnetlink_rcv(struct sock *sk, int len)
	do {
	do {
		if (nfnl_trylock())
		if (nfnl_trylock())
			return;
			return;
		netlink_run_queue(sk, &qlen, nfnetlink_rcv_msg);
		qlen = netlink_run_queue(sk, qlen, nfnetlink_rcv_msg);
		__nfnl_unlock();
		__nfnl_unlock();
	} while (qlen);
	} while (qlen);
}
}
+10 −8
Original line number Original line Diff line number Diff line
@@ -1629,7 +1629,7 @@ skip:
/**
/**
 * nelink_run_queue - Process netlink receive queue.
 * nelink_run_queue - Process netlink receive queue.
 * @sk: Netlink socket containing the 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
 * @cb: Callback function invoked for each netlink message found
 *
 *
 * Processes as much as there was in the queue upon entry and invokes
 * Processes as much as there was in the queue upon entry and invokes
@@ -1639,35 +1639,37 @@ skip:
 * returns with a qlen != 0.
 * returns with a qlen != 0.
 *
 *
 * qlen must be initialized to 0 before the initial entry, afterwards
 * 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
 * The callback function may return -EINTR to signal that processing
 * of netlink messages shall be interrupted. In this case the message
 * of netlink messages shall be interrupted. In this case the message
 * currently being processed will NOT be requeued onto the receive
 * currently being processed will NOT be requeued onto the receive
 * queue.
 * queue.
 */
 */
void netlink_run_queue(struct sock *sk, unsigned int *qlen,
unsigned int netlink_run_queue(struct sock *sk, unsigned int qlen,
			       int (*cb)(struct sk_buff *, struct nlmsghdr *))
			       int (*cb)(struct sk_buff *, struct nlmsghdr *))
{
{
	struct sk_buff *skb;
	struct sk_buff *skb;


	if (!*qlen || *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);
		qlen = skb_queue_len(&sk->sk_receive_queue);


	for (; *qlen; (*qlen)--) {
	for (; qlen; qlen--) {
		skb = skb_dequeue(&sk->sk_receive_queue);
		skb = skb_dequeue(&sk->sk_receive_queue);
		if (netlink_rcv_skb(skb, cb)) {
		if (netlink_rcv_skb(skb, cb)) {
			if (skb->len)
			if (skb->len)
				skb_queue_head(&sk->sk_receive_queue, skb);
				skb_queue_head(&sk->sk_receive_queue, skb);
			else {
			else {
				kfree_skb(skb);
				kfree_skb(skb);
				(*qlen)--;
				qlen--;
			}
			}
			break;
			break;
		}
		}


		kfree_skb(skb);
		kfree_skb(skb);
	}
	}

	return qlen;
}
}


/**
/**
Loading