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

Method process_queue

vhost_user_block/src/lib.rs:117–202  ·  view source on GitHub ↗
(
        &mut self,
        vring: &mut RwLockWriteGuard<VringState<GuestMemoryAtomic<GuestMemoryMmap>>>,
    )

Source from the content-addressed store, hash-verified

115 }
116
117 fn process_queue(
118 &mut self,
119 vring: &mut RwLockWriteGuard<VringState<GuestMemoryAtomic<GuestMemoryMmap>>>,
120 ) -> bool {
121 let mut used_descs = false;
122
123 while let Some(mut desc_chain) = vring
124 .get_queue_mut()
125 .pop_descriptor_chain(self.mem.memory())
126 {
127 debug!("got an element in the queue");
128 let len = match Request::parse(&mut desc_chain, None) {
129 Ok(mut request) => {
130 debug!("element is a valid request");
131 request.writeback = self.writeback.load(Ordering::Acquire);
132 let (status, len) = match request.execute(
133 &mut *self.disk_image.lock().unwrap(),
134 self.disk_nsectors,
135 desc_chain.memory(),
136 &self.serial,
137 ) {
138 Ok(_) if request.request_type() == RequestType::GetDeviceId => {
139 (VIRTIO_BLK_S_OK as u8, self.serial.len() as u32 + 1)
140 }
141 Ok(l) => (VIRTIO_BLK_S_OK as u8, l + 1),
142 Err(e) => (e.status(), 1),
143 };
144
145 if let Err(e) = desc_chain.memory().write_obj(status, request.status_addr()) {
146 warn!(
147 "vhost-user-blk: failed to write status to 0x{:x}: {e:?}",
148 request.status_addr().0
149 );
150 0
151 } else {
152 len
153 }
154 }
155 Err(err) => {
156 error!("failed to parse available descriptor chain: {err:?}");
157 0
158 }
159 };
160
161 if let Err(e) =
162 vring
163 .get_queue_mut()
164 .add_used(desc_chain.memory(), desc_chain.head_index(), len)
165 {
166 error!("vhost-user-blk: add_used failed: {e:?}");
167 // Stop processing this batch — the queue is in a bad state.
168 break;
169 }
170 used_descs = true;
171 }
172
173 let needs_signalling = if self.event_idx {
174 match vring

Callers 1

handle_eventMethod · 0.45

Calls 8

memoryMethod · 0.80
executeMethod · 0.80
request_typeMethod · 0.80
status_addrMethod · 0.80
lenMethod · 0.45
statusMethod · 0.45
derefMethod · 0.45
signal_used_queueMethod · 0.45

Tested by

no test coverage detected