Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/io.cfa

    ra757ba1 ra55472cc  
    610610                if( we ) {
    611611                        sigval_t value = { PREEMPT_IO };
    612                         __cfaabi_pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value);
     612                        pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value);
    613613                }
    614614
     
    639639                }
    640640        }
     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
    641729#endif
Note: See TracChangeset for help on using the changeset viewer.