From a1a0829a8be9ae7d11abdc6de16ae38c915f5745 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Fri, 11 Aug 2023 11:58:22 -0700 Subject: [PATCH] Initialize and store PRv2 environment in cache (#32812) * Initialize and store PRv2 environment in cache * address review comments --- cli/src/program.rs | 4 ++-- ledger-tool/src/program.rs | 4 ++-- program-runtime/src/loaded_programs.rs | 13 ++++++++++- programs/bpf_loader/src/lib.rs | 6 ++--- programs/bpf_loader/src/syscalls/mod.rs | 2 +- programs/loader-v4/src/lib.rs | 31 ++++++++++++++++--------- programs/sbf/benches/bpf_loader.rs | 10 ++++---- runtime/src/bank.rs | 15 ++++++++++-- 8 files changed, 58 insertions(+), 27 deletions(-) diff --git a/cli/src/program.rs b/cli/src/program.rs index 05ccc0425..6b366ce03 100644 --- a/cli/src/program.rs +++ b/cli/src/program.rs @@ -10,7 +10,7 @@ use { clap::{App, AppSettings, Arg, ArgMatches, SubCommand}, log::*, solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig}, - solana_bpf_loader_program::syscalls::create_program_runtime_environment, + solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1, solana_clap_utils::{ self, hidden_unless_forced, input_parsers::*, input_validators::*, keypair::*, }, @@ -2022,7 +2022,7 @@ fn read_and_verify_elf(program_location: &str) -> Result, Box( ..LoadProgramMetrics::default() }; let account_size = contents.len(); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &invoke_context.feature_set, invoke_context.get_compute_budget(), false, /* deployment */ diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 7362f1764..1e24509d9 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -355,6 +355,8 @@ pub struct LoadedPrograms { entries: HashMap>>, /// Globally shared RBPF config and syscall registry pub program_runtime_environment_v1: Arc>>, + /// Globally shared RBPF config and syscall registry for runtime V2 + pub program_runtime_environment_v2: Arc>>, latest_root: Slot, pub stats: Stats, } @@ -501,7 +503,16 @@ impl LoadedPrograms { } LoadedProgramType::Unloaded(environment) | LoadedProgramType::FailedVerification(environment) - if Arc::ptr_eq(environment, &self.program_runtime_environment_v1) => + if Arc::ptr_eq(environment, &self.program_runtime_environment_v1) + || Arc::ptr_eq(environment, &self.program_runtime_environment_v2) => + { + true + } + LoadedProgramType::Typed(program) + if Arc::ptr_eq( + program.get_loader(), + &self.program_runtime_environment_v2, + ) => { true } diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index a9ccec285..f9cf519a7 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -59,7 +59,7 @@ use { rc::Rc, sync::{atomic::Ordering, Arc}, }, - syscalls::create_program_runtime_environment, + syscalls::create_program_runtime_environment_v1, }; pub const DEFAULT_LOADER_COMPUTE_UNITS: u64 = 570; @@ -116,7 +116,7 @@ macro_rules! deploy_program { $account_size:expr, $slot:expr, $drop:expr, $new_programdata:expr $(,)?) => {{ let mut load_program_metrics = LoadProgramMetrics::default(); let mut register_syscalls_time = Measure::start("register_syscalls_time"); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &$invoke_context.feature_set, $invoke_context.get_compute_budget(), true, /* deployment */ @@ -1654,7 +1654,7 @@ pub mod test_utils { pub fn load_all_invoked_programs(invoke_context: &mut InvokeContext) { let mut load_program_metrics = LoadProgramMetrics::default(); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &invoke_context.feature_set, invoke_context.get_compute_budget(), false, /* deployment */ diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index 36a6d626f..65129a37f 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -142,7 +142,7 @@ macro_rules! register_feature_gated_function { }; } -pub fn create_program_runtime_environment<'a>( +pub fn create_program_runtime_environment_v1<'a>( feature_set: &FeatureSet, compute_budget: &ComputeBudget, reject_deployment_of_broken_elfs: bool, diff --git a/programs/loader-v4/src/lib.rs b/programs/loader-v4/src/lib.rs index 1f2d74d1c..cbb7af49f 100644 --- a/programs/loader-v4/src/lib.rs +++ b/programs/loader-v4/src/lib.rs @@ -68,17 +68,10 @@ fn get_state_mut(data: &mut [u8]) -> Result<&mut LoaderV4State, InstructionError } } -pub fn load_program_from_account( - _feature_set: &FeatureSet, +pub fn create_program_runtime_environment_v2<'a>( compute_budget: &ComputeBudget, - log_collector: Option>>, - program: &BorrowedAccount, debugging_features: bool, -) -> Result<(Arc, LoadProgramMetrics), InstructionError> { - let mut load_program_metrics = LoadProgramMetrics { - program_id: program.get_key().to_string(), - ..LoadProgramMetrics::default() - }; +) -> BuiltinProgram> { let config = Config { max_call_depth: compute_budget.max_call_depth, stack_frame_size: compute_budget.stack_frame_size, @@ -104,7 +97,20 @@ pub fn load_program_from_account( aligned_memory_mapping: true, // Warning, do not use `Config::default()` so that configuration here is explicit. }; - let loader = BuiltinProgram::new_loader(config); + BuiltinProgram::new_loader(config) +} + +pub fn load_program_from_account( + _feature_set: &FeatureSet, + compute_budget: &ComputeBudget, + log_collector: Option>>, + program: &BorrowedAccount, + debugging_features: bool, +) -> Result<(Arc, LoadProgramMetrics), InstructionError> { + let mut load_program_metrics = LoadProgramMetrics { + program_id: program.get_key().to_string(), + ..LoadProgramMetrics::default() + }; let state = get_state(program.get_data())?; let programdata = program .get_data() @@ -112,7 +118,10 @@ pub fn load_program_from_account( .ok_or(InstructionError::AccountDataTooSmall)?; let loaded_program = LoadedProgram::new( &loader_v4::id(), - Arc::new(loader), + Arc::new(create_program_runtime_environment_v2( + compute_budget, + debugging_features, + )), state.slot, state.slot.saturating_add(1), None, diff --git a/programs/sbf/benches/bpf_loader.rs b/programs/sbf/benches/bpf_loader.rs index c72dcd68b..e4110df37 100644 --- a/programs/sbf/benches/bpf_loader.rs +++ b/programs/sbf/benches/bpf_loader.rs @@ -14,7 +14,7 @@ use { byteorder::{ByteOrder, LittleEndian, WriteBytesExt}, solana_bpf_loader_program::{ create_vm, serialization::serialize_parameters, - syscalls::create_program_runtime_environment, + syscalls::create_program_runtime_environment_v1, }, solana_measure::measure::Measure, solana_program_runtime::{compute_budget::ComputeBudget, invoke_context::InvokeContext}, @@ -90,7 +90,7 @@ macro_rules! with_mock_invoke_context { fn bench_program_create_executable(bencher: &mut Bencher) { let elf = load_program_from_file("bench_alu"); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &FeatureSet::default(), &ComputeBudget::default(), true, @@ -118,7 +118,7 @@ fn bench_program_alu(bencher: &mut Bencher) { let elf = load_program_from_file("bench_alu"); with_mock_invoke_context!(invoke_context, bpf_loader::id(), 10000001); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &invoke_context.feature_set, &ComputeBudget::default(), true, @@ -237,7 +237,7 @@ fn bench_create_vm(bencher: &mut Bencher) { let direct_mapping = invoke_context .feature_set .is_active(&bpf_account_data_direct_mapping::id()); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &invoke_context.feature_set, &ComputeBudget::default(), true, @@ -299,7 +299,7 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) { ) .unwrap(); - let program_runtime_environment = create_program_runtime_environment( + let program_runtime_environment = create_program_runtime_environment_v1( &invoke_context.feature_set, &ComputeBudget::default(), true, diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index f9d3426a9..80320a346 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -99,7 +99,7 @@ use { TransactionResults, }, }, - solana_bpf_loader_program::syscalls::create_program_runtime_environment, + solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1, solana_cost_model::cost_tracker::CostTracker, solana_measure::{measure, measure::Measure, measure_us}, solana_perf::perf_libs, @@ -7996,7 +7996,7 @@ impl Bank { .iter() .any(|key| new_feature_activations.contains(key)) { - let program_runtime_environment_v1 = create_program_runtime_environment( + let program_runtime_environment_v1 = create_program_runtime_environment_v1( &self.feature_set, &self.runtime_config.compute_budget.unwrap_or_default(), false, /* deployment */ @@ -8010,6 +8010,17 @@ impl Bank { loaded_programs_cache.program_runtime_environment_v1 = Arc::new(program_runtime_environment_v1); } + let program_runtime_environment_v2 = + solana_loader_v4_program::create_program_runtime_environment_v2( + &self.runtime_config.compute_budget.unwrap_or_default(), + false, /* debugging_features */ + ); + if *loaded_programs_cache.program_runtime_environment_v2 + != program_runtime_environment_v2 + { + loaded_programs_cache.program_runtime_environment_v2 = + Arc::new(program_runtime_environment_v2); + } loaded_programs_cache.prune_feature_set_transition(); } for builtin in BUILTINS.iter() {