diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index c7eb17b584..d2d227289c 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -68,7 +68,7 @@ use { fmt::Debug, mem, rc::Rc, - sync::Arc, + sync::{atomic::Ordering, Arc}, }, thiserror::Error, }; @@ -588,6 +588,8 @@ fn process_instruction_common( if let Some(load_program_metrics) = load_program_metrics { load_program_metrics.submit_datapoint(&mut invoke_context.timings); } + + executor.usage_counter.fetch_add(1, Ordering::Relaxed); match &executor.program { LoadedProgramType::Invalid => Err(InstructionError::InvalidAccountData), LoadedProgramType::LegacyV0(executable) => execute(executable, invoke_context), diff --git a/programs/loader-v3/src/lib.rs b/programs/loader-v3/src/lib.rs index 1aa6edca1a..2e9d4ed31b 100644 --- a/programs/loader-v3/src/lib.rs +++ b/programs/loader-v3/src/lib.rs @@ -30,7 +30,11 @@ use { saturating_add_assign, transaction_context::{BorrowedAccount, InstructionContext}, }, - std::{cell::RefCell, rc::Rc, sync::Arc}, + std::{ + cell::RefCell, + rc::Rc, + sync::{atomic::Ordering, Arc}, + }, }; fn get_state(data: &[u8]) -> Result<&LoaderV3State, InstructionError> { @@ -584,6 +588,7 @@ pub fn process_instruction(invoke_context: &mut InvokeContext) -> Result<(), Ins get_or_create_executor_time.as_us() ); drop(program); + loaded_program.usage_counter.fetch_add(1, Ordering::Relaxed); match &loaded_program.program { LoadedProgramType::Invalid => Err(InstructionError::InvalidAccountData), LoadedProgramType::Typed(executable) => execute(invoke_context, executable), diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index c02a40af45..32a73e0534 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4650,6 +4650,11 @@ impl Bank { execution_time.stop(); + self.loaded_programs_cache + .write() + .unwrap() + .sort_and_evict(None); + debug!( "check: {}us load: {}us execute: {}us txs_len={}", check_time.as_us(),