MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / process_queue_complete

Method process_queue_complete

virtio-devices/src/block.rs:447–587  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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 }

Callers 1

handle_eventMethod · 0.80

Calls 11

memoryMethod · 0.80
find_inflight_requestMethod · 0.80
complete_asyncMethod · 0.80
request_typeMethod · 0.80
data_descriptorsMethod · 0.80
try_intoMethod · 0.80
status_addrMethod · 0.80
startMethod · 0.45
fsyncMethod · 0.45
derefMethod · 0.45

Tested by

no test coverage detected