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

Method process_queue

virtio-devices/src/mem.rs:618–657  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

616 }
617
618 fn process_queue(&mut self) -> Result<bool, Error> {
619 let mut used_descs = false;
620
621 while let Some(mut desc_chain) = self.queue.pop_descriptor_chain(self.mem.memory()) {
622 let r = match Request::parse(&mut desc_chain) {
623 Ok(r) => r,
624 Err(e) => {
625 warn!("Failed to parse virtio-mem request: {e}");
626 self.queue
627 .add_used(desc_chain.memory(), desc_chain.head_index(), 0)
628 .map_err(Error::QueueAddUsed)?;
629 used_descs = true;
630 continue;
631 }
632 };
633 let (resp_type, resp_state) = match r.req.req_type {
634 VIRTIO_MEM_REQ_PLUG => (
635 self.state_change_request(r.req.addr, r.req.nb_blocks, true),
636 0u16,
637 ),
638 VIRTIO_MEM_REQ_UNPLUG => (
639 self.state_change_request(r.req.addr, r.req.nb_blocks, false),
640 0u16,
641 ),
642 VIRTIO_MEM_REQ_UNPLUG_ALL => (self.unplug_all(), 0u16),
643 VIRTIO_MEM_REQ_STATE => self.state_request(r.req.addr, r.req.nb_blocks),
644 _ => {
645 warn!("Unknown request type: {}", r.req.req_type);
646 (VIRTIO_MEM_RESP_ERROR, 0u16)
647 }
648 };
649 let len = r.send_response(desc_chain.memory(), resp_type, resp_state)?;
650 self.queue
651 .add_used(desc_chain.memory(), desc_chain.head_index(), len)
652 .map_err(Error::QueueAddUsed)?;
653 used_descs = true;
654 }
655
656 Ok(used_descs)
657 }
658
659 fn run(
660 &mut self,

Callers 1

handle_eventMethod · 0.45

Calls 5

memoryMethod · 0.80
state_change_requestMethod · 0.80
unplug_allMethod · 0.80
state_requestMethod · 0.80
send_responseMethod · 0.80

Tested by

no test coverage detected