1ca21db90c91d7bc8d528a6b796986d28983b32f
[openwrt/openwrt.git] / target / linux / layerscape / patches-4.14 / 202-core-linux-support-layerscape.patch
1 From 74243154052af635ee9ce9d07aab273ce219c855 Mon Sep 17 00:00:00 2001
2 From: Biwen Li <biwen.li@nxp.com>
3 Date: Thu, 13 Dec 2018 13:23:52 +0800
4 Subject: [PATCH] core-linux: support layerscape
5
6 This is an integrated patch of core-linux for layerscape.
7
8 Signed-off-by: Abhijit Ayarekar <abhijit.ayarekar@caviumnetworks.com>
9 Signed-off-by: Amrita Kumari <amrita.kumari@nxp.com>
10 Signed-off-by: Ashish Kumar <Ashish.Kumar@nxp.com>
11 Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
12 Signed-off-by: Christoph Hellwig <hch@lst.de>
13 Signed-off-by: David Ahern <dsahern@gmail.com>
14 Signed-off-by: David S. Miller <davem@davemloft.net>
15 Signed-off-by: Guanhua Gao <guanhua.gao@nxp.com>
16 Signed-off-by: Jiri Pirko <jiri@mellanox.com>
17 Signed-off-by: Joel Fernandes <joelaf@google.com>
18 Signed-off-by: Li Yang <leoyang.li@nxp.com>
19 Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
20 Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
21 Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
22 Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
23 Signed-off-by: Ramneek Mehresh <ramneek.mehresh@freescale.com>
24 Signed-off-by: Robin Murphy <robin.murphy@arm.com>
25 Signed-off-by: Suresh Gupta <suresh.gupta@freescale.com>
26 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
27 Signed-off-by: yinbo.zhu <yinbo.zhu@nxp.com>
28 Signed-off-by: Biwen Li <biwen.li@nxp.com>
29 ---
30 drivers/base/dma-mapping.c | 7 ++
31 drivers/net/bonding/bond_main.c | 5 +-
32 drivers/net/bonding/bond_options.c | 2 +-
33 drivers/net/team/team.c | 3 +-
34 drivers/net/vrf.c | 3 +-
35 drivers/of/device.c | 13 +++-
36 drivers/soc/fsl/guts.c | 3 +
37 include/linux/fsl_devices.h | 2 +
38 include/linux/netdevice.h | 13 +++-
39 include/linux/skbuff.h | 2 +
40 include/net/bonding.h | 3 +-
41 net/batman-adv/soft-interface.c | 3 +-
42 net/bridge/br_device.c | 3 +-
43 net/core/dev.c | 81 ++++++++++++++---------
44 net/core/rtnetlink.c | 10 +--
45 net/core/skbuff.c | 29 +++++++-
46 samples/bpf/Makefile | 12 +++-
47 samples/bpf/map_perf_test_kern.c | 2 +-
48 samples/bpf/map_perf_test_user.c | 2 +-
49 tools/testing/selftests/bpf/bpf_helpers.h | 56 ++++++++++++++--
50 20 files changed, 193 insertions(+), 61 deletions(-)
51
52 --- a/drivers/base/dma-mapping.c
53 +++ b/drivers/base/dma-mapping.c
54 @@ -335,6 +335,7 @@ void dma_common_free_remap(void *cpu_add
55 * Common configuration to enable DMA API use for a device
56 */
57 #include <linux/pci.h>
58 +#include <linux/fsl/mc.h>
59
60 int dma_configure(struct device *dev)
61 {
62 @@ -350,6 +351,12 @@ int dma_configure(struct device *dev)
63 dma_dev = dma_dev->parent;
64 }
65
66 + if (dev_is_fsl_mc(dev)) {
67 + dma_dev = dev;
68 + while (dev_is_fsl_mc(dma_dev))
69 + dma_dev = dma_dev->parent;
70 + }
71 +
72 if (dma_dev->of_node) {
73 ret = of_dma_configure(dev, dma_dev->of_node);
74 } else if (has_acpi_companion(dma_dev)) {
75 --- a/drivers/net/bonding/bond_main.c
76 +++ b/drivers/net/bonding/bond_main.c
77 @@ -1337,7 +1337,8 @@ void bond_lower_state_changed(struct sla
78 }
79
80 /* enslave device <slave> to bond device <master> */
81 -int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
82 +int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
83 + struct netlink_ext_ack *extack)
84 {
85 struct bonding *bond = netdev_priv(bond_dev);
86 const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
87 @@ -3509,7 +3510,7 @@ static int bond_do_ioctl(struct net_devi
88 switch (cmd) {
89 case BOND_ENSLAVE_OLD:
90 case SIOCBONDENSLAVE:
91 - res = bond_enslave(bond_dev, slave_dev);
92 + res = bond_enslave(bond_dev, slave_dev, NULL);
93 break;
94 case BOND_RELEASE_OLD:
95 case SIOCBONDRELEASE:
96 --- a/drivers/net/bonding/bond_options.c
97 +++ b/drivers/net/bonding/bond_options.c
98 @@ -1389,7 +1389,7 @@ static int bond_option_slaves_set(struct
99 switch (command[0]) {
100 case '+':
101 netdev_dbg(bond->dev, "Adding slave %s\n", dev->name);
102 - ret = bond_enslave(bond->dev, dev);
103 + ret = bond_enslave(bond->dev, dev, NULL);
104 break;
105
106 case '-':
107 --- a/drivers/net/team/team.c
108 +++ b/drivers/net/team/team.c
109 @@ -1921,7 +1921,8 @@ static int team_netpoll_setup(struct net
110 }
111 #endif
112
113 -static int team_add_slave(struct net_device *dev, struct net_device *port_dev)
114 +static int team_add_slave(struct net_device *dev, struct net_device *port_dev,
115 + struct netlink_ext_ack *extack)
116 {
117 struct team *team = netdev_priv(dev);
118 int err;
119 --- a/drivers/net/vrf.c
120 +++ b/drivers/net/vrf.c
121 @@ -791,7 +791,8 @@ err:
122 return ret;
123 }
124
125 -static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
126 +static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev,
127 + struct netlink_ext_ack *extack)
128 {
129 if (netif_is_l3_master(port_dev) || netif_is_l3_slave(port_dev))
130 return -EINVAL;
131 --- a/drivers/of/device.c
132 +++ b/drivers/of/device.c
133 @@ -15,6 +15,9 @@
134
135 #include <asm/errno.h>
136 #include "of_private.h"
137 +#ifdef CONFIG_FSL_MC_BUS
138 +#include <linux/fsl/mc.h>
139 +#endif
140
141 /**
142 * of_match_device - Tell if a struct device matches an of_device_id list
143 @@ -105,6 +108,9 @@ int of_dma_configure(struct device *dev,
144 #ifdef CONFIG_ARM_AMBA
145 dev->bus != &amba_bustype &&
146 #endif
147 +#ifdef CONFIG_FSL_MC_BUS
148 + dev->bus != &fsl_mc_bus_type &&
149 +#endif
150 dev->bus != &platform_bus_type)
151 return ret == -ENODEV ? 0 : ret;
152
153 @@ -155,7 +161,12 @@ int of_dma_configure(struct device *dev,
154 dev->coherent_dma_mask &= mask;
155 *dev->dma_mask &= mask;
156
157 - coherent = of_dma_is_coherent(np);
158 +#ifdef CONFIG_FSL_MC_BUS
159 + if (dev_is_fsl_mc(dev))
160 + coherent = fsl_mc_is_dev_coherent(dev);
161 + else
162 +#endif
163 + coherent = of_dma_is_coherent(np);
164 dev_dbg(dev, "device is%sdma coherent\n",
165 coherent ? " " : " not ");
166
167 --- a/drivers/soc/fsl/guts.c
168 +++ b/drivers/soc/fsl/guts.c
169 @@ -213,6 +213,9 @@ static const struct of_device_id fsl_gut
170 { .compatible = "fsl,ls1021a-dcfg", },
171 { .compatible = "fsl,ls1043a-dcfg", },
172 { .compatible = "fsl,ls2080a-dcfg", },
173 + { .compatible = "fsl,ls1088a-dcfg", },
174 + { .compatible = "fsl,ls1012a-dcfg", },
175 + { .compatible = "fsl,ls1046a-dcfg", },
176 {}
177 };
178 MODULE_DEVICE_TABLE(of, fsl_guts_of_match);
179 --- a/include/linux/fsl_devices.h
180 +++ b/include/linux/fsl_devices.h
181 @@ -99,7 +99,9 @@ struct fsl_usb2_platform_data {
182 unsigned suspended:1;
183 unsigned already_suspended:1;
184 unsigned has_fsl_erratum_a007792:1;
185 + unsigned has_fsl_erratum_14:1;
186 unsigned has_fsl_erratum_a005275:1;
187 + unsigned has_fsl_erratum_a006918:1;
188 unsigned has_fsl_erratum_a005697:1;
189 unsigned check_phy_clk_valid:1;
190
191 --- a/include/linux/netdevice.h
192 +++ b/include/linux/netdevice.h
193 @@ -1260,7 +1260,8 @@ struct net_device_ops {
194 u32 flow_id);
195 #endif
196 int (*ndo_add_slave)(struct net_device *dev,
197 - struct net_device *slave_dev);
198 + struct net_device *slave_dev,
199 + struct netlink_ext_ack *extack);
200 int (*ndo_del_slave)(struct net_device *dev,
201 struct net_device *slave_dev);
202 netdev_features_t (*ndo_fix_features)(struct net_device *dev,
203 @@ -2344,7 +2345,8 @@ int register_netdevice_notifier(struct n
204 int unregister_netdevice_notifier(struct notifier_block *nb);
205
206 struct netdev_notifier_info {
207 - struct net_device *dev;
208 + struct net_device *dev;
209 + struct netlink_ext_ack *extack;
210 };
211
212 struct netdev_notifier_info_ext {
213 @@ -2376,6 +2378,7 @@ static inline void netdev_notifier_info_
214 struct net_device *dev)
215 {
216 info->dev = dev;
217 + info->extack = NULL;
218 }
219
220 static inline struct net_device *
221 @@ -2384,6 +2387,12 @@ netdev_notifier_info_to_dev(const struct
222 return info->dev;
223 }
224
225 +static inline struct netlink_ext_ack *
226 +netdev_notifier_info_to_extack(const struct netdev_notifier_info *info)
227 +{
228 + return info->extack;
229 +}
230 +
231 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
232
233
234 --- a/include/linux/skbuff.h
235 +++ b/include/linux/skbuff.h
236 @@ -964,6 +964,7 @@ void kfree_skb_list(struct sk_buff *segs
237 void skb_tx_error(struct sk_buff *skb);
238 void consume_skb(struct sk_buff *skb);
239 void __consume_stateless_skb(struct sk_buff *skb);
240 +void skb_recycle(struct sk_buff *skb);
241 void __kfree_skb(struct sk_buff *skb);
242 extern struct kmem_cache *skbuff_head_cache;
243
244 @@ -3294,6 +3295,7 @@ static inline void skb_free_datagram_loc
245 }
246 int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags);
247 int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);
248 +void copy_skb_header(struct sk_buff *new, const struct sk_buff *old);
249 int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len);
250 __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to,
251 int len, __wsum csum);
252 --- a/include/net/bonding.h
253 +++ b/include/net/bonding.h
254 @@ -592,7 +592,8 @@ void bond_destroy_sysfs(struct bond_net
255 void bond_prepare_sysfs_group(struct bonding *bond);
256 int bond_sysfs_slave_add(struct slave *slave);
257 void bond_sysfs_slave_del(struct slave *slave);
258 -int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
259 +int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
260 + struct netlink_ext_ack *extack);
261 int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
262 u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb);
263 int bond_set_carrier(struct bonding *bond);
264 --- a/net/batman-adv/soft-interface.c
265 +++ b/net/batman-adv/soft-interface.c
266 @@ -876,7 +876,8 @@ free_bat_counters:
267 * Return: 0 if successful or error otherwise.
268 */
269 static int batadv_softif_slave_add(struct net_device *dev,
270 - struct net_device *slave_dev)
271 + struct net_device *slave_dev,
272 + struct netlink_ext_ack *extack)
273 {
274 struct batadv_hard_iface *hard_iface;
275 struct net *net = dev_net(dev);
276 --- a/net/bridge/br_device.c
277 +++ b/net/bridge/br_device.c
278 @@ -324,7 +324,8 @@ void br_netpoll_disable(struct net_bridg
279
280 #endif
281
282 -static int br_add_slave(struct net_device *dev, struct net_device *slave_dev)
283 +static int br_add_slave(struct net_device *dev, struct net_device *slave_dev,
284 + struct netlink_ext_ack *extack)
285
286 {
287 struct net_bridge *br = netdev_priv(dev);
288 --- a/net/core/dev.c
289 +++ b/net/core/dev.c
290 @@ -162,7 +162,6 @@ static struct list_head offload_base __r
291
292 static int netif_rx_internal(struct sk_buff *skb);
293 static int call_netdevice_notifiers_info(unsigned long val,
294 - struct net_device *dev,
295 struct netdev_notifier_info *info);
296 static struct napi_struct *napi_by_id(unsigned int napi_id);
297
298 @@ -1312,10 +1311,11 @@ EXPORT_SYMBOL(netdev_features_change);
299 void netdev_state_change(struct net_device *dev)
300 {
301 if (dev->flags & IFF_UP) {
302 - struct netdev_notifier_change_info change_info;
303 + struct netdev_notifier_change_info change_info = {
304 + .info.dev = dev,
305 + };
306
307 - change_info.flags_changed = 0;
308 - call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
309 + call_netdevice_notifiers_info(NETDEV_CHANGE,
310 &change_info.info);
311 rtmsg_ifinfo(RTM_NEWLINK, dev, 0, GFP_KERNEL);
312 }
313 @@ -1536,9 +1536,10 @@ EXPORT_SYMBOL(dev_disable_lro);
314 static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
315 struct net_device *dev)
316 {
317 - struct netdev_notifier_info info;
318 + struct netdev_notifier_info info = {
319 + .dev = dev,
320 + };
321
322 - netdev_notifier_info_init(&info, dev);
323 return nb->notifier_call(nb, val, &info);
324 }
325
326 @@ -1663,11 +1664,9 @@ EXPORT_SYMBOL(unregister_netdevice_notif
327 */
328
329 static int call_netdevice_notifiers_info(unsigned long val,
330 - struct net_device *dev,
331 struct netdev_notifier_info *info)
332 {
333 ASSERT_RTNL();
334 - netdev_notifier_info_init(info, dev);
335 return raw_notifier_call_chain(&netdev_chain, val, info);
336 }
337
338 @@ -1682,9 +1681,11 @@ static int call_netdevice_notifiers_info
339
340 int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
341 {
342 - struct netdev_notifier_info info;
343 + struct netdev_notifier_info info = {
344 + .dev = dev,
345 + };
346
347 - return call_netdevice_notifiers_info(val, dev, &info);
348 + return call_netdevice_notifiers_info(val, &info);
349 }
350 EXPORT_SYMBOL(call_netdevice_notifiers);
351
352 @@ -1707,7 +1708,7 @@ static int call_netdevice_notifiers_mtu(
353
354 BUILD_BUG_ON(offsetof(struct netdev_notifier_info_ext, info) != 0);
355
356 - return call_netdevice_notifiers_info(val, dev, &info.info);
357 + return call_netdevice_notifiers_info(val, &info.info);
358 }
359
360 #ifdef CONFIG_NET_INGRESS
361 @@ -6338,7 +6339,15 @@ static int __netdev_upper_dev_link(struc
362 struct net_device *upper_dev, bool master,
363 void *upper_priv, void *upper_info)
364 {
365 - struct netdev_notifier_changeupper_info changeupper_info;
366 + struct netdev_notifier_changeupper_info changeupper_info = {
367 + .info = {
368 + .dev = dev,
369 + },
370 + .upper_dev = upper_dev,
371 + .master = master,
372 + .linking = true,
373 + .upper_info = upper_info,
374 + };
375 int ret = 0;
376
377 ASSERT_RTNL();
378 @@ -6356,12 +6365,7 @@ static int __netdev_upper_dev_link(struc
379 if (master && netdev_master_upper_dev_get(dev))
380 return -EBUSY;
381
382 - changeupper_info.upper_dev = upper_dev;
383 - changeupper_info.master = master;
384 - changeupper_info.linking = true;
385 - changeupper_info.upper_info = upper_info;
386 -
387 - ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
388 + ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
389 &changeupper_info.info);
390 ret = notifier_to_errno(ret);
391 if (ret)
392 @@ -6373,7 +6377,7 @@ static int __netdev_upper_dev_link(struc
393 return ret;
394
395 netdev_update_addr_mask(dev);
396 - ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
397 + ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
398 &changeupper_info.info);
399 ret = notifier_to_errno(ret);
400 if (ret)
401 @@ -6437,21 +6441,25 @@ EXPORT_SYMBOL(netdev_master_upper_dev_li
402 void netdev_upper_dev_unlink(struct net_device *dev,
403 struct net_device *upper_dev)
404 {
405 - struct netdev_notifier_changeupper_info changeupper_info;
406 + struct netdev_notifier_changeupper_info changeupper_info = {
407 + .info = {
408 + .dev = dev,
409 + },
410 + .upper_dev = upper_dev,
411 + .linking = false,
412 + };
413
414 ASSERT_RTNL();
415
416 - changeupper_info.upper_dev = upper_dev;
417 changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev;
418 - changeupper_info.linking = false;
419
420 - call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
421 + call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
422 &changeupper_info.info);
423
424 __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
425
426 netdev_update_addr_mask(dev);
427 - call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
428 + call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
429 &changeupper_info.info);
430 }
431 EXPORT_SYMBOL(netdev_upper_dev_unlink);
432 @@ -6467,11 +6475,13 @@ EXPORT_SYMBOL(netdev_upper_dev_unlink);
433 void netdev_bonding_info_change(struct net_device *dev,
434 struct netdev_bonding_info *bonding_info)
435 {
436 - struct netdev_notifier_bonding_info info;
437 + struct netdev_notifier_bonding_info info = {
438 + .info.dev = dev,
439 + };
440
441 memcpy(&info.bonding_info, bonding_info,
442 sizeof(struct netdev_bonding_info));
443 - call_netdevice_notifiers_info(NETDEV_BONDING_INFO, dev,
444 + call_netdevice_notifiers_info(NETDEV_BONDING_INFO,
445 &info.info);
446 }
447 EXPORT_SYMBOL(netdev_bonding_info_change);
448 @@ -6597,11 +6607,13 @@ EXPORT_SYMBOL(dev_get_nest_level);
449 void netdev_lower_state_changed(struct net_device *lower_dev,
450 void *lower_state_info)
451 {
452 - struct netdev_notifier_changelowerstate_info changelowerstate_info;
453 + struct netdev_notifier_changelowerstate_info changelowerstate_info = {
454 + .info.dev = lower_dev,
455 + };
456
457 ASSERT_RTNL();
458 changelowerstate_info.lower_state_info = lower_state_info;
459 - call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE, lower_dev,
460 + call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE,
461 &changelowerstate_info.info);
462 }
463 EXPORT_SYMBOL(netdev_lower_state_changed);
464 @@ -6892,11 +6904,14 @@ void __dev_notify_flags(struct net_devic
465
466 if (dev->flags & IFF_UP &&
467 (changes & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | IFF_VOLATILE))) {
468 - struct netdev_notifier_change_info change_info;
469 + struct netdev_notifier_change_info change_info = {
470 + .info = {
471 + .dev = dev,
472 + },
473 + .flags_changed = changes,
474 + };
475
476 - change_info.flags_changed = changes;
477 - call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
478 - &change_info.info);
479 + call_netdevice_notifiers_info(NETDEV_CHANGE, &change_info.info);
480 }
481 }
482
483 --- a/net/core/rtnetlink.c
484 +++ b/net/core/rtnetlink.c
485 @@ -1912,7 +1912,8 @@ static int do_setvfinfo(struct net_devic
486 return err;
487 }
488
489 -static int do_set_master(struct net_device *dev, int ifindex)
490 +static int do_set_master(struct net_device *dev, int ifindex,
491 + struct netlink_ext_ack *extack)
492 {
493 struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
494 const struct net_device_ops *ops;
495 @@ -1937,7 +1938,7 @@ static int do_set_master(struct net_devi
496 return -EINVAL;
497 ops = upper_dev->netdev_ops;
498 if (ops->ndo_add_slave) {
499 - err = ops->ndo_add_slave(upper_dev, dev);
500 + err = ops->ndo_add_slave(upper_dev, dev, extack);
501 if (err)
502 return err;
503 } else {
504 @@ -2074,7 +2075,7 @@ static int do_setlink(const struct sk_bu
505 }
506
507 if (tb[IFLA_MASTER]) {
508 - err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]));
509 + err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
510 if (err)
511 goto errout;
512 status |= DO_SETLINK_MODIFIED;
513 @@ -2723,7 +2724,8 @@ replay:
514 goto out_unregister;
515 }
516 if (tb[IFLA_MASTER]) {
517 - err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]));
518 + err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]),
519 + extack);
520 if (err)
521 goto out_unregister;
522 }
523 --- a/net/core/skbuff.c
524 +++ b/net/core/skbuff.c
525 @@ -803,6 +803,32 @@ void napi_consume_skb(struct sk_buff *sk
526 }
527 EXPORT_SYMBOL(napi_consume_skb);
528
529 +/**
530 + * skb_recycle - clean up an skb for reuse
531 + * @skb: buffer
532 + *
533 + * Recycles the skb to be reused as a receive buffer. This
534 + * function does any necessary reference count dropping, and
535 + * cleans up the skbuff as if it just came from __alloc_skb().
536 + */
537 +void skb_recycle(struct sk_buff *skb)
538 +{
539 + struct skb_shared_info *shinfo;
540 + u8 head_frag = skb->head_frag;
541 +
542 + skb_release_head_state(skb);
543 +
544 + shinfo = skb_shinfo(skb);
545 + memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
546 + atomic_set(&shinfo->dataref, 1);
547 +
548 + memset(skb, 0, offsetof(struct sk_buff, tail));
549 + skb->data = skb->head + NET_SKB_PAD;
550 + skb->head_frag = head_frag;
551 + skb_reset_tail_pointer(skb);
552 +}
553 +EXPORT_SYMBOL(skb_recycle);
554 +
555 /* Make sure a field is enclosed inside headers_start/headers_end section */
556 #define CHECK_SKB_FIELD(field) \
557 BUILD_BUG_ON(offsetof(struct sk_buff, field) < \
558 @@ -1322,7 +1348,7 @@ static void skb_headers_offset_update(st
559 skb->inner_mac_header += off;
560 }
561
562 -static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
563 +void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
564 {
565 __copy_skb_header(new, old);
566
567 @@ -1330,6 +1356,7 @@ static void copy_skb_header(struct sk_bu
568 skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
569 skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
570 }
571 +EXPORT_SYMBOL(copy_skb_header);
572
573 static inline int skb_alloc_rx_flag(const struct sk_buff *skb)
574 {
575 --- a/samples/bpf/Makefile
576 +++ b/samples/bpf/Makefile
577 @@ -178,6 +178,12 @@ HOSTLOADLIBES_syscall_tp += -lelf
578 LLC ?= llc
579 CLANG ?= clang
580
581 +# Detect that we're cross compiling and use the cross compiler
582 +ifdef CROSS_COMPILE
583 +HOSTCC = $(CROSS_COMPILE)gcc
584 +CLANG_ARCH_ARGS = -target $(ARCH)
585 +endif
586 +
587 # Trick to allow make to be run from this directory
588 all: $(LIBBPF)
589 $(MAKE) -C ../../ $(CURDIR)/
590 @@ -228,9 +234,9 @@ $(obj)/tracex5_kern.o: $(obj)/syscall_nr
591 $(obj)/%.o: $(src)/%.c
592 $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \
593 -I$(srctree)/tools/testing/selftests/bpf/ \
594 - -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
595 - -Wno-compare-distinct-pointer-types \
596 + -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
597 + -D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \
598 -Wno-gnu-variable-sized-type-not-at-end \
599 -Wno-address-of-packed-member -Wno-tautological-compare \
600 - -Wno-unknown-warning-option \
601 + -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \
602 -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@
603 --- a/samples/bpf/map_perf_test_kern.c
604 +++ b/samples/bpf/map_perf_test_kern.c
605 @@ -266,7 +266,7 @@ int stress_hash_map_lookup(struct pt_reg
606 return 0;
607 }
608
609 -SEC("kprobe/sys_getpgrp")
610 +SEC("kprobe/sys_getppid")
611 int stress_array_map_lookup(struct pt_regs *ctx)
612 {
613 u32 key = 1, i;
614 --- a/samples/bpf/map_perf_test_user.c
615 +++ b/samples/bpf/map_perf_test_user.c
616 @@ -282,7 +282,7 @@ static void test_array_lookup(int cpu)
617
618 start_time = time_get_ns();
619 for (i = 0; i < max_cnt; i++)
620 - syscall(__NR_getpgrp, 0);
621 + syscall(__NR_getppid, 0);
622 printf("%d:array_lookup %lld lookups per sec\n",
623 cpu, max_cnt * 1000000000ll * 64 / (time_get_ns() - start_time));
624 }
625 --- a/tools/testing/selftests/bpf/bpf_helpers.h
626 +++ b/tools/testing/selftests/bpf/bpf_helpers.h
627 @@ -110,7 +110,47 @@ static int (*bpf_skb_under_cgroup)(void
628 static int (*bpf_skb_change_head)(void *, int len, int flags) =
629 (void *) BPF_FUNC_skb_change_head;
630
631 +/* Scan the ARCH passed in from ARCH env variable (see Makefile) */
632 +#if defined(__TARGET_ARCH_x86)
633 + #define bpf_target_x86
634 + #define bpf_target_defined
635 +#elif defined(__TARGET_ARCH_s930x)
636 + #define bpf_target_s930x
637 + #define bpf_target_defined
638 +#elif defined(__TARGET_ARCH_arm64)
639 + #define bpf_target_arm64
640 + #define bpf_target_defined
641 +#elif defined(__TARGET_ARCH_mips)
642 + #define bpf_target_mips
643 + #define bpf_target_defined
644 +#elif defined(__TARGET_ARCH_powerpc)
645 + #define bpf_target_powerpc
646 + #define bpf_target_defined
647 +#elif defined(__TARGET_ARCH_sparc)
648 + #define bpf_target_sparc
649 + #define bpf_target_defined
650 +#else
651 + #undef bpf_target_defined
652 +#endif
653 +
654 +/* Fall back to what the compiler says */
655 +#ifndef bpf_target_defined
656 #if defined(__x86_64__)
657 + #define bpf_target_x86
658 +#elif defined(__s390x__)
659 + #define bpf_target_s930x
660 +#elif defined(__aarch64__)
661 + #define bpf_target_arm64
662 +#elif defined(__mips__)
663 + #define bpf_target_mips
664 +#elif defined(__powerpc__)
665 + #define bpf_target_powerpc
666 +#elif defined(__sparc__)
667 + #define bpf_target_sparc
668 +#endif
669 +#endif
670 +
671 +#if defined(bpf_target_x86)
672
673 #define PT_REGS_PARM1(x) ((x)->di)
674 #define PT_REGS_PARM2(x) ((x)->si)
675 @@ -123,7 +163,7 @@ static int (*bpf_skb_change_head)(void *
676 #define PT_REGS_SP(x) ((x)->sp)
677 #define PT_REGS_IP(x) ((x)->ip)
678
679 -#elif defined(__s390x__)
680 +#elif defined(bpf_target_s390x)
681
682 #define PT_REGS_PARM1(x) ((x)->gprs[2])
683 #define PT_REGS_PARM2(x) ((x)->gprs[3])
684 @@ -136,7 +176,7 @@ static int (*bpf_skb_change_head)(void *
685 #define PT_REGS_SP(x) ((x)->gprs[15])
686 #define PT_REGS_IP(x) ((x)->psw.addr)
687
688 -#elif defined(__aarch64__)
689 +#elif defined(bpf_target_arm64)
690
691 #define PT_REGS_PARM1(x) ((x)->regs[0])
692 #define PT_REGS_PARM2(x) ((x)->regs[1])
693 @@ -149,7 +189,7 @@ static int (*bpf_skb_change_head)(void *
694 #define PT_REGS_SP(x) ((x)->sp)
695 #define PT_REGS_IP(x) ((x)->pc)
696
697 -#elif defined(__mips__)
698 +#elif defined(bpf_target_mips)
699
700 #define PT_REGS_PARM1(x) ((x)->regs[4])
701 #define PT_REGS_PARM2(x) ((x)->regs[5])
702 @@ -162,7 +202,7 @@ static int (*bpf_skb_change_head)(void *
703 #define PT_REGS_SP(x) ((x)->regs[29])
704 #define PT_REGS_IP(x) ((x)->cp0_epc)
705
706 -#elif defined(__powerpc__)
707 +#elif defined(bpf_target_powerpc)
708
709 #define PT_REGS_PARM1(x) ((x)->gpr[3])
710 #define PT_REGS_PARM2(x) ((x)->gpr[4])
711 @@ -173,7 +213,7 @@ static int (*bpf_skb_change_head)(void *
712 #define PT_REGS_SP(x) ((x)->sp)
713 #define PT_REGS_IP(x) ((x)->nip)
714
715 -#elif defined(__sparc__)
716 +#elif defined(bpf_target_sparc)
717
718 #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
719 #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
720 @@ -183,6 +223,8 @@ static int (*bpf_skb_change_head)(void *
721 #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
722 #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
723 #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
724 +
725 +/* Should this also be a bpf_target check for the sparc case? */
726 #if defined(__arch64__)
727 #define PT_REGS_IP(x) ((x)->tpc)
728 #else
729 @@ -191,10 +233,10 @@ static int (*bpf_skb_change_head)(void *
730
731 #endif
732
733 -#ifdef __powerpc__
734 +#ifdef bpf_target_powerpc
735 #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
736 #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
737 -#elif defined(__sparc__)
738 +#elif bpf_target_sparc
739 #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); })
740 #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
741 #else