Changes in libcfa/src/concurrency/io.cfa [ff55092:bdfd0bd]
- File:
-
- 1 edited
-
libcfa/src/concurrency/io.cfa (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/io.cfa
rff55092 rbdfd0bd 96 96 static void ioring_syscsll( struct $io_context & ctx, unsigned int min_comp, unsigned int flags ) { 97 97 __STATS__( true, io.calls.flush++; ) 98 int ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, min_comp, flags, (sigset_t *)0p, _NSIG / 8); 99 if( ret < 0 ) { 100 switch((int)errno) { 101 case EAGAIN: 102 case EINTR: 103 case EBUSY: 104 // Update statistics 105 __STATS__( false, io.calls.errors.busy ++; ) 106 return false; 107 default: 108 abort( "KERNEL ERROR: IO_URING SYSCALL - (%d) %s\n", (int)errno, strerror(errno) ); 98 int ret; 99 for() { 100 ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, min_comp, flags, (sigset_t *)0p, _NSIG / 8); 101 if( ret < 0 ) { 102 switch((int)errno) { 103 case EINTR: 104 continue; 105 case EAGAIN: 106 case EBUSY: 107 // Update statistics 108 __STATS__( false, io.calls.errors.busy ++; ) 109 return false; 110 default: 111 abort( "KERNEL ERROR: IO_URING SYSCALL - (%d) %s\n", (int)errno, strerror(errno) ); 112 } 109 113 } 114 break; 110 115 } 111 116 … … 179 184 // Ensure that the kernel only sees the new value of the head index after the CQEs have been read. 180 185 __atomic_store_n( ctx->cq.head, head + count, __ATOMIC_SEQ_CST ); 186 ctx->proc->idle_wctx.drain_time = ts_next; 181 187 182 188 __cfadbg_print_safe(io, "Kernel I/O : %u completed age %llu\n", count, ts_next); … … 230 236 const unsigned long long cutoff = calc_cutoff(ctsc, ctx->cq.id, ctxs_count, io.data, io.tscs, __shard_factor.io); 231 237 const unsigned long long age = moving_average(ctsc, io.tscs[target].tv, io.tscs[target].ma); 232 __cfadbg_print_safe(io, "Kernel I/O: Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, this, age, cutoff, age > cutoff ? "yes" : "no");238 __cfadbg_print_safe(io, "Kernel I/O: Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, ctx->cq.id, age, cutoff, age > cutoff ? "yes" : "no"); 233 239 if(age <= cutoff) break HELP; 234 240 … … 635 641 636 642 // We can proceed to the fast path 637 if( !__alloc(ctx, &idx, 1) ) return false; 643 if( !__alloc(ctx, &idx, 1) ) { 644 /* paranoid */ verify( false ); // for now check if this happens, next time just abort the sleep. 645 return false; 646 } 638 647 639 648 // Allocation was successful … … 665 674 666 675 /* paranoid */ verify( sqe->user_data == (uintptr_t)&future ); 667 __submit ( ctx, &idx, 1, true);676 __submit_only( ctx, &idx, 1 ); 668 677 669 678 /* paranoid */ verify( proc == __cfaabi_tls.this_processor ); … … 676 685 iovec iov; 677 686 __atomic_acquire( &proc->io.ctx->cq.lock ); 687 688 __attribute__((used)) volatile bool was_reset = false; 678 689 679 690 with( proc->idle_wctx) { … … 687 698 iov.iov_len = sizeof(eventfd_t); 688 699 __kernel_read(proc, *ftr, iov, evfd ); 700 ftr->result = 0xDEADDEAD; 701 *((eventfd_t *)rdbuf) = 0xDEADDEADDEADDEAD; 702 was_reset = true; 689 703 } 690 704 } 691 705 692 __ioarbiter_flush( *proc->io.ctx ); 693 ioring_syscsll( *proc->io.ctx, 1, IORING_ENTER_GETEVENTS); 706 if( !__atomic_load_n( &proc->do_terminate, __ATOMIC_SEQ_CST ) ) { 707 __ioarbiter_flush( *proc->io.ctx ); 708 proc->idle_wctx.sleep_time = rdtscl(); 709 ioring_syscsll( *proc->io.ctx, 1, IORING_ENTER_GETEVENTS); 710 } 694 711 695 712 ready_schedule_lock(); 696 713 __cfa_do_drain( proc->io.ctx, proc->cltr ); 697 714 ready_schedule_unlock(); 715 716 asm volatile ("" :: "m" (was_reset)); 698 717 } 699 718 #endif
Note:
See TracChangeset
for help on using the changeset viewer.