Commit a2427692 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[NETFILTER]: ctnetlink: avoid unneccessary event message generation



Avoid unneccessary event message generation by checking for netlink
listeners before building a message.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c4b88513
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ extern void nfattr_parse(struct nfattr *tb[], int maxattr,
 	__res;								\
})

extern int nfnetlink_has_listeners(unsigned int group);
extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, 
			  int echo);
extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
+4 −3
Original line number Diff line number Diff line
@@ -328,7 +328,8 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
	} else 
		return NOTIFY_DONE;

  /* FIXME: Check if there are any listeners before, don't hurt performance */
	if (!nfnetlink_has_listeners(group))
		return NOTIFY_DONE;

	skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
	if (!skb)
+4 −3
Original line number Diff line number Diff line
@@ -339,7 +339,8 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
	} else
		return NOTIFY_DONE;

  /* FIXME: Check if there are any listeners before, don't hurt performance */
	if (!nfnetlink_has_listeners(group))
		return NOTIFY_DONE;

	skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
	if (!skb)
+6 −0
Original line number Diff line number Diff line
@@ -191,6 +191,12 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
        return 0;
}

int nfnetlink_has_listeners(unsigned int group)
{
	return netlink_has_listeners(nfnl, group);
}
EXPORT_SYMBOL_GPL(nfnetlink_has_listeners);

int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, int echo)
{
	gfp_t allocation = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;