aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
diff options
context:
space:
mode:
authorBiwen Li <biwen.li@nxp.com>2018-11-02 11:21:57 +0800
committerHauke Mehrtens <hauke@hauke-m.de>2018-12-18 20:17:23 +0100
commit0a827ebd2fa3c7dc210aff0a30d0dc1d536ed89c (patch)
treeb80223fffb0814b6db33f48dd3aaa047cd3e0299 /target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
parent7bd6969acce763a7117b33a6647b8c5dbbf2b0aa (diff)
downloadupstream-0a827ebd2fa3c7dc210aff0a30d0dc1d536ed89c.tar.gz
upstream-0a827ebd2fa3c7dc210aff0a30d0dc1d536ed89c.tar.bz2
upstream-0a827ebd2fa3c7dc210aff0a30d0dc1d536ed89c.zip
layerscape: upgrade kernel to 4.14
This patch is to upgrade kernel to 4.14 for layerscape. patches-4.14 for layerscape included two categories. - NXP Layerscape SDK kernel-4.14 patches All patches on tag LSDK-18.09-V4.14 were ported to OpenWrt kernel. Since there were hundreds patches, we had to make an all-in-one patch for each IP/feature. See below links for LSDK kernel. https://lsdk.github.io/components.html https://source.codeaurora.org/external/qoriq/qoriq-components/linux - Non-LSDK kernel patches Other patches which were not in LSDK were just put in patches-4.14. Kept below patches from patches-4.9. 303-dts-layerscape-add-traverse-ls1043.patch 821-add-esdhc-vsel-to-ls1043.patch 822-rgmii-fixed-link.patch Renamed and rebase them as below in patches-4.14, 303-add-DTS-for-Traverse-LS1043-Boards.patch 712-sdk-dpaa-rgmii-fixed-link.patch 824-mmc-sdhci-of-esdhc-add-voltage-switch-support-for-ls.patch Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: Biwen Li <biwen.li@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch')
-rw-r--r--target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch741
1 files changed, 741 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch b/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
new file mode 100644
index 0000000000..ba2480aaa5
--- /dev/null
+++ b/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
@@ -0,0 +1,741 @@
+From 74243154052af635ee9ce9d07aab273ce219c855 Mon Sep 17 00:00:00 2001
+From: Biwen Li <biwen.li@nxp.com>
+Date: Thu, 13 Dec 2018 13:23:52 +0800
+Subject: [PATCH] core-linux: support layerscape
+
+This is an integrated patch of core-linux for layerscape.
+
+Signed-off-by: Abhijit Ayarekar <abhijit.ayarekar@caviumnetworks.com>
+Signed-off-by: Amrita Kumari <amrita.kumari@nxp.com>
+Signed-off-by: Ashish Kumar <Ashish.Kumar@nxp.com>
+Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: David Ahern <dsahern@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Guanhua Gao <guanhua.gao@nxp.com>
+Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+Signed-off-by: Joel Fernandes <joelaf@google.com>
+Signed-off-by: Li Yang <leoyang.li@nxp.com>
+Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
+Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
+Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
+Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
+Signed-off-by: Ramneek Mehresh <ramneek.mehresh@freescale.com>
+Signed-off-by: Robin Murphy <robin.murphy@arm.com>
+Signed-off-by: Suresh Gupta <suresh.gupta@freescale.com>
+Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
+Signed-off-by: yinbo.zhu <yinbo.zhu@nxp.com>
+Signed-off-by: Biwen Li <biwen.li@nxp.com>
+---
+ drivers/base/dma-mapping.c | 7 ++
+ drivers/net/bonding/bond_main.c | 5 +-
+ drivers/net/bonding/bond_options.c | 2 +-
+ drivers/net/team/team.c | 3 +-
+ drivers/net/vrf.c | 3 +-
+ drivers/of/device.c | 13 +++-
+ drivers/soc/fsl/guts.c | 3 +
+ include/linux/fsl_devices.h | 2 +
+ include/linux/netdevice.h | 13 +++-
+ include/linux/skbuff.h | 2 +
+ include/net/bonding.h | 3 +-
+ net/batman-adv/soft-interface.c | 3 +-
+ net/bridge/br_device.c | 3 +-
+ net/core/dev.c | 81 ++++++++++++++---------
+ net/core/rtnetlink.c | 10 +--
+ net/core/skbuff.c | 29 +++++++-
+ samples/bpf/Makefile | 12 +++-
+ samples/bpf/map_perf_test_kern.c | 2 +-
+ samples/bpf/map_perf_test_user.c | 2 +-
+ tools/testing/selftests/bpf/bpf_helpers.h | 56 ++++++++++++++--
+ 20 files changed, 193 insertions(+), 61 deletions(-)
+
+--- a/drivers/base/dma-mapping.c
++++ b/drivers/base/dma-mapping.c
+@@ -335,6 +335,7 @@ void dma_common_free_remap(void *cpu_add
+ * Common configuration to enable DMA API use for a device
+ */
+ #include <linux/pci.h>
++#include <linux/fsl/mc.h>
+
+ int dma_configure(struct device *dev)
+ {
+@@ -350,6 +351,12 @@ int dma_configure(struct device *dev)
+ dma_dev = dma_dev->parent;
+ }
+
++ if (dev_is_fsl_mc(dev)) {
++ dma_dev = dev;
++ while (dev_is_fsl_mc(dma_dev))
++ dma_dev = dma_dev->parent;
++ }
++
+ if (dma_dev->of_node) {
+ ret = of_dma_configure(dev, dma_dev->of_node);
+ } else if (has_acpi_companion(dma_dev)) {
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -1337,7 +1337,8 @@ void bond_lower_state_changed(struct sla
+ }
+
+ /* enslave device <slave> to bond device <master> */
+-int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
++int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
++ struct netlink_ext_ack *extack)
+ {
+ struct bonding *bond = netdev_priv(bond_dev);
+ const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
+@@ -3506,7 +3507,7 @@ static int bond_do_ioctl(struct net_devi
+ switch (cmd) {
+ case BOND_ENSLAVE_OLD:
+ case SIOCBONDENSLAVE:
+- res = bond_enslave(bond_dev, slave_dev);
++ res = bond_enslave(bond_dev, slave_dev, NULL);
+ break;
+ case BOND_RELEASE_OLD:
+ case SIOCBONDRELEASE:
+--- a/drivers/net/bonding/bond_options.c
++++ b/drivers/net/bonding/bond_options.c
+@@ -1389,7 +1389,7 @@ static int bond_option_slaves_set(struct
+ switch (command[0]) {
+ case '+':
+ netdev_dbg(bond->dev, "Adding slave %s\n", dev->name);
+- ret = bond_enslave(bond->dev, dev);
++ ret = bond_enslave(bond->dev, dev, NULL);
+ break;
+
+ case '-':
+--- a/drivers/net/team/team.c
++++ b/drivers/net/team/team.c
+@@ -1934,7 +1934,8 @@ static int team_netpoll_setup(struct net
+ }
+ #endif
+
+-static int team_add_slave(struct net_device *dev, struct net_device *port_dev)
++static int team_add_slave(struct net_device *dev, struct net_device *port_dev,
++ struct netlink_ext_ack *extack)
+ {
+ struct team *team = netdev_priv(dev);
+ int err;
+--- a/drivers/net/vrf.c
++++ b/drivers/net/vrf.c
+@@ -791,7 +791,8 @@ err:
+ return ret;
+ }
+
+-static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
++static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev,
++ struct netlink_ext_ack *extack)
+ {
+ if (netif_is_l3_master(port_dev) || netif_is_l3_slave(port_dev))
+ return -EINVAL;
+--- a/drivers/of/device.c
++++ b/drivers/of/device.c
+@@ -15,6 +15,9 @@
+
+ #include <asm/errno.h>
+ #include "of_private.h"
++#ifdef CONFIG_FSL_MC_BUS
++#include <linux/fsl/mc.h>
++#endif
+
+ /**
+ * of_match_device - Tell if a struct device matches an of_device_id list
+@@ -105,6 +108,9 @@ int of_dma_configure(struct device *dev,
+ #ifdef CONFIG_ARM_AMBA
+ dev->bus != &amba_bustype &&
+ #endif
++#ifdef CONFIG_FSL_MC_BUS
++ dev->bus != &fsl_mc_bus_type &&
++#endif
+ dev->bus != &platform_bus_type)
+ return ret == -ENODEV ? 0 : ret;
+
+@@ -155,7 +161,12 @@ int of_dma_configure(struct device *dev,
+ dev->coherent_dma_mask &= mask;
+ *dev->dma_mask &= mask;
+
+- coherent = of_dma_is_coherent(np);
++#ifdef CONFIG_FSL_MC_BUS
++ if (dev_is_fsl_mc(dev))
++ coherent = fsl_mc_is_dev_coherent(dev);
++ else
++#endif
++ coherent = of_dma_is_coherent(np);
+ dev_dbg(dev, "device is%sdma coherent\n",
+ coherent ? " " : " not ");
+
+--- a/drivers/soc/fsl/guts.c
++++ b/drivers/soc/fsl/guts.c
+@@ -213,6 +213,9 @@ static const struct of_device_id fsl_gut
+ { .compatible = "fsl,ls1021a-dcfg", },
+ { .compatible = "fsl,ls1043a-dcfg", },
+ { .compatible = "fsl,ls2080a-dcfg", },
++ { .compatible = "fsl,ls1088a-dcfg", },
++ { .compatible = "fsl,ls1012a-dcfg", },
++ { .compatible = "fsl,ls1046a-dcfg", },
+ {}
+ };
+ MODULE_DEVICE_TABLE(of, fsl_guts_of_match);
+--- a/include/linux/fsl_devices.h
++++ b/include/linux/fsl_devices.h
+@@ -99,7 +99,9 @@ struct fsl_usb2_platform_data {
+ unsigned suspended:1;
+ unsigned already_suspended:1;
+ unsigned has_fsl_erratum_a007792:1;
++ unsigned has_fsl_erratum_14:1;
+ unsigned has_fsl_erratum_a005275:1;
++ unsigned has_fsl_erratum_a006918:1;
+ unsigned has_fsl_erratum_a005697:1;
+ unsigned check_phy_clk_valid:1;
+
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1260,7 +1260,8 @@ struct net_device_ops {
+ u32 flow_id);
+ #endif
+ int (*ndo_add_slave)(struct net_device *dev,
+- struct net_device *slave_dev);
++ struct net_device *slave_dev,
++ struct netlink_ext_ack *extack);
+ int (*ndo_del_slave)(struct net_device *dev,
+ struct net_device *slave_dev);
+ netdev_features_t (*ndo_fix_features)(struct net_device *dev,
+@@ -2341,7 +2342,8 @@ int register_netdevice_notifier(struct n
+ int unregister_netdevice_notifier(struct notifier_block *nb);
+
+ struct netdev_notifier_info {
+- struct net_device *dev;
++ struct net_device *dev;
++ struct netlink_ext_ack *extack;
+ };
+
+ struct netdev_notifier_info_ext {
+@@ -2373,6 +2375,7 @@ static inline void netdev_notifier_info_
+ struct net_device *dev)
+ {
+ info->dev = dev;
++ info->extack = NULL;
+ }
+
+ static inline struct net_device *
+@@ -2381,6 +2384,12 @@ netdev_notifier_info_to_dev(const struct
+ return info->dev;
+ }
+
++static inline struct netlink_ext_ack *
++netdev_notifier_info_to_extack(const struct netdev_notifier_info *info)
++{
++ return info->extack;
++}
++
+ int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
+
+
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -964,6 +964,7 @@ void kfree_skb_list(struct sk_buff *segs
+ void skb_tx_error(struct sk_buff *skb);
+ void consume_skb(struct sk_buff *skb);
+ void __consume_stateless_skb(struct sk_buff *skb);
++void skb_recycle(struct sk_buff *skb);
+ void __kfree_skb(struct sk_buff *skb);
+ extern struct kmem_cache *skbuff_head_cache;
+
+@@ -3293,6 +3294,7 @@ static inline void skb_free_datagram_loc
+ }
+ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags);
+ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);
++void copy_skb_header(struct sk_buff *new, const struct sk_buff *old);
+ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len);
+ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to,
+ int len, __wsum csum);
+--- a/include/net/bonding.h
++++ b/include/net/bonding.h
+@@ -592,7 +592,8 @@ void bond_destroy_sysfs(struct bond_net
+ void bond_prepare_sysfs_group(struct bonding *bond);
+ int bond_sysfs_slave_add(struct slave *slave);
+ void bond_sysfs_slave_del(struct slave *slave);
+-int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
++int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
++ struct netlink_ext_ack *extack);
+ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
+ u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb);
+ int bond_set_carrier(struct bonding *bond);
+--- a/net/batman-adv/soft-interface.c
++++ b/net/batman-adv/soft-interface.c
+@@ -872,7 +872,8 @@ free_bat_counters:
+ * Return: 0 if successful or error otherwise.
+ */
+ static int batadv_softif_slave_add(struct net_device *dev,
+- struct net_device *slave_dev)
++ struct net_device *slave_dev,
++ struct netlink_ext_ack *extack)
+ {
+ struct batadv_hard_iface *hard_iface;
+ struct net *net = dev_net(dev);
+--- a/net/bridge/br_device.c
++++ b/net/bridge/br_device.c
+@@ -324,7 +324,8 @@ void br_netpoll_disable(struct net_bridg
+
+ #endif
+
+-static int br_add_slave(struct net_device *dev, struct net_device *slave_dev)
++static int br_add_slave(struct net_device *dev, struct net_device *slave_dev,
++ struct netlink_ext_ack *extack)
+
+ {
+ struct net_bridge *br = netdev_priv(dev);
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -162,7 +162,6 @@ static struct list_head offload_base __r
+
+ static int netif_rx_internal(struct sk_buff *skb);
+ static int call_netdevice_notifiers_info(unsigned long val,
+- struct net_device *dev,
+ struct netdev_notifier_info *info);
+ static struct napi_struct *napi_by_id(unsigned int napi_id);
+
+@@ -1312,10 +1311,11 @@ EXPORT_SYMBOL(netdev_features_change);
+ void netdev_state_change(struct net_device *dev)
+ {
+ if (dev->flags & IFF_UP) {
+- struct netdev_notifier_change_info change_info;
++ struct netdev_notifier_change_info change_info = {
++ .info.dev = dev,
++ };
+
+- change_info.flags_changed = 0;
+- call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
++ call_netdevice_notifiers_info(NETDEV_CHANGE,
+ &change_info.info);
+ rtmsg_ifinfo(RTM_NEWLINK, dev, 0, GFP_KERNEL);
+ }
+@@ -1536,9 +1536,10 @@ EXPORT_SYMBOL(dev_disable_lro);
+ static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
+ struct net_device *dev)
+ {
+- struct netdev_notifier_info info;
++ struct netdev_notifier_info info = {
++ .dev = dev,
++ };
+
+- netdev_notifier_info_init(&info, dev);
+ return nb->notifier_call(nb, val, &info);
+ }
+
+@@ -1663,11 +1664,9 @@ EXPORT_SYMBOL(unregister_netdevice_notif
+ */
+
+ static int call_netdevice_notifiers_info(unsigned long val,
+- struct net_device *dev,
+ struct netdev_notifier_info *info)
+ {
+ ASSERT_RTNL();
+- netdev_notifier_info_init(info, dev);
+ return raw_notifier_call_chain(&netdev_chain, val, info);
+ }
+
+@@ -1682,9 +1681,11 @@ static int call_netdevice_notifiers_info
+
+ int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
+ {
+- struct netdev_notifier_info info;
++ struct netdev_notifier_info info = {
++ .dev = dev,
++ };
+
+- return call_netdevice_notifiers_info(val, dev, &info);
++ return call_netdevice_notifiers_info(val, &info);
+ }
+ EXPORT_SYMBOL(call_netdevice_notifiers);
+
+@@ -1707,7 +1708,7 @@ static int call_netdevice_notifiers_mtu(
+
+ BUILD_BUG_ON(offsetof(struct netdev_notifier_info_ext, info) != 0);
+
+- return call_netdevice_notifiers_info(val, dev, &info.info);
++ return call_netdevice_notifiers_info(val, &info.info);
+ }
+
+ #ifdef CONFIG_NET_INGRESS
+@@ -6338,7 +6339,15 @@ static int __netdev_upper_dev_link(struc
+ struct net_device *upper_dev, bool master,
+ void *upper_priv, void *upper_info)
+ {
+- struct netdev_notifier_changeupper_info changeupper_info;
++ struct netdev_notifier_changeupper_info changeupper_info = {
++ .info = {
++ .dev = dev,
++ },
++ .upper_dev = upper_dev,
++ .master = master,
++ .linking = true,
++ .upper_info = upper_info,
++ };
+ int ret = 0;
+
+ ASSERT_RTNL();
+@@ -6356,12 +6365,7 @@ static int __netdev_upper_dev_link(struc
+ if (master && netdev_master_upper_dev_get(dev))
+ return -EBUSY;
+
+- changeupper_info.upper_dev = upper_dev;
+- changeupper_info.master = master;
+- changeupper_info.linking = true;
+- changeupper_info.upper_info = upper_info;
+-
+- ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
++ ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
+ &changeupper_info.info);
+ ret = notifier_to_errno(ret);
+ if (ret)
+@@ -6373,7 +6377,7 @@ static int __netdev_upper_dev_link(struc
+ return ret;
+
+ netdev_update_addr_mask(dev);
+- ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
++ ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
+ &changeupper_info.info);
+ ret = notifier_to_errno(ret);
+ if (ret)
+@@ -6437,21 +6441,25 @@ EXPORT_SYMBOL(netdev_master_upper_dev_li
+ void netdev_upper_dev_unlink(struct net_device *dev,
+ struct net_device *upper_dev)
+ {
+- struct netdev_notifier_changeupper_info changeupper_info;
++ struct netdev_notifier_changeupper_info changeupper_info = {
++ .info = {
++ .dev = dev,
++ },
++ .upper_dev = upper_dev,
++ .linking = false,
++ };
+
+ ASSERT_RTNL();
+
+- changeupper_info.upper_dev = upper_dev;
+ changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev;
+- changeupper_info.linking = false;
+
+- call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
++ call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
+ &changeupper_info.info);
+
+ __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
+
+ netdev_update_addr_mask(dev);
+- call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
++ call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
+ &changeupper_info.info);
+ }
+ EXPORT_SYMBOL(netdev_upper_dev_unlink);
+@@ -6467,11 +6475,13 @@ EXPORT_SYMBOL(netdev_upper_dev_unlink);
+ void netdev_bonding_info_change(struct net_device *dev,
+ struct netdev_bonding_info *bonding_info)
+ {
+- struct netdev_notifier_bonding_info info;
++ struct netdev_notifier_bonding_info info = {
++ .info.dev = dev,
++ };
+
+ memcpy(&info.bonding_info, bonding_info,
+ sizeof(struct netdev_bonding_info));
+- call_netdevice_notifiers_info(NETDEV_BONDING_INFO, dev,
++ call_netdevice_notifiers_info(NETDEV_BONDING_INFO,
+ &info.info);
+ }
+ EXPORT_SYMBOL(netdev_bonding_info_change);
+@@ -6597,11 +6607,13 @@ EXPORT_SYMBOL(dev_get_nest_level);
+ void netdev_lower_state_changed(struct net_device *lower_dev,
+ void *lower_state_info)
+ {
+- struct netdev_notifier_changelowerstate_info changelowerstate_info;
++ struct netdev_notifier_changelowerstate_info changelowerstate_info = {
++ .info.dev = lower_dev,
++ };
+
+ ASSERT_RTNL();
+ changelowerstate_info.lower_state_info = lower_state_info;
+- call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE, lower_dev,
++ call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE,
+ &changelowerstate_info.info);
+ }
+ EXPORT_SYMBOL(netdev_lower_state_changed);
+@@ -6892,11 +6904,14 @@ void __dev_notify_flags(struct net_devic
+
+ if (dev->flags & IFF_UP &&
+ (changes & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | IFF_VOLATILE))) {
+- struct netdev_notifier_change_info change_info;
++ struct netdev_notifier_change_info change_info = {
++ .info = {
++ .dev = dev,
++ },
++ .flags_changed = changes,
++ };
+
+- change_info.flags_changed = changes;
+- call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
+- &change_info.info);
++ call_netdevice_notifiers_info(NETDEV_CHANGE, &change_info.info);
+ }
+ }
+
+--- a/net/core/rtnetlink.c
++++ b/net/core/rtnetlink.c
+@@ -1912,7 +1912,8 @@ static int do_setvfinfo(struct net_devic
+ return err;
+ }
+
+-static int do_set_master(struct net_device *dev, int ifindex)
++static int do_set_master(struct net_device *dev, int ifindex,
++ struct netlink_ext_ack *extack)
+ {
+ struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
+ const struct net_device_ops *ops;
+@@ -1937,7 +1938,7 @@ static int do_set_master(struct net_devi
+ return -EINVAL;
+ ops = upper_dev->netdev_ops;
+ if (ops->ndo_add_slave) {
+- err = ops->ndo_add_slave(upper_dev, dev);
++ err = ops->ndo_add_slave(upper_dev, dev, extack);
+ if (err)
+ return err;
+ } else {
+@@ -2074,7 +2075,7 @@ static int do_setlink(const struct sk_bu
+ }
+
+ if (tb[IFLA_MASTER]) {
+- err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]));
++ err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
+ if (err)
+ goto errout;
+ status |= DO_SETLINK_MODIFIED;
+@@ -2723,7 +2724,8 @@ replay:
+ goto out_unregister;
+ }
+ if (tb[IFLA_MASTER]) {
+- err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]));
++ err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]),
++ extack);
+ if (err)
+ goto out_unregister;
+ }
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -799,6 +799,32 @@ void napi_consume_skb(struct sk_buff *sk
+ }
+ EXPORT_SYMBOL(napi_consume_skb);
+
++/**
++ * skb_recycle - clean up an skb for reuse
++ * @skb: buffer
++ *
++ * Recycles the skb to be reused as a receive buffer. This
++ * function does any necessary reference count dropping, and
++ * cleans up the skbuff as if it just came from __alloc_skb().
++ */
++void skb_recycle(struct sk_buff *skb)
++{
++ struct skb_shared_info *shinfo;
++ u8 head_frag = skb->head_frag;
++
++ skb_release_head_state(skb);
++
++ shinfo = skb_shinfo(skb);
++ memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
++ atomic_set(&shinfo->dataref, 1);
++
++ memset(skb, 0, offsetof(struct sk_buff, tail));
++ skb->data = skb->head + NET_SKB_PAD;
++ skb->head_frag = head_frag;
++ skb_reset_tail_pointer(skb);
++}
++EXPORT_SYMBOL(skb_recycle);
++
+ /* Make sure a field is enclosed inside headers_start/headers_end section */
+ #define CHECK_SKB_FIELD(field) \
+ BUILD_BUG_ON(offsetof(struct sk_buff, field) < \
+@@ -1318,7 +1344,7 @@ static void skb_headers_offset_update(st
+ skb->inner_mac_header += off;
+ }
+
+-static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
++void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
+ {
+ __copy_skb_header(new, old);
+
+@@ -1326,6 +1352,7 @@ static void copy_skb_header(struct sk_bu
+ skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
+ skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
+ }
++EXPORT_SYMBOL(copy_skb_header);
+
+ static inline int skb_alloc_rx_flag(const struct sk_buff *skb)
+ {
+--- a/samples/bpf/Makefile
++++ b/samples/bpf/Makefile
+@@ -178,6 +178,12 @@ HOSTLOADLIBES_syscall_tp += -lelf
+ LLC ?= llc
+ CLANG ?= clang
+
++# Detect that we're cross compiling and use the cross compiler
++ifdef CROSS_COMPILE
++HOSTCC = $(CROSS_COMPILE)gcc
++CLANG_ARCH_ARGS = -target $(ARCH)
++endif
++
+ # Trick to allow make to be run from this directory
+ all: $(LIBBPF)
+ $(MAKE) -C ../../ $(CURDIR)/
+@@ -228,9 +234,9 @@ $(obj)/tracex5_kern.o: $(obj)/syscall_nr
+ $(obj)/%.o: $(src)/%.c
+ $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \
+ -I$(srctree)/tools/testing/selftests/bpf/ \
+- -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
+- -Wno-compare-distinct-pointer-types \
++ -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
++ -D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \
+ -Wno-gnu-variable-sized-type-not-at-end \
+ -Wno-address-of-packed-member -Wno-tautological-compare \
+- -Wno-unknown-warning-option \
++ -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \
+ -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@
+--- a/samples/bpf/map_perf_test_kern.c
++++ b/samples/bpf/map_perf_test_kern.c
+@@ -266,7 +266,7 @@ int stress_hash_map_lookup(struct pt_reg
+ return 0;
+ }
+
+-SEC("kprobe/sys_getpgrp")
++SEC("kprobe/sys_getppid")
+ int stress_array_map_lookup(struct pt_regs *ctx)
+ {
+ u32 key = 1, i;
+--- a/samples/bpf/map_perf_test_user.c
++++ b/samples/bpf/map_perf_test_user.c
+@@ -282,7 +282,7 @@ static void test_array_lookup(int cpu)
+
+ start_time = time_get_ns();
+ for (i = 0; i < max_cnt; i++)
+- syscall(__NR_getpgrp, 0);
++ syscall(__NR_getppid, 0);
+ printf("%d:array_lookup %lld lookups per sec\n",
+ cpu, max_cnt * 1000000000ll * 64 / (time_get_ns() - start_time));
+ }
+--- a/tools/testing/selftests/bpf/bpf_helpers.h
++++ b/tools/testing/selftests/bpf/bpf_helpers.h
+@@ -110,7 +110,47 @@ static int (*bpf_skb_under_cgroup)(void
+ static int (*bpf_skb_change_head)(void *, int len, int flags) =
+ (void *) BPF_FUNC_skb_change_head;
+
++/* Scan the ARCH passed in from ARCH env variable (see Makefile) */
++#if defined(__TARGET_ARCH_x86)
++ #define bpf_target_x86
++ #define bpf_target_defined
++#elif defined(__TARGET_ARCH_s930x)
++ #define bpf_target_s930x
++ #define bpf_target_defined
++#elif defined(__TARGET_ARCH_arm64)
++ #define bpf_target_arm64
++ #define bpf_target_defined
++#elif defined(__TARGET_ARCH_mips)
++ #define bpf_target_mips
++ #define bpf_target_defined
++#elif defined(__TARGET_ARCH_powerpc)
++ #define bpf_target_powerpc
++ #define bpf_target_defined
++#elif defined(__TARGET_ARCH_sparc)
++ #define bpf_target_sparc
++ #define bpf_target_defined
++#else
++ #undef bpf_target_defined
++#endif
++
++/* Fall back to what the compiler says */
++#ifndef bpf_target_defined
+ #if defined(__x86_64__)
++ #define bpf_target_x86
++#elif defined(__s390x__)
++ #define bpf_target_s930x
++#elif defined(__aarch64__)
++ #define bpf_target_arm64
++#elif defined(__mips__)
++ #define bpf_target_mips
++#elif defined(__powerpc__)
++ #define bpf_target_powerpc
++#elif defined(__sparc__)
++ #define bpf_target_sparc
++#endif
++#endif
++
++#if defined(bpf_target_x86)
+
+ #define PT_REGS_PARM1(x) ((x)->di)
+ #define PT_REGS_PARM2(x) ((x)->si)
+@@ -123,7 +163,7 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_SP(x) ((x)->sp)
+ #define PT_REGS_IP(x) ((x)->ip)
+
+-#elif defined(__s390x__)
++#elif defined(bpf_target_s390x)
+
+ #define PT_REGS_PARM1(x) ((x)->gprs[2])
+ #define PT_REGS_PARM2(x) ((x)->gprs[3])
+@@ -136,7 +176,7 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_SP(x) ((x)->gprs[15])
+ #define PT_REGS_IP(x) ((x)->psw.addr)
+
+-#elif defined(__aarch64__)
++#elif defined(bpf_target_arm64)
+
+ #define PT_REGS_PARM1(x) ((x)->regs[0])
+ #define PT_REGS_PARM2(x) ((x)->regs[1])
+@@ -149,7 +189,7 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_SP(x) ((x)->sp)
+ #define PT_REGS_IP(x) ((x)->pc)
+
+-#elif defined(__mips__)
++#elif defined(bpf_target_mips)
+
+ #define PT_REGS_PARM1(x) ((x)->regs[4])
+ #define PT_REGS_PARM2(x) ((x)->regs[5])
+@@ -162,7 +202,7 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_SP(x) ((x)->regs[29])
+ #define PT_REGS_IP(x) ((x)->cp0_epc)
+
+-#elif defined(__powerpc__)
++#elif defined(bpf_target_powerpc)
+
+ #define PT_REGS_PARM1(x) ((x)->gpr[3])
+ #define PT_REGS_PARM2(x) ((x)->gpr[4])
+@@ -173,7 +213,7 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_SP(x) ((x)->sp)
+ #define PT_REGS_IP(x) ((x)->nip)
+
+-#elif defined(__sparc__)
++#elif defined(bpf_target_sparc)
+
+ #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
+ #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
+@@ -183,6 +223,8 @@ static int (*bpf_skb_change_head)(void *
+ #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
+ #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
+ #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
++
++/* Should this also be a bpf_target check for the sparc case? */
+ #if defined(__arch64__)
+ #define PT_REGS_IP(x) ((x)->tpc)
+ #else
+@@ -191,10 +233,10 @@ static int (*bpf_skb_change_head)(void *
+
+ #endif
+
+-#ifdef __powerpc__
++#ifdef bpf_target_powerpc
+ #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
+ #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
+-#elif defined(__sparc__)
++#elif bpf_target_sparc
+ #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); })
+ #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
+ #else