* update_gap_stats() - update stats on gap sizes */
| 447 | * update_gap_stats() - update stats on gap sizes |
| 448 | */ |
| 449 | static void |
| 450 | update_gap_stats(struct gap_stats *stats, daddr_t posn) |
| 451 | { |
| 452 | daddr_t size; |
| 453 | int hi, lo, mid; |
| 454 | |
| 455 | if (!gap_stats_counting(stats)) { |
| 456 | stats->start = posn; |
| 457 | return; |
| 458 | } |
| 459 | size = posn - stats->start; |
| 460 | stats->start = SWAPBLK_NONE; |
| 461 | if (size > stats->max) |
| 462 | stats->max = size; |
| 463 | |
| 464 | /* |
| 465 | * Find the fibonacci range that contains size, |
| 466 | * expecting to find it in an early range. |
| 467 | */ |
| 468 | lo = 0; |
| 469 | hi = 1; |
| 470 | while (hi < nitems(fib) && fib[hi] <= size) { |
| 471 | lo = hi; |
| 472 | hi *= 2; |
| 473 | } |
| 474 | if (hi >= nitems(fib)) |
| 475 | hi = nitems(fib); |
| 476 | while (lo + 1 != hi) { |
| 477 | mid = (lo + hi) >> 1; |
| 478 | if (fib[mid] <= size) |
| 479 | lo = mid; |
| 480 | else |
| 481 | hi = mid; |
| 482 | } |
| 483 | stats->histo[lo]++; |
| 484 | if (lo > stats->max_bucket) |
| 485 | stats->max_bucket = lo; |
| 486 | stats->err += size - stats->avg; |
| 487 | stats->num++; |
| 488 | stats->avg += stats->err / stats->num; |
| 489 | stats->err %= stats->num; |
| 490 | } |
| 491 | |
| 492 | /* |
| 493 | * dump_gap_stats() - print stats on gap sizes |
no test coverage detected