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