net_util: Replace specific bitmap implementation with trait

Replace the specific Bitmap implementation from the type signature used
for functions that take memory. This allows more flexibility when using
these functions in particular when these functions are used by the
vhost-user-net backend. An updated vhost-user-backend crate requires
extra constraints on the Bitmap implementation used (it must support
BitmapReplace which AtomicBitmap does not.)

Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
This commit is contained in:
Rob Bradford 2024-05-01 09:24:48 +01:00 committed by Bo Chen
parent 75e1dc2bce
commit b29edfbee8

View File

@ -3,7 +3,6 @@
// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
use super::{register_listener, unregister_listener, vnet_hdr_len, Tap}; use super::{register_listener, unregister_listener, vnet_hdr_len, Tap};
use crate::GuestMemoryMmap;
use rate_limiter::{RateLimiter, TokenType}; use rate_limiter::{RateLimiter, TokenType};
use std::io; use std::io;
use std::num::Wrapping; use std::num::Wrapping;
@ -12,6 +11,7 @@ use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc; use std::sync::Arc;
use thiserror::Error; use thiserror::Error;
use virtio_queue::{Queue, QueueOwnedT, QueueT}; use virtio_queue::{Queue, QueueOwnedT, QueueT};
use vm_memory::bitmap::Bitmap;
use vm_memory::{Bytes, GuestMemory}; use vm_memory::{Bytes, GuestMemory};
use vm_virtio::{AccessPlatform, Translatable}; use vm_virtio::{AccessPlatform, Translatable};
@ -35,9 +35,9 @@ impl TxVirtio {
} }
} }
pub fn process_desc_chain( pub fn process_desc_chain<B: Bitmap + 'static>(
&mut self, &mut self,
mem: &GuestMemoryMmap, mem: &vm_memory::GuestMemoryMmap<B>,
tap: &Tap, tap: &Tap,
queue: &mut Queue, queue: &mut Queue,
rate_limiter: &mut Option<RateLimiter>, rate_limiter: &mut Option<RateLimiter>,
@ -161,9 +161,9 @@ impl RxVirtio {
} }
} }
pub fn process_desc_chain( pub fn process_desc_chain<B: Bitmap + 'static>(
&mut self, &mut self,
mem: &GuestMemoryMmap, mem: &vm_memory::GuestMemoryMmap<B>,
tap: &Tap, tap: &Tap,
queue: &mut Queue, queue: &mut Queue,
rate_limiter: &mut Option<RateLimiter>, rate_limiter: &mut Option<RateLimiter>,
@ -350,9 +350,9 @@ pub struct NetQueuePair {
} }
impl NetQueuePair { impl NetQueuePair {
pub fn process_tx( pub fn process_tx<B: Bitmap + 'static>(
&mut self, &mut self,
mem: &GuestMemoryMmap, mem: &vm_memory::GuestMemoryMmap<B>,
queue: &mut Queue, queue: &mut Queue,
) -> Result<bool, NetQueuePairError> { ) -> Result<bool, NetQueuePairError> {
let tx_tap_retry = self.tx.process_desc_chain( let tx_tap_retry = self.tx.process_desc_chain(
@ -400,9 +400,9 @@ impl NetQueuePair {
.map_err(NetQueuePairError::QueueNeedsNotification) .map_err(NetQueuePairError::QueueNeedsNotification)
} }
pub fn process_rx( pub fn process_rx<B: Bitmap + 'static>(
&mut self, &mut self,
mem: &GuestMemoryMmap, mem: &vm_memory::GuestMemoryMmap<B>,
queue: &mut Queue, queue: &mut Queue,
) -> Result<bool, NetQueuePairError> { ) -> Result<bool, NetQueuePairError> {
self.rx_desc_avail = !self.rx.process_desc_chain( self.rx_desc_avail = !self.rx.process_desc_chain(