Always check shootdown reqs when locking addrsp.

This commit is contained in:
4lDO2
2024-03-04 15:17:23 +01:00
parent 3a592b9079
commit 1f8d7bc67c
13 changed files with 78 additions and 56 deletions
+2 -3
View File
@@ -83,7 +83,7 @@ impl MemoryScheme {
return Err(Error::new(EOPNOTSUPP));
}
let page = addr_space.inner.write().mmap(
let page = addr_space.acquire_write().mmap(
&addr_space,
(map.address != 0).then_some(span.base),
page_count,
@@ -134,8 +134,7 @@ impl MemoryScheme {
let current_addrsp = AddrSpace::current()?;
let base_page = current_addrsp.inner
.write()
let base_page = current_addrsp.acquire_write()
.mmap_anywhere(
&current_addrsp,
page_count,
+6 -6
View File
@@ -717,7 +717,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
let requested_dst_base = (map.address != 0).then_some(requested_dst_page);
let mut src_addr_space = addrspace.inner.write();
let mut src_addr_space = addrspace.acquire_write();
let src_page_count = NonZeroUsize::new(src_span.count).ok_or(Error::new(EINVAL))?;
@@ -734,7 +734,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
&mut notify_files,
)?
} else {
let mut dst_addrsp_guard = dst_addr_space.inner.write();
let mut dst_addrsp_guard = dst_addr_space.acquire_write();
dst_addrsp_guard.mmap(
&dst_addr_space,
requested_dst_base,
@@ -901,7 +901,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
for (dst, (grant_base, grant_info)) in dst
.iter_mut()
.zip(addrspace.inner.read().grants.iter().skip(orig_offset))
.zip(addrspace.acquire_read().grants.iter().skip(orig_offset))
{
*dst = GrantDesc {
base: grant_base.start_address().data(),
@@ -981,7 +981,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
read_from(buf, &data.buf, &mut data.offset)
}
Operation::MmapMinAddr(ref addrspace) => {
buf.write_usize(addrspace.inner.read().mmap_min)?;
buf.write_usize(addrspace.acquire_read().mmap_min)?;
Ok(mem::size_of::<usize>())
}
Operation::SchedAffinity => {
@@ -1300,7 +1300,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
if val % PAGE_SIZE != 0 || val > crate::USER_END_OFFSET {
return Err(Error::new(EINVAL));
}
addrspace.inner.write().mmap_min = val;
addrspace.acquire_write().mmap_min = val;
Ok(mem::size_of::<usize>())
}
Operation::SchedAffinity => {
@@ -1457,7 +1457,7 @@ impl<const FULL: bool> KernelScheme for ProcScheme<FULL> {
let page = Page::containing_address(VirtualAddress::new(page_addr));
match addrspace
.inner.read()
.acquire_read()
.grants
.contains(page)
.ok_or(Error::new(EINVAL))?
+2 -2
View File
@@ -32,7 +32,7 @@ pub fn resource() -> Result<Vec<u8>> {
// TODO: All user programs must have some grant in order for executable memory to even
// exist, but is this a good indicator of whether it is user or kernel?
stat_string.push(if let Ok(addr_space) = context.addr_space() {
if addr_space.inner.read().grants.is_empty() {
if addr_space.acquire_read().grants.is_empty() {
'K'
} else {
'U'
@@ -84,7 +84,7 @@ pub fn resource() -> Result<Vec<u8>> {
memory += kstack.len();
}
if let Ok(addr_space) = context.addr_space() {
for (_base, info) in addr_space.inner.read().grants.iter() {
for (_base, info) in addr_space.acquire_read().grants.iter() {
// TODO: method
if matches!(info.provider, context::memory::Provider::Allocated { .. }) {
memory += info.page_count() * PAGE_SIZE;
+6 -7
View File
@@ -242,7 +242,7 @@ impl UserInner {
tail.buf_mut()[..buf.len()].copy_from_slice(buf);
let is_pinned = true;
let dst_page = dst_addr_space.inner.write().mmap_anywhere(
let dst_page = dst_addr_space.acquire_write().mmap_anywhere(
&dst_addr_space,
ONE,
PROT_READ,
@@ -343,7 +343,7 @@ impl UserInner {
.split_at(core::cmp::min(align_offset, user_buf.len()))
.expect("split must succeed");
let mut dst_space = dst_space_lock.inner.write();
let mut dst_space = dst_space_lock.acquire_write();
let free_span = dst_space
.grants
@@ -437,7 +437,7 @@ impl UserInner {
Ok(Grant::borrow(
Arc::clone(&cur_space_lock),
&mut *cur_space_lock.inner.write(),
&mut *cur_space_lock.acquire_write(),
first_middle_src_page,
dst_page,
middle_page_count.get(),
@@ -671,8 +671,7 @@ impl UserInner {
let context = context.upgrade().ok_or(Error::new(ESRCH))?;
let (frame, _) = AddrSpace::current()?
.inner
.read()
.acquire_read()
.table
.utable
.translate(base_addr)
@@ -841,7 +840,7 @@ impl UserInner {
BorrowedFmapSource {
src_base: Page::containing_address(VirtualAddress::new(base_addr)),
addr_space_lock,
addr_space_guard: addr_space_lock.inner.write(),
addr_space_guard: addr_space_lock.acquire_write(),
mode: if map.flags.contains(MapFlags::MAP_SHARED) {
MmapMode::Shared
} else {
@@ -854,7 +853,7 @@ impl UserInner {
let page_count_nz = NonZeroUsize::new(page_count).expect("already validated map.size != 0");
let mut notify_files = Vec::new();
let dst_base = dst_addr_space.inner.write().mmap(
let dst_base = dst_addr_space.acquire_write().mmap(
&dst_addr_space,
dst_base,
page_count_nz,