Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit a1a0829

Browse files
authored
Initialize and store PRv2 environment in cache (#32812)
* Initialize and store PRv2 environment in cache * address review comments
1 parent 194c959 commit a1a0829

File tree

8 files changed

+58
-27
lines changed

8 files changed

+58
-27
lines changed

cli/src/program.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use {
1010
clap::{App, AppSettings, Arg, ArgMatches, SubCommand},
1111
log::*,
1212
solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig},
13-
solana_bpf_loader_program::syscalls::create_program_runtime_environment,
13+
solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1,
1414
solana_clap_utils::{
1515
self, hidden_unless_forced, input_parsers::*, input_validators::*, keypair::*,
1616
},
@@ -2022,7 +2022,7 @@ fn read_and_verify_elf(program_location: &str) -> Result<Vec<u8>, Box<dyn std::e
20222022
.map_err(|err| format!("Unable to read program file: {err}"))?;
20232023

20242024
// Verify the program
2025-
let program_runtime_environment = create_program_runtime_environment(
2025+
let program_runtime_environment = create_program_runtime_environment_v1(
20262026
&FeatureSet::all_enabled(),
20272027
&ComputeBudget::default(),
20282028
true,

ledger-tool/src/program.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use {
66
serde_json::Result,
77
solana_bpf_loader_program::{
88
create_vm, load_program_from_bytes, serialization::serialize_parameters,
9-
syscalls::create_program_runtime_environment,
9+
syscalls::create_program_runtime_environment_v1,
1010
},
1111
solana_clap_utils::input_parsers::pubkeys_of,
1212
solana_ledger::{
@@ -346,7 +346,7 @@ fn load_program<'a>(
346346
..LoadProgramMetrics::default()
347347
};
348348
let account_size = contents.len();
349-
let program_runtime_environment = create_program_runtime_environment(
349+
let program_runtime_environment = create_program_runtime_environment_v1(
350350
&invoke_context.feature_set,
351351
invoke_context.get_compute_budget(),
352352
false, /* deployment */

program-runtime/src/loaded_programs.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ pub struct LoadedPrograms {
355355
entries: HashMap<Pubkey, Vec<Arc<LoadedProgram>>>,
356356
/// Globally shared RBPF config and syscall registry
357357
pub program_runtime_environment_v1: Arc<BuiltinProgram<InvokeContext<'static>>>,
358+
/// Globally shared RBPF config and syscall registry for runtime V2
359+
pub program_runtime_environment_v2: Arc<BuiltinProgram<InvokeContext<'static>>>,
358360
latest_root: Slot,
359361
pub stats: Stats,
360362
}
@@ -501,7 +503,16 @@ impl LoadedPrograms {
501503
}
502504
LoadedProgramType::Unloaded(environment)
503505
| LoadedProgramType::FailedVerification(environment)
504-
if Arc::ptr_eq(environment, &self.program_runtime_environment_v1) =>
506+
if Arc::ptr_eq(environment, &self.program_runtime_environment_v1)
507+
|| Arc::ptr_eq(environment, &self.program_runtime_environment_v2) =>
508+
{
509+
true
510+
}
511+
LoadedProgramType::Typed(program)
512+
if Arc::ptr_eq(
513+
program.get_loader(),
514+
&self.program_runtime_environment_v2,
515+
) =>
505516
{
506517
true
507518
}

programs/bpf_loader/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ use {
5959
rc::Rc,
6060
sync::{atomic::Ordering, Arc},
6161
},
62-
syscalls::create_program_runtime_environment,
62+
syscalls::create_program_runtime_environment_v1,
6363
};
6464

6565
pub const DEFAULT_LOADER_COMPUTE_UNITS: u64 = 570;
@@ -116,7 +116,7 @@ macro_rules! deploy_program {
116116
$account_size:expr, $slot:expr, $drop:expr, $new_programdata:expr $(,)?) => {{
117117
let mut load_program_metrics = LoadProgramMetrics::default();
118118
let mut register_syscalls_time = Measure::start("register_syscalls_time");
119-
let program_runtime_environment = create_program_runtime_environment(
119+
let program_runtime_environment = create_program_runtime_environment_v1(
120120
&$invoke_context.feature_set,
121121
$invoke_context.get_compute_budget(),
122122
true, /* deployment */
@@ -1654,7 +1654,7 @@ pub mod test_utils {
16541654

16551655
pub fn load_all_invoked_programs(invoke_context: &mut InvokeContext) {
16561656
let mut load_program_metrics = LoadProgramMetrics::default();
1657-
let program_runtime_environment = create_program_runtime_environment(
1657+
let program_runtime_environment = create_program_runtime_environment_v1(
16581658
&invoke_context.feature_set,
16591659
invoke_context.get_compute_budget(),
16601660
false, /* deployment */

programs/bpf_loader/src/syscalls/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ macro_rules! register_feature_gated_function {
142142
};
143143
}
144144

145-
pub fn create_program_runtime_environment<'a>(
145+
pub fn create_program_runtime_environment_v1<'a>(
146146
feature_set: &FeatureSet,
147147
compute_budget: &ComputeBudget,
148148
reject_deployment_of_broken_elfs: bool,

programs/loader-v4/src/lib.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,10 @@ fn get_state_mut(data: &mut [u8]) -> Result<&mut LoaderV4State, InstructionError
6868
}
6969
}
7070

71-
pub fn load_program_from_account(
72-
_feature_set: &FeatureSet,
71+
pub fn create_program_runtime_environment_v2<'a>(
7372
compute_budget: &ComputeBudget,
74-
log_collector: Option<Rc<RefCell<LogCollector>>>,
75-
program: &BorrowedAccount,
7673
debugging_features: bool,
77-
) -> Result<(Arc<LoadedProgram>, LoadProgramMetrics), InstructionError> {
78-
let mut load_program_metrics = LoadProgramMetrics {
79-
program_id: program.get_key().to_string(),
80-
..LoadProgramMetrics::default()
81-
};
74+
) -> BuiltinProgram<InvokeContext<'a>> {
8275
let config = Config {
8376
max_call_depth: compute_budget.max_call_depth,
8477
stack_frame_size: compute_budget.stack_frame_size,
@@ -104,15 +97,31 @@ pub fn load_program_from_account(
10497
aligned_memory_mapping: true,
10598
// Warning, do not use `Config::default()` so that configuration here is explicit.
10699
};
107-
let loader = BuiltinProgram::new_loader(config);
100+
BuiltinProgram::new_loader(config)
101+
}
102+
103+
pub fn load_program_from_account(
104+
_feature_set: &FeatureSet,
105+
compute_budget: &ComputeBudget,
106+
log_collector: Option<Rc<RefCell<LogCollector>>>,
107+
program: &BorrowedAccount,
108+
debugging_features: bool,
109+
) -> Result<(Arc<LoadedProgram>, LoadProgramMetrics), InstructionError> {
110+
let mut load_program_metrics = LoadProgramMetrics {
111+
program_id: program.get_key().to_string(),
112+
..LoadProgramMetrics::default()
113+
};
108114
let state = get_state(program.get_data())?;
109115
let programdata = program
110116
.get_data()
111117
.get(LoaderV4State::program_data_offset()..)
112118
.ok_or(InstructionError::AccountDataTooSmall)?;
113119
let loaded_program = LoadedProgram::new(
114120
&loader_v4::id(),
115-
Arc::new(loader),
121+
Arc::new(create_program_runtime_environment_v2(
122+
compute_budget,
123+
debugging_features,
124+
)),
116125
state.slot,
117126
state.slot.saturating_add(1),
118127
None,

programs/sbf/benches/bpf_loader.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use {
1414
byteorder::{ByteOrder, LittleEndian, WriteBytesExt},
1515
solana_bpf_loader_program::{
1616
create_vm, serialization::serialize_parameters,
17-
syscalls::create_program_runtime_environment,
17+
syscalls::create_program_runtime_environment_v1,
1818
},
1919
solana_measure::measure::Measure,
2020
solana_program_runtime::{compute_budget::ComputeBudget, invoke_context::InvokeContext},
@@ -90,7 +90,7 @@ macro_rules! with_mock_invoke_context {
9090
fn bench_program_create_executable(bencher: &mut Bencher) {
9191
let elf = load_program_from_file("bench_alu");
9292

93-
let program_runtime_environment = create_program_runtime_environment(
93+
let program_runtime_environment = create_program_runtime_environment_v1(
9494
&FeatureSet::default(),
9595
&ComputeBudget::default(),
9696
true,
@@ -118,7 +118,7 @@ fn bench_program_alu(bencher: &mut Bencher) {
118118
let elf = load_program_from_file("bench_alu");
119119
with_mock_invoke_context!(invoke_context, bpf_loader::id(), 10000001);
120120

121-
let program_runtime_environment = create_program_runtime_environment(
121+
let program_runtime_environment = create_program_runtime_environment_v1(
122122
&invoke_context.feature_set,
123123
&ComputeBudget::default(),
124124
true,
@@ -237,7 +237,7 @@ fn bench_create_vm(bencher: &mut Bencher) {
237237
let direct_mapping = invoke_context
238238
.feature_set
239239
.is_active(&bpf_account_data_direct_mapping::id());
240-
let program_runtime_environment = create_program_runtime_environment(
240+
let program_runtime_environment = create_program_runtime_environment_v1(
241241
&invoke_context.feature_set,
242242
&ComputeBudget::default(),
243243
true,
@@ -299,7 +299,7 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) {
299299
)
300300
.unwrap();
301301

302-
let program_runtime_environment = create_program_runtime_environment(
302+
let program_runtime_environment = create_program_runtime_environment_v1(
303303
&invoke_context.feature_set,
304304
&ComputeBudget::default(),
305305
true,

runtime/src/bank.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ use {
9999
TransactionResults,
100100
},
101101
},
102-
solana_bpf_loader_program::syscalls::create_program_runtime_environment,
102+
solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1,
103103
solana_cost_model::cost_tracker::CostTracker,
104104
solana_measure::{measure, measure::Measure, measure_us},
105105
solana_perf::perf_libs,
@@ -7996,7 +7996,7 @@ impl Bank {
79967996
.iter()
79977997
.any(|key| new_feature_activations.contains(key))
79987998
{
7999-
let program_runtime_environment_v1 = create_program_runtime_environment(
7999+
let program_runtime_environment_v1 = create_program_runtime_environment_v1(
80008000
&self.feature_set,
80018001
&self.runtime_config.compute_budget.unwrap_or_default(),
80028002
false, /* deployment */
@@ -8010,6 +8010,17 @@ impl Bank {
80108010
loaded_programs_cache.program_runtime_environment_v1 =
80118011
Arc::new(program_runtime_environment_v1);
80128012
}
8013+
let program_runtime_environment_v2 =
8014+
solana_loader_v4_program::create_program_runtime_environment_v2(
8015+
&self.runtime_config.compute_budget.unwrap_or_default(),
8016+
false, /* debugging_features */
8017+
);
8018+
if *loaded_programs_cache.program_runtime_environment_v2
8019+
!= program_runtime_environment_v2
8020+
{
8021+
loaded_programs_cache.program_runtime_environment_v2 =
8022+
Arc::new(program_runtime_environment_v2);
8023+
}
80138024
loaded_programs_cache.prune_feature_set_transition();
80148025
}
80158026
for builtin in BUILTINS.iter() {

0 commit comments

Comments
 (0)