]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Sun, 14 Nov 2010 19:57:05 +0000 (11:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 14 Nov 2010 19:57:05 +0000 (11:57 -0800)
1  2 
net/decnet/af_decnet.c
net/ipv4/igmp.c
net/ipv4/tcp.c

diff --combined net/decnet/af_decnet.c
index 18b8a2cbdf77d647426ccde4209afcad0a758e1b,a76b78de679fa7e928cfae7b62c0a7e73c2256dd..9ecef9968c3940026deefba772fa568af7237bcc
@@@ -155,7 -155,7 +155,7 @@@ static const struct proto_ops dn_proto_
  static DEFINE_RWLOCK(dn_hash_lock);
  static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE];
  static struct hlist_head dn_wild_sk;
- static atomic_t decnet_memory_allocated;
+ static atomic_long_t decnet_memory_allocated;
  
  static int __dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen, int flags);
  static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags);
@@@ -1848,7 -1848,7 +1848,7 @@@ unsigned dn_mss_from_pmtu(struct net_de
  {
        unsigned mss = 230 - DN_MAX_NSP_DATA_HEADER;
        if (dev) {
 -              struct dn_dev *dn_db = dev->dn_ptr;
 +              struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
                mtu -= LL_RESERVED_SPACE(dev);
                if (dn_db->use_long)
                        mtu -= 21;
diff --combined net/ipv4/igmp.c
index 6f49d6c087da87ebcc8f808c8daef2aedaab4fd1,3c53c2d89e3b47b3e42629bfe37086aeeeda7aa8..0f0e0f0279b8f3a7b6b565f78137e87495f1e07e
@@@ -149,17 -149,11 +149,17 @@@ static void ip_mc_clear_src(struct ip_m
  static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
                         int sfcount, __be32 *psfsrc, int delta);
  
 +
 +static void ip_mc_list_reclaim(struct rcu_head *head)
 +{
 +      kfree(container_of(head, struct ip_mc_list, rcu));
 +}
 +
  static void ip_ma_put(struct ip_mc_list *im)
  {
        if (atomic_dec_and_test(&im->refcnt)) {
                in_dev_put(im->interface);
 -              kfree(im);
 +              call_rcu(&im->rcu, ip_mc_list_reclaim);
        }
  }
  
   *    Timer management
   */
  
 -static __inline__ void igmp_stop_timer(struct ip_mc_list *im)
 +static void igmp_stop_timer(struct ip_mc_list *im)
  {
        spin_lock_bh(&im->lock);
        if (del_timer(&im->timer))
@@@ -502,24 -496,14 +502,24 @@@ empty_source
        return skb;
  }
  
 +#define for_each_pmc_rcu(in_dev, pmc)                         \
 +      for (pmc = rcu_dereference(in_dev->mc_list);            \
 +           pmc != NULL;                                       \
 +           pmc = rcu_dereference(pmc->next_rcu))
 +
 +#define for_each_pmc_rtnl(in_dev, pmc)                                \
 +      for (pmc = rtnl_dereference(in_dev->mc_list);           \
 +           pmc != NULL;                                       \
 +           pmc = rtnl_dereference(pmc->next_rcu))
 +
  static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
  {
        struct sk_buff *skb = NULL;
        int type;
  
        if (!pmc) {
 -              read_lock(&in_dev->mc_list_lock);
 -              for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
 +              rcu_read_lock();
 +              for_each_pmc_rcu(in_dev, pmc) {
                        if (pmc->multiaddr == IGMP_ALL_HOSTS)
                                continue;
                        spin_lock_bh(&pmc->lock);
                        skb = add_grec(skb, pmc, type, 0, 0);
                        spin_unlock_bh(&pmc->lock);
                }
 -              read_unlock(&in_dev->mc_list_lock);
 +              rcu_read_unlock();
        } else {
                spin_lock_bh(&pmc->lock);
                if (pmc->sfcount[MCAST_EXCLUDE])
@@@ -572,7 -556,7 +572,7 @@@ static void igmpv3_send_cr(struct in_de
        struct sk_buff *skb = NULL;
        int type, dtype;
  
 -      read_lock(&in_dev->mc_list_lock);
 +      rcu_read_lock();
        spin_lock_bh(&in_dev->mc_tomb_lock);
  
        /* deleted MCA's */
        spin_unlock_bh(&in_dev->mc_tomb_lock);
  
        /* change recs */
 -      for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
 +      for_each_pmc_rcu(in_dev, pmc) {
                spin_lock_bh(&pmc->lock);
                if (pmc->sfcount[MCAST_EXCLUDE]) {
                        type = IGMPV3_BLOCK_OLD_SOURCES;
                }
                spin_unlock_bh(&pmc->lock);
        }
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  
        if (!skb)
                return;
@@@ -829,14 -813,14 +829,14 @@@ static void igmp_heard_report(struct in
        if (group == IGMP_ALL_HOSTS)
                return;
  
 -      read_lock(&in_dev->mc_list_lock);
 -      for (im=in_dev->mc_list; im!=NULL; im=im->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, im) {
                if (im->multiaddr == group) {
                        igmp_stop_timer(im);
                        break;
                }
        }
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  }
  
  static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
         * - Use the igmp->igmp_code field as the maximum
         *   delay possible
         */
 -      read_lock(&in_dev->mc_list_lock);
 -      for (im=in_dev->mc_list; im!=NULL; im=im->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, im) {
                int changed;
  
                if (group && group != im->multiaddr)
                if (changed)
                        igmp_mod_timer(im, max_delay);
        }
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  }
  
  /* called in rcu_read_lock() section */
@@@ -977,7 -961,7 +977,7 @@@ int igmp_rcv(struct sk_buff *skb
        case IGMP_HOST_MEMBERSHIP_REPORT:
        case IGMPV2_HOST_MEMBERSHIP_REPORT:
                /* Is it our report looped back? */
 -              if (skb_rtable(skb)->fl.iif == 0)
 +              if (rt_is_output_route(skb_rtable(skb)))
                        break;
                /* don't rely on MC router hearing unicast reports */
                if (skb->pkt_type == PACKET_MULTICAST ||
@@@ -1126,8 -1110,8 +1126,8 @@@ static void igmpv3_clear_delrec(struct 
                kfree(pmc);
        }
        /* clear dead sources, too */
 -      read_lock(&in_dev->mc_list_lock);
 -      for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, pmc) {
                struct ip_sf_list *psf, *psf_next;
  
                spin_lock_bh(&pmc->lock);
                        kfree(psf);
                }
        }
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  }
  #endif
  
@@@ -1225,7 -1209,7 +1225,7 @@@ void ip_mc_inc_group(struct in_device *
  
        ASSERT_RTNL();
  
 -      for (im=in_dev->mc_list; im; im=im->next) {
 +      for_each_pmc_rtnl(in_dev, im) {
                if (im->multiaddr == addr) {
                        im->users++;
                        ip_mc_add_src(in_dev, &addr, MCAST_EXCLUDE, 0, NULL, 0);
                }
        }
  
 -      im = kmalloc(sizeof(*im), GFP_KERNEL);
 +      im = kzalloc(sizeof(*im), GFP_KERNEL);
        if (!im)
                goto out;
  
        im->multiaddr = addr;
        /* initial mode is (EX, empty) */
        im->sfmode = MCAST_EXCLUDE;
 -      im->sfcount[MCAST_INCLUDE] = 0;
        im->sfcount[MCAST_EXCLUDE] = 1;
 -      im->sources = NULL;
 -      im->tomb = NULL;
 -      im->crcount = 0;
        atomic_set(&im->refcnt, 1);
        spin_lock_init(&im->lock);
  #ifdef CONFIG_IP_MULTICAST
 -      im->tm_running = 0;
        setup_timer(&im->timer, &igmp_timer_expire, (unsigned long)im);
        im->unsolicit_count = IGMP_Unsolicited_Report_Count;
 -      im->reporter = 0;
 -      im->gsquery = 0;
  #endif
 -      im->loaded = 0;
 -      write_lock_bh(&in_dev->mc_list_lock);
 -      im->next = in_dev->mc_list;
 -      in_dev->mc_list = im;
 +
 +      im->next_rcu = in_dev->mc_list;
        in_dev->mc_count++;
 -      write_unlock_bh(&in_dev->mc_list_lock);
 +      rcu_assign_pointer(in_dev->mc_list, im);
 +
  #ifdef CONFIG_IP_MULTICAST
        igmpv3_del_delrec(in_dev, im->multiaddr);
  #endif
@@@ -1295,18 -1287,17 +1295,18 @@@ EXPORT_SYMBOL(ip_mc_rejoin_group)
  
  void ip_mc_dec_group(struct in_device *in_dev, __be32 addr)
  {
 -      struct ip_mc_list *i, **ip;
 +      struct ip_mc_list *i;
 +      struct ip_mc_list __rcu **ip;
  
        ASSERT_RTNL();
  
 -      for (ip=&in_dev->mc_list; (i=*ip)!=NULL; ip=&i->next) {
 +      for (ip = &in_dev->mc_list;
 +           (i = rtnl_dereference(*ip)) != NULL;
 +           ip = &i->next_rcu) {
                if (i->multiaddr == addr) {
                        if (--i->users == 0) {
 -                              write_lock_bh(&in_dev->mc_list_lock);
 -                              *ip = i->next;
 +                              *ip = i->next_rcu;
                                in_dev->mc_count--;
 -                              write_unlock_bh(&in_dev->mc_list_lock);
                                igmp_group_dropped(i);
  
                                if (!in_dev->dead)
@@@ -1325,34 -1316,34 +1325,34 @@@ EXPORT_SYMBOL(ip_mc_dec_group)
  
  void ip_mc_unmap(struct in_device *in_dev)
  {
 -      struct ip_mc_list *i;
 +      struct ip_mc_list *pmc;
  
        ASSERT_RTNL();
  
 -      for (i = in_dev->mc_list; i; i = i->next)
 -              igmp_group_dropped(i);
 +      for_each_pmc_rtnl(in_dev, pmc)
 +              igmp_group_dropped(pmc);
  }
  
  void ip_mc_remap(struct in_device *in_dev)
  {
 -      struct ip_mc_list *i;
 +      struct ip_mc_list *pmc;
  
        ASSERT_RTNL();
  
 -      for (i = in_dev->mc_list; i; i = i->next)
 -              igmp_group_added(i);
 +      for_each_pmc_rtnl(in_dev, pmc)
 +              igmp_group_added(pmc);
  }
  
  /* Device going down */
  
  void ip_mc_down(struct in_device *in_dev)
  {
 -      struct ip_mc_list *i;
 +      struct ip_mc_list *pmc;
  
        ASSERT_RTNL();
  
 -      for (i=in_dev->mc_list; i; i=i->next)
 -              igmp_group_dropped(i);
 +      for_each_pmc_rtnl(in_dev, pmc)
 +              igmp_group_dropped(pmc);
  
  #ifdef CONFIG_IP_MULTICAST
        in_dev->mr_ifc_count = 0;
@@@ -1383,6 -1374,7 +1383,6 @@@ void ip_mc_init_dev(struct in_device *i
        in_dev->mr_qrv = IGMP_Unsolicited_Report_Count;
  #endif
  
 -      rwlock_init(&in_dev->mc_list_lock);
        spin_lock_init(&in_dev->mc_tomb_lock);
  }
  
  
  void ip_mc_up(struct in_device *in_dev)
  {
 -      struct ip_mc_list *i;
 +      struct ip_mc_list *pmc;
  
        ASSERT_RTNL();
  
        ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
  
 -      for (i=in_dev->mc_list; i; i=i->next)
 -              igmp_group_added(i);
 +      for_each_pmc_rtnl(in_dev, pmc)
 +              igmp_group_added(pmc);
  }
  
  /*
@@@ -1413,13 -1405,17 +1413,13 @@@ void ip_mc_destroy_dev(struct in_devic
        /* Deactivate timers */
        ip_mc_down(in_dev);
  
 -      write_lock_bh(&in_dev->mc_list_lock);
 -      while ((i = in_dev->mc_list) != NULL) {
 -              in_dev->mc_list = i->next;
 +      while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) {
 +              in_dev->mc_list = i->next_rcu;
                in_dev->mc_count--;
 -              write_unlock_bh(&in_dev->mc_list_lock);
 +
                igmp_group_dropped(i);
                ip_ma_put(i);
 -
 -              write_lock_bh(&in_dev->mc_list_lock);
        }
 -      write_unlock_bh(&in_dev->mc_list_lock);
  }
  
  /* RTNL is locked */
@@@ -1517,18 -1513,18 +1517,18 @@@ static int ip_mc_del_src(struct in_devi
  
        if (!in_dev)
                return -ENODEV;
 -      read_lock(&in_dev->mc_list_lock);
 -      for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, pmc) {
                if (*pmca == pmc->multiaddr)
                        break;
        }
        if (!pmc) {
                /* MCA not found?? bug */
 -              read_unlock(&in_dev->mc_list_lock);
 +              rcu_read_unlock();
                return -ESRCH;
        }
        spin_lock_bh(&pmc->lock);
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  #ifdef CONFIG_IP_MULTICAST
        sf_markstate(pmc);
  #endif
@@@ -1689,18 -1685,18 +1689,18 @@@ static int ip_mc_add_src(struct in_devi
  
        if (!in_dev)
                return -ENODEV;
 -      read_lock(&in_dev->mc_list_lock);
 -      for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, pmc) {
                if (*pmca == pmc->multiaddr)
                        break;
        }
        if (!pmc) {
                /* MCA not found?? bug */
 -              read_unlock(&in_dev->mc_list_lock);
 +              rcu_read_unlock();
                return -ESRCH;
        }
        spin_lock_bh(&pmc->lock);
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
  
  #ifdef CONFIG_IP_MULTICAST
        sf_markstate(pmc);
@@@ -1797,7 -1793,7 +1797,7 @@@ int ip_mc_join_group(struct sock *sk , 
  
        err = -EADDRINUSE;
        ifindex = imr->imr_ifindex;
 -      for (i = inet->mc_list; i; i = i->next) {
 +      for_each_pmc_rtnl(inet, i) {
                if (i->multi.imr_multiaddr.s_addr == addr &&
                    i->multi.imr_ifindex == ifindex)
                        goto done;
                goto done;
  
        memcpy(&iml->multi, imr, sizeof(*imr));
 -      iml->next = inet->mc_list;
 +      iml->next_rcu = inet->mc_list;
        iml->sflist = NULL;
        iml->sfmode = MCAST_EXCLUDE;
        rcu_assign_pointer(inet->mc_list, iml);
@@@ -1825,14 -1821,17 +1825,14 @@@ EXPORT_SYMBOL(ip_mc_join_group)
  
  static void ip_sf_socklist_reclaim(struct rcu_head *rp)
  {
 -      struct ip_sf_socklist *psf;
 -
 -      psf = container_of(rp, struct ip_sf_socklist, rcu);
 +      kfree(container_of(rp, struct ip_sf_socklist, rcu));
        /* sk_omem_alloc should have been decreased by the caller*/
 -      kfree(psf);
  }
  
  static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml,
                           struct in_device *in_dev)
  {
 -      struct ip_sf_socklist *psf = iml->sflist;
 +      struct ip_sf_socklist *psf = rtnl_dereference(iml->sflist);
        int err;
  
        if (psf == NULL) {
  
  static void ip_mc_socklist_reclaim(struct rcu_head *rp)
  {
 -      struct ip_mc_socklist *iml;
 -
 -      iml = container_of(rp, struct ip_mc_socklist, rcu);
 +      kfree(container_of(rp, struct ip_mc_socklist, rcu));
        /* sk_omem_alloc should have been decreased by the caller*/
 -      kfree(iml);
  }
  
  
  int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr)
  {
        struct inet_sock *inet = inet_sk(sk);
 -      struct ip_mc_socklist *iml, **imlp;
 +      struct ip_mc_socklist *iml;
 +      struct ip_mc_socklist __rcu **imlp;
        struct in_device *in_dev;
        struct net *net = sock_net(sk);
        __be32 group = imr->imr_multiaddr.s_addr;
        rtnl_lock();
        in_dev = ip_mc_find_dev(net, imr);
        ifindex = imr->imr_ifindex;
 -      for (imlp = &inet->mc_list; (iml = *imlp) != NULL; imlp = &iml->next) {
 +      for (imlp = &inet->mc_list;
 +           (iml = rtnl_dereference(*imlp)) != NULL;
 +           imlp = &iml->next_rcu) {
                if (iml->multi.imr_multiaddr.s_addr != group)
                        continue;
                if (ifindex) {
  
                (void) ip_mc_leave_src(sk, iml, in_dev);
  
 -              rcu_assign_pointer(*imlp, iml->next);
 +              *imlp = iml->next_rcu;
  
                if (in_dev)
                        ip_mc_dec_group(in_dev, group);
@@@ -1935,7 -1934,7 +1935,7 @@@ int ip_mc_source(int add, int omode, st
        }
        err = -EADDRNOTAVAIL;
  
 -      for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
 +      for_each_pmc_rtnl(inet, pmc) {
                if ((pmc->multi.imr_multiaddr.s_addr ==
                     imr.imr_multiaddr.s_addr) &&
                    (pmc->multi.imr_ifindex == imr.imr_ifindex))
                pmc->sfmode = omode;
        }
  
 -      psl = pmc->sflist;
 +      psl = rtnl_dereference(pmc->sflist);
        if (!add) {
                if (!psl)
                        goto done;      /* err = -EADDRNOTAVAIL */
@@@ -2078,7 -2077,7 +2078,7 @@@ int ip_mc_msfilter(struct sock *sk, str
                goto done;
        }
  
 -      for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
 +      for_each_pmc_rtnl(inet, pmc) {
                if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
                    pmc->multi.imr_ifindex == imr.imr_ifindex)
                        break;
                (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
                                     msf->imsf_fmode, 0, NULL, 0);
        }
 -      psl = pmc->sflist;
 +      psl = rtnl_dereference(pmc->sflist);
        if (psl) {
                (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
                        psl->sl_count, psl->sl_addr, 0);
@@@ -2156,7 -2155,7 +2156,7 @@@ int ip_mc_msfget(struct sock *sk, struc
        }
        err = -EADDRNOTAVAIL;
  
 -      for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
 +      for_each_pmc_rtnl(inet, pmc) {
                if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
                    pmc->multi.imr_ifindex == imr.imr_ifindex)
                        break;
        if (!pmc)               /* must have a prior join */
                goto done;
        msf->imsf_fmode = pmc->sfmode;
 -      psl = pmc->sflist;
 +      psl = rtnl_dereference(pmc->sflist);
        rtnl_unlock();
        if (!psl) {
                len = 0;
@@@ -2209,7 -2208,7 +2209,7 @@@ int ip_mc_gsfget(struct sock *sk, struc
  
        err = -EADDRNOTAVAIL;
  
 -      for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
 +      for_each_pmc_rtnl(inet, pmc) {
                if (pmc->multi.imr_multiaddr.s_addr == addr &&
                    pmc->multi.imr_ifindex == gsf->gf_interface)
                        break;
        if (!pmc)               /* must have a prior join */
                goto done;
        gsf->gf_fmode = pmc->sfmode;
 -      psl = pmc->sflist;
 +      psl = rtnl_dereference(pmc->sflist);
        rtnl_unlock();
        count = psl ? psl->sl_count : 0;
        copycount = count < gsf->gf_numsrc ? count : gsf->gf_numsrc;
@@@ -2258,7 -2257,7 +2258,7 @@@ int ip_mc_sf_allow(struct sock *sk, __b
                goto out;
  
        rcu_read_lock();
 -      for (pmc=rcu_dereference(inet->mc_list); pmc; pmc=rcu_dereference(pmc->next)) {
 +      for_each_pmc_rcu(inet, pmc) {
                if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
                    pmc->multi.imr_ifindex == dif)
                        break;
        ret = inet->mc_all;
        if (!pmc)
                goto unlock;
 -      psl = pmc->sflist;
 +      psl = rcu_dereference(pmc->sflist);
        ret = (pmc->sfmode == MCAST_EXCLUDE);
        if (!psl)
                goto unlock;
@@@ -2301,16 -2300,14 +2301,14 @@@ void ip_mc_drop_socket(struct sock *sk
                return;
  
        rtnl_lock();
 -      while ((iml = inet->mc_list) != NULL) {
 +      while ((iml = rtnl_dereference(inet->mc_list)) != NULL) {
                struct in_device *in_dev;
 -              rcu_assign_pointer(inet->mc_list, iml->next);
  
 +              inet->mc_list = iml->next_rcu;
                in_dev = inetdev_by_index(net, iml->multi.imr_ifindex);
                (void) ip_mc_leave_src(sk, iml, in_dev);
-               if (in_dev != NULL) {
+               if (in_dev != NULL)
                        ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr);
-                       in_dev_put(in_dev);
-               }
                /* decrease mem now to avoid the memleak warning */
                atomic_sub(sizeof(*iml), &sk->sk_omem_alloc);
                call_rcu(&iml->rcu, ip_mc_socklist_reclaim);
@@@ -2324,8 -2321,8 +2322,8 @@@ int ip_check_mc(struct in_device *in_de
        struct ip_sf_list *psf;
        int rv = 0;
  
 -      read_lock(&in_dev->mc_list_lock);
 -      for (im=in_dev->mc_list; im; im=im->next) {
 +      rcu_read_lock();
 +      for_each_pmc_rcu(in_dev, im) {
                if (im->multiaddr == mc_addr)
                        break;
        }
                } else
                        rv = 1; /* unspecified source; tentatively allow */
        }
 -      read_unlock(&in_dev->mc_list_lock);
 +      rcu_read_unlock();
        return rv;
  }
  
@@@ -2372,11 -2369,13 +2370,11 @@@ static inline struct ip_mc_list *igmp_m
                in_dev = __in_dev_get_rcu(state->dev);
                if (!in_dev)
                        continue;
 -              read_lock(&in_dev->mc_list_lock);
 -              im = in_dev->mc_list;
 +              im = rcu_dereference(in_dev->mc_list);
                if (im) {
                        state->in_dev = in_dev;
                        break;
                }
 -              read_unlock(&in_dev->mc_list_lock);
        }
        return im;
  }
  static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im)
  {
        struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
 -      im = im->next;
 -      while (!im) {
 -              if (likely(state->in_dev != NULL))
 -                      read_unlock(&state->in_dev->mc_list_lock);
  
 +      im = rcu_dereference(im->next_rcu);
 +      while (!im) {
                state->dev = next_net_device_rcu(state->dev);
                if (!state->dev) {
                        state->in_dev = NULL;
                state->in_dev = __in_dev_get_rcu(state->dev);
                if (!state->in_dev)
                        continue;
 -              read_lock(&state->in_dev->mc_list_lock);
 -              im = state->in_dev->mc_list;
 +              im = rcu_dereference(state->in_dev->mc_list);
        }
        return im;
  }
@@@ -2431,8 -2433,10 +2429,8 @@@ static void igmp_mc_seq_stop(struct seq
        __releases(rcu)
  {
        struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
 -      if (likely(state->in_dev != NULL)) {
 -              read_unlock(&state->in_dev->mc_list_lock);
 -              state->in_dev = NULL;
 -      }
 +
 +      state->in_dev = NULL;
        state->dev = NULL;
        rcu_read_unlock();
  }
@@@ -2454,7 -2458,7 +2452,7 @@@ static int igmp_mc_seq_show(struct seq_
                querier = "NONE";
  #endif
  
 -              if (state->in_dev->mc_list == im) {
 +              if (rcu_dereference(state->in_dev->mc_list) == im) {
                        seq_printf(seq, "%d\t%-10s: %5d %7s\n",
                                   state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier);
                }
@@@ -2513,7 -2517,8 +2511,7 @@@ static inline struct ip_sf_list *igmp_m
                idev = __in_dev_get_rcu(state->dev);
                if (unlikely(idev == NULL))
                        continue;
 -              read_lock(&idev->mc_list_lock);
 -              im = idev->mc_list;
 +              im = rcu_dereference(idev->mc_list);
                if (likely(im != NULL)) {
                        spin_lock_bh(&im->lock);
                        psf = im->sources;
                        }
                        spin_unlock_bh(&im->lock);
                }
 -              read_unlock(&idev->mc_list_lock);
        }
        return psf;
  }
@@@ -2537,6 -2543,9 +2535,6 @@@ static struct ip_sf_list *igmp_mcf_get_
                spin_unlock_bh(&state->im->lock);
                state->im = state->im->next;
                while (!state->im) {
 -                      if (likely(state->idev != NULL))
 -                              read_unlock(&state->idev->mc_list_lock);
 -
                        state->dev = next_net_device_rcu(state->dev);
                        if (!state->dev) {
                                state->idev = NULL;
                        state->idev = __in_dev_get_rcu(state->dev);
                        if (!state->idev)
                                continue;
 -                      read_lock(&state->idev->mc_list_lock);
 -                      state->im = state->idev->mc_list;
 +                      state->im = rcu_dereference(state->idev->mc_list);
                }
                if (!state->im)
                        break;
@@@ -2591,7 -2601,10 +2589,7 @@@ static void igmp_mcf_seq_stop(struct se
                spin_unlock_bh(&state->im->lock);
                state->im = NULL;
        }
 -      if (likely(state->idev != NULL)) {
 -              read_unlock(&state->idev->mc_list_lock);
 -              state->idev = NULL;
 -      }
 +      state->idev = NULL;
        state->dev = NULL;
        rcu_read_unlock();
  }
diff --combined net/ipv4/tcp.c
index 5f738c5c0dc4ec5fb750dfbe2948c503e4aab6fc,0814199694854e534eb4ff12671e02313dced8e9..2bb46d55f40cf0e680b420f6d80d7d745b6e1634
@@@ -282,7 -282,7 +282,7 @@@ int sysctl_tcp_fin_timeout __read_mostl
  struct percpu_counter tcp_orphan_count;
  EXPORT_SYMBOL_GPL(tcp_orphan_count);
  
int sysctl_tcp_mem[3] __read_mostly;
long sysctl_tcp_mem[3] __read_mostly;
  int sysctl_tcp_wmem[3] __read_mostly;
  int sysctl_tcp_rmem[3] __read_mostly;
  
@@@ -290,7 -290,7 +290,7 @@@ EXPORT_SYMBOL(sysctl_tcp_mem)
  EXPORT_SYMBOL(sysctl_tcp_rmem);
  EXPORT_SYMBOL(sysctl_tcp_wmem);
  
- atomic_t tcp_memory_allocated;        /* Current allocated memory. */
+ atomic_long_t tcp_memory_allocated;   /* Current allocated memory. */
  EXPORT_SYMBOL(tcp_memory_allocated);
  
  /*
@@@ -1193,7 -1193,7 +1193,7 @@@ void tcp_cleanup_rbuf(struct sock *sk, 
        struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
  
        WARN(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq),
 -           KERN_INFO "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n",
 +           "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n",
             tp->copied_seq, TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt);
  #endif
  
@@@ -1477,9 -1477,10 +1477,9 @@@ int tcp_recvmsg(struct kiocb *iocb, str
                         * shouldn't happen.
                         */
                        if (WARN(before(*seq, TCP_SKB_CB(skb)->seq),
 -                           KERN_INFO "recvmsg bug: copied %X "
 -                                     "seq %X rcvnxt %X fl %X\n", *seq,
 -                                     TCP_SKB_CB(skb)->seq, tp->rcv_nxt,
 -                                     flags))
 +                               "recvmsg bug: copied %X seq %X rcvnxt %X fl %X\n",
 +                               *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt,
 +                               flags))
                                break;
  
                        offset = *seq - TCP_SKB_CB(skb)->seq;
                                goto found_ok_skb;
                        if (tcp_hdr(skb)->fin)
                                goto found_fin_ok;
 -                      WARN(!(flags & MSG_PEEK), KERN_INFO "recvmsg bug 2: "
 -                                      "copied %X seq %X rcvnxt %X fl %X\n",
 -                                      *seq, TCP_SKB_CB(skb)->seq,
 -                                      tp->rcv_nxt, flags);
 +                      WARN(!(flags & MSG_PEEK),
 +                           "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n",
 +                           *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt, flags);
                }
  
                /* Well, if we have backlog, try to process it now yet. */
@@@ -2244,7 -2246,7 +2244,7 @@@ static int do_tcp_setsockopt(struct soc
                /* Values greater than interface MTU won't take effect. However
                 * at the point when this call is done we typically don't yet
                 * know which interface is going to be used */
-               if (val < 8 || val > MAX_TCP_WINDOW) {
+               if (val < 64 || val > MAX_TCP_WINDOW) {
                        err = -EINVAL;
                        break;
                }