Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 19 Nov 2013 23:50:47 +0000 (15:50 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 19 Nov 2013 23:50:47 +0000 (15:50 -0800)
Pull networking fixes from David Miller:
 "Mostly these are fixes for fallout due to merge window changes, as
  well as cures for problems that have been with us for a much longer
  period of time"

 1) Johannes Berg noticed two major deficiencies in our genetlink
    registration.  Some genetlink protocols we passing in constant
    counts for their ops array rather than something like
    ARRAY_SIZE(ops) or similar.  Also, some genetlink protocols were
    using fixed IDs for their multicast groups.

    We have to retain these fixed IDs to keep existing userland tools
    working, but reserve them so that other multicast groups used by
    other protocols can not possibly conflict.

    In dealing with these two problems, we actually now use less state
    management for genetlink operations and multicast groups.

 2) When configuring interface hardware timestamping, fix several
    drivers that simply do not validate that the hwtstamp_config value
    is one the driver actually supports.  From Ben Hutchings.

 3) Invalid memory references in mwifiex driver, from Amitkumar Karwar.

 4) In dev_forward_skb(), set the skb->protocol in the right order
    relative to skb_scrub_packet().  From Alexei Starovoitov.

 5) Bridge erroneously fails to use the proper wrapper functions to make
    calls to netdev_ops->ndo_vlan_rx_{add,kill}_vid.  Fix from Toshiaki
    Makita.

 6) When detaching a bridge port, make sure to flush all VLAN IDs to
    prevent them from leaking, also from Toshiaki Makita.

 7) Put in a compromise for TCP Small Queues so that deep queued devices
    that delay TX reclaim non-trivially don't have such a performance
    decrease.  One particularly problematic area is 802.11 AMPDU in
    wireless.  From Eric Dumazet.

 8) Fix crashes in tcp_fastopen_cache_get(), we can see NULL socket dsts
    here.  Fix from Eric Dumzaet, reported by Dave Jones.

 9) Fix use after free in ipv6 SIT driver, from Willem de Bruijn.

10) When computing mergeable buffer sizes, virtio-net fails to take the
    virtio-net header into account.  From Michael Dalton.

11) Fix seqlock deadlock in ip4_datagram_connect() wrt.  statistic
    bumping, this one has been with us for a while.  From Eric Dumazet.

12) Fix NULL deref in the new TIPC fragmentation handling, from Erik
    Hugne.

13) 6lowpan bit used for traffic classification was wrong, from Jukka
    Rissanen.

14) macvlan has the same issue as normal vlans did wrt.  propagating LRO
    disabling down to the real device, fix it the same way.  From Michal
    Kubecek.

15) CPSW driver needs to soft reset all slaves during suspend, from
    Daniel Mack.

16) Fix small frame pacing in FQ packet scheduler, from Eric Dumazet.

17) The xen-netfront RX buffer refill timer isn't properly scheduled on
    partial RX allocation success, from Ma JieYue.

18) When ipv6 ping protocol support was added, the AF_INET6 protocol
    initialization cleanup path on failure was borked a little.  Fix
    from Vlad Yasevich.

19) If a socket disconnects during a read/recvmsg/recvfrom/etc that
    blocks we can do the wrong thing with the msg_name we write back to
    userspace.  From Hannes Frederic Sowa.  There is another fix in the
    works from Hannes which will prevent future problems of this nature.

20) Fix route leak in VTI tunnel transmit, from Fan Du.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (106 commits)
  genetlink: make multicast groups const, prevent abuse
  genetlink: pass family to functions using groups
  genetlink: add and use genl_set_err()
  genetlink: remove family pointer from genl_multicast_group
  genetlink: remove genl_unregister_mc_group()
  hsr: don't call genl_unregister_mc_group()
  quota/genetlink: use proper genetlink multicast APIs
  drop_monitor/genetlink: use proper genetlink multicast APIs
  genetlink: only pass array to genl_register_family_with_ops()
  tcp: don't update snd_nxt, when a socket is switched from repair mode
  atm: idt77252: fix dev refcnt leak
  xfrm: Release dst if this dst is improper for vti tunnel
  netlink: fix documentation typo in netlink_set_err()
  be2net: Delete secondary unicast MAC addresses during be_close
  be2net: Fix unconditional enabling of Rx interface options
  net, virtio_net: replace the magic value
  ping: prevent NULL pointer dereference on write to msg_name
  bnx2x: Prevent "timeout waiting for state X"
  bnx2x: prevent CFC attention
  bnx2x: Prevent panic during DMAE timeout
  ...

19 files changed:
1  2 
MAINTAINERS
drivers/acpi/event.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/team/team.c
drivers/net/virtio_net.c
drivers/net/xen-netfront.c
drivers/scsi/pmcraid.c
drivers/thermal/thermal_core.c
net/ipv4/ip_tunnel.c
net/ipv4/ping.c
net/ipv4/udp.c
net/ipv6/addrconf.c
net/ipv6/af_inet6.c
net/ipv6/ip6_tunnel.c
net/ipv6/sit.c
net/netfilter/ipvs/ip_vs_ctl.c
net/openvswitch/datapath.c

diff --combined MAINTAINERS
index 0e598aeed5398551362b582d314995c3a47eaf9b,2295783f8d38e59016e8a86fe24f06caaf263fb3..63f30484932b1cddbe5f9c5bd05ca6473d612e0b
@@@ -253,20 -253,6 +253,20 @@@ F:       drivers/pci/*acpi
  F:    drivers/pci/*/*acpi*
  F:    drivers/pci/*/*/*acpi*
  
 +ACPI COMPONENT ARCHITECTURE (ACPICA)
 +M:    Robert Moore <robert.moore@intel.com>
 +M:    Lv Zheng <lv.zheng@intel.com>
 +M:    Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 +L:    linux-acpi@vger.kernel.org
 +L:    devel@acpica.org
 +W:    https://acpica.org/
 +W:    https://github.com/acpica/acpica/
 +Q:    https://patchwork.kernel.org/project/linux-acpi/list/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +S:    Supported
 +F:    drivers/acpi/acpica/
 +F:    include/acpi/
 +
  ACPI FAN DRIVER
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
@@@ -1070,6 -1056,7 +1070,6 @@@ S:      Maintaine
  ARM/NOMADIK ARCHITECTURE
  M:    Alessandro Rubini <rubini@unipv.it>
  M:    Linus Walleij <linus.walleij@linaro.org>
 -M:    STEricsson <STEricsson_nomadik_linux@list.st.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-nomadik/
@@@ -1425,7 -1412,7 +1425,7 @@@ M:      Wolfram Sang <wsa@the-dreams.de
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  F:    drivers/misc/eeprom/at24.c
 -F:    include/linux/i2c/at24.h
 +F:    include/linux/platform_data/at24.h
  
  ATA OVER ETHERNET (AOE) DRIVER
  M:    "Ed L. Cashin" <ecashin@coraid.com>
@@@ -1880,7 -1867,7 +1880,7 @@@ S:      Supporte
  F:    drivers/net/wireless/brcm80211/
  
  BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER
 -M:    Bhanu Prakash Gollapudi <bprakash@broadcom.com>
 +M:    Eddie Wai <eddie.wai@broadcom.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bnx2fc/
@@@ -2468,7 -2455,7 +2468,7 @@@ S:      Maintaine
  F:    drivers/media/dvb-frontends/cxd2820r*
  
  CXGB3 ETHERNET DRIVER (CXGB3)
- M:    Divy Le Ray <divy@chelsio.com>
+ M:    Santosh Raspatur <santosh@chelsio.com>
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
@@@ -2660,7 -2647,6 +2660,7 @@@ M:      dm-devel@redhat.co
  L:    dm-devel@redhat.com
  W:    http://sources.redhat.com/dm
  Q:    http://patchwork.kernel.org/project/dm-devel/list/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git
  T:    quilt http://people.redhat.com/agk/patches/linux/editing/
  S:    Maintained
  F:    Documentation/device-mapper/
@@@ -2848,9 -2834,7 +2848,9 @@@ L:      dri-devel@lists.freedesktop.or
  L:    linux-tegra@vger.kernel.org
  T:    git git://anongit.freedesktop.org/tegra/linux.git
  S:    Supported
 +F:    drivers/gpu/drm/tegra/
  F:    drivers/gpu/host1x/
 +F:    include/linux/host1x.h
  F:    include/uapi/drm/tegra_drm.h
  F:    Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt
  
@@@ -3063,14 -3047,6 +3063,14 @@@ W:    bluesmoke.sourceforge.ne
  S:    Maintained
  F:    drivers/edac/amd64_edac*
  
 +EDAC-CALXEDA
 +M:    Doug Thompson <dougthompson@xmission.com>
 +M:    Robert Richter <rric@kernel.org>
 +L:    linux-edac@vger.kernel.org
 +W:    bluesmoke.sourceforge.net
 +S:    Maintained
 +F:    drivers/edac/highbank*
 +
  EDAC-CAVIUM
  M:    Ralf Baechle <ralf@linux-mips.org>
  M:    David Daney <david.daney@cavium.com>
@@@ -3152,13 -3128,6 +3152,13 @@@ W:    bluesmoke.sourceforge.ne
  S:    Maintained
  F:    drivers/edac/i82975x_edac.c
  
 +EDAC-MPC85XX
 +M:    Johannes Thumshirn <johannes.thumshirn@men.de>
 +L:    linux-edac@vger.kernel.org
 +W:    bluesmoke.sourceforge.net
 +S:    Maintained
 +F:    drivers/edac/mpc85xx_edac.[ch]
 +
  EDAC-PASEMI
  M:    Egor Martovetsky <egor@pasemi.com>
  L:    linux-edac@vger.kernel.org
@@@ -4822,10 -4791,9 +4822,10 @@@ S:    Maintaine
  F:    drivers/staging/ktap/
  
  KCONFIG
 -M:    Michal Marek <mmarek@suse.cz>
 +M:    "Yann E. MORIN" <yann.morin.1998@free.fr>
  L:    linux-kbuild@vger.kernel.org
 -S:    Odd Fixes
 +T:    git://gitorious.org/linux-kconfig/linux-kconfig
 +S:    Maintained
  F:    Documentation/kbuild/kconfig-language.txt
  F:    scripts/kconfig/
  
@@@ -4888,8 -4856,7 +4888,8 @@@ KERNEL VIRTUAL MACHINE (KVM
  M:    Gleb Natapov <gleb@redhat.com>
  M:    Paolo Bonzini <pbonzini@redhat.com>
  L:    kvm@vger.kernel.org
 -W:    http://linux-kvm.org
 +W:    http://www.linux-kvm.org
 +T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
  S:    Supported
  F:    Documentation/*/kvm*.txt
  F:    Documentation/virtual/kvm/
@@@ -5229,7 -5196,6 +5229,7 @@@ M:      Jean Delvare <khali@linux-fr.org
  L:    lm-sensors@lm-sensors.org
  S:    Maintained
  F:    Documentation/hwmon/lm90
 +F:    Documentation/devicetree/bindings/hwmon/lm90.txt
  F:    drivers/hwmon/lm90.c
  
  LM95234 HARDWARE MONITOR DRIVER
@@@ -6446,7 -6412,6 +6446,7 @@@ S:      Supporte
  F:    Documentation/PCI/
  F:    drivers/pci/
  F:    include/linux/pci*
 +F:    arch/x86/pci/
  
  PCI DRIVER FOR NVIDIA TEGRA
  M:    Thierry Reding <thierry.reding@gmail.com>
@@@ -6455,12 -6420,6 +6455,12 @@@ S:    Supporte
  F:    Documentation/devicetree/bindings/pci/nvidia,tegra20-pcie.txt
  F:    drivers/pci/host/pci-tegra.c
  
 +PCI DRIVER FOR SAMSUNG EXYNOS
 +M:    Jingoo Han <jg1.han@samsung.com>
 +L:    linux-pci@vger.kernel.org
 +S:    Maintained
 +F:    drivers/pci/host/pci-exynos.c
 +
  PCMCIA SUBSYSTEM
  P:    Linux PCMCIA Team
  L:    linux-pcmcia@lists.infradead.org
@@@ -6799,7 -6758,8 +6799,7 @@@ PWM SUBSYSTE
  M:    Thierry Reding <thierry.reding@gmail.com>
  L:    linux-pwm@vger.kernel.org
  S:    Maintained
 -W:    http://gitorious.org/linux-pwm
 -T:    git git://gitorious.org/linux-pwm/linux-pwm.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git
  F:    Documentation/pwm.txt
  F:    Documentation/devicetree/bindings/pwm/
  F:    include/linux/pwm.h
@@@ -8960,8 -8920,8 +8960,8 @@@ USB PEGASUS DRIVE
  M:    Petko Manolov <petkan@nucleusys.com>
  L:    linux-usb@vger.kernel.org
  L:    netdev@vger.kernel.org
- T:    git git://git.code.sf.net/p/pegasus2/git
- W:    http://pegasus2.sourceforge.net/
+ T:    git git://github.com/petkan/pegasus.git
+ W:    https://github.com/petkan/pegasus
  S:    Maintained
  F:    drivers/net/usb/pegasus.*
  
@@@ -8982,8 -8942,8 +8982,8 @@@ USB RTL8150 DRIVE
  M:    Petko Manolov <petkan@nucleusys.com>
  L:    linux-usb@vger.kernel.org
  L:    netdev@vger.kernel.org
- T:    git git://git.code.sf.net/p/pegasus2/git
- W:    http://pegasus2.sourceforge.net/
+ T:    git git://github.com/petkan/rtl8150.git
+ W:    https://github.com/petkan/rtl8150
  S:    Maintained
  F:    drivers/net/usb/rtl8150.c
  
diff --combined drivers/acpi/event.c
index fdef416c0ff6f0384e107466b47b1ff8f2bac9aa,aeb5aa6ce068911d21555a60d16f82dfbd7070b5..cae3b387b867a99ab7013cfc2b731b2125abc961
@@@ -78,15 -78,17 +78,17 @@@ enum 
  #define ACPI_GENL_VERSION             0x01
  #define ACPI_GENL_MCAST_GROUP_NAME    "acpi_mc_group"
  
+ static const struct genl_multicast_group acpi_event_mcgrps[] = {
+       { .name = ACPI_GENL_MCAST_GROUP_NAME, },
+ };
  static struct genl_family acpi_event_genl_family = {
        .id = GENL_ID_GENERATE,
        .name = ACPI_GENL_FAMILY_NAME,
        .version = ACPI_GENL_VERSION,
        .maxattr = ACPI_GENL_ATTR_MAX,
- };
- static struct genl_multicast_group acpi_event_mcgrp = {
-       .name = ACPI_GENL_MCAST_GROUP_NAME,
+       .mcgrps = acpi_event_mcgrps,
+       .n_mcgrps = ARRAY_SIZE(acpi_event_mcgrps),
  };
  
  int acpi_bus_generate_netlink_event(const char *device_class,
        }
  
        event = nla_data(attr);
 -      if (!event) {
 -              nlmsg_free(skb);
 -              return -EINVAL;
 -      }
 -
        memset(event, 0, sizeof(struct acpi_genl_event));
  
        strcpy(event->device_class, device_class);
                return result;
        }
  
-       genlmsg_multicast(skb, 0, acpi_event_mcgrp.id, GFP_ATOMIC);
+       genlmsg_multicast(&acpi_event_genl_family, skb, 0, 0, GFP_ATOMIC);
        return 0;
  }
  
@@@ -149,18 -156,7 +151,7 @@@ EXPORT_SYMBOL(acpi_bus_generate_netlink
  
  static int acpi_event_genetlink_init(void)
  {
-       int result;
-       result = genl_register_family(&acpi_event_genl_family);
-       if (result)
-               return result;
-       result = genl_register_mc_group(&acpi_event_genl_family,
-                                       &acpi_event_mcgrp);
-       if (result)
-               genl_unregister_family(&acpi_event_genl_family);
-       return result;
+       return genl_register_family(&acpi_event_genl_family);
  }
  
  #else
index e622cc1f96ffe58336ee8c24f12c54e1679e11b7,8eb6469813c53338cfd2f96663208b9e06100d8c..814d0eca9b334ea86c862bc617a46f137f04d475
@@@ -577,7 -577,9 +577,9 @@@ void bnx2x_write_dmae(struct bnx2x *bp
        rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
        if (rc) {
                BNX2X_ERR("DMAE returned failure %d\n", rc);
+ #ifdef BNX2X_STOP_ON_ERROR
                bnx2x_panic();
+ #endif
        }
  }
  
@@@ -614,7 -616,9 +616,9 @@@ void bnx2x_read_dmae(struct bnx2x *bp, 
        rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
        if (rc) {
                BNX2X_ERR("DMAE returned failure %d\n", rc);
+ #ifdef BNX2X_STOP_ON_ERROR
                bnx2x_panic();
+ #endif
        }
  }
  
@@@ -5231,18 -5235,18 +5235,18 @@@ static void bnx2x_eq_int(struct bnx2x *
  
                case EVENT_RING_OPCODE_STOP_TRAFFIC:
                        DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got STOP TRAFFIC\n");
+                       bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_PAUSED);
                        if (f_obj->complete_cmd(bp, f_obj,
                                                BNX2X_F_CMD_TX_STOP))
                                break;
-                       bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_PAUSED);
                        goto next_spqe;
  
                case EVENT_RING_OPCODE_START_TRAFFIC:
                        DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got START TRAFFIC\n");
+                       bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED);
                        if (f_obj->complete_cmd(bp, f_obj,
                                                BNX2X_F_CMD_TX_START))
                                break;
-                       bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED);
                        goto next_spqe;
  
                case EVENT_RING_OPCODE_FUNCTION_UPDATE:
@@@ -9352,6 -9356,10 +9356,10 @@@ static int bnx2x_process_kill(struct bn
        bnx2x_process_kill_chip_reset(bp, global);
        barrier();
  
+       /* clear errors in PGB */
+       if (!CHIP_IS_E1x(bp))
+               REG_WR(bp, PGLUE_B_REG_LATCHED_ERRORS_CLR, 0x7f);
        /* Recover after reset: */
        /* MCP */
        if (global && bnx2x_reset_mcp_comp(bp, val))
@@@ -9706,11 -9714,10 +9714,10 @@@ sp_rtnl_not_reset
                               &bp->sp_rtnl_state))
                bnx2x_pf_set_vfs_vlan(bp);
  
-       if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state))
+       if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state)) {
                bnx2x_dcbx_stop_hw_tx(bp);
-       if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state))
                bnx2x_dcbx_resume_hw_tx(bp);
+       }
  
        /* work which needs rtnl lock not-taken (as it takes the lock itself and
         * can be called from other contexts as well)
@@@ -12140,8 -12147,12 +12147,8 @@@ static int bnx2x_set_coherency_mask(str
  {
        struct device *dev = &bp->pdev->dev;
  
 -      if (dma_set_mask(dev, DMA_BIT_MASK(64)) == 0) {
 -              if (dma_set_coherent_mask(dev, DMA_BIT_MASK(64)) != 0) {
 -                      dev_err(dev, "dma_set_coherent_mask failed, aborting\n");
 -                      return -EIO;
 -              }
 -      } else if (dma_set_mask(dev, DMA_BIT_MASK(32)) != 0) {
 +      if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)) != 0 &&
 +          dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)) != 0) {
                dev_err(dev, "System does not support DMA, aborting\n");
                return -EIO;
        }
index eaecaadfa8c56436994c2afbe9a70223467ceec2,8e28cedf823ba7ddac5aeb4c333d128c2198b12d..abde97471636918a6b7e2381634cdc743678d24c
@@@ -1079,7 -1079,7 +1079,7 @@@ static int be_vid_config(struct be_adap
                        vids[num++] = cpu_to_le16(i);
  
        status = be_cmd_vlan_config(adapter, adapter->if_handle,
-                                   vids, num, 1, 0);
+                                   vids, num, 0);
  
        if (status) {
                /* Set to VLAN promisc mode as setting VLAN filter failed */
@@@ -2148,9 -2148,6 +2148,9 @@@ static int be_tx_qs_create(struct be_ad
                if (status)
                        return status;
  
 +              u64_stats_init(&txo->stats.sync);
 +              u64_stats_init(&txo->stats.sync_compl);
 +
                /* If num_evt_qs is less than num_tx_qs, then more than
                 * one txq share an eq
                 */
@@@ -2212,7 -2209,6 +2212,7 @@@ static int be_rx_cqs_create(struct be_a
                if (rc)
                        return rc;
  
 +              u64_stats_init(&rxo->stats.sync);
                eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
                rc = be_cmd_cq_create(adapter, cq, eq, false, 3);
                if (rc)
@@@ -2676,6 -2672,11 +2676,11 @@@ static int be_close(struct net_device *
  
        be_rx_qs_destroy(adapter);
  
+       for (i = 1; i < (adapter->uc_macs + 1); i++)
+               be_cmd_pmac_del(adapter, adapter->if_handle,
+                               adapter->pmac_id[i], 0);
+       adapter->uc_macs = 0;
        for_all_evt_queues(adapter, eqo, i) {
                if (msix_enabled(adapter))
                        synchronize_irq(be_msix_vec_get(adapter, eqo));
@@@ -4491,11 -4492,19 +4496,11 @@@ static int be_probe(struct pci_dev *pde
        adapter->netdev = netdev;
        SET_NETDEV_DEV(netdev, &pdev->dev);
  
 -      status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
 +      status = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
        if (!status) {
 -              status = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
 -              if (status < 0) {
 -                      dev_err(&pdev->dev, "dma_set_coherent_mask failed\n");
 -                      goto free_netdev;
 -              }
                netdev->features |= NETIF_F_HIGHDMA;
        } else {
 -              status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
 -              if (!status)
 -                      status = dma_set_coherent_mask(&pdev->dev,
 -                                                     DMA_BIT_MASK(32));
 +              status = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
                if (status) {
                        dev_err(&pdev->dev, "Could not set PCI DMA Mask\n");
                        goto free_netdev;
index aedd5736a87d53862fa2be4176e9762fcd8df18a,f028165753694500fb9ac0d22e5ad44974592ea3..8d3945ab7334840684db42ea6eefa9bafc52c061
@@@ -3482,10 -3482,10 +3482,10 @@@ s32 e1000e_get_base_timinca(struct e100
   * specified. Matching the kind of event packet is not supported, with the
   * exception of "all V2 events regardless of level 2 or 4".
   **/
- static int e1000e_config_hwtstamp(struct e1000_adapter *adapter)
+ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,
+                                 struct hwtstamp_config *config)
  {
        struct e1000_hw *hw = &adapter->hw;
-       struct hwtstamp_config *config = &adapter->hwtstamp_config;
        u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;
        u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
        u32 rxmtrl = 0;
                return -ERANGE;
        }
  
+       adapter->hwtstamp_config = *config;
        /* enable/disable Tx h/w time stamping */
        regval = er32(TSYNCTXCTL);
        regval &= ~E1000_TSYNCTXCTL_ENABLED;
@@@ -3874,7 -3876,7 +3876,7 @@@ void e1000e_reset(struct e1000_adapter 
        e1000e_reset_adaptive(hw);
  
        /* initialize systim and reset the ns time counter */
-       e1000e_config_hwtstamp(adapter);
+       e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config);
  
        /* Set EEE advertisement as appropriate */
        if (adapter->flags2 & FLAG2_HAS_EEE) {
@@@ -5797,14 -5799,10 +5799,10 @@@ static int e1000e_hwtstamp_ioctl(struc
        if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
                return -EFAULT;
  
-       adapter->hwtstamp_config = config;
-       ret_val = e1000e_config_hwtstamp(adapter);
+       ret_val = e1000e_config_hwtstamp(adapter, &config);
        if (ret_val)
                return ret_val;
  
-       config = adapter->hwtstamp_config;
        switch (config.rx_filter) {
        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
@@@ -6553,15 -6551,21 +6551,15 @@@ static int e1000_probe(struct pci_dev *
                return err;
  
        pci_using_dac = 0;
 -      err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
 +      err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
        if (!err) {
 -              err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
 -              if (!err)
 -                      pci_using_dac = 1;
 +              pci_using_dac = 1;
        } else {
 -              err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
 +              err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
                if (err) {
 -                      err = dma_set_coherent_mask(&pdev->dev,
 -                                                  DMA_BIT_MASK(32));
 -                      if (err) {
 -                              dev_err(&pdev->dev,
 -                                      "No usable DMA configuration, aborting\n");
 -                              goto err_dma;
 -                      }
 +                      dev_err(&pdev->dev,
 +                              "No usable DMA configuration, aborting\n");
 +                      goto err_dma;
                }
        }
  
diff --combined drivers/net/team/team.c
index 6574eb8766f90997c38d0ea56d67ad542ecf99b3,0715de50b3dcc8e92ca65dd0a2a1a3f7270d412a..34b0de09d88190a04e30d867e31ad001f35f0e34
@@@ -1540,12 -1540,6 +1540,12 @@@ static int team_init(struct net_device 
        if (!team->pcpu_stats)
                return -ENOMEM;
  
 +      for_each_possible_cpu(i) {
 +              struct team_pcpu_stats *team_stats;
 +              team_stats = per_cpu_ptr(team->pcpu_stats, i);
 +              u64_stats_init(&team_stats->syncp);
 +      }
 +
        for (i = 0; i < TEAM_PORT_HASHENTRIES; i++)
                INIT_HLIST_HEAD(&team->en_port_hlist[i]);
        INIT_LIST_HEAD(&team->port_list);
@@@ -2650,7 -2644,7 +2650,7 @@@ static int team_nl_cmd_port_list_get(st
        return err;
  }
  
- static struct genl_ops team_nl_ops[] = {
+ static const struct genl_ops team_nl_ops[] = {
        {
                .cmd = TEAM_CMD_NOOP,
                .doit = team_nl_cmd_noop,
        },
  };
  
- static struct genl_multicast_group team_change_event_mcgrp = {
-       .name = TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME,
+ static const struct genl_multicast_group team_nl_mcgrps[] = {
+       { .name = TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME, },
  };
  
  static int team_nl_send_multicast(struct sk_buff *skb,
                                  struct team *team, u32 portid)
  {
-       return genlmsg_multicast_netns(dev_net(team->dev), skb, 0,
-                                      team_change_event_mcgrp.id, GFP_KERNEL);
+       return genlmsg_multicast_netns(&team_nl_family, dev_net(team->dev),
+                                      skb, 0, 0, GFP_KERNEL);
  }
  
  static int team_nl_send_event_options_get(struct team *team,
@@@ -2703,23 -2697,8 +2703,8 @@@ static int team_nl_send_event_port_get(
  
  static int team_nl_init(void)
  {
-       int err;
-       err = genl_register_family_with_ops(&team_nl_family, team_nl_ops,
-                                           ARRAY_SIZE(team_nl_ops));
-       if (err)
-               return err;
-       err = genl_register_mc_group(&team_nl_family, &team_change_event_mcgrp);
-       if (err)
-               goto err_change_event_grp_reg;
-       return 0;
- err_change_event_grp_reg:
-       genl_unregister_family(&team_nl_family);
-       return err;
+       return genl_register_family_with_ops_groups(&team_nl_family, team_nl_ops,
+                                                   team_nl_mcgrps);
  }
  
  static void team_nl_fini(void)
diff --combined drivers/net/virtio_net.c
index cdc7c90a6a9e3053d3a2e26eb78100a0f518b646,69ad42ba15385f5e3d48848c9e32892acd0dbed8..7bab4de658a91d9fb1231f5e45461a268efc8487
@@@ -36,7 -36,10 +36,10 @@@ module_param(csum, bool, 0444)
  module_param(gso, bool, 0444);
  
  /* FIXME: MTU in config. */
- #define MAX_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN)
+ #define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN)
+ #define MERGE_BUFFER_LEN (ALIGN(GOOD_PACKET_LEN + \
+                                 sizeof(struct virtio_net_hdr_mrg_rxbuf), \
+                                 L1_CACHE_BYTES))
  #define GOOD_COPY_LEN 128
  
  #define VIRTNET_DRIVER_VERSION "1.0.0"
@@@ -314,10 -317,10 +317,10 @@@ static int receive_mergeable(struct rec
                        head_skb->dev->stats.rx_length_errors++;
                        return -EINVAL;
                }
-               if (unlikely(len > MAX_PACKET_LEN)) {
+               if (unlikely(len > MERGE_BUFFER_LEN)) {
                        pr_debug("%s: rx error: merge buffer too long\n",
                                 head_skb->dev->name);
-                       len = MAX_PACKET_LEN;
+                       len = MERGE_BUFFER_LEN;
                }
                if (unlikely(num_skb_frags == MAX_SKB_FRAGS)) {
                        struct sk_buff *nskb = alloc_skb(0, GFP_ATOMIC);
                if (curr_skb != head_skb) {
                        head_skb->data_len += len;
                        head_skb->len += len;
-                       head_skb->truesize += MAX_PACKET_LEN;
+                       head_skb->truesize += MERGE_BUFFER_LEN;
                }
                page = virt_to_head_page(buf);
                offset = buf - (char *)page_address(page);
                if (skb_can_coalesce(curr_skb, num_skb_frags, page, offset)) {
                        put_page(page);
                        skb_coalesce_rx_frag(curr_skb, num_skb_frags - 1,
-                                            len, MAX_PACKET_LEN);
+                                            len, MERGE_BUFFER_LEN);
                } else {
                        skb_add_rx_frag(curr_skb, num_skb_frags, page,
-                                       offset, len,
-                                       MAX_PACKET_LEN);
+                                       offset, len, MERGE_BUFFER_LEN);
                }
                --rq->num;
        }
@@@ -383,7 -385,7 +385,7 @@@ static void receive_buf(struct receive_
                struct page *page = virt_to_head_page(buf);
                skb = page_to_skb(rq, page,
                                  (char *)buf - (char *)page_address(page),
-                                 len, MAX_PACKET_LEN);
+                                 len, MERGE_BUFFER_LEN);
                if (unlikely(!skb)) {
                        dev->stats.rx_dropped++;
                        put_page(page);
@@@ -471,11 -473,11 +473,11 @@@ static int add_recvbuf_small(struct rec
        struct skb_vnet_hdr *hdr;
        int err;
  
-       skb = __netdev_alloc_skb_ip_align(vi->dev, MAX_PACKET_LEN, gfp);
+       skb = __netdev_alloc_skb_ip_align(vi->dev, GOOD_PACKET_LEN, gfp);
        if (unlikely(!skb))
                return -ENOMEM;
  
-       skb_put(skb, MAX_PACKET_LEN);
+       skb_put(skb, GOOD_PACKET_LEN);
  
        hdr = skb_vnet_hdr(skb);
        sg_set_buf(rq->sg, &hdr->hdr, sizeof hdr->hdr);
@@@ -542,20 -544,20 +544,20 @@@ static int add_recvbuf_mergeable(struc
        int err;
  
        if (gfp & __GFP_WAIT) {
-               if (skb_page_frag_refill(MAX_PACKET_LEN, &vi->alloc_frag,
+               if (skb_page_frag_refill(MERGE_BUFFER_LEN, &vi->alloc_frag,
                                         gfp)) {
                        buf = (char *)page_address(vi->alloc_frag.page) +
                              vi->alloc_frag.offset;
                        get_page(vi->alloc_frag.page);
-                       vi->alloc_frag.offset += MAX_PACKET_LEN;
+                       vi->alloc_frag.offset += MERGE_BUFFER_LEN;
                }
        } else {
-               buf = netdev_alloc_frag(MAX_PACKET_LEN);
+               buf = netdev_alloc_frag(MERGE_BUFFER_LEN);
        }
        if (!buf)
                return -ENOMEM;
  
-       sg_init_one(rq->sg, buf, MAX_PACKET_LEN);
+       sg_init_one(rq->sg, buf, MERGE_BUFFER_LEN);
        err = virtqueue_add_inbuf(rq->vq, rq->sg, 1, buf, gfp);
        if (err < 0)
                put_page(virt_to_head_page(buf));
@@@ -591,8 -593,7 +593,8 @@@ static bool try_fill_recv(struct receiv
        } while (rq->vq->num_free);
        if (unlikely(rq->num > rq->max))
                rq->max = rq->num;
 -      virtqueue_kick(rq->vq);
 +      if (unlikely(!virtqueue_kick(rq->vq)))
 +              return false;
        return !oom;
  }
  
@@@ -798,7 -799,7 +800,7 @@@ static netdev_tx_t start_xmit(struct sk
        err = xmit_skb(sq, skb);
  
        /* This should not happen! */
 -      if (unlikely(err)) {
 +      if (unlikely(err) || unlikely(!virtqueue_kick(sq->vq))) {
                dev->stats.tx_fifo_errors++;
                if (net_ratelimit())
                        dev_warn(&dev->dev,
                kfree_skb(skb);
                return NETDEV_TX_OK;
        }
 -      virtqueue_kick(sq->vq);
  
        /* Don't wait up for transmitted skbs to be freed. */
        skb_orphan(skb);
@@@ -865,14 -867,12 +867,14 @@@ static bool virtnet_send_command(struc
        BUG_ON(virtqueue_add_sgs(vi->cvq, sgs, out_num, in_num, vi, GFP_ATOMIC)
               < 0);
  
 -      virtqueue_kick(vi->cvq);
 +      if (unlikely(!virtqueue_kick(vi->cvq)))
 +              return status == VIRTIO_NET_OK;
  
        /* Spin for a response, the kick causes an ioport write, trapping
         * into the hypervisor, so the request should be handled immediately.
         */
 -      while (!virtqueue_get_buf(vi->cvq, &tmp))
 +      while (!virtqueue_get_buf(vi->cvq, &tmp) &&
 +             !virtqueue_is_broken(vi->cvq))
                cpu_relax();
  
        return status == VIRTIO_NET_OK;
@@@ -900,13 -900,8 +902,13 @@@ static int virtnet_set_mac_address(stru
                        return -EINVAL;
                }
        } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
 -              vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
 -                                addr->sa_data, dev->addr_len);
 +              unsigned int i;
 +
 +              /* Naturally, this has an atomicity problem. */
 +              for (i = 0; i < dev->addr_len; i++)
 +                      virtio_cwrite8(vdev,
 +                                     offsetof(struct virtio_net_config, mac) +
 +                                     i, addr->sa_data[i]);
        }
  
        eth_commit_mac_addr_change(dev, p);
@@@ -1288,8 -1283,9 +1290,8 @@@ static void virtnet_config_changed_work
        if (!vi->config_enable)
                goto done;
  
 -      if (virtio_config_val(vi->vdev, VIRTIO_NET_F_STATUS,
 -                            offsetof(struct virtio_net_config, status),
 -                            &v) < 0)
 +      if (virtio_cread_feature(vi->vdev, VIRTIO_NET_F_STATUS,
 +                               struct virtio_net_config, status, &v) < 0)
                goto done;
  
        if (v & VIRTIO_NET_S_ANNOUNCE) {
@@@ -1513,9 -1509,9 +1515,9 @@@ static int virtnet_probe(struct virtio_
        u16 max_queue_pairs;
  
        /* Find if host supports multiqueue virtio_net device */
 -      err = virtio_config_val(vdev, VIRTIO_NET_F_MQ,
 -                              offsetof(struct virtio_net_config,
 -                              max_virtqueue_pairs), &max_queue_pairs);
 +      err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ,
 +                                 struct virtio_net_config,
 +                                 max_virtqueue_pairs, &max_queue_pairs);
  
        /* We need at least 2 queue's */
        if (err || max_queue_pairs < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN ||
        dev->vlan_features = dev->features;
  
        /* Configuration may specify what MAC to use.  Otherwise random. */
 -      if (virtio_config_val_len(vdev, VIRTIO_NET_F_MAC,
 -                                offsetof(struct virtio_net_config, mac),
 -                                dev->dev_addr, dev->addr_len) < 0)
 +      if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
 +              virtio_cread_bytes(vdev,
 +                                 offsetof(struct virtio_net_config, mac),
 +                                 dev->dev_addr, dev->addr_len);
 +      else
                eth_hw_addr_random(dev);
  
        /* Set up our device-specific information */
        if (vi->stats == NULL)
                goto free;
  
 +      for_each_possible_cpu(i) {
 +              struct virtnet_stats *virtnet_stats;
 +              virtnet_stats = per_cpu_ptr(vi->stats, i);
 +              u64_stats_init(&virtnet_stats->tx_syncp);
 +              u64_stats_init(&virtnet_stats->rx_syncp);
 +      }
 +
        mutex_init(&vi->config_lock);
        vi->config_enable = true;
        INIT_WORK(&vi->config_work, virtnet_config_changed_work);
        if (err)
                goto free_stats;
  
-       netif_set_real_num_tx_queues(dev, 1);
-       netif_set_real_num_rx_queues(dev, 1);
+       netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);
+       netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);
  
        err = register_netdev(dev);
        if (err) {
@@@ -1712,7 -1699,7 +1714,7 @@@ static void virtnet_remove(struct virti
        free_netdev(vi->dev);
  }
  
 -#ifdef CONFIG_PM
 +#ifdef CONFIG_PM_SLEEP
  static int virtnet_freeze(struct virtio_device *vdev)
  {
        struct virtnet_info *vi = vdev->priv;
@@@ -1803,7 -1790,7 +1805,7 @@@ static struct virtio_driver virtio_net_
        .probe =        virtnet_probe,
        .remove =       virtnet_remove,
        .config_changed = virtnet_config_changed,
 -#ifdef CONFIG_PM
 +#ifdef CONFIG_PM_SLEEP
        .freeze =       virtnet_freeze,
        .restore =      virtnet_restore,
  #endif
index d85e66979711cbe62a168d9012f1a40ed2d5c405,5bd20d99acc83e7878500efffb2a2eb28b0ed082..e59acb1daa2355efd56e4398ab82d0c0f8647ab4
@@@ -277,12 -277,13 +277,13 @@@ static void xennet_alloc_rx_buffers(str
                if (!page) {
                        kfree_skb(skb);
  no_skb:
-                       /* Any skbuffs queued for refill? Force them out. */
-                       if (i != 0)
-                               goto refill;
                        /* Could not allocate any skbuffs. Try again later. */
                        mod_timer(&np->rx_refill_timer,
                                  jiffies + (HZ/10));
+                       /* Any skbuffs queued for refill? Force them out. */
+                       if (i != 0)
+                               goto refill;
                        break;
                }
  
@@@ -1340,12 -1341,6 +1341,12 @@@ static struct net_device *xennet_create
        if (np->stats == NULL)
                goto exit;
  
 +      for_each_possible_cpu(i) {
 +              struct netfront_stats *xen_nf_stats;
 +              xen_nf_stats = per_cpu_ptr(np->stats, i);
 +              u64_stats_init(&xen_nf_stats->syncp);
 +      }
 +
        /* Initialise tx_skbs as a free chain containing every entry. */
        np->tx_skb_freelist = 0;
        for (i = 0; i < NET_TX_RING_SIZE; i++) {
diff --combined drivers/scsi/pmcraid.c
index e43db7742047aca836fab57c61b1530740f6d383,2775441111ff81a8171628b3fdd28d95340a2048..bd6f743d87a78af19c698d38d70291723fd28dfb
@@@ -1512,7 -1512,8 +1512,8 @@@ static int pmcraid_notify_aen
        }
  
        result =
-               genlmsg_multicast(skb, 0, pmcraid_event_family.id, GFP_ATOMIC);
+               genlmsg_multicast(&pmcraid_event_family, skb, 0,
+                                 pmcraid_event_family.id, GFP_ATOMIC);
  
        /* If there are no listeners, genlmsg_multicast may return non-zero
         * value.
@@@ -6049,6 -6050,7 +6050,6 @@@ out_release_regions
  
  out_disable_device:
        atomic_dec(&pmcraid_adapter_count);
 -      pci_set_drvdata(pdev, NULL);
        pci_disable_device(pdev);
        return -ENODEV;
  }
index 03a567199bbe313cd36dd0a4d62e3d9f7cab957d,19edd6124ca3389d280b8713b5a39224a6178361..f1d511a9475b4dc29ec28864cb3b948e8ba13183
@@@ -247,11 -247,10 +247,11 @@@ static void bind_cdev(struct thermal_co
                if (!pos->tzp && !pos->ops->bind)
                        continue;
  
 -              if (!pos->tzp && pos->ops->bind) {
 +              if (pos->ops->bind) {
                        ret = pos->ops->bind(pos, cdev);
                        if (ret)
                                print_bind_err_msg(pos, cdev, ret);
 +                      continue;
                }
  
                tzp = pos->tzp;
@@@ -283,8 -282,8 +283,8 @@@ static void bind_tz(struct thermal_zone
  
        mutex_lock(&thermal_list_lock);
  
 -      /* If there is no platform data, try to use ops->bind */
 -      if (!tzp && tz->ops->bind) {
 +      /* If there is ops->bind, try to use ops->bind */
 +      if (tz->ops->bind) {
                list_for_each_entry(pos, &thermal_cdev_list, node) {
                        ret = tz->ops->bind(tz, pos);
                        if (ret)
@@@ -1039,8 -1038,7 +1039,8 @@@ static void thermal_release(struct devi
                     sizeof("thermal_zone") - 1)) {
                tz = to_thermal_zone(dev);
                kfree(tz);
 -      } else {
 +      } else if(!strncmp(dev_name(dev), "cooling_device",
 +                      sizeof("cooling_device") - 1)){
                cdev = to_cooling_device(dev);
                kfree(cdev);
        }
@@@ -1608,15 -1606,17 +1608,17 @@@ exit
  EXPORT_SYMBOL_GPL(thermal_zone_get_zone_by_name);
  
  #ifdef CONFIG_NET
+ static const struct genl_multicast_group thermal_event_mcgrps[] = {
+       { .name = THERMAL_GENL_MCAST_GROUP_NAME, },
+ };
  static struct genl_family thermal_event_genl_family = {
        .id = GENL_ID_GENERATE,
        .name = THERMAL_GENL_FAMILY_NAME,
        .version = THERMAL_GENL_VERSION,
        .maxattr = THERMAL_GENL_ATTR_MAX,
- };
- static struct genl_multicast_group thermal_event_mcgrp = {
-       .name = THERMAL_GENL_MCAST_GROUP_NAME,
+       .mcgrps = thermal_event_mcgrps,
+       .n_mcgrps = ARRAY_SIZE(thermal_event_mcgrps),
  };
  
  int thermal_generate_netlink_event(struct thermal_zone_device *tz,
                return result;
        }
  
-       result = genlmsg_multicast(skb, 0, thermal_event_mcgrp.id, GFP_ATOMIC);
+       result = genlmsg_multicast(&thermal_event_genl_family, skb, 0,
+                                  0, GFP_ATOMIC);
        if (result)
                dev_err(&tz->device, "Failed to send netlink event:%d", result);
  
@@@ -1687,17 -1688,7 +1690,7 @@@ EXPORT_SYMBOL_GPL(thermal_generate_netl
  
  static int genetlink_init(void)
  {
-       int result;
-       result = genl_register_family(&thermal_event_genl_family);
-       if (result)
-               return result;
-       result = genl_register_mc_group(&thermal_event_genl_family,
-                                       &thermal_event_mcgrp);
-       if (result)
-               genl_unregister_family(&thermal_event_genl_family);
-       return result;
+       return genl_register_family(&thermal_event_genl_family);
  }
  
  static void genetlink_exit(void)
diff --combined net/ipv4/ip_tunnel.c
index caf01176a5e49774555b9c4dea5809e4f57cce19,254f11c24aa5eee54db62d065b7d01b2d19ff6ff..90ff9570d7d4def935f3224514312fc217812d9c
@@@ -454,6 -454,8 +454,8 @@@ int ip_tunnel_rcv(struct ip_tunnel *tun
        tstats->rx_bytes += skb->len;
        u64_stats_update_end(&tstats->syncp);
  
+       skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
        if (tunnel->dev->type == ARPHRD_ETHER) {
                skb->protocol = eth_type_trans(skb, tunnel->dev);
                skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
                skb->dev = tunnel->dev;
        }
  
-       skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
        gro_cells_receive(&tunnel->gro_cells, skb);
        return 0;
  
@@@ -976,19 -976,13 +976,19 @@@ int ip_tunnel_init(struct net_device *d
  {
        struct ip_tunnel *tunnel = netdev_priv(dev);
        struct iphdr *iph = &tunnel->parms.iph;
 -      int err;
 +      int i, err;
  
        dev->destructor = ip_tunnel_dev_free;
        dev->tstats = alloc_percpu(struct pcpu_tstats);
        if (!dev->tstats)
                return -ENOMEM;
  
 +      for_each_possible_cpu(i) {
 +              struct pcpu_tstats *ipt_stats;
 +              ipt_stats = per_cpu_ptr(dev->tstats, i);
 +              u64_stats_init(&ipt_stats->syncp);
 +      }
 +
        err = gro_cells_init(&tunnel->gro_cells, dev);
        if (err) {
                free_percpu(dev->tstats);
diff --combined net/ipv4/ping.c
index cbc85f660d54a683f5e989bc729e1f5f0b52e4f0,91bfe0437e7a0123416103b95b274f7cd89aed02..876c6ca2d8f9e77a28f1e629aa6523df1ee8f42f
@@@ -830,8 -830,6 +830,6 @@@ int ping_recvmsg(struct kiocb *iocb, st
  {
        struct inet_sock *isk = inet_sk(sk);
        int family = sk->sk_family;
-       struct sockaddr_in *sin;
-       struct sockaddr_in6 *sin6;
        struct sk_buff *skb;
        int copied, err;
  
        if (flags & MSG_OOB)
                goto out;
  
-       if (addr_len) {
-               if (family == AF_INET)
-                       *addr_len = sizeof(*sin);
-               else if (family == AF_INET6 && addr_len)
-                       *addr_len = sizeof(*sin6);
-       }
        if (flags & MSG_ERRQUEUE) {
                if (family == AF_INET) {
                        return ip_recv_error(sk, msg, len);
  
        /* Copy the address and add cmsg data. */
        if (family == AF_INET) {
-               sin = (struct sockaddr_in *) msg->msg_name;
-               sin->sin_family = AF_INET;
-               sin->sin_port = 0 /* skb->h.uh->source */;
-               sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
-               memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
+               struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+               if (sin) {
+                       sin->sin_family = AF_INET;
+                       sin->sin_port = 0 /* skb->h.uh->source */;
+                       sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
+                       memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
+                       *addr_len = sizeof(*sin);
+               }
  
                if (isk->cmsg_flags)
                        ip_cmsg_recv(msg, skb);
        } else if (family == AF_INET6) {
                struct ipv6_pinfo *np = inet6_sk(sk);
                struct ipv6hdr *ip6 = ipv6_hdr(skb);
-               sin6 = (struct sockaddr_in6 *) msg->msg_name;
-               sin6->sin6_family = AF_INET6;
-               sin6->sin6_port = 0;
-               sin6->sin6_addr = ip6->saddr;
-               sin6->sin6_flowinfo = 0;
-               if (np->sndflow)
-                       sin6->sin6_flowinfo = ip6_flowinfo(ip6);
-               sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr,
-                                                         IP6CB(skb)->iif);
+               struct sockaddr_in6 *sin6 =
+                       (struct sockaddr_in6 *)msg->msg_name;
+               if (sin6) {
+                       sin6->sin6_family = AF_INET6;
+                       sin6->sin6_port = 0;
+                       sin6->sin6_addr = ip6->saddr;
+                       sin6->sin6_flowinfo = 0;
+                       if (np->sndflow)
+                               sin6->sin6_flowinfo = ip6_flowinfo(ip6);
+                       sin6->sin6_scope_id =
+                               ipv6_iface_scope_id(&sin6->sin6_addr,
+                                                   IP6CB(skb)->iif);
+                       *addr_len = sizeof(*sin6);
+               }
  
                if (inet6_sk(sk)->rxopt.all)
                        pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb);
@@@ -1076,7 -1075,7 +1075,7 @@@ void ping_seq_stop(struct seq_file *seq
  EXPORT_SYMBOL_GPL(ping_seq_stop);
  
  static void ping_v4_format_sock(struct sock *sp, struct seq_file *f,
 -              int bucket, int *len)
 +              int bucket)
  {
        struct inet_sock *inet = inet_sk(sp);
        __be32 dest = inet->inet_daddr;
        __u16 srcp = ntohs(inet->inet_sport);
  
        seq_printf(f, "%5d: %08X:%04X %08X:%04X"
 -              " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d%n",
 +              " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d",
                bucket, src, srcp, dest, destp, sp->sk_state,
                sk_wmem_alloc_get(sp),
                sk_rmem_alloc_get(sp),
                from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
                0, sock_i_ino(sp),
                atomic_read(&sp->sk_refcnt), sp,
 -              atomic_read(&sp->sk_drops), len);
 +              atomic_read(&sp->sk_drops));
  }
  
  static int ping_v4_seq_show(struct seq_file *seq, void *v)
  {
 +      seq_setwidth(seq, 127);
        if (v == SEQ_START_TOKEN)
 -              seq_printf(seq, "%-127s\n",
 -                         "  sl  local_address rem_address   st tx_queue "
 +              seq_puts(seq, "  sl  local_address rem_address   st tx_queue "
                           "rx_queue tr tm->when retrnsmt   uid  timeout "
                           "inode ref pointer drops");
        else {
                struct ping_iter_state *state = seq->private;
 -              int len;
  
 -              ping_v4_format_sock(v, seq, state->bucket, &len);
 -              seq_printf(seq, "%*s\n", 127 - len, "");
 +              ping_v4_format_sock(v, seq, state->bucket);
        }
 +      seq_pad(seq, '\n');
        return 0;
  }
  
diff --combined net/ipv4/udp.c
index de86e5bc44629eaeaf1f8fc935dfd4abe5625703,998431cd471a217668f19872e99ee989cd35ba2a..5944d7d668dd91da21e945eac748bbbbbb11d67a
@@@ -1235,12 -1235,6 +1235,6 @@@ int udp_recvmsg(struct kiocb *iocb, str
        int is_udplite = IS_UDPLITE(sk);
        bool slow;
  
-       /*
-        *      Check any passed addresses
-        */
-       if (addr_len)
-               *addr_len = sizeof(*sin);
        if (flags & MSG_ERRQUEUE)
                return ip_recv_error(sk, msg, len);
  
@@@ -1302,6 -1296,7 +1296,7 @@@ try_again
                sin->sin_port = udp_hdr(skb)->source;
                sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
                memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
+               *addr_len = sizeof(*sin);
        }
        if (inet->cmsg_flags)
                ip_cmsg_recv(msg, skb);
@@@ -2331,7 -2326,7 +2326,7 @@@ EXPORT_SYMBOL(udp_proc_unregister)
  
  /* ------------------------------------------------------------------------ */
  static void udp4_format_sock(struct sock *sp, struct seq_file *f,
 -              int bucket, int *len)
 +              int bucket)
  {
        struct inet_sock *inet = inet_sk(sp);
        __be32 dest = inet->inet_daddr;
        __u16 srcp        = ntohs(inet->inet_sport);
  
        seq_printf(f, "%5d: %08X:%04X %08X:%04X"
 -              " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d%n",
 +              " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d",
                bucket, src, srcp, dest, destp, sp->sk_state,
                sk_wmem_alloc_get(sp),
                sk_rmem_alloc_get(sp),
                from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
                0, sock_i_ino(sp),
                atomic_read(&sp->sk_refcnt), sp,
 -              atomic_read(&sp->sk_drops), len);
 +              atomic_read(&sp->sk_drops));
  }
  
  int udp4_seq_show(struct seq_file *seq, void *v)
  {
 +      seq_setwidth(seq, 127);
        if (v == SEQ_START_TOKEN)
 -              seq_printf(seq, "%-127s\n",
 -                         "  sl  local_address rem_address   st tx_queue "
 +              seq_puts(seq, "  sl  local_address rem_address   st tx_queue "
                           "rx_queue tr tm->when retrnsmt   uid  timeout "
                           "inode ref pointer drops");
        else {
                struct udp_iter_state *state = seq->private;
 -              int len;
  
 -              udp4_format_sock(v, seq, state->bucket, &len);
 -              seq_printf(seq, "%*s\n", 127 - len, "");
 +              udp4_format_sock(v, seq, state->bucket);
        }
 +      seq_pad(seq, '\n');
        return 0;
  }
  
diff --combined net/ipv6/addrconf.c
index 5658d9d51637beaa07790b49e4d405cc290afe16,cdc14d0947f39c465234bdecf39aef34ce9898a9..12c97d8aa6bbb31ff1519459b89b7b9fb33817f5
@@@ -271,24 -271,10 +271,24 @@@ static void addrconf_mod_dad_timer(stru
  
  static int snmp6_alloc_dev(struct inet6_dev *idev)
  {
 +      int i;
 +
        if (snmp_mib_init((void __percpu **)idev->stats.ipv6,
                          sizeof(struct ipstats_mib),
                          __alignof__(struct ipstats_mib)) < 0)
                goto err_ip;
 +
 +      for_each_possible_cpu(i) {
 +              struct ipstats_mib *addrconf_stats;
 +              addrconf_stats = per_cpu_ptr(idev->stats.ipv6[0], i);
 +              u64_stats_init(&addrconf_stats->syncp);
 +#if SNMP_ARRAY_SZ == 2
 +              addrconf_stats = per_cpu_ptr(idev->stats.ipv6[1], i);
 +              u64_stats_init(&addrconf_stats->syncp);
 +#endif
 +      }
 +
 +
        idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device),
                                        GFP_KERNEL);
        if (!idev->stats.icmpv6dev)
@@@ -1996,23 -1982,6 +1996,6 @@@ static void addrconf_add_mroute(struct 
        ip6_route_add(&cfg);
  }
  
- #if IS_ENABLED(CONFIG_IPV6_SIT)
- static void sit_route_add(struct net_device *dev)
- {
-       struct fib6_config cfg = {
-               .fc_table = RT6_TABLE_MAIN,
-               .fc_metric = IP6_RT_PRIO_ADDRCONF,
-               .fc_ifindex = dev->ifindex,
-               .fc_dst_len = 96,
-               .fc_flags = RTF_UP | RTF_NONEXTHOP,
-               .fc_nlinfo.nl_net = dev_net(dev),
-       };
-       /* prefix length - 96 bits "::d.d.d.d" */
-       ip6_route_add(&cfg);
- }
- #endif
  static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
  {
        struct inet6_dev *idev;
@@@ -2542,7 -2511,8 +2525,8 @@@ static void sit_add_v4_addrs(struct ine
        struct in6_addr addr;
        struct net_device *dev;
        struct net *net = dev_net(idev->dev);
-       int scope;
+       int scope, plen;
+       u32 pflags = 0;
  
        ASSERT_RTNL();
  
        if (idev->dev->flags&IFF_POINTOPOINT) {
                addr.s6_addr32[0] = htonl(0xfe800000);
                scope = IFA_LINK;
+               plen = 64;
        } else {
                scope = IPV6_ADDR_COMPATv4;
+               plen = 96;
+               pflags |= RTF_NONEXTHOP;
        }
  
        if (addr.s6_addr32[3]) {
-               add_addr(idev, &addr, 128, scope);
+               add_addr(idev, &addr, plen, scope);
+               addrconf_prefix_route(&addr, plen, idev->dev, 0, pflags);
                return;
        }
  
                        int flag = scope;
  
                        for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
-                               int plen;
  
                                addr.s6_addr32[3] = ifa->ifa_local;
  
                                                continue;
                                        flag |= IFA_HOST;
                                }
-                               if (idev->dev->flags&IFF_POINTOPOINT)
-                                       plen = 64;
-                               else
-                                       plen = 96;
  
                                add_addr(idev, &addr, plen, flag);
+                               addrconf_prefix_route(&addr, plen, idev->dev, 0,
+                                                     pflags);
                        }
                }
        }
@@@ -2711,7 -2682,6 +2696,6 @@@ static void addrconf_sit_config(struct 
                struct in6_addr addr;
  
                ipv6_addr_set(&addr,  htonl(0xFE800000), 0, 0, 0);
-               addrconf_prefix_route(&addr, 64, dev, 0, 0);
                if (!ipv6_generate_eui64(addr.s6_addr + 8, dev))
                        addrconf_add_linklocal(idev, &addr);
                return;
  
        if (dev->flags&IFF_POINTOPOINT)
                addrconf_add_mroute(dev);
-       else
-               sit_route_add(dev);
  }
  #endif
  
@@@ -2740,8 -2708,6 +2722,6 @@@ static void addrconf_gre_config(struct 
        }
  
        ipv6_addr_set(&addr,  htonl(0xFE800000), 0, 0, 0);
-       addrconf_prefix_route(&addr, 64, dev, 0, 0);
        if (!ipv6_generate_eui64(addr.s6_addr + 8, dev))
                addrconf_add_linklocal(idev, &addr);
  }
diff --combined net/ipv6/af_inet6.c
index ff75313f27a848db69dc0af6cf1a367205e13d2d,56ca35b30ddabfef8d4583aa0d132777a67d9c67..4fbdb7046d286cf64f60c61e3ae87ba657f042a0
@@@ -714,8 -714,6 +714,8 @@@ static void ipv6_packet_cleanup(void
  
  static int __net_init ipv6_init_mibs(struct net *net)
  {
 +      int i;
 +
        if (snmp_mib_init((void __percpu **)net->mib.udp_stats_in6,
                          sizeof(struct udp_mib),
                          __alignof__(struct udp_mib)) < 0)
                          sizeof(struct ipstats_mib),
                          __alignof__(struct ipstats_mib)) < 0)
                goto err_ip_mib;
 +
 +      for_each_possible_cpu(i) {
 +              struct ipstats_mib *af_inet6_stats;
 +              af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[0], i);
 +              u64_stats_init(&af_inet6_stats->syncp);
 +#if SNMP_ARRAY_SZ == 2
 +              af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[1], i);
 +              u64_stats_init(&af_inet6_stats->syncp);
 +#endif
 +      }
 +
 +
        if (snmp_mib_init((void __percpu **)net->mib.icmpv6_statistics,
                          sizeof(struct icmpv6_mib),
                          __alignof__(struct icmpv6_mib)) < 0)
@@@ -972,10 -958,10 +972,10 @@@ out
  
  #ifdef CONFIG_SYSCTL
  sysctl_fail:
-       ipv6_packet_cleanup();
+       pingv6_exit();
  #endif
  pingv6_fail:
-       pingv6_exit();
+       ipv6_packet_cleanup();
  ipv6_packet_fail:
        tcpv6_exit();
  tcpv6_fail:
diff --combined net/ipv6/ip6_tunnel.c
index df1fa58528c6fdeae476193f3bf7ae53d2e38a7e,c1e11b5d6ccc0efd6170ee3d7f8f42f1fde53fc0..d6062325db08411207fd63b435ec1e5e4e0f2001
@@@ -1494,19 -1494,12 +1494,19 @@@ static inline in
  ip6_tnl_dev_init_gen(struct net_device *dev)
  {
        struct ip6_tnl *t = netdev_priv(dev);
 +      int i;
  
        t->dev = dev;
        t->net = dev_net(dev);
        dev->tstats = alloc_percpu(struct pcpu_tstats);
        if (!dev->tstats)
                return -ENOMEM;
 +
 +      for_each_possible_cpu(i) {
 +              struct pcpu_tstats *ip6_tnl_stats;
 +              ip6_tnl_stats = per_cpu_ptr(dev->tstats, i);
 +              u64_stats_init(&ip6_tnl_stats->syncp);
 +      }
        return 0;
  }
  
@@@ -1642,6 -1635,15 +1642,15 @@@ static int ip6_tnl_changelink(struct ne
        return ip6_tnl_update(t, &p);
  }
  
+ static void ip6_tnl_dellink(struct net_device *dev, struct list_head *head)
+ {
+       struct net *net = dev_net(dev);
+       struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
+       if (dev != ip6n->fb_tnl_dev)
+               unregister_netdevice_queue(dev, head);
+ }
  static size_t ip6_tnl_get_size(const struct net_device *dev)
  {
        return
@@@ -1706,6 -1708,7 +1715,7 @@@ static struct rtnl_link_ops ip6_link_op
        .validate       = ip6_tnl_validate,
        .newlink        = ip6_tnl_newlink,
        .changelink     = ip6_tnl_changelink,
+       .dellink        = ip6_tnl_dellink,
        .get_size       = ip6_tnl_get_size,
        .fill_info      = ip6_tnl_fill_info,
  };
@@@ -1722,9 -1725,9 +1732,9 @@@ static struct xfrm6_tunnel ip6ip6_handl
        .priority       =       1,
  };
  
- static void __net_exit ip6_tnl_destroy_tunnels(struct ip6_tnl_net *ip6n)
+ static void __net_exit ip6_tnl_destroy_tunnels(struct net *net)
  {
-       struct net *net = dev_net(ip6n->fb_tnl_dev);
+       struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
        struct net_device *dev, *aux;
        int h;
        struct ip6_tnl *t;
@@@ -1792,10 -1795,8 +1802,8 @@@ err_alloc_dev
  
  static void __net_exit ip6_tnl_exit_net(struct net *net)
  {
-       struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
        rtnl_lock();
-       ip6_tnl_destroy_tunnels(ip6n);
+       ip6_tnl_destroy_tunnels(net);
        rtnl_unlock();
  }
  
diff --combined net/ipv6/sit.c
index bfc6fcea38410e3a5817ad7ba254a98151bb0749,5a57f38a50d5ccd58c0b1a600822d57b9ba3e34d..1b4a4a95367552c8cc22d19850b0779eee87cdc6
@@@ -1320,7 -1320,6 +1320,7 @@@ static void ipip6_tunnel_setup(struct n
  static int ipip6_tunnel_init(struct net_device *dev)
  {
        struct ip_tunnel *tunnel = netdev_priv(dev);
 +      int i;
  
        tunnel->dev = dev;
        tunnel->net = dev_net(dev);
        if (!dev->tstats)
                return -ENOMEM;
  
 +      for_each_possible_cpu(i) {
 +              struct pcpu_tstats *ipip6_tunnel_stats;
 +              ipip6_tunnel_stats = per_cpu_ptr(dev->tstats, i);
 +              u64_stats_init(&ipip6_tunnel_stats->syncp);
 +      }
 +
        return 0;
  }
  
@@@ -1348,7 -1341,6 +1348,7 @@@ static int __net_init ipip6_fb_tunnel_i
        struct iphdr *iph = &tunnel->parms.iph;
        struct net *net = dev_net(dev);
        struct sit_net *sitn = net_generic(net, sit_net_id);
 +      int i;
  
        tunnel->dev = dev;
        tunnel->net = dev_net(dev);
        dev->tstats = alloc_percpu(struct pcpu_tstats);
        if (!dev->tstats)
                return -ENOMEM;
 +
 +      for_each_possible_cpu(i) {
 +              struct pcpu_tstats *ipip6_fb_stats;
 +              ipip6_fb_stats = per_cpu_ptr(dev->tstats, i);
 +              u64_stats_init(&ipip6_fb_stats->syncp);
 +      }
 +
        dev_hold(dev);
        rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
        return 0;
@@@ -1619,6 -1604,15 +1619,15 @@@ static const struct nla_policy ipip6_po
  #endif
  };
  
+ static void ipip6_dellink(struct net_device *dev, struct list_head *head)
+ {
+       struct net *net = dev_net(dev);
+       struct sit_net *sitn = net_generic(net, sit_net_id);
+       if (dev != sitn->fb_tunnel_dev)
+               unregister_netdevice_queue(dev, head);
+ }
  static struct rtnl_link_ops sit_link_ops __read_mostly = {
        .kind           = "sit",
        .maxtype        = IFLA_IPTUN_MAX,
        .changelink     = ipip6_changelink,
        .get_size       = ipip6_get_size,
        .fill_info      = ipip6_fill_info,
+       .dellink        = ipip6_dellink,
  };
  
  static struct xfrm_tunnel sit_handler __read_mostly = {
@@@ -1644,9 -1639,10 +1654,10 @@@ static struct xfrm_tunnel ipip_handler 
        .priority       =       2,
  };
  
- static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_head *head)
+ static void __net_exit sit_destroy_tunnels(struct net *net,
+                                          struct list_head *head)
  {
-       struct net *net = dev_net(sitn->fb_tunnel_dev);
+       struct sit_net *sitn = net_generic(net, sit_net_id);
        struct net_device *dev, *aux;
        int prio;
  
@@@ -1721,11 -1717,10 +1732,10 @@@ err_alloc_dev
  
  static void __net_exit sit_exit_net(struct net *net)
  {
-       struct sit_net *sitn = net_generic(net, sit_net_id);
        LIST_HEAD(list);
  
        rtnl_lock();
-       sit_destroy_tunnels(sitn, &list);
+       sit_destroy_tunnels(net, &list);
        unregister_netdevice_many(&list);
        rtnl_unlock();
  }
index 1ded5c6d268c662af2e4743fedfb8226b5715cc3,393498704691df817d9d9f48f30fbc8cd287a04d..35be035ee0cec79b5b797efb46c287661b8dbc93
@@@ -842,7 -842,7 +842,7 @@@ ip_vs_new_dest(struct ip_vs_service *sv
               struct ip_vs_dest **dest_p)
  {
        struct ip_vs_dest *dest;
 -      unsigned int atype;
 +      unsigned int atype, i;
  
        EnterFunction(2);
  
        if (!dest->stats.cpustats)
                goto err_alloc;
  
 +      for_each_possible_cpu(i) {
 +              struct ip_vs_cpu_stats *ip_vs_dest_stats;
 +              ip_vs_dest_stats = per_cpu_ptr(dest->stats.cpustats, i);
 +              u64_stats_init(&ip_vs_dest_stats->syncp);
 +      }
 +
        dest->af = svc->af;
        dest->protocol = svc->protocol;
        dest->vaddr = svc->addr;
@@@ -1140,7 -1134,7 +1140,7 @@@ static in
  ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
                  struct ip_vs_service **svc_p)
  {
 -      int ret = 0;
 +      int ret = 0, i;
        struct ip_vs_scheduler *sched = NULL;
        struct ip_vs_pe *pe = NULL;
        struct ip_vs_service *svc = NULL;
                goto out_err;
        }
  
 +      for_each_possible_cpu(i) {
 +              struct ip_vs_cpu_stats *ip_vs_stats;
 +              ip_vs_stats = per_cpu_ptr(svc->stats.cpustats, i);
 +              u64_stats_init(&ip_vs_stats->syncp);
 +      }
 +
 +
        /* I'm the first user of the service */
        atomic_set(&svc->refcnt, 0);
  
@@@ -3580,7 -3567,7 +3580,7 @@@ out
  }
  
  
- static struct genl_ops ip_vs_genl_ops[] __read_mostly = {
+ static const struct genl_ops ip_vs_genl_ops[] __read_mostly = {
        {
                .cmd    = IPVS_CMD_NEW_SERVICE,
                .flags  = GENL_ADMIN_PERM,
  static int __init ip_vs_genl_register(void)
  {
        return genl_register_family_with_ops(&ip_vs_genl_family,
-               ip_vs_genl_ops, ARRAY_SIZE(ip_vs_genl_ops));
+                                            ip_vs_genl_ops);
  }
  
  static void ip_vs_genl_unregister(void)
@@@ -3793,7 -3780,7 +3793,7 @@@ static struct notifier_block ip_vs_dst_
  
  int __net_init ip_vs_control_net_init(struct net *net)
  {
 -      int idx;
 +      int i, idx;
        struct netns_ipvs *ipvs = net_ipvs(net);
  
        /* Initialize rs_table */
        if (!ipvs->tot_stats.cpustats)
                return -ENOMEM;
  
 +      for_each_possible_cpu(i) {
 +              struct ip_vs_cpu_stats *ipvs_tot_stats;
 +              ipvs_tot_stats = per_cpu_ptr(ipvs->tot_stats.cpustats, i);
 +              u64_stats_init(&ipvs_tot_stats->syncp);
 +      }
 +
        spin_lock_init(&ipvs->tot_stats.lock);
  
        proc_create("ip_vs", 0, net->proc_net, &ip_vs_info_fops);
index 449e0776a2c0887bea75fbc963224a37d20ccb33,1de4d281e3f147023d3df71a89f162c7d8c5bf06..6f5e1dd3be2dbdcfdb591d64323c3558d0636e6d
  
  int ovs_net_id __read_mostly;
  
- static void ovs_notify(struct sk_buff *skb, struct genl_info *info,
-                      struct genl_multicast_group *grp)
+ static void ovs_notify(struct genl_family *family,
+                      struct sk_buff *skb, struct genl_info *info)
  {
-       genl_notify(skb, genl_info_net(info), info->snd_portid,
-                   grp->id, info->nlhdr, GFP_KERNEL);
+       genl_notify(family, skb, genl_info_net(info), info->snd_portid,
+                   0, info->nlhdr, GFP_KERNEL);
  }
  
  /**
@@@ -557,7 -557,7 +557,7 @@@ static const struct nla_policy packet_p
        [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED },
  };
  
- static struct genl_ops dp_packet_genl_ops[] = {
+ static const struct genl_ops dp_packet_genl_ops[] = {
        { .cmd = OVS_PACKET_CMD_EXECUTE,
          .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
          .policy = packet_policy,
@@@ -877,10 -877,10 +877,10 @@@ static int ovs_flow_cmd_new_or_set(stru
        ovs_unlock();
  
        if (!IS_ERR(reply))
-               ovs_notify(reply, info, &ovs_dp_flow_multicast_group);
+               ovs_notify(&dp_flow_genl_family, reply, info);
        else
-               netlink_set_err(sock_net(skb->sk)->genl_sock, 0,
-                               ovs_dp_flow_multicast_group.id, PTR_ERR(reply));
+               genl_set_err(&dp_flow_genl_family, sock_net(skb->sk), 0,
+                            0, PTR_ERR(reply));
        return 0;
  
  err_flow_free:
@@@ -990,7 -990,7 +990,7 @@@ static int ovs_flow_cmd_del(struct sk_b
        ovs_flow_free(flow, true);
        ovs_unlock();
  
-       ovs_notify(reply, info, &ovs_dp_flow_multicast_group);
+       ovs_notify(&dp_flow_genl_family, reply, info);
        return 0;
  unlock:
        ovs_unlock();
@@@ -1034,7 -1034,7 +1034,7 @@@ static int ovs_flow_cmd_dump(struct sk_
        return skb->len;
  }
  
- static struct genl_ops dp_flow_genl_ops[] = {
+ static const struct genl_ops dp_flow_genl_ops[] = {
        { .cmd = OVS_FLOW_CMD_NEW,
          .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
          .policy = flow_policy,
@@@ -1199,12 -1199,6 +1199,12 @@@ static int ovs_dp_cmd_new(struct sk_buf
                goto err_destroy_table;
        }
  
 +      for_each_possible_cpu(i) {
 +              struct dp_stats_percpu *dpath_stats;
 +              dpath_stats = per_cpu_ptr(dp->stats_percpu, i);
 +              u64_stats_init(&dpath_stats->sync);
 +      }
 +
        dp->ports = kmalloc(DP_VPORT_HASH_BUCKETS * sizeof(struct hlist_head),
                            GFP_KERNEL);
        if (!dp->ports) {
  
        ovs_unlock();
  
-       ovs_notify(reply, info, &ovs_dp_datapath_multicast_group);
+       ovs_notify(&dp_datapath_genl_family, reply, info);
        return 0;
  
  err_destroy_local_port:
@@@ -1308,7 -1302,7 +1308,7 @@@ static int ovs_dp_cmd_del(struct sk_buf
        __dp_destroy(dp);
        ovs_unlock();
  
-       ovs_notify(reply, info, &ovs_dp_datapath_multicast_group);
+       ovs_notify(&dp_datapath_genl_family, reply, info);
  
        return 0;
  unlock:
@@@ -1332,14 -1326,14 +1332,14 @@@ static int ovs_dp_cmd_set(struct sk_buf
                                      info->snd_seq, OVS_DP_CMD_NEW);
        if (IS_ERR(reply)) {
                err = PTR_ERR(reply);
-               netlink_set_err(sock_net(skb->sk)->genl_sock, 0,
-                               ovs_dp_datapath_multicast_group.id, err);
+               genl_set_err(&dp_datapath_genl_family, sock_net(skb->sk), 0,
+                            0, err);
                err = 0;
                goto unlock;
        }
  
        ovs_unlock();
-       ovs_notify(reply, info, &ovs_dp_datapath_multicast_group);
+       ovs_notify(&dp_datapath_genl_family, reply, info);
  
        return 0;
  unlock:
@@@ -1398,7 -1392,7 +1398,7 @@@ static int ovs_dp_cmd_dump(struct sk_bu
        return skb->len;
  }
  
- static struct genl_ops dp_datapath_genl_ops[] = {
+ static const struct genl_ops dp_datapath_genl_ops[] = {
        { .cmd = OVS_DP_CMD_NEW,
          .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
          .policy = datapath_policy,
@@@ -1431,7 -1425,7 +1431,7 @@@ static const struct nla_policy vport_po
        [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED },
  };
  
- static struct genl_family dp_vport_genl_family = {
+ struct genl_family dp_vport_genl_family = {
        .id = GENL_ID_GENERATE,
        .hdrsize = sizeof(struct ovs_header),
        .name = OVS_VPORT_FAMILY,
@@@ -1601,7 -1595,7 +1601,7 @@@ static int ovs_vport_cmd_new(struct sk_
                goto exit_unlock;
        }
  
-       ovs_notify(reply, info, &ovs_dp_vport_multicast_group);
+       ovs_notify(&dp_vport_genl_family, reply, info);
  
  exit_unlock:
        ovs_unlock();
@@@ -1648,7 -1642,7 +1648,7 @@@ static int ovs_vport_cmd_set(struct sk_
        BUG_ON(err < 0);
  
        ovs_unlock();
-       ovs_notify(reply, info, &ovs_dp_vport_multicast_group);
+       ovs_notify(&dp_vport_genl_family, reply, info);
        return 0;
  
  exit_free:
@@@ -1685,7 -1679,7 +1685,7 @@@ static int ovs_vport_cmd_del(struct sk_
        err = 0;
        ovs_dp_detach_port(vport);
  
-       ovs_notify(reply, info, &ovs_dp_vport_multicast_group);
+       ovs_notify(&dp_vport_genl_family, reply, info);
  
  exit_unlock:
        ovs_unlock();
@@@ -1759,7 -1753,7 +1759,7 @@@ out
        return skb->len;
  }
  
- static struct genl_ops dp_vport_genl_ops[] = {
+ static const struct genl_ops dp_vport_genl_ops[] = {
        { .cmd = OVS_VPORT_CMD_NEW,
          .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
          .policy = vport_policy,
  
  struct genl_family_and_ops {
        struct genl_family *family;
-       struct genl_ops *ops;
+       const struct genl_ops *ops;
        int n_ops;
-       struct genl_multicast_group *group;
+       const struct genl_multicast_group *group;
  };
  
  static const struct genl_family_and_ops dp_genl_families[] = {
@@@ -1823,17 -1817,14 +1823,14 @@@ static int dp_register_genl(void
        for (i = 0; i < ARRAY_SIZE(dp_genl_families); i++) {
                const struct genl_family_and_ops *f = &dp_genl_families[i];
  
-               err = genl_register_family_with_ops(f->family, f->ops,
-                                                   f->n_ops);
+               f->family->ops = f->ops;
+               f->family->n_ops = f->n_ops;
+               f->family->mcgrps = f->group;
+               f->family->n_mcgrps = f->group ? 1 : 0;
+               err = genl_register_family(f->family);
                if (err)
                        goto error;
                n_registered++;
-               if (f->group) {
-                       err = genl_register_mc_group(f->family, f->group);
-                       if (err)
-                               goto error;
-               }
        }
  
        return 0;