Ignore:
File:
1 edited

Legend:

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

    rec19b21 rbb58825  
    314314        }
    315315
     316        extern void signal_block( int sig );
     317        extern void signal_unblock( int sig );
     318
    316319        static void __io_create( __io_data & this, const io_context_params & params_in ) {
    317320                // Step 1 : call to setup
     
    398401                        const __u32 num = *sq.num;
    399402                        for( i; num ) {
    400                                 __sqe_clean( &sq.sqes[i] );
     403                                sq.sqes[i].opcode = IORING_OP_LAST;
     404                                sq.sqes[i].user_data = 3ul64;
    401405                        }
    402406                }
     
    429433
    430434                // Step 4 : eventfd
    431                 int efd;
    432                 for() {
    433                         efd = eventfd(0, 0);
    434                         if (efd < 0) {
    435                                 if (errno == EINTR) continue;
    436                                 abort("KERNEL ERROR: IO_URING EVENTFD - %s\n", strerror(errno));
    437                         }
    438                         break;
    439                 }
    440 
    441                 int ret;
    442                 for() {
    443                         ret = syscall( __NR_io_uring_register, fd, IORING_REGISTER_EVENTFD, &efd, 1);
    444                         if (ret < 0) {
    445                                 if (errno == EINTR) continue;
    446                                 abort("KERNEL ERROR: IO_URING EVENTFD REGISTER - %s\n", strerror(errno));
    447                         }
    448                         break;
    449                 }
     435                // io_uring_register is so f*cking slow on some machine that it
     436                // will never succeed if preemption isn't hard blocked
     437                signal_block( SIGUSR1 );
     438
     439                int efd = eventfd(0, 0);
     440                if (efd < 0) {
     441                        abort("KERNEL ERROR: IO_URING EVENTFD - %s\n", strerror(errno));
     442                }
     443
     444                int ret = syscall( __NR_io_uring_register, fd, IORING_REGISTER_EVENTFD, &efd, 1);
     445                if (ret < 0) {
     446                        abort("KERNEL ERROR: IO_URING EVENTFD REGISTER - %s\n", strerror(errno));
     447                }
     448
     449                signal_unblock( SIGUSR1 );
    450450
    451451                // some paranoid checks
Note: See TracChangeset for help on using the changeset viewer.