(&mut self)
| 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, |
no test coverage detected