Changeset 3bacee1 in mainline for kernel/test/synch/rcu1.c
- Timestamp:
- 2018-04-12T16:27:17Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3cf22f9
- Parents:
- 76d0981d
- git-author:
- Jiri Svoboda <jiri@…> (2018-04-11 19:25:33)
- git-committer:
- Jiri Svoboda <jiri@…> (2018-04-12 16:27:17)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/test/synch/rcu1.c
r76d0981d r3bacee1 78 78 } 79 79 80 static void run_thread(size_t k, void (*func)(void *), void *arg)80 static void run_thread(size_t k, void (*func)(void *), void *arg) 81 81 { 82 82 assert(thread[k] == NULL); 83 83 84 84 thread[k] = thread_create(func, arg, TASK, THREAD_FLAG_NONE, 85 86 87 if (thread[k]) {85 "test-rcu-thread"); 86 87 if (thread[k]) { 88 88 /* Distribute evenly. */ 89 89 thread_wire(thread[k], &cpus[k % config.cpu_active]); … … 92 92 } 93 93 94 static void run_all(void (*func)(void *))94 static void run_all(void (*func)(void *)) 95 95 { 96 96 size_t thread_cnt = get_thread_cnt(); … … 127 127 } 128 128 129 static void run_one(void (*func)(void *), void *arg)129 static void run_one(void (*func)(void *), void *arg) 130 130 { 131 131 assert(one_idx < MAX_THREADS); … … 179 179 static bool do_nop_readers(void) 180 180 { 181 size_t seq[MAX_THREADS] = { 0};181 size_t seq[MAX_THREADS] = { 0 }; 182 182 get_seq(100, 100000, get_thread_cnt(), seq); 183 183 … … 185 185 186 186 for (size_t k = 0; k < get_thread_cnt(); ++k) 187 run_one(nop_reader, (void *)seq[k]);187 run_one(nop_reader, (void *)seq[k]); 188 188 189 189 TPRINTF("\nJoining %zu no-op readers\n", get_thread_cnt()); … … 220 220 static bool do_long_readers(void) 221 221 { 222 size_t seq[MAX_THREADS] = { 0};222 size_t seq[MAX_THREADS] = { 0 }; 223 223 get_seq(10, 1000 * 1000, get_thread_cnt(), seq); 224 224 225 225 TPRINTF("\nRun %zu thr: repeat long reader sections, will preempt, no cbs.\n", 226 226 get_thread_cnt()); 227 227 228 228 for (size_t k = 0; k < get_thread_cnt(); ++k) 229 run_one(long_reader, (void *)seq[k]);229 run_one(long_reader, (void *)seq[k]); 230 230 231 231 TPRINTF("\nJoining %zu readers with long reader sections.\n", get_thread_cnt()); … … 238 238 239 239 240 static atomic_t nop_callbacks_cnt = { 0};240 static atomic_t nop_callbacks_cnt = { 0 }; 241 241 /* Must be even. */ 242 242 static const int nop_updater_iters = 10000; … … 250 250 static void nop_updater(void *arg) 251 251 { 252 for (int i = 0; i < nop_updater_iters; i += 2) {252 for (int i = 0; i < nop_updater_iters; i += 2) { 253 253 rcu_item_t *a = malloc(sizeof(rcu_item_t), FRAME_ATOMIC); 254 254 rcu_item_t *b = malloc(sizeof(rcu_item_t), FRAME_ATOMIC); … … 274 274 275 275 TPRINTF("\nRun %zu thr: post %zu no-op callbacks (%zu B used), no readers.\n", 276 276 get_thread_cnt(), exp_cnt, max_used_mem); 277 277 278 278 run_all(nop_updater); … … 303 303 static void one_cb_done(rcu_item_t *item) 304 304 { 305 assert( 305 assert(((item_w_cookie_t *)item)->cookie == magic_cookie); 306 306 one_cb_is_done = 1; 307 307 TPRINTF("Callback()\n"); … … 367 367 static errno_t seq_test_result = EOK; 368 368 369 static atomic_t cur_time = { 1};370 static atomic_count_t max_upd_done_time = { 0};369 static atomic_t cur_time = { 1 }; 370 static atomic_count_t max_upd_done_time = { 0 }; 371 371 372 372 static void seq_cb(rcu_item_t *rcu_item) … … 392 392 */ 393 393 #ifndef KARCH_riscv64 394 seq_work_t *work = (seq_work_t *)arg;394 seq_work_t *work = (seq_work_t *)arg; 395 395 396 396 /* Alternate between reader and updater roles. */ … … 401 401 atomic_count_t start_time = atomic_postinc(&cur_time); 402 402 403 for (volatile size_t d = 0; d < 10 * i; ++d ){403 for (volatile size_t d = 0; d < 10 * i; ++d) { 404 404 /* no-op */ 405 405 } … … 452 452 const size_t iters = 100; 453 453 const size_t total_cnt = 1000; 454 size_t read_cnt[MAX_THREADS] = { 0};454 size_t read_cnt[MAX_THREADS] = { 0 }; 455 455 seq_work_t item[MAX_THREADS]; 456 456 … … 476 476 477 477 TPRINTF("\nRun %zu th: check callback completion time in readers. " 478 479 478 "%zu callbacks total (max %" PRIu64 " %s used). Be patient.\n", 479 get_thread_cnt(), total_cbs, mem_units, mem_suffix); 480 480 481 481 for (size_t i = 0; i < get_thread_cnt(); ++i) { … … 500 500 static void reader_unlocked(rcu_item_t *item) 501 501 { 502 exited_t *p = (exited_t *)item;502 exited_t *p = (exited_t *)item; 503 503 p->exited = true; 504 504 } … … 511 511 rcu_read_unlock(); 512 512 513 rcu_call((rcu_item_t *)arg, reader_unlocked);513 rcu_call((rcu_item_t *)arg, reader_unlocked); 514 514 515 515 rcu_read_lock(); … … 566 566 static void preempted_reader_prev(void *arg) 567 567 { 568 preempt_t *p = (preempt_t *)arg;568 preempt_t *p = (preempt_t *)arg; 569 569 assert(!p->e.exited); 570 570 … … 586 586 static void preempted_reader_inside_cur(void *arg) 587 587 { 588 preempt_t *p = (preempt_t *)arg;588 preempt_t *p = (preempt_t *)arg; 589 589 assert(!p->e.exited); 590 590 … … 611 611 static void preempted_reader_cur(void *arg) 612 612 { 613 preempt_t *p = (preempt_t *)arg;613 preempt_t *p = (preempt_t *)arg; 614 614 assert(!p->e.exited); 615 615 … … 633 633 static void preempted_reader_next1(void *arg) 634 634 { 635 preempt_t *p = (preempt_t *)arg;635 preempt_t *p = (preempt_t *)arg; 636 636 assert(!p->e.exited); 637 637 … … 655 655 static void preempted_reader_next2(void *arg) 656 656 { 657 preempt_t *p = (preempt_t *)arg;657 preempt_t *p = (preempt_t *)arg; 658 658 assert(!p->e.exited); 659 659 … … 684 684 685 685 686 static bool do_one_reader_preempt(void (*f)(void *), const char *err)686 static bool do_one_reader_preempt(void (*f)(void *), const char *err) 687 687 { 688 688 preempt_t *p = malloc(sizeof(preempt_t), FRAME_ATOMIC); … … 719 719 720 720 ok = do_one_reader_preempt(preempted_reader_prev, 721 721 "Err: preempted_reader_prev()\n"); 722 722 success = success && ok; 723 723 724 724 ok = do_one_reader_preempt(preempted_reader_inside_cur, 725 725 "Err: preempted_reader_inside_cur()\n"); 726 726 success = success && ok; 727 727 728 728 ok = do_one_reader_preempt(preempted_reader_cur, 729 729 "Err: preempted_reader_cur()\n"); 730 730 success = success && ok; 731 731 732 732 ok = do_one_reader_preempt(preempted_reader_next1, 733 733 "Err: preempted_reader_next1()\n"); 734 734 success = success && ok; 735 735 736 736 ok = do_one_reader_preempt(preempted_reader_next2, 737 737 "Err: preempted_reader_next2()\n"); 738 738 success = success && ok; 739 739 … … 860 860 static void stress_reader(void *arg) 861 861 { 862 bool *done = (bool *) arg;862 bool *done = (bool *) arg; 863 863 864 864 while (!*done) { … … 896 896 897 897 /* Print a dot if we make a progress of 1% */ 898 if (s->master && 0 == (i % (s->iters /100)))898 if (s->master && 0 == (i % (s->iters / 100))) 899 899 TPRINTF("."); 900 900 } … … 921 921 922 922 TPRINTF("\nStress: Run %zu nop-readers and %zu updaters. %zu callbacks" 923 924 923 " total (max %" PRIu64 " %s used). Be very patient.\n", 924 reader_cnt, updater_cnt, exp_upd_calls, mem_units, mem_suffix); 925 925 926 926 for (size_t k = 0; k < reader_cnt; ++k) { … … 961 961 --e->count_down; 962 962 963 if (0 == (e->count_down % (e->total_cnt /100))) {963 if (0 == (e->count_down % (e->total_cnt / 100))) { 964 964 TPRINTF("*"); 965 965 } … … 1046 1046 if (ok) { 1047 1047 TPRINTF("\nSubtest %s() ok (GPs: %" PRIu64 ").\n", 1048 1048 test_func[i].desc, delta_gps); 1049 1049 } else { 1050 1050 TPRINTF("\nFailed: %s(). Pausing for 5 secs.\n", test_func[i].desc);
Note:
See TracChangeset
for help on using the changeset viewer.