Changes in libcfa/src/concurrency/io.cfa [a757ba1:a55472cc]
- File:
-
- 1 edited
-
libcfa/src/concurrency/io.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/io.cfa
ra757ba1 ra55472cc 610 610 if( we ) { 611 611 sigval_t value = { PREEMPT_IO }; 612 __cfaabi_pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value);612 pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value); 613 613 } 614 614 … … 639 639 } 640 640 } 641 642 #if defined(CFA_WITH_IO_URING_IDLE) 643 bool __kernel_read(struct processor * proc, io_future_t & future, iovec & iov, int fd) { 644 io_context$ * ctx = proc->io.ctx; 645 /* paranoid */ verify( ! __preemption_enabled() ); 646 /* paranoid */ verify( proc == __cfaabi_tls.this_processor ); 647 /* paranoid */ verify( ctx ); 648 649 __u32 idx; 650 struct io_uring_sqe * sqe; 651 652 // We can proceed to the fast path 653 if( !__alloc(ctx, &idx, 1) ) { 654 /* paranoid */ verify( false ); // for now check if this happens, next time just abort the sleep. 655 return false; 656 } 657 658 // Allocation was successful 659 __fill( &sqe, 1, &idx, ctx ); 660 661 sqe->user_data = (uintptr_t)&future; 662 sqe->flags = 0; 663 sqe->fd = fd; 664 sqe->off = 0; 665 sqe->ioprio = 0; 666 sqe->fsync_flags = 0; 667 sqe->__pad2[0] = 0; 668 sqe->__pad2[1] = 0; 669 sqe->__pad2[2] = 0; 670 671 #if defined(CFA_HAVE_IORING_OP_READ) 672 sqe->opcode = IORING_OP_READ; 673 sqe->addr = (uint64_t)iov.iov_base; 674 sqe->len = iov.iov_len; 675 #elif defined(CFA_HAVE_READV) && defined(CFA_HAVE_IORING_OP_READV) 676 sqe->opcode = IORING_OP_READV; 677 sqe->addr = (uintptr_t)&iov; 678 sqe->len = 1; 679 #else 680 #error CFA_WITH_IO_URING_IDLE but none of CFA_HAVE_READV, CFA_HAVE_IORING_OP_READV or CFA_HAVE_IORING_OP_READ defined 681 #endif 682 683 asm volatile("": : :"memory"); 684 685 /* paranoid */ verify( sqe->user_data == (uintptr_t)&future ); 686 __submit_only( ctx, &idx, 1 ); 687 688 /* paranoid */ verify( proc == __cfaabi_tls.this_processor ); 689 /* paranoid */ verify( ! __preemption_enabled() ); 690 691 return true; 692 } 693 694 void __cfa_io_idle( struct processor * proc ) { 695 iovec iov; 696 __atomic_acquire( &proc->io.ctx->cq.lock ); 697 698 __attribute__((used)) volatile bool was_reset = false; 699 700 with( proc->idle_wctx) { 701 702 // Do we already have a pending read 703 if(available(*ftr)) { 704 // There is no pending read, we need to add one 705 reset(*ftr); 706 707 iov.iov_base = rdbuf; 708 iov.iov_len = sizeof(eventfd_t); 709 __kernel_read(proc, *ftr, iov, evfd ); 710 ftr->result = 0xDEADDEAD; 711 *((eventfd_t *)rdbuf) = 0xDEADDEADDEADDEAD; 712 was_reset = true; 713 } 714 } 715 716 if( !__atomic_load_n( &proc->do_terminate, __ATOMIC_SEQ_CST ) ) { 717 __ioarbiter_flush( *proc->io.ctx ); 718 proc->idle_wctx.sleep_time = rdtscl(); 719 ioring_syscsll( *proc->io.ctx, 1, IORING_ENTER_GETEVENTS); 720 } 721 722 ready_schedule_lock(); 723 __cfa_do_drain( proc->io.ctx, proc->cltr ); 724 ready_schedule_unlock(); 725 726 asm volatile ("" :: "m" (was_reset)); 727 } 728 #endif 641 729 #endif
Note:
See TracChangeset
for help on using the changeset viewer.