| /* | 
 |  * Copyright (C) 2018 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include <sys/types.h> | 
 | #include <unistd.h> | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include <android-base/unique_fd.h> | 
 |  | 
 | namespace android { | 
 | namespace meminfo { | 
 |  | 
 | class PageAcct final { | 
 |     // Class for per-page accounting by using kernel provided interfaces like | 
 |     // kpagecount, kpageflags etc. | 
 |   public: | 
 |     static bool KernelHasPageIdle() { | 
 |         return (access("/sys/kernel/mm/page_idle/bitmap", R_OK | W_OK) == 0); | 
 |     } | 
 |  | 
 |     bool InitPageAcct(bool pageidle_enable = false); | 
 |     bool PageFlags(uint64_t pfn, uint64_t* flags); | 
 |     bool PageMapCount(uint64_t pfn, uint64_t* mapcount); | 
 |  | 
 |     int IsPageIdle(uint64_t pfn); | 
 |  | 
 |     // The only way to create PageAcct object | 
 |     static PageAcct& Instance() { | 
 |         static PageAcct instance; | 
 |         return instance; | 
 |     } | 
 |  | 
 |     ~PageAcct() = default; | 
 |  | 
 |   private: | 
 |     PageAcct() : kpagecount_fd_(-1), kpageflags_fd_(-1), pageidle_fd_(-1) {} | 
 |     int MarkPageIdle(uint64_t pfn) const; | 
 |     int GetPageIdle(uint64_t pfn) const; | 
 |  | 
 |     // Non-copyable & Non-movable | 
 |     PageAcct(const PageAcct&) = delete; | 
 |     PageAcct& operator=(const PageAcct&) = delete; | 
 |     PageAcct& operator=(PageAcct&&) = delete; | 
 |     PageAcct(PageAcct&&) = delete; | 
 |  | 
 |     ::android::base::unique_fd kpagecount_fd_; | 
 |     ::android::base::unique_fd kpageflags_fd_; | 
 |     ::android::base::unique_fd pageidle_fd_; | 
 | }; | 
 |  | 
 | // Returns if the page present bit is set in the value | 
 | // passed in. | 
 | bool page_present(uint64_t pagemap_val); | 
 |  | 
 | // Returns if the page swapped bit is set in the value | 
 | // passed in. | 
 | bool page_swapped(uint64_t pagemap_val); | 
 |  | 
 | // Returns the page frame number (physical page) from | 
 | // pagemap value | 
 | uint64_t page_pfn(uint64_t pagemap_val); | 
 |  | 
 | }  // namespace meminfo | 
 | }  // namespace android |