netfilter: nf_ct_ecache: refactor nf_ct_deliver_cached_events
* identation lowered * some CPU cycles saved at delayed item variable initialization Signed-off-by: Tony Zelenoff <antonz@parallels.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
committed by
Pablo Neira Ayuso
parent
93326ae312
commit
58020f7761
@@ -32,9 +32,11 @@ static DEFINE_MUTEX(nf_ct_ecache_mutex);
|
|||||||
void nf_ct_deliver_cached_events(struct nf_conn *ct)
|
void nf_ct_deliver_cached_events(struct nf_conn *ct)
|
||||||
{
|
{
|
||||||
struct net *net = nf_ct_net(ct);
|
struct net *net = nf_ct_net(ct);
|
||||||
unsigned long events;
|
unsigned long events, missed;
|
||||||
struct nf_ct_event_notifier *notify;
|
struct nf_ct_event_notifier *notify;
|
||||||
struct nf_conntrack_ecache *e;
|
struct nf_conntrack_ecache *e;
|
||||||
|
struct nf_ct_event item;
|
||||||
|
int ret;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
|
notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
|
||||||
@@ -47,31 +49,32 @@ void nf_ct_deliver_cached_events(struct nf_conn *ct)
|
|||||||
|
|
||||||
events = xchg(&e->cache, 0);
|
events = xchg(&e->cache, 0);
|
||||||
|
|
||||||
if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct) && events) {
|
if (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)
|
||||||
struct nf_ct_event item = {
|
goto out_unlock;
|
||||||
.ct = ct,
|
|
||||||
.pid = 0,
|
|
||||||
.report = 0
|
|
||||||
};
|
|
||||||
int ret;
|
|
||||||
/* We make a copy of the missed event cache without taking
|
|
||||||
* the lock, thus we may send missed events twice. However,
|
|
||||||
* this does not harm and it happens very rarely. */
|
|
||||||
unsigned long missed = e->missed;
|
|
||||||
|
|
||||||
if (!((events | missed) & e->ctmask))
|
/* We make a copy of the missed event cache without taking
|
||||||
goto out_unlock;
|
* the lock, thus we may send missed events twice. However,
|
||||||
|
* this does not harm and it happens very rarely. */
|
||||||
|
missed = e->missed;
|
||||||
|
|
||||||
ret = notify->fcn(events | missed, &item);
|
if (!((events | missed) & e->ctmask))
|
||||||
if (unlikely(ret < 0 || missed)) {
|
goto out_unlock;
|
||||||
spin_lock_bh(&ct->lock);
|
|
||||||
if (ret < 0)
|
item.ct = ct;
|
||||||
e->missed |= events;
|
item.pid = 0;
|
||||||
else
|
item.report = 0;
|
||||||
e->missed &= ~missed;
|
|
||||||
spin_unlock_bh(&ct->lock);
|
ret = notify->fcn(events | missed, &item);
|
||||||
}
|
|
||||||
}
|
if (likely(ret >= 0 && !missed))
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
spin_lock_bh(&ct->lock);
|
||||||
|
if (ret < 0)
|
||||||
|
e->missed |= events;
|
||||||
|
else
|
||||||
|
e->missed &= ~missed;
|
||||||
|
spin_unlock_bh(&ct->lock);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
Reference in New Issue
Block a user