From 1afb6751888eb781f1fa1bc7c98b7c7338308c49 Mon Sep 17 00:00:00 2001 From: SUTER Frederic Date: Thu, 4 Nov 2021 11:52:54 +0100 Subject: [PATCH] Reorganize VM code After 8 years of probation, let's consider VM as an actual part of S4U rather than as a plugin. This change should be transparent for the users. + Only the Live Migration and its dirty page tracking mechanisms remain plugins. + The user interface has been moved to src/s4u and the kernel counterpart to src/kernel/resource. + The simgrid::vm namespace doesn't exist anymore, but the live migration stuff is in simgrid::plugin::vm + The contents of VmHostExt.* has been merged to s4u_VirtualMachine.cpp and VirtualMachine.hpp as this extension is always needed. + Cleanup a bit the namespaces too --- MANIFEST.in | 10 ++-- include/simgrid/forward.h | 6 +- include/simgrid/s4u/Host.hpp | 4 +- include/simgrid/s4u/VirtualMachine.hpp | 14 ++++- src/bindings/java/jmsg_vm.cpp | 4 +- .../resource}/VirtualMachineImpl.cpp | 21 +++---- .../resource}/VirtualMachineImpl.hpp | 28 +++++----- src/plugins/vm/VmHostExt.cpp | 20 ------- src/plugins/vm/VmHostExt.hpp | 26 --------- src/plugins/vm/VmLiveMigration.cpp | 25 +++++---- src/plugins/vm/VmLiveMigration.hpp | 8 ++- src/plugins/{ => vm}/dirty_page_tracking.cpp | 56 ++++++++++--------- src/s4u/s4u_Host.cpp | 4 +- .../vm => s4u}/s4u_VirtualMachine.cpp | 45 ++++++++------- src/simix/libsmx.cpp | 2 +- src/surf/HostImpl.cpp | 9 +-- src/surf/HostImpl.hpp | 2 +- src/surf/cpu_interface.hpp | 2 +- src/surf/surf_c_bindings.cpp | 2 +- tools/cmake/DefinePackages.cmake | 11 ++-- 20 files changed, 136 insertions(+), 163 deletions(-) rename src/{plugins/vm => kernel/resource}/VirtualMachineImpl.cpp (95%) rename src/{plugins/vm => kernel/resource}/VirtualMachineImpl.hpp (79%) delete mode 100644 src/plugins/vm/VmHostExt.cpp delete mode 100644 src/plugins/vm/VmHostExt.hpp rename src/plugins/{ => vm}/dirty_page_tracking.cpp (63%) rename src/{plugins/vm => s4u}/s4u_VirtualMachine.cpp (85%) diff --git a/MANIFEST.in b/MANIFEST.in index db4e029408..2f4a23a3ce 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2268,6 +2268,8 @@ include src/kernel/resource/DiskImpl.hpp include src/kernel/resource/Model.cpp include src/kernel/resource/NetworkModelIntf_test.cpp include src/kernel/resource/Resource.hpp +include src/kernel/resource/VirtualMachineImpl.cpp +include src/kernel/resource/VirtualMachineImpl.hpp include src/kernel/resource/profile/DatedValue.cpp include src/kernel/resource/profile/DatedValue.hpp include src/kernel/resource/profile/Event.hpp @@ -2392,7 +2394,6 @@ include src/msg/msg_private.hpp include src/msg/msg_process.cpp include src/msg/msg_task.cpp include src/plugins/ProducerConsumer.cpp -include src/plugins/dirty_page_tracking.cpp include src/plugins/file_system/s4u_FileSystem.cpp include src/plugins/host_dvfs.cpp include src/plugins/host_energy.cpp @@ -2400,13 +2401,9 @@ include src/plugins/host_load.cpp include src/plugins/link_energy.cpp include src/plugins/link_energy_wifi.cpp include src/plugins/link_load.cpp -include src/plugins/vm/VirtualMachineImpl.cpp -include src/plugins/vm/VirtualMachineImpl.hpp -include src/plugins/vm/VmHostExt.cpp -include src/plugins/vm/VmHostExt.hpp include src/plugins/vm/VmLiveMigration.cpp include src/plugins/vm/VmLiveMigration.hpp -include src/plugins/vm/s4u_VirtualMachine.cpp +include src/plugins/vm/dirty_page_tracking.cpp include src/s4u/s4u_Activity.cpp include src/s4u/s4u_Actor.cpp include src/s4u/s4u_Barrier.cpp @@ -2422,6 +2419,7 @@ include src/s4u/s4u_Mailbox.cpp include src/s4u/s4u_Mutex.cpp include src/s4u/s4u_Netzone.cpp include src/s4u/s4u_Semaphore.cpp +include src/s4u/s4u_VirtualMachine.cpp include src/simdag/dax.dtd include src/simdag/dax_dtd.c include src/simdag/dax_dtd.h diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index be54d3ddd2..64f9183454 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -176,6 +176,8 @@ class LinkImplIntf; class NetworkAction; class DiskImpl; class DiskModel; +class VirtualMachineImpl; +class VMModel; } namespace timer { class Timer; @@ -197,10 +199,6 @@ namespace surf { namespace mc { class CommunicationDeterminismChecker; } -namespace vm { -class VMModel; -class VirtualMachineImpl; -} // namespace vm } // namespace simgrid using s4u_Actor = simgrid::s4u::Actor; diff --git a/include/simgrid/s4u/Host.hpp b/include/simgrid/s4u/Host.hpp index b3b18211ce..7be79dc3d5 100644 --- a/include/simgrid/s4u/Host.hpp +++ b/include/simgrid/s4u/Host.hpp @@ -37,8 +37,8 @@ namespace s4u { */ class XBT_PUBLIC Host : public xbt::Extendable { #ifndef DOXYGEN - friend vm::VMModel; // Use the pimpl_cpu to compute the VM sharing - friend vm::VirtualMachineImpl; // creates the the pimpl_cpu + friend kernel::resource::VMModel; // Use the pimpl_cpu to compute the VM sharing + friend kernel::resource::VirtualMachineImpl; // creates the the pimpl_cpu friend kernel::routing::NetZoneImpl; friend surf::HostImpl; // call destructor from private implementation diff --git a/include/simgrid/s4u/VirtualMachine.hpp b/include/simgrid/s4u/VirtualMachine.hpp index 73f03e5cf8..d1c7a844f3 100644 --- a/include/simgrid/s4u/VirtualMachine.hpp +++ b/include/simgrid/s4u/VirtualMachine.hpp @@ -13,6 +13,16 @@ namespace simgrid { namespace s4u { +/** @brief Host extension for the VMs */ +class VmHostExt { +public: + static xbt::Extension EXTENSION_ID; + + sg_size_t ramsize = 0; /* available ramsize (0= not taken into account) */ + bool overcommit = true; /* Whether the host allows overcommiting more VM than the avail ramsize allows */ + static void ensureVmExtInstalled(); +}; + /** @ingroup s4u_api * * @tableofcontents @@ -22,7 +32,7 @@ namespace s4u { * */ class XBT_PUBLIC VirtualMachine : public s4u::Host { - vm::VirtualMachineImpl* const pimpl_vm_; + kernel::resource::VirtualMachineImpl* const pimpl_vm_; public: explicit VirtualMachine(const std::string& name, Host* physical_host, int core_amount); @@ -45,7 +55,7 @@ public: using state XBT_ATTRIB_DEPRECATED_v332("Please use VirtualMachine::State") = State; #endif - vm::VirtualMachineImpl* get_vm_impl() const { return pimpl_vm_; } + kernel::resource::VirtualMachineImpl* get_vm_impl() const { return pimpl_vm_; } void start(); void suspend(); void resume(); diff --git a/src/bindings/java/jmsg_vm.cpp b/src/bindings/java/jmsg_vm.cpp index af947a2b79..ed2126b206 100644 --- a/src/bindings/java/jmsg_vm.cpp +++ b/src/bindings/java/jmsg_vm.cpp @@ -11,7 +11,7 @@ #include "simgrid/Exception.hpp" #include "simgrid/plugins/live_migration.h" #include "src/kernel/context/Context.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); @@ -141,7 +141,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_destroy(JNIEnv* env, jobject jvm) sg_vm_t vm = jvm_get_native(env, jvm); if (vm) { sg_vm_destroy(vm); - auto* vmList = &simgrid::vm::VirtualMachineImpl::allVms_; + auto* vmList = &simgrid::kernel::resource::VirtualMachineImpl::allVms_; vmList->erase(std::remove(vmList->begin(), vmList->end(), vm), vmList->end()); } } diff --git a/src/plugins/vm/VirtualMachineImpl.cpp b/src/kernel/resource/VirtualMachineImpl.cpp similarity index 95% rename from src/plugins/vm/VirtualMachineImpl.cpp rename to src/kernel/resource/VirtualMachineImpl.cpp index e6158522e1..d0162ce547 100644 --- a/src/plugins/vm/VirtualMachineImpl.cpp +++ b/src/kernel/resource/VirtualMachineImpl.cpp @@ -10,7 +10,7 @@ #include "simgrid/sg_config.hpp" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/activity/ExecImpl.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include "src/surf/cpu_cas01.hpp" #include "src/surf/cpu_ti.hpp" @@ -18,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(res_vm, ker_resource, "Virtual Machines, contain void surf_vm_model_init_HL13(simgrid::kernel::resource::CpuModel* cpu_pm_model) { - auto vm_model = std::make_shared("VM_HL13"); + auto vm_model = std::make_shared("VM_HL13"); auto* engine = simgrid::kernel::EngineImpl::get_instance(); engine->add_model(vm_model, {cpu_pm_model}); @@ -35,10 +35,10 @@ void surf_vm_model_init_HL13(simgrid::kernel::resource::CpuModel* cpu_pm_model) } namespace simgrid { +template class xbt::Extendable; -template class xbt::Extendable; - -namespace vm { +namespace kernel { +namespace resource { /********* * Model * @@ -116,8 +116,8 @@ VMModel::VMModel(const std::string& name) : HostModel(name) s4u::Host::on_state_change.connect(host_state_change); s4u::Exec::on_start.connect(add_active_exec); s4u::Exec::on_completion.connect(remove_active_exec); - kernel::activity::ActivityImpl::on_resumed.connect(add_active_activity); - kernel::activity::ActivityImpl::on_suspended.connect(remove_active_activity); + activity::ActivityImpl::on_resumed.connect(add_active_activity); + activity::ActivityImpl::on_suspended.connect(remove_active_activity); } double VMModel::next_occurring_event(double now) @@ -157,7 +157,7 @@ double VMModel::next_occurring_event(double now) double solved_value = ws_vm->get_vm_impl()->get_action()->get_rate(); XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value, ws_vm->get_cname(), ws_vm->get_pm()->get_cname()); - kernel::lmm::System* vcpu_system = cpu->get_model()->get_maxmin_system(); + lmm::System* vcpu_system = cpu->get_model()->get_maxmin_system(); vcpu_system->update_constraint_bound(cpu->get_constraint(), virt_overhead * solved_value); } /* actual next occurring event is determined by VM CPU model at surf_solve */ @@ -288,7 +288,7 @@ void VirtualMachineImpl::set_physical_host(s4u::Host* destination) /* Update vcpu's action for the new pm */ /* create a cpu action bound to the pm model at the destination. */ - kernel::resource::CpuAction* new_cpu_action = destination->get_cpu()->execution_start(0, this->core_amount_); + CpuAction* new_cpu_action = destination->get_cpu()->execution_start(0, this->core_amount_); if (action_->get_remains_no_update() > 0) XBT_CRITICAL("FIXME: need copy the state(?), %f", action_->get_remains_no_update()); @@ -330,5 +330,6 @@ void VirtualMachineImpl::update_action_weight() action_->set_bound(std::min(impact * physical_host_->get_speed(), user_bound_)); } -} // namespace vm +} // namespace resource +} // namespace kernel } // namespace simgrid diff --git a/src/plugins/vm/VirtualMachineImpl.hpp b/src/kernel/resource/VirtualMachineImpl.hpp similarity index 79% rename from src/plugins/vm/VirtualMachineImpl.hpp rename to src/kernel/resource/VirtualMachineImpl.hpp index 5104288ef8..6ab458f0d7 100644 --- a/src/plugins/vm/VirtualMachineImpl.hpp +++ b/src/kernel/resource/VirtualMachineImpl.hpp @@ -12,21 +12,18 @@ namespace simgrid { -extern template class XBT_PUBLIC xbt::Extendable; +extern template class XBT_PUBLIC xbt::Extendable; -namespace vm { +namespace kernel { +namespace resource { /************ * Resource * ************/ -/** @ingroup SURF_vm_interface - * @brief SURF VM interface class - * @details A VM represent a virtual machine - */ -class XBT_PUBLIC VirtualMachineImpl : public surf::HostImpl, public simgrid::xbt::Extendable { +class XBT_PUBLIC VirtualMachineImpl : public surf::HostImpl, public xbt::Extendable { #ifndef DOXYGEN - friend simgrid::s4u::VirtualMachine; + friend s4u::VirtualMachine; #endif public: @@ -35,7 +32,7 @@ public: explicit VirtualMachineImpl(const std::string& name, s4u::VirtualMachine* piface, s4u::Host* host, int core_amount, size_t ramsize); - void suspend(kernel::actor::ActorImpl* issuer); + void suspend(actor::ActorImpl* issuer); void resume(); void shutdown(kernel::actor::ActorImpl* issuer); void vm_destroy(); @@ -52,7 +49,7 @@ public: void set_state(s4u::VirtualMachine::State state) { vm_state_ = state; } unsigned int get_core_amount() const { return core_amount_; } - kernel::resource::Action* get_action() const { return action_; } + Action* get_action() const { return action_; } const s4u::VirtualMachine* get_iface() const override { return piface_; } s4u::VirtualMachine* get_iface() override { return piface_; } @@ -70,8 +67,8 @@ public: private: s4u::VirtualMachine* piface_; - kernel::resource::Action* action_ = nullptr; - unsigned int active_execs_ = 0; + Action* action_ = nullptr; + unsigned int active_execs_ = 0; s4u::Host* physical_host_; unsigned int core_amount_; double user_bound_ = std::numeric_limits::max(); @@ -93,13 +90,14 @@ public: double next_occurring_event(double now) override; void update_actions_state(double /*now*/, double /*delta*/) override{}; - kernel::resource::Action* execute_parallel(const std::vector& host_list, const double* flops_amount, - const double* bytes_amount, double rate) override + Action* execute_parallel(const std::vector& host_list, const double* flops_amount, + const double* bytes_amount, double rate) override { return nullptr; }; }; -} // namespace vm +} // namespace resource +} // namespace kernel } // namespace simgrid #endif /* VM_INTERFACE_HPP_ */ diff --git a/src/plugins/vm/VmHostExt.cpp b/src/plugins/vm/VmHostExt.cpp deleted file mode 100644 index 454e8e1ec4..0000000000 --- a/src/plugins/vm/VmHostExt.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2013-2021. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "src/plugins/vm/VmHostExt.hpp" - -XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_vm); - -namespace simgrid { -namespace vm { -simgrid::xbt::Extension VmHostExt::EXTENSION_ID; - -void VmHostExt::ensureVmExtInstalled() -{ - if (not EXTENSION_ID.valid()) - EXTENSION_ID = simgrid::s4u::Host::extension_create(); -} -} // namespace vm -} // namespace simgrid diff --git a/src/plugins/vm/VmHostExt.hpp b/src/plugins/vm/VmHostExt.hpp deleted file mode 100644 index 624eb20106..0000000000 --- a/src/plugins/vm/VmHostExt.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "src/surf/HostImpl.hpp" - -#ifndef VM_HOST_INFO_HPP_ -#define VM_HOST_INFO_HPP_ - -namespace simgrid { -namespace vm { -/** @brief Host extension for the VMs */ -class VmHostExt { -public: - static simgrid::xbt::Extension EXTENSION_ID; - - sg_size_t ramsize = 0; /* available ramsize (0= not taken into account) */ - bool overcommit = true; /* Whether the host allows overcommiting more VM than the avail ramsize allows */ - - static void ensureVmExtInstalled(); -}; -} // namespace vm -} // namespace simgrid - -#endif /* VM_HOST_INFO_HPP_ */ diff --git a/src/plugins/vm/VmLiveMigration.cpp b/src/plugins/vm/VmLiveMigration.cpp index 6f7413d2f4..3dce9fbb2f 100644 --- a/src/plugins/vm/VmLiveMigration.cpp +++ b/src/plugins/vm/VmLiveMigration.cpp @@ -5,14 +5,14 @@ #include -#include "src/plugins/vm/VmLiveMigration.hpp" #include "src/instr/instr_private.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" -#include "src/plugins/vm/VmHostExt.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" +#include "src/plugins/vm/VmLiveMigration.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(vm_live_migration, s4u, "S4U virtual machines live migration"); namespace simgrid { +namespace plugin { namespace vm { xbt::Extension VmMigrationExt::EXTENSION_ID; @@ -271,14 +271,17 @@ void MigrationTx::operator()() XBT_DEBUG("mig: tx_done"); } } // namespace vm +} // namespace plugin } // namespace simgrid +using simgrid::plugin::vm::VmMigrationExt; + static void onVirtualMachineShutdown(simgrid::s4u::VirtualMachine const& vm) { if (vm.get_vm_impl()->is_migrating()) { - vm.extension()->rx_->kill(); - vm.extension()->tx_->kill(); - vm.extension()->issuer_->kill(); + vm.extension()->rx_->kill(); + vm.extension()->tx_->kill(); + vm.extension()->issuer_->kill(); vm.get_vm_impl()->end_migration(); } } @@ -286,14 +289,14 @@ static void onVirtualMachineShutdown(simgrid::s4u::VirtualMachine const& vm) void sg_vm_live_migration_plugin_init() { sg_vm_dirty_page_tracking_init(); - simgrid::vm::VmMigrationExt::ensureVmMigrationExtInstalled(); + VmMigrationExt::ensureVmMigrationExtInstalled(); simgrid::s4u::VirtualMachine::on_shutdown.connect(&onVirtualMachineShutdown); } simgrid::s4u::VirtualMachine* sg_vm_create_migratable(simgrid::s4u::Host* pm, const char* name, int coreAmount, int ramsize, int mig_netspeed, int dp_intensity) { - simgrid::vm::VmHostExt::ensureVmExtInstalled(); + simgrid::s4u::VmHostExt::ensureVmExtInstalled(); /* For the moment, intensity_rate is the percentage against the migration bandwidth */ @@ -342,11 +345,11 @@ void sg_vm_migrate(simgrid::s4u::VirtualMachine* vm, simgrid::s4u::Host* dst_pm) std::string("__pr_mig_tx:") + vm->get_cname() + "(" + src_pm->get_cname() + "-" + dst_pm->get_cname() + ")"; simgrid::s4u::ActorPtr rx = - simgrid::s4u::Actor::create(rx_name.c_str(), dst_pm, simgrid::vm::MigrationRx(vm, dst_pm)); + simgrid::s4u::Actor::create(rx_name.c_str(), dst_pm, simgrid::plugin::vm::MigrationRx(vm, dst_pm)); simgrid::s4u::ActorPtr tx = - simgrid::s4u::Actor::create(tx_name.c_str(), src_pm, simgrid::vm::MigrationTx(vm, dst_pm)); + simgrid::s4u::Actor::create(tx_name.c_str(), src_pm, simgrid::plugin::vm::MigrationTx(vm, dst_pm)); - vm->extension_set(new simgrid::vm::VmMigrationExt(simgrid::s4u::Actor::self(), rx, tx)); + vm->extension_set(new VmMigrationExt(simgrid::s4u::Actor::self(), rx, tx)); /* wait until the migration have finished or on error has occurred */ XBT_DEBUG("wait for reception of the final ACK (i.e. migration has been correctly performed"); diff --git a/src/plugins/vm/VmLiveMigration.hpp b/src/plugins/vm/VmLiveMigration.hpp index a9a2755f04..169b8b67ea 100644 --- a/src/plugins/vm/VmLiveMigration.hpp +++ b/src/plugins/vm/VmLiveMigration.hpp @@ -11,13 +11,14 @@ #define VM_LIVE_MIGRATION_HPP_ namespace simgrid { +namespace plugin { namespace vm { class VmMigrationExt { public: s4u::ActorPtr issuer_ = nullptr; s4u::ActorPtr tx_ = nullptr; s4u::ActorPtr rx_ = nullptr; - static simgrid::xbt::Extension EXTENSION_ID; + static xbt::Extension EXTENSION_ID; explicit VmMigrationExt(s4u::ActorPtr issuer, s4u::ActorPtr rx, s4u::ActorPtr tx) : issuer_(issuer), tx_(tx), rx_(rx) { } @@ -64,6 +65,7 @@ public: void operator()(); sg_size_t sendMigrationData(sg_size_t size, int stage, int stage2_round, double mig_speed, double timeout); }; -} -} +} // namespace vm +} // namespace plugin +} // namespace simgrid #endif diff --git a/src/plugins/dirty_page_tracking.cpp b/src/plugins/vm/dirty_page_tracking.cpp similarity index 63% rename from src/plugins/dirty_page_tracking.cpp rename to src/plugins/vm/dirty_page_tracking.cpp index 18f435eee6..501e3be407 100644 --- a/src/plugins/dirty_page_tracking.cpp +++ b/src/plugins/vm/dirty_page_tracking.cpp @@ -8,9 +8,10 @@ #include #include "src/kernel/activity/ExecImpl.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" namespace simgrid { +namespace plugin { namespace vm { class DirtyPageTrackingExt { bool dp_tracking_ = false; @@ -39,11 +40,11 @@ public: double get_migration_speed() const { return mig_speed_; } double get_max_downtime() const { return max_downtime_; } - static simgrid::xbt::Extension EXTENSION_ID; - DirtyPageTrackingExt() = default; + static simgrid::xbt::Extension EXTENSION_ID; + DirtyPageTrackingExt() = default; }; -simgrid::xbt::Extension DirtyPageTrackingExt::EXTENSION_ID; +simgrid::xbt::Extension DirtyPageTrackingExt::EXTENSION_ID; void DirtyPageTrackingExt::start_tracking() { @@ -67,11 +68,14 @@ double DirtyPageTrackingExt::computed_flops_lookup() return total; } } // namespace vm +} // namespace plugin } // namespace simgrid +using simgrid::plugin::vm::DirtyPageTrackingExt; + static void on_virtual_machine_creation(const simgrid::s4u::VirtualMachine& vm) { - vm.get_vm_impl()->extension_set(new simgrid::vm::DirtyPageTrackingExt()); + vm.get_vm_impl()->extension_set(new DirtyPageTrackingExt()); } static void on_exec_creation(simgrid::s4u::Exec const& e) @@ -81,34 +85,34 @@ static void on_exec_creation(simgrid::s4u::Exec const& e) if (vm == nullptr) return; - if (vm->get_vm_impl()->extension()->is_tracking()) { - vm->get_vm_impl()->extension()->track(exec, exec->get_remaining()); + if (vm->get_vm_impl()->extension()->is_tracking()) { + vm->get_vm_impl()->extension()->track(exec, exec->get_remaining()); } else { - vm->get_vm_impl()->extension()->track(exec, 0.0); + vm->get_vm_impl()->extension()->track(exec, 0.0); } } static void on_exec_completion(simgrid::s4u::Exec const& e) { - auto exec = static_cast(e.get_impl()); + auto exec = static_cast(e.get_impl()); const simgrid::s4u::VirtualMachine* vm = dynamic_cast(exec->get_host()); if (vm == nullptr) return; /* If we are in the middle of dirty page tracking, we record how much computation has been done until now, and keep * the information for the lookup_() function that will called soon. */ - if (vm->get_vm_impl()->extension()->is_tracking()) { - double delta = vm->get_vm_impl()->extension()->get_stored_remains(exec); - vm->get_vm_impl()->extension()->update_dirty_page_count(delta); + if (vm->get_vm_impl()->extension()->is_tracking()) { + double delta = vm->get_vm_impl()->extension()->get_stored_remains(exec); + vm->get_vm_impl()->extension()->update_dirty_page_count(delta); } - vm->get_vm_impl()->extension()->untrack(exec); + vm->get_vm_impl()->extension()->untrack(exec); } void sg_vm_dirty_page_tracking_init() { - if (not simgrid::vm::DirtyPageTrackingExt::EXTENSION_ID.valid()) { - simgrid::vm::DirtyPageTrackingExt::EXTENSION_ID = - simgrid::vm::VirtualMachineImpl::extension_create(); + if (not DirtyPageTrackingExt::EXTENSION_ID.valid()) { + DirtyPageTrackingExt::EXTENSION_ID = + simgrid::kernel::resource::VirtualMachineImpl::extension_create(); simgrid::s4u::VirtualMachine::on_creation.connect(&on_virtual_machine_creation); simgrid::s4u::Exec::on_start.connect(&on_exec_creation); simgrid::s4u::Exec::on_completion.connect(&on_exec_completion); @@ -117,50 +121,50 @@ void sg_vm_dirty_page_tracking_init() void sg_vm_start_dirty_page_tracking(const_sg_vm_t vm) { - vm->get_vm_impl()->extension()->start_tracking(); + vm->get_vm_impl()->extension()->start_tracking(); } void sg_vm_stop_dirty_page_tracking(const_sg_vm_t vm) { - vm->get_vm_impl()->extension()->stop_tracking(); + vm->get_vm_impl()->extension()->stop_tracking(); } double sg_vm_lookup_computed_flops(const_sg_vm_t vm) { - return vm->get_vm_impl()->extension()->computed_flops_lookup(); + return vm->get_vm_impl()->extension()->computed_flops_lookup(); } void sg_vm_set_dirty_page_intensity(const_sg_vm_t vm, double intensity) { - vm->get_vm_impl()->extension()->set_intensity(intensity); + vm->get_vm_impl()->extension()->set_intensity(intensity); } double sg_vm_get_dirty_page_intensity(const_sg_vm_t vm) { - return vm->get_vm_impl()->extension()->get_intensity(); + return vm->get_vm_impl()->extension()->get_intensity(); } void sg_vm_set_working_set_memory(const_sg_vm_t vm, sg_size_t size) { - vm->get_vm_impl()->extension()->set_working_set_memory(size); + vm->get_vm_impl()->extension()->set_working_set_memory(size); } sg_size_t sg_vm_get_working_set_memory(const_sg_vm_t vm) { - return vm->get_vm_impl()->extension()->get_working_set_memory(); + return vm->get_vm_impl()->extension()->get_working_set_memory(); } void sg_vm_set_migration_speed(const_sg_vm_t vm, double speed) { - vm->get_vm_impl()->extension()->set_migration_speed(speed); + vm->get_vm_impl()->extension()->set_migration_speed(speed); } double sg_vm_get_migration_speed(const_sg_vm_t vm) { - return vm->get_vm_impl()->extension()->get_migration_speed(); + return vm->get_vm_impl()->extension()->get_migration_speed(); } double sg_vm_get_max_downtime(const_sg_vm_t vm) { - return vm->get_vm_impl()->extension()->get_max_downtime(); + return vm->get_vm_impl()->extension()->get_max_downtime(); } diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index 12ce201b06..be5c558d5e 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -13,7 +13,7 @@ #include #include -#include "src/plugins/vm/VirtualMachineImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include "src/surf/HostImpl.hpp" #include @@ -108,7 +108,7 @@ void Host::turn_off() if (is_on()) { const kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::simcall([this, self] { - for (VirtualMachine* const& vm : vm::VirtualMachineImpl::allVms_) + for (VirtualMachine* const& vm : kernel::resource::VirtualMachineImpl::allVms_) if (vm->get_pm() == this) { vm->shutdown(); vm->turn_off(); diff --git a/src/plugins/vm/s4u_VirtualMachine.cpp b/src/s4u/s4u_VirtualMachine.cpp similarity index 85% rename from src/plugins/vm/s4u_VirtualMachine.cpp rename to src/s4u/s4u_VirtualMachine.cpp index 028583263e..df4b90904f 100644 --- a/src/plugins/vm/s4u_VirtualMachine.cpp +++ b/src/s4u/s4u_VirtualMachine.cpp @@ -7,23 +7,30 @@ #include #include -#include "src/plugins/vm/VirtualMachineImpl.hpp" -#include "src/plugins/vm/VmHostExt.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include "src/surf/cpu_cas01.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_vm, s4u, "S4U virtual machines"); namespace simgrid { namespace s4u { -simgrid::xbt::signal VirtualMachine::on_creation; -simgrid::xbt::signal VirtualMachine::on_start; -simgrid::xbt::signal VirtualMachine::on_started; -simgrid::xbt::signal VirtualMachine::on_shutdown; -simgrid::xbt::signal VirtualMachine::on_suspend; -simgrid::xbt::signal VirtualMachine::on_resume; -simgrid::xbt::signal VirtualMachine::on_migration_start; -simgrid::xbt::signal VirtualMachine::on_migration_end; -simgrid::xbt::signal VirtualMachine::on_destruction; +xbt::signal VirtualMachine::on_creation; +xbt::signal VirtualMachine::on_start; +xbt::signal VirtualMachine::on_started; +xbt::signal VirtualMachine::on_shutdown; +xbt::signal VirtualMachine::on_suspend; +xbt::signal VirtualMachine::on_resume; +xbt::signal VirtualMachine::on_migration_start; +xbt::signal VirtualMachine::on_migration_end; +xbt::signal VirtualMachine::on_destruction; + +xbt::Extension VmHostExt::EXTENSION_ID; + +void VmHostExt::ensureVmExtInstalled() +{ + if (not EXTENSION_ID.valid()) + EXTENSION_ID = Host::extension_create(); +} VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host, int core_amount) : VirtualMachine(name, physical_host, core_amount, 1024) @@ -31,8 +38,8 @@ VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host } VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host, int core_amount, size_t ramsize) - : Host(new vm::VirtualMachineImpl(name, this, physical_host, core_amount, ramsize)) - , pimpl_vm_(dynamic_cast(Host::get_impl())) + : Host(new kernel::resource::VirtualMachineImpl(name, this, physical_host, core_amount, ramsize)) + , pimpl_vm_(dynamic_cast(Host::get_impl())) { XBT_DEBUG("Create VM %s", get_cname()); @@ -62,18 +69,18 @@ void VirtualMachine::start() { on_start(*this); - vm::VmHostExt::ensureVmExtInstalled(); + VmHostExt::ensureVmExtInstalled(); kernel::actor::simcall([this]() { Host* pm = this->pimpl_vm_->get_physical_host(); - if (pm->extension() == nullptr) - pm->extension_set(new vm::VmHostExt()); + if (pm->extension() == nullptr) + pm->extension_set(new VmHostExt()); - size_t pm_ramsize = pm->extension()->ramsize; - if (pm_ramsize && not pm->extension()->overcommit) { /* Need to verify that we don't overcommit */ + size_t pm_ramsize = pm->extension()->ramsize; + if (pm_ramsize && not pm->extension()->overcommit) { /* Need to verify that we don't overcommit */ /* Retrieve the memory occupied by the VMs on that host. Yep, we have to traverse all VMs of all hosts for that */ size_t total_ramsize_of_vms = 0; - for (VirtualMachine* const& ws_vm : vm::VirtualMachineImpl::allVms_) + for (VirtualMachine* const& ws_vm : kernel::resource::VirtualMachineImpl::allVms_) if (pm == ws_vm->get_pm()) total_ramsize_of_vms += ws_vm->get_ramsize(); diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 2ad6045b42..204a6135c1 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -19,8 +19,8 @@ #include "src/kernel/activity/MutexImpl.hpp" #include "src/kernel/activity/SemaphoreImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include "src/mc/mc_replay.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" #include "xbt/random.hpp" #include "popping_bodies.cpp" diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index aeac40d43f..cb429d08a8 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -3,11 +3,12 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "simgrid/kernel/routing/NetPoint.hpp" -#include "simgrid/s4u/Engine.hpp" -#include "simgrid/s4u/Host.hpp" +#include +#include +#include + #include "src/kernel/EngineImpl.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include diff --git a/src/surf/HostImpl.hpp b/src/surf/HostImpl.hpp index 8b16e7ce03..16c39c7698 100644 --- a/src/surf/HostImpl.hpp +++ b/src/surf/HostImpl.hpp @@ -58,7 +58,7 @@ protected: HostImpl(const std::string& name, s4u::Host* piface); public: - friend simgrid::vm::VirtualMachineImpl; + friend kernel::resource::VirtualMachineImpl; explicit HostImpl(const std::string& name); void destroy(); // Must be called instead of the destructor diff --git a/src/surf/cpu_interface.hpp b/src/surf/cpu_interface.hpp index 8cd60d0d13..814966237b 100644 --- a/src/surf/cpu_interface.hpp +++ b/src/surf/cpu_interface.hpp @@ -49,7 +49,7 @@ public: ************/ class XBT_PUBLIC CpuImpl : public Resource_T { - friend vm::VirtualMachineImpl; // Resets the VCPU + friend VirtualMachineImpl; // Resets the VCPU s4u::Host* piface_; int core_count_ = 1; diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp index d050de8537..59fd67e1af 100644 --- a/src/surf/surf_c_bindings.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -8,8 +8,8 @@ #include "src/instr/instr_private.hpp" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/resource/DiskImpl.hpp" +#include "src/kernel/resource/VirtualMachineImpl.hpp" #include "src/kernel/resource/profile/FutureEvtSet.hpp" -#include "src/plugins/vm/VirtualMachineImpl.hpp" #include "surf/surf.hpp" #include diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 1ee79aac8c..aff655f6fb 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -314,6 +314,8 @@ set(SURF_SRC src/kernel/resource/DiskImpl.cpp src/kernel/resource/DiskImpl.hpp src/kernel/resource/Resource.hpp + src/kernel/resource/VirtualMachineImpl.hpp + src/kernel/resource/VirtualMachineImpl.cpp src/kernel/resource/profile/DatedValue.cpp src/kernel/resource/profile/DatedValue.hpp @@ -370,7 +372,6 @@ set(SURF_SRC set(PLUGINS_SRC src/plugins/ProducerConsumer.cpp - src/plugins/dirty_page_tracking.cpp src/plugins/host_dvfs.cpp src/plugins/host_energy.cpp src/plugins/link_energy.cpp @@ -378,12 +379,7 @@ set(PLUGINS_SRC src/plugins/host_load.cpp src/plugins/link_load.cpp src/plugins/file_system/s4u_FileSystem.cpp - src/plugins/vm/VirtualMachineImpl.hpp - src/plugins/vm/s4u_VirtualMachine.cpp - src/plugins/vm/VirtualMachineImpl.hpp - src/plugins/vm/VirtualMachineImpl.cpp - src/plugins/vm/VmHostExt.hpp - src/plugins/vm/VmHostExt.cpp + src/plugins/vm/dirty_page_tracking.cpp src/plugins/vm/VmLiveMigration.cpp src/plugins/vm/VmLiveMigration.hpp ) @@ -459,6 +455,7 @@ set(S4U_SRC src/s4u/s4u_Mutex.cpp src/s4u/s4u_Netzone.cpp src/s4u/s4u_Semaphore.cpp + src/s4u/s4u_VirtualMachine.cpp ) set(SIMGRID_SRC -- 2.20.1