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; fn decommit(&self, offset: usize, len: usize) -> ZxResult;
/// Create a child VMO. /// Create a child VMO.
fn create_child( fn create_child(&self, offset: usize, len: usize) -> ZxResult<Arc<dyn VMObjectTrait>>;
&self,
offset: usize,
len: usize,
user_id: KoID,
) -> ZxResult<Arc<dyn VMObjectTrait>>;
/// Append a mapping to the VMO's mapping list. /// Append a mapping to the VMO's mapping list.
fn append_mapping(&self, _mapping: Weak<VmMapping>) {} fn append_mapping(&self, _mapping: Weak<VmMapping>) {}
@ -143,7 +138,7 @@ impl VmObject {
Arc::new(VmObject { Arc::new(VmObject {
resizable, resizable,
_counter: CountHelper::new(), _counter: CountHelper::new(),
trait_: VMObjectPaged::new(base.id, pages), trait_: VMObjectPaged::new(pages),
inner: Mutex::new(VmObjectInner::default()), inner: Mutex::new(VmObjectInner::default()),
base, base,
}) })
@ -169,7 +164,7 @@ impl VmObject {
} }
let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN); let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN);
let size_page = pages(size); 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)?; trait_.create_contiguous(size, align_log2)?;
let vmo = Arc::new(VmObject { let vmo = Arc::new(VmObject {
base, base,
@ -190,7 +185,7 @@ impl VmObject {
) -> ZxResult<Arc<Self>> { ) -> ZxResult<Arc<Self>> {
let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN); let base = KObjectBase::with_signal(Signal::VMO_ZERO_CHILDREN);
base.set_name(&self.base.name()); 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 { let child = Arc::new(VmObject {
base, base,
resizable, resizable,

View File

@ -70,8 +70,8 @@ type WeakRef = Weak<VMObjectPaged>;
/// The mutable part of `VMObjectPaged`. /// The mutable part of `VMObjectPaged`.
struct VMObjectPagedInner { struct VMObjectPagedInner {
/// Id of this vmo object /// Owner identifier.
user_id: KoID, owner: u64,
type_: VMOType, type_: VMOType,
/// Parent node. /// Parent node.
parent: Option<Arc<VMObjectPaged>>, parent: Option<Arc<VMObjectPaged>>,
@ -157,10 +157,10 @@ impl Drop for PageState {
impl VMObjectPaged { impl VMObjectPaged {
/// Create a new VMO backing on physical memory allocated in pages. /// 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( VMObjectPaged::wrap(
VMObjectPagedInner { VMObjectPagedInner {
user_id: id, owner: new_owner_id(),
type_: VMOType::Origin, type_: VMOType::Origin,
parent: None, parent: None,
parent_offset: 0usize, parent_offset: 0usize,
@ -298,16 +298,11 @@ impl VMObjectTrait for VMObjectPaged {
Ok(()) Ok(())
} }
fn create_child( fn create_child(&self, offset: usize, len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
&self,
offset: usize,
len: usize,
user_id: KoID,
) -> ZxResult<Arc<dyn VMObjectTrait>> {
assert!(page_aligned(offset)); assert!(page_aligned(offset));
assert!(page_aligned(len)); assert!(page_aligned(len));
let (_guard, mut inner) = self.get_inner_mut(); 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) Ok(child)
} }
@ -673,12 +668,12 @@ impl VMObjectPagedInner {
while let Some(vmop) = current { while let Some(vmop) = current {
let inner = vmop.inner.borrow(); let inner = vmop.inner.borrow();
if let Some(frame) = inner.frames.get(&current_idx) { 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; count += 1;
break; break;
} }
} }
if inner.user_id != self.user_id { if inner.owner != self.owner {
break; break;
} }
current_idx += inner.parent_offset / PAGE_SIZE; current_idx += inner.parent_offset / PAGE_SIZE;
@ -730,7 +725,7 @@ impl VMObjectPagedInner {
if let Some(parent) = &self.parent { if let Some(parent) = &self.parent {
parent.inner.borrow_mut().replace_child( parent.inner.borrow_mut().replace_child(
&self.self_ref, &self.self_ref,
self.user_id, self.owner,
other_child, other_child,
Some((child.parent_offset, child.parent_limit)), Some((child.parent_offset, child.parent_limit)),
); );
@ -743,7 +738,6 @@ impl VMObjectPagedInner {
&mut self, &mut self,
offset: usize, offset: usize,
len: usize, len: usize,
user_id: KoID,
lock_ref: &Arc<Mutex<()>>, lock_ref: &Arc<Mutex<()>>,
) -> ZxResult<Arc<VMObjectPaged>> { ) -> ZxResult<Arc<VMObjectPaged>> {
// clone contiguous vmo is no longer permitted // clone contiguous vmo is no longer permitted
@ -757,7 +751,7 @@ impl VMObjectPagedInner {
// create child VMO // create child VMO
let child = VMObjectPaged::wrap( let child = VMObjectPaged::wrap(
VMObjectPagedInner { VMObjectPagedInner {
user_id, owner: new_owner_id(),
type_: VMOType::Snapshot, type_: VMOType::Snapshot,
parent: None, // set later parent: None, // set later
parent_offset: offset, parent_offset: offset,
@ -775,7 +769,7 @@ impl VMObjectPagedInner {
// construct a hidden VMO as shared parent // construct a hidden VMO as shared parent
let hidden = VMObjectPaged::wrap( let hidden = VMObjectPaged::wrap(
VMObjectPagedInner { VMObjectPagedInner {
user_id: self.user_id, owner: self.owner,
type_: VMOType::Hidden { type_: VMOType::Hidden {
left: self.self_ref.clone(), left: self.self_ref.clone(),
right: Arc::downgrade(&child), right: Arc::downgrade(&child),
@ -873,19 +867,19 @@ impl VMObjectPagedInner {
self.release_unwanted_pages_in_parent(unwanted); 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 option_parent = self.parent.clone();
let mut child = self.self_ref.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 { while let Some(parent) = option_parent {
let mut parent_inner = parent.inner.borrow_mut(); 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 (_, 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(); child = parent_inner.self_ref.clone();
assert_ne!(new_user_id, skip_user_id); assert_ne!(new_owner, skip_owner);
parent_inner.user_id = new_user_id; parent_inner.owner = new_owner;
skip_user_id = new_user_id; skip_owner = new_owner;
option_parent = parent_inner.parent.clone(); option_parent = parent_inner.parent.clone();
} else { } else {
break; break;
@ -893,7 +887,7 @@ impl VMObjectPagedInner {
} }
} }
self.user_id = other_child.user_id; self.owner = other_child.owner;
match &mut self.type_ { match &mut self.type_ {
VMOType::Hidden { left, right, .. } => { VMOType::Hidden { left, right, .. } => {
if left.ptr_eq(old) { if left.ptr_eq(old) {
@ -1043,7 +1037,6 @@ impl Drop for VMObjectPaged {
} }
} }
#[allow(dead_code)]
/// Generate a owner ID. /// Generate a owner ID.
fn new_owner_id() -> u64 { fn new_owner_id() -> u64 {
static OWNER_ID: AtomicU64 = AtomicU64::new(1); static OWNER_ID: AtomicU64 = AtomicU64::new(1);

View File

@ -86,12 +86,7 @@ impl VMObjectTrait for VMObjectPhysical {
Ok(()) Ok(())
} }
fn create_child( fn create_child(&self, _offset: usize, _len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
&self,
_offset: usize,
_len: usize,
_user_id: KoID,
) -> ZxResult<Arc<dyn VMObjectTrait>> {
Err(ZxError::NOT_SUPPORTED) Err(ZxError::NOT_SUPPORTED)
} }

View File

@ -70,12 +70,7 @@ impl VMObjectTrait for VMObjectSlice {
self.parent.decommit(offset + self.offset, len) self.parent.decommit(offset + self.offset, len)
} }
fn create_child( fn create_child(&self, _offset: usize, _len: usize) -> ZxResult<Arc<dyn VMObjectTrait>> {
&self,
_offset: usize,
_len: usize,
_user_id: u64,
) -> ZxResult<Arc<dyn VMObjectTrait>> {
Err(ZxError::NOT_SUPPORTED) Err(ZxError::NOT_SUPPORTED)
} }