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

Method process_input_queue

virtio-devices/src/console.rs:193–243  ·  view source on GitHub ↗

* Each port of virtio console device has one receive * queue. One or more empty buffers are placed by the * driver in the receive queue for incoming data. Here, * we place the input data to these empty buffers. */

(&mut self)

Source from the content-addressed store, hash-verified

191 * we place the input data to these empty buffers.
192 */
193 fn process_input_queue(&mut self) -> Result<bool, Error> {
194 let mut in_buffer = self.in_buffer.lock().unwrap();
195 let recv_queue = &mut self.input_queue; //receiveq
196 let mut used_descs = false;
197
198 if in_buffer.is_empty() {
199 return Ok(false);
200 }
201
202 while let Some(mut desc_chain) = recv_queue.pop_descriptor_chain(self.mem.memory()) {
203 let mut total_len = 0;
204 while let Some(desc) = desc_chain.next() {
205 if in_buffer.is_empty() {
206 break;
207 }
208 if !desc.is_write_only() {
209 warn!("Skipping device-readable descriptor on receiveq");
210 continue;
211 }
212 let len = cmp::min(desc.len() as usize, in_buffer.len());
213 let addr = match desc
214 .addr()
215 .translate_gva(self.access_platform.as_deref(), desc.len() as usize)
216 {
217 Ok(a) => a,
218 Err(e) => {
219 warn!("Failed to translate receiveq descriptor address: {e}");
220 break;
221 }
222 };
223 let source: Vec<u8> = in_buffer.range(..len).copied().collect();
224 if let Err(e) = desc_chain.memory().write_slice(&source, addr) {
225 warn!("Failed to write to receiveq descriptor: {e}");
226 break;
227 }
228 in_buffer.drain(..len);
229 total_len += len as u32;
230 }
231
232 recv_queue
233 .add_used(desc_chain.memory(), desc_chain.head_index(), total_len)
234 .map_err(Error::QueueAddUsed)?;
235 used_descs = true;
236
237 if in_buffer.is_empty() {
238 break;
239 }
240 }
241
242 Ok(used_descs)
243 }
244
245 /*
246 * Each port of virtio console device has one transmit

Callers 1

handle_eventMethod · 0.80

Calls 7

memoryMethod · 0.80
rangeMethod · 0.80
is_emptyMethod · 0.45
nextMethod · 0.45
lenMethod · 0.45
translate_gvaMethod · 0.45
addrMethod · 0.45

Tested by

no test coverage detected