Skip to content

[1.12 Backport] Fix greedy block device #5277

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

ShadowCurse
Copy link
Contributor

Changes

Backport of #5260 to 1.12 branch

License Acceptance

By submitting this pull request, I confirm that my contribution is made under
the terms of the Apache 2.0 license. For more information on following Developer
Certificate of Origin and signing off your commits, please check
CONTRIBUTING.md.

PR Checklist

  • I have read and understand CONTRIBUTING.md.
  • I have run tools/devtool checkstyle to verify that the PR passes the
    automated style checks.
  • I have described what is done in these changes, why they are needed, and
    how they are solving the problem in a clear and encompassing way.
  • I have updated any relevant documentation (both in code and in the docs)
    in the PR.
  • I have mentioned all user-facing changes in CHANGELOG.md.
  • If a specific issue led to this PR, this PR closes the issue.
  • When making API changes, I have followed the
    Runbook for Firecracker API changes.
  • I have tested all new and changed functionalities in unit tests and/or
    integration tests.
  • I have linked an issue to every new TODO.

  • This functionality cannot be added in rust-vmm.

The `max_size` field is public, so no need for a getter.

Signed-off-by: Egor Lazarchuk <[email protected]>
The size of queue set by the driver must be always less or equal to the
queue size in FC. This is checked before device activation.
This removes the need for `actual_size` function.

Signed-off-by: Egor Lazarchuk <[email protected]>
Currently block device has a guest notification logic
inside it's request processing loop. This can create a
situation when guest can continuously add more requests to the
queue, making the whole request processing loop arbitrary long.
This is an issue, since it block any other IO from being processed.

The solution is to simply notify guest one time, after all current
requests are processed.

Signed-off-by: Egor Lazarchuk <[email protected]>
Signed-off-by: Riccardo Mancini <[email protected]>
VIRTIO spec states:
```
After the device writes a descriptor index into the used ring:
  If the idx field in the used ring (which determined where that
  descriptor index was placed) was equal to used_event, the device
  MUST send a notification.
```
The current implementation does not follow this very precisely. It
bumps used ring index when new descriptors are added to the used
ring. But the check if the notification is needed is postponed to
later processing stage.
To be more VIRTIO spec compliant simply move the logic for updating
the used ring index into the later processing stage as well, just
before the check if the notification should be send.

Signed-off-by: Egor Lazarchuk <[email protected]>
@ShadowCurse ShadowCurse marked this pull request as ready for review June 23, 2025 10:38
Copy link

codecov bot commented Jun 23, 2025

Codecov Report

Attention: Patch coverage is 80.00000% with 16 lines in your changes missing coverage. Please review.

Project coverage is 83.07%. Comparing base (5dd92de) to head (73dc513).
Report is 5 commits behind head on firecracker-v1.12.

Files with missing lines Patch % Lines
src/vmm/src/devices/virtio/vsock/device.rs 60.86% 9 Missing ⚠️
src/vmm/src/devices/virtio/block/virtio/device.rs 80.64% 6 Missing ⚠️
src/vmm/src/devices/virtio/mmio.rs 50.00% 1 Missing ⚠️
Additional details and impacted files
@@                  Coverage Diff                  @@
##           firecracker-v1.12    #5277      +/-   ##
=====================================================
- Coverage              83.09%   83.07%   -0.02%     
=====================================================
  Files                    250      250              
  Lines                  26892    26893       +1     
=====================================================
- Hits                   22346    22342       -4     
- Misses                  4546     4551       +5     
Flag Coverage Δ
5.10-c5n.metal 83.57% <80.00%> (-0.02%) ⬇️
5.10-m5n.metal 83.56% <80.00%> (-0.03%) ⬇️
5.10-m6a.metal 82.79% <80.00%> (-0.03%) ⬇️
5.10-m6g.metal 79.36% <80.00%> (-0.03%) ⬇️
5.10-m6i.metal 83.56% <80.00%> (-0.02%) ⬇️
5.10-m7a.metal-48xl 82.78% <80.00%> (-0.02%) ⬇️
5.10-m7g.metal 79.36% <80.00%> (-0.03%) ⬇️
5.10-m7i.metal-24xl 83.53% <80.00%> (-0.02%) ⬇️
5.10-m7i.metal-48xl 83.52% <80.00%> (-0.02%) ⬇️
5.10-m8g.metal-24xl 79.35% <80.00%> (-0.03%) ⬇️
5.10-m8g.metal-48xl 79.35% <80.00%> (-0.03%) ⬇️
6.1-c5n.metal 83.61% <80.00%> (-0.03%) ⬇️
6.1-m5n.metal 83.60% <80.00%> (-0.03%) ⬇️
6.1-m6a.metal 82.83% <80.00%> (-0.03%) ⬇️
6.1-m6g.metal 79.36% <80.00%> (-0.02%) ⬇️
6.1-m6i.metal 83.60% <80.00%> (-0.04%) ⬇️
6.1-m7a.metal-48xl 82.82% <80.00%> (-0.03%) ⬇️
6.1-m7g.metal 79.36% <80.00%> (-0.03%) ⬇️
6.1-m7i.metal-24xl 83.62% <80.00%> (-0.02%) ⬇️
6.1-m7i.metal-48xl 83.62% <80.00%> (-0.03%) ⬇️
6.1-m8g.metal-24xl 79.35% <80.00%> (-0.03%) ⬇️
6.1-m8g.metal-48xl 79.35% <80.00%> (-0.03%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

roypat
roypat previously approved these changes Jun 23, 2025
bchalios
bchalios previously approved these changes Jun 23, 2025
@ShadowCurse ShadowCurse self-assigned this Jun 23, 2025
@ShadowCurse ShadowCurse added Status: Awaiting review Indicates that a pull request is ready to be reviewed Type: Fix Indicates a fix to existing code labels Jun 23, 2025
Add a new changelog entry for the block device fairness fix.

Signed-off-by: Riccardo Mancini <[email protected]>
@ShadowCurse ShadowCurse dismissed stale reviews from bchalios and roypat via 73dc513 June 23, 2025 11:27
@ShadowCurse ShadowCurse force-pushed the fair_devices_1.12_backport branch from 5b1d5ac to 73dc513 Compare June 23, 2025 11:27
@ShadowCurse ShadowCurse merged commit b12cb30 into firecracker-microvm:firecracker-v1.12 Jun 23, 2025
5 of 7 checks passed
@ShadowCurse ShadowCurse deleted the fair_devices_1.12_backport branch June 23, 2025 11:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Awaiting review Indicates that a pull request is ready to be reviewed Type: Fix Indicates a fix to existing code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants