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

Method state_change_request

virtio-devices/src/mem.rs:481–543  ·  view source on GitHub ↗
(&mut self, addr: u64, nb_blocks: u16, plug: bool)

Source from the content-addressed store, hash-verified

479 }
480
481 fn state_change_request(&mut self, addr: u64, nb_blocks: u16, plug: bool) -> u16 {
482 let mut config = self.config.lock().unwrap();
483 let size: u64 = nb_blocks as u64 * config.block_size;
484
485 if plug && (config.plugged_size + size > config.requested_size) {
486 return VIRTIO_MEM_RESP_NACK;
487 }
488 if !config.is_valid_range(addr, size) {
489 return VIRTIO_MEM_RESP_ERROR;
490 }
491
492 let offset = addr - config.addr;
493
494 let first_block_index = (offset / config.block_size) as usize;
495 if !self.blocks_state.lock().unwrap().is_range_state(
496 first_block_index,
497 nb_blocks as usize,
498 !plug,
499 ) {
500 return VIRTIO_MEM_RESP_ERROR;
501 }
502
503 if !plug && let Err(e) = self.discard_memory_range(offset, size) {
504 error!("failed discarding memory range: {e:?}");
505 return VIRTIO_MEM_RESP_ERROR;
506 }
507
508 self.blocks_state
509 .lock()
510 .unwrap()
511 .set_range(first_block_index, nb_blocks as usize, plug);
512
513 let handlers = self.dma_mapping_handlers.lock().unwrap();
514 if plug {
515 let mut gpa = addr;
516 for _ in 0..nb_blocks {
517 for (_, handler) in handlers.iter() {
518 if let Err(e) = handler.map(gpa, gpa, config.block_size) {
519 error!(
520 "failed DMA mapping addr 0x{:x} size 0x{:x}: {}",
521 gpa, config.block_size, e
522 );
523 return VIRTIO_MEM_RESP_ERROR;
524 }
525 }
526
527 gpa += config.block_size;
528 }
529
530 config.plugged_size += size;
531 } else {
532 for (_, handler) in handlers.iter() {
533 if let Err(e) = handler.unmap(addr, size) {
534 error!("failed DMA unmapping addr 0x{addr:x} size 0x{size:x}: {e}");
535 return VIRTIO_MEM_RESP_ERROR;
536 }
537 }
538

Callers 1

process_queueMethod · 0.80

Calls 7

is_valid_rangeMethod · 0.80
is_range_stateMethod · 0.80
discard_memory_rangeMethod · 0.80
set_rangeMethod · 0.80
iterMethod · 0.80
mapMethod · 0.45
unmapMethod · 0.45

Tested by

no test coverage detected