Changeset 2e16033 in mainline for kernel/test/synch/rcu1.c


Ignore:
Timestamp:
2012-07-12T16:02:51Z (12 years ago)
Author:
Adam Hraska <adam.hraska+hos@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c14762e
Parents:
935e28c
Message:

rcu: Fixed memory leak in rcu1 test.

File:
1 edited

Legend:

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

    r935e28c r2e16033  
    3333#include <proc/thread.h>
    3434#include <macros.h>
     35#include <str.h>
    3536
    3637#include <synch/rcu.h>
     
    237238
    238239static atomic_t nop_callbacks_cnt = {0};
     240/* Must be even. */
    239241static const int nop_updater_iters = 10000;
    240242
     
    247249static void nop_updater(void *arg)
    248250{
    249         for (int i = 0; i < nop_updater_iters; ++i){
     251        for (int i = 0; i < nop_updater_iters; i += 2){
    250252                rcu_item_t *a = malloc(sizeof(rcu_item_t), 0);
    251253                rcu_item_t *b = malloc(sizeof(rcu_item_t), 0);
     
    264266{
    265267        atomic_set(&nop_callbacks_cnt, 0);
    266        
    267         TPRINTF("\nRun %zu thr: post many no-op callbacks, no readers.\n",
    268                 get_thread_cnt());
     268
     269        size_t exp_cnt = nop_updater_iters * get_thread_cnt();
     270        size_t max_used_mem = sizeof(rcu_item_t) * exp_cnt;
     271       
     272        TPRINTF("\nRun %zu thr: post %zu no-op callbacks (%zu B used), no readers.\n",
     273                get_thread_cnt(), exp_cnt, max_used_mem);
    269274       
    270275        run_all(nop_updater);
     
    273278       
    274279        size_t loop_cnt = 0, max_loops = 15;
    275         size_t exp_cnt = 2 * nop_updater_iters * get_thread_cnt();
    276280
    277281        while (exp_cnt != atomic_get(&nop_callbacks_cnt) && loop_cnt < max_loops) {
     
    309313       
    310314        item_w_cookie_t *item = malloc(sizeof(item_w_cookie_t), 0);
    311         item->cookie = magic_cookie;
    312        
    313         rcu_call(&item->rcu_item, one_cb_done);
     315       
     316        if (item) {
     317                item->cookie = magic_cookie;
     318                rcu_call(&item->rcu_item, one_cb_done);
     319        } else {
     320                TPRINTF("\n[out-of-mem]\n");
     321        }
    314322       
    315323        thread_sleep(1);
     
    330338        TPRINTF("\nJoined one-cb reader, wait for cb.\n");
    331339        size_t loop_cnt = 0;
    332         size_t max_loops = 4;
     340        size_t max_loops = 4; /* 200 ms */
    333341       
    334342        while (!one_cb_is_done && loop_cnt < max_loops) {
     
    385393                        atomic_count_t start_time = atomic_postinc(&cur_time);
    386394                       
    387                         for (volatile size_t d = 0; d < 10*i; ++d ){
     395                        for (volatile size_t d = 0; d < 10 * i; ++d ){
    388396                                /* no-op */
    389397                        }
     
    403411               
    404412                /* Updater */
    405                 for (size_t i = 0; i < work->update_cnt; i += 2) {
     413                for (size_t i = 0; i < work->update_cnt; ++i) {
    406414                        seq_item_t *a = malloc(sizeof(seq_item_t), 0);
    407415                        seq_item_t *b = malloc(sizeof(seq_item_t), 0);
     
    414422                                rcu_call(&b->rcu, seq_cb);
    415423                        } else {
    416                                 /* can leak a bit of mem */
    417424                                TPRINTF("\n[out-of-mem]\n");
    418425                                seq_test_result = ENOMEM;
     426                                free(a);
     427                                free(b);
    419428                                return;
    420429                        }
     
    435444        seq_work_t item[MAX_THREADS];
    436445       
     446        size_t total_cbs = 0;
     447        size_t max_used_mem = 0;
     448       
    437449        get_seq(0, total_cnt, get_thread_cnt(), read_cnt);
    438450       
     451
    439452        for (size_t i = 0; i < get_thread_cnt(); ++i) {
    440453                item[i].update_cnt = total_cnt - read_cnt[i];
    441454                item[i].read_cnt = read_cnt[i];
    442455                item[i].iters = iters;
    443         }
    444        
    445         TPRINTF("\nRun %zu th: check callback completion time in readers. ~%zu cbs/"
    446                 "thread. Be patient.\n", get_thread_cnt(),      iters * total_cnt * 2);
     456               
     457                total_cbs += 2 * iters * item[i].update_cnt;
     458        }
     459       
     460        max_used_mem = total_cbs * sizeof(seq_item_t);
     461
     462        const char *mem_suffix;
     463        uint64_t mem_units;
     464        bin_order_suffix(max_used_mem, &mem_units, &mem_suffix, false);
     465       
     466        TPRINTF("\nRun %zu th: check callback completion time in readers. "
     467                "%zu callbacks total (max %" PRIu64 " %s used). Be patient.\n",
     468                get_thread_cnt(), total_cbs, mem_units, mem_suffix);
    447469       
    448470        for (size_t i = 0; i < get_thread_cnt(); ++i) {
     
    796818        /* 5 us * 1000 * 1000 iters == 5 sec per updater thread */
    797819        delay(5);
     820        free(item);
    798821}
    799822
     
    808831                        rcu_call(item, stress_cb);
    809832               
     833                /* Print a dot if we make progress of 1% */
    810834                if (s->master && 0 == (i % (s->iters/100 + 1)))
    811835                        TPRINTF(".");
     
    825849        size_t reader_cnt = thread_cnt;
    826850        size_t updater_cnt = thread_cnt;
    827 
    828         TPRINTF("\nStress: Run %zu nop-readers and %zu updaters. %zu cbs/updater. "
    829                 "Be very patient.\n", reader_cnt, updater_cnt, cb_per_thread);
     851       
     852        size_t exp_upd_calls = updater_cnt * cb_per_thread;
     853        size_t max_used_mem = exp_upd_calls * sizeof(rcu_item_t);
     854       
     855        const char *mem_suffix;
     856        uint64_t mem_units;
     857        bin_order_suffix(max_used_mem, &mem_units, &mem_suffix, false);
     858
     859        TPRINTF("\nStress: Run %zu nop-readers and %zu updaters. %zu callbacks "
     860                " total (max %" PRIu64 " %s used). Be very patient.\n",
     861                reader_cnt, updater_cnt, exp_upd_calls, mem_units, mem_suffix);
    830862       
    831863        for (size_t k = 0; k < reader_cnt; ++k) {
     
    872904                _rcu_call(e->expedite, &e->r, expedite_cb);
    873905        } else {
     906                /* Do not touch any of e's mem after we declare we're done with it. */
    874907                memory_barrier();
    875908                e->count_down = 0;
     
    937970                        TPRINTF("\nSubtest %s() skipped.\n", test_func[i].desc);
    938971                        continue;
     972                } else {
     973                        TPRINTF("\nRunning subtest %s.\n", test_func[i].desc);
    939974                }
    940975               
Note: See TracChangeset for help on using the changeset viewer.