Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 113 lines 2.5 kB view raw
1/* 2 * SPDX-License-Identifier: GPL-2.0 3 * Copyright (c) 2025 Meta Platforms, Inc. and affiliates. 4 * Copyright (c) 2025 Tejun Heo <tj@kernel.org> 5 * Copyright (c) 2025 Emil Tsalapatis <etsal@meta.com> 6 */ 7#pragma once 8 9#ifndef __BPF__ 10#define __arena 11#endif /* __BPF__ */ 12 13struct scx_alloc_stats { 14 __u64 chunk_allocs; 15 __u64 data_allocs; 16 __u64 alloc_ops; 17 __u64 free_ops; 18 __u64 active_allocs; 19 __u64 arena_pages_used; 20}; 21 22struct sdt_pool { 23 void __arena *slab; 24 __u64 elem_size; 25 __u64 max_elems; 26 __u64 idx; 27}; 28 29#ifndef div_round_up 30#define div_round_up(a, b) (((a) + (b) - 1) / (b)) 31#endif 32 33#ifndef round_up 34#define round_up(a, b) (div_round_up((a), (b)) * (b)) 35#endif 36 37typedef struct sdt_desc __arena sdt_desc_t; 38 39enum sdt_consts { 40 SDT_TASK_ENTS_PER_PAGE_SHIFT = 9, 41 SDT_TASK_LEVELS = 3, 42 SDT_TASK_ENTS_PER_CHUNK = 1 << SDT_TASK_ENTS_PER_PAGE_SHIFT, 43 SDT_TASK_CHUNK_BITMAP_U64S = div_round_up(SDT_TASK_ENTS_PER_CHUNK, 64), 44 SDT_TASK_MIN_ELEM_PER_ALLOC = 8, 45}; 46 47union sdt_id { 48 __s64 val; 49 struct { 50 __s32 idx; /* index in the radix tree */ 51 __s32 genn; /* ++'d on recycle so that it forms unique'ish 64bit ID */ 52 }; 53}; 54 55struct sdt_chunk; 56 57/* 58 * Each index page is described by the following descriptor which carries the 59 * bitmap. This way the actual index can host power-of-two numbers of entries 60 * which makes indexing cheaper. 61 */ 62struct sdt_desc { 63 __u64 allocated[SDT_TASK_CHUNK_BITMAP_U64S]; 64 __u64 nr_free; 65 struct sdt_chunk __arena *chunk; 66}; 67 68/* 69 * Leaf node containing per-task data. 70 */ 71struct sdt_data { 72 union sdt_id tid; 73 __u64 payload[]; 74}; 75 76/* 77 * Intermediate node pointing to another intermediate node or leaf node. 78 */ 79struct sdt_chunk { 80 union { 81 sdt_desc_t * descs[SDT_TASK_ENTS_PER_CHUNK]; 82 struct sdt_data __arena *data[SDT_TASK_ENTS_PER_CHUNK]; 83 }; 84}; 85 86struct scx_allocator { 87 struct sdt_pool pool; 88 sdt_desc_t *root; 89}; 90 91struct scx_stats { 92 int seq; 93 pid_t pid; 94 __u64 enqueue; 95 __u64 exit; 96 __u64 init; 97 __u64 select_busy_cpu; 98 __u64 select_idle_cpu; 99}; 100 101#ifdef __BPF__ 102 103void __arena *scx_task_data(struct task_struct *p); 104int scx_task_init(__u64 data_size); 105void __arena *scx_task_alloc(struct task_struct *p); 106void scx_task_free(struct task_struct *p); 107void scx_arena_subprog_init(void); 108 109int scx_alloc_init(struct scx_allocator *alloc, __u64 data_size); 110u64 scx_alloc_internal(struct scx_allocator *alloc); 111int scx_alloc_free_idx(struct scx_allocator *alloc, __u64 idx); 112 113#endif /* __BPF__ */