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

Commit

Permalink
Rename BpfComputeBudget (#18768)
Browse files Browse the repository at this point in the history
  • Loading branch information
jackcmay authored Jul 22, 2021
1 parent cbe2ed4 commit 7fc4cfe
Show file tree
Hide file tree
Showing 9 changed files with 277 additions and 165 deletions.
26 changes: 16 additions & 10 deletions program-test/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use {
account::{Account, AccountSharedData, ReadableAccount, WritableAccount},
account_info::AccountInfo,
clock::{Clock, Slot},
compute_budget::ComputeBudget,
entrypoint::{ProgramResult, SUCCESS},
epoch_schedule::EpochSchedule,
fee_calculator::{FeeCalculator, FeeRateGovernor},
Expand All @@ -26,9 +27,7 @@ use {
instruction::InstructionError,
message::Message,
native_token::sol_to_lamports,
process_instruction::{
stable_log, BpfComputeBudget, InvokeContext, ProcessInstructionWithContext,
},
process_instruction::{stable_log, InvokeContext, ProcessInstructionWithContext},
program_error::{ProgramError, ACCOUNT_BORROW_FAILED, UNSUPPORTED_SYSVAR},
pubkey::Pubkey,
rent::Rent,
Expand Down Expand Up @@ -212,7 +211,7 @@ fn get_sysvar<T: Default + Sysvar + Sized + serde::de::DeserializeOwned>(
.try_borrow_mut()
.map_err(|_| ACCOUNT_BORROW_FAILED)
.unwrap()
.consume(invoke_context.get_bpf_compute_budget().sysvar_base_cost + T::size_of() as u64)
.consume(invoke_context.get_compute_budget().sysvar_base_cost + T::size_of() as u64)
.is_err()
{
panic!("Exceeded compute budget");
Expand Down Expand Up @@ -462,7 +461,7 @@ fn setup_fee_calculator(bank: Bank) -> Bank {
pub struct ProgramTest {
accounts: Vec<(Pubkey, AccountSharedData)>,
builtins: Vec<Builtin>,
bpf_compute_max_units: Option<u64>,
compute_max_units: Option<u64>,
prefer_bpf: bool,
use_bpf_jit: bool,
}
Expand Down Expand Up @@ -492,7 +491,7 @@ impl Default for ProgramTest {
Self {
accounts: vec![],
builtins: vec![],
bpf_compute_max_units: None,
compute_max_units: None,
prefer_bpf,
use_bpf_jit: false,
}
Expand Down Expand Up @@ -522,9 +521,16 @@ impl ProgramTest {
self.prefer_bpf = prefer_bpf;
}

/// Override the default maximum compute units
pub fn set_compute_max_units(&mut self, compute_max_units: u64) {
self.compute_max_units = Some(compute_max_units);
}

/// Override the BPF compute budget
#[allow(deprecated)]
#[deprecated(since = "1.8.0", note = "please use `set_compute_max_units` instead")]
pub fn set_bpf_compute_max_units(&mut self, bpf_compute_max_units: u64) {
self.bpf_compute_max_units = Some(bpf_compute_max_units);
self.compute_max_units = Some(bpf_compute_max_units);
}

/// Execute the BPF program with JIT if true, interpreted if false
Expand Down Expand Up @@ -783,10 +789,10 @@ impl ProgramTest {
bank.store_account(address, account);
}
bank.set_capitalization();
if let Some(max_units) = self.bpf_compute_max_units {
bank.set_bpf_compute_budget(Some(BpfComputeBudget {
if let Some(max_units) = self.compute_max_units {
bank.set_compute_budget(Some(ComputeBudget {
max_units,
..BpfComputeBudget::default()
..ComputeBudget::default()
}));
}
let bank = setup_fee_calculator(bank);
Expand Down
9 changes: 4 additions & 5 deletions programs/bpf/tests/programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ use solana_sdk::{
bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable,
client::SyncClient,
clock::MAX_PROCESSING_AGE,
compute_budget,
entrypoint::{MAX_PERMITTED_DATA_INCREASE, SUCCESS},
instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError},
keyed_account::KeyedAccount,
Expand Down Expand Up @@ -1231,7 +1230,7 @@ fn test_program_bpf_ro_modify() {
#[cfg(feature = "bpf_rust")]
#[test]
fn test_program_bpf_call_depth() {
use solana_sdk::process_instruction::BpfComputeBudget;
use solana_sdk::compute_budget::ComputeBudget;

solana_logger::setup();

Expand All @@ -1253,15 +1252,15 @@ fn test_program_bpf_call_depth() {

let instruction = Instruction::new_with_bincode(
program_id,
&(BpfComputeBudget::default().max_call_depth - 1),
&(ComputeBudget::default().max_call_depth - 1),
vec![],
);
let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction);
assert!(result.is_ok());

let instruction = Instruction::new_with_bincode(
program_id,
&BpfComputeBudget::default().max_call_depth,
&ComputeBudget::default().max_call_depth,
vec![],
);
let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction);
Expand Down Expand Up @@ -1290,7 +1289,7 @@ fn test_program_bpf_compute_budget() {
);
let message = Message::new(
&[
compute_budget::request_units(1),
solana_sdk::compute_budget::ComputeBudgetInstruction::request_units(1),
Instruction::new_with_bincode(program_id, &0, vec![]),
],
Some(&mint_keypair.pubkey()),
Expand Down
21 changes: 10 additions & 11 deletions programs/bpf_loader/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ pub fn create_executor(
ic_msg!(invoke_context, "Failed to register syscalls: {}", e);
InstructionError::ProgramEnvironmentSetupFailure
})?;
let bpf_compute_budget = invoke_context.get_bpf_compute_budget();
let compute_budget = invoke_context.get_compute_budget();
let config = Config {
max_call_depth: bpf_compute_budget.max_call_depth,
stack_frame_size: bpf_compute_budget.stack_frame_size,
max_call_depth: compute_budget.max_call_depth,
stack_frame_size: compute_budget.stack_frame_size,
enable_instruction_tracing: log_enabled!(Trace),
..Config::default()
};
Expand Down Expand Up @@ -149,11 +149,9 @@ pub fn create_vm<'a>(
parameter_bytes: &mut [u8],
invoke_context: &'a mut dyn InvokeContext,
) -> Result<EbpfVm<'a, BpfError, ThisInstructionMeter>, EbpfError<BpfError>> {
let bpf_compute_budget = invoke_context.get_bpf_compute_budget();
let heap = AlignedMemory::new_with_size(
bpf_compute_budget.heap_size.unwrap_or(HEAP_LENGTH),
HOST_ALIGN,
);
let compute_budget = invoke_context.get_compute_budget();
let heap =
AlignedMemory::new_with_size(compute_budget.heap_size.unwrap_or(HEAP_LENGTH), HOST_ALIGN);
let heap_region = MemoryRegion::new_from_slice(heap.as_slice(), MM_HEAP_START, 0, true);
let mut vm = EbpfVm::new(program, parameter_bytes, &[heap_region])?;
syscalls::bind_syscall_context_objects(loader_id, &mut vm, invoke_context, heap)?;
Expand Down Expand Up @@ -866,15 +864,15 @@ mod tests {
account_utils::StateMut,
client::SyncClient,
clock::Clock,
compute_budget::ComputeBudget,
feature_set::FeatureSet,
genesis_config::create_genesis_config,
instruction::Instruction,
instruction::{AccountMeta, InstructionError},
keyed_account::KeyedAccount,
message::Message,
process_instruction::{
BpfComputeBudget, InvokeContextStackFrame, MockComputeMeter, MockInvokeContext,
MockLogger,
InvokeContextStackFrame, MockComputeMeter, MockInvokeContext, MockLogger,
},
pubkey::Pubkey,
rent::Rent,
Expand Down Expand Up @@ -1133,7 +1131,8 @@ mod tests {
keyed_accounts_range,
}],
logger: MockLogger::default(),
bpf_compute_budget: BpfComputeBudget::default(),
compute_budget: ComputeBudget::default(),
bpf_compute_budget: ComputeBudget::default().into(),
compute_meter: MockComputeMeter::default(),
programs: vec![],
accounts: vec![],
Expand Down
56 changes: 24 additions & 32 deletions programs/bpf_loader/src/syscalls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ pub fn bind_syscall_context_objects<'a>(
invoke_context: &'a mut dyn InvokeContext,
heap: AlignedMemory,
) -> Result<(), EbpfError<BpfError>> {
let bpf_compute_budget = invoke_context.get_bpf_compute_budget();
let compute_budget = invoke_context.get_compute_budget();
let enforce_aligned_host_addrs =
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());

Expand All @@ -223,7 +223,7 @@ pub fn bind_syscall_context_objects<'a>(
)?;
vm.bind_syscall_context_object(
Box::new(SyscallLogU64 {
cost: bpf_compute_budget.log_64_units,
cost: compute_budget.log_64_units,
compute_meter: invoke_context.get_compute_meter(),
logger: invoke_context.get_logger(),
}),
Expand All @@ -241,7 +241,7 @@ pub fn bind_syscall_context_objects<'a>(

vm.bind_syscall_context_object(
Box::new(SyscallLogPubkey {
cost: bpf_compute_budget.log_pubkey_units,
cost: compute_budget.log_pubkey_units,
compute_meter: invoke_context.get_compute_meter(),
logger: invoke_context.get_logger(),
loader_id,
Expand All @@ -252,7 +252,7 @@ pub fn bind_syscall_context_objects<'a>(

vm.bind_syscall_context_object(
Box::new(SyscallCreateProgramAddress {
cost: bpf_compute_budget.create_program_address_units,
cost: compute_budget.create_program_address_units,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
enforce_aligned_host_addrs,
Expand All @@ -262,7 +262,7 @@ pub fn bind_syscall_context_objects<'a>(

vm.bind_syscall_context_object(
Box::new(SyscallTryFindProgramAddress {
cost: bpf_compute_budget.create_program_address_units,
cost: compute_budget.create_program_address_units,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
enforce_aligned_host_addrs,
Expand All @@ -272,8 +272,8 @@ pub fn bind_syscall_context_objects<'a>(

vm.bind_syscall_context_object(
Box::new(SyscallSha256 {
sha256_base_cost: bpf_compute_budget.sha256_base_cost,
sha256_byte_cost: bpf_compute_budget.sha256_byte_cost,
sha256_base_cost: compute_budget.sha256_base_cost,
sha256_byte_cost: compute_budget.sha256_byte_cost,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
enforce_aligned_host_addrs,
Expand All @@ -285,8 +285,8 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&keccak256_syscall_enabled::id()),
Box::new(SyscallKeccak256 {
base_cost: bpf_compute_budget.sha256_base_cost,
byte_cost: bpf_compute_budget.sha256_byte_cost,
base_cost: compute_budget.sha256_base_cost,
byte_cost: compute_budget.sha256_byte_cost,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -296,7 +296,7 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&memory_ops_syscalls::id()),
Box::new(SyscallMemcpy {
cost: invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
cost: invoke_context.get_compute_budget().cpi_bytes_per_unit,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -305,7 +305,7 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&memory_ops_syscalls::id()),
Box::new(SyscallMemmove {
cost: invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
cost: invoke_context.get_compute_budget().cpi_bytes_per_unit,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -314,7 +314,7 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&memory_ops_syscalls::id()),
Box::new(SyscallMemcmp {
cost: invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
cost: invoke_context.get_compute_budget().cpi_bytes_per_unit,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -323,7 +323,7 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&memory_ops_syscalls::id()),
Box::new(SyscallMemset {
cost: invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
cost: invoke_context.get_compute_budget().cpi_bytes_per_unit,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -332,8 +332,8 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&blake3_syscall_enabled::id()),
Box::new(SyscallBlake3 {
base_cost: bpf_compute_budget.sha256_base_cost,
byte_cost: bpf_compute_budget.sha256_byte_cost,
base_cost: compute_budget.sha256_base_cost,
byte_cost: compute_budget.sha256_byte_cost,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
}),
Expand All @@ -343,7 +343,7 @@ pub fn bind_syscall_context_objects<'a>(
vm,
invoke_context.is_feature_active(&secp256k1_recover_syscall_enabled::id()),
Box::new(SyscallSecp256k1Recover {
cost: bpf_compute_budget.secp256k1_recover_cost,
cost: compute_budget.secp256k1_recover_cost,
compute_meter: invoke_context.get_compute_meter(),
loader_id,
libsecp256k1_0_5_upgrade_enabled: invoke_context
Expand Down Expand Up @@ -1043,9 +1043,9 @@ fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId>(
.try_borrow()
.map_err(|_| SyscallError::InvokeContextBorrowFailed)?;

invoke_context.get_compute_meter().consume(
invoke_context.get_bpf_compute_budget().sysvar_base_cost + size_of::<T>() as u64,
)?;
invoke_context
.get_compute_meter()
.consume(invoke_context.get_compute_budget().sysvar_base_cost + size_of::<T>() as u64)?;
let var = translate_type_mut::<T>(
memory_mapping,
var_addr,
Expand Down Expand Up @@ -1689,8 +1689,7 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {

if invoke_context.is_feature_active(&cpi_data_cost::id()) {
invoke_context.get_compute_meter().consume(
data.len() as u64
/ invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
data.len() as u64 / invoke_context.get_compute_budget().cpi_bytes_per_unit,
)?;
}

Expand Down Expand Up @@ -2009,8 +2008,7 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {

if invoke_context.is_feature_active(&cpi_data_cost::id()) {
invoke_context.get_compute_meter().consume(
account_info.data_len
/ invoke_context.get_bpf_compute_budget().cpi_bytes_per_unit,
account_info.data_len / invoke_context.get_compute_budget().cpi_bytes_per_unit,
)?;
}

Expand Down Expand Up @@ -2213,9 +2211,7 @@ fn check_instruction_size(
let size = num_accounts
.saturating_mul(size_of::<AccountMeta>())
.saturating_add(data_len);
let max_size = invoke_context
.get_bpf_compute_budget()
.max_cpi_instruction_size;
let max_size = invoke_context.get_compute_budget().max_cpi_instruction_size;
if size > max_size {
return Err(SyscallError::InstructionTooLarge(size, max_size).into());
}
Expand All @@ -2226,11 +2222,7 @@ fn check_account_infos(
len: usize,
invoke_context: &Ref<&mut dyn InvokeContext>,
) -> Result<(), EbpfError<BpfError>> {
if len * size_of::<Pubkey>()
> invoke_context
.get_bpf_compute_budget()
.max_cpi_instruction_size
{
if len * size_of::<Pubkey>() > invoke_context.get_compute_budget().max_cpi_instruction_size {
// Cap the number of account_infos a caller can pass to approximate
// maximum that accounts that could be passed in an instruction
return Err(SyscallError::TooManyAccounts.into());
Expand Down Expand Up @@ -2305,7 +2297,7 @@ fn call<'a>(

invoke_context
.get_compute_meter()
.consume(invoke_context.get_bpf_compute_budget().invoke_units)?;
.consume(invoke_context.get_compute_budget().invoke_units)?;

let enforce_aligned_host_addrs =
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());
Expand Down
Loading

0 comments on commit 7fc4cfe

Please sign in to comment.