Skip to content

Commit b787a39

Browse files
committed
feat(devices): migrate callsites to rate-limited macros
Migrate 7 guest-triggered high-rate logging callsites from error!() to error_rate_limited!(): - balloon: duplicate PFN, discard_range failure, hinting failure - net: oversized TX frame - block: malformed descriptor chain - PCI: device activation failure - MMIO: device activation failure Each callsite now independently rate-limits to 10 messages per 5-second window, preventing log floods from guest-driven error paths. Signed-off-by: Nikita Kalyazin <kalyazin@amazon.com>
1 parent a5c6bc5 commit b787a39

6 files changed

Lines changed: 16 additions & 13 deletions

File tree

src/vmm/src/devices/virtio/balloon/device.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::devices::virtio::device::{ActiveState, VirtioDeviceType};
3232
use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1;
3333
use crate::devices::virtio::queue::InvalidAvailIdx;
3434
use crate::devices::virtio::transport::{VirtioInterrupt, VirtioInterruptType};
35-
use crate::logger::{IncMetric, log_dev_preview_warning};
35+
use crate::logger::{IncMetric, error_rate_limited, log_dev_preview_warning};
3636
use crate::utils::u64_to_usize;
3737
use crate::vstate::memory::{
3838
Address, ByteValued, Bytes, GuestAddress, GuestMemoryExtension, GuestMemoryMmap,
@@ -455,7 +455,7 @@ impl Balloon {
455455
guest_addr,
456456
usize::try_from(range_len).unwrap() << VIRTIO_BALLOON_PFN_SHIFT,
457457
) {
458-
error!("Error removing memory range: {:?}", err);
458+
error_rate_limited!("Error removing memory range: {:?}", err);
459459
}
460460
}
461461
}
@@ -596,7 +596,7 @@ impl Balloon {
596596
METRICS.free_page_hint_count.inc();
597597
if let Err(err) = mem.discard_range(desc.addr, desc.len as usize) {
598598
METRICS.free_page_hint_fails.inc();
599-
error!("balloon hinting: failed to remove range: {err:?}");
599+
error_rate_limited!("balloon hinting: failed to remove range: {err:?}");
600600
} else {
601601
METRICS.free_page_hint_freed.add(desc.len as u64);
602602
}

src/vmm/src/devices/virtio/balloon/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use std::io;
55

66
use super::{MAX_PAGE_COMPACT_BUFFER, RemoveRegionError};
7-
use crate::logger::error;
7+
use crate::logger::error_rate_limited;
88
use crate::utils::u64_to_usize;
99
use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryMmap, GuestMemoryRegion};
1010

@@ -36,7 +36,7 @@ pub(crate) fn compact_page_frame_numbers(v: &mut [u32]) -> Vec<(u32, u32)> {
3636
// Skip duplicate pages. This will ensure we only consider
3737
// distinct PFNs.
3838
if page_frame_number == v[pfn_index - 1] {
39-
error!("Skipping duplicate PFN {}.", page_frame_number);
39+
error_rate_limited!("Skipping duplicate PFN {}.", page_frame_number);
4040
continue;
4141
}
4242

src/vmm/src/devices/virtio/block/virtio/device.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
3434
use crate::devices::virtio::queue::{InvalidAvailIdx, Queue};
3535
use crate::devices::virtio::transport::{VirtioInterrupt, VirtioInterruptType};
3636
use crate::impl_device_type;
37-
use crate::logger::{IncMetric, error, warn};
37+
use crate::logger::{IncMetric, error, error_rate_limited, warn};
3838
use crate::rate_limiter::{BucketUpdate, RateLimiter};
3939
use crate::utils::u64_to_usize;
4040
use crate::vmm_config::RateLimiterConfig;
@@ -414,7 +414,10 @@ impl VirtioBlock {
414414
)
415415
}
416416
Err(err) => {
417-
error!("Failed to parse available descriptor chain: {:?}", err);
417+
error_rate_limited!(
418+
"Failed to parse available descriptor chain: {:?}",
419+
err
420+
);
418421
self.metrics.execute_fails.inc();
419422
ProcessingResult::Executed(FinishedRequest {
420423
num_bytes_to_mem: 0,

src/vmm/src/devices/virtio/net/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use crate::devices::{DeviceError, report_net_event_fail};
4040
use crate::dumbo::pdu::arp::ETH_IPV4_FRAME_LEN;
4141
use crate::dumbo::pdu::ethernet::{EthernetFrame, PAYLOAD_OFFSET};
4242
use crate::impl_device_type;
43-
use crate::logger::{IncMetric, METRICS};
43+
use crate::logger::{IncMetric, METRICS, error_rate_limited};
4444
use crate::mmds::data_store::Mmds;
4545
use crate::mmds::ns::MmdsNetworkStack;
4646
use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenType};
@@ -708,7 +708,7 @@ impl Net {
708708

709709
// We only handle frames that are up to MAX_BUFFER_SIZE
710710
if self.tx_buffer.len() as usize > MAX_BUFFER_SIZE {
711-
error!("net: received too big frame from driver");
711+
error_rate_limited!("net: received too big frame from driver");
712712
self.metrics.tx_malformed_frames.inc();
713713
tx_queue.add_used(head_index, 0)?;
714714
continue;

src/vmm/src/devices/virtio/transport/mmio.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use super::{VirtioInterrupt, VirtioInterruptType};
1515
use crate::devices::virtio::device::VirtioDevice;
1616
use crate::devices::virtio::device_status;
1717
use crate::devices::virtio::queue::Queue;
18-
use crate::logger::{IncMetric, METRICS, error, warn};
18+
use crate::logger::{IncMetric, METRICS, error, error_rate_limited, warn};
1919
use crate::utils::byte_order;
2020
use crate::vstate::bus::BusDevice;
2121
use crate::vstate::interrupts::InterruptError;
@@ -194,7 +194,7 @@ impl MmioTransport {
194194
// configuration change interrupt
195195
let _ = self.interrupt.trigger(VirtioInterruptType::Config);
196196

197-
error!("Failed to activate virtio device: {}", err)
197+
error_rate_limited!("Failed to activate virtio device: {}", err)
198198
}
199199
}
200200
}

src/vmm/src/devices/virtio/transport/pci/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::devices::virtio::transport::pci::common_config::{
3535
VirtioPciCommonConfig, VirtioPciCommonConfigState,
3636
};
3737
use crate::devices::virtio::transport::{VirtioInterrupt, VirtioInterruptType};
38-
use crate::logger::{debug, error};
38+
use crate::logger::{debug, error, error_rate_limited};
3939
use crate::pci::configuration::{PciCapability, PciConfiguration, PciConfigurationState};
4040
use crate::pci::msix::{MsixCap, MsixConfig, MsixConfigState};
4141
use crate::pci::{BarReprogrammingParams, DeviceRelocationError, PciDevice};
@@ -901,7 +901,7 @@ impl PciDevice for VirtioPciDevice {
901901
{
902902
Ok(()) => self.device_activated.store(true, Ordering::SeqCst),
903903
Err(err) => {
904-
error!("Error activating device: {err:?}");
904+
error_rate_limited!("Error activating device: {err:?}");
905905

906906
// Section 2.1.2 of the specification states that we need to send a device
907907
// configuration change interrupt

0 commit comments

Comments
 (0)