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

Commit 12aadcd

Browse files
committed
common: reduce stack usage by eliminating complex memmove_ inline function
Signed-off-by: Tomasz Gromadzki <[email protected]>
1 parent 87108b8 commit 12aadcd

File tree

4 files changed

+52
-23
lines changed

4 files changed

+52
-23
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
This release:
44
- Significantly reduces the libpmem's stack usage.
5+
- Make memmove_mov_* function non-inline to prevent huge stack consumption.
56

67
Tue Aug 8 2023 Oksana Sałyk <[email protected]>
78

src/libpmem2/x86_64/memcpy/memcpy_t_avx512f.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: BSD-3-Clause
2-
/* Copyright 2017-2020, Intel Corporation */
2+
/* Copyright 2017-2023, Intel Corporation */
33

44
#include <immintrin.h>
55
#include <stddef.h>
@@ -254,7 +254,7 @@ memmove_mov1x64b(char *dest, const char *src, flush64b_fn flush64b)
254254
flush64b(dest + 0 * 64);
255255
}
256256

257-
static force_inline void
257+
static void
258258
memmove_mov_avx512f_fw(char *dest, const char *src, size_t len,
259259
flush_fn flush, flush64b_fn flush64b)
260260
{
@@ -319,7 +319,7 @@ memmove_mov_avx512f_fw(char *dest, const char *src, size_t len,
319319
memmove_small_avx512f(dest, src, len, flush);
320320
}
321321

322-
static force_inline void
322+
static void
323323
memmove_mov_avx512f_bw(char *dest, const char *src, size_t len,
324324
flush_fn flush, flush64b_fn flush64b)
325325
{

src/stats/stack-usage-debug.txt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,10 @@
88
51344 memmove_movnt_avx512f_clflush : src/debug/libpmem2/memcpy_nt_avx512f.su:memcpy_nt_avx512f.c dynamic,bounded
99
51344 memmove_movnt_avx512f_clflushopt : src/debug/libpmem/memcpy_nt_avx512f.su:memcpy_nt_avx512f.c dynamic,bounded
1010
51344 memmove_movnt_avx512f_clflushopt : src/debug/libpmem2/memcpy_nt_avx512f.su:memcpy_nt_avx512f.c dynamic,bounded
11-
50640 memmove_mov_avx512f_noflush : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
12-
50640 memmove_mov_avx512f_noflush : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
13-
50640 memmove_mov_avx512f_empty : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
14-
50640 memmove_mov_avx512f_empty : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
15-
50640 memmove_mov_avx512f_clwb : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
16-
50640 memmove_mov_avx512f_clwb : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
17-
50640 memmove_mov_avx512f_clflush : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
18-
50640 memmove_mov_avx512f_clflush : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
19-
50640 memmove_mov_avx512f_clflushopt : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
20-
50640 memmove_mov_avx512f_clflushopt : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
11+
25344 memmove_mov_avx512f_fw : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
12+
25344 memmove_mov_avx512f_fw : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
13+
25344 memmove_mov_avx512f_bw : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
14+
25344 memmove_mov_avx512f_bw : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
2115
24144 memmove_movnt_avx_noflush_wcbarrier : src/debug/libpmem/memcpy_nt_avx.su:memcpy_nt_avx.c dynamic,bounded
2216
24144 memmove_movnt_avx_noflush_wcbarrier : src/debug/libpmem2/memcpy_nt_avx.su:memcpy_nt_avx.c dynamic,bounded
2317
24144 memmove_movnt_avx_noflush_nobarrier : src/debug/libpmem/memcpy_nt_avx.su:memcpy_nt_avx.c dynamic,bounded
@@ -952,6 +946,16 @@
952946
112 obj_open_common : src/debug/libpmemobj/obj.su:obj.c dynamic,bounded
953947
112 obj_norep_memmove : src/debug/libpmemobj/obj.su:obj.c dynamic,bounded
954948
112 obj_norep_memcpy : src/debug/libpmemobj/obj.su:obj.c dynamic,bounded
949+
112 memmove_mov_avx512f_noflush : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
950+
112 memmove_mov_avx512f_noflush : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
951+
112 memmove_mov_avx512f_empty : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
952+
112 memmove_mov_avx512f_empty : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
953+
112 memmove_mov_avx512f_clwb : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
954+
112 memmove_mov_avx512f_clwb : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
955+
112 memmove_mov_avx512f_clflush : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
956+
112 memmove_mov_avx512f_clflush : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
957+
112 memmove_mov_avx512f_clflushopt : src/debug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
958+
112 memmove_mov_avx512f_clflushopt : src/debug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c dynamic,bounded
955959
112 memblock_run_bitmap : src/debug/libpmemobj/memblock.su:memblock.c dynamic,bounded
956960
112 list_remove_single : src/debug/libpmemobj/list.su:list.c dynamic,bounded
957961
112 lane_boot : src/debug/libpmemobj/lane.su:lane.c static

src/stats/stack-usage-nondebug.txt

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
8224 pmem2_get_type_from_stat : src/nondebug/libpmemobj/pmem2_utils_linux.su:pmem2_utils_linux.c static
1111
8224 pmem2_get_type_from_stat : src/nondebug/libpmem2/pmem2_utils_linux.su:pmem2_utils_linux.c static
1212
8224 pmem2_get_type_from_stat : src/nondebug/common/pmem2_utils_linux.su:pmem2_utils_linux.c static
13-
7424 memmove_mov_avx512f_empty : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
14-
7424 memmove_mov_avx512f_empty : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1513
4352 pool_params_parse.isra.2.constprop : src/nondebug/libpmempool/pool.su:pool.c dynamic,bounded
1614
4272 ndctl_match_fsdax : src/nondebug/libpmem/region_namespace_ndctl.su:region_namespace_ndctl.c static
1715
4272 ndctl_match_fsdax : src/nondebug/libpmempool/region_namespace_ndctl.su:region_namespace_ndctl.c static
@@ -420,6 +418,10 @@
420418
128 memset_mov_avx_clflush : src/nondebug/libpmem2/memset_t_avx.su:memset_t_avx.c static
421419
128 memset_mov_avx_clflushopt : src/nondebug/libpmem/memset_t_avx.su:memset_t_avx.c static
422420
128 memset_mov_avx_clflushopt : src/nondebug/libpmem2/memset_t_avx.su:memset_t_avx.c static
421+
128 memmove_mov_avx512f_fw : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
422+
128 memmove_mov_avx512f_fw : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
423+
128 memmove_mov_avx512f_bw : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
424+
128 memmove_mov_avx512f_bw : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
423425
128 memblock_header_legacy_reinit : src/nondebug/libpmemobj/memblock.su:memblock.c static
424426
128 memblock_from_offset_opt : src/nondebug/libpmemobj/memblock.su:memblock.c static
425427
128 list_insert_new_user : src/nondebug/libpmemobj/list.su:list.c dynamic,bounded
@@ -746,14 +748,6 @@
746748
64 memmove_mov_avx_clflush : src/nondebug/libpmem2/memcpy_t_avx.su:memcpy_t_avx.c static
747749
64 memmove_mov_avx_clflushopt : src/nondebug/libpmem/memcpy_t_avx.su:memcpy_t_avx.c static
748750
64 memmove_mov_avx_clflushopt : src/nondebug/libpmem2/memcpy_t_avx.su:memcpy_t_avx.c static
749-
64 memmove_mov_avx512f_noflush : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
750-
64 memmove_mov_avx512f_noflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
751-
64 memmove_mov_avx512f_clwb : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
752-
64 memmove_mov_avx512f_clwb : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
753-
64 memmove_mov_avx512f_clflush : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
754-
64 memmove_mov_avx512f_clflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
755-
64 memmove_mov_avx512f_clflushopt : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
756-
64 memmove_mov_avx512f_clflushopt : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
757751
64 heap_set_arena_auto : src/nondebug/libpmemobj/heap.su:heap.c static
758752
64 heap_create_alloc_class_buckets : src/nondebug/libpmemobj/heap.su:heap.c static
759753
64 heap_arena_new : src/nondebug/libpmemobj/heap.su:heap.c static
@@ -1528,6 +1522,16 @@
15281522
16 obj_get_nlanes : src/nondebug/libpmemobj/obj.su:obj.c static
15291523
16 obj_fini : src/nondebug/libpmemobj/obj.su:obj.c static
15301524
16 obj_ctl_init_and_load : src/nondebug/libpmemobj/obj.su:obj.c static
1525+
16 memmove_mov_avx512f_noflush : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1526+
16 memmove_mov_avx512f_noflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1527+
16 memmove_mov_avx512f_empty : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1528+
16 memmove_mov_avx512f_empty : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1529+
16 memmove_mov_avx512f_clwb : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1530+
16 memmove_mov_avx512f_clwb : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1531+
16 memmove_mov_avx512f_clflush : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1532+
16 memmove_mov_avx512f_clflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1533+
16 memmove_mov_avx512f_clflushopt : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
1534+
16 memmove_mov_avx512f_clflushopt : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_t_avx512f.c static
15311535
16 memblock_rebuild_state : src/nondebug/libpmemobj/memblock.su:memblock.c static
15321536
16 memblock_header_legacy_get_size : src/nondebug/libpmemobj/memblock.su:memblock.c static
15331537
16 memblock_header_legacy_get_flags : src/nondebug/libpmemobj/memblock.su:memblock.c static
@@ -1850,6 +1854,12 @@
18501854
8 pmem_emit_log : src/nondebug/libpmem/pmem.su:pmem.c static
18511855
8 pmem_drain : src/nondebug/libpmem/pmem.su:pmem.c static
18521856
8 pmem_deep_drain : src/nondebug/libpmem/pmem.su:pmem.c static
1857+
8 pmem_clwb : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
1858+
8 pmem_clwb : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
1859+
8 pmem_clflush : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
1860+
8 pmem_clflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
1861+
8 pmem_clflushopt : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
1862+
8 pmem_clflushopt : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
18531863
8 pmem2_vm_reservation_get_size : src/nondebug/libpmem2/vm_reservation.su:vm_reservation.c static
18541864
8 pmem2_vm_reservation_get_address : src/nondebug/libpmem2/vm_reservation.su:vm_reservation.c static
18551865
8 pmem2_region_get_next_badblock : src/nondebug/libpmempool/badblocks_ndctl.su:badblocks_ndctl.c static
@@ -2252,6 +2262,10 @@
22522262
8 obj_norep_memcpy : src/nondebug/libpmemobj/obj.su:obj.c static
22532263
8 obj_norep_drain : src/nondebug/libpmemobj/obj.su:obj.c static
22542264
8 obj_drain_empty : src/nondebug/libpmemobj/obj.su:obj.c static
2265+
8 noflush : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_memset.h static
2266+
8 noflush : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_memset.h static
2267+
8 noflush64b : src/nondebug/libpmem/memcpy_t_avx512f.su:memcpy_memset.h static
2268+
8 noflush64b : src/nondebug/libpmem2/memcpy_t_avx512f.su:memcpy_memset.h static
22552269
8 memory_barrier : src/nondebug/libpmem/init.su:init.c static
22562270
8 memory_barrier : src/nondebug/libpmem2/init.su:init.c static
22572271
8 membuf_ptr_user_data : src/nondebug/libpmempool/membuf.su:membuf.c static
@@ -2302,12 +2316,22 @@
23022316
8 hash64 : src/nondebug/libpmemobj/rand.su:rand.c static
23032317
8 hash64 : src/nondebug/common/rand.su:rand.c static
23042318
8 flush_empty : src/nondebug/libpmem/pmem.su:pmem.c static
2319+
8 flush_empty_nolog : src/nondebug/libpmem/memcpy_t_avx512f.su:pmem2_arch.h static
2320+
8 flush_empty_nolog : src/nondebug/libpmem2/memcpy_t_avx512f.su:pmem2_arch.h static
23052321
8 flush_clwb : src/nondebug/libpmem/init.su:init.c static
23062322
8 flush_clwb : src/nondebug/libpmem2/init.su:init.c static
2323+
8 flush_clwb_nolog : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
2324+
8 flush_clwb_nolog : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
23072325
8 flush_clflush : src/nondebug/libpmem/init.su:init.c static
23082326
8 flush_clflush : src/nondebug/libpmem2/init.su:init.c static
23092327
8 flush_clflushopt : src/nondebug/libpmem/init.su:init.c static
23102328
8 flush_clflushopt : src/nondebug/libpmem2/init.su:init.c static
2329+
8 flush_clflushopt_nolog : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
2330+
8 flush_clflushopt_nolog : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
2331+
8 flush_clflush_nolog : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
2332+
8 flush_clflush_nolog : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
2333+
8 flush64b_empty : src/nondebug/libpmem/memcpy_t_avx512f.su:flush.h static
2334+
8 flush64b_empty : src/nondebug/libpmem2/memcpy_t_avx512f.su:flush.h static
23112335
8 fence_empty : src/nondebug/libpmem/pmem.su:pmem.c static
23122336
8 debug_ctl_register : src/nondebug/libpmemobj/ctl_debug.su:ctl_debug.c static
23132337
8 ctl__worker_read : src/nondebug/libpmemobj/tx.su:tx.c static

0 commit comments

Comments
 (0)