Changeset a35b458 in mainline for kernel/test/synch/rcu1.c


Ignore:
Timestamp:
2018-03-02T20:10:49Z (7 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f1380b7
Parents:
3061bc1
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
Message:

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/test/synch/rcu1.c

    r3061bc1 ra35b458  
    6767                TPRINTF(".");
    6868        }
    69        
     69
    7070        if (!p->exited) {
    7171                *presult = ETIMEOUT;
     
    8181{
    8282        assert(thread[k] == NULL);
    83        
     83
    8484        thread[k] = thread_create(func, arg, TASK, THREAD_FLAG_NONE,
    8585                "test-rcu-thread");
    86                
     86
    8787        if(thread[k]) {
    8888                /* Distribute evenly. */
     
    9595{
    9696        size_t thread_cnt = get_thread_cnt();
    97        
     97
    9898        one_idx = 0;
    99        
     99
    100100        for (size_t i = 0; i < thread_cnt; ++i) {
    101101                run_thread(i, func, NULL);
     
    106106{
    107107        size_t thread_cnt = get_thread_cnt();
    108        
     108
    109109        one_idx = 0;
    110        
     110
    111111        for (size_t i = 0; i < thread_cnt; ++i) {
    112112                if (thread[i]) {
     
    115115                                errno_t ret = thread_join_timeout(thread[i], 5 * 1000 * 1000, 0);
    116116                                joined = (ret != ETIMEOUT);
    117                                
     117
    118118                                if (ret == EOK) {
    119119                                        TPRINTF("%zu threads remain\n", thread_cnt - i - 1);
    120120                                }
    121121                        } while (!joined);
    122                        
     122
    123123                        thread_detach(thread[i]);
    124124                        thread[i] = NULL;
     
    140140
    141141        --one_idx;
    142        
     142
    143143        if (thread[one_idx]) {
    144144                thread_join(thread[one_idx]);
     
    154154{
    155155        size_t nop_iters = (size_t)arg;
    156        
     156
    157157        TPRINTF("Enter nop-reader\n");
    158        
     158
    159159        for (size_t i = 0; i < nop_iters; ++i) {
    160160                rcu_read_lock();
    161161                rcu_read_unlock();
    162162        }
    163        
     163
    164164        TPRINTF("Exit nop-reader\n");
    165165}
     
    169169        assert(0 < steps && from <= to && 0 < to);
    170170        size_t inc = (to - from) / (steps - 1);
    171        
     171
    172172        for (size_t i = 0; i < steps - 1; ++i) {
    173173                seq[i] = i * inc + from;
    174174        }
    175        
     175
    176176        seq[steps - 1] = to;
    177177}
     
    181181        size_t seq[MAX_THREADS] = {0};
    182182        get_seq(100, 100000, get_thread_cnt(), seq);
    183        
     183
    184184        TPRINTF("\nRun %zu thr: repeat empty no-op reader sections\n", get_thread_cnt());
    185        
     185
    186186        for (size_t k = 0; k < get_thread_cnt(); ++k)
    187187                run_one(nop_reader, (void*)seq[k]);
    188        
     188
    189189        TPRINTF("\nJoining %zu no-op readers\n", get_thread_cnt());
    190190        join_all();
    191        
     191
    192192        return true;
    193193}
     
    202202        size_t nop_iters = (size_t)arg;
    203203        size_t outer_iters = iter_cnt / nop_iters;
    204        
     204
    205205        TPRINTF("Enter long-reader\n");
    206        
     206
    207207        for (size_t i = 0; i < outer_iters; ++i) {
    208208                rcu_read_lock();
    209                
     209
    210210                for (volatile size_t k = 0; k < nop_iters; ++k) {
    211211                        /* nop, but increment volatile k */
    212212                }
    213                
     213
    214214                rcu_read_unlock();
    215215        }
    216        
     216
    217217        TPRINTF("Exit long-reader\n");
    218218}
     
    222222        size_t seq[MAX_THREADS] = {0};
    223223        get_seq(10, 1000 * 1000, get_thread_cnt(), seq);
    224        
     224
    225225        TPRINTF("\nRun %zu thr: repeat long reader sections, will preempt, no cbs.\n",
    226226                get_thread_cnt());
    227        
     227
    228228        for (size_t k = 0; k < get_thread_cnt(); ++k)
    229229                run_one(long_reader, (void*)seq[k]);
    230        
     230
    231231        TPRINTF("\nJoining %zu readers with long reader sections.\n", get_thread_cnt());
    232232        join_all();
    233        
     233
    234234        return true;
    235235}
     
    253253                rcu_item_t *a = malloc(sizeof(rcu_item_t), FRAME_ATOMIC);
    254254                rcu_item_t *b = malloc(sizeof(rcu_item_t), FRAME_ATOMIC);
    255                
     255
    256256                if (a && b) {
    257257                        rcu_call(a, count_cb);
     
    272272        size_t exp_cnt = nop_updater_iters * get_thread_cnt();
    273273        size_t max_used_mem = sizeof(rcu_item_t) * exp_cnt;
    274        
     274
    275275        TPRINTF("\nRun %zu thr: post %zu no-op callbacks (%zu B used), no readers.\n",
    276276                get_thread_cnt(), exp_cnt, max_used_mem);
    277        
     277
    278278        run_all(nop_updater);
    279279        TPRINTF("\nJoining %zu no-op callback threads\n", get_thread_cnt());
    280280        join_all();
    281        
     281
    282282        size_t loop_cnt = 0, max_loops = 15;
    283283
     
    287287                thread_sleep(1);
    288288        }
    289        
     289
    290290        return loop_cnt < max_loops;
    291291}
     
    312312{
    313313        TPRINTF("Enter one-cb-reader\n");
    314        
    315         rcu_read_lock();
    316        
     314
     315        rcu_read_lock();
     316
    317317        item_w_cookie_t *item = malloc(sizeof(item_w_cookie_t), FRAME_ATOMIC);
    318        
     318
    319319        if (item) {
    320320                item->cookie = magic_cookie;
     
    323323                TPRINTF("\n[out-of-mem]\n");
    324324        }
    325        
     325
    326326        thread_sleep(1);
    327        
     327
    328328        rcu_read_unlock();
    329        
     329
    330330        TPRINTF("Exit one-cb-reader\n");
    331331}
     
    334334{
    335335        one_cb_is_done = 0;
    336        
     336
    337337        TPRINTF("\nRun a single reader that posts one callback.\n");
    338338        run_one(one_cb_reader, NULL);
    339339        join_one();
    340        
     340
    341341        TPRINTF("\nJoined one-cb reader, wait for callback.\n");
    342342        size_t loop_cnt = 0;
    343343        size_t max_loops = 4; /* 200 ms total */
    344        
     344
    345345        while (!one_cb_is_done && loop_cnt < max_loops) {
    346346                thread_usleep(50 * 1000);
    347347                ++loop_cnt;
    348348        }
    349        
     349
    350350        return one_cb_is_done;
    351351}
     
    373373{
    374374        seq_item_t *item = member_to_inst(rcu_item, seq_item_t, rcu);
    375        
     375
    376376        /* Racy but errs to the conservative side, so it is ok. */
    377377        if (max_upd_done_time < item->start_time) {
    378378                max_upd_done_time = item->start_time;
    379                
     379
    380380                /* Make updated time visible */
    381381                memory_barrier();
     
    393393#ifndef KARCH_riscv64
    394394        seq_work_t *work = (seq_work_t*)arg;
    395        
     395
    396396        /* Alternate between reader and updater roles. */
    397397        for (size_t k = 0; k < work->iters; ++k) {
     
    400400                        rcu_read_lock();
    401401                        atomic_count_t start_time = atomic_postinc(&cur_time);
    402                        
     402
    403403                        for (volatile size_t d = 0; d < 10 * i; ++d ){
    404404                                /* no-op */
    405405                        }
    406                        
     406
    407407                        /* Get most recent max_upd_done_time. */
    408408                        memory_barrier();
    409                        
     409
    410410                        if (start_time < max_upd_done_time) {
    411411                                seq_test_result = ERACE;
    412412                        }
    413                        
     413
    414414                        rcu_read_unlock();
    415                        
     415
    416416                        if (seq_test_result != EOK)
    417417                                return;
    418418                }
    419                
     419
    420420                /* Updater */
    421421                for (size_t i = 0; i < work->update_cnt; ++i) {
    422422                        seq_item_t *a = malloc(sizeof(seq_item_t), FRAME_ATOMIC);
    423423                        seq_item_t *b = malloc(sizeof(seq_item_t), FRAME_ATOMIC);
    424                        
     424
    425425                        if (a && b) {
    426426                                a->start_time = atomic_postinc(&cur_time);
    427427                                rcu_call(&a->rcu, seq_cb);
    428                                
     428
    429429                                b->start_time = atomic_postinc(&cur_time);
    430430                                rcu_call(&b->rcu, seq_cb);
     
    437437                        }
    438438                }
    439                
     439
    440440        }
    441441#else
     
    454454        size_t read_cnt[MAX_THREADS] = {0};
    455455        seq_work_t item[MAX_THREADS];
    456        
     456
    457457        size_t total_cbs = 0;
    458458        size_t max_used_mem = 0;
    459        
     459
    460460        get_seq(0, total_cnt, get_thread_cnt(), read_cnt);
    461        
     461
    462462
    463463        for (size_t i = 0; i < get_thread_cnt(); ++i) {
     
    465465                item[i].read_cnt = read_cnt[i];
    466466                item[i].iters = iters;
    467                
     467
    468468                total_cbs += 2 * iters * item[i].update_cnt;
    469469        }
    470        
     470
    471471        max_used_mem = total_cbs * sizeof(seq_item_t);
    472472
     
    474474        uint64_t mem_units;
    475475        bin_order_suffix(max_used_mem, &mem_units, &mem_suffix, false);
    476        
     476
    477477        TPRINTF("\nRun %zu th: check callback completion time in readers. "
    478478                "%zu callbacks total (max %" PRIu64 " %s used). Be patient.\n",
    479479                get_thread_cnt(), total_cbs, mem_units, mem_suffix);
    480        
     480
    481481        for (size_t i = 0; i < get_thread_cnt(); ++i) {
    482482                run_one(seq_func, &item[i]);
    483483        }
    484        
     484
    485485        TPRINTF("\nJoining %zu seq-threads\n", get_thread_cnt());
    486486        join_all();
    487        
     487
    488488        if (seq_test_result == ENOMEM) {
    489489                TPRINTF("\nErr: out-of mem\n");
     
    491491                TPRINTF("\nERROR: race detected!!\n");
    492492        }
    493        
     493
    494494        return seq_test_result == EOK;
    495495}
     
    510510        rcu_read_lock();
    511511        rcu_read_unlock();
    512        
     512
    513513        rcu_call((rcu_item_t*)arg, reader_unlocked);
    514        
    515         rcu_read_lock();
    516         rcu_read_lock();
    517        
     514
     515        rcu_read_lock();
     516        rcu_read_lock();
     517
    518518        /* Exit without unlocking the rcu reader section. */
    519519}
     
    522522{
    523523        TPRINTF("\nReader exits thread with rcu_lock\n");
    524        
     524
    525525        exited_t *p = malloc(sizeof(exited_t), FRAME_ATOMIC);
    526526        if (!p) {
     
    528528                return false;
    529529        }
    530                
     530
    531531        p->exited = false;
    532        
     532
    533533        run_one(reader_exit, p);
    534534        join_one();
    535        
     535
    536536        errno_t result = EOK;
    537537        wait_for_cb_exit(2 /* secs */, p, &result);
    538        
     538
    539539        if (result != EOK) {
    540540                TPRINTF("Err: RCU locked up after exiting from within a reader\n");
     
    543543                free(p);
    544544        }
    545        
     545
    546546        return result == EOK;
    547547}
     
    570570
    571571        TPRINTF("reader_prev{ ");
    572        
     572
    573573        rcu_read_lock();
    574574        scheduler();
     
    588588        preempt_t *p = (preempt_t*)arg;
    589589        assert(!p->e.exited);
    590        
     590
    591591        TPRINTF("reader_inside_cur{ ");
    592592        /*
     
    613613        preempt_t *p = (preempt_t*)arg;
    614614        assert(!p->e.exited);
    615        
     615
    616616        TPRINTF("reader_cur{ ");
    617617        rcu_read_lock();
     
    622622        /* Preempt while cur GP detection is running */
    623623        thread_sleep(1);
    624        
     624
    625625        /* Err: exited before this reader completed. */
    626626        if (p->e.exited)
     
    635635        preempt_t *p = (preempt_t*)arg;
    636636        assert(!p->e.exited);
    637        
     637
    638638        TPRINTF("reader_next1{ ");
    639639        rcu_read_lock();
     
    641641        /* Preempt before cur GP detection starts. */
    642642        scheduler();
    643        
     643
    644644        /* Start GP. */
    645645        rcu_call(&p->e.rcu, preempted_unlocked);
     
    657657        preempt_t *p = (preempt_t*)arg;
    658658        assert(!p->e.exited);
    659        
     659
    660660        TPRINTF("reader_next2{ ");
    661661        rcu_read_lock();
     
    663663        /* Preempt before cur GP detection starts. */
    664664        scheduler();
    665        
     665
    666666        /* Start GP. */
    667667        rcu_call(&p->e.rcu, preempted_unlocked);
     
    691691                return false;
    692692        }
    693        
     693
    694694        p->e.exited = false;
    695695        p->result = EOK;
    696        
     696
    697697        run_one(f, p);
    698698        join_one();
    699        
     699
    700700        /* Wait at most 4 secs. */
    701701        wait_for_cb_exit(4, &p->e, &p->result);
    702        
     702
    703703        if (p->result == EOK) {
    704704                free(p);
     
    714714{
    715715        TPRINTF("\nReaders will be preempted.\n");
    716        
     716
    717717        bool success = true;
    718718        bool ok = true;
    719        
     719
    720720        ok = do_one_reader_preempt(preempted_reader_prev,
    721721                "Err: preempted_reader_prev()\n");
    722722        success = success && ok;
    723        
     723
    724724        ok = do_one_reader_preempt(preempted_reader_inside_cur,
    725725                "Err: preempted_reader_inside_cur()\n");
    726726        success = success && ok;
    727        
     727
    728728        ok = do_one_reader_preempt(preempted_reader_cur,
    729729                "Err: preempted_reader_cur()\n");
    730730        success = success && ok;
    731        
     731
    732732        ok = do_one_reader_preempt(preempted_reader_next1,
    733733                "Err: preempted_reader_next1()\n");
     
    737737                "Err: preempted_reader_next2()\n");
    738738        success = success && ok;
    739        
     739
    740740        return success;
    741741}
     
    751751{
    752752        synch_t *synch = (synch_t *) arg;
    753        
     753
    754754        rcu_read_lock();
    755755
    756756        /* Order accesses of synch after the reader section begins. */
    757757        memory_barrier();
    758        
     758
    759759        synch->reader_running = true;
    760        
     760
    761761        while (!synch->synch_running) {
    762762                /* 0.5 sec */
    763763                delay(500 * 1000);
    764764        }
    765        
     765
    766766        /* Run for 1 sec */
    767767        delay(1000 * 1000);
    768768        /* thread_join() propagates done to do_synch() */
    769769        synch->reader_done = true;
    770        
     770
    771771        rcu_read_unlock();
    772772}
     
    776776{
    777777        TPRINTF("\nSynchronize with long reader\n");
    778        
     778
    779779        synch_t *synch = malloc(sizeof(synch_t), FRAME_ATOMIC);
    780        
     780
    781781        if (!synch) {
    782782                TPRINTF("[out-of-mem]\n");
    783783                return false;
    784784        }
    785        
     785
    786786        synch->reader_done = false;
    787787        synch->reader_running = false;
    788788        synch->synch_running = false;
    789        
     789
    790790        run_one(synch_reader, synch);
    791        
     791
    792792        /* Wait for the reader to enter its critical section. */
    793793        scheduler();
     
    795795                thread_usleep(500 * 1000);
    796796        }
    797        
     797
    798798        synch->synch_running = true;
    799        
     799
    800800        rcu_synchronize();
    801801        join_one();
    802        
    803        
     802
     803
    804804        if (synch->reader_done) {
    805805                free(synch);
     
    827827{
    828828        TPRINTF("\nrcu_barrier: Wait for outstanding rcu callbacks to complete\n");
    829        
     829
    830830        barrier_t *barrier = malloc(sizeof(barrier_t), FRAME_ATOMIC);
    831        
     831
    832832        if (!barrier) {
    833833                TPRINTF("[out-of-mem]\n");
    834834                return false;
    835835        }
    836        
     836
    837837        atomic_set(&barrier->done, 0);
    838        
     838
    839839        rcu_call(&barrier->rcu_item, barrier_callback);
    840840        rcu_barrier();
    841        
     841
    842842        if (1 == atomic_get(&barrier->done)) {
    843843                free(barrier);
     
    861861{
    862862        bool *done = (bool*) arg;
    863        
     863
    864864        while (!*done) {
    865865                rcu_read_lock();
    866866                rcu_read_unlock();
    867                
     867
    868868                /*
    869869                 * Do some work outside of the reader section so we are not always
     
    884884{
    885885        stress_t *s = (stress_t *)arg;
    886        
     886
    887887        for (size_t i = 0; i < s->iters; ++i) {
    888888                rcu_item_t *item = malloc(sizeof(rcu_item_t), FRAME_ATOMIC);
    889                
     889
    890890                if (item) {
    891891                        rcu_call(item, stress_cb);
     
    894894                        return;
    895895                }
    896                
     896
    897897                /* Print a dot if we make a progress of 1% */
    898898                if (s->master && 0 == (i % (s->iters/100)))
     
    907907        stress_t master = { .iters = cb_per_thread, .master = true };
    908908        stress_t worker = { .iters = cb_per_thread, .master = false };
    909        
     909
    910910        size_t thread_cnt = min(MAX_THREADS / 2, config.cpu_active);
    911911        /* Each cpu has one reader and one updater. */
    912912        size_t reader_cnt = thread_cnt;
    913913        size_t updater_cnt = thread_cnt;
    914        
     914
    915915        size_t exp_upd_calls = updater_cnt * cb_per_thread;
    916916        size_t max_used_mem = exp_upd_calls * sizeof(rcu_item_t);
    917        
     917
    918918        const char *mem_suffix;
    919919        uint64_t mem_units;
     
    923923                " total (max %" PRIu64 " %s used). Be very patient.\n",
    924924                reader_cnt, updater_cnt, exp_upd_calls, mem_units, mem_suffix);
    925        
     925
    926926        for (size_t k = 0; k < reader_cnt; ++k) {
    927927                run_one(stress_reader, &done);
     
    931931                run_one(stress_updater, k > 0 ? &worker : &master);
    932932        }
    933        
     933
    934934        TPRINTF("\nJoining %zu stress updaters.\n", updater_cnt);
    935        
     935
    936936        for (size_t k = 0; k < updater_cnt; ++k) {
    937937                join_one();
    938938        }
    939        
     939
    940940        done = true;
    941941
    942942        TPRINTF("\nJoining %zu stress nop-readers.\n", reader_cnt);
    943        
     943
    944944        join_all();
    945945        return true;
     
    957957{
    958958        expedite_t *e = (expedite_t *)arg;
    959        
     959
    960960        if (1 < e->count_down) {
    961961                --e->count_down;
    962                
     962
    963963                if (0 == (e->count_down % (e->total_cnt/100))) {
    964964                        TPRINTF("*");
    965965                }
    966                
     966
    967967                _rcu_call(e->expedite, &e->r, expedite_cb);
    968968        } else {
     
    979979        e.count_down = cnt;
    980980        e.expedite = exp;
    981        
     981
    982982        _rcu_call(e.expedite, &e.r, expedite_cb);
    983        
     983
    984984        while (0 < e.count_down) {
    985985                thread_sleep(1);
     
    992992        size_t exp_cnt = 1000 * 1000;
    993993        size_t normal_cnt = 1 * 1000;
    994        
     994
    995995        TPRINTF("Expedited: sequence of %zu rcu_calls\n", exp_cnt);
    996996        run_expedite(true, exp_cnt);
     
    10241024                { 0, NULL, NULL }
    10251025        };
    1026        
     1026
    10271027        bool success = true;
    10281028        bool ok = true;
    10291029        uint64_t completed_gps = rcu_completed_gps();
    10301030        uint64_t delta_gps = 0;
    1031        
     1031
    10321032        for (int i = 0; test_func[i].func; ++i) {
    10331033                if (!test_func[i].include) {
     
    10371037                        TPRINTF("\nRunning subtest %s.\n", test_func[i].desc);
    10381038                }
    1039                
     1039
    10401040                ok = test_func[i].func();
    10411041                success = success && ok;
    1042                
     1042
    10431043                delta_gps = rcu_completed_gps() - completed_gps;
    10441044                completed_gps += delta_gps;
Note: See TracChangeset for help on using the changeset viewer.