blob: ffa18905fe63859a3bbaecad5d42e481a2d6cab1 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include "lib/page_cache.h"
#include <lib/counters.h>
#include <new>
#include <arch/defines.h>
#include <kernel/percpu.h>
KCOUNTER(page_cache_hit_pages, "cache.page.hit")
KCOUNTER(page_cache_miss_pages, "cache.page.missed")
KCOUNTER(page_cache_refill_pages, "cache.page.refilled")
KCOUNTER(page_cache_return_pages, "cache.page.returned")
KCOUNTER(page_cache_free_pages, "cache.page.freed")
namespace page_cache {
zx::result<PageCache> PageCache::Create(size_t reserve_pages) {
const size_t cpu_count = percpu::processor_count();
DEBUG_ASSERT(cpu_count != 0);
fbl::AllocChecker alloc_checker;
ktl::unique_ptr<CpuCache[]> entries{new (&alloc_checker) CpuCache[cpu_count]};
if (!alloc_checker.check()) {
return zx::error_result(ZX_ERR_NO_MEMORY);
}
DEBUG_ASSERT(((MAX_CACHE_LINE - 1) & reinterpret_cast<uintptr_t>(entries.get())) == 0);
return zx::ok(PageCache{reserve_pages, ktl::move(entries)});
}
void PageCache::CountHitPages(size_t page_count) {
page_cache_hit_pages.Add(static_cast<int64_t>(page_count));
}
void PageCache::CountMissPages(size_t page_count) {
page_cache_miss_pages.Add(static_cast<int64_t>(page_count));
}
void PageCache::CountRefillPages(size_t page_count) {
page_cache_refill_pages.Add(static_cast<int64_t>(page_count));
}
void PageCache::CountReturnPages(size_t page_count) {
page_cache_return_pages.Add(static_cast<int64_t>(page_count));
}
void PageCache::CountFreePages(size_t page_count) {
page_cache_free_pages.Add(static_cast<int64_t>(page_count));
}
} // namespace page_cache