1231990Smp// SPDX-License-Identifier: GPL-2.0-only
259243Sobrien/* Copyright (c) 2020 Facebook */
3231990Smp#include <stddef.h>
459243Sobrien#include <linux/bpf.h>
559243Sobrien#include <bpf/bpf_helpers.h>
659243Sobrien#include "bpf_misc.h"
7231990Smp
859243Sobrien#define MAX_STACK 260
959243Sobrien
1059243Sobrienstatic __attribute__ ((noinline))
11231990Smpint f0(int var, struct __sk_buff *skb)
1259243Sobrien{
1359243Sobrien	asm volatile ("");
14231990Smp
1559243Sobrien	return skb->len;
16231990Smp}
17231990Smp
18231990Smp__attribute__ ((noinline))
1959243Sobrienint f1(struct __sk_buff *skb)
2059243Sobrien{
2159243Sobrien	volatile char buf[MAX_STACK] = {};
22231990Smp
23231990Smp	__sink(buf[MAX_STACK - 1]);
2459243Sobrien
2559243Sobrien	return f0(0, skb) + skb->len;
2659243Sobrien}
2759243Sobrien
28231990Smpint f3(int, struct __sk_buff *skb, int);
2959243Sobrien
3059243Sobrien__attribute__ ((noinline))
31231990Smpint f2(int val, struct __sk_buff *skb)
3259243Sobrien{
3359243Sobrien	volatile char buf[MAX_STACK] = {};
34231990Smp
35231990Smp	__sink(buf[MAX_STACK - 1]);
36231990Smp
3759243Sobrien	return f1(skb) + f3(val, skb, 1);
38231990Smp}
39231990Smp
40231990Smp__attribute__ ((noinline))
4159243Sobrienint f3(int val, struct __sk_buff *skb, int var)
4259243Sobrien{
4359243Sobrien	volatile char buf[MAX_STACK] = {};
4459243Sobrien
45231990Smp	__sink(buf[MAX_STACK - 1]);
4659243Sobrien
47231990Smp	return skb->ifindex * val * var;
48231990Smp}
49231990Smp
5059243SobrienSEC("tc")
5159243Sobrien__failure __msg("combined stack size of 3 calls is")
52231990Smpint global_func1(struct __sk_buff *skb)
5359243Sobrien{
5459243Sobrien	return f0(1, skb) + f1(skb) + f2(2, skb) + f3(3, skb, 4);
5559243Sobrien}
5659243Sobrien