1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License. 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License. 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifndef _PAGEMAP_PAGEMAP_H 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define _PAGEMAP_PAGEMAP_H 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdint.h> 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h> 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_memusage pm_memusage_t; 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Holds the various metrics for memory usage of a process or a mapping. */ 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_memusage { 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t vss; 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t rss; 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t pss; 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t uss; 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}; 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Clears a memusage. */ 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid pm_memusage_zero(pm_memusage_t *mu); 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Adds one memusage (a) to another (b). */ 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid pm_memusage_add(pm_memusage_t *a, pm_memusage_t *b); 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_kernel pm_kernel_t; 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_process pm_process_t; 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_map pm_map_t; 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_kernel_t holds the state necessary to interface to the kernel's pagemap 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * system on a global level. */ 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_kernel { 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int kpagecount_fd; 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int kpageflags_fd; 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int pagesize; 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}; 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_process_t holds the state necessary to interface to a particular process' 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * pagemap. */ 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_process { 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pm_kernel_t *ker; 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pid_t pid; 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pm_map_t **maps; 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int num_maps; 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int pagemap_fd; 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}; 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_map_t holds the state necessary to access information about a particular 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * mapping in a particular process. */ 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_map { 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pm_process_t *proc; 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned long start; 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned long end; 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned long offset; 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int flags; 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char *name; 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}; 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Create a pm_kernel_t. */ 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_create(pm_kernel_t **ker_out); 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_kernel_pagesize(ker) ((ker)->pagesize) 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get a list of probably-existing PIDs (returned through *pids_out). 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Length of the array (in sizeof(pid_t) units) is returned through *len. 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array should be freed by the caller. */ 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_pids(pm_kernel_t *ker, pid_t **pids_out, size_t *len); 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the map count (from /proc/kpagecount) of a physical frame. 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The count is returned through *count_out. */ 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_count(pm_kernel_t *ker, unsigned long pfn, uint64_t *count_out); 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the page flags (from /proc/kpageflags) of a physical frame. 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The count is returned through *flags_out. */ 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_flags(pm_kernel_t *ker, unsigned long pfn, uint64_t *flags_out); 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_LOCKED (1 << 0) 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_ERROR (1 << 1) 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_REFERENCED (1 << 2) 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_UPTODATE (1 << 3) 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_DIRTY (1 << 4) 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_LRU (1 << 5) 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_ACTIVE (1 << 6) 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_SLAB (1 << 7) 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_WRITEBACK (1 << 8) 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_RECLAIM (1 << 9) 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_BUDDY (1 << 10) 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Destroy a pm_kernel_t. */ 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_destroy(pm_kernel_t *ker); 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PID of a pm_process_t. */ 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_process_pid(proc) ((proc)->pid) 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Create a pm_process_t and returns it through *proc_out. 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Takes a pm_kernel_t, and the PID of the process. */ 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_create(pm_kernel_t *ker, pid_t pid, pm_process_t **proc_out); 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the total memory usage of a process and store in *usage_out. */ 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_usage(pm_process_t *proc, pm_memusage_t *usage_out); 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the working set of a process (if ws_out != NULL), and reset it 122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * (if reset != 0). */ 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_workingset(pm_process_t *proc, pm_memusage_t *ws_out, int reset); 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PFNs corresponding to a range of virtual addresses. 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array of PFNs is returned through *range_out, and the caller has the 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * responsibility to free it. */ 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_pagemap_range(pm_process_t *proc, 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned long low, unsigned long hi, 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project uint64_t **range_out, size_t *len); 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 13276e6cb55fed01824e44306aa0485a3f8f122b228Selim Gurun#define _BITS(x, offset, bits) (((x) >> offset) & ((1LL << (bits)) - 1)) 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_PRESENT(x) (_BITS(x, 63, 1)) 13576e6cb55fed01824e44306aa0485a3f8f122b228Selim Gurun#define PM_PAGEMAP_SWAPPED(x) (_BITS(x, 62, 1)) 136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SHIFT(x) (_BITS(x, 55, 6)) 137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_PFN(x) (_BITS(x, 0, 55)) 138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SWAP_OFFSET(x) (_BITS(x, 5, 50)) 139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SWAP_TYPE(x) (_BITS(x, 0, 5)) 140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the maps in the virtual address space of this process. 142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Returns an array of pointers to pm_map_t through *maps. 143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array should be freed by the caller, but the maps should not be 144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * modified or destroyed. */ 145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_maps(pm_process_t *proc, pm_map_t ***maps_out, size_t *len); 146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Destroy a pm_process_t. */ 148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_destroy(pm_process_t *proc); 149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the name, flags, start/end address, or offset of a map. */ 151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_name(map) ((map)->name) 152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_flags(map) ((map)->flags) 153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_READ 1 154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_WRITE 2 155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_EXEC 4 156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_start(map) ((map)->start) 157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_end(map) ((map)->end) 158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_offset(map) ((map)->offset) 159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PFNs of the pages in the virtual address space of this map. 161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Array of PFNs is returned through *pagemap_out, and should be freed by the 162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * caller. */ 163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_pagemap(pm_map_t *map, uint64_t **pagemap_out, size_t *len); 164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the memory usage of this map alone. */ 166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out); 167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the working set of this map alone. */ 169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out); 170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 172