[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);
 }