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;
|
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,
|
||||||
|
|
|
@ -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(¤t_idx) {
|
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;
|
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);
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue