(&mut self)
| 168 | |
| 169 | impl PmemEpollHandler { |
| 170 | fn process_queue(&mut self) -> result::Result<bool, Error> { |
| 171 | let mut used_descs = false; |
| 172 | while let Some(mut desc_chain) = self.queue.pop_descriptor_chain(self.mem.memory()) { |
| 173 | let len = match Request::parse(&mut desc_chain, self.access_platform.as_deref()) { |
| 174 | Ok(ref req) => { |
| 175 | let status_code = match req.type_ { |
| 176 | RequestType::Flush => match self.disk.sync_all() { |
| 177 | Ok(()) => VIRTIO_PMEM_RESP_TYPE_OK, |
| 178 | Err(e) => { |
| 179 | error!("Failed flushing disk image: {e}"); |
| 180 | VIRTIO_PMEM_RESP_TYPE_EIO |
| 181 | } |
| 182 | }, |
| 183 | RequestType::Unknown(t) => { |
| 184 | warn!("Unknown request type: {t}"); |
| 185 | VIRTIO_PMEM_RESP_TYPE_EIO |
| 186 | } |
| 187 | }; |
| 188 | |
| 189 | let resp = VirtioPmemResp { ret: status_code }; |
| 190 | match desc_chain.memory().write_obj(resp, req.status_addr) { |
| 191 | Ok(_) => size_of::<VirtioPmemResp>() as u32, |
| 192 | Err(e) => { |
| 193 | error!("bad guest memory address: {e}"); |
| 194 | 0 |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | Err(e) => { |
| 199 | error!("Failed to parse available descriptor chain: {e:?}"); |
| 200 | 0 |
| 201 | } |
| 202 | }; |
| 203 | |
| 204 | self.queue |
| 205 | .add_used(desc_chain.memory(), desc_chain.head_index(), len) |
| 206 | .map_err(Error::QueueAddUsed)?; |
| 207 | used_descs = true; |
| 208 | } |
| 209 | |
| 210 | Ok(used_descs) |
| 211 | } |
| 212 | |
| 213 | fn signal_used_queue(&self) -> result::Result<(), DeviceError> { |
| 214 | self.interrupt_cb |
no test coverage detected