[kernel][vm][object] Move pager id into vmo dispatcher
Test: /boot/test/core/pager-test
ZX-1480 #comment [kernel][vm][object] Move pager id into vmo dispatcher
Change-Id: I91f7a646f7a0a162977f8b71b5c0880d1384d54d
diff --git a/kernel/object/include/object/pager_dispatcher.h b/kernel/object/include/object/pager_dispatcher.h
index 6e9157e..0313266 100644
--- a/kernel/object/include/object/pager_dispatcher.h
+++ b/kernel/object/include/object/pager_dispatcher.h
@@ -25,8 +25,7 @@
class PagerSource : public PageSource , public PortAllocator,
public fbl::DoublyLinkedListable<fbl::RefPtr<PagerSource>> {
private:
- PagerSource(uint64_t page_source_id,
- PagerDispatcher* dispatcher, fbl::RefPtr<PortDispatcher> port, uint64_t key);
+ PagerSource(PagerDispatcher* dispatcher, fbl::RefPtr<PortDispatcher> port, uint64_t key);
virtual ~PagerSource();
friend fbl::RefPtr<PagerSource>;
diff --git a/kernel/object/include/object/vm_object_dispatcher.h b/kernel/object/include/object/vm_object_dispatcher.h
index e3bb489..79d137a 100644
--- a/kernel/object/include/object/vm_object_dispatcher.h
+++ b/kernel/object/include/object/vm_object_dispatcher.h
@@ -21,6 +21,13 @@
public:
static zx_status_t Create(fbl::RefPtr<VmObject> vmo,
fbl::RefPtr<Dispatcher>* dispatcher,
+ zx_rights_t* rights) {
+ return Create(std::move(vmo), ZX_KOID_INVALID, dispatcher, rights);
+ }
+
+ static zx_status_t Create(fbl::RefPtr<VmObject> vmo,
+ zx_koid_t pager_koid,
+ fbl::RefPtr<Dispatcher>* dispatcher,
zx_rights_t* rights);
~VmObjectDispatcher() final;
@@ -52,9 +59,10 @@
zx_info_vmo_t GetVmoInfo();
const fbl::RefPtr<VmObject>& vmo() const { return vmo_; }
+ zx_koid_t pager_koid() const { return pager_koid_; }
private:
- explicit VmObjectDispatcher(fbl::RefPtr<VmObject> vmo);
+ explicit VmObjectDispatcher(fbl::RefPtr<VmObject> vmo, zx_koid_t pager_koid);
fbl::Canary<fbl::magic("VMOD")> canary_;
@@ -63,6 +71,10 @@
// except during destruction.
fbl::RefPtr<VmObject> const vmo_;
+ // The koid of the related pager object, or ZX_KOID_INVALID if
+ // there is no related pager.
+ const zx_koid_t pager_koid_;
+
// VMOs do not currently maintain any VMO-specific signal state,
// but do allow user signals to be set. In addition, the CookieJar
// shares the same lock.
diff --git a/kernel/object/pager_dispatcher.cpp b/kernel/object/pager_dispatcher.cpp
index bb4b7bd..4535158 100644
--- a/kernel/object/pager_dispatcher.cpp
+++ b/kernel/object/pager_dispatcher.cpp
@@ -32,7 +32,7 @@
zx_status_t PagerDispatcher::CreateSource(fbl::RefPtr<PortDispatcher> port,
uint64_t key, fbl::RefPtr<PageSource>* src_out) {
fbl::AllocChecker ac;
- auto src = fbl::AdoptRef(new (&ac) PagerSource(get_koid(), this, ktl::move(port), key));
+ auto src = fbl::AdoptRef(new (&ac) PagerSource(this, ktl::move(port), key));
if (!ac.check()) {
return ZX_ERR_NO_MEMORY;
}
@@ -63,9 +63,9 @@
}
}
-PagerSource::PagerSource(uint64_t page_source_id, PagerDispatcher* dispatcher,
+PagerSource::PagerSource(PagerDispatcher* dispatcher,
fbl::RefPtr<PortDispatcher> port, uint64_t key)
- : PageSource(page_source_id), pager_(dispatcher), port_(ktl::move(port)), key_(key) {
+ : PageSource(), pager_(dispatcher), port_(ktl::move(port)), key_(key) {
LTRACEF("%p key %lx\n", this, key_);
}
diff --git a/kernel/object/vm_object_dispatcher.cpp b/kernel/object/vm_object_dispatcher.cpp
index d346bc0..ffac441 100644
--- a/kernel/object/vm_object_dispatcher.cpp
+++ b/kernel/object/vm_object_dispatcher.cpp
@@ -21,10 +21,11 @@
#define LOCAL_TRACE 0
zx_status_t VmObjectDispatcher::Create(fbl::RefPtr<VmObject> vmo,
+ zx_koid_t pager_koid,
fbl::RefPtr<Dispatcher>* dispatcher,
zx_rights_t* rights) {
fbl::AllocChecker ac;
- auto disp = new (&ac) VmObjectDispatcher(ktl::move(vmo));
+ auto disp = new (&ac) VmObjectDispatcher(ktl::move(vmo), pager_koid);
if (!ac.check())
return ZX_ERR_NO_MEMORY;
@@ -34,8 +35,8 @@
return ZX_OK;
}
-VmObjectDispatcher::VmObjectDispatcher(fbl::RefPtr<VmObject> vmo)
- : SoloDispatcher(ZX_VMO_ZERO_CHILDREN), vmo_(vmo) {
+VmObjectDispatcher::VmObjectDispatcher(fbl::RefPtr<VmObject> vmo, zx_koid_t pager_koid)
+ : SoloDispatcher(ZX_VMO_ZERO_CHILDREN), vmo_(vmo), pager_koid_(pager_koid) {
vmo_->SetChildObserver(this);
}
diff --git a/kernel/syscalls/pager.cpp b/kernel/syscalls/pager.cpp
index 7c4c666..349ac62 100644
--- a/kernel/syscalls/pager.cpp
+++ b/kernel/syscalls/pager.cpp
@@ -62,7 +62,7 @@
fbl::RefPtr<Dispatcher> dispatcher;
zx_rights_t rights;
- status = VmObjectDispatcher::Create(vmo, &dispatcher, &rights);
+ status = VmObjectDispatcher::Create(vmo, pager_dispatcher->get_koid(), &dispatcher, &rights);
if (status != ZX_OK) {
return status;
}
@@ -86,7 +86,7 @@
return status;
}
- if (vmo_dispatcher->vmo()->get_page_source_id() != pager_dispatcher->get_koid()) {
+ if (vmo_dispatcher->pager_koid() != pager_dispatcher->get_koid()) {
return ZX_ERR_INVALID_ARGS;
}
@@ -112,7 +112,7 @@
return status;
}
- if (pager_vmo_dispatcher->vmo()->get_page_source_id() != pager_dispatcher->get_koid()) {
+ if (pager_vmo_dispatcher->pager_koid() != pager_dispatcher->get_koid()) {
return ZX_ERR_INVALID_ARGS;
}
diff --git a/kernel/vm/include/vm/page_source.h b/kernel/vm/include/vm/page_source.h
index e21a954..6ebf98f 100644
--- a/kernel/vm/include/vm/page_source.h
+++ b/kernel/vm/include/vm/page_source.h
@@ -50,7 +50,7 @@
// Object which provides pages to a vm_object.
class PageSource : public fbl::RefCounted<PageSource> {
public:
- PageSource(uint64_t page_source_id);
+ PageSource();
virtual ~PageSource();
// Sends a request to the backing source to provide the requested page.
@@ -75,9 +75,6 @@
// calls will fail.
void Close();
- // Gets an id used for ownership verification.
- uint64_t get_page_source_id() const { return page_source_id_; }
-
protected:
// Synchronously gets a page from the backing source.
virtual bool GetPage(uint64_t offset,
@@ -103,8 +100,6 @@
private:
fbl::Canary<fbl::magic("VMPS")> canary_;
- const uint64_t page_source_id_;
-
mutable DECLARE_MUTEX(PageSource) page_source_mtx_;
bool detached_ TA_GUARDED(page_source_mtx_) = false;
bool closed_ TA_GUARDED(page_source_mtx_) = false;
diff --git a/kernel/vm/include/vm/vm_object.h b/kernel/vm/include/vm/vm_object.h
index 14b265f..c90d41e 100644
--- a/kernel/vm/include/vm/vm_object.h
+++ b/kernel/vm/include/vm/vm_object.h
@@ -242,8 +242,6 @@
return ZX_OK;
}
- virtual uint64_t get_page_source_id() const { return 0; }
-
// Detaches the underlying page source, if present. Can be called multiple times.
virtual void DetachSource() {}
diff --git a/kernel/vm/include/vm/vm_object_paged.h b/kernel/vm/include/vm/vm_object_paged.h
index dcd1cd0..eabeea2 100644
--- a/kernel/vm/include/vm/vm_object_paged.h
+++ b/kernel/vm/include/vm/vm_object_paged.h
@@ -111,12 +111,6 @@
uint32_t GetMappingCachePolicy() const override;
zx_status_t SetMappingCachePolicy(const uint32_t cache_policy) override;
- uint64_t get_page_source_id() const override {
- if (page_source_) {
- return page_source_->get_page_source_id();
- }
- return 0;
- }
void DetachSource() override {
DEBUG_ASSERT(page_source_);
page_source_->Detach();
diff --git a/kernel/vm/page_source.cpp b/kernel/vm/page_source.cpp
index f82d64e..67d5dca 100644
--- a/kernel/vm/page_source.cpp
+++ b/kernel/vm/page_source.cpp
@@ -12,7 +12,7 @@
#define LOCAL_TRACE 0
-PageSource::PageSource(uint64_t page_source_id) : page_source_id_(page_source_id) {
+PageSource::PageSource() {
LTRACEF("%p\n", this);
}