diff --git a/.github/actions/pmem_test_prepare/action.yml b/.github/actions/pmem_test_prepare/action.yml index 8a67800fcf4..e9ca0982590 100644 --- a/.github/actions/pmem_test_prepare/action.yml +++ b/.github/actions/pmem_test_prepare/action.yml @@ -9,6 +9,10 @@ inputs: description: Build with the fault injection capability required: false default: '0' + valgrind: + description: Build with Valgrind support + required: true + runs: using: composite steps: @@ -30,6 +34,9 @@ runs: - env: FAULT_INJECTION: ${{ inputs.fault_injection }} NDCTL_ENABLE: ${{ inputs.ndctl_enable }} + PMEMOBJ_IGNORE_DIRTY_SHUTDOWN: ${{ inputs.ndctl_enable == 'n' && 'y' || 'n' }} + PMEMOBJ_IGNORE_BAD_BLOCKS: ${{ inputs.ndctl_enable == 'n' && 'y' || 'n' }} + VALGRIND: ${{ inputs.valgrind }} run: | echo '::group::Build' $WORKDIR/build-pmdk.sh diff --git a/.github/workflows/pmem_test_matrix.yml b/.github/workflows/pmem_test_matrix.yml index ccb032b74c4..4b62b0c6788 100644 --- a/.github/workflows/pmem_test_matrix.yml +++ b/.github/workflows/pmem_test_matrix.yml @@ -9,6 +9,9 @@ on: force_enable: required: true type: string + valgrind: + required: true + type: string timeout_minutes: required: false type: number @@ -28,11 +31,14 @@ jobs: os: [rhel, opensuse] build: [debug, nondebug] + steps: - uses: actions/checkout@v4 - name: Test prepare uses: ./.github/actions/pmem_test_prepare + with: + valgrind: ${{ inputs.valgrind }} - name: Test run uses: ./.github/actions/pmem_test_run diff --git a/.github/workflows/pmem_tests.yml b/.github/workflows/pmem_tests.yml index 36899997ea8..972e9eebe42 100644 --- a/.github/workflows/pmem_tests.yml +++ b/.github/workflows/pmem_tests.yml @@ -12,11 +12,16 @@ on: jobs: # Test the default build with the basic test suite. Basic: + strategy: + matrix: + VALGRIND: [0, 1] + name: Basic ${{ matrix.VALGRIND == 0 && 'w/o Valgrind' || 'w/ Valgrind' }} uses: ./.github/workflows/pmem_test_matrix.yml with: # Exclude all Valgrind tests. All tests employing Valgrind tooling are run # in the dedicated workflows below. force_enable: '["none"]' + valgrind: ${{ matrix.VALGRIND }} # Test the default build with force-enabled Valgrind tooling for (persistent) @@ -25,6 +30,7 @@ jobs: uses: ./.github/workflows/pmem_test_matrix.yml with: force_enable: '["pmemcheck", "memcheck"]' + valgrind: 1 # Test the default build with force-enabled Valgrind tooling for thread error @@ -33,6 +39,7 @@ jobs: uses: ./.github/workflows/pmem_test_matrix.yml with: force_enable: '["drd", "helgrind"]' + valgrind: 1 # 9h = 7h20m (the longest workflow execution time) + ~20% leeway. timeout_minutes: 540 @@ -52,6 +59,8 @@ jobs: - name: Test prepare uses: ./.github/actions/pmem_test_prepare + with: + valgrid: 1 - name: Test run uses: ./.github/actions/pmem_test_run @@ -73,6 +82,7 @@ jobs: uses: ./.github/actions/pmem_test_prepare with: fault_injection: '1' + valgrind: 1 - name: Test run uses: ./.github/actions/pmem_test_run @@ -84,6 +94,8 @@ jobs: # By default, PMDK is built with NDCTL in order to provide RAS features. # This build is only viable as long as DAOS builds PMDK with NDCTL_ENABLE=n # https://github.com/daos-stack/pmdk/pull/12 + # It should be removed as soon as following PR is merged + # https://github.com/daos-stack/pmdk/pull/35 ndctl_enable_n: name: Without ndctl if: github.repository == 'pmem/pmdk' @@ -96,6 +108,7 @@ jobs: uses: ./.github/actions/pmem_test_prepare with: ndctl_enable: n + valgrind: 0 - name: Test run uses: ./.github/actions/pmem_test_run diff --git a/.github/workflows/scan_codeql.yml b/.github/workflows/scan_codeql.yml index fc3c7183dcc..ce5a625834b 100644 --- a/.github/workflows/scan_codeql.yml +++ b/.github/workflows/scan_codeql.yml @@ -41,7 +41,7 @@ jobs: languages: cpp, python - name: Build PMDK - run: make EXTRA_CFLAGS=-DUSE_VALGRIND test -j$(nproc) + run: make test -j$(nproc) - name: CodeQL scan uses: github/codeql-action/analyze@v2 diff --git a/ChangeLog b/ChangeLog index b199c775169..808e26f55df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,7 +17,6 @@ Mon Dec 4 2023 Oksana Sałyk - Reduces libpmemobj's stack usage below the 11kB threshold. - Fixing minor Coverity issues - Add a new toolset for stack usage analysis (https://github.com/pmem/pmdk/tree/master/utils/call_stacks_analysis) - Tue Aug 8 2023 Oksana Sałyk diff --git a/INSTALL.md b/INSTALL.md index a3f1baf19f9..a8876d51c11 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -108,15 +108,12 @@ Both building and installation scripts are very flexible. To see additional opti ### Memory Management Tools The PMDK libraries support standard Valgrind DRD, Helgrind and Memcheck, as well as a PM-aware version of [Valgrind](https://github.com/pmem/valgrind). -By default, support for all tools is enabled. If you wish to disable it, supply the compiler with `VG_\_ENABLED` flag set to 0, for example: +By default, support for all tools is enabled. If you wish to disable it, supply the compiler with `VALGRIND` flag set to 0: ```sh -make EXTRA_CFLAGS=-DVG_MEMCHECK_ENABLED=0 +make VALGRIND=0 ``` -`VALGRIND_ENABLED` flag, when set to 0, disables all Valgrind tools -(drd, helgrind, memcheck and pmemcheck). - The `SANITIZE` flag allows the libraries to be tested with various sanitizers. For example, to test the libraries with AddressSanitizer and UndefinedBehaviorSanitizer, run: diff --git a/src/benchmarks/Makefile b/src/benchmarks/Makefile index f70c4f17856..81691ccc765 100644 --- a/src/benchmarks/Makefile +++ b/src/benchmarks/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright 2014-2023, Intel Corporation +# Copyright 2014-2024, Intel Corporation # # src/benchmarks/Makefile -- build all benchmarks @@ -109,6 +109,11 @@ LDFLAGS += $(GCOV_LDFLAGS) LIBS += $(GCOV_LIBS) endif +ifeq ($(VALGRIND),0) +CFLAGS += -DVALGRIND_ENABLED=0 +CXXFLAGS += -DVALGRIND_ENABLED=0 +endif + ifneq ($(SANITIZE),) CXXFLAGS += -fsanitize=$(SANITIZE) LDFLAGS += -fsanitize=$(SANITIZE) diff --git a/src/core/valgrind_internal.h b/src/core/valgrind_internal.h index ecbc741ef8f..99dc553664a 100644 --- a/src/core/valgrind_internal.h +++ b/src/core/valgrind_internal.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright 2015-2023, Intel Corporation */ +/* Copyright 2015-2024, Intel Corporation */ /* * valgrind_internal.h -- internal definitions for valgrind macros @@ -19,6 +19,11 @@ #define VG_HELGRIND_ENABLED 1 #define VG_MEMCHECK_ENABLED 1 #define VG_DRD_ENABLED 1 +#else +#define VG_PMEMCHECK_ENABLED 0 +#define VG_HELGRIND_ENABLED 0 +#define VG_MEMCHECK_ENABLED 0 +#define VG_DRD_ENABLED 0 #endif #if VG_PMEMCHECK_ENABLED || VG_HELGRIND_ENABLED || VG_MEMCHECK_ENABLED || \ diff --git a/src/examples/Makefile.inc b/src/examples/Makefile.inc index 3481e348a4e..ec9ca1a2e06 100644 --- a/src/examples/Makefile.inc +++ b/src/examples/Makefile.inc @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright 2015-2020, Intel Corporation +# Copyright 2015-2024, Intel Corporation # # examples/Makefile.inc -- build the Persistent Memory Development Kit examples @@ -23,6 +23,10 @@ CFLAGS += -fsanitize=$(SANITIZE) CXXFLAGS += -fsanitize=$(SANITIZE) LDFLAGS += -fsanitize=$(SANITIZE) endif +ifeq ($(VALGRIND),0) +CFLAGS += -DVALGRIND_ENABLED=0 +CXXFLAGS += -DVALGRIND_ENABLED=0 +endif INCS = -I$(INCDIR) -I. -I$(TOP_SRC)/examples $(OS_INCS) LIBS += $(OS_LIBS) $(LIBUUID) diff --git a/src/libpmem2/x86_64/memcpy/memcpy_avx.h b/src/libpmem2/x86_64/memcpy/memcpy_avx.h index 5d274035d95..6cb3c8fb88e 100644 --- a/src/libpmem2/x86_64/memcpy/memcpy_avx.h +++ b/src/libpmem2/x86_64/memcpy/memcpy_avx.h @@ -87,10 +87,13 @@ memmove_small_avx(char *dest, const char *src, size_t len, flush_fn flush) * path) in the optimized version. * libc's memcpy also does that, so we can't use it here. */ +#if VG_PMEMCHECK_ENABLED if (On_pmemcheck) { memmove_nodrain_generic(dest, src, len, PMEM2_F_MEM_NOFLUSH, NULL, NULL); - } else { + } else +#endif + { memmove_small_avx_noflush(dest, src, len); } diff --git a/src/libpmem2/x86_64/memcpy/memcpy_sse2.h b/src/libpmem2/x86_64/memcpy/memcpy_sse2.h index 4c56ca193c6..4012f33b712 100644 --- a/src/libpmem2/x86_64/memcpy/memcpy_sse2.h +++ b/src/libpmem2/x86_64/memcpy/memcpy_sse2.h @@ -103,10 +103,13 @@ memmove_small_sse2(char *dest, const char *src, size_t len, flush_fn flush) * path) in the optimized version. * libc's memcpy also does that, so we can't use it here. */ +#if VG_PMEMCHECK_ENABLED if (On_pmemcheck) { memmove_nodrain_generic(dest, src, len, PMEM2_F_MEM_NOFLUSH, NULL, NULL); - } else { + } else +#endif + { memmove_small_sse2_noflush(dest, src, len); } diff --git a/src/libpmem2/x86_64/memset/memset_avx.h b/src/libpmem2/x86_64/memset/memset_avx.h index f52e8cba736..1a5df0facc4 100644 --- a/src/libpmem2/x86_64/memset/memset_avx.h +++ b/src/libpmem2/x86_64/memset/memset_avx.h @@ -84,11 +84,15 @@ memset_small_avx(char *dest, __m256i ymm, size_t len, flush_fn flush) * path) in the optimized version. * libc's memset also does that, so we can't use it here. */ +#if VG_PMEMCHECK_ENABLED if (On_pmemcheck) { memset_nodrain_generic(dest, (uint8_t)m256_get2b(ymm), len, PMEM2_F_MEM_NOFLUSH, NULL, NULL); - } else { + } + else +#endif + { memset_small_avx_noflush(dest, ymm, len); } diff --git a/src/libpmem2/x86_64/memset/memset_sse2.h b/src/libpmem2/x86_64/memset/memset_sse2.h index 8654aa6c167..a160683fc45 100644 --- a/src/libpmem2/x86_64/memset/memset_sse2.h +++ b/src/libpmem2/x86_64/memset/memset_sse2.h @@ -91,10 +91,13 @@ memset_small_sse2(char *dest, __m128i xmm, size_t len, flush_fn flush) * path) in the optimized version. * libc's memset also does that, so we can't use it here. */ +#if VG_PMEMCHECK_ENABLED if (On_pmemcheck) { memset_nodrain_generic(dest, (uint8_t)_mm_cvtsi128_si32(xmm), len, PMEM2_F_MEM_NOFLUSH, NULL, NULL); - } else { + } else +#endif + { memset_small_sse2_noflush(dest, xmm, len); } diff --git a/src/libpmemobj/heap.c b/src/libpmemobj/heap.c index d0b02f6fa18..64cc19f42d7 100644 --- a/src/libpmemobj/heap.c +++ b/src/libpmemobj/heap.c @@ -1240,6 +1240,7 @@ heap_get_bestfit_block(struct palloc_heap *heap, struct bucket *b, return 0; } +#if VG_MEMCHECK_ENABLED /* * heap_end -- returns first address after heap */ @@ -1252,6 +1253,7 @@ heap_end(struct palloc_heap *h) return &last_zone->chunks[last_zone->header.size_idx]; } +#endif /* VG_MEMCHECK_ENABLED */ /* * heap_arena_create -- create a new arena, push it to the vector diff --git a/src/libpmemobj/heap.h b/src/libpmemobj/heap.h index 455669aef9b..09278bad69e 100644 --- a/src/libpmemobj/heap.h +++ b/src/libpmemobj/heap.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright 2015-2022, Intel Corporation */ +/* Copyright 2015-2024, Intel Corporation */ /* * heap.h -- internal definitions for heap @@ -83,7 +83,9 @@ void heap_foreach_object(struct palloc_heap *heap, object_callback cb, struct alloc_class_collection *heap_alloc_classes(struct palloc_heap *heap); +#if VG_MEMCHECK_ENABLED void *heap_end(struct palloc_heap *heap); +#endif /* VG_MEMCHECK_ENABLED */ unsigned heap_get_narenas_total(struct palloc_heap *heap); diff --git a/src/libpmemobj/obj.c b/src/libpmemobj/obj.c index 90b69825c76..886e3f16cee 100644 --- a/src/libpmemobj/obj.c +++ b/src/libpmemobj/obj.c @@ -956,7 +956,7 @@ obj_runtime_init(PMEMobjpool *pop, int rdonly, int boot, unsigned nlanes) VALGRIND_DO_MAKE_MEM_NOACCESS(end, (char *)pop + pop->set->poolsize - (char *)end); } -#endif +#endif /* VG_MEMCHECK_ENABLED */ obj_pool_init(); diff --git a/src/libpmemobj/palloc.c b/src/libpmemobj/palloc.c index 7b2f7c8b3ff..852deca50e3 100644 --- a/src/libpmemobj/palloc.c +++ b/src/libpmemobj/palloc.c @@ -398,10 +398,14 @@ palloc_heap_action_on_process(struct palloc_heap *heap, act->m.m_ops->get_real_size(&act->m)); } } else if (act->new_state == MEMBLOCK_FREE) { +#if VG_MEMCHECK_ENABLED if (On_memcheck) { void *ptr = act->m.m_ops->get_user_data(&act->m); VALGRIND_DO_MEMPOOL_FREE(heap->layout, ptr); - } else if (On_pmemcheck) { + } +#endif /* VG_MEMCHECK_ENABLED */ +#if VG_PMEMCHECK_ENABLED + if (On_pmemcheck) { /* * The sync module, responsible for implementations of * persistent memory resident volatile variables, @@ -418,7 +422,7 @@ palloc_heap_action_on_process(struct palloc_heap *heap, size_t size = act->m.m_ops->get_real_size(&act->m); VALGRIND_REGISTER_PMEM_MAPPING(ptr, size); } - +#endif /* VG_PMEMCHECK_ENABLED */ STATS_SUB(heap->stats, persistent, heap_curr_allocated, act->m.m_ops->get_real_size(&act->m)); if (act->m.type == MEMORY_BLOCK_RUN) { @@ -1275,6 +1279,7 @@ palloc_init(void *heap_start, uint64_t heap_size, uint64_t *sizep, return heap_init(heap_start, heap_size, sizep, p_ops); } +#if VG_MEMCHECK_ENABLED /* * palloc_heap_end -- returns first address after heap */ @@ -1283,6 +1288,7 @@ palloc_heap_end(struct palloc_heap *h) { return heap_end(h); } +#endif /* VG_MEMCHECK_ENABLED */ /* * palloc_heap_check -- verifies heap state diff --git a/src/libpmemobj/palloc.h b/src/libpmemobj/palloc.h index 52a1f533d3f..31ddecd5595 100644 --- a/src/libpmemobj/palloc.h +++ b/src/libpmemobj/palloc.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright 2015-2022, Intel Corporation */ +/* Copyright 2015-2024, Intel Corporation */ /* * palloc.h -- internal definitions for persistent allocator @@ -89,7 +89,9 @@ int palloc_buckets_init(struct palloc_heap *heap); int palloc_init(void *heap_start, uint64_t heap_size, uint64_t *sizep, struct pmem_ops *p_ops); +#if VG_MEMCHECK_ENABLED void *palloc_heap_end(struct palloc_heap *h); +#endif /* VG_MEMCHECK_ENABLED */ int palloc_heap_check(void *heap_start, uint64_t heap_size); void palloc_heap_cleanup(struct palloc_heap *heap); size_t palloc_heap(void *heap_start); diff --git a/src/test/Makefile b/src/test/Makefile index 0e9d87aa5c7..e7a9c78a889 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -150,7 +150,8 @@ OTHER_TESTS = \ util_uuid_generate\ util_vec\ util_vecq\ - log_errno + log_errno\ + valgrind_check ifeq ($(ARCH), x86_64) OTHER_TESTS += \ diff --git a/src/test/RUNTESTS.py b/src/test/RUNTESTS.py index da27e155918..ccf4355f9aa 100755 --- a/src/test/RUNTESTS.py +++ b/src/test/RUNTESTS.py @@ -121,7 +121,9 @@ def run_tests(self): continue except futils.Skip as s: - self.msg.print('{}: SKIP: {}'.format(t, s)) + self.msg.print('{}: {}SKIP{}: {}'. + format(t, futils.Color.YELLOW, + futils.Color.END, s)) except futils.Fail as f: self._test_failed(t, c, f) @@ -130,7 +132,9 @@ def run_tests(self): self._test_passed(t) except futils.Skip as s: - self.msg.print('{}: SKIP: {}'.format(tc, s)) + self.msg.print('{}: {}SKIP{}: {}'. + format(tc, futils.Color.YELLOW, + futils.Color.END, s)) except futils.Fail as f: self._test_failed(tc, c, f) ret = 1 diff --git a/src/test/unittest/Makefile b/src/test/unittest/Makefile index 6244049d16b..75242382d6c 100644 --- a/src/test/unittest/Makefile +++ b/src/test/unittest/Makefile @@ -72,6 +72,11 @@ LDFLAGS += $(GCOV_LDFLAGS) LIBS += $(GCOV_LIBS) endif +ifeq ($(VALGRIND),0) +CFLAGS += -DVALGRIND_ENABLED=0 +CXXFLAGS += -DVALGRIND_ENABLED=0 +endif + CFLAGS += $(EXTRA_CFLAGS) LIBS += $(LIBUTIL) diff --git a/src/test/unittest/unittest.sh b/src/test/unittest/unittest.sh index fcc5d90bfc5..6208c044e4e 100644 --- a/src/test/unittest/unittest.sh +++ b/src/test/unittest/unittest.sh @@ -1475,6 +1475,17 @@ function require_valgrind() { exit 0 fi fi + + # Check if Valgrind is enabled in the test build + disable_exit_on_error + ../valgrind_check/valgrind_check + ret=$? + restore_exit_on_error + if [ $ret -ne 0 ]; then + msg=$(interactive_yellow STDOUT "SKIP:") + echo -e "$UNITTEST_NAME: $msg Valgrind is required but the Valgrind support has been disabled at compile time" + exit 0 + fi } # diff --git a/src/test/unittest/valgrind.py b/src/test/unittest/valgrind.py index abbc9723727..1af65357555 100644 --- a/src/test/unittest/valgrind.py +++ b/src/test/unittest/valgrind.py @@ -200,6 +200,14 @@ def _get_valgrind_exe(self, force_enable): else: raise futils.Skip('Valgrind not found') + try: + _ = sp.check_output('./valgrind_check/valgrind_check', + shell=True, universal_newlines=True, + stderr=sp.STDOUT) + except sp.CalledProcessError: + raise futils.Skip( + 'Valgrind is required but the Valgrind support has been disabled at compile time') # noqa: E501 + valgrind_bin = path.join(path.dirname(out), 'valgrind.bin') if path.isfile(valgrind_bin): return valgrind_bin diff --git a/src/test/valgrind_check/.gitignore b/src/test/valgrind_check/.gitignore new file mode 100644 index 00000000000..15bae9bd64e --- /dev/null +++ b/src/test/valgrind_check/.gitignore @@ -0,0 +1 @@ +valgrind_check diff --git a/src/test/valgrind_check/Makefile b/src/test/valgrind_check/Makefile new file mode 100644 index 00000000000..b6d2a7129e8 --- /dev/null +++ b/src/test/valgrind_check/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2024, Intel Corporation + +# +# src/test/valgrind_check/Makefile -- build valgrind_check unit test +# +TARGET = valgrind_check +OBJS = valgrind_check.o + +include ../Makefile.inc diff --git a/src/test/valgrind_check/README b/src/test/valgrind_check/README new file mode 100644 index 00000000000..ba3ee397cd5 --- /dev/null +++ b/src/test/valgrind_check/README @@ -0,0 +1,7 @@ +Persistent Memory Development Kit + +This is src/test/valgrind_check/README. + +This directory contains a unit test for Valgrind enabling. + +The program in valgrind_check.c verifies if Valgrind was enabled during build. diff --git a/src/test/valgrind_check/TEST0 b/src/test/valgrind_check/TEST0 new file mode 100755 index 00000000000..d7ffd137f8c --- /dev/null +++ b/src/test/valgrind_check/TEST0 @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2024, Intel Corporation + +# +# src/test/valgrind_check/TEST0 -- unit test for valgrind_check +# + +. ../unittest/unittest.sh + +require_test_type short +require_valgrind + +setup + +expect_normal_exit ./valgrind_check$EXESUFFIX + +pass diff --git a/src/test/valgrind_check/valgrind_check.c b/src/test/valgrind_check/valgrind_check.c new file mode 100644 index 00000000000..b719be9a0b1 --- /dev/null +++ b/src/test/valgrind_check/valgrind_check.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* Copyright 2024, Intel Corporation */ + +/* + * valgrind_check.c -- unit test Valgrind enabled during build + * + * usage: valgrind_check + * + */ + +#include "valgrind_internal.h" + +#ifndef VALGRIND_ENABLED +#error Valgrind tools not properly configured +#endif + +int +main(int argc, char *argv[]) +{ +#if VALGRIND_ENABLED + return 0; +#else + return 1; +#endif +} diff --git a/utils/call_stacks_analysis/make_extra.py b/utils/call_stacks_analysis/make_extra.py index 1177e69450a..d6352201716 100755 --- a/utils/call_stacks_analysis/make_extra.py +++ b/utils/call_stacks_analysis/make_extra.py @@ -22,7 +22,7 @@ def dict_extend(dict_, key, values): def inlines(calls: Calls) -> Calls: # common calls['core_init'] = ['util_init', 'core_log_init', 'out_init'] - calls['core_fini'] = ['out_fini'] + calls['core_fini'] = ['out_fini', 'core_log_fini'] calls['common_init'] = ['core_init', 'util_mmap_init'] calls['common_fini'] = ['util_mmap_fini', 'core_fini'] calls['Last_errormsg_key_alloc'] = ['_Last_errormsg_key_alloc'] diff --git a/utils/gha-runners/build-pmdk.sh b/utils/gha-runners/build-pmdk.sh index 467acbff43a..84e2d4d5252 100755 --- a/utils/gha-runners/build-pmdk.sh +++ b/utils/gha-runners/build-pmdk.sh @@ -17,7 +17,7 @@ set -eo pipefail function build_pmdk { echo "********** make pmdk **********" cd ${PMDK_PATH} && make -j$(nproc) clean - cd ${PMDK_PATH} && make -j$(nproc) EXTRA_CFLAGS=-DUSE_VALGRIND + cd ${PMDK_PATH} && make -j$(nproc) echo "********** make pmdk test **********" cd ${PMDK_PATH}/ && make -j$(nproc) test }