Changeset 2e9b59b for libcfa/src/concurrency/kernel.hfa
- Timestamp:
- Apr 19, 2022, 3:00:04 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- 5b84a321
- Parents:
- ba897d21 (diff), bb7c77d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
rba897d21 r2e9b59b 48 48 extern struct cluster * mainCluster; 49 49 50 // Processor id, required for scheduling threads 51 52 50 // Coroutine used py processors for the 2-step context switch 53 51 coroutine processorCtx_t { 54 52 struct processor * proc; 55 53 }; 56 54 57 55 struct io_future_t; 56 57 // Information needed for idle sleep 58 58 struct __fd_waitctx { 59 volatile int fd; 59 // semaphore/future like object 60 // values can be 0, 1 or some file descriptor. 61 // 0 - is the default state 62 // 1 - means the proc should wake-up immediately 63 // FD - means the proc is going asleep and should be woken by writing to the FD. 64 volatile int sem; 65 66 // The event FD that corresponds to this processor 67 int evfd; 68 69 // buffer into which the proc will read from evfd 70 // unused if not using io_uring for idle sleep 71 void * rdbuf; 72 73 // future use to track the read of the eventfd 74 // unused if not using io_uring for idle sleep 75 io_future_t * ftr; 76 77 volatile unsigned long long wake__time; 78 volatile unsigned long long sleep_time; 79 volatile unsigned long long drain_time; 60 80 }; 61 81 … … 92 112 struct { 93 113 $io_context * ctx; 94 bool pending; 95 bool dirty; 114 unsigned target; 115 volatile bool pending; 116 volatile bool dirty; 96 117 } io; 97 118 … … 103 124 bool pending_preemption; 104 125 105 // Idle lock (kernel semaphore) 106 int idle_fd; 107 108 // Idle waitctx 126 // context for idle sleep 109 127 struct __fd_waitctx idle_wctx; 110 128 … … 155 173 void ^?{}(__intrusive_lane_t & this); 156 174 157 // Aligned timestamps which are used by the re laxed ready queue175 // Aligned timestamps which are used by the ready queue and io subsystem 158 176 struct __attribute__((aligned(128))) __timestamp_t { 159 177 volatile unsigned long long tv; … … 161 179 }; 162 180 181 static inline void ?{}(__timestamp_t & this) { this.tv = 0; this.ma = 0; } 182 static inline void ^?{}(__timestamp_t &) {} 183 184 163 185 struct __attribute__((aligned(16))) __cache_id_t { 164 186 volatile unsigned id; 165 187 }; 166 167 // Aligned timestamps which are used by the relaxed ready queue168 struct __attribute__((aligned(128))) __help_cnts_t {169 volatile unsigned long long src;170 volatile unsigned long long dst;171 volatile unsigned long long tri;172 };173 174 static inline void ?{}(__timestamp_t & this) { this.tv = 0; this.ma = 0; }175 static inline void ^?{}(__timestamp_t &) {}176 177 struct __attribute__((aligned(128))) __ready_queue_caches_t;178 void ?{}(__ready_queue_caches_t & this);179 void ^?{}(__ready_queue_caches_t & this);180 181 //TODO adjust cache size to ARCHITECTURE182 // Structure holding the ready queue183 struct __ready_queue_t {184 // Data tracking the actual lanes185 // On a seperate cacheline from the used struct since186 // used can change on each push/pop but this data187 // only changes on shrink/grow188 struct {189 // Arary of lanes190 __intrusive_lane_t * volatile data;191 192 // Array of times193 __timestamp_t * volatile tscs;194 195 __cache_id_t * volatile caches;196 197 // Array of stats198 __help_cnts_t * volatile help;199 200 // Number of lanes (empty or not)201 volatile size_t count;202 } lanes;203 };204 205 void ?{}(__ready_queue_t & this);206 void ^?{}(__ready_queue_t & this);207 #if !defined(__CFA_NO_STATISTICS__)208 unsigned cnt(const __ready_queue_t & this, unsigned idx);209 #endif210 188 211 189 // Idle Sleep … … 233 211 // Cluster 234 212 struct __attribute__((aligned(128))) cluster { 235 // Ready queue for threads 236 __ready_queue_t ready_queue; 213 struct { 214 struct { 215 // Arary of subqueues 216 __intrusive_lane_t * data; 217 218 // Time since subqueues were processed 219 __timestamp_t * tscs; 220 221 // Number of subqueue / timestamps 222 size_t count; 223 } readyQ; 224 225 struct { 226 // Array of $io_ 227 $io_context ** data; 228 229 // Time since subqueues were processed 230 __timestamp_t * tscs; 231 232 // Number of I/O subqueues 233 size_t count; 234 } io; 235 236 // Cache each kernel thread belongs to 237 __cache_id_t * caches; 238 } sched; 239 240 // // Ready queue for threads 241 // __ready_queue_t ready_queue; 237 242 238 243 // Name of the cluster
Note:
See TracChangeset
for help on using the changeset viewer.