netfilter: conntrack: avoid useless indirection during conntrack destruction
[platform/kernel/linux-rpi.git] / include / net / netfilter / nf_conntrack.h
index d24b0a3..34c2665 100644 (file)
@@ -76,6 +76,8 @@ struct nf_conn {
         * Hint, SKB address this struct and refcnt via skb->_nfct and
         * helpers nf_conntrack_get() and nf_conntrack_put().
         * Helper nf_ct_put() equals nf_conntrack_put() by dec refcnt,
+        * except that the latter uses internal indirection and does not
+        * result in a conntrack module dependency.
         * beware nf_ct_get() is different and don't inc refcnt.
         */
        struct nf_conntrack ct_general;
@@ -169,11 +171,13 @@ nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)
        return (struct nf_conn *)(nfct & NFCT_PTRMASK);
 }
 
+void nf_ct_destroy(struct nf_conntrack *nfct);
+
 /* decrement reference count on a conntrack */
 static inline void nf_ct_put(struct nf_conn *ct)
 {
-       WARN_ON(!ct);
-       nf_conntrack_put(&ct->ct_general);
+       if (ct && refcount_dec_and_test(&ct->ct_general.use))
+               nf_ct_destroy(&ct->ct_general);
 }
 
 /* Protocol module loading */