Changeset 2e16033 in mainline
- Timestamp:
- 2012-07-12T16:02:51Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c14762e
- Parents:
- 935e28c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/test/synch/rcu1.c
r935e28c r2e16033 33 33 #include <proc/thread.h> 34 34 #include <macros.h> 35 #include <str.h> 35 36 36 37 #include <synch/rcu.h> … … 237 238 238 239 static atomic_t nop_callbacks_cnt = {0}; 240 /* Must be even. */ 239 241 static const int nop_updater_iters = 10000; 240 242 … … 247 249 static void nop_updater(void *arg) 248 250 { 249 for (int i = 0; i < nop_updater_iters; ++i){251 for (int i = 0; i < nop_updater_iters; i += 2){ 250 252 rcu_item_t *a = malloc(sizeof(rcu_item_t), 0); 251 253 rcu_item_t *b = malloc(sizeof(rcu_item_t), 0); … … 264 266 { 265 267 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); 269 274 270 275 run_all(nop_updater); … … 273 278 274 279 size_t loop_cnt = 0, max_loops = 15; 275 size_t exp_cnt = 2 * nop_updater_iters * get_thread_cnt();276 280 277 281 while (exp_cnt != atomic_get(&nop_callbacks_cnt) && loop_cnt < max_loops) { … … 309 313 310 314 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 } 314 322 315 323 thread_sleep(1); … … 330 338 TPRINTF("\nJoined one-cb reader, wait for cb.\n"); 331 339 size_t loop_cnt = 0; 332 size_t max_loops = 4; 340 size_t max_loops = 4; /* 200 ms */ 333 341 334 342 while (!one_cb_is_done && loop_cnt < max_loops) { … … 385 393 atomic_count_t start_time = atomic_postinc(&cur_time); 386 394 387 for (volatile size_t d = 0; d < 10 *i; ++d ){395 for (volatile size_t d = 0; d < 10 * i; ++d ){ 388 396 /* no-op */ 389 397 } … … 403 411 404 412 /* Updater */ 405 for (size_t i = 0; i < work->update_cnt; i += 2) {413 for (size_t i = 0; i < work->update_cnt; ++i) { 406 414 seq_item_t *a = malloc(sizeof(seq_item_t), 0); 407 415 seq_item_t *b = malloc(sizeof(seq_item_t), 0); … … 414 422 rcu_call(&b->rcu, seq_cb); 415 423 } else { 416 /* can leak a bit of mem */417 424 TPRINTF("\n[out-of-mem]\n"); 418 425 seq_test_result = ENOMEM; 426 free(a); 427 free(b); 419 428 return; 420 429 } … … 435 444 seq_work_t item[MAX_THREADS]; 436 445 446 size_t total_cbs = 0; 447 size_t max_used_mem = 0; 448 437 449 get_seq(0, total_cnt, get_thread_cnt(), read_cnt); 438 450 451 439 452 for (size_t i = 0; i < get_thread_cnt(); ++i) { 440 453 item[i].update_cnt = total_cnt - read_cnt[i]; 441 454 item[i].read_cnt = read_cnt[i]; 442 455 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); 447 469 448 470 for (size_t i = 0; i < get_thread_cnt(); ++i) { … … 796 818 /* 5 us * 1000 * 1000 iters == 5 sec per updater thread */ 797 819 delay(5); 820 free(item); 798 821 } 799 822 … … 808 831 rcu_call(item, stress_cb); 809 832 833 /* Print a dot if we make progress of 1% */ 810 834 if (s->master && 0 == (i % (s->iters/100 + 1))) 811 835 TPRINTF("."); … … 825 849 size_t reader_cnt = thread_cnt; 826 850 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); 830 862 831 863 for (size_t k = 0; k < reader_cnt; ++k) { … … 872 904 _rcu_call(e->expedite, &e->r, expedite_cb); 873 905 } else { 906 /* Do not touch any of e's mem after we declare we're done with it. */ 874 907 memory_barrier(); 875 908 e->count_down = 0; … … 937 970 TPRINTF("\nSubtest %s() skipped.\n", test_func[i].desc); 938 971 continue; 972 } else { 973 TPRINTF("\nRunning subtest %s.\n", test_func[i].desc); 939 974 } 940 975
Note:
See TracChangeset
for help on using the changeset viewer.