1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_UNWIND_USER_DEFERRED_TYPES_H 3 #define _LINUX_UNWIND_USER_DEFERRED_TYPES_H 4 5 #include <linux/types.h> 6 #include <linux/atomic.h> 7 8 struct unwind_cache { 9 unsigned long unwind_completed; 10 unsigned int nr_entries; 11 unsigned long entries[]; 12 }; 13 14 /* 15 * The unwind_task_id is a unique identifier that maps to a user space 16 * stacktrace. It is generated the first time a deferred user space 17 * stacktrace is requested after a task has entered the kerenl and 18 * is cleared to zero when it exits. The mapped id will be a non-zero 19 * number. 20 * 21 * To simplify the generation of the 64 bit number, 32 bits will be 22 * the CPU it was generated on, and the other 32 bits will be a per 23 * cpu counter that gets incremented by two every time a new identifier 24 * is generated. The LSB will always be set to keep the value 25 * from being zero. 26 */ 27 union unwind_task_id { 28 struct { 29 u32 cpu; 30 u32 cnt; 31 }; 32 u64 id; 33 }; 34 35 struct unwind_task_info { 36 atomic_long_t unwind_mask; 37 struct unwind_cache *cache; 38 struct callback_head work; 39 union unwind_task_id id; 40 }; 41 42 struct unwind_work; 43 struct unwind_stacktrace; 44 45 typedef void (*unwind_callback_t)(struct unwind_work *work, 46 struct unwind_stacktrace *trace, 47 u64 cookie); 48 49 struct unwind_work { 50 struct list_head list; 51 unwind_callback_t func; 52 int bit; 53 }; 54 55 #endif /* _LINUX_UNWIND_USER_DEFERRED_TYPES_H */ 56