.. and make sure we have some helper methods exposed to the clients to do some basic checks for the pagemap values. For example, to check if the page is present or swapped. Bug: 111694435 Test: libmeminfo_test 1 --gtest_filter=ValidateProcMemInfo.TestPageMap Test: libmeminfo_test 1 Change-Id: Ic6ae91f4214b42346f3d0b54164a43ac79d5ade1 Signed-off-by: Sandeep Patil <sspatil@google.com>
81 lines
2.3 KiB
C++
81 lines
2.3 KiB
C++
/*
|
|
* 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
|