blob: 82158ca716ad8695b2b7fbc8a038ee70675119af [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_STATS_H_
#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_STATS_H_
#include <cstddef>
#include <cstdint>
#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h"
#include "base/allocator/partition_allocator/partition_alloc_buildflags.h"
#include "base/allocator/partition_allocator/partition_alloc_config.h"
#include "base/allocator/partition_allocator/partition_alloc_constants.h"
namespace partition_alloc {
// Most of these are not populated if PA_THREAD_CACHE_ENABLE_STATISTICS is not
// defined.
struct ThreadCacheStats {
uint64_t alloc_count; // Total allocation requests.
uint64_t alloc_hits; // Thread cache hits.
uint64_t alloc_misses; // Thread cache misses.
// Allocation failure details:
uint64_t alloc_miss_empty;
uint64_t alloc_miss_too_large;
// Cache fill details:
uint64_t cache_fill_count;
uint64_t cache_fill_hits;
uint64_t cache_fill_misses; // Object too large.
uint64_t batch_fill_count; // Number of central allocator requests.
// Memory cost:
uint32_t bucket_total_memory;
uint32_t metadata_overhead;
#if PA_CONFIG(THREAD_CACHE_ALLOC_STATS)
uint64_t allocs_per_bucket_[internal::kNumBuckets + 1];
#endif // PA_CONFIG(THREAD_CACHE_ALLOC_STATS)
};
// Per-thread allocation statistics. Only covers allocations made through the
// partition linked to the thread cache. As the allocator doesn't record
// requested sizes in most cases, the data there will be an overestimate of the
// actually requested sizes. It is also not expected to sum up to anything
// meaningful across threads, due to the lack of synchronization. Figures there
// are cumulative, not net. Since the data below is per-thread, note a thread
// can deallocate more than it allocated.
struct ThreadAllocStats {
uint64_t alloc_count;
uint64_t alloc_total_size;
uint64_t dealloc_count;
uint64_t dealloc_total_size;
};
// Struct used to retrieve total memory usage of a partition. Used by
// PartitionStatsDumper implementation.
struct PartitionMemoryStats {
size_t total_mmapped_bytes; // Total bytes mmap()-ed from the system.
size_t total_committed_bytes; // Total size of committed pages.
size_t max_committed_bytes; // Max size of committed pages.
size_t total_allocated_bytes; // Total size of allcoations.
size_t max_allocated_bytes; // Max size of allocations.
size_t total_resident_bytes; // Total bytes provisioned by the partition.
size_t total_active_bytes; // Total active bytes in the partition.
size_t total_active_count; // Total count of active objects in the partition.
size_t total_decommittable_bytes; // Total bytes that could be decommitted.
size_t total_discardable_bytes; // Total bytes that could be discarded.
#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
size_t
total_brp_quarantined_bytes; // Total bytes that are quarantined by BRP.
size_t total_brp_quarantined_count; // Total number of slots that are
// quarantined by BRP.
size_t cumulative_brp_quarantined_bytes; // Cumulative bytes that are
// quarantined by BRP.
size_t cumulative_brp_quarantined_count; // Cumulative number of slots that
// are quarantined by BRP.
#endif
bool has_thread_cache;
ThreadCacheStats current_thread_cache_stats;
ThreadCacheStats all_thread_caches_stats;
// Count and total duration of system calls made since process start. May not
// be reported on all platforms.
uint64_t syscall_count;
uint64_t syscall_total_time_ns;
};
// Struct used to retrieve memory statistics about a partition bucket. Used by
// PartitionStatsDumper implementation.
struct PartitionBucketMemoryStats {
bool is_valid; // Used to check if the stats is valid.
bool is_direct_map; // True if this is a direct mapping; size will not be
// unique.
uint32_t bucket_slot_size; // The size of the slot in bytes.
uint32_t allocated_slot_span_size; // Total size the slot span allocated
// from the system (committed pages).
uint32_t active_bytes; // Total active bytes used in the bucket.
uint32_t active_count; // Total active objects allocated in the bucket.
uint32_t resident_bytes; // Total bytes provisioned in the bucket.
uint32_t decommittable_bytes; // Total bytes that could be decommitted.
uint32_t discardable_bytes; // Total bytes that could be discarded.
uint32_t num_full_slot_spans; // Number of slot spans with all slots
// allocated.
uint32_t num_active_slot_spans; // Number of slot spans that have at least
// one provisioned slot.
uint32_t num_empty_slot_spans; // Number of slot spans that are empty
// but not decommitted.
uint32_t num_decommitted_slot_spans; // Number of slot spans that are empty
// and decommitted.
};
// Interface that is passed to PartitionDumpStats and
// PartitionDumpStats for using the memory statistics.
class PA_COMPONENT_EXPORT(PARTITION_ALLOC) PartitionStatsDumper {
public:
// Called to dump total memory used by partition, once per partition.
virtual void PartitionDumpTotals(const char* partition_name,
const PartitionMemoryStats*) = 0;
// Called to dump stats about buckets, for each bucket.
virtual void PartitionsDumpBucketStats(const char* partition_name,
const PartitionBucketMemoryStats*) = 0;
};
// Simple version of PartitionStatsDumper, storing the returned stats in stats_.
// Does not handle per-bucket stats.
class PA_COMPONENT_EXPORT(PARTITION_ALLOC) SimplePartitionStatsDumper
: public PartitionStatsDumper {
public:
SimplePartitionStatsDumper();
void PartitionDumpTotals(const char* partition_name,
const PartitionMemoryStats* memory_stats) override;
void PartitionsDumpBucketStats(const char* partition_name,
const PartitionBucketMemoryStats*) override {}
const PartitionMemoryStats& stats() const { return stats_; }
private:
PartitionMemoryStats stats_;
};
} // namespace partition_alloc
#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_STATS_H_