OpenWrt – Rev 2

Subversion Repositories:
Rev:
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;
@@ -3509,7 +3510,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
@@ -1932,7 +1932,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,
@@ -2344,7 +2345,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 {
@@ -2376,6 +2378,7 @@ static inline void netdev_notifier_info_
                                             struct net_device *dev)
 {
        info->dev = dev;
+       info->extack = NULL;
 }
 
 static inline struct net_device *
@@ -2384,6 +2387,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;
 
@@ -3294,6 +3295,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
@@ -874,7 +874,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
@@ -803,6 +803,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) <          \
@@ -1322,7 +1348,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);
 
@@ -1330,6 +1356,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