Skip to content

Commit de2ff05

Browse files
yonghong-songAlexei Starovoitov
authored and
Alexei Starovoitov
committed
tools/bpf: add bpf_get_stack helper to tools headers
The tools header file bpf.h is synced with kernel uapi bpf.h. The new helper is also added to bpf_helpers.h. Signed-off-by: Yonghong Song <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 9cbe1f5 commit de2ff05

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

tools/include/uapi/linux/bpf.h

+40-2
Original file line numberDiff line numberDiff line change
@@ -1767,6 +1767,40 @@ union bpf_attr {
17671767
* **CONFIG_XFRM** configuration option.
17681768
* Return
17691769
* 0 on success, or a negative error in case of failure.
1770+
*
1771+
* int bpf_get_stack(struct pt_regs *regs, void *buf, u32 size, u64 flags)
1772+
* Description
1773+
* Return a user or a kernel stack in bpf program provided buffer.
1774+
* To achieve this, the helper needs *ctx*, which is a pointer
1775+
* to the context on which the tracing program is executed.
1776+
* To store the stacktrace, the bpf program provides *buf* with
1777+
* a nonnegative *size*.
1778+
*
1779+
* The last argument, *flags*, holds the number of stack frames to
1780+
* skip (from 0 to 255), masked with
1781+
* **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set
1782+
* the following flags:
1783+
*
1784+
* **BPF_F_USER_STACK**
1785+
* Collect a user space stack instead of a kernel stack.
1786+
* **BPF_F_USER_BUILD_ID**
1787+
* Collect buildid+offset instead of ips for user stack,
1788+
* only valid if **BPF_F_USER_STACK** is also specified.
1789+
*
1790+
* **bpf_get_stack**\ () can collect up to
1791+
* **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject
1792+
* to sufficient large buffer size. Note that
1793+
* this limit can be controlled with the **sysctl** program, and
1794+
* that it should be manually increased in order to profile long
1795+
* user stacks (such as stacks for Java programs). To do so, use:
1796+
*
1797+
* ::
1798+
*
1799+
* # sysctl kernel.perf_event_max_stack=<new value>
1800+
*
1801+
* Return
1802+
* a non-negative value equal to or less than size on success, or
1803+
* a negative error in case of failure.
17701804
*/
17711805
#define __BPF_FUNC_MAPPER(FN) \
17721806
FN(unspec), \
@@ -1835,7 +1869,8 @@ union bpf_attr {
18351869
FN(msg_pull_data), \
18361870
FN(bind), \
18371871
FN(xdp_adjust_tail), \
1838-
FN(skb_get_xfrm_state),
1872+
FN(skb_get_xfrm_state), \
1873+
FN(get_stack),
18391874

18401875
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
18411876
* function eBPF program intends to call
@@ -1869,11 +1904,14 @@ enum bpf_func_id {
18691904
/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
18701905
#define BPF_F_TUNINFO_IPV6 (1ULL << 0)
18711906

1872-
/* BPF_FUNC_get_stackid flags. */
1907+
/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */
18731908
#define BPF_F_SKIP_FIELD_MASK 0xffULL
18741909
#define BPF_F_USER_STACK (1ULL << 8)
1910+
/* flags used by BPF_FUNC_get_stackid only. */
18751911
#define BPF_F_FAST_STACK_CMP (1ULL << 9)
18761912
#define BPF_F_REUSE_STACKID (1ULL << 10)
1913+
/* flags used by BPF_FUNC_get_stack only. */
1914+
#define BPF_F_USER_BUILD_ID (1ULL << 11)
18771915

18781916
/* BPF_FUNC_skb_set_tunnel_key flags. */
18791917
#define BPF_F_ZERO_CSUM_TX (1ULL << 1)

tools/testing/selftests/bpf/bpf_helpers.h

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ static int (*bpf_xdp_adjust_tail)(void *ctx, int offset) =
101101
static int (*bpf_skb_get_xfrm_state)(void *ctx, int index, void *state,
102102
int size, int flags) =
103103
(void *) BPF_FUNC_skb_get_xfrm_state;
104+
static int (*bpf_get_stack)(void *ctx, void *buf, int size, int flags) =
105+
(void *) BPF_FUNC_get_stack;
104106

105107
/* llvm builtin functions that eBPF C program may use to
106108
* emit BPF_LD_ABS and BPF_LD_IND instructions

0 commit comments

Comments
 (0)