Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 13 Nov 2013 08:40:34 +0000 (17:40 +0900)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 13 Nov 2013 08:40:34 +0000 (17:40 +0900)
Pull networking updates from David Miller:

 1) The addition of nftables.  No longer will we need protocol aware
    firewall filtering modules, it can all live in userspace.

    At the core of nftables is a, for lack of a better term, virtual
    machine that executes byte codes to inspect packet or metadata
    (arriving interface index, etc.) and make verdict decisions.

    Besides support for loading packet contents and comparing them, the
    interpreter supports lookups in various datastructures as
    fundamental operations.  For example sets are supports, and
    therefore one could create a set of whitelist IP address entries
    which have ACCEPT verdicts attached to them, and use the appropriate
    byte codes to do such lookups.

    Since the interpreted code is composed in userspace, userspace can
    do things like optimize things before giving it to the kernel.

    Another major improvement is the capability of atomically updating
    portions of the ruleset.  In the existing netfilter implementation,
    one has to update the entire rule set in order to make a change and
    this is very expensive.

    Userspace tools exist to create nftables rules using existing
    netfilter rule sets, but both kernel implementations will need to
    co-exist for quite some time as we transition from the old to the
    new stuff.

    Kudos to Patrick McHardy, Pablo Neira Ayuso, and others who have
    worked so hard on this.

 2) Daniel Borkmann and Hannes Frederic Sowa made several improvements
    to our pseudo-random number generator, mostly used for things like
    UDP port randomization and netfitler, amongst other things.

    In particular the taus88 generater is updated to taus113, and test
    cases are added.

 3) Support 64-bit rates in HTB and TBF schedulers, from Eric Dumazet
    and Yang Yingliang.

 4) Add support for new 577xx tigon3 chips to tg3 driver, from Nithin
    Sujir.

 5) Fix two fatal flaws in TCP dynamic right sizing, from Eric Dumazet,
    Neal Cardwell, and Yuchung Cheng.

 6) Allow IP_TOS and IP_TTL to be specified in sendmsg() ancillary
    control message data, much like other socket option attributes.
    From Francesco Fusco.

 7) Allow applications to specify a cap on the rate computed
    automatically by the kernel for pacing flows, via a new
    SO_MAX_PACING_RATE socket option.  From Eric Dumazet.

 8) Make the initial autotuned send buffer sizing in TCP more closely
    reflect actual needs, from Eric Dumazet.

 9) Currently early socket demux only happens for TCP sockets, but we
    can do it for connected UDP sockets too.  Implementation from Shawn
    Bohrer.

10) Refactor inet socket demux with the goal of improving hash demux
    performance for listening sockets.  With the main goals being able
    to use RCU lookups on even request sockets, and eliminating the
    listening lock contention.  From Eric Dumazet.

11) The bonding layer has many demuxes in it's fast path, and an RCU
    conversion was started back in 3.11, several changes here extend the
    RCU usage to even more locations.  From Ding Tianhong and Wang
    Yufen, based upon suggestions by Nikolay Aleksandrov and Veaceslav
    Falico.

12) Allow stackability of segmentation offloads to, in particular, allow
    segmentation offloading over tunnels.  From Eric Dumazet.

13) Significantly improve the handling of secret keys we input into the
    various hash functions in the inet hashtables, TCP fast open, as
    well as syncookies.  From Hannes Frederic Sowa.  The key fundamental
    operation is "net_get_random_once()" which uses static keys.

    Hannes even extended this to ipv4/ipv6 fragmentation handling and
    our generic flow dissector.

14) The generic driver layer takes care now to set the driver data to
    NULL on device removal, so it's no longer necessary for drivers to
    explicitly set it to NULL any more.  Many drivers have been cleaned
    up in this way, from Jingoo Han.

15) Add a BPF based packet scheduler classifier, from Daniel Borkmann.

16) Improve CRC32 interfaces and generic SKB checksum iterators so that
    SCTP's checksumming can more cleanly be handled.  Also from Daniel
    Borkmann.

17) Add a new PMTU discovery mode, IP_PMTUDISC_INTERFACE, which forces
    using the interface MTU value.  This helps avoid PMTU attacks,
    particularly on DNS servers.  From Hannes Frederic Sowa.

18) Use generic XPS for transmit queue steering rather than internal
    (re-)implementation in virtio-net.  From Jason Wang.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1622 commits)
  random32: add test cases for taus113 implementation
  random32: upgrade taus88 generator to taus113 from errata paper
  random32: move rnd_state to linux/random.h
  random32: add prandom_reseed_late() and call when nonblocking pool becomes initialized
  random32: add periodic reseeding
  random32: fix off-by-one in seeding requirement
  PHY: Add RTL8201CP phy_driver to realtek
  xtsonic: add missing platform_set_drvdata() in xtsonic_probe()
  macmace: add missing platform_set_drvdata() in mace_probe()
  ethernet/arc/arc_emac: add missing platform_set_drvdata() in arc_emac_probe()
  ipv6: protect for_each_sk_fl_rcu in mem_check with rcu_read_lock_bh
  vlan: Implement vlan_dev_get_egress_qos_mask as an inline.
  ixgbe: add warning when max_vfs is out of range.
  igb: Update link modes display in ethtool
  netfilter: push reasm skb through instead of original frag skbs
  ip6_output: fragment outgoing reassembled skb properly
  MAINTAINERS: mv643xx_eth: take over maintainership from Lennart
  net_sched: tbf: support of 64bit rates
  ixgbe: deleting dfwd stations out of order can cause null ptr deref
  ixgbe: fix build err, num_rx_queues is only available with CONFIG_RPS
  ...

15 files changed:
1  2 
MAINTAINERS
arch/arm/boot/dts/am33xx.dtsi
drivers/net/bonding/bond_sysfs.c
drivers/net/ethernet/amd/declance.c
drivers/net/ethernet/arc/emac_main.c
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/freescale/ucc_geth.c
drivers/net/ethernet/ibm/emac/core.c
drivers/net/ethernet/smsc/smc9194.c
drivers/s390/net/qeth_core_main.c
include/linux/jump_label.h
include/linux/netdevice.h
init/main.c
mm/memcontrol.c
net/core/net-sysfs.c

diff --combined MAINTAINERS
@@@ -763,10 -763,6 +763,10 @@@ W:       http://maxim.org.za/at91_26.htm
  W:    http://www.linux4sam.org
  S:    Supported
  F:    arch/arm/mach-at91/
 +F:    arch/arm/boot/dts/at91*.dts
 +F:    arch/arm/boot/dts/at91*.dtsi
 +F:    arch/arm/boot/dts/sama*.dts
 +F:    arch/arm/boot/dts/sama*.dtsi
  
  ARM/CALXEDA HIGHBANK ARCHITECTURE
  M:    Rob Herring <rob.herring@calxeda.com>
@@@ -933,7 -929,7 +933,7 @@@ M: Javier Martinez Canillas <javier@dow
  L:    linux-omap@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/mach-omap2/board-igep0020.c
 +F:    arch/arm/boot/dts/omap3-igep*
  
  ARM/INCOME PXA270 SUPPORT
  M:    Marek Vasut <marek.vasut@gmail.com>
@@@ -1161,6 -1157,11 +1161,6 @@@ S:     Maintaine
  F:    arch/arm/mach-rockchip/
  F:    drivers/*/*rockchip*
  
 -ARM/SHARK MACHINE SUPPORT
 -M:    Alexander Schulz <alex@shark-linux.de>
 -W:    http://www.shark-linux.de/shark.html
 -S:    Maintained
 -
  ARM/SAMSUNG ARM ARCHITECTURES
  M:    Ben Dooks <ben-linux@fluff.org>
  M:    Kukjin Kim <kgene.kim@samsung.com>
@@@ -1168,8 -1169,6 +1168,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  W:    http://www.fluff.org/ben/linux/
  S:    Maintained
 +F:    arch/arm/boot/dts/s3c*
 +F:    arch/arm/boot/dts/exynos*
  F:    arch/arm/plat-samsung/
  F:    arch/arm/mach-s3c24*/
  F:    arch/arm/mach-s3c64xx/
@@@ -1661,15 -1660,16 +1661,15 @@@ S:   Maintaine
  F:    drivers/net/wireless/b43legacy/
  
  BACKLIGHT CLASS/SUBSYSTEM
 -M:    Richard Purdie <rpurdie@rpsys.net>
  M:    Jingoo Han <jg1.han@samsung.com>
  S:    Maintained
  F:    drivers/video/backlight/
  F:    include/linux/backlight.h
  
  BATMAN ADVANCED
- M:    Marek Lindner <lindner_marek@yahoo.de>
- M:    Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
- M:    Antonio Quartulli <ordex@autistici.org>
+ M:    Marek Lindner <mareklindner@neomailbox.ch>
+ M:    Simon Wunderlich <sw@simonwunderlich.de>
+ M:    Antonio Quartulli <antonio@meshcoding.com>
  L:    b.a.t.m.a.n@lists.open-mesh.org
  W:    http://www.open-mesh.org/
  S:    Maintained
@@@ -1822,7 -1822,7 +1822,7 @@@ F:      drivers/net/ethernet/broadcom/bnx2.
  F:    drivers/net/ethernet/broadcom/bnx2_*
  
  BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
- M:    Eilon Greenstein <eilong@broadcom.com>
+ M:    Ariel Elior <ariele@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2x/
@@@ -2372,7 -2372,7 +2372,7 @@@ F:      kernel/cpuset.
  
  CRAMFS FILESYSTEM
  W:    http://sourceforge.net/projects/cramfs/
 -S:    Orphan
 +S:    Orphan / Obsolete
  F:    Documentation/filesystems/cramfs.txt
  F:    fs/cramfs/
  
@@@ -3691,14 -3691,6 +3691,14 @@@ S:    Maintaine
  F:    include/asm-generic/
  F:    include/uapi/asm-generic/
  
 +GENERIC PHY FRAMEWORK
 +M:    Kishon Vijay Abraham I <kishon@ti.com>
 +L:    linux-kernel@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy.git
 +S:    Supported
 +F:    drivers/phy/
 +F:    include/linux/phy/
 +
  GENERIC UIO DRIVER FOR PCI DEVICES
  M:    "Michael S. Tsirkin" <mst@redhat.com>
  L:    kvm@vger.kernel.org
@@@ -4240,7 -4232,7 +4240,7 @@@ S:      Maintaine
  F:    drivers/media/rc/iguanair.c
  
  IIO SUBSYSTEM AND DRIVERS
 -M:    Jonathan Cameron <jic23@cam.ac.uk>
 +M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
  F:    drivers/iio/
@@@ -4439,12 -4431,6 +4439,12 @@@ F:    Documentation/networking/ixgbevf.tx
  F:    Documentation/networking/i40e.txt
  F:    drivers/net/ethernet/intel/
  
 +INTEL-MID GPIO DRIVER
 +M:    David Cohen <david.a.cohen@linux.intel.com>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/gpio/gpio-intel-mid.c
 +
  INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT
  M:    Stanislav Yakovlev <stas.yakovlev@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -4783,13 -4769,6 +4783,13 @@@ S:    Maintaine
  F:    Documentation/hwmon/k8temp
  F:    drivers/hwmon/k8temp.c
  
 +KTAP
 +M:    Jovi Zhangwei <jovi.zhangwei@gmail.com>
 +W:    http://www.ktap.org
 +L:    ktap@freelists.org
 +S:    Maintained
 +F:    drivers/staging/ktap/
 +
  KCONFIG
  M:    Michal Marek <mmarek@suse.cz>
  L:    linux-kbuild@vger.kernel.org
@@@ -5374,7 -5353,7 +5374,7 @@@ S:      Orpha
  F:    drivers/net/wireless/libertas/
  
  MARVELL MV643XX ETHERNET DRIVER
- M:    Lennert Buytenhek <buytenh@wantstofly.org>
+ M:    Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/marvell/mv643xx_eth.*
@@@ -6130,12 -6109,6 +6130,12 @@@ L:    linux-omap@vger.kernel.or
  S:    Maintained
  F:    drivers/gpio/gpio-omap.c
  
 +OMAP/NEWFLOW NANOBONE MACHINE SUPPORT
 +M:    Mark Jackson <mpfj@newflow.co.uk>
 +L:    linux-omap@vger.kernel.org
 +S:    Maintained
 +F:    arch/arm/boot/dts/am335x-nano.dts
 +
  OMFS FILESYSTEM
  M:    Bob Copeland <me@bobcopeland.com>
  L:    linux-karma-devel@lists.sourceforge.net
@@@ -6890,6 -6863,14 +6890,14 @@@ L:    linux-hexagon@vger.kernel.or
  S:    Supported
  F:    arch/hexagon/
  
+ QUALCOMM WCN36XX WIRELESS DRIVER
+ M:    Eugene Krasnikov <k.eugene.e@gmail.com>
+ L:    wcn36xx@lists.infradead.org
+ W:    http://wireless.kernel.org/en/users/Drivers/wcn36xx
+ T:    git git://github.com/KrasnikovEugene/wcn36xx.git
+ S:    Supported
+ F:    drivers/net/wireless/ath/wcn36xx/
  QUICKCAM PARALLEL PORT WEBCAMS
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -6977,7 -6958,7 +6985,7 @@@ M:      "Paul E. McKenney" <paulmck@linux.vn
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
  F:    Documentation/RCU/torture.txt
 -F:    kernel/rcutorture.c
 +F:    kernel/rcu/torture.c
  
  RDC R-321X SoC
  M:    Florian Fainelli <florian@openwrt.org>
@@@ -7004,9 -6985,8 +7012,9 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    Documentation/RCU/
  X:    Documentation/RCU/torture.txt
  F:    include/linux/rcu*
 -F:    kernel/rcu*
 -X:    kernel/rcutorture.c
 +X:    include/linux/srcu.h
 +F:    kernel/rcu/
 +X:    kernel/rcu/torture.c
  
  REAL TIME CLOCK (RTC) SUBSYSTEM
  M:    Alessandro Zummo <a.zummo@towertech.it>
@@@ -7319,7 -7299,7 +7327,7 @@@ S:      Odd Fixe
  F:    drivers/media/usb/tlg2300/
  
  SC1200 WDT DRIVER
 -M:    Zwane Mwaikambo <zwane@arm.linux.org.uk>
 +M:    Zwane Mwaikambo <zwanem@gmail.com>
  S:    Maintained
  F:    drivers/watchdog/sc1200wdt.c
  
@@@ -7331,8 -7311,6 +7339,8 @@@ S:      Maintaine
  F:    kernel/sched/
  F:    include/linux/sched.h
  F:    include/uapi/linux/sched.h
 +F:    kernel/wait.c
 +F:    include/linux/wait.h
  
  SCORE ARCHITECTURE
  M:    Chen Liqin <liqin.linux@gmail.com>
@@@ -7695,8 -7673,8 +7703,8 @@@ M:      "Paul E. McKenney" <paulmck@linux.vn
  W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 -F:    include/linux/srcu*
 -F:    kernel/srcu*
 +F:    include/linux/srcu.h
 +F:    kernel/rcu/srcu.c
  
  SMACK SECURITY MODULE
  M:    Casey Schaufler <casey@schaufler-ca.com>
@@@ -8031,7 -8009,7 +8039,7 @@@ S:      Maintaine
  F:    drivers/staging/media/go7007/
  
  STAGING - INDUSTRIAL IO
 -M:    Jonathan Cameron <jic23@cam.ac.uk>
 +M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
  S:    Odd Fixes
  F:    drivers/staging/iio/
@@@ -8712,6 -8690,14 +8720,6 @@@ S:     Maintaine
  F:    arch/m68k/*/*_no.*
  F:    arch/m68k/include/asm/*_no.*
  
 -UCLINUX FOR RENESAS H8/300 (H8300)
 -M:    Yoshinori Sato <ysato@users.sourceforge.jp>
 -W:    http://uclinux-h8.sourceforge.jp/
 -S:    Supported
 -F:    arch/h8300/
 -F:    drivers/ide/ide-h8300.c
 -F:    drivers/net/ethernet/8390/ne-h8300.c
 -
  UDF FILESYSTEM
  M:    Jan Kara <jack@suse.cz>
  S:    Maintained
@@@ -18,9 -18,6 +18,9 @@@
        interrupt-parent = <&intc>;
  
        aliases {
 +              i2c0 = &i2c0;
 +              i2c1 = &i2c1;
 +              i2c2 = &i2c2;
                serial0 = &uart0;
                serial1 = &uart1;
                serial2 = &uart2;
@@@ -33,8 -30,6 +33,8 @@@
                usb1 = &usb1;
                phy0 = &usb0_phy;
                phy1 = &usb1_phy;
 +              ethernet0 = &cpsw_emac0;
 +              ethernet1 = &cpsw_emac1;
        };
  
        cpus {
                };
        };
  
 +      pmu {
 +              compatible = "arm,cortex-a8-pmu";
 +              interrupts = <3>;
 +      };
 +
        /*
         * The soc node represents the soc top level view. It is uses for IPs
         * that are not memory mapped in the MPU view or for the MPU itself.
                        reg = <0x48200000 0x1000>;
                };
  
 +              edma: edma@49000000 {
 +                      compatible = "ti,edma3";
 +                      ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2";
 +                      reg =   <0x49000000 0x10000>,
 +                              <0x44e10f90 0x10>;
 +                      interrupts = <12 13 14>;
 +                      #dma-cells = <1>;
 +                      dma-channels = <64>;
 +                      ti,edma-regions = <4>;
 +                      ti,edma-slots = <256>;
 +              };
 +
                gpio0: gpio@44e07000 {
                        compatible = "ti,omap4-gpio";
                        ti,hwmods = "gpio1";
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
 -                      #interrupt-cells = <1>;
 +                      #interrupt-cells = <2>;
                        reg = <0x44e07000 0x1000>;
                        interrupts = <96>;
                };
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
 -                      #interrupt-cells = <1>;
 +                      #interrupt-cells = <2>;
                        reg = <0x4804c000 0x1000>;
                        interrupts = <98>;
                };
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
 -                      #interrupt-cells = <1>;
 +                      #interrupt-cells = <2>;
                        reg = <0x481ac000 0x1000>;
                        interrupts = <32>;
                };
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
 -                      #interrupt-cells = <1>;
 +                      #interrupt-cells = <2>;
                        reg = <0x481ae000 0x1000>;
                        interrupts = <62>;
                };
                        status = "disabled";
                };
  
 +              mmc1: mmc@48060000 {
 +                      compatible = "ti,omap4-hsmmc";
 +                      ti,hwmods = "mmc1";
 +                      ti,dual-volt;
 +                      ti,needs-special-reset;
 +                      ti,needs-special-hs-handling;
 +                      dmas = <&edma 24
 +                              &edma 25>;
 +                      dma-names = "tx", "rx";
 +                      interrupts = <64>;
 +                      interrupt-parent = <&intc>;
 +                      reg = <0x48060000 0x1000>;
 +                      status = "disabled";
 +              };
 +
 +              mmc2: mmc@481d8000 {
 +                      compatible = "ti,omap4-hsmmc";
 +                      ti,hwmods = "mmc2";
 +                      ti,needs-special-reset;
 +                      dmas = <&edma 2
 +                              &edma 3>;
 +                      dma-names = "tx", "rx";
 +                      interrupts = <28>;
 +                      interrupt-parent = <&intc>;
 +                      reg = <0x481d8000 0x1000>;
 +                      status = "disabled";
 +              };
 +
 +              mmc3: mmc@47810000 {
 +                      compatible = "ti,omap4-hsmmc";
 +                      ti,hwmods = "mmc3";
 +                      ti,needs-special-reset;
 +                      interrupts = <29>;
 +                      interrupt-parent = <&intc>;
 +                      reg = <0x47810000 0x1000>;
 +                      status = "disabled";
 +              };
 +
 +              hwspinlock: spinlock@480ca000 {
 +                      compatible = "ti,omap4-hwspinlock";
 +                      reg = <0x480ca000 0x1000>;
 +                      ti,hwmods = "spinlock";
 +              };
 +
                wdt2: wdt@44e35000 {
                        compatible = "ti,omap3-wdt";
                        ti,hwmods = "wd_timer2";
                        interrupts = <65>;
                        ti,spi-num-cs = <2>;
                        ti,hwmods = "spi0";
 +                      dmas = <&edma 16
 +                              &edma 17
 +                              &edma 18
 +                              &edma 19>;
 +                      dma-names = "tx0", "rx0", "tx1", "rx1";
                        status = "disabled";
                };
  
                        interrupts = <125>;
                        ti,spi-num-cs = <2>;
                        ti,hwmods = "spi1";
 +                      dmas = <&edma 42
 +                              &edma 43
 +                              &edma 44
 +                              &edma 45>;
 +                      dma-names = "tx0", "rx0", "tx1", "rx1";
                        status = "disabled";
                };
  
                        ti,hwmods = "usb_otg_hs";
                        status = "disabled";
  
 -                      ctrl_mod: control@44e10000 {
 +                      usb_ctrl_mod: control@44e10000 {
                                compatible = "ti,am335x-usb-ctrl-module";
                                reg = <0x44e10620 0x10
                                        0x44e10648 0x4>;
                                reg = <0x47401300 0x100>;
                                reg-names = "phy";
                                status = "disabled";
 -                              ti,ctrl_mod = <&ctrl_mod>;
 +                              ti,ctrl_mod = <&usb_ctrl_mod>;
                        };
  
                        usb0: usb@47401000 {
                                reg = <0x47401b00 0x100>;
                                reg-names = "phy";
                                status = "disabled";
 -                              ti,ctrl_mod = <&ctrl_mod>;
 +                              ti,ctrl_mod = <&usb_ctrl_mod>;
                        };
  
                        usb1: usb@47401800 {
                                /* Filled in by U-Boot */
                                mac-address = [ 00 00 00 00 00 00 ];
                        };
+                       phy_sel: cpsw-phy-sel@44e10650 {
+                               compatible = "ti,am3352-cpsw-phy-sel";
+                               reg= <0x44e10650 0x4>;
+                               reg-names = "gmii-sel";
+                       };
                };
  
                ocmcram: ocmcram@40300000 {
                        reg = <0x44d00000 0x4000        /* M3 UMEM */
                               0x44d80000 0x2000>;      /* M3 DMEM */
                        ti,hwmods = "wkup_m3";
 +                      ti,no-reset-on-init;
                };
  
                elm: elm@48080000 {
                        status = "disabled";
                };
  
 +              lcdc: lcdc@4830e000 {
 +                      compatible = "ti,am33xx-tilcdc";
 +                      reg = <0x4830e000 0x1000>;
 +                      interrupt-parent = <&intc>;
 +                      interrupts = <36>;
 +                      ti,hwmods = "lcdc";
 +                      status = "disabled";
 +              };
 +
                tscadc: tscadc@44e0d000 {
                        compatible = "ti,am3359-tscadc";
                        reg = <0x44e0d000 0x1000>;
                gpmc: gpmc@50000000 {
                        compatible = "ti,am3352-gpmc";
                        ti,hwmods = "gpmc";
 +                      ti,no-idle-on-init;
                        reg = <0x50000000 0x2000>;
                        interrupts = <100>;
                        gpmc,num-cs = <7>;
                        #size-cells = <1>;
                        status = "disabled";
                };
 +
 +              sham: sham@53100000 {
 +                      compatible = "ti,omap4-sham";
 +                      ti,hwmods = "sham";
 +                      reg = <0x53100000 0x200>;
 +                      interrupts = <109>;
 +                      dmas = <&edma 36>;
 +                      dma-names = "rx";
 +              };
 +
 +              aes: aes@53500000 {
 +                      compatible = "ti,omap4-aes";
 +                      ti,hwmods = "aes";
 +                      reg = <0x53500000 0xa0>;
 +                      interrupts = <103>;
 +                      dmas = <&edma 6>,
 +                             <&edma 5>;
 +                      dma-names = "tx", "rx";
 +              };
 +
 +              mcasp0: mcasp@48038000 {
 +                      compatible = "ti,am33xx-mcasp-audio";
 +                      ti,hwmods = "mcasp0";
 +                      reg = <0x48038000 0x2000>,
 +                            <0x46000000 0x400000>;
 +                      reg-names = "mpu", "dat";
 +                      interrupts = <80>, <81>;
 +                      interrupts-names = "tx", "rx";
 +                      status = "disabled";
 +                      dmas = <&edma 8>,
 +                              <&edma 9>;
 +                      dma-names = "tx", "rx";
 +              };
 +
 +              mcasp1: mcasp@4803C000 {
 +                      compatible = "ti,am33xx-mcasp-audio";
 +                      ti,hwmods = "mcasp1";
 +                      reg = <0x4803C000 0x2000>,
 +                            <0x46400000 0x400000>;
 +                      reg-names = "mpu", "dat";
 +                      interrupts = <82>, <83>;
 +                      interrupts-names = "tx", "rx";
 +                      status = "disabled";
 +                      dmas = <&edma 10>,
 +                              <&edma 11>;
 +                      dma-names = "tx", "rx";
 +              };
 +
 +              rng: rng@48310000 {
 +                      compatible = "ti,omap4-rng";
 +                      ti,hwmods = "rng";
 +                      reg = <0x48310000 0x2000>;
 +                      interrupts = <111>;
 +              };
        };
  };
@@@ -40,6 -40,7 +40,7 @@@
  #include <net/net_namespace.h>
  #include <net/netns/generic.h>
  #include <linux/nsproxy.h>
+ #include <linux/reciprocal_div.h>
  
  #include "bonding.h"
  
@@@ -149,6 -150,14 +150,6 @@@ err_no_cmd
        return -EPERM;
  }
  
 -static const void *bonding_namespace(struct class *cls,
 -                                   const struct class_attribute *attr)
 -{
 -      const struct bond_net *bn =
 -              container_of(attr, struct bond_net, class_attr_bonding_masters);
 -      return bn->net;
 -}
 -
  /* class attribute for bond_masters file.  This ends up in /sys/class/net */
  static const struct class_attribute class_attr_bonding_masters = {
        .attr = {
        },
        .show = bonding_show_bonds,
        .store = bonding_store_bonds,
 -      .namespace = bonding_namespace,
  };
  
- int bond_create_slave_symlinks(struct net_device *master,
-                              struct net_device *slave)
- {
-       char linkname[IFNAMSIZ+7];
-       int ret = 0;
-       /* first, create a link from the slave back to the master */
-       ret = sysfs_create_link(&(slave->dev.kobj), &(master->dev.kobj),
-                               "master");
-       if (ret)
-               return ret;
-       /* next, create a link from the master to the slave */
-       sprintf(linkname, "slave_%s", slave->name);
-       ret = sysfs_create_link(&(master->dev.kobj), &(slave->dev.kobj),
-                               linkname);
-       /* free the master link created earlier in case of error */
-       if (ret)
-               sysfs_remove_link(&(slave->dev.kobj), "master");
-       return ret;
- }
- void bond_destroy_slave_symlinks(struct net_device *master,
-                                struct net_device *slave)
- {
-       char linkname[IFNAMSIZ+7];
-       sysfs_remove_link(&(slave->dev.kobj), "master");
-       sprintf(linkname, "slave_%s", slave->name);
-       sysfs_remove_link(&(master->dev.kobj), linkname);
- }
  /*
   * Show the slaves in the current bond.
   */
@@@ -201,11 -176,14 +167,14 @@@ static ssize_t bonding_show_slaves(stru
                                   struct device_attribute *attr, char *buf)
  {
        struct bonding *bond = to_bond(d);
+       struct list_head *iter;
        struct slave *slave;
        int res = 0;
  
-       read_lock(&bond->lock);
-       bond_for_each_slave(bond, slave) {
+       if (!rtnl_trylock())
+               return restart_syscall();
+       bond_for_each_slave(bond, slave, iter) {
                if (res > (PAGE_SIZE - IFNAMSIZ)) {
                        /* not enough space for another interface name */
                        if ((PAGE_SIZE - res) > 10)
                }
                res += sprintf(buf + res, "%s ", slave->dev->name);
        }
-       read_unlock(&bond->lock);
+       rtnl_unlock();
        if (res)
                buf[res-1] = '\n'; /* eat the leftover space */
  
@@@ -304,50 -284,26 +275,26 @@@ static ssize_t bonding_store_mode(struc
                                  struct device_attribute *attr,
                                  const char *buf, size_t count)
  {
-       int new_value, ret = count;
+       int new_value, ret;
        struct bonding *bond = to_bond(d);
  
-       if (!rtnl_trylock())
-               return restart_syscall();
-       if (bond->dev->flags & IFF_UP) {
-               pr_err("unable to update mode of %s because interface is up.\n",
-                      bond->dev->name);
-               ret = -EPERM;
-               goto out;
-       }
-       if (!list_empty(&bond->slave_list)) {
-               pr_err("unable to update mode of %s because it has slaves.\n",
-                       bond->dev->name);
-               ret = -EPERM;
-               goto out;
-       }
        new_value = bond_parse_parm(buf, bond_mode_tbl);
        if (new_value < 0)  {
                pr_err("%s: Ignoring invalid mode value %.*s.\n",
                       bond->dev->name, (int)strlen(buf) - 1, buf);
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
-       if ((new_value == BOND_MODE_ALB ||
-            new_value == BOND_MODE_TLB) &&
-           bond->params.arp_interval) {
-               pr_err("%s: %s mode is incompatible with arp monitoring.\n",
-                      bond->dev->name, bond_mode_tbl[new_value].modename);
-               ret = -EINVAL;
-               goto out;
+       if (!rtnl_trylock())
+               return restart_syscall();
+       ret = bond_option_mode_set(bond, new_value);
+       if (!ret) {
+               pr_info("%s: setting mode to %s (%d).\n",
+                       bond->dev->name, bond_mode_tbl[new_value].modename,
+                       new_value);
+               ret = count;
        }
  
-       /* don't cache arp_validate between modes */
-       bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
-       bond->params.mode = new_value;
-       bond_set_mode_ops(bond, bond->params.mode);
-       pr_info("%s: setting mode to %s (%d).\n",
-               bond->dev->name, bond_mode_tbl[new_value].modename,
-               new_value);
- out:
        rtnl_unlock();
        return ret;
  }
@@@ -383,7 -339,6 +330,6 @@@ static ssize_t bonding_store_xmit_hash(
                ret = -EINVAL;
        } else {
                bond->params.xmit_policy = new_value;
-               bond_set_mode_ops(bond, bond->params.mode);
                pr_info("%s: setting xmit hash policy to %s (%d).\n",
                        bond->dev->name,
                        xmit_hashtype_tbl[new_value].modename, new_value);
@@@ -513,7 -468,7 +459,7 @@@ static ssize_t bonding_store_fail_over_
        if (!rtnl_trylock())
                return restart_syscall();
  
-       if (!list_empty(&bond->slave_list)) {
+       if (bond_has_slaves(bond)) {
                pr_err("%s: Can't alter fail_over_mac with slaves in bond.\n",
                       bond->dev->name);
                ret = -EPERM;
@@@ -647,11 -602,15 +593,15 @@@ static ssize_t bonding_store_arp_target
                                         const char *buf, size_t count)
  {
        struct bonding *bond = to_bond(d);
+       struct list_head *iter;
        struct slave *slave;
        __be32 newtarget, *targets;
        unsigned long *targets_rx;
        int ind, i, j, ret = -EINVAL;
  
+       if (!rtnl_trylock())
+               return restart_syscall();
        targets = bond->params.arp_targets;
        newtarget = in_aton(buf + 1);
        /* look for adds */
                         &newtarget);
                /* not to race with bond_arp_rcv */
                write_lock_bh(&bond->lock);
-               bond_for_each_slave(bond, slave)
+               bond_for_each_slave(bond, slave, iter)
                        slave->target_last_arp_rx[ind] = jiffies;
                targets[ind] = newtarget;
                write_unlock_bh(&bond->lock);
                        &newtarget);
  
                write_lock_bh(&bond->lock);
-               bond_for_each_slave(bond, slave) {
+               bond_for_each_slave(bond, slave, iter) {
                        targets_rx = slave->target_last_arp_rx;
                        j = ind;
                        for (; (j < BOND_MAX_ARP_TARGETS-1) && targets[j+1]; j++)
  
        ret = count;
  out:
+       rtnl_unlock();
        return ret;
  }
  static DEVICE_ATTR(arp_ip_target, S_IRUGO | S_IWUSR , bonding_show_arp_targets, bonding_store_arp_targets);
@@@ -1102,6 -1062,7 +1053,7 @@@ static ssize_t bonding_store_primary(st
                                     const char *buf, size_t count)
  {
        struct bonding *bond = to_bond(d);
+       struct list_head *iter;
        char ifname[IFNAMSIZ];
        struct slave *slave;
  
                goto out;
        }
  
-       bond_for_each_slave(bond, slave) {
+       bond_for_each_slave(bond, slave, iter) {
                if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
                        pr_info("%s: Setting %s as primary slave.\n",
                                bond->dev->name, slave->dev->name);
@@@ -1259,13 -1220,13 +1211,13 @@@ static ssize_t bonding_show_active_slav
                                         char *buf)
  {
        struct bonding *bond = to_bond(d);
-       struct slave *curr;
+       struct net_device *slave_dev;
        int count = 0;
  
        rcu_read_lock();
-       curr = rcu_dereference(bond->curr_active_slave);
-       if (USES_PRIMARY(bond->params.mode) && curr)
-               count = sprintf(buf, "%s\n", curr->dev->name);
+       slave_dev = bond_option_active_slave_get_rcu(bond);
+       if (slave_dev)
+               count = sprintf(buf, "%s\n", slave_dev->name);
        rcu_read_unlock();
  
        return count;
@@@ -1275,80 -1236,33 +1227,33 @@@ static ssize_t bonding_store_active_sla
                                          struct device_attribute *attr,
                                          const char *buf, size_t count)
  {
-       struct slave *slave, *old_active, *new_active;
+       int ret;
        struct bonding *bond = to_bond(d);
        char ifname[IFNAMSIZ];
+       struct net_device *dev;
  
        if (!rtnl_trylock())
                return restart_syscall();
  
-       old_active = new_active = NULL;
-       block_netpoll_tx();
-       read_lock(&bond->lock);
-       write_lock_bh(&bond->curr_slave_lock);
-       if (!USES_PRIMARY(bond->params.mode)) {
-               pr_info("%s: Unable to change active slave; %s is in mode %d\n",
-                       bond->dev->name, bond->dev->name, bond->params.mode);
-               goto out;
-       }
        sscanf(buf, "%15s", ifname); /* IFNAMSIZ */
-       /* check to see if we are clearing active */
        if (!strlen(ifname) || buf[0] == '\n') {
-               pr_info("%s: Clearing current active slave.\n",
-                       bond->dev->name);
-               rcu_assign_pointer(bond->curr_active_slave, NULL);
-               bond_select_active_slave(bond);
-               goto out;
-       }
-       bond_for_each_slave(bond, slave) {
-               if (strncmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
-                       old_active = bond->curr_active_slave;
-                       new_active = slave;
-                       if (new_active == old_active) {
-                               /* do nothing */
-                               pr_info("%s: %s is already the current"
-                                       " active slave.\n",
-                                       bond->dev->name,
-                                       slave->dev->name);
-                               goto out;
-                       } else {
-                               if ((new_active) &&
-                                   (old_active) &&
-                                   (new_active->link == BOND_LINK_UP) &&
-                                   IS_UP(new_active->dev)) {
-                                       pr_info("%s: Setting %s as active"
-                                               " slave.\n",
-                                               bond->dev->name,
-                                               slave->dev->name);
-                                       bond_change_active_slave(bond,
-                                                                new_active);
-                               } else {
-                                       pr_info("%s: Could not set %s as"
-                                               " active slave; either %s is"
-                                               " down or the link is down.\n",
-                                               bond->dev->name,
-                                               slave->dev->name,
-                                               slave->dev->name);
-                               }
-                               goto out;
-                       }
+               dev = NULL;
+       } else {
+               dev = __dev_get_by_name(dev_net(bond->dev), ifname);
+               if (!dev) {
+                       ret = -ENODEV;
+                       goto out;
                }
        }
  
-       pr_info("%s: Unable to set %.*s as active slave.\n",
-               bond->dev->name, (int)strlen(buf) - 1, buf);
-  out:
-       write_unlock_bh(&bond->curr_slave_lock);
-       read_unlock(&bond->lock);
-       unblock_netpoll_tx();
+       ret = bond_option_active_slave_set(bond, dev);
+       if (!ret)
+               ret = count;
  
+  out:
        rtnl_unlock();
  
-       return count;
+       return ret;
  
  }
  static DEVICE_ATTR(active_slave, S_IRUGO | S_IWUSR,
@@@ -1484,14 -1398,14 +1389,14 @@@ static ssize_t bonding_show_queue_id(st
                                     char *buf)
  {
        struct bonding *bond = to_bond(d);
+       struct list_head *iter;
        struct slave *slave;
        int res = 0;
  
        if (!rtnl_trylock())
                return restart_syscall();
  
-       read_lock(&bond->lock);
-       bond_for_each_slave(bond, slave) {
+       bond_for_each_slave(bond, slave, iter) {
                if (res > (PAGE_SIZE - IFNAMSIZ - 6)) {
                        /* not enough space for another interface_name:queue_id pair */
                        if ((PAGE_SIZE - res) > 10)
                res += sprintf(buf + res, "%s:%d ",
                               slave->dev->name, slave->queue_id);
        }
-       read_unlock(&bond->lock);
        if (res)
                buf[res-1] = '\n'; /* eat the leftover space */
        rtnl_unlock();
  
        return res;
@@@ -1520,6 -1434,7 +1425,7 @@@ static ssize_t bonding_store_queue_id(s
  {
        struct slave *slave, *update_slave;
        struct bonding *bond = to_bond(d);
+       struct list_head *iter;
        u16 qid;
        int ret = count;
        char *delim;
        if (!sdev)
                goto err_no_cmd;
  
-       read_lock(&bond->lock);
        /* Search for thes slave and check for duplicate qids */
        update_slave = NULL;
-       bond_for_each_slave(bond, slave) {
+       bond_for_each_slave(bond, slave, iter) {
                if (sdev == slave->dev)
                        /*
                         * We don't need to check the matching
                         */
                        update_slave = slave;
                else if (qid && qid == slave->queue_id) {
-                       goto err_no_cmd_unlock;
+                       goto err_no_cmd;
                }
        }
  
        if (!update_slave)
-               goto err_no_cmd_unlock;
+               goto err_no_cmd;
  
        /* Actually set the qids for the slave */
        update_slave->queue_id = qid;
  
-       read_unlock(&bond->lock);
  out:
        rtnl_unlock();
        return ret;
  
- err_no_cmd_unlock:
-       read_unlock(&bond->lock);
  err_no_cmd:
        pr_info("invalid input for queue_id set for %s.\n",
                bond->dev->name);
@@@ -1610,8 -1520,12 +1511,12 @@@ static ssize_t bonding_store_slaves_act
  {
        struct bonding *bond = to_bond(d);
        int new_value, ret = count;
+       struct list_head *iter;
        struct slave *slave;
  
+       if (!rtnl_trylock())
+               return restart_syscall();
        if (sscanf(buf, "%d", &new_value) != 1) {
                pr_err("%s: no all_slaves_active value specified.\n",
                       bond->dev->name);
                goto out;
        }
  
-       read_lock(&bond->lock);
-       bond_for_each_slave(bond, slave) {
+       bond_for_each_slave(bond, slave, iter) {
                if (!bond_is_active_slave(slave)) {
                        if (new_value)
                                slave->inactive = 0;
                                slave->inactive = 1;
                }
        }
-       read_unlock(&bond->lock);
  out:
+       rtnl_unlock();
        return ret;
  }
  static DEVICE_ATTR(all_slaves_active, S_IRUGO | S_IWUSR,
  static DEVICE_ATTR(lp_interval, S_IRUGO | S_IWUSR,
                   bonding_show_lp_interval, bonding_store_lp_interval);
  
+ static ssize_t bonding_show_packets_per_slave(struct device *d,
+                                             struct device_attribute *attr,
+                                             char *buf)
+ {
+       struct bonding *bond = to_bond(d);
+       int packets_per_slave = bond->params.packets_per_slave;
+       if (packets_per_slave > 1)
+               packets_per_slave = reciprocal_value(packets_per_slave);
+       return sprintf(buf, "%d\n", packets_per_slave);
+ }
+ static ssize_t bonding_store_packets_per_slave(struct device *d,
+                                              struct device_attribute *attr,
+                                              const char *buf, size_t count)
+ {
+       struct bonding *bond = to_bond(d);
+       int new_value, ret = count;
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               pr_err("%s: no packets_per_slave value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0 || new_value > USHRT_MAX) {
+               pr_err("%s: packets_per_slave must be between 0 and %u\n",
+                      bond->dev->name, USHRT_MAX);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (bond->params.mode != BOND_MODE_ROUNDROBIN)
+               pr_warn("%s: Warning: packets_per_slave has effect only in balance-rr mode\n",
+                       bond->dev->name);
+       if (new_value > 1)
+               bond->params.packets_per_slave = reciprocal_value(new_value);
+       else
+               bond->params.packets_per_slave = new_value;
+ out:
+       return ret;
+ }
+ static DEVICE_ATTR(packets_per_slave, S_IRUGO | S_IWUSR,
+                  bonding_show_packets_per_slave,
+                  bonding_store_packets_per_slave);
  static struct attribute *per_bond_attrs[] = {
        &dev_attr_slaves.attr,
        &dev_attr_mode.attr,
        &dev_attr_resend_igmp.attr,
        &dev_attr_min_links.attr,
        &dev_attr_lp_interval.attr,
+       &dev_attr_packets_per_slave.attr,
        NULL,
  };
  
@@@ -1778,8 -1739,7 +1730,8 @@@ int bond_create_sysfs(struct bond_net *
        bn->class_attr_bonding_masters = class_attr_bonding_masters;
        sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
  
 -      ret = netdev_class_create_file(&bn->class_attr_bonding_masters);
 +      ret = netdev_class_create_file_ns(&bn->class_attr_bonding_masters,
 +                                        bn->net);
        /*
         * Permit multiple loads of the module by ignoring failures to
         * create the bonding_masters sysfs file.  Bonding devices
   */
  void bond_destroy_sysfs(struct bond_net *bn)
  {
 -      netdev_class_remove_file(&bn->class_attr_bonding_masters);
 +      netdev_class_remove_file_ns(&bn->class_attr_bonding_masters, bn->net);
  }
  
  /*
@@@ -344,8 -344,8 +344,8 @@@ static void cp_to_buf(const int type, v
                }
  
                clen = len & 1;
-               rtp = tp;
-               rfp = fp;
+               rtp = (unsigned char *)tp;
+               rfp = (const unsigned char *)fp;
                while (clen--) {
                        *rtp++ = *rfp++;
                }
                 * do the rest, if any.
                 */
                clen = len & 15;
-               rtp = (unsigned char *) tp;
-               rfp = (unsigned char *) fp;
+               rtp = (unsigned char *)tp;
+               rfp = (const unsigned char *)fp;
                while (clen--) {
                        *rtp++ = *rfp++;
                }
@@@ -403,8 -403,8 +403,8 @@@ static void cp_from_buf(const int type
  
                clen = len & 1;
  
-               rtp = tp;
-               rfp = fp;
+               rtp = (unsigned char *)tp;
+               rfp = (const unsigned char *)fp;
  
                while (clen--) {
                        *rtp++ = *rfp++;
                 * do the rest, if any.
                 */
                clen = len & 15;
-               rtp = (unsigned char *) tp;
-               rfp = (unsigned char *) fp;
+               rtp = (unsigned char *)tp;
+               rfp = (const unsigned char *)fp;
                while (clen--) {
                        *rtp++ = *rfp++;
                }
@@@ -725,6 -725,7 +725,6 @@@ static irqreturn_t lance_dma_merr_int(i
  {
        struct net_device *dev = dev_id;
  
 -      clear_ioasic_dma_irq(irq);
        printk(KERN_ERR "%s: DMA error\n", dev->name);
        return IRQ_HANDLED;
  }
@@@ -811,7 -812,7 +811,7 @@@ static int lance_open(struct net_devic
        if (lp->dma_irq >= 0) {
                unsigned long flags;
  
 -              if (request_irq(lp->dma_irq, lance_dma_merr_int, 0,
 +              if (request_irq(lp->dma_irq, lance_dma_merr_int, IRQF_ONESHOT,
                                "lance error", dev)) {
                        free_irq(dev->irq, dev);
                        printk("%s: Can't get DMA IRQ %d\n", dev->name,
@@@ -628,12 -628,12 +628,12 @@@ static const struct net_device_ops arc_
  
  static int arc_emac_probe(struct platform_device *pdev)
  {
 -      struct resource res_regs, res_irq;
 +      struct resource res_regs;
        struct device_node *phy_node;
        struct arc_emac_priv *priv;
        struct net_device *ndev;
        const char *mac_addr;
 -      unsigned int id, clock_frequency;
 +      unsigned int id, clock_frequency, irq;
        int err;
  
        if (!pdev->dev.of_node)
        }
  
        /* Get IRQ from device tree */
 -      err = of_irq_to_resource(pdev->dev.of_node, 0, &res_irq);
 -      if (!err) {
 +      irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
 +      if (!irq) {
                dev_err(&pdev->dev, "failed to retrieve <irq> value from device tree\n");
                return -ENODEV;
        }
        if (!ndev)
                return -ENOMEM;
  
+       platform_set_drvdata(pdev, ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
  
        ndev->netdev_ops = &arc_emac_netdev_ops;
                goto out;
        }
  
 -      ndev->irq = res_irq.start;
 +      ndev->irq = irq;
        dev_info(&pdev->dev, "IRQ is %d\n", ndev->irq);
  
        /* Register interrupt handler for device */
        /* Get MAC address from device tree */
        mac_addr = of_get_mac_address(pdev->dev.of_node);
  
-       if (!mac_addr || !is_valid_ether_addr(mac_addr))
-               eth_hw_addr_random(ndev);
-       else
+       if (mac_addr)
                memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
+       else
+               eth_hw_addr_random(ndev);
  
        dev_info(&pdev->dev, "MAC address is now %pM\n", ndev->dev_addr);
  
@@@ -78,8 -78,6 +78,8 @@@
  #include <linux/if_vlan.h>
  #include <linux/spinlock.h>
  #include <linux/mm.h>
 +#include <linux/of_address.h>
 +#include <linux/of_irq.h>
  #include <linux/of_mdio.h>
  #include <linux/of_platform.h>
  #include <linux/ip.h>
@@@ -2920,7 -2918,7 +2920,7 @@@ static int gfar_poll(struct napi_struc
        struct gfar_priv_rx_q *rx_queue = NULL;
        int work_done = 0, work_done_per_q = 0;
        int i, budget_per_q = 0;
-       int has_tx_work;
+       int has_tx_work = 0;
        unsigned long rstat_rxf;
        int num_act_queues;
  
        if (num_act_queues)
                budget_per_q = budget/num_act_queues;
  
-       while (1) {
-               has_tx_work = 0;
-               for_each_set_bit(i, &gfargrp->tx_bit_map, priv->num_tx_queues) {
-                       tx_queue = priv->tx_queue[i];
-                       /* run Tx cleanup to completion */
-                       if (tx_queue->tx_skbuff[tx_queue->skb_dirtytx]) {
-                               gfar_clean_tx_ring(tx_queue);
-                               has_tx_work = 1;
-                       }
+       for_each_set_bit(i, &gfargrp->tx_bit_map, priv->num_tx_queues) {
+               tx_queue = priv->tx_queue[i];
+               /* run Tx cleanup to completion */
+               if (tx_queue->tx_skbuff[tx_queue->skb_dirtytx]) {
+                       gfar_clean_tx_ring(tx_queue);
+                       has_tx_work = 1;
                }
+       }
  
-               for_each_set_bit(i, &gfargrp->rx_bit_map, priv->num_rx_queues) {
-                       /* skip queue if not active */
-                       if (!(rstat_rxf & (RSTAT_CLEAR_RXF0 >> i)))
-                               continue;
-                       rx_queue = priv->rx_queue[i];
-                       work_done_per_q =
-                               gfar_clean_rx_ring(rx_queue, budget_per_q);
-                       work_done += work_done_per_q;
-                       /* finished processing this queue */
-                       if (work_done_per_q < budget_per_q) {
-                               /* clear active queue hw indication */
-                               gfar_write(&regs->rstat,
-                                          RSTAT_CLEAR_RXF0 >> i);
-                               rstat_rxf &= ~(RSTAT_CLEAR_RXF0 >> i);
-                               num_act_queues--;
-                               if (!num_act_queues)
-                                       break;
-                               /* recompute budget per Rx queue */
-                               budget_per_q =
-                                       (budget - work_done) / num_act_queues;
-                       }
-               }
+       for_each_set_bit(i, &gfargrp->rx_bit_map, priv->num_rx_queues) {
+               /* skip queue if not active */
+               if (!(rstat_rxf & (RSTAT_CLEAR_RXF0 >> i)))
+                       continue;
  
-               if (work_done >= budget)
-                       break;
+               rx_queue = priv->rx_queue[i];
+               work_done_per_q =
+                       gfar_clean_rx_ring(rx_queue, budget_per_q);
+               work_done += work_done_per_q;
+               /* finished processing this queue */
+               if (work_done_per_q < budget_per_q) {
+                       /* clear active queue hw indication */
+                       gfar_write(&regs->rstat,
+                                  RSTAT_CLEAR_RXF0 >> i);
+                       num_act_queues--;
+                       if (!num_act_queues)
+                               break;
+               }
+       }
  
-               if (!num_act_queues && !has_tx_work) {
+       if (!num_act_queues && !has_tx_work) {
  
-                       napi_complete(napi);
+               napi_complete(napi);
  
-                       /* Clear the halt bit in RSTAT */
-                       gfar_write(&regs->rstat, gfargrp->rstat);
+               /* Clear the halt bit in RSTAT */
+               gfar_write(&regs->rstat, gfargrp->rstat);
  
-                       gfar_write(&regs->imask, IMASK_DEFAULT);
+               gfar_write(&regs->imask, IMASK_DEFAULT);
  
-                       /* If we are coalescing interrupts, update the timer
-                        * Otherwise, clear it
-                        */
-                       gfar_configure_coalescing(priv, gfargrp->rx_bit_map,
-                                                 gfargrp->tx_bit_map);
-                       break;
-               }
+               /* If we are coalescing interrupts, update the timer
+                * Otherwise, clear it
+                */
+               gfar_configure_coalescing(priv, gfargrp->rx_bit_map,
+                                         gfargrp->tx_bit_map);
        }
  
        return work_done;
@@@ -31,8 -31,6 +31,8 @@@
  #include <linux/mii.h>
  #include <linux/phy.h>
  #include <linux/workqueue.h>
 +#include <linux/of_address.h>
 +#include <linux/of_irq.h>
  #include <linux/of_mdio.h>
  #include <linux/of_net.h>
  #include <linux/of_platform.h>
@@@ -3901,7 -3899,7 +3901,7 @@@ static int ucc_geth_probe(struct platfo
  
        mac_addr = of_get_mac_address(np);
        if (mac_addr)
-               memcpy(dev->dev_addr, mac_addr, 6);
+               memcpy(dev->dev_addr, mac_addr, ETH_ALEN);
  
        ugeth->ug_info = ug_info;
        ugeth->dev = device;
@@@ -39,8 -39,6 +39,8 @@@
  #include <linux/bitops.h>
  #include <linux/workqueue.h>
  #include <linux/of.h>
 +#include <linux/of_address.h>
 +#include <linux/of_irq.h>
  #include <linux/of_net.h>
  #include <linux/slab.h>
  
@@@ -2678,7 -2676,7 +2678,7 @@@ static int emac_init_config(struct emac
                       np->full_name);
                return -ENXIO;
        }
-       memcpy(dev->ndev->dev_addr, p, 6);
+       memcpy(dev->ndev->dev_addr, p, ETH_ALEN);
  
        /* IAHT and GAHT filter parameterization */
        if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) {
@@@ -55,7 -55,7 +55,7 @@@
   ----------------------------------------------------------------------------*/
  
  static const char version[] =
-       "smc9194.c:v0.14 12/15/00 by Erik Stahlman (erik@vt.edu)\n";
+       "smc9194.c:v0.14 12/15/00 by Erik Stahlman (erik@vt.edu)";
  
  #include <linux/module.h>
  #include <linux/kernel.h>
  #define USE_32_BIT 1
  #endif
  
 -#if defined(__H8300H__) || defined(__H8300S__)
 -#define NO_AUTOPROBE
 -#undef insl
 -#undef outsl
 -#define insl(a,b,l)  io_insl_noswap(a,b,l)
 -#define outsl(a,b,l) io_outsl_noswap(a,b,l)
 -#endif
 -
  /*
   .the SMC9194 can be at any of the following port addresses.  To change,
   .for a slightly different card, you can add it to the array.  Keep in
@@@ -106,6 -114,12 +106,6 @@@ struct devlist 
        unsigned int irq;
  };
  
 -#if defined(CONFIG_H8S_EDOSK2674)
 -static struct devlist smc_devlist[] __initdata = {
 -      {.port = 0xf80000, .irq = 16},
 -      {.port = 0,        .irq = 0 },
 -};
 -#else
  static struct devlist smc_devlist[] __initdata = {
        {.port = 0x200, .irq = 0},
        {.port = 0x220, .irq = 0},
        {.port = 0x3E0, .irq = 0},
        {.port = 0,     .irq = 0},
  };
 -#endif
  /*
   . Wait time for memory to be free.  This probably shouldn't be
   . tuned that much, as waiting for this means nothing else happens
@@@ -597,7 -612,7 +597,7 @@@ static void smc_hardware_send_packet( s
        packet_no = inb( ioaddr + PNR_ARR + 1 );
        if ( packet_no & 0x80 ) {
                /* or isn't there?  BAD CHIP! */
-               printk(KERN_DEBUG CARDNAME": Memory allocation failed.\n");
+               netdev_dbg(dev, CARDNAME": Memory allocation failed.\n");
                dev_kfree_skb_any(skb);
                lp->saved_skb = NULL;
                netif_wake_queue(dev);
        /* point to the beginning of the packet */
        outw( PTR_AUTOINC , ioaddr + POINTER );
  
-       PRINTK3((CARDNAME": Trying to xmit packet of length %x\n", length ));
+       PRINTK3((CARDNAME": Trying to xmit packet of length %x\n", length));
  #if SMC_DEBUG > 2
        print_packet( buf, length );
  #endif
  #ifdef USE_32_BIT
        if ( length & 0x2  ) {
                outsl(ioaddr + DATA_1, buf,  length >> 2 );
 -#if !defined(__H8300H__) && !defined(__H8300S__)
                outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
 -#else
 -              ctrl_outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1);
 -#endif
        }
        else
                outsl(ioaddr + DATA_1, buf,  length >> 2 );
@@@ -846,7 -865,6 +846,6 @@@ static const struct net_device_ops smc_
  static int __init smc_probe(struct net_device *dev, int ioaddr)
  {
        int i, memory, retval;
-       static unsigned version_printed;
        unsigned int bank;
  
        const char *version_string;
                retval = -ENODEV;
                goto err_out;
        }
 -#if !defined(CONFIG_H8S_EDOSK2674)
        /* well, we've already written once, so hopefully another time won't
           hurt.  This time, I need to switch the bank register to bank 1,
           so I can access the base address register */
                retval = -ENODEV;
                goto err_out;
        }
 -#else
 -      (void)base_address_register; /* Warning suppression */
 -#endif
 -
  
        /*  check if the revision register is something that I recognize.
            These might need to be added to later, as future revisions
           It might be prudent to check a listing of MAC addresses
           against the hardware address, or do some other tests. */
  
-       if (version_printed++ == 0)
-               printk("%s", version);
+       pr_info_once("%s\n", version);
  
        /* fill in some of the fields */
        dev->base_addr = ioaddr;
  
        /* now, print out the card info, in a short format.. */
  
-       printk("%s: %s(r:%d) at %#3x IRQ:%d INTF:%s MEM:%db ", dev->name,
-               version_string, revision_register & 0xF, ioaddr, dev->irq,
-               if_string, memory );
+       netdev_info(dev, "%s(r:%d) at %#3x IRQ:%d INTF:%s MEM:%db ",
+                   version_string, revision_register & 0xF, ioaddr, dev->irq,
+                   if_string, memory);
        /*
         . Print the Ethernet address
        */
-       printk("ADDR: %pM\n", dev->dev_addr);
+       netdev_info(dev, "ADDR: %pM\n", dev->dev_addr);
  
        /* Grab the IRQ */
-               retval = request_irq(dev->irq, smc_interrupt, 0, DRV_NAME, dev);
-               if (retval) {
-               printk("%s: unable to get IRQ %d (irqval=%d).\n", DRV_NAME,
-                       dev->irq, retval);
-               goto err_out;
-               }
+       retval = request_irq(dev->irq, smc_interrupt, 0, DRV_NAME, dev);
+       if (retval) {
+               netdev_warn(dev, "%s: unable to get IRQ %d (irqval=%d).\n",
+                           DRV_NAME, dev->irq, retval);
+               goto err_out;
+       }
  
        dev->netdev_ops                 = &smc_netdev_ops;
        dev->watchdog_timeo             = HZ/20;
@@@ -1037,30 -1059,32 +1035,32 @@@ static void print_packet( byte * buf, i
        int remainder;
        int lines;
  
-       printk("Packet of length %d\n", length);
+       pr_dbg("Packet of length %d\n", length);
        lines = length / 16;
        remainder = length % 16;
  
        for ( i = 0; i < lines ; i ++ ) {
                int cur;
  
+               printk(KERN_DEBUG);
                for ( cur = 0; cur < 8; cur ++ ) {
                        byte a, b;
  
                        a = *(buf ++ );
                        b = *(buf ++ );
-                       printk("%02x%02x ", a, b );
+                       pr_cont("%02x%02x ", a, b);
                }
-               printk("\n");
+               pr_cont("\n");
        }
+       printk(KERN_DEBUG);
        for ( i = 0; i < remainder/2 ; i++ ) {
                byte a, b;
  
                a = *(buf ++ );
                b = *(buf ++ );
-               printk("%02x%02x ", a, b );
+               pr_cont("%02x%02x ", a, b);
        }
-       printk("\n");
+       pr_cont("\n");
  #endif
  }
  #endif
@@@ -1127,9 -1151,8 +1127,8 @@@ static void smc_timeout(struct net_devi
  {
        /* If we get here, some higher level has decided we are broken.
           There should really be a "kick me" function call instead. */
-       printk(KERN_WARNING CARDNAME": transmit timed out, %s?\n",
-               tx_done(dev) ? "IRQ conflict" :
-               "network cable problem");
+       netdev_warn(dev, CARDNAME": transmit timed out, %s?\n",
+                   tx_done(dev) ? "IRQ conflict" : "network cable problem");
        /* "kick" the adaptor */
        smc_reset( dev->base_addr );
        smc_enable( dev->base_addr );
@@@ -1299,8 -1322,7 +1298,7 @@@ static void smc_tx( struct net_device 
        dev->stats.tx_errors++;
        if ( tx_status & TS_LOSTCAR ) dev->stats.tx_carrier_errors++;
        if ( tx_status & TS_LATCOL  ) {
-               printk(KERN_DEBUG CARDNAME
-                       ": Late collision occurred on last xmit.\n");
+               netdev_dbg(dev, CARDNAME": Late collision occurred on last xmit.\n");
                dev->stats.tx_window_errors++;
        }
  #if 0
  #endif
  
        if ( tx_status & TS_SUCCESS ) {
-               printk(CARDNAME": Successful packet caused interrupt\n");
+               netdev_info(dev, CARDNAME": Successful packet caused interrupt\n");
        }
        /* re-enable transmit */
        SMC_SELECT_BANK( 0 );
@@@ -1547,9 -1569,7 +1545,7 @@@ int __init init_module(void
  
        /* copy the parameters from insmod into the device structure */
        devSMC9194 = smc_init(-1);
-       if (IS_ERR(devSMC9194))
-               return PTR_ERR(devSMC9194);
-       return 0;
+       return PTR_ERR_OR_ZERO(devSMC9194);
  }
  
  void __exit cleanup_module(void)
@@@ -4451,7 -4451,7 +4451,7 @@@ int qeth_snmp_command(struct qeth_card 
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
        struct qeth_snmp_ureq *ureq;
-       int req_len;
+       unsigned int req_len;
        struct qeth_arp_query_info qinfo = {0, };
        int rc = 0;
  
        /* skip 4 bytes (data_len struct member) to get req_len */
        if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int)))
                return -EFAULT;
+       if (req_len > (QETH_BUFSIZE - IPA_PDU_HEADER_SIZE -
+                      sizeof(struct qeth_ipacmd_hdr) -
+                      sizeof(struct qeth_ipacmd_setadpparms_hdr)))
+               return -EINVAL;
        ureq = memdup_user(udata, req_len + sizeof(struct qeth_snmp_ureq_hdr));
        if (IS_ERR(ureq)) {
                QETH_CARD_TEXT(card, 2, "snmpnome");
@@@ -5096,7 -5100,7 +5100,7 @@@ void qeth_dbf_longtext(debug_info_t *id
        char dbf_txt_buf[32];
        va_list args;
  
 -      if (level > id->level)
 +      if (!debug_level_enabled(id, level))
                return;
        va_start(args, fmt);
        vsnprintf(dbf_txt_buf, sizeof(dbf_txt_buf), fmt, args);
  
  #include <linux/types.h>
  #include <linux/compiler.h>
+ #include <linux/bug.h>
+ extern bool static_key_initialized;
+ #define STATIC_KEY_CHECK_USE() WARN(!static_key_initialized,                \
+                                   "%s used before call to jump_label_init", \
+                                   __func__)
  
  #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL)
  
@@@ -128,29 -135,32 +135,32 @@@ struct static_key 
  
  static __always_inline void jump_label_init(void)
  {
+       static_key_initialized = true;
  }
  
  static __always_inline bool static_key_false(struct static_key *key)
  {
 -      if (unlikely(atomic_read(&key->enabled)) > 0)
 +      if (unlikely(atomic_read(&key->enabled) > 0))
                return true;
        return false;
  }
  
  static __always_inline bool static_key_true(struct static_key *key)
  {
 -      if (likely(atomic_read(&key->enabled)) > 0)
 +      if (likely(atomic_read(&key->enabled) > 0))
                return true;
        return false;
  }
  
  static inline void static_key_slow_inc(struct static_key *key)
  {
+       STATIC_KEY_CHECK_USE();
        atomic_inc(&key->enabled);
  }
  
  static inline void static_key_slow_dec(struct static_key *key)
  {
+       STATIC_KEY_CHECK_USE();
        atomic_dec(&key->enabled);
  }
  
@@@ -60,8 -60,8 +60,8 @@@ struct wireless_dev
  #define SET_ETHTOOL_OPS(netdev,ops) \
        ( (netdev)->ethtool_ops = (ops) )
  
extern void netdev_set_default_ethtool_ops(struct net_device *dev,
-                                          const struct ethtool_ops *ops);
+ void netdev_set_default_ethtool_ops(struct net_device *dev,
+                                   const struct ethtool_ops *ops);
  
  /* hardware address assignment types */
  #define NET_ADDR_PERM         0       /* address is permanent (default) */
@@@ -298,7 -298,7 +298,7 @@@ struct netdev_boot_setup 
  };
  #define NETDEV_BOOT_SETUP_MAX 8
  
extern int __init netdev_boot_setup(char *str);
+ int __init netdev_boot_setup(char *str);
  
  /*
   * Structure for NAPI scheduling similar to tasklet but with weighting
@@@ -394,7 -394,7 +394,7 @@@ enum rx_handler_result 
  typedef enum rx_handler_result rx_handler_result_t;
  typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
  
extern void __napi_schedule(struct napi_struct *n);
+ void __napi_schedule(struct napi_struct *n);
  
  static inline bool napi_disable_pending(struct napi_struct *n)
  {
@@@ -445,8 -445,8 +445,8 @@@ static inline bool napi_reschedule(stru
   *
   * Mark NAPI processing as complete.
   */
extern void __napi_complete(struct napi_struct *n);
extern void napi_complete(struct napi_struct *n);
+ void __napi_complete(struct napi_struct *n);
+ void napi_complete(struct napi_struct *n);
  
  /**
   *    napi_by_id - lookup a NAPI by napi_id
   * lookup @napi_id in napi_hash table
   * must be called under rcu_read_lock()
   */
extern struct napi_struct *napi_by_id(unsigned int napi_id);
+ struct napi_struct *napi_by_id(unsigned int napi_id);
  
  /**
   *    napi_hash_add - add a NAPI to global hashtable
   *
   * generate a new napi_id and store a @napi under it in napi_hash
   */
extern void napi_hash_add(struct napi_struct *napi);
+ void napi_hash_add(struct napi_struct *napi);
  
  /**
   *    napi_hash_del - remove a NAPI from global table
   * Warning: caller must observe rcu grace period
   * before freeing memory containing @napi
   */
extern void napi_hash_del(struct napi_struct *napi);
+ void napi_hash_del(struct napi_struct *napi);
  
  /**
   *    napi_disable - prevent NAPI from scheduling
   */
  static inline void napi_disable(struct napi_struct *n)
  {
+       might_sleep();
        set_bit(NAPI_STATE_DISABLE, &n->state);
        while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
                msleep(1);
@@@ -664,8 -665,8 +665,8 @@@ static inline void rps_reset_sock_flow(
  extern struct rps_sock_flow_table __rcu *rps_sock_flow_table;
  
  #ifdef CONFIG_RFS_ACCEL
extern bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index,
-                               u32 flow_id, u16 filter_id);
bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id,
+                        u16 filter_id);
  #endif
  
  /* This structure contains an instance of an RX queue. */
@@@ -961,6 -962,25 +962,25 @@@ struct netdev_phys_port_id 
   *    Called by vxlan to notify the driver about a UDP port and socket
   *    address family that vxlan is not listening to anymore. The operation
   *    is protected by the vxlan_net->sock_lock.
+  *
+  * void* (*ndo_dfwd_add_station)(struct net_device *pdev,
+  *                             struct net_device *dev)
+  *    Called by upper layer devices to accelerate switching or other
+  *    station functionality into hardware. 'pdev is the lowerdev
+  *    to use for the offload and 'dev' is the net device that will
+  *    back the offload. Returns a pointer to the private structure
+  *    the upper layer will maintain.
+  * void (*ndo_dfwd_del_station)(struct net_device *pdev, void *priv)
+  *    Called by upper layer device to delete the station created
+  *    by 'ndo_dfwd_add_station'. 'pdev' is the net device backing
+  *    the station and priv is the structure returned by the add
+  *    operation.
+  * netdev_tx_t (*ndo_dfwd_start_xmit)(struct sk_buff *skb,
+  *                                  struct net_device *dev,
+  *                                  void *priv);
+  *    Callback to use for xmit over the accelerated station. This
+  *    is used in place of ndo_start_xmit on accelerated net
+  *    devices.
   */
  struct net_device_ops {
        int                     (*ndo_init)(struct net_device *dev);
        void                    (*ndo_del_vxlan_port)(struct  net_device *dev,
                                                      sa_family_t sa_family,
                                                      __be16 port);
+       void*                   (*ndo_dfwd_add_station)(struct net_device *pdev,
+                                                       struct net_device *dev);
+       void                    (*ndo_dfwd_del_station)(struct net_device *pdev,
+                                                       void *priv);
+       netdev_tx_t             (*ndo_dfwd_start_xmit) (struct sk_buff *skb,
+                                                       struct net_device *dev,
+                                                       void *priv);
  };
  
  /*
@@@ -1131,7 -1160,7 +1160,7 @@@ struct net_device 
        unsigned long           mem_end;        /* shared mem end       */
        unsigned long           mem_start;      /* shared mem start     */
        unsigned long           base_addr;      /* device I/O address   */
-       unsigned int            irq;            /* device IRQ number    */
+       int                     irq;            /* device IRQ number    */
  
        /*
         *      Some hardware also needs these fields, but they are not
        struct list_head        dev_list;
        struct list_head        napi_list;
        struct list_head        unreg_list;
-       struct list_head        upper_dev_list; /* List of upper devices */
-       struct list_head        lower_dev_list;
+       struct list_head        close_list;
+       /* directly linked devices, like slaves for bonding */
+       struct {
+               struct list_head upper;
+               struct list_head lower;
+       } adj_list;
+       /* all linked devices, *including* neighbours */
+       struct {
+               struct list_head upper;
+               struct list_head lower;
+       } all_adj_list;
  
  
        /* currently active device features */
        /* Management operations */
        const struct net_device_ops *netdev_ops;
        const struct ethtool_ops *ethtool_ops;
+       const struct forwarding_accel_ops *fwd_ops;
  
        /* Hardware header description */
        const struct header_ops *header_ops;
@@@ -1487,9 -1528,9 +1528,9 @@@ static inline void netdev_for_each_tx_q
                f(dev, &dev->_tx[i], arg);
  }
  
extern struct netdev_queue *netdev_pick_tx(struct net_device *dev,
-                                          struct sk_buff *skb);
extern u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb);
+ struct netdev_queue *netdev_pick_tx(struct net_device *dev,
+                                   struct sk_buff *skb);
+ u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb);
  
  /*
   * Net namespace inlines
@@@ -1673,8 -1714,8 +1714,8 @@@ struct packet_offload 
  #define NETDEV_CHANGEUPPER    0x0015
  #define NETDEV_RESEND_IGMP    0x0016
  
extern int register_netdevice_notifier(struct notifier_block *nb);
extern int unregister_netdevice_notifier(struct notifier_block *nb);
+ int register_netdevice_notifier(struct notifier_block *nb);
+ int unregister_netdevice_notifier(struct notifier_block *nb);
  
  struct netdev_notifier_info {
        struct net_device *dev;
@@@ -1697,9 -1738,9 +1738,9 @@@ netdev_notifier_info_to_dev(const struc
        return info->dev;
  }
  
extern int call_netdevice_notifiers_info(unsigned long val, struct net_device *dev,
-                                        struct netdev_notifier_info *info);
extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
+ int call_netdevice_notifiers_info(unsigned long val, struct net_device *dev,
+                                 struct netdev_notifier_info *info);
+ int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
  
  
  extern rwlock_t                               dev_base_lock;          /* Device list lock */
@@@ -1754,54 -1795,53 +1795,53 @@@ static inline struct net_device *first_
        return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
  }
  
- extern int                    netdev_boot_setup_check(struct net_device *dev);
- extern unsigned long          netdev_boot_base(const char *prefix, int unit);
- extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
-                                             const char *hwaddr);
- extern struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
- extern struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type);
- extern void           dev_add_pack(struct packet_type *pt);
- extern void           dev_remove_pack(struct packet_type *pt);
- extern void           __dev_remove_pack(struct packet_type *pt);
- extern void           dev_add_offload(struct packet_offload *po);
- extern void           dev_remove_offload(struct packet_offload *po);
- extern void           __dev_remove_offload(struct packet_offload *po);
- extern struct net_device      *dev_get_by_flags_rcu(struct net *net, unsigned short flags,
-                                                     unsigned short mask);
- extern struct net_device      *dev_get_by_name(struct net *net, const char *name);
- extern struct net_device      *dev_get_by_name_rcu(struct net *net, const char *name);
- extern struct net_device      *__dev_get_by_name(struct net *net, const char *name);
- extern int            dev_alloc_name(struct net_device *dev, const char *name);
- extern int            dev_open(struct net_device *dev);
- extern int            dev_close(struct net_device *dev);
- extern void           dev_disable_lro(struct net_device *dev);
- extern int            dev_loopback_xmit(struct sk_buff *newskb);
- extern int            dev_queue_xmit(struct sk_buff *skb);
- extern int            register_netdevice(struct net_device *dev);
- extern void           unregister_netdevice_queue(struct net_device *dev,
-                                                  struct list_head *head);
- extern void           unregister_netdevice_many(struct list_head *head);
+ int netdev_boot_setup_check(struct net_device *dev);
+ unsigned long netdev_boot_base(const char *prefix, int unit);
+ struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
+                                      const char *hwaddr);
+ struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
+ struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type);
+ void dev_add_pack(struct packet_type *pt);
+ void dev_remove_pack(struct packet_type *pt);
+ void __dev_remove_pack(struct packet_type *pt);
+ void dev_add_offload(struct packet_offload *po);
+ void dev_remove_offload(struct packet_offload *po);
+ void __dev_remove_offload(struct packet_offload *po);
+ struct net_device *dev_get_by_flags_rcu(struct net *net, unsigned short flags,
+                                       unsigned short mask);
+ struct net_device *dev_get_by_name(struct net *net, const char *name);
+ struct net_device *dev_get_by_name_rcu(struct net *net, const char *name);
+ struct net_device *__dev_get_by_name(struct net *net, const char *name);
+ int dev_alloc_name(struct net_device *dev, const char *name);
+ int dev_open(struct net_device *dev);
+ int dev_close(struct net_device *dev);
+ void dev_disable_lro(struct net_device *dev);
+ int dev_loopback_xmit(struct sk_buff *newskb);
+ int dev_queue_xmit(struct sk_buff *skb);
+ int register_netdevice(struct net_device *dev);
+ void unregister_netdevice_queue(struct net_device *dev, struct list_head *head);
+ void unregister_netdevice_many(struct list_head *head);
  static inline void unregister_netdevice(struct net_device *dev)
  {
        unregister_netdevice_queue(dev, NULL);
  }
  
- extern int            netdev_refcnt_read(const struct net_device *dev);
- extern void           free_netdev(struct net_device *dev);
- extern void           synchronize_net(void);
- extern int            init_dummy_netdev(struct net_device *dev);
+ int netdev_refcnt_read(const struct net_device *dev);
+ void free_netdev(struct net_device *dev);
+ void netdev_freemem(struct net_device *dev);
+ void synchronize_net(void);
+ int init_dummy_netdev(struct net_device *dev);
  
extern struct net_device      *dev_get_by_index(struct net *net, int ifindex);
extern struct net_device      *__dev_get_by_index(struct net *net, int ifindex);
extern struct net_device      *dev_get_by_index_rcu(struct net *net, int ifindex);
extern int            netdev_get_name(struct net *net, char *name, int ifindex);
extern int            dev_restart(struct net_device *dev);
struct net_device *dev_get_by_index(struct net *net, int ifindex);
struct net_device *__dev_get_by_index(struct net *net, int ifindex);
struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
int netdev_get_name(struct net *net, char *name, int ifindex);
int dev_restart(struct net_device *dev);
  #ifdef CONFIG_NETPOLL_TRAP
extern int            netpoll_trap(void);
int netpoll_trap(void);
  #endif
- extern int           skb_gro_receive(struct sk_buff **head,
-                                      struct sk_buff *skb);
+ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb);
  
  static inline unsigned int skb_gro_offset(const struct sk_buff *skb)
  {
@@@ -1873,7 -1913,7 +1913,7 @@@ static inline int dev_parse_header(cons
  }
  
  typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
extern int            register_gifconf(unsigned int family, gifconf_func_t * gifconf);
int register_gifconf(unsigned int family, gifconf_func_t *gifconf);
  static inline int unregister_gifconf(unsigned int family)
  {
        return register_gifconf(family, NULL);
@@@ -1944,7 -1984,7 +1984,7 @@@ static inline void input_queue_tail_inc
  
  DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);
  
extern void __netif_schedule(struct Qdisc *q);
+ void __netif_schedule(struct Qdisc *q);
  
  static inline void netif_schedule_queue(struct netdev_queue *txq)
  {
@@@ -2264,9 -2304,8 +2304,8 @@@ static inline void netif_wake_subqueue(
  }
  
  #ifdef CONFIG_XPS
- extern int netif_set_xps_queue(struct net_device *dev,
-                              const struct cpumask *mask,
-                              u16 index);
+ int netif_set_xps_queue(struct net_device *dev, const struct cpumask *mask,
+                       u16 index);
  #else
  static inline int netif_set_xps_queue(struct net_device *dev,
                                      const struct cpumask *mask,
@@@ -2297,12 -2336,10 +2336,10 @@@ static inline bool netif_is_multiqueue(
        return dev->num_tx_queues > 1;
  }
  
- extern int netif_set_real_num_tx_queues(struct net_device *dev,
-                                       unsigned int txq);
+ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq);
  
  #ifdef CONFIG_RPS
- extern int netif_set_real_num_rx_queues(struct net_device *dev,
-                                       unsigned int rxq);
+ int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq);
  #else
  static inline int netif_set_real_num_rx_queues(struct net_device *dev,
                                                unsigned int rxq)
@@@ -2329,28 -2366,27 +2366,27 @@@ static inline int netif_copy_real_num_q
  }
  
  #define DEFAULT_MAX_NUM_RSS_QUEUES    (8)
extern int netif_get_num_default_rss_queues(void);
+ int netif_get_num_default_rss_queues(void);
  
  /* Use this variant when it is known for sure that it
   * is executing from hardware interrupt context or with hardware interrupts
   * disabled.
   */
extern void dev_kfree_skb_irq(struct sk_buff *skb);
+ void dev_kfree_skb_irq(struct sk_buff *skb);
  
  /* Use this variant in places where it could be invoked
   * from either hardware interrupt or other context, with hardware interrupts
   * either disabled or enabled.
   */
extern void dev_kfree_skb_any(struct sk_buff *skb);
+ void dev_kfree_skb_any(struct sk_buff *skb);
  
- extern int            netif_rx(struct sk_buff *skb);
- extern int            netif_rx_ni(struct sk_buff *skb);
- extern int            netif_receive_skb(struct sk_buff *skb);
- extern gro_result_t   napi_gro_receive(struct napi_struct *napi,
-                                        struct sk_buff *skb);
- extern void           napi_gro_flush(struct napi_struct *napi, bool flush_old);
- extern struct sk_buff *       napi_get_frags(struct napi_struct *napi);
- extern gro_result_t   napi_gro_frags(struct napi_struct *napi);
+ int netif_rx(struct sk_buff *skb);
+ int netif_rx_ni(struct sk_buff *skb);
+ int netif_receive_skb(struct sk_buff *skb);
+ gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb);
+ void napi_gro_flush(struct napi_struct *napi, bool flush_old);
+ struct sk_buff *napi_get_frags(struct napi_struct *napi);
+ gro_result_t napi_gro_frags(struct napi_struct *napi);
  
  static inline void napi_free_frags(struct napi_struct *napi)
  {
        napi->skb = NULL;
  }
  
- extern int netdev_rx_handler_register(struct net_device *dev,
-                                     rx_handler_func_t *rx_handler,
-                                     void *rx_handler_data);
- extern void netdev_rx_handler_unregister(struct net_device *dev);
- extern bool           dev_valid_name(const char *name);
- extern int            dev_ioctl(struct net *net, unsigned int cmd, void __user *);
- extern int            dev_ethtool(struct net *net, struct ifreq *);
- extern unsigned int   dev_get_flags(const struct net_device *);
- extern int            __dev_change_flags(struct net_device *, unsigned int flags);
- extern int            dev_change_flags(struct net_device *, unsigned int);
- extern void           __dev_notify_flags(struct net_device *, unsigned int old_flags);
- extern int            dev_change_name(struct net_device *, const char *);
- extern int            dev_set_alias(struct net_device *, const char *, size_t);
- extern int            dev_change_net_namespace(struct net_device *,
-                                                struct net *, const char *);
- extern int            dev_set_mtu(struct net_device *, int);
- extern void           dev_set_group(struct net_device *, int);
- extern int            dev_set_mac_address(struct net_device *,
-                                           struct sockaddr *);
- extern int            dev_change_carrier(struct net_device *,
-                                          bool new_carrier);
- extern int            dev_get_phys_port_id(struct net_device *dev,
-                                            struct netdev_phys_port_id *ppid);
- extern int            dev_hard_start_xmit(struct sk_buff *skb,
-                                           struct net_device *dev,
-                                           struct netdev_queue *txq);
- extern int            dev_forward_skb(struct net_device *dev,
-                                       struct sk_buff *skb);
+ int netdev_rx_handler_register(struct net_device *dev,
+                              rx_handler_func_t *rx_handler,
+                              void *rx_handler_data);
+ void netdev_rx_handler_unregister(struct net_device *dev);
+ bool dev_valid_name(const char *name);
+ int dev_ioctl(struct net *net, unsigned int cmd, void __user *);
+ int dev_ethtool(struct net *net, struct ifreq *);
+ unsigned int dev_get_flags(const struct net_device *);
+ int __dev_change_flags(struct net_device *, unsigned int flags);
+ int dev_change_flags(struct net_device *, unsigned int);
+ void __dev_notify_flags(struct net_device *, unsigned int old_flags,
+                       unsigned int gchanges);
+ int dev_change_name(struct net_device *, const char *);
+ int dev_set_alias(struct net_device *, const char *, size_t);
+ int dev_change_net_namespace(struct net_device *, struct net *, const char *);
+ int dev_set_mtu(struct net_device *, int);
+ void dev_set_group(struct net_device *, int);
+ int dev_set_mac_address(struct net_device *, struct sockaddr *);
+ int dev_change_carrier(struct net_device *, bool new_carrier);
+ int dev_get_phys_port_id(struct net_device *dev,
+                        struct netdev_phys_port_id *ppid);
+ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
+                       struct netdev_queue *txq, void *accel_priv);
+ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
  
  extern int            netdev_budget;
  
  /* Called by rtnetlink.c:rtnl_unlock() */
extern void netdev_run_todo(void);
+ void netdev_run_todo(void);
  
  /**
   *    dev_put - release reference to device
@@@ -2424,9 -2456,9 +2456,9 @@@ static inline void dev_hold(struct net_
   * kind of lower layer not just hardware media.
   */
  
extern void linkwatch_init_dev(struct net_device *dev);
extern void linkwatch_fire_event(struct net_device *dev);
extern void linkwatch_forget_dev(struct net_device *dev);
+ void linkwatch_init_dev(struct net_device *dev);
+ void linkwatch_fire_event(struct net_device *dev);
+ void linkwatch_forget_dev(struct net_device *dev);
  
  /**
   *    netif_carrier_ok - test if carrier present
@@@ -2439,13 -2471,13 +2471,13 @@@ static inline bool netif_carrier_ok(con
        return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
  }
  
extern unsigned long dev_trans_start(struct net_device *dev);
+ unsigned long dev_trans_start(struct net_device *dev);
  
extern void __netdev_watchdog_up(struct net_device *dev);
+ void __netdev_watchdog_up(struct net_device *dev);
  
extern void netif_carrier_on(struct net_device *dev);
+ void netif_carrier_on(struct net_device *dev);
  
extern void netif_carrier_off(struct net_device *dev);
+ void netif_carrier_off(struct net_device *dev);
  
  /**
   *    netif_dormant_on - mark device as dormant.
@@@ -2513,9 -2545,9 +2545,9 @@@ static inline bool netif_device_present
        return test_bit(__LINK_STATE_PRESENT, &dev->state);
  }
  
extern void netif_device_detach(struct net_device *dev);
+ void netif_device_detach(struct net_device *dev);
  
extern void netif_device_attach(struct net_device *dev);
+ void netif_device_attach(struct net_device *dev);
  
  /*
   * Network interface message level settings
@@@ -2724,119 -2756,138 +2756,138 @@@ static inline void netif_addr_unlock_bh
  
  /* These functions live elsewhere (drivers/net/net_init.c, but related) */
  
extern void           ether_setup(struct net_device *dev);
void ether_setup(struct net_device *dev);
  
  /* Support for loadable net-drivers */
extern struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
-                                      void (*setup)(struct net_device *),
-                                      unsigned int txqs, unsigned int rxqs);
+ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
+                                   void (*setup)(struct net_device *),
+                                   unsigned int txqs, unsigned int rxqs);
  #define alloc_netdev(sizeof_priv, name, setup) \
        alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1)
  
  #define alloc_netdev_mq(sizeof_priv, name, setup, count) \
        alloc_netdev_mqs(sizeof_priv, name, setup, count, count)
  
extern int            register_netdev(struct net_device *dev);
extern void           unregister_netdev(struct net_device *dev);
int register_netdev(struct net_device *dev);
void unregister_netdev(struct net_device *dev);
  
  /* General hardware address lists handling functions */
- extern int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list,
-                                 struct netdev_hw_addr_list *from_list,
-                                 int addr_len, unsigned char addr_type);
- extern void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,
-                                  struct netdev_hw_addr_list *from_list,
-                                  int addr_len, unsigned char addr_type);
- extern int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
-                         struct netdev_hw_addr_list *from_list,
-                         int addr_len);
- extern void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
-                            struct netdev_hw_addr_list *from_list,
-                            int addr_len);
- extern void __hw_addr_flush(struct netdev_hw_addr_list *list);
- extern void __hw_addr_init(struct netdev_hw_addr_list *list);
+ int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list,
+                          struct netdev_hw_addr_list *from_list,
+                          int addr_len, unsigned char addr_type);
+ void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,
+                           struct netdev_hw_addr_list *from_list,
+                           int addr_len, unsigned char addr_type);
+ int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
+                  struct netdev_hw_addr_list *from_list, int addr_len);
+ void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
+                     struct netdev_hw_addr_list *from_list, int addr_len);
+ void __hw_addr_flush(struct netdev_hw_addr_list *list);
+ void __hw_addr_init(struct netdev_hw_addr_list *list);
  
  /* Functions used for device addresses handling */
- extern int dev_addr_add(struct net_device *dev, const unsigned char *addr,
-                       unsigned char addr_type);
- extern int dev_addr_del(struct net_device *dev, const unsigned char *addr,
-                       unsigned char addr_type);
- extern int dev_addr_add_multiple(struct net_device *to_dev,
-                                struct net_device *from_dev,
-                                unsigned char addr_type);
- extern int dev_addr_del_multiple(struct net_device *to_dev,
-                                struct net_device *from_dev,
-                                unsigned char addr_type);
- extern void dev_addr_flush(struct net_device *dev);
- extern int dev_addr_init(struct net_device *dev);
+ int dev_addr_add(struct net_device *dev, const unsigned char *addr,
+                unsigned char addr_type);
+ int dev_addr_del(struct net_device *dev, const unsigned char *addr,
+                unsigned char addr_type);
+ int dev_addr_add_multiple(struct net_device *to_dev,
+                         struct net_device *from_dev, unsigned char addr_type);
+ int dev_addr_del_multiple(struct net_device *to_dev,
+                         struct net_device *from_dev, unsigned char addr_type);
+ void dev_addr_flush(struct net_device *dev);
+ int dev_addr_init(struct net_device *dev);
  
  /* Functions used for unicast addresses handling */
extern int dev_uc_add(struct net_device *dev, const unsigned char *addr);
extern int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr);
extern int dev_uc_del(struct net_device *dev, const unsigned char *addr);
extern int dev_uc_sync(struct net_device *to, struct net_device *from);
extern int dev_uc_sync_multiple(struct net_device *to, struct net_device *from);
extern void dev_uc_unsync(struct net_device *to, struct net_device *from);
extern void dev_uc_flush(struct net_device *dev);
extern void dev_uc_init(struct net_device *dev);
+ int dev_uc_add(struct net_device *dev, const unsigned char *addr);
+ int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr);
+ int dev_uc_del(struct net_device *dev, const unsigned char *addr);
+ int dev_uc_sync(struct net_device *to, struct net_device *from);
+ int dev_uc_sync_multiple(struct net_device *to, struct net_device *from);
+ void dev_uc_unsync(struct net_device *to, struct net_device *from);
+ void dev_uc_flush(struct net_device *dev);
+ void dev_uc_init(struct net_device *dev);
  
  /* Functions used for multicast addresses handling */
extern int dev_mc_add(struct net_device *dev, const unsigned char *addr);
extern int dev_mc_add_global(struct net_device *dev, const unsigned char *addr);
extern int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr);
extern int dev_mc_del(struct net_device *dev, const unsigned char *addr);
extern int dev_mc_del_global(struct net_device *dev, const unsigned char *addr);
extern int dev_mc_sync(struct net_device *to, struct net_device *from);
extern int dev_mc_sync_multiple(struct net_device *to, struct net_device *from);
extern void dev_mc_unsync(struct net_device *to, struct net_device *from);
extern void dev_mc_flush(struct net_device *dev);
extern void dev_mc_init(struct net_device *dev);
+ int dev_mc_add(struct net_device *dev, const unsigned char *addr);
+ int dev_mc_add_global(struct net_device *dev, const unsigned char *addr);
+ int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr);
+ int dev_mc_del(struct net_device *dev, const unsigned char *addr);
+ int dev_mc_del_global(struct net_device *dev, const unsigned char *addr);
+ int dev_mc_sync(struct net_device *to, struct net_device *from);
+ int dev_mc_sync_multiple(struct net_device *to, struct net_device *from);
+ void dev_mc_unsync(struct net_device *to, struct net_device *from);
+ void dev_mc_flush(struct net_device *dev);
+ void dev_mc_init(struct net_device *dev);
  
  /* Functions used for secondary unicast and multicast support */
extern void           dev_set_rx_mode(struct net_device *dev);
extern void           __dev_set_rx_mode(struct net_device *dev);
extern int            dev_set_promiscuity(struct net_device *dev, int inc);
extern int            dev_set_allmulti(struct net_device *dev, int inc);
extern void           netdev_state_change(struct net_device *dev);
extern void           netdev_notify_peers(struct net_device *dev);
extern void           netdev_features_change(struct net_device *dev);
void dev_set_rx_mode(struct net_device *dev);
void __dev_set_rx_mode(struct net_device *dev);
int dev_set_promiscuity(struct net_device *dev, int inc);
int dev_set_allmulti(struct net_device *dev, int inc);
void netdev_state_change(struct net_device *dev);
void netdev_notify_peers(struct net_device *dev);
void netdev_features_change(struct net_device *dev);
  /* Load a device via the kmod */
extern void           dev_load(struct net *net, const char *name);
extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
-                                              struct rtnl_link_stats64 *storage);
extern void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
-                                   const struct net_device_stats *netdev_stats);
void dev_load(struct net *net, const char *name);
+ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
+                                       struct rtnl_link_stats64 *storage);
+ void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
+                            const struct net_device_stats *netdev_stats);
  
  extern int            netdev_max_backlog;
  extern int            netdev_tstamp_prequeue;
  extern int            weight_p;
  extern int            bpf_jit_enable;
  
- extern bool netdev_has_upper_dev(struct net_device *dev,
-                                struct net_device *upper_dev);
- extern bool netdev_has_any_upper_dev(struct net_device *dev);
- extern struct net_device *netdev_upper_get_next_dev_rcu(struct net_device *dev,
-                                                       struct list_head **iter);
+ bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev);
+ bool netdev_has_any_upper_dev(struct net_device *dev);
+ struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
+                                                    struct list_head **iter);
  
  /* iterate through upper list, must be called under RCU read lock */
- #define netdev_for_each_upper_dev_rcu(dev, upper, iter) \
-       for (iter = &(dev)->upper_dev_list, \
-            upper = netdev_upper_get_next_dev_rcu(dev, &(iter)); \
-            upper; \
-            upper = netdev_upper_get_next_dev_rcu(dev, &(iter)))
- extern struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
- extern struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
- extern int netdev_upper_dev_link(struct net_device *dev,
+ #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \
+       for (iter = &(dev)->all_adj_list.upper, \
+            updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \
+            updev; \
+            updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)))
+ void *netdev_lower_get_next_private(struct net_device *dev,
+                                   struct list_head **iter);
+ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
+                                       struct list_head **iter);
+ #define netdev_for_each_lower_private(dev, priv, iter) \
+       for (iter = (dev)->adj_list.lower.next, \
+            priv = netdev_lower_get_next_private(dev, &(iter)); \
+            priv; \
+            priv = netdev_lower_get_next_private(dev, &(iter)))
+ #define netdev_for_each_lower_private_rcu(dev, priv, iter) \
+       for (iter = &(dev)->adj_list.lower, \
+            priv = netdev_lower_get_next_private_rcu(dev, &(iter)); \
+            priv; \
+            priv = netdev_lower_get_next_private_rcu(dev, &(iter)))
+ void *netdev_adjacent_get_private(struct list_head *adj_list);
+ struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
+ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
+ int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
+ int netdev_master_upper_dev_link(struct net_device *dev,
                                 struct net_device *upper_dev);
- extern int netdev_master_upper_dev_link(struct net_device *dev,
-                                       struct net_device *upper_dev);
- extern void netdev_upper_dev_unlink(struct net_device *dev,
-                                   struct net_device *upper_dev);
- extern int skb_checksum_help(struct sk_buff *skb);
- extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
-       netdev_features_t features, bool tx_path);
- extern struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
-                                         netdev_features_t features);
+ int netdev_master_upper_dev_link_private(struct net_device *dev,
+                                        struct net_device *upper_dev,
+                                        void *private);
+ void netdev_upper_dev_unlink(struct net_device *dev,
+                            struct net_device *upper_dev);
+ void *netdev_lower_dev_get_private_rcu(struct net_device *dev,
+                                      struct net_device *lower_dev);
+ void *netdev_lower_dev_get_private(struct net_device *dev,
+                                  struct net_device *lower_dev);
+ int skb_checksum_help(struct sk_buff *skb);
+ struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
+                                 netdev_features_t features, bool tx_path);
+ struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
+                                   netdev_features_t features);
  
  static inline
  struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)
@@@ -2858,42 -2909,30 +2909,42 @@@ static inline bool can_checksum_protoco
  }
  
  #ifdef CONFIG_BUG
extern void netdev_rx_csum_fault(struct net_device *dev);
+ void netdev_rx_csum_fault(struct net_device *dev);
  #else
  static inline void netdev_rx_csum_fault(struct net_device *dev)
  {
  }
  #endif
  /* rx skb timestamps */
extern void           net_enable_timestamp(void);
extern void           net_disable_timestamp(void);
void net_enable_timestamp(void);
void net_disable_timestamp(void);
  
  #ifdef CONFIG_PROC_FS
extern int __init dev_proc_init(void);
+ int __init dev_proc_init(void);
  #else
  #define dev_proc_init() 0
  #endif
  
- extern int netdev_class_create_file_ns(struct class_attribute *class_attr,
-                                      const void *ns);
- extern void netdev_class_remove_file_ns(struct class_attribute *class_attr,
-                                       const void *ns);
 -int netdev_class_create_file(struct class_attribute *class_attr);
 -void netdev_class_remove_file(struct class_attribute *class_attr);
++int netdev_class_create_file_ns(struct class_attribute *class_attr,
++                              const void *ns);
++void netdev_class_remove_file_ns(struct class_attribute *class_attr,
++                               const void *ns);
 +
 +static inline int netdev_class_create_file(struct class_attribute *class_attr)
 +{
 +      return netdev_class_create_file_ns(class_attr, NULL);
 +}
 +
 +static inline void netdev_class_remove_file(struct class_attribute *class_attr)
 +{
 +      netdev_class_remove_file_ns(class_attr, NULL);
 +}
  
  extern struct kobj_ns_type_operations net_ns_type_operations;
  
extern const char *netdev_drivername(const struct net_device *dev);
+ const char *netdev_drivername(const struct net_device *dev);
  
extern void linkwatch_run_queue(void);
+ void linkwatch_run_queue(void);
  
  static inline netdev_features_t netdev_get_wanted_features(
        struct net_device *dev)
@@@ -2957,6 -2996,11 +3008,11 @@@ static inline void netif_set_gso_max_si
        dev->gso_max_size = size;
  }
  
+ static inline bool netif_is_macvlan(struct net_device *dev)
+ {
+       return dev->priv_flags & IFF_MACVLAN;
+ }
  static inline bool netif_is_bond_master(struct net_device *dev)
  {
        return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING;
@@@ -2985,22 -3029,22 +3041,22 @@@ static inline const char *netdev_name(c
        return dev->name;
  }
  
extern __printf(3, 4)
+ __printf(3, 4)
  int netdev_printk(const char *level, const struct net_device *dev,
                  const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_emerg(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_alert(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_crit(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_err(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_warn(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_notice(const struct net_device *dev, const char *format, ...);
extern __printf(2, 3)
+ __printf(2, 3)
  int netdev_info(const struct net_device *dev, const char *format, ...);
  
  #define MODULE_ALIAS_NETDEV(device) \
@@@ -3041,7 -3085,7 +3097,7 @@@ do {                                                            
   * file/line information and a backtrace.
   */
  #define netdev_WARN(dev, format, args...)                     \
-       WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args);
+       WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args)
  
  /* netif printk helpers, similar to netdev_printk */
  
diff --combined init/main.c
@@@ -124,6 -124,7 +124,6 @@@ EXPORT_SYMBOL(system_state)
  extern void time_init(void);
  /* Default late time init is NULL. archs can override this later. */
  void (*__initdata late_time_init)(void);
 -extern void softirq_init(void);
  
  /* Untouched command line saved by arch-specific code. */
  char __initdata boot_command_line[COMMAND_LINE_SIZE];
@@@ -135,6 -136,13 +135,13 @@@ static char *static_command_line
  static char *execute_command;
  static char *ramdisk_execute_command;
  
+ /*
+  * Used to generate warnings if static_key manipulation functions are used
+  * before jump_label_init is called.
+  */
+ bool static_key_initialized __read_mostly = false;
+ EXPORT_SYMBOL_GPL(static_key_initialized);
  /*
   * If set, this is an indication to the drivers that reset the underlying
   * device before going ahead with the initialization otherwise driver might
@@@ -692,7 -700,7 +699,7 @@@ int __init_or_module do_one_initcall(in
  
        if (preempt_count() != count) {
                sprintf(msgbuf, "preemption imbalance ");
 -              preempt_count() = count;
 +              preempt_count_set(count);
        }
        if (irqs_disabled()) {
                strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
@@@ -810,26 -818,10 +817,26 @@@ static int run_init_process(const char 
                (const char __user *const __user *)envp_init);
  }
  
 +static int try_to_run_init_process(const char *init_filename)
 +{
 +      int ret;
 +
 +      ret = run_init_process(init_filename);
 +
 +      if (ret && ret != -ENOENT) {
 +              pr_err("Starting init: %s exists but couldn't execute it (error %d)\n",
 +                     init_filename, ret);
 +      }
 +
 +      return ret;
 +}
 +
  static noinline void __init kernel_init_freeable(void);
  
  static int __ref kernel_init(void *unused)
  {
 +      int ret;
 +
        kernel_init_freeable();
        /* need to finish all async __init code before freeing the memory */
        async_synchronize_full();
        flush_delayed_fput();
  
        if (ramdisk_execute_command) {
 -              if (!run_init_process(ramdisk_execute_command))
 +              ret = run_init_process(ramdisk_execute_command);
 +              if (!ret)
                        return 0;
 -              pr_err("Failed to execute %s\n", ramdisk_execute_command);
 +              pr_err("Failed to execute %s (error %d)\n",
 +                     ramdisk_execute_command, ret);
        }
  
        /*
         * trying to recover a really broken machine.
         */
        if (execute_command) {
 -              if (!run_init_process(execute_command))
 +              ret = run_init_process(execute_command);
 +              if (!ret)
                        return 0;
 -              pr_err("Failed to execute %s.  Attempting defaults...\n",
 -                      execute_command);
 +              pr_err("Failed to execute %s (error %d).  Attempting defaults...\n",
 +                      execute_command, ret);
        }
 -      if (!run_init_process("/sbin/init") ||
 -          !run_init_process("/etc/init") ||
 -          !run_init_process("/bin/init") ||
 -          !run_init_process("/bin/sh"))
 +      if (!try_to_run_init_process("/sbin/init") ||
 +          !try_to_run_init_process("/etc/init") ||
 +          !try_to_run_init_process("/bin/init") ||
 +          !try_to_run_init_process("/bin/sh"))
                return 0;
  
 -      panic("No init found.  Try passing init= option to kernel. "
 +      panic("No working init found.  Try passing init= option to kernel. "
              "See Linux Documentation/init.txt for guidance.");
  }
  
diff --combined mm/memcontrol.c
@@@ -59,7 -59,6 +59,7 @@@
  #include <net/sock.h>
  #include <net/ip.h>
  #include <net/tcp_memcontrol.h>
 +#include "slab.h"
  
  #include <asm/uaccess.h>
  
@@@ -313,7 -312,7 +313,7 @@@ struct mem_cgroup 
  
        atomic_t        dead_count;
  #if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_INET)
-       struct tcp_memcontrol tcp_mem;
+       struct cg_proto tcp_mem;
  #endif
  #if defined(CONFIG_MEMCG_KMEM)
        /* analogous to slab_common's slab_caches list. per-memcg */
@@@ -500,29 -499,6 +500,29 @@@ static inline bool mem_cgroup_is_root(s
        return (memcg == root_mem_cgroup);
  }
  
 +/*
 + * We restrict the id in the range of [1, 65535], so it can fit into
 + * an unsigned short.
 + */
 +#define MEM_CGROUP_ID_MAX     USHRT_MAX
 +
 +static inline unsigned short mem_cgroup_id(struct mem_cgroup *memcg)
 +{
 +      /*
 +       * The ID of the root cgroup is 0, but memcg treat 0 as an
 +       * invalid ID, so we return (cgroup_id + 1).
 +       */
 +      return memcg->css.cgroup->id + 1;
 +}
 +
 +static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
 +{
 +      struct cgroup_subsys_state *css;
 +
 +      css = css_from_id(id - 1, &mem_cgroup_subsys);
 +      return mem_cgroup_from_css(css);
 +}
 +
  /* Writing them here to avoid exposing memcg's inner layout */
  #if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM)
  
@@@ -575,13 -551,13 +575,13 @@@ struct cg_proto *tcp_proto_cgroup(struc
        if (!memcg || mem_cgroup_is_root(memcg))
                return NULL;
  
-       return &memcg->tcp_mem.cg_proto;
+       return &memcg->tcp_mem;
  }
  EXPORT_SYMBOL(tcp_proto_cgroup);
  
  static void disarm_sock_keys(struct mem_cgroup *memcg)
  {
-       if (!memcg_proto_activated(&memcg->tcp_mem.cg_proto))
+       if (!memcg_proto_activated(&memcg->tcp_mem))
                return;
        static_key_slow_dec(&memcg_socket_limit_enabled);
  }
@@@ -594,11 -570,16 +594,11 @@@ static void disarm_sock_keys(struct mem
  #ifdef CONFIG_MEMCG_KMEM
  /*
   * This will be the memcg's index in each cache's ->memcg_params->memcg_caches.
 - * There are two main reasons for not using the css_id for this:
 - *  1) this works better in sparse environments, where we have a lot of memcgs,
 - *     but only a few kmem-limited. Or also, if we have, for instance, 200
 - *     memcgs, and none but the 200th is kmem-limited, we'd have to have a
 - *     200 entry array for that.
 - *
 - *  2) In order not to violate the cgroup API, we would like to do all memory
 - *     allocation in ->create(). At that point, we haven't yet allocated the
 - *     css_id. Having a separate index prevents us from messing with the cgroup
 - *     core for this
 + * The main reason for not using cgroup id for this:
 + *  this works better in sparse environments, where we have a lot of memcgs,
 + *  but only a few kmem-limited. Or also, if we have, for instance, 200
 + *  memcgs, and none but the 200th is kmem-limited, we'd have to have a
 + *  200 entry array for that.
   *
   * The current size of the caches array is stored in
   * memcg_limited_groups_array_size.  It will double each time we have to
@@@ -613,14 -594,14 +613,14 @@@ int memcg_limited_groups_array_size
   * cgroups is a reasonable guess. In the future, it could be a parameter or
   * tunable, but that is strictly not necessary.
   *
 - * MAX_SIZE should be as large as the number of css_ids. Ideally, we could get
 + * MAX_SIZE should be as large as the number of cgrp_ids. Ideally, we could get
   * this constant directly from cgroup, but it is understandable that this is
   * better kept as an internal representation in cgroup.c. In any case, the
 - * css_id space is not getting any smaller, and we don't have to necessarily
 + * cgrp_id space is not getting any smaller, and we don't have to necessarily
   * increase ours as well if it increases.
   */
  #define MEMCG_CACHES_MIN_SIZE 4
 -#define MEMCG_CACHES_MAX_SIZE 65535
 +#define MEMCG_CACHES_MAX_SIZE MEM_CGROUP_ID_MAX
  
  /*
   * A lot of the calls to the cache allocation functions are expected to be
@@@ -1427,7 -1408,7 +1427,7 @@@ bool __mem_cgroup_same_or_subtree(cons
                return true;
        if (!root_memcg->use_hierarchy || !memcg)
                return false;
 -      return css_is_ancestor(&memcg->css, &root_memcg->css);
 +      return cgroup_is_descendant(memcg->css.cgroup, root_memcg->css.cgroup);
  }
  
  static bool mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg,
@@@ -2845,10 -2826,15 +2845,10 @@@ static void __mem_cgroup_cancel_local_c
   */
  static struct mem_cgroup *mem_cgroup_lookup(unsigned short id)
  {
 -      struct cgroup_subsys_state *css;
 -
        /* ID 0 is unused ID */
        if (!id)
                return NULL;
 -      css = css_lookup(&mem_cgroup_subsys, id);
 -      if (!css)
 -              return NULL;
 -      return mem_cgroup_from_css(css);
 +      return mem_cgroup_from_id(id);
  }
  
  struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
@@@ -2969,7 -2955,7 +2969,7 @@@ static struct kmem_cache *memcg_params_
  
        VM_BUG_ON(p->is_root_cache);
        cachep = p->root_cache;
 -      return cachep->memcg_params->memcg_caches[memcg_cache_id(p->memcg)];
 +      return cache_from_memcg_idx(cachep, memcg_cache_id(p->memcg));
  }
  
  #ifdef CONFIG_SLABINFO
@@@ -2998,14 -2984,21 +2998,14 @@@ static int memcg_charge_kmem(struct mem
        struct res_counter *fail_res;
        struct mem_cgroup *_memcg;
        int ret = 0;
 -      bool may_oom;
  
        ret = res_counter_charge(&memcg->kmem, size, &fail_res);
        if (ret)
                return ret;
  
 -      /*
 -       * Conditions under which we can wait for the oom_killer. Those are
 -       * the same conditions tested by the core page allocator
 -       */
 -      may_oom = (gfp & __GFP_FS) && !(gfp & __GFP_NORETRY);
 -
        _memcg = memcg;
        ret = __mem_cgroup_try_charge(NULL, gfp, size >> PAGE_SHIFT,
 -                                    &_memcg, may_oom);
 +                                    &_memcg, oom_gfp_allowed(gfp));
  
        if (ret == -EINTR)  {
                /*
@@@ -3145,7 -3138,7 +3145,7 @@@ int memcg_update_cache_size(struct kmem
  {
        struct memcg_cache_params *cur_params = s->memcg_params;
  
 -      VM_BUG_ON(s->memcg_params && !s->memcg_params->is_root_cache);
 +      VM_BUG_ON(!is_root_cache(s));
  
        if (num_groups > memcg_limited_groups_array_size) {
                int i;
@@@ -3406,7 -3399,7 +3406,7 @@@ static struct kmem_cache *memcg_create_
        idx = memcg_cache_id(memcg);
  
        mutex_lock(&memcg_cache_mutex);
 -      new_cachep = cachep->memcg_params->memcg_caches[idx];
 +      new_cachep = cache_from_memcg_idx(cachep, idx);
        if (new_cachep) {
                css_put(&memcg->css);
                goto out;
@@@ -3452,8 -3445,8 +3452,8 @@@ void kmem_cache_destroy_memcg_children(
         * we'll take the set_limit_mutex to protect ourselves against this.
         */
        mutex_lock(&set_limit_mutex);
 -      for (i = 0; i < memcg_limited_groups_array_size; i++) {
 -              c = s->memcg_params->memcg_caches[i];
 +      for_each_memcg_cache_index(i) {
 +              c = cache_from_memcg_idx(s, i);
                if (!c)
                        continue;
  
@@@ -3586,8 -3579,8 +3586,8 @@@ struct kmem_cache *__memcg_kmem_get_cac
         * code updating memcg_caches will issue a write barrier to match this.
         */
        read_barrier_depends();
 -      if (likely(cachep->memcg_params->memcg_caches[idx])) {
 -              cachep = cachep->memcg_params->memcg_caches[idx];
 +      if (likely(cache_from_memcg_idx(cachep, idx))) {
 +              cachep = cache_from_memcg_idx(cachep, idx);
                goto out;
        }
  
@@@ -4357,7 -4350,7 +4357,7 @@@ mem_cgroup_uncharge_swapcache(struct pa
         * css_get() was called in uncharge().
         */
        if (do_swap_account && swapout && memcg)
 -              swap_cgroup_record(ent, css_id(&memcg->css));
 +              swap_cgroup_record(ent, mem_cgroup_id(memcg));
  }
  #endif
  
@@@ -4409,8 -4402,8 +4409,8 @@@ static int mem_cgroup_move_swap_account
  {
        unsigned short old_id, new_id;
  
 -      old_id = css_id(&from->css);
 -      new_id = css_id(&to->css);
 +      old_id = mem_cgroup_id(from);
 +      new_id = mem_cgroup_id(to);
  
        if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) {
                mem_cgroup_swap_statistics(from, false);
@@@ -5383,50 -5376,45 +5383,50 @@@ static int mem_cgroup_move_charge_write
  static int memcg_numa_stat_show(struct cgroup_subsys_state *css,
                                struct cftype *cft, struct seq_file *m)
  {
 +      struct numa_stat {
 +              const char *name;
 +              unsigned int lru_mask;
 +      };
 +
 +      static const struct numa_stat stats[] = {
 +              { "total", LRU_ALL },
 +              { "file", LRU_ALL_FILE },
 +              { "anon", LRU_ALL_ANON },
 +              { "unevictable", BIT(LRU_UNEVICTABLE) },
 +      };
 +      const struct numa_stat *stat;
        int nid;
 -      unsigned long total_nr, file_nr, anon_nr, unevictable_nr;
 -      unsigned long node_nr;
 +      unsigned long nr;
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
  
 -      total_nr = mem_cgroup_nr_lru_pages(memcg, LRU_ALL);
 -      seq_printf(m, "total=%lu", total_nr);
 -      for_each_node_state(nid, N_MEMORY) {
 -              node_nr = mem_cgroup_node_nr_lru_pages(memcg, nid, LRU_ALL);
 -              seq_printf(m, " N%d=%lu", nid, node_nr);
 -      }
 -      seq_putc(m, '\n');
 -
 -      file_nr = mem_cgroup_nr_lru_pages(memcg, LRU_ALL_FILE);
 -      seq_printf(m, "file=%lu", file_nr);
 -      for_each_node_state(nid, N_MEMORY) {
 -              node_nr = mem_cgroup_node_nr_lru_pages(memcg, nid,
 -                              LRU_ALL_FILE);
 -              seq_printf(m, " N%d=%lu", nid, node_nr);
 +      for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) {
 +              nr = mem_cgroup_nr_lru_pages(memcg, stat->lru_mask);
 +              seq_printf(m, "%s=%lu", stat->name, nr);
 +              for_each_node_state(nid, N_MEMORY) {
 +                      nr = mem_cgroup_node_nr_lru_pages(memcg, nid,
 +                                                        stat->lru_mask);
 +                      seq_printf(m, " N%d=%lu", nid, nr);
 +              }
 +              seq_putc(m, '\n');
        }
 -      seq_putc(m, '\n');
  
 -      anon_nr = mem_cgroup_nr_lru_pages(memcg, LRU_ALL_ANON);
 -      seq_printf(m, "anon=%lu", anon_nr);
 -      for_each_node_state(nid, N_MEMORY) {
 -              node_nr = mem_cgroup_node_nr_lru_pages(memcg, nid,
 -                              LRU_ALL_ANON);
 -              seq_printf(m, " N%d=%lu", nid, node_nr);
 +      for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) {
 +              struct mem_cgroup *iter;
 +
 +              nr = 0;
 +              for_each_mem_cgroup_tree(iter, memcg)
 +                      nr += mem_cgroup_nr_lru_pages(iter, stat->lru_mask);
 +              seq_printf(m, "hierarchical_%s=%lu", stat->name, nr);
 +              for_each_node_state(nid, N_MEMORY) {
 +                      nr = 0;
 +                      for_each_mem_cgroup_tree(iter, memcg)
 +                              nr += mem_cgroup_node_nr_lru_pages(
 +                                      iter, nid, stat->lru_mask);
 +                      seq_printf(m, " N%d=%lu", nid, nr);
 +              }
 +              seq_putc(m, '\n');
        }
 -      seq_putc(m, '\n');
  
 -      unevictable_nr = mem_cgroup_nr_lru_pages(memcg, BIT(LRU_UNEVICTABLE));
 -      seq_printf(m, "unevictable=%lu", unevictable_nr);
 -      for_each_node_state(nid, N_MEMORY) {
 -              node_nr = mem_cgroup_node_nr_lru_pages(memcg, nid,
 -                              BIT(LRU_UNEVICTABLE));
 -              seq_printf(m, " N%d=%lu", nid, node_nr);
 -      }
 -      seq_putc(m, '\n');
        return 0;
  }
  #endif /* CONFIG_NUMA */
@@@ -6178,6 -6166,7 +6178,6 @@@ static void __mem_cgroup_free(struct me
        size_t size = memcg_size();
  
        mem_cgroup_remove_from_trees(memcg);
 -      free_css_id(&mem_cgroup_subsys, &memcg->css);
  
        for_each_node(node)
                free_mem_cgroup_per_zone_info(memcg, node);
@@@ -6280,9 -6269,6 +6280,9 @@@ mem_cgroup_css_online(struct cgroup_sub
        struct mem_cgroup *parent = mem_cgroup_from_css(css_parent(css));
        int error = 0;
  
 +      if (css->cgroup->id > MEM_CGROUP_ID_MAX)
 +              return -ENOSPC;
 +
        if (!parent)
                return 0;
  
@@@ -6554,7 -6540,7 +6554,7 @@@ static enum mc_target_type get_mctgt_ty
        }
        /* There is a swap entry and a page doesn't exist or isn't charged */
        if (ent.val && !ret &&
 -                      css_id(&mc.from->css) == lookup_swap_cgroup_id(ent)) {
 +          mem_cgroup_id(mc.from) == lookup_swap_cgroup_id(ent)) {
                ret = MC_TARGET_SWAP;
                if (target)
                        target->ent = ent;
@@@ -6974,6 -6960,7 +6974,6 @@@ struct cgroup_subsys mem_cgroup_subsys 
        .bind = mem_cgroup_bind,
        .base_cftypes = mem_cgroup_files,
        .early_init = 0,
 -      .use_id = 1,
  };
  
  #ifdef CONFIG_MEMCG_SWAP
diff --combined net/core/net-sysfs.c
@@@ -1263,7 -1263,7 +1263,7 @@@ static void netdev_release(struct devic
        BUG_ON(dev->reg_state != NETREG_RELEASED);
  
        kfree(dev->ifalias);
-       kfree((char *)dev - dev->padded);
+       netdev_freemem(dev);
  }
  
  static const void *net_namespace(struct device *d)
@@@ -1344,19 -1344,17 +1344,19 @@@ int netdev_register_kobject(struct net_
        return error;
  }
  
 -int netdev_class_create_file(struct class_attribute *class_attr)
 +int netdev_class_create_file_ns(struct class_attribute *class_attr,
 +                              const void *ns)
  {
 -      return class_create_file(&net_class, class_attr);
 +      return class_create_file_ns(&net_class, class_attr, ns);
  }
 -EXPORT_SYMBOL(netdev_class_create_file);
 +EXPORT_SYMBOL(netdev_class_create_file_ns);
  
 -void netdev_class_remove_file(struct class_attribute *class_attr)
 +void netdev_class_remove_file_ns(struct class_attribute *class_attr,
 +                               const void *ns)
  {
 -      class_remove_file(&net_class, class_attr);
 +      class_remove_file_ns(&net_class, class_attr, ns);
  }
 -EXPORT_SYMBOL(netdev_class_remove_file);
 +EXPORT_SYMBOL(netdev_class_remove_file_ns);
  
  int netdev_kobject_init(void)
  {