vmo-paged: use internal owner ID

This commit is contained in:
Runji Wang 2021-04-04 21:55:13 +08:00
parent ec1dab6619
commit ccad37f096
4 changed files with 25 additions and 47 deletions

View File

@ -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,

View File

@ -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(&current_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);

View File

@ -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)
}

View File

@ -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)
}