Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bin/mock-server/src/lib/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use dropshot::{
TypedBody, WebsocketConnection,
};
use futures::SinkExt;
use slog::{error, o, Logger};
use slog::{o, Logger};
use std::collections::BTreeMap;
use thiserror::Error;
use tokio::sync::{watch, Mutex};
Expand Down
1 change: 0 additions & 1 deletion bin/propolis-server/src/lib/migrate/codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
use super::MigrateError;

use bytes::{Buf, BufMut, Bytes};
use slog::error;
use strum::FromRepr;
use thiserror::Error;
use tokio_tungstenite::tungstenite;
Expand Down
2 changes: 1 addition & 1 deletion bin/propolis-server/src/lib/migrate/destination.rs
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ impl<T: MigrateConn> RonV0<T> {
if count != 0 {
return Err(MigrateError::DeviceState(format!(
"Found {} unconsumed payload(s) for device {}",
count, &device.instance_name,
count, device.instance_name,
)));
}
}
Expand Down
1 change: 0 additions & 1 deletion bin/propolis-server/src/lib/migrate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use dropshot::HttpError;
use propolis::migrate::MigrateStateError;
use propolis_api_types::migration::MigrationState;
use serde::{Deserialize, Serialize};
use slog::error;
use thiserror::Error;
use tokio::io::{AsyncRead, AsyncWrite};

Expand Down
2 changes: 1 addition & 1 deletion bin/propolis-server/src/lib/spec/api_spec_v0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ impl From<Spec> for v1::instance_spec::InstanceSpec {
assert!(
!spec.components.contains_key(&key),
"component name {} already exists in output spec",
&key
key
);
spec.components.insert(key, val);
}
Expand Down
2 changes: 1 addition & 1 deletion bin/propolis-server/src/lib/vcpu_tasks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl VcpuTasks {

let mut tasks = Vec::new();
for (vcpu, bind_cpu) in
machine.vcpus.iter().map(Arc::clone).zip(bindings.into_iter())
machine.vcpus.iter().map(Arc::clone).zip(bindings)
{
let (task, ctrl) =
propolis::tasks::TaskHdl::new_held(Some(vcpu.barrier_fn()));
Expand Down
2 changes: 1 addition & 1 deletion bin/propolis-standalone/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = "propolis-standalone"
version = "0.1.0"
license = "MPL-2.0"
edition = "2021"
rust-version = "1.73"
rust-version = "1.93"

[[bin]]
name = "propolis-standalone"
Expand Down
27 changes: 11 additions & 16 deletions bin/propolis-standalone/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,13 @@ impl EventQueue {
let mut inner = self.inner.lock().unwrap();
while let Some((ev, ctx)) = inner.events.pop_front() {
match cur {
Some(cur_ev) => {
if cur_ev.supersedes(&ev) {
// queued event is superseded by current one, so discard
// it and look for another which may be relevant.
continue;
} else {
return Some((ev, ctx));
}
Some(cur_ev) if cur_ev.supersedes(&ev) => {
// queued event is superseded by current one, so discard
// it and look for another which may be relevant.
continue;
}
Some(_) => {
return Some((ev, ctx));
}
None => return Some((ev, ctx)),
}
Expand Down Expand Up @@ -327,7 +326,7 @@ impl Instance {
};

for (vcpu, bind_cpu) in
machine.vcpus.iter().map(Arc::clone).zip(bind_cpus.into_iter())
machine.vcpus.iter().map(Arc::clone).zip(bind_cpus)
{
let (task, ctrl) =
propolis::tasks::TaskHdl::new_held(Some(vcpu.barrier_fn()));
Expand Down Expand Up @@ -406,14 +405,14 @@ impl Instance {
match state {
State::Run if first_boot => {
tokio::runtime::Handle::current().block_on(async {
for (_name, be) in guard.inventory.block.iter() {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now that's a good lint

for be in guard.inventory.block.values() {
be.start().await.expect("blockdev start succeeds");
}
});
}
State::Halt => {
tokio::runtime::Handle::current().block_on(async {
for (_name, be) in guard.inventory.block.iter() {
for be in guard.inventory.block.values() {
be.stop().await;
be.attachment().detach();
}
Expand Down Expand Up @@ -1419,11 +1418,7 @@ fn setup_instance(
}
_ => {
slog::error!(log, "unrecognized driver {driver}"; "name" => name);
return Err(Error::new(
ErrorKind::Other,
"Unrecognized driver",
)
.into());
return Err(Error::other("Unrecognized driver").into());
}
};
Ok(())
Expand Down
6 changes: 2 additions & 4 deletions crates/cpuid-utils/src/host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,8 @@ impl Drop for Vm {
/// Queries the supplied CPUID leaf on the caller's machine.
#[cfg(target_arch = "x86_64")]
pub fn query(leaf: CpuidIdent) -> CpuidValues {
unsafe {
core::arch::x86_64::__cpuid_count(leaf.leaf, leaf.subleaf.unwrap_or(0))
}
.into()
core::arch::x86_64::__cpuid_count(leaf.leaf, leaf.subleaf.unwrap_or(0))
.into()
}

#[cfg(not(target_arch = "x86_64"))]
Expand Down
2 changes: 1 addition & 1 deletion lib/propolis/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = "propolis"
version = "0.1.0"
license = "MPL-2.0"
edition = "2021"
rust-version = "1.90"
rust-version = "1.93"

@papertigers papertigers Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this we get the following at the pop_front_if call site

warning: current MSRV (Minimum Supported Rust Version) is `1.90.0` but this item is stable since `1.93.0`


[dependencies]
libc.workspace = true
Expand Down
1 change: 0 additions & 1 deletion lib/propolis/src/hw/virtio/queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,6 @@ impl VirtQueue {
false => ChainBuf::Readable(GuestAddr(desc.addr), desc.len),
};

count += 1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems wrong, or at least an existing bug, where count == self.size() isn't considered past this point?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is an existing bug, yeah

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we fix it here or in a PR stacked on top of this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "fix" is here #1188, however we really need to go do #1190 to address all of the issues in this code path.

len += desc.len;
chain.push_buf(buf);

Expand Down
2 changes: 1 addition & 1 deletion lib/propolis/src/vcpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ impl Vcpu {
) -> Arc<Self> {
#[cfg(target_arch = "x86_64")]
fn query_hardware_vendor() -> CpuidVendor {
let res = unsafe { core::arch::x86_64::__cpuid(0) };
let res = core::arch::x86_64::__cpuid(0);
propolis_types::CpuidValues::from(res)
.try_into()
.expect("CPU vendor is recognized")
Expand Down
27 changes: 1 addition & 26 deletions lib/propolis/src/vsock/poller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1064,29 +1064,6 @@ impl VsockGuestAddr {
}
}

// TODO this can become `[VecDeque::pop_front_if]` when we update to Rust 1.93,
// until then the impl is shamelessly borrowed.
trait VecDequeExt<T> {
fn pop_front_if(
&mut self,
predicate: impl FnOnce(&mut T) -> bool,
) -> Option<T>;
}

impl<T> VecDequeExt<T> for VecDeque<T> {
fn pop_front_if(
&mut self,
predicate: impl FnOnce(&mut T) -> bool,
) -> Option<T> {
let first = self.front_mut()?;
if predicate(first) {
self.pop_front()
} else {
None
}
}
}

#[cfg(test)]
mod test {
use std::io::{Read, Write};
Expand Down Expand Up @@ -1495,9 +1472,8 @@ mod test {
let num_chunks = (CONN_TX_BUF_SIZE / 2) / chunk_size + 1;
let payload = vec![0xAB_u8; chunk_size];
let total_sent = num_chunks * chunk_size;
let mut tx_consumed = 1u16; // REQUEST was consumed

for _ in 0..num_chunks {
for tx_consumed in (1u16..).take(num_chunks) {
// Reuse descriptor slots each iteration
harness.reset_tx_cursors();

Expand All @@ -1519,7 +1495,6 @@ mod test {
harness.publish_tx(d_hdr);
notify.queue_notify(VSOCK_TX_QUEUE).unwrap();

tx_consumed += 1;
wait_for_condition(|| harness.tx_used_idx() >= tx_consumed, 5000);
}

Expand Down
2 changes: 1 addition & 1 deletion phd-tests/framework/src/disk/crucible.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ impl Inner {
// Spawn the downstairs processes that will serve requests from guest
// VMs.
let mut downstairs_instances = vec![];
for (port, dir) in downstairs_ports.iter().zip(data_dirs.into_iter()) {
for (port, dir) in downstairs_ports.iter().zip(data_dirs) {
let addr = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), *port);
let dir_arg = dir.path.to_string_lossy();
let crucible_args = [
Expand Down
2 changes: 1 addition & 1 deletion phd-tests/framework/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ impl Framework {
.with_context(|| {
format!(
"adding Propolis server '{}' from options",
&params.propolis_server_path
params.propolis_server_path
)
})?;

Expand Down
2 changes: 1 addition & 1 deletion rust-toolchain.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
# We choose a specific toolchain (rather than "stable") for repeatability. The
# intent is to keep this up-to-date with recently-released stable Rust.

channel = "1.90.0"
channel = "1.97.1"
profile = "default"
Loading