From: Gao feng <gaofeng@cn.fujitsu.com>
To: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: netdev@vger.kernel.org, netfilter-devel@vger.kernel.org
Subject: Re: [PATCH 04/13] netfilter: regard users as refcount for l4proto's per-net data
Date: Tue, 26 Jun 2012 11:58:45 +0800 [thread overview]
Message-ID: <4FE93375.1080803@cn.fujitsu.com> (raw)
In-Reply-To: <20120625112029.GB4607@1984>
Hi Pablo:
于 2012年06月25日 19:20, Pablo Neira Ayuso 写道:
> On Thu, Jun 21, 2012 at 10:36:41PM +0800, Gao feng wrote:
>> Now, nf_proto_net's users is confusing.
>> we should regard it as the refcount for l4proto's per-net data,
>> because maybe there are two l4protos use the same per-net data.
>>
>> so increment pn->users when nf_conntrack_l4proto_register
>> success, and decrement it for nf_conntrack_l4_unregister case.
>>
>> because nf_conntrack_l3proto_ipv[4|6] don't use the same per-net
>> data,so we don't need to add a refcnt for their per-net data.
>>
>> Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
>> ---
>> net/netfilter/nf_conntrack_proto.c | 76 ++++++++++++++++++++++--------------
>> 1 files changed, 46 insertions(+), 30 deletions(-)
>>
>> diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c
>> index 9d6b6ab..63612e6 100644
>> --- a/net/netfilter/nf_conntrack_proto.c
>> +++ b/net/netfilter/nf_conntrack_proto.c
> [...]
>> @@ -458,23 +446,32 @@ int nf_conntrack_l4proto_register(struct net *net,
>> struct nf_conntrack_l4proto *l4proto)
>> {
>> int ret = 0;
>> + struct nf_proto_net *pn = NULL;
>>
>> if (l4proto->init_net) {
>> ret = l4proto->init_net(net, l4proto->l3proto);
>> if (ret < 0)
>> - return ret;
>> + goto out;
>> }
>>
>> - ret = nf_ct_l4proto_register_sysctl(net, l4proto);
>> + pn = nf_ct_l4proto_net(net, l4proto);
>> + if (pn == NULL)
>> + goto out;
>
> Same thing here, we're leaking memory allocated by l4proto->init_net.
if pn is NULL,init_net can't allocate memory for pn->ctl_table.
So I think it's not memory leak here.
>
>> + ret = nf_ct_l4proto_register_sysctl(net, pn, l4proto);
>> if (ret < 0)
>> - return ret;
>> + goto out;
>>
>> if (net == &init_net) {
>> ret = nf_conntrack_l4proto_register_net(l4proto);
>> - if (ret < 0)
>> - nf_ct_l4proto_unregister_sysctl(net, l4proto);
>> + if (ret < 0) {
>> + nf_ct_l4proto_unregister_sysctl(net, pn, l4proto);
>> + goto out;
>
> Better replace the two lines above by:
>
> goto out_register_net;
>
> and then...
>
>> + }
>> }
>>
>> + pn->users++;
>
> out_register_net:
> nf_ct_l4proto_unregister_sysctl(net, pn, l4proto);
>
>> +out:
>> return ret;
>
> I think that this change is similar to patch 1/1, I think you should
> send it as a separated patch.
>
Yes, It looks better.
should I change this and rebase whole patchset or
maybe you just apply this patchset and then I send a cleanup patch to do this?
>> }
>> EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_register);
>> @@ -499,10 +496,18 @@ nf_conntrack_l4proto_unregister_net(struct nf_conntrack_l4proto *l4proto)
>> void nf_conntrack_l4proto_unregister(struct net *net,
>> struct nf_conntrack_l4proto *l4proto)
>> {
>> + struct nf_proto_net *pn = NULL;
>> +
>> if (net == &init_net)
>> nf_conntrack_l4proto_unregister_net(l4proto);
>>
>> - nf_ct_l4proto_unregister_sysctl(net, l4proto);
>> + pn = nf_ct_l4proto_net(net, l4proto);
>> + if (pn == NULL)
>> + return;
>> +
>> + pn->users--;
>> + nf_ct_l4proto_unregister_sysctl(net, pn, l4proto);
>> +
>> /* Remove all contrack entries for this protocol */
>> rtnl_lock();
>> nf_ct_iterate_cleanup(net, kill_l4proto, l4proto);
>> @@ -514,11 +519,15 @@ int nf_conntrack_proto_init(struct net *net)
>> {
>> unsigned int i;
>> int err;
>> + struct nf_proto_net *pn = nf_ct_l4proto_net(net,
>> + &nf_conntrack_l4proto_generic);
>> +
>> err = nf_conntrack_l4proto_generic.init_net(net,
>> nf_conntrack_l4proto_generic.l3proto);
>> if (err < 0)
>> return err;
>> err = nf_ct_l4proto_register_sysctl(net,
>> + pn,
>> &nf_conntrack_l4proto_generic);
>> if (err < 0)
>> return err;
>> @@ -528,13 +537,20 @@ int nf_conntrack_proto_init(struct net *net)
>> rcu_assign_pointer(nf_ct_l3protos[i],
>> &nf_conntrack_l3proto_generic);
>> }
>> +
>> + pn->users++;
>> return 0;
>> }
>>
>> void nf_conntrack_proto_fini(struct net *net)
>> {
>> unsigned int i;
>> + struct nf_proto_net *pn = nf_ct_l4proto_net(net,
>> + &nf_conntrack_l4proto_generic);
>> +
>> + pn->users--;
>> nf_ct_l4proto_unregister_sysctl(net,
>> + pn,
>> &nf_conntrack_l4proto_generic);
>> if (net == &init_net) {
>> /* free l3proto protocol tables */
>> --
>> 1.7.7.6
>>
>
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-06-26 3:58 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-21 14:36 [PATCH 01/13] netfilter: fix problem with proto register Gao feng
2012-06-21 14:36 ` [PATCH 02/13] netfilter: add parameter proto for l4proto.init_net Gao feng
2012-06-21 14:36 ` [PATCH 03/13] netfilter: add nf_ct_kfree_compat_sysctl_table to make codes clear Gao feng
2012-06-21 14:36 ` [PATCH 04/13] netfilter: regard users as refcount for l4proto's per-net data Gao feng
2012-06-25 11:20 ` Pablo Neira Ayuso
2012-06-26 3:58 ` Gao feng [this message]
2012-06-26 14:47 ` Pablo Neira Ayuso
2012-06-27 1:34 ` Gao feng
2012-06-27 9:05 ` Pablo Neira Ayuso
2012-06-21 14:36 ` [PATCH 05/13] netfilter: fix memory leak when register sysctl failed Gao feng
2012-06-21 14:36 ` [PATCH 06/13] netfilter: merge tcpv[4,6]_net_init into tcp_net_init Gao feng
2012-06-21 14:36 ` [PATCH 07/13] netfilter: merge udpv[4,6]_net_init into udp_net_init Gao feng
2012-06-21 14:36 ` [PATCH 08/13] netfilter: nf_conntrack_l4proto_udplite[4,6] cleanup Gao feng
2012-06-21 14:36 ` [PATCH 09/13] netfilter: merge sctpv[4,6]_net_init into sctp_net_init Gao feng
2012-06-21 14:36 ` [PATCH 10/13] netfilter: nf_conntrack_l4proto_generic cleanup Gao feng
2012-06-21 14:36 ` [PATCH 11/13] netfilter: nf_conntrack_l4proto_dccp[4,6] cleanup Gao feng
2012-06-21 14:36 ` [PATCH 12/13] netfilter: nf_conntrack_l4proto_icmp cleanup Gao feng
2012-06-21 14:36 ` [PATCH 13/13] netfilter: nf_conntrack_l4proto_icmpv6 cleanup Gao feng
2012-06-25 11:12 ` [PATCH 01/13] netfilter: fix problem with proto register Pablo Neira Ayuso
2012-06-26 3:40 ` Gao feng
2012-06-26 14:36 ` Pablo Neira Ayuso
2012-06-27 1:38 ` Gao feng
2012-06-27 8:53 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FE93375.1080803@cn.fujitsu.com \
--to=gaofeng@cn.fujitsu.com \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.