(&mut self)
| 445 | } |
| 446 | |
| 447 | fn process_queue_complete(&mut self) -> Result<()> { |
| 448 | let mem = self.mem.memory(); |
| 449 | let mut read_bytes = Wrapping(0); |
| 450 | let mut write_bytes = Wrapping(0); |
| 451 | let mut read_ops = Wrapping(0); |
| 452 | let mut write_ops = Wrapping(0); |
| 453 | |
| 454 | while let Some((user_data, result)) = self.disk_image.next_completed_request() { |
| 455 | let desc_index = user_data as u16; |
| 456 | |
| 457 | let mut request = self.find_inflight_request(desc_index)?; |
| 458 | |
| 459 | request |
| 460 | .complete_async(&mem) |
| 461 | .map_err(Error::RequestCompleting)?; |
| 462 | |
| 463 | let latency = request.start().elapsed().as_micros() as u64; |
| 464 | let read_ops_last = self.counters.read_ops.load(Ordering::Relaxed); |
| 465 | let write_ops_last = self.counters.write_ops.load(Ordering::Relaxed); |
| 466 | let read_max = self.counters.read_latency_max.load(Ordering::Relaxed); |
| 467 | let write_max = self.counters.write_latency_max.load(Ordering::Relaxed); |
| 468 | let mut read_avg = self.counters.read_latency_avg.load(Ordering::Relaxed); |
| 469 | let mut write_avg = self.counters.write_latency_avg.load(Ordering::Relaxed); |
| 470 | let (status, len) = if result >= 0 { |
| 471 | match request.request_type() { |
| 472 | RequestType::In => { |
| 473 | for (_, data_len) in request.data_descriptors() { |
| 474 | read_bytes += Wrapping(*data_len as u64); |
| 475 | } |
| 476 | read_ops += Wrapping(1); |
| 477 | if latency < self.counters.read_latency_min.load(Ordering::Relaxed) { |
| 478 | self.counters |
| 479 | .read_latency_min |
| 480 | .store(latency, Ordering::Relaxed); |
| 481 | } |
| 482 | if latency > read_max || read_max == u64::MAX { |
| 483 | self.counters |
| 484 | .read_latency_max |
| 485 | .store(latency, Ordering::Relaxed); |
| 486 | } |
| 487 | |
| 488 | // Special case the first real latency report |
| 489 | read_avg = if read_avg == u64::MAX { |
| 490 | latency * LATENCY_SCALE |
| 491 | } else { |
| 492 | // Cumulative average is guaranteed to be |
| 493 | // positive if being calculated properly |
| 494 | (read_avg as i64 |
| 495 | + ((latency * LATENCY_SCALE) as i64 - read_avg as i64) |
| 496 | / (read_ops_last + read_ops.0) as i64) |
| 497 | .try_into() |
| 498 | .unwrap() |
| 499 | }; |
| 500 | } |
| 501 | RequestType::Out => { |
| 502 | if !request.writeback { |
| 503 | self.disk_image.fsync(None).map_err(Error::Fsync)?; |
| 504 | } |
no test coverage detected