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

Method process_queue

virtio-devices/src/pmem.rs:170–211  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

168
169impl 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

Callers 1

handle_eventMethod · 0.45

Calls 2

memoryMethod · 0.80
sync_allMethod · 0.80

Tested by

no test coverage detected