[NETFILTER]: ctnetlink: avoid unneccessary event message generation
Avoid unneccessary event message generation by checking for netlink listeners before building a message. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c4b8851392
commit
a242769248
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user