Ignore:
Timestamp:
Jun 23, 2020, 4:42:58 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
de917da3
Parents:
b232745
Message:
  • Moved snzi and subqueues outside of ready_queue.cfa.
  • Added random.hfa with multiple prng.
  • Minor optimizations to ready-queue
  • Stats now track number of local pops( bias pops )
  • Fixed stats for io
  • Fixed calculaton of nprocessors
  • Fixed IO to work with new ready-queue
File:
1 edited

Legend:

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

    rb232745 r13c5e19  
    167167                struct {
    168168                        struct {
     169                                __processor_id_t id;
    169170                                void * stack;
    170171                                pthread_t kthrd;
     
    334335                if( this.io->cltr_flags & CFA_CLUSTER_IO_POLLER_USER_THREAD ) {
    335336                        with( this.io->poller.fast ) {
    336                                 /* paranoid */ verify( this.procs.head == 0p || &this == mainCluster );
    337                                 /* paranoid */ verify( this.idles.head == 0p || &this == mainCluster );
     337                                /* paranoid */ verify( this.nprocessors == 0 || &this == mainCluster );
     338                                /* paranoid */ verify( !ready_mutate_islocked() );
    338339
    339340                                // We need to adjust the clean-up based on where the thread is
    340341                                if( thrd.state == Ready || thrd.preempted != __NO_PREEMPTION ) {
    341342
    342                                         // This is the tricky case
    343                                         // The thread was preempted and now it is on the ready queue
    344 
    345                                         /* paranoid */ verify( thrd.next != 0p );                // The thread should be the last on the list
    346                                         /* paranoid */ verify( this.ready_queue.head == &thrd ); // The thread should be the only thing on the list
    347 
    348                                         // Remove the thread from the ready queue of this cluster
    349                                         this.ready_queue.head = 1p;
    350                                         thrd.next = 0p;
    351                                         __cfaabi_dbg_debug_do( thrd.unpark_stale = true );
    352 
    353                                         // Fixup the thread state
    354                                         thrd.state = Blocked;
    355                                         thrd.preempted = __NO_PREEMPTION;
     343                                        ready_schedule_lock( (struct __processor_id_t *)active_processor() );
     344
     345                                                // This is the tricky case
     346                                                // The thread was preempted and now it is on the ready queue
     347                                                // The thread should be the last on the list
     348                                                /* paranoid */ verify( thrd.link.next != 0p );
     349
     350                                                // Remove the thread from the ready queue of this cluster
     351                                                __attribute__((unused)) bool removed = remove_head( &this, &thrd );
     352                                                /* paranoid */ verify( removed );
     353                                                thrd.link.next = 0p;
     354                                                thrd.link.prev = 0p;
     355                                                __cfaabi_dbg_debug_do( thrd.unpark_stale = true );
     356
     357                                                // Fixup the thread state
     358                                                thrd.state = Blocked;
     359                                                thrd.ticket = 0;
     360                                                thrd.preempted = __NO_PREEMPTION;
     361
     362                                        ready_schedule_unlock( (struct __processor_id_t *)active_processor() );
    356363
    357364                                        // Pretend like the thread was blocked all along
     
    365372                                        thrd.curr_cluster = active_cluster();
    366373
    367                         // unpark the fast io_poller
     374                                        // unpark the fast io_poller
    368375                                        unpark( &thrd __cfaabi_dbg_ctx2 );
    369376                                }
     
    458465                }
    459466
    460                 verify( (shead + ret) == *ring.submit_q.head );
     467                uint32_t nhead = *ring.submit_q.head;
     468                verifyf( (shead + ret) == nhead, "Expected %u got %u\n", (shead + ret), nhead );
    461469
    462470                // Release the consumed SQEs
     
    474482                // update statistics
    475483                #if !defined(__CFA_NO_STATISTICS__)
    476                         __tls_stats()->io.submit_q.stats.submit_avg.rdy += to_submit;
    477                         __tls_stats()->io.submit_q.stats.submit_avg.csm += ret;
    478                         __tls_stats()->io.submit_q.stats.submit_avg.avl += avail;
    479                         __tls_stats()->io.submit_q.stats.submit_avg.cnt += 1;
     484                        __tls_stats()->io.submit_q.submit_avg.rdy += to_submit;
     485                        __tls_stats()->io.submit_q.submit_avg.csm += ret;
     486                        __tls_stats()->io.submit_q.submit_avg.avl += avail;
     487                        __tls_stats()->io.submit_q.submit_avg.cnt += 1;
    480488                #endif
    481489
     
    505513                        data->result = cqe.res;
    506514                        if(!in_kernel) { unpark( data->thrd __cfaabi_dbg_ctx2 ); }
    507                         else         { __unpark( data->thrd __cfaabi_dbg_ctx2 ); }
     515                        else         { __unpark( &ring.poller.slow.id, data->thrd __cfaabi_dbg_ctx2 ); }
    508516                }
    509517
     
    520528
    521529        static void * __io_poller_slow( void * arg ) {
     530                #if !defined( __CFA_NO_STATISTICS__ )
     531                        __stats_t local_stats;
     532                        __init_stats( &local_stats );
     533                        kernelTLS.this_stats = &local_stats;
     534                #endif
     535
    522536                cluster * cltr = (cluster *)arg;
    523537                struct __io_data & ring = *cltr->io;
     538
     539                ring.poller.slow.id.id = doregister( &ring.poller.slow.id );
    524540
    525541                sigset_t mask;
     
    551567                                // Update statistics
    552568                                #if !defined(__CFA_NO_STATISTICS__)
    553                                         __tls_stats()->io.complete_q.stats.completed_avg.val += count;
    554                                         __tls_stats()->io.complete_q.stats.completed_avg.slow_cnt += 1;
     569                                        __tls_stats()->io.complete_q.completed_avg.val += count;
     570                                        __tls_stats()->io.complete_q.completed_avg.slow_cnt += 1;
    555571                                #endif
    556572
    557573                                if(again) {
    558574                                        __cfadbg_print_safe(io_core, "Kernel I/O : Moving to ring %p to fast poller\n", &ring);
    559                                         __unpark( &ring.poller.fast.thrd __cfaabi_dbg_ctx2 );
     575                                        __unpark( &ring.poller.slow.id, &ring.poller.fast.thrd __cfaabi_dbg_ctx2 );
    560576                                        wait( ring.poller.sem );
    561577                                }
     
    571587                                // Update statistics
    572588                                #if !defined(__CFA_NO_STATISTICS__)
    573                                         __tls_stats()->io.complete_q.stats.completed_avg.val += count;
    574                                         __tls_stats()->io.complete_q.stats.completed_avg.slow_cnt += 1;
     589                                        __tls_stats()->io.complete_q.completed_avg.val += count;
     590                                        __tls_stats()->io.complete_q.completed_avg.slow_cnt += 1;
    575591                                #endif
    576592                        }
     
    578594
    579595                __cfadbg_print_safe(io_core, "Kernel I/O : Slow poller for ring %p stopping\n", &ring);
     596
     597                unregister( &ring.poller.slow.id );
    580598
    581599                return 0p;
     
    598616                        int count;
    599617                        bool again;
    600                         [count, again] = __drain_io( *this.ring, 0p, 0, false );
    601 
    602                         if(!again) reset++;
    603 
    604                         // Update statistics
    605                         #if !defined(__CFA_NO_STATISTICS__)
    606                                 __tls_stats()->io.complete_q.stats.completed_avg.val += count;
    607                                 __tls_stats()->io.complete_q.stats.completed_avg.fast_cnt += 1;
    608                         #endif
     618                        disable_interrupts();
     619                                [count, again] = __drain_io( *this.ring, 0p, 0, false );
     620
     621                                if(!again) reset++;
     622
     623                                // Update statistics
     624                                #if !defined(__CFA_NO_STATISTICS__)
     625                                        __tls_stats()->io.complete_q.completed_avg.val += count;
     626                                        __tls_stats()->io.complete_q.completed_avg.fast_cnt += 1;
     627                                #endif
     628                        enable_interrupts( __cfaabi_dbg_ctx );
    609629
    610630                        // If we got something, just yield and check again
     
    667687                verify( data != 0 );
    668688
     689                disable_interrupts();
     690
    669691                // Prepare the data we need
    670692                __attribute((unused)) int len   = 0;
     
    675697
    676698                // Loop around looking for an available spot
    677                 LOOKING: for() {
     699                for() {
    678700                        // Look through the list starting at some offset
    679701                        for(i; cnt) {
     
    688710                                        // update statistics
    689711                                        #if !defined(__CFA_NO_STATISTICS__)
    690                                                 __tls_stats()->io.submit_q.stats.alloc_avg.val   += len;
    691                                                 __tls_stats()->io.submit_q.stats.alloc_avg.block += block;
    692                                                 __tls_stats()->io.submit_q.stats.alloc_avg.cnt   += 1;
     712                                                __tls_stats()->io.submit_q.alloc_avg.val   += len;
     713                                                __tls_stats()->io.submit_q.alloc_avg.block += block;
     714                                                __tls_stats()->io.submit_q.alloc_avg.cnt   += 1;
    693715                                        #endif
     716
     717                                        enable_interrupts( __cfaabi_dbg_ctx );
    694718
    695719                                        // Success return the data
     
    710734                uint32_t * const tail = ring.submit_q.tail;
    711735                const uint32_t mask = *ring.submit_q.mask;
     736
     737                disable_interrupts();
    712738
    713739                // There are 2 submission schemes, check which one we are using
     
    743769                        // update statistics
    744770                        #if !defined(__CFA_NO_STATISTICS__)
    745                                 __tls_stats()->io.submit_q.stats.look_avg.val   += len;
    746                                 __tls_stats()->io.submit_q.stats.look_avg.block += block;
    747                                 __tls_stats()->io.submit_q.stats.look_avg.cnt   += 1;
     771                                __tls_stats()->io.submit_q.look_avg.val   += len;
     772                                __tls_stats()->io.submit_q.look_avg.block += block;
     773                                __tls_stats()->io.submit_q.look_avg.cnt   += 1;
    748774                        #endif
    749775
     
    772798                        // update statistics
    773799                        #if !defined(__CFA_NO_STATISTICS__)
    774                                 __tls_stats()->io.submit_q.stats.submit_avg.csm += 1;
    775                                 __tls_stats()->io.submit_q.stats.submit_avg.cnt += 1;
     800                                __tls_stats()->io.submit_q.submit_avg.csm += 1;
     801                                __tls_stats()->io.submit_q.submit_avg.cnt += 1;
    776802                        #endif
    777803
     
    780806                        __cfadbg_print_safe( io, "Kernel I/O : Performed io_submit for %p, returned %d\n", active_thread(), ret );
    781807                }
     808
     809                enable_interrupts( __cfaabi_dbg_ctx );
    782810        }
    783811
Note: See TracChangeset for help on using the changeset viewer.