Program Listing for File EvictManager.cpp¶
↰ Return to documentation for file (umap/EvictManager.cpp)
//////////////////////////////////////////////////////////////////////////////
// Copyright 2017-2020 Lawrence Livermore National Security, LLC and other
// UMAP Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: LGPL-2.1-only
//////////////////////////////////////////////////////////////////////////////
#include "umap/Buffer.hpp"
#include "umap/EvictManager.hpp"
#include "umap/EvictWorkers.hpp"
#include "umap/RegionManager.hpp"
#include "umap/Uffd.hpp"
#include "umap/WorkerPool.hpp"
#include "umap/util/Macros.hpp"
#include "umap/store/Store.hpp"
namespace Umap {
void EvictManager::EvictMgr( void ) {
while ( 1 ) {
auto w = get_work();
if ( w.type == Umap::WorkItem::WorkType::EXIT )
break; // Time to leave
while ( ! m_buffer->low_threshold_reached() ) {
#if 0
WorkItem work;
work.type = Umap::WorkItem::WorkType::EVICT;
work.page_desc = m_buffer->evict_oldest_page(); // Could block
if ( work.page_desc == nullptr )
break;
UMAP_LOG(Debug, m_buffer << ", " << work.page_desc);
m_evict_workers->send_work(work);
#else
std::vector<PageDescriptor*> evicted_pages = m_buffer->evict_oldest_pages();
for(auto pd : evicted_pages){
WorkItem work;
work.type = Umap::WorkItem::WorkType::EVICT;
work.page_desc = pd;
assert( work.page_desc != nullptr );
m_evict_workers->send_work(work);
}
#endif
}
}
}
void EvictManager::WaitAll( void )
{
UMAP_LOG(Debug, "Entered");
m_evict_workers->wait_for_idle();
UMAP_LOG(Debug, "Done");
}
void EvictManager::EvictAll( void )
{
UMAP_LOG(Debug, "Entered");
for (auto pd = m_buffer->evict_oldest_page(); pd != nullptr; pd = m_buffer->evict_oldest_page()) {
UMAP_LOG(Debug, "evicting: " << pd);
if (pd->dirty) {
WorkItem work = { .page_desc = pd, .type = Umap::WorkItem::WorkType::FAST_EVICT };
m_evict_workers->send_work(work);
}
else {
m_buffer->mark_page_as_free(pd);
}
}
m_evict_workers->wait_for_idle();
UMAP_LOG(Debug, "Done");
}
void EvictManager::schedule_eviction(PageDescriptor* pd)
{
WorkItem work = { .page_desc = pd, .type = Umap::WorkItem::WorkType::EVICT };
m_evict_workers->send_work(work);
}
void EvictManager::schedule_flush(PageDescriptor* pd)
{
WorkItem work = { .page_desc = pd, .type = Umap::WorkItem::WorkType::FLUSH };
m_evict_workers->send_work(work);
}
EvictManager::EvictManager( void ) :
WorkerPool("Evict Manager", 1)
, m_buffer(RegionManager::getInstance().get_buffer_h())
{
m_evict_workers = new EvictWorkers( RegionManager::getInstance().get_num_evictors()
, m_buffer, RegionManager::getInstance().get_uffd_h());
start_thread_pool();
}
EvictManager::~EvictManager( void ) {
UMAP_LOG(Debug, "Calling EvictAll");
EvictAll();
UMAP_LOG(Debug, "Calling stop_thread_pool");
stop_thread_pool();
UMAP_LOG(Debug, "Deleting eviction workers");
delete m_evict_workers;
UMAP_LOG(Debug, "Done");
}
void EvictManager::ThreadEntry() {
EvictMgr();
}
} // end of namespace Umap