#include "bpf_iter_netlink.skel.h"
 #include "bpf_iter_bpf_map.skel.h"
 #include "bpf_iter_task.skel.h"
+#include "bpf_iter_task_stack.skel.h"
 #include "bpf_iter_task_file.skel.h"
 #include "bpf_iter_tcp4.skel.h"
 #include "bpf_iter_tcp6.skel.h"
        bpf_iter_task__destroy(skel);
 }
 
+static void test_task_stack(void)
+{
+       struct bpf_iter_task_stack *skel;
+
+       skel = bpf_iter_task_stack__open_and_load();
+       if (CHECK(!skel, "bpf_iter_task_stack__open_and_load",
+                 "skeleton open_and_load failed\n"))
+               return;
+
+       do_dummy_read(skel->progs.dump_task_stack);
+
+       bpf_iter_task_stack__destroy(skel);
+}
+
 static void test_task_file(void)
 {
        struct bpf_iter_task_file *skel;
                test_bpf_map();
        if (test__start_subtest("task"))
                test_task();
+       if (test__start_subtest("task_stack"))
+               test_task_stack();
        if (test__start_subtest("task_file"))
                test_task_file();
        if (test__start_subtest("tcp4"))
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2020 Facebook */
+#include "bpf_iter.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+char _license[] SEC("license") = "GPL";
+
+#define MAX_STACK_TRACE_DEPTH   64
+unsigned long entries[MAX_STACK_TRACE_DEPTH];
+#define SIZE_OF_ULONG (sizeof(unsigned long))
+
+SEC("iter/task")
+int dump_task_stack(struct bpf_iter__task *ctx)
+{
+       struct seq_file *seq = ctx->meta->seq;
+       struct task_struct *task = ctx->task;
+       long i, retlen;
+
+       if (task == (void *)0)
+               return 0;
+
+       retlen = bpf_get_task_stack(task, entries,
+                                   MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, 0);
+       if (retlen < 0)
+               return 0;
+
+       BPF_SEQ_PRINTF(seq, "pid: %8u num_entries: %8u\n", task->pid,
+                      retlen / SIZE_OF_ULONG);
+       for (i = 0; i < MAX_STACK_TRACE_DEPTH; i++) {
+               if (retlen > i * SIZE_OF_ULONG)
+                       BPF_SEQ_PRINTF(seq, "[<0>] %pB\n", (void *)entries[i]);
+       }
+       BPF_SEQ_PRINTF(seq, "\n");
+
+       return 0;
+}