Remove unnecessary clones and pass CallerCtx to call()

This commit is contained in:
bjorn3
2026-02-08 12:46:08 +01:00
parent 5c6af01a9a
commit f88cbf96ee
+68 -55
View File
@@ -185,16 +185,15 @@ impl UserInner {
fn call(
&self,
ctx: CallerCtx,
opcode: Opcode,
args: impl Args,
caller_responsible: &mut PageSpan,
token: &mut CleanLockToken,
) -> Result<usize> {
let ctx = { context::current().read(token.token()).caller_ctx() };
match self.call_extended(ctx, None, opcode, args, caller_responsible, token)? {
Response::Regular(code, _) => Error::demux(code),
Response::Fd(_) => Err(Error::new(EIO)),
Response::MultipleFds(_) => Err(Error::new(EIO)),
Response::Fd(_) | Response::MultipleFds(_) => Err(Error::new(EIO)),
}
}
@@ -1400,12 +1399,12 @@ impl KernelScheme for UserScheme {
file: usize,
path: &str,
flags: usize,
_ctx: CallerCtx,
ctx: CallerCtx,
token: &mut CleanLockToken,
) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.copy_and_capture_tail(path.as_bytes(), token)?;
inner.call(
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
self.inner.call(
ctx,
Opcode::UnlinkAt,
[file, address.base(), address.len(), flags],
address.span(),
@@ -1415,15 +1414,17 @@ impl KernelScheme for UserScheme {
}
fn fsize(&self, file: usize, token: &mut CleanLockToken) -> Result<u64> {
let inner = self.inner.clone();
inner
.call(Opcode::Fsize, [file], &mut PageSpan::empty(), token)
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner
.call(ctx, Opcode::Fsize, [file], &mut PageSpan::empty(), token)
.map(|o| o as u64)
}
fn fchmod(&self, file: usize, mode: u16, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let inner = self.inner.clone();
inner.call(
ctx,
Opcode::Fchmod,
[file, mode as usize],
&mut PageSpan::empty(),
@@ -1441,8 +1442,9 @@ impl KernelScheme for UserScheme {
}
}
let inner = self.inner.clone();
inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Fchown,
[file, uid as usize, gid as usize],
&mut PageSpan::empty(),
@@ -1458,8 +1460,9 @@ impl KernelScheme for UserScheme {
arg: usize,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Fcntl,
[file, cmd, arg],
&mut PageSpan::empty(),
@@ -1473,9 +1476,10 @@ impl KernelScheme for UserScheme {
flags: EventFlags,
token: &mut CleanLockToken,
) -> Result<EventFlags> {
let inner = self.inner.clone();
inner
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner
.call(
ctx,
Opcode::Fevent,
[file, flags.bits()],
&mut PageSpan::empty(),
@@ -1488,12 +1492,13 @@ impl KernelScheme for UserScheme {
&self,
file: usize,
path: &str,
_ctx: CallerCtx,
ctx: CallerCtx,
token: &mut CleanLockToken,
) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.copy_and_capture_tail(path.as_bytes(), token)?;
inner.call(
ctx,
Opcode::Flink,
[file, address.base(), address.len()],
address.span(),
@@ -1506,12 +1511,12 @@ impl KernelScheme for UserScheme {
&self,
file: usize,
path: &str,
_ctx: CallerCtx,
ctx: CallerCtx,
token: &mut CleanLockToken,
) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.copy_and_capture_tail(path.as_bytes(), token)?;
inner.call(
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
self.inner.call(
ctx,
Opcode::Frename,
[file, address.base(), address.len()],
address.span(),
@@ -1521,14 +1526,16 @@ impl KernelScheme for UserScheme {
}
fn fsync(&self, file: usize, token: &mut CleanLockToken) -> Result<()> {
let inner = self.inner.clone();
inner.call(Opcode::Fsync, [file], &mut PageSpan::empty(), token)?;
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner
.call(ctx, Opcode::Fsync, [file], &mut PageSpan::empty(), token)?;
Ok(())
}
fn ftruncate(&self, file: usize, len: usize, token: &mut CleanLockToken) -> Result<()> {
let inner = self.inner.clone();
inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Ftruncate,
[file, len],
&mut PageSpan::empty(),
@@ -1538,14 +1545,14 @@ impl KernelScheme for UserScheme {
}
fn close(&self, id: usize, token: &mut CleanLockToken) -> Result<()> {
let inner = self.inner.clone();
if !inner.supports_on_close {
let inner = self.inner.clone();
inner.call(Opcode::Close, [id], &mut PageSpan::empty(), token)?;
let ctx = { context::current().read(token.token()).caller_ctx() };
if !self.inner.supports_on_close {
self.inner
.call(ctx, Opcode::Close, [id], &mut PageSpan::empty(), token)?;
return Ok(());
}
inner.todo.send(
self.inner.todo.send(
Sqe {
opcode: Opcode::CloseMsg as u8,
sqe_flags: SqeFlags::empty(),
@@ -1557,7 +1564,7 @@ impl KernelScheme for UserScheme {
token,
);
event::trigger(inner.root_id, inner.scheme_id.get(), EVENT_READ);
event::trigger(self.inner.root_id, self.inner.scheme_id.get(), EVENT_READ);
Ok(())
}
@@ -1594,9 +1601,10 @@ impl KernelScheme for UserScheme {
}
}
fn kfpath(&self, file: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result<usize> {
let inner = self.inner.clone();
let mut address = inner.capture_user(buf, token)?;
let result = inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Fpath,
[file, address.base(), address.len()],
address.span(),
@@ -1615,10 +1623,11 @@ impl KernelScheme for UserScheme {
_stored_flags: u32,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = inner.capture_user(buf, token)?;
let result = inner.call(
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Read,
[
file as u64,
@@ -1644,10 +1653,11 @@ impl KernelScheme for UserScheme {
_stored_flags: u32,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = inner.capture_user(buf, token)?;
let result = inner.call(
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Write,
[
file as u64,
@@ -1669,9 +1679,10 @@ impl KernelScheme for UserScheme {
buf: UserSliceRo,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
let mut address = inner.capture_user(buf, token)?;
let result = inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Futimens,
[file, address.base(), address.len()],
address.span(),
@@ -1688,13 +1699,14 @@ impl KernelScheme for UserScheme {
opaque_id_start: u64,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
let mut address = inner.capture_user(buf, token)?;
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
// TODO: Support passing the 16-byte record_len of the last dent, to make it possible to
// iterate backwards without first interating forward? The last entry will contain the
// opaque id to pass to the next getdents. Since this field is small, this would fit in the
// extra_raw field of `Cqe`s.
let result = inner.call(
let result = self.inner.call(
ctx,
Opcode::Getdents,
[
file,
@@ -1710,9 +1722,10 @@ impl KernelScheme for UserScheme {
result
}
fn kfstat(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.capture_user(stat, token)?;
let result = inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(stat, token)?;
let result = self.inner.call(
ctx,
Opcode::Fstat,
[file, address.base(), address.len()],
address.span(),
@@ -1722,9 +1735,10 @@ impl KernelScheme for UserScheme {
result.map(|_| ())
}
fn kfstatvfs(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.capture_user(stat, token)?;
let result = inner.call(
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(stat, token)?;
let result = self.inner.call(
ctx,
Opcode::Fstatvfs,
[file, address.base(), address.len()],
address.span(),
@@ -1741,9 +1755,8 @@ impl KernelScheme for UserScheme {
_consume: bool,
token: &mut CleanLockToken,
) -> Result<usize> {
let inner = self.inner.clone();
inner.fmap_inner(Arc::clone(addr_space), file, map, token)
self.inner
.fmap_inner(Arc::clone(addr_space), file, map, token)
}
fn kfunmap(
&self,