* @skb: netlink message as socket buffer
  * @portid: own netlink portid to avoid sending to yourself
  * @group: offset of multicast group in groups array
- * @flags: allocation flags
  *
  * This function must hold the RTNL or rcu_read_lock().
  */
 int genlmsg_multicast_allns(const struct genl_family *family,
                            struct sk_buff *skb, u32 portid,
-                           unsigned int group, gfp_t flags);
+                           unsigned int group);
 
 /**
  * genlmsg_unicast - unicast a netlink message
 
                                  NLM_F_ACK, tunnel, cmd);
 
        if (ret >= 0) {
-               ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
+               ret = genlmsg_multicast_allns(family, msg, 0, 0);
                /* We don't care if no one is listening */
                if (ret == -ESRCH)
                        ret = 0;
                                   NLM_F_ACK, session, cmd);
 
        if (ret >= 0) {
-               ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
+               ret = genlmsg_multicast_allns(family, msg, 0, 0);
                /* We don't care if no one is listening */
                if (ret == -ESRCH)
                        ret = 0;
 
        if (IS_ERR(msg))
                return PTR_ERR(msg);
 
-       if (!family->netnsok) {
+       if (!family->netnsok)
                genlmsg_multicast_netns(&genl_ctrl, &init_net, msg, 0,
                                        0, GFP_KERNEL);
-       } else {
-               rcu_read_lock();
-               genlmsg_multicast_allns(&genl_ctrl, msg, 0,
-                                       0, GFP_ATOMIC);
-               rcu_read_unlock();
-       }
+       else
+               genlmsg_multicast_allns(&genl_ctrl, msg, 0, 0);
 
        return 0;
 }
 
 core_initcall(genl_init);
 
-static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
-                        gfp_t flags)
+static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group)
 {
        struct sk_buff *tmp;
        struct net *net, *prev = NULL;
        bool delivered = false;
        int err;
 
+       rcu_read_lock();
        for_each_net_rcu(net) {
                if (prev) {
-                       tmp = skb_clone(skb, flags);
+                       tmp = skb_clone(skb, GFP_ATOMIC);
                        if (!tmp) {
                                err = -ENOMEM;
                                goto error;
                        }
                        err = nlmsg_multicast(prev->genl_sock, tmp,
-                                             portid, group, flags);
+                                             portid, group, GFP_ATOMIC);
                        if (!err)
                                delivered = true;
                        else if (err != -ESRCH)
 
                prev = net;
        }
+       err = nlmsg_multicast(prev->genl_sock, skb, portid, group, GFP_ATOMIC);
+
+       rcu_read_unlock();
 
-       err = nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
        if (!err)
                delivered = true;
        else if (err != -ESRCH)
                return err;
        return delivered ? 0 : -ESRCH;
  error:
+       rcu_read_unlock();
+
        kfree_skb(skb);
        return err;
 }
 
 int genlmsg_multicast_allns(const struct genl_family *family,
                            struct sk_buff *skb, u32 portid,
-                           unsigned int group, gfp_t flags)
+                           unsigned int group)
 {
        if (WARN_ON_ONCE(group >= family->n_mcgrps))
                return -EINVAL;
 
        group = family->mcgrp_offset + group;
-       return genlmsg_mcast(skb, portid, group, flags);
+       return genlmsg_mcast(skb, portid, group);
 }
 EXPORT_SYMBOL(genlmsg_multicast_allns);
 
 
 
        genlmsg_end(msg, hdr);
 
-       rcu_read_lock();
        genlmsg_multicast_allns(&nl80211_fam, msg, 0,
-                               NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
-       rcu_read_unlock();
+                               NL80211_MCGRP_REGULATORY);
 
        return;
 
 
        genlmsg_end(msg, hdr);
 
-       rcu_read_lock();
        genlmsg_multicast_allns(&nl80211_fam, msg, 0,
-                               NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
-       rcu_read_unlock();
+                               NL80211_MCGRP_REGULATORY);
 
        return;