mirror of https://github.com/trapexit/mergerfs.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							216 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							216 lines
						
					
					
						
							5.1 KiB
						
					
					
				
								#include "pin_threads.hpp"
							 | 
						|
								
							 | 
						|
								#include "syslog.hpp"
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::R1L(const CPU::ThreadIdVec threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::CPUVec cpus;
							 | 
						|
								
							 | 
						|
								  cpus = CPU::cpus();
							 | 
						|
								  if(cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,cpus.front());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::R1P(const CPU::ThreadIdVec threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::Core2CPUsMap core2cpus;
							 | 
						|
								
							 | 
						|
								  core2cpus = CPU::core2cpus();
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::RP1L(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                 const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::CPUVec cpus;
							 | 
						|
								
							 | 
						|
								  cpus = CPU::cpus();
							 | 
						|
								  if(cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,cpus.front());
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,cpus.front());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::RP1P(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                 const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::Core2CPUsMap core2cpus;
							 | 
						|
								
							 | 
						|
								  core2cpus = CPU::core2cpus();
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::R1LP1L(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                   const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::CPUVec cpus;
							 | 
						|
								
							 | 
						|
								  cpus = CPU::cpus();
							 | 
						|
								  if(cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,cpus.front());
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,cpus.back());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::R1PP1P(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                   const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::Core2CPUsMap core2cpus;
							 | 
						|
								
							 | 
						|
								  core2cpus = CPU::core2cpus();
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								
							 | 
						|
								  if(core2cpus.size() > 1)
							 | 
						|
								    core2cpus.erase(core2cpus.begin());
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::RPSL(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                 const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::CPUVec cpus;
							 | 
						|
								
							 | 
						|
								  cpus = CPU::cpus();
							 | 
						|
								  if(cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    {
							 | 
						|
								      if(cpus.empty())
							 | 
						|
								        cpus = CPU::cpus();
							 | 
						|
								      CPU::setaffinity(thread_id,cpus.back());
							 | 
						|
								      cpus.pop_back();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    {
							 | 
						|
								      if(cpus.empty())
							 | 
						|
								        cpus = CPU::cpus();
							 | 
						|
								      CPU::setaffinity(thread_id,cpus.back());
							 | 
						|
								      cpus.pop_back();
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::RPSP(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                 const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::Core2CPUsMap core2cpus;
							 | 
						|
								
							 | 
						|
								  core2cpus = CPU::core2cpus();
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    {
							 | 
						|
								      if(core2cpus.empty())
							 | 
						|
								        core2cpus = CPU::core2cpus();
							 | 
						|
								      CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								      core2cpus.erase(core2cpus.begin());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    {
							 | 
						|
								      if(core2cpus.empty())
							 | 
						|
								        core2cpus = CPU::core2cpus();
							 | 
						|
								      CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								      core2cpus.erase(core2cpus.begin());
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::R1PPSP(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                   const CPU::ThreadIdVec process_threads_)
							 | 
						|
								{
							 | 
						|
								  CPU::Core2CPUsMap core2cpus;
							 | 
						|
								  CPU::Core2CPUsMap leftover;
							 | 
						|
								
							 | 
						|
								  core2cpus = CPU::core2cpus();
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    return;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : read_threads_)
							 | 
						|
								    CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								
							 | 
						|
								  core2cpus.erase(core2cpus.begin());
							 | 
						|
								  if(core2cpus.empty())
							 | 
						|
								    core2cpus = CPU::core2cpus();
							 | 
						|
								  leftover = core2cpus;
							 | 
						|
								
							 | 
						|
								  for(auto const thread_id : process_threads_)
							 | 
						|
								    {
							 | 
						|
								      if(core2cpus.empty())
							 | 
						|
								        core2cpus = leftover;
							 | 
						|
								      CPU::setaffinity(thread_id,core2cpus.begin()->second);
							 | 
						|
								      core2cpus.erase(core2cpus.begin());
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void
							 | 
						|
								PinThreads::pin(const CPU::ThreadIdVec read_threads_,
							 | 
						|
								                const CPU::ThreadIdVec process_threads_,
							 | 
						|
								                const std::string      type_)
							 | 
						|
								{
							 | 
						|
								  if(type_.empty() || (type_ == "false"))
							 | 
						|
								    return;
							 | 
						|
								  if(type_ == "R1L")
							 | 
						|
								    return PinThreads::R1L(read_threads_);
							 | 
						|
								  if(type_ == "R1P")
							 | 
						|
								    return PinThreads::R1P(read_threads_);
							 | 
						|
								  if(type_ == "RP1L")
							 | 
						|
								    return PinThreads::RP1L(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "RP1P")
							 | 
						|
								    return PinThreads::RP1P(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "R1LP1L")
							 | 
						|
								    return PinThreads::R1LP1L(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "R1PP1P")
							 | 
						|
								    return PinThreads::R1PP1P(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "RPSL")
							 | 
						|
								    return PinThreads::RPSL(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "RPSP")
							 | 
						|
								    return PinThreads::RPSP(read_threads_,process_threads_);
							 | 
						|
								  if(type_ == "R1PPSP")
							 | 
						|
								    return PinThreads::R1PPSP(read_threads_,process_threads_);
							 | 
						|
								
							 | 
						|
								  SysLog::warning("Invalid pin-threads type, ignoring: {}",
							 | 
						|
								                  type_);
							 | 
						|
								}
							 |