Changeset ece0e80 for libcfa/src/concurrency/io.cfa
- Timestamp:
- Jan 9, 2021, 4:27:57 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 561dd26
- Parents:
- 35fd2c4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/io.cfa
r35fd2c4 rece0e80 134 134 int ret = 0; 135 135 if( need_sys_to_submit || need_sys_to_complete ) { 136 __cfadbg_print_safe(io_core, "Kernel I/O : IO_URING enter %d %u %u\n", ring.fd, to_submit, flags); 136 137 ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, flags, (sigset_t *)0p, _NSIG / 8); 137 138 if( ret < 0 ) { … … 230 231 __cfadbg_print_safe(io_core, "Kernel I/O : IO poller %p for ring %p ready\n", &this, &this.ring); 231 232 232 int reset = 0; 233 const int reset_cnt = 5; 234 int reset = reset_cnt; 233 235 // Then loop until we need to start 236 LOOP: 234 237 while(!__atomic_load_n(&this.done, __ATOMIC_SEQ_CST)) { 235 238 // Drain the io … … 239 242 [count, again] = __drain_io( *this.ring ); 240 243 241 if(!again) reset ++;244 if(!again) reset--; 242 245 243 246 // Update statistics … … 249 252 250 253 // If we got something, just yield and check again 251 if(reset < 5) {254 if(reset > 1) { 252 255 yield(); 253 } 254 // We didn't get anything baton pass to the slow poller 255 else { 256 continue LOOP; 257 } 258 259 // We alread failed to find events a few time. 260 if(reset == 1) { 261 // Rearm the context so it can block 262 // but don't block right away 263 // we need to retry one last time in case 264 // something completed *just now* 265 __ioctx_prepare_block( this, ev ); 266 continue LOOP; 267 } 268 256 269 __STATS__( false, 257 270 io.complete_q.blocks += 1; 258 271 ) 259 272 __cfadbg_print_safe(io_core, "Kernel I/O : Parking io poller %p\n", &this.self); 260 reset = 0;261 273 262 274 // block this thread 263 __ioctx_prepare_block( this, ev );264 275 wait( this.sem ); 265 } 276 277 // restore counter 278 reset = reset_cnt; 266 279 } 267 280 … … 319 332 ) 320 333 334 __cfadbg_print_safe( io, "Kernel I/O : allocated [%p, %u] for %p (%p)\n", sqe, idx, active_thread(), (void*)data ); 321 335 322 336 // Success return the data … … 376 390 377 391 void __submit( struct io_context * ctx, __u32 idx ) __attribute__((nonnull (1))) { 392 __cfadbg_print_safe( io, "Kernel I/O : submitting %u for %p\n", idx, active_thread() ); 393 378 394 __io_data & ring = *ctx->thrd.ring; 379 395 // Get now the data we definetely need … … 443 459 unlock(ring.submit_q.submit_lock); 444 460 #endif 445 if( ret < 0 ) return; 461 if( ret < 0 ) { 462 return; 463 } 446 464 447 465 // Release the consumed SQEs … … 454 472 io.submit_q.submit_avg.cnt += 1; 455 473 ) 474 475 __cfadbg_print_safe( io, "Kernel I/O : submitted %u (among %u) for %p\n", idx, ret, active_thread() ); 456 476 } 457 477 else {
Note: See TracChangeset
for help on using the changeset viewer.