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

Method process_reporting_queue

virtio-devices/src/balloon.rs:365–401  ·  view source on GitHub ↗
(&mut self, queue_index: usize)

Source from the content-addressed store, hash-verified

363 }
364
365 fn process_reporting_queue(&mut self, queue_index: usize) -> result::Result<(), Error> {
366 let mut used_descs = false;
367 while let Some(mut desc_chain) =
368 self.queues[queue_index].pop_descriptor_chain(self.mem.memory())
369 {
370 let mut descs_len = 0;
371 while let Some(desc) = desc_chain.next() {
372 descs_len += desc.len();
373 let addr = match desc
374 .addr()
375 .translate_gva(self.access_platform.as_deref(), desc.len() as usize)
376 {
377 Ok(a) => a,
378 Err(e) => {
379 warn!("Failed to translate reporting descriptor address: {e}");
380 continue;
381 }
382 };
383 if let Err(e) =
384 Self::release_memory_range(desc_chain.memory(), addr, desc.len() as usize)
385 {
386 warn!("Failed to release reported memory range: {e}");
387 }
388 }
389
390 self.queues[queue_index]
391 .add_used(desc_chain.memory(), desc_chain.head_index(), descs_len)
392 .map_err(Error::QueueAddUsed)?;
393 used_descs = true;
394 }
395
396 if used_descs {
397 self.signal(VirtioInterruptType::Queue(queue_index as u16))
398 } else {
399 Ok(())
400 }
401 }
402
403 fn run(
404 &mut self,

Callers 1

handle_eventMethod · 0.80

Calls 6

memoryMethod · 0.80
nextMethod · 0.45
lenMethod · 0.45
translate_gvaMethod · 0.45
addrMethod · 0.45
signalMethod · 0.45

Tested by

no test coverage detected