Skip to content

Commit 26fcd83

Browse files
committed
util: support and check tagged allocations in spad
1 parent e244d46 commit 26fcd83

File tree

10 files changed

+338
-89
lines changed

10 files changed

+338
-89
lines changed

config/extra/with-handholding.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ CPPFLAGS+=-DFD_FORKS_USE_HANDHOLDING=1
33
CPPFLAGS+=-DFD_GHOST_USE_HANDHOLDING=1
44
CPPFLAGS+=-DFD_SCRATCH_USE_HANDHOLDING=1
55
CPPFLAGS+=-DFD_SPAD_USE_HANDHOLDING=1
6+
CPPFLAGS+=-DFD_SPAD_TAG_CHECK=1
67
CPPFLAGS+=-DFD_TOWER_USE_HANDHOLDING=1
78
CPPFLAGS+=-DFD_TMPL_USE_HANDHOLDING=1
89
CPPFLAGS+=-DFD_TXN_HANDHOLDING=1

src/app/ledger/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ init_spads( fd_ledger_args_t * args, int has_tpool ) {
145145
args->exec_spad_cnt = fd_tpool_worker_cnt( args->tpool );
146146
for( ulong i=0UL; i<fd_tpool_worker_cnt( args->tpool ); i++ ) {
147147
ulong total_mem_sz = args->thread_mem_bound;
148-
uchar * mem = fd_wksp_alloc_laddr( args->wksp, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( total_mem_sz ), 999UL );
148+
uchar * mem = fd_wksp_alloc_laddr( args->wksp, fd_spad_align(), fd_spad_footprint( total_mem_sz ), 999UL );
149149
fd_spad_t * spad = fd_spad_join( fd_spad_new( mem, total_mem_sz ) );
150150
if( FD_UNLIKELY( !spad ) ) {
151151
FD_LOG_ERR(( "failed to allocate spad" ));
@@ -162,7 +162,7 @@ init_spads( fd_ledger_args_t * args, int has_tpool ) {
162162
that exist at the slot_ctx/epoch_ctx. It should encapsulate all allocations
163163
that happen outside of transaction execution. */
164164

165-
uchar * mem = fd_wksp_alloc_laddr( args->wksp, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( args->runtime_mem_bound ), 999UL );
165+
uchar * mem = fd_wksp_alloc_laddr( args->wksp, fd_spad_align(), fd_spad_footprint( args->runtime_mem_bound ), 999UL );
166166
fd_spad_t * spad = fd_spad_join( fd_spad_new( mem, args->runtime_mem_bound ) );
167167
if( FD_UNLIKELY( !spad ) ) {
168168
FD_LOG_ERR(( "Failed to allocate runtime spad" ));

src/flamenco/runtime/tests/fd_exec_instr_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,7 @@ _block_context_create_and_exec( fd_exec_instr_test_runner_t * runner,
14071407
ulong exec_spads_cnt = 2UL;
14081408
ulong exec_spad_mem_max = 1UL << 30;
14091409
for( ulong i=0UL; i<worker_max; i++ ) {
1410-
void * exec_spad_mem = fd_spad_alloc( runtime_spad, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( exec_spad_mem_max ) );
1410+
void * exec_spad_mem = fd_spad_alloc( runtime_spad, fd_spad_align(), fd_spad_footprint( exec_spad_mem_max ) );
14111411
fd_spad_t * exec_spad = fd_spad_join( fd_spad_new( exec_spad_mem, exec_spad_mem_max ) );
14121412
exec_spads[i] = exec_spad;
14131413
}
@@ -1987,7 +1987,7 @@ fd_exec_vm_syscall_test_run( fd_exec_instr_test_runner_t * runner,
19871987

19881988
/* Need to setup txn_descriptor for txn account write checks (see fd_txn_account_is_writable_idx)
19891989
FIXME: this could probably go in fd_exec_test_instr_context_create? */
1990-
fd_txn_t * txn_descriptor = (fd_txn_t *)fd_spad_alloc_debug( spad, fd_txn_align(), fd_txn_footprint( ctx->txn_ctx->instr_info_cnt, 0UL ) );
1990+
fd_txn_t * txn_descriptor = (fd_txn_t *)fd_spad_alloc_debug( spad, fd_txn_align(), fd_txn_footprint( ctx->txn_ctx->instr_info_cnt, 0UL ), 0UL );
19911991
txn_descriptor->transaction_version = FD_TXN_V0;
19921992
txn_descriptor->acct_addr_cnt = (ushort)ctx->txn_ctx->accounts_cnt;
19931993

src/flamenco/runtime/tests/fd_exec_sol_compat.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ sol_compat_wksp_init( ulong wksp_page_sz ) {
7474
}
7575
FD_TEST( wksp );
7676

77-
spad_mem = fd_wksp_alloc_laddr( wksp, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( FD_RUNTIME_TRANSACTION_EXECUTION_FOOTPRINT_FUZZ ), WKSP_INIT_ALLOC_TAG ); /* 4738713960 B */
77+
spad_mem = fd_wksp_alloc_laddr( wksp, fd_spad_align(), fd_spad_footprint( FD_RUNTIME_TRANSACTION_EXECUTION_FOOTPRINT_FUZZ ), WKSP_INIT_ALLOC_TAG ); /* 4738713960 B */
7878
FD_TEST( spad_mem );
7979

8080
features.struct_size = sizeof(sol_compat_features_t);

src/flamenco/runtime/tests/fd_vm_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ do{
9494
break;
9595
}
9696
ulong rodata_sz = input->vm_ctx.rodata->size;
97-
uchar * rodata = fd_spad_alloc_debug( spad, 8UL, rodata_sz );
97+
uchar * rodata = fd_spad_alloc_debug( spad, 8UL, rodata_sz, 0UL );
9898
memcpy( rodata, input->vm_ctx.rodata->bytes, rodata_sz );
9999

100100
/* Enable direct_mapping for SBPF version >= v1 */
@@ -338,7 +338,7 @@ fd_setup_vm_input_regions( fd_vm_input_region_t * input,
338338
continue; /* skip empty regions https://github.com/anza-xyz/agave/blob/3072c1a72b2edbfa470ca869f1ea891dfb6517f2/programs/bpf_loader/src/serialization.rs#L136 */
339339
}
340340

341-
uchar * haddr = fd_spad_alloc_debug( spad, 8UL, array->size );
341+
uchar * haddr = fd_spad_alloc_debug( spad, 8UL, array->size, 0UL );
342342
fd_memcpy( haddr, array->bytes, array->size );
343343
input[input_idx].vaddr_offset = offset;
344344
input[input_idx].haddr = (ulong)haddr;

src/flamenco/snapshot/fd_snapshot_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ cmd_dump( int argc,
444444
/* With spad */
445445

446446
ulong mem_max = args->zstd_window_sz + (1<<29); /* manifest plus 512 MiB headroom */
447-
uchar * mem = fd_wksp_alloc_laddr( wksp, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( mem_max ), 1UL );
447+
uchar * mem = fd_wksp_alloc_laddr( wksp, fd_spad_align(), fd_spad_footprint( mem_max ), 1UL );
448448
fd_spad_t * spad = fd_spad_join( fd_spad_new( mem, mem_max ) );
449449
if( FD_UNLIKELY( !spad ) ) {
450450
FD_LOG_ERR(( "Failed to allocate spad" ));

src/flamenco/snapshot/test_snapshot_restore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ main( int argc,
7474

7575
void * restore_mem = fd_wksp_alloc_laddr( wksp, fd_snapshot_restore_align(), fd_snapshot_restore_footprint(), static_tag );
7676

77-
fd_spad_t * _spad = fd_spad_new( fd_wksp_alloc_laddr( wksp, FD_SPAD_ALIGN, FD_SPAD_FOOTPRINT( 4194304UL ), static_tag ), 4194304UL );
77+
fd_spad_t * _spad = fd_spad_new( fd_wksp_alloc_laddr( wksp, fd_spad_align(), fd_spad_footprint( 4194304UL ), static_tag ), 4194304UL );
7878
fd_spad_push( _spad );
7979
FD_LOG_WARNING(("SPAD %lu", _spad->mem_max));
8080

src/util/spad/fd_spad.c

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,39 @@ fd_spad_pop_debug( fd_spad_t * spad ) {
8181
SELECT_DEBUG_IMPL(fd_spad_pop)( spad );
8282
}
8383

84+
#if FD_SPAD_TAG_CHECK
85+
static void
86+
fd_spad_check_tag( fd_spad_t * spad,
87+
ulong tag ) {
88+
89+
ulong * tag_mem_used = (ulong *)(spad+1UL);
90+
if( FD_UNLIKELY( tag_mem_used[ spad->frame_free * spad->tag_max + tag ] >
91+
tag_mem_used[ FD_SPAD_FRAME_MAX * spad->tag_max + tag ] ) ) {
92+
FD_LOG_CRIT(( "tag %lu overflow %lu > %lu",
93+
tag,
94+
tag_mem_used[ spad->frame_free * spad->tag_max + tag ],
95+
tag_mem_used[ FD_SPAD_FRAME_MAX * spad->tag_max + tag ] ));
96+
}
97+
98+
}
99+
#endif
100+
84101
void *
85102
fd_spad_alloc_debug( fd_spad_t * spad,
86103
ulong align,
87-
ulong sz ) {
104+
ulong sz,
105+
ulong tag ) {
88106
if( FD_UNLIKELY( !fd_spad_frame_used( spad ) ) ) FD_LOG_CRIT(( "not in a frame" ));
89-
if( FD_UNLIKELY( (!!align) & (!fd_ulong_is_pow2( align ) ) ) ) FD_LOG_CRIT(( "bad align" ));
90-
if( FD_UNLIKELY( fd_spad_alloc_max( spad, align )<sz ) ) FD_LOG_CRIT(( "bad sz" ));
91-
return SELECT_DEBUG_IMPL(fd_spad_alloc)( spad, align, sz );
107+
if( FD_UNLIKELY( (!!align) & (!fd_ulong_is_pow2( align ) ) ) ) FD_LOG_CRIT(( "bad align %lu", align ));
108+
if( FD_UNLIKELY( fd_spad_alloc_max( spad, align )<sz ) ) FD_LOG_CRIT(( "bad sz %lu align %lu max %lu alloc_max %lu", sz, align, fd_spad_mem_max( spad ), fd_spad_alloc_max( spad, align ) ));
109+
#if FD_SPAD_TAG_CHECK
110+
if( FD_UNLIKELY( fd_spad_tag_max( spad )<=tag ) ) FD_LOG_CRIT(( "bad tag %lu tag_max %lu", tag, fd_spad_tag_max( spad ) ));
111+
#endif
112+
void * rv = SELECT_DEBUG_IMPL(fd_spad_alloc)( spad, align, sz, tag );
113+
#if FD_SPAD_TAG_CHECK
114+
fd_spad_check_tag( spad, tag );
115+
#endif
116+
return rv;
92117
}
93118

94119
void
@@ -103,11 +128,19 @@ fd_spad_trim_debug( fd_spad_t * spad,
103128
void *
104129
fd_spad_prepare_debug( fd_spad_t * spad,
105130
ulong align,
106-
ulong max ) {
131+
ulong max,
132+
ulong tag ) {
107133
if( FD_UNLIKELY( !fd_spad_frame_used( spad ) ) ) FD_LOG_CRIT(( "not in a frame" ));
108-
if( FD_UNLIKELY( (!!align) & (!fd_ulong_is_pow2( align ) ) ) ) FD_LOG_CRIT(( "bad align" ));
109-
if( FD_UNLIKELY( fd_spad_alloc_max( spad, align )<max ) ) FD_LOG_CRIT(( "bad max of %lu", max ));
110-
return SELECT_DEBUG_IMPL(fd_spad_prepare)( spad, align, max );
134+
if( FD_UNLIKELY( (!!align) & (!fd_ulong_is_pow2( align ) ) ) ) FD_LOG_CRIT(( "bad align %lu", align ));
135+
if( FD_UNLIKELY( fd_spad_alloc_max( spad, align )<max ) ) FD_LOG_CRIT(( "bad max %lu align %lu max %lu alloc_max %lu", max, align, fd_spad_mem_max( spad ), fd_spad_alloc_max( spad, align ) ));
136+
#if FD_SPAD_TAG_CHECK
137+
if( FD_UNLIKELY( fd_spad_tag_max( spad )<=tag ) ) FD_LOG_CRIT(( "bad tag %lu tag_max %lu", tag, fd_spad_tag_max( spad ) ));
138+
#endif
139+
void * rv = SELECT_DEBUG_IMPL(fd_spad_prepare)( spad, align, max, tag );
140+
#if FD_SPAD_TAG_CHECK
141+
fd_spad_check_tag( spad, tag );
142+
#endif
143+
return rv;
111144
}
112145

113146
void
@@ -126,6 +159,10 @@ fd_spad_publish_debug( fd_spad_t * spad,
126159
/* FIXME: check if in prepare? needs extra state and a lot of extra
127160
tracking that state */
128161
SELECT_DEBUG_IMPL(fd_spad_publish)( spad, sz );
162+
163+
#if FD_SPAD_TAG_CHECK
164+
fd_spad_check_tag( spad, spad->inprep_tag );
165+
#endif
129166
}
130167

131168
#undef SELECT_DEBUG_IMPL
@@ -199,15 +236,16 @@ fd_spad_pop_sanitizer_impl( fd_spad_t * spad ) {
199236
void *
200237
fd_spad_alloc_sanitizer_impl( fd_spad_t * spad,
201238
ulong align,
202-
ulong sz ) {
239+
ulong sz,
240+
ulong tag ) {
203241
/* enforce a minimum alignment of FD_ASAN_ALIGN or FD_MSAN_ALIGN when running ASAN or MSAN respectively */
204242
#if FD_HAS_DEEPASAN
205243
align = fd_ulong_if( align>0UL, fd_ulong_max( align, FD_ASAN_ALIGN ), FD_SPAD_ALLOC_ALIGN_DEFAULT ); /* typically compile time */
206244
#elif FD_HAS_MSAN
207245
align = fd_ulong_if( align>0UL, fd_ulong_max( align, FD_MSAN_ALIGN ), FD_SPAD_ALLOC_ALIGN_DEFAULT ); /* typically compile time */
208246
#endif
209247

210-
void * buf = fd_spad_alloc_impl( spad, align, sz );
248+
void * buf = fd_spad_alloc_impl( spad, align, sz, tag );
211249

212250
/* first poison from buf to mem_max to cancel any in-progress prepare.
213251
buf is guaranteed to be an 8-byte aligned adddress */
@@ -253,15 +291,16 @@ fd_spad_trim_sanitizer_impl( fd_spad_t * spad,
253291
void *
254292
fd_spad_prepare_sanitizer_impl( fd_spad_t * spad,
255293
ulong align,
256-
ulong max ) {
294+
ulong max,
295+
ulong tag ) {
257296
/* enforce a minimum alignment of FD_ASAN_ALIGN or FD_MSAN_ALIGN when running ASAN or MSAN respectively */
258297
#if FD_HAS_DEEPASAN
259298
align = fd_ulong_if( align>0UL, fd_ulong_max( align, FD_ASAN_ALIGN ), FD_SPAD_ALLOC_ALIGN_DEFAULT ); /* typically compile time */
260299
#elif FD_HAS_MSAN
261300
align = fd_ulong_if( align>0UL, fd_ulong_max( align, FD_MSAN_ALIGN ), FD_SPAD_ALLOC_ALIGN_DEFAULT ); /* typically compile time */
262301
#endif
263302

264-
void * buf = fd_spad_prepare_impl( spad, align, max );
303+
void * buf = fd_spad_prepare_impl( spad, align, max, tag );
265304

266305
/* unpoison memory starting at buf, which is guaranteed to be 8 byte aligned */
267306
fd_asan_unpoison( buf, spad->mem_max - spad->mem_used );

0 commit comments

Comments
 (0)