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

Method process_rx

net_util/src/queue_pair.rs:539–582  ·  view source on GitHub ↗
(
        &mut self,
        mem: &vm_memory::GuestMemoryMmap<B>,
        queue: &mut Queue,
    )

Source from the content-addressed store, hash-verified

537 }
538
539 pub fn process_rx<B: Bitmap + 'static>(
540 &mut self,
541 mem: &vm_memory::GuestMemoryMmap<B>,
542 queue: &mut Queue,
543 ) -> Result<bool, NetQueuePairError> {
544 self.rx_desc_avail = !self.rx.process_desc_chain(
545 mem,
546 &self.tap,
547 queue,
548 &mut self.rx_rate_limiter,
549 self.access_platform.as_deref(),
550 )?;
551 let rate_limit_reached = self
552 .rx_rate_limiter
553 .as_ref()
554 .is_some_and(|r| r.is_blocked());
555
556 // Stop listening on the `RX_TAP_EVENT` when:
557 // 1) there is no available describes, or
558 // 2) the RX rate limit is reached.
559 if self.rx_tap_listening && (!self.rx_desc_avail || rate_limit_reached) {
560 unregister_listener(
561 self.epoll_fd.unwrap(),
562 self.tap.as_raw_fd(),
563 epoll::Events::EPOLLIN,
564 u64::from(self.tap_rx_event_id),
565 )
566 .map_err(NetQueuePairError::UnregisterListener)?;
567 self.rx_tap_listening = false;
568 }
569
570 self.counters
571 .rx_bytes
572 .fetch_add(self.rx.counter_bytes.0, Ordering::AcqRel);
573 self.counters
574 .rx_frames
575 .fetch_add(self.rx.counter_frames.0, Ordering::AcqRel);
576 self.rx.counter_bytes = Wrapping(0);
577 self.rx.counter_frames = Wrapping(0);
578
579 queue
580 .needs_notification(mem)
581 .map_err(NetQueuePairError::QueueNeedsNotification)
582 }
583}

Callers

nothing calls this directly

Calls 4

unregister_listenerFunction · 0.85
process_desc_chainMethod · 0.80
is_blockedMethod · 0.45
as_raw_fdMethod · 0.45

Tested by

no test coverage detected