Signed-off-by: Florian Westphal <f...@strlen.de>
---
 net/netfilter/nf_tables_api.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 9454c7fc1978..528766cfd0a0 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -4998,7 +4998,7 @@ struct nft_flowtable *nft_flowtable_lookup(const struct 
nft_table *table,
 {
        struct nft_flowtable *flowtable;
 
-       list_for_each_entry(flowtable, &table->flowtables, list) {
+       list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
                if (!nla_strcmp(nla, flowtable->name) &&
                    nft_active_genmask(flowtable, genmask))
                        return flowtable;
@@ -5459,13 +5459,13 @@ nft_flowtable_filter_alloc(const struct nlattr * const 
nla[])
 {
        struct nft_flowtable_filter *filter;
 
-       filter = kzalloc(sizeof(*filter), GFP_KERNEL);
+       filter = kzalloc(sizeof(*filter), GFP_ATOMIC);
        if (!filter)
                return ERR_PTR(-ENOMEM);
 
        if (nla[NFTA_FLOWTABLE_TABLE]) {
                filter->table = nla_strdup(nla[NFTA_FLOWTABLE_TABLE],
-                                          GFP_KERNEL);
+                                          GFP_ATOMIC);
                if (!filter->table) {
                        kfree(filter);
                        return ERR_PTR(-ENOMEM);
@@ -5474,6 +5474,7 @@ nft_flowtable_filter_alloc(const struct nlattr * const 
nla[])
        return filter;
 }
 
+/* called with rcu_read_lock held */
 static int nf_tables_getflowtable(struct net *net, struct sock *nlsk,
                                  struct sk_buff *skb,
                                  const struct nlmsghdr *nlh,
@@ -5492,6 +5493,7 @@ static int nf_tables_getflowtable(struct net *net, struct 
sock *nlsk,
                struct netlink_dump_control c = {
                        .dump = nf_tables_dump_flowtable,
                        .done = nf_tables_dump_flowtable_done,
+                       .module = THIS_MODULE,
                };
 
                if (nla[NFTA_FLOWTABLE_TABLE]) {
@@ -5503,7 +5505,7 @@ static int nf_tables_getflowtable(struct net *net, struct 
sock *nlsk,
 
                        c.data = filter;
                }
-               return netlink_dump_start(nlsk, skb, nlh, &c);
+               return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
        }
 
        if (!nla[NFTA_FLOWTABLE_NAME])
@@ -5519,7 +5521,7 @@ static int nf_tables_getflowtable(struct net *net, struct 
sock *nlsk,
        if (IS_ERR(flowtable))
                return PTR_ERR(flowtable);
 
-       skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
+       skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
        if (!skb2)
                return -ENOMEM;
 
@@ -5803,7 +5805,7 @@ static const struct nfnl_callback 
nf_tables_cb[NFT_MSG_MAX] = {
                .policy         = nft_flowtable_policy,
        },
        [NFT_MSG_GETFLOWTABLE] = {
-               .call           = nf_tables_getflowtable,
+               .call_rcu       = nf_tables_getflowtable,
                .attr_count     = NFTA_FLOWTABLE_MAX,
                .policy         = nft_flowtable_policy,
        },
-- 
2.16.1

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to