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

[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
...@@ -164,6 +164,7 @@ extern void nfattr_parse(struct nfattr *tb[], int maxattr, ...@@ -164,6 +164,7 @@ extern void nfattr_parse(struct nfattr *tb[], int maxattr,
__res; \ __res; \
}) })
extern int nfnetlink_has_listeners(unsigned int group);
extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group,
int echo); int echo);
extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
......
...@@ -327,9 +327,10 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, ...@@ -327,9 +327,10 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
group = NFNLGRP_CONNTRACK_UPDATE; group = NFNLGRP_CONNTRACK_UPDATE;
} else } else
return NOTIFY_DONE; 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); skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
if (!skb) if (!skb)
return NOTIFY_DONE; return NOTIFY_DONE;
......
...@@ -338,9 +338,10 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, ...@@ -338,9 +338,10 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
group = NFNLGRP_CONNTRACK_UPDATE; group = NFNLGRP_CONNTRACK_UPDATE;
} else } else
return NOTIFY_DONE; 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); skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
if (!skb) if (!skb)
return NOTIFY_DONE; return NOTIFY_DONE;
......
...@@ -191,6 +191,12 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys, ...@@ -191,6 +191,12 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
return 0; 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) int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, int echo)
{ {
gfp_t allocation = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; gfp_t allocation = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment