forked from rcore-os/zCore
vmo-paged: use internal owner ID
This commit is contained in:
parent
ec1dab6619
commit
ccad37f096
|
@ -60,12 +60,7 @@ pub trait VMObjectTrait: Sync + Send {
|
|||
fn decommit(&self, offset: usize, len: usize) -> ZxResult;
|
||||
|
||||
/// Create a child VMO.
|
||||
fn create_child(
|
||||
&self,
|
||||
offset: usize,
|
||||
len: usize,
|
||||
user_id: KoID,
|
||||
) -> ZxResult<Arc<dyn VMObjectTrait>>;
|
||||
fn create_child(&self, offset: usize, len: usize) -> ZxResult<Arc<dyn VMObjectTrait>>;
|
||||
|
||||
/// Append a mapping to the VMO's mapping list.
|
||||
fn append_mapping(&self, _mapping: Weak<VmMapping>) {}
|
||||
|
@ -143,7 +138,7 @@ impl VmObject {
|
|||
Arc::new(VmObject {
|
||||
resizable,
|
||||
_counter: CountHelper::new(),
|
||||
trait_: VMObjectPaged::new(base.id, pages),
|
||||
trait_: VMObjectPaged::new(pages),
|
||||
inner: Mutex::new(VmObjectInner::default()),
|
||||
base,
|
||||
})
|
||||
|
@ -169,7 +164,7 @@ impl VmObject {
|
|||
}
|
||||
let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN);
|
||||
let size_page = pages(size);
|
||||
let trait_ = VMObjectPaged::new(base.id, size_page);
|
||||
let trait_ = VMObjectPaged::new(size_page);
|
||||
trait_.create_contiguous(size, align_log2)?;
|
||||
let vmo = Arc::new(VmObject {
|
||||
base,
|
||||
|
@ -190,7 +185,7 @@ impl VmObject {
|
|||
) -> ZxResult<Arc<Self>> {
|
||||
let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN);
|
||||
base.set_name(&self.base.name());
|
||||
let trait_ = self.trait_.create_child(offset, len, base.id)?;
|
||||
let trait_ = self.trait_.create_child(offset, len)?;
|
||||
let child = Arc::new(VmObject {
|
||||
base,
|
||||
resizable,
|
||||
|
|
|
@ -70,8 +70,8 @@ type WeakRef = Weak<VMObjectPaged>;
|
|||
|
||||
/// The mutable part of `VMObjectPaged`.
|
||||
struct VMObjectPagedInner {
|
||||
/// Id of this vmo object
|
||||
user_id: KoID,
|
||||
/// Owner identifier.
|
||||
owner: u64,
|
||||
type_: VMOType,
|
||||
/// Parent node.
|
||||
parent: Option<Arc<VMObjectPaged>>,
|
||||
|
@ -157,10 +157,10 @@ impl Drop for PageState {
|
|||
|
||||
impl VMObjectPaged {
|
||||
/// Create a new VMO backing on physical memory allocated in pages.
|
||||
pub fn new(id: KoID, pages: usize) -> Arc<Self> {
|
||||
pub fn new(pages: usize) -> Arc<Self> {
|
||||
VMObjectPaged::wrap(
|
||||
VMObjectPagedInner {
|
||||
user_id: id,
|
||||
owner: new_owner_id(),
|
||||
type_: VMOType::Origin,
|
||||
parent: None,
|
||||
parent_offset: 0usize,
|
||||
|
@ -298,16 +298,11 @@ impl VMObjectTrait for VMObjectPaged {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn create_child(
|
||||
&self,
|
||||
offset: usize,
|
||||
len: usize,
|
||||
user_id: KoID,
|
||||
) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
fn create_child(&self, offset: usize, len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
assert!(page_aligned(offset));
|
||||
assert!(page_aligned(len));
|
||||
let (_guard, mut inner) = self.get_inner_mut();
|
||||
let child = inner.create_child(offset, len, user_id, &self.lock)?;
|
||||
let child = inner.create_child(offset, len, &self.lock)?;
|
||||
Ok(child)
|
||||
}
|
||||
|
||||
|
@ -673,12 +668,12 @@ impl VMObjectPagedInner {
|
|||
while let Some(vmop) = current {
|
||||
let inner = vmop.inner.borrow();
|
||||
if let Some(frame) = inner.frames.get(¤t_idx) {
|
||||
if frame.tag.is_split() || inner.user_id == self.user_id {
|
||||
if frame.tag.is_split() || inner.owner == self.owner {
|
||||
count += 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if inner.user_id != self.user_id {
|
||||
if inner.owner != self.owner {
|
||||
break;
|
||||
}
|
||||
current_idx += inner.parent_offset / PAGE_SIZE;
|
||||
|
@ -730,7 +725,7 @@ impl VMObjectPagedInner {
|
|||
if let Some(parent) = &self.parent {
|
||||
parent.inner.borrow_mut().replace_child(
|
||||
&self.self_ref,
|
||||
self.user_id,
|
||||
self.owner,
|
||||
other_child,
|
||||
Some((child.parent_offset, child.parent_limit)),
|
||||
);
|
||||
|
@ -743,7 +738,6 @@ impl VMObjectPagedInner {
|
|||
&mut self,
|
||||
offset: usize,
|
||||
len: usize,
|
||||
user_id: KoID,
|
||||
lock_ref: &Arc<Mutex<()>>,
|
||||
) -> ZxResult<Arc<VMObjectPaged>> {
|
||||
// clone contiguous vmo is no longer permitted
|
||||
|
@ -757,7 +751,7 @@ impl VMObjectPagedInner {
|
|||
// create child VMO
|
||||
let child = VMObjectPaged::wrap(
|
||||
VMObjectPagedInner {
|
||||
user_id,
|
||||
owner: new_owner_id(),
|
||||
type_: VMOType::Snapshot,
|
||||
parent: None, // set later
|
||||
parent_offset: offset,
|
||||
|
@ -775,7 +769,7 @@ impl VMObjectPagedInner {
|
|||
// construct a hidden VMO as shared parent
|
||||
let hidden = VMObjectPaged::wrap(
|
||||
VMObjectPagedInner {
|
||||
user_id: self.user_id,
|
||||
owner: self.owner,
|
||||
type_: VMOType::Hidden {
|
||||
left: self.self_ref.clone(),
|
||||
right: Arc::downgrade(&child),
|
||||
|
@ -873,19 +867,19 @@ impl VMObjectPagedInner {
|
|||
|
||||
self.release_unwanted_pages_in_parent(unwanted);
|
||||
|
||||
if old_id == self.user_id {
|
||||
if old_id == self.owner {
|
||||
let mut option_parent = self.parent.clone();
|
||||
let mut child = self.self_ref.clone();
|
||||
let mut skip_user_id = old_id;
|
||||
let mut skip_owner = old_id;
|
||||
while let Some(parent) = option_parent {
|
||||
let mut parent_inner = parent.inner.borrow_mut();
|
||||
if parent_inner.user_id == old_id {
|
||||
if parent_inner.owner == old_id {
|
||||
let (_, other) = parent_inner.type_.get_tag_and_other(&child);
|
||||
let new_user_id = other.upgrade().unwrap().inner.borrow().user_id;
|
||||
let new_owner = other.upgrade().unwrap().inner.borrow().owner;
|
||||
child = parent_inner.self_ref.clone();
|
||||
assert_ne!(new_user_id, skip_user_id);
|
||||
parent_inner.user_id = new_user_id;
|
||||
skip_user_id = new_user_id;
|
||||
assert_ne!(new_owner, skip_owner);
|
||||
parent_inner.owner = new_owner;
|
||||
skip_owner = new_owner;
|
||||
option_parent = parent_inner.parent.clone();
|
||||
} else {
|
||||
break;
|
||||
|
@ -893,7 +887,7 @@ impl VMObjectPagedInner {
|
|||
}
|
||||
}
|
||||
|
||||
self.user_id = other_child.user_id;
|
||||
self.owner = other_child.owner;
|
||||
match &mut self.type_ {
|
||||
VMOType::Hidden { left, right, .. } => {
|
||||
if left.ptr_eq(old) {
|
||||
|
@ -1043,7 +1037,6 @@ impl Drop for VMObjectPaged {
|
|||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
/// Generate a owner ID.
|
||||
fn new_owner_id() -> u64 {
|
||||
static OWNER_ID: AtomicU64 = AtomicU64::new(1);
|
||||
|
|
|
@ -86,12 +86,7 @@ impl VMObjectTrait for VMObjectPhysical {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn create_child(
|
||||
&self,
|
||||
_offset: usize,
|
||||
_len: usize,
|
||||
_user_id: KoID,
|
||||
) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
fn create_child(&self, _offset: usize, _len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
Err(ZxError::NOT_SUPPORTED)
|
||||
}
|
||||
|
||||
|
|
|
@ -70,12 +70,7 @@ impl VMObjectTrait for VMObjectSlice {
|
|||
self.parent.decommit(offset + self.offset, len)
|
||||
}
|
||||
|
||||
fn create_child(
|
||||
&self,
|
||||
_offset: usize,
|
||||
_len: usize,
|
||||
_user_id: u64,
|
||||
) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
fn create_child(&self, _offset: usize, _len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
|
||||
Err(ZxError::NOT_SUPPORTED)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue