Skip to content
This repository was archived by the owner on Sep 30, 2022. It is now read-only.

Commit 752ac39

Browse files
committed
opal/memory: Move Memory Allocation Hooks usage from openib
These changes fix issue open-mpi/ompi#1336 - improve abstractions: opal/memory/linux component should be single place that opeartes with Memory Allocation Hooks. - avoid collisions in case dynamic component open/close: it is safe because it is linked statically. - does not change original behaivour.
1 parent 7f1300d commit 752ac39

File tree

15 files changed

+252
-118
lines changed

15 files changed

+252
-118
lines changed

ompi/runtime/ompi_mpi_init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
from here, since any MPI code is going to call MPI_Init... */
101101
OPAL_DECLSPEC void (*__malloc_initialize_hook) (void) =
102102
opal_memory_linux_malloc_init_hook;
103-
#endif
103+
#endif /* defined(MEMORY_LINUX_PTMALLOC2) && MEMORY_LINUX_PTMALLOC2 */
104104

105105
/* This is required for the boundaries of the hash tables used to store
106106
* the F90 types returned by the MPI_Type_create_f90_XXX functions.

opal/mca/btl/openib/btl_openib.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,6 @@ struct mca_btl_openib_component_t {
302302
#if BTL_OPENIB_FAILOVER_ENABLED
303303
int verbose_failover;
304304
#endif
305-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
306-
int use_memalign;
307-
size_t memalign_threshold;
308-
void* (*previous_malloc_hook)(size_t __size, const void*);
309-
#endif
310305
#if OPAL_CUDA_SUPPORT
311306
bool cuda_async_send;
312307
bool cuda_async_recv;

opal/mca/btl/openib/btl_openib_component.c

Lines changed: 7 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
#include <fcntl.h>
4343
#include <stdlib.h>
4444
#include <stddef.h>
45-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
45+
#if MEMORY_LINUX_MALLOC_ALIGN_ENABLED
4646
/*
4747
* The include of malloc.h below breaks abstractions in OMPI (by
4848
* directly including a header file from another component), but has
@@ -55,7 +55,7 @@
5555
* Internally, OMPI uses the built-in ptmalloc from the linux memory
5656
* component anyway.
5757
*/
58-
#include "opal/mca/memory/linux/malloc.h"
58+
#include "opal/mca/memory/linux/memory_linux.h"
5959
#endif
6060

6161
#include "opal/mca/event/event.h"
@@ -123,7 +123,6 @@ static void btl_openib_handle_incoming_completion(mca_btl_base_module_t* btl,
123123
* Local variables
124124
*/
125125
static mca_btl_openib_device_t *receive_queues_device = NULL;
126-
static bool malloc_hook_set = false;
127126
static int num_devices_intentionally_ignored = 0;
128127

129128
mca_btl_openib_component_t mca_btl_openib_component = {
@@ -147,30 +146,6 @@ mca_btl_openib_component_t mca_btl_openib_component = {
147146
}
148147
};
149148

150-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
151-
/* This is a memory allocator hook. The purpose of this is to make
152-
* every malloc aligned since this speeds up IB HCA work.
153-
* There two basic cases here:
154-
*
155-
* 1. Memory manager for Open MPI is enabled. Then memalign below will
156-
* be overridden by __memalign_hook which is set to
157-
* opal_memory_linux_memalign_hook. Thus, _malloc_hook is going to
158-
* use opal_memory_linux_memalign_hook.
159-
*
160-
* 2. No memory manager support. The memalign below is just regular glibc
161-
* memalign which will be called through __malloc_hook instead of malloc.
162-
*/
163-
static void *btl_openib_malloc_hook(size_t sz, const void* caller)
164-
{
165-
if (sz < mca_btl_openib_component.memalign_threshold &&
166-
malloc_hook_set) {
167-
return mca_btl_openib_component.previous_malloc_hook(sz, caller);
168-
} else {
169-
return memalign(mca_btl_openib_component.use_memalign, sz);
170-
}
171-
}
172-
#endif
173-
174149
static int btl_openib_component_register(void)
175150
{
176151
int ret;
@@ -257,16 +232,6 @@ static int btl_openib_component_close(void)
257232
free(mca_btl_openib_component.default_recv_qps);
258233
}
259234

260-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
261-
/* Must check to see whether the malloc hook was set before
262-
assigning it back because ompi_info will call _register() and
263-
then _close() (which won't set the hook) */
264-
if (malloc_hook_set) {
265-
__malloc_hook = mca_btl_openib_component.previous_malloc_hook;
266-
malloc_hook_set = false;
267-
}
268-
#endif
269-
270235
/* close memory registration debugging output */
271236
opal_output_close (mca_btl_openib_component.memory_registration_verbose);
272237

@@ -2538,19 +2503,14 @@ btl_openib_component_init(int *num_btl_modules,
25382503
*num_btl_modules = 0;
25392504
num_devs = 0;
25402505

2541-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
2506+
#if MEMORY_LINUX_MALLOC_ALIGN_ENABLED
25422507
/* If we got this far, then setup the memory alloc hook (because
25432508
we're most likely going to be using this component). The hook
25442509
is to be set up as early as possible in this function since we
2545-
want most of the allocated resources be aligned.*/
2546-
if (mca_btl_openib_component.use_memalign > 0 &&
2547-
(opal_mem_hooks_support_level() &
2548-
(OPAL_MEMORY_FREE_SUPPORT | OPAL_MEMORY_CHUNK_SUPPORT)) != 0) {
2549-
mca_btl_openib_component.previous_malloc_hook = __malloc_hook;
2550-
__malloc_hook = btl_openib_malloc_hook;
2551-
malloc_hook_set = true;
2552-
}
2553-
#endif
2510+
want most of the allocated resources be aligned.
2511+
*/
2512+
opal_memory_linux_malloc_set_alignment(32, mca_btl_openib_module.super.btl_eager_limit);
2513+
#endif /* MEMORY_LINUX_MALLOC_ALIGN_ENABLED */
25542514

25552515
/* Per https://svn.open-mpi.org/trac/ompi/ticket/1305, check to
25562516
see if $sysfsdir/class/infiniband exists. If it does not,
@@ -2951,13 +2911,6 @@ btl_openib_component_init(int *num_btl_modules,
29512911

29522912
mca_btl_openib_component.ib_num_btls = 0;
29532913
btl_openib_modex_send();
2954-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
2955-
/*Unset malloc hook since the component won't start*/
2956-
if (malloc_hook_set) {
2957-
__malloc_hook = mca_btl_openib_component.previous_malloc_hook;
2958-
malloc_hook_set = false;
2959-
}
2960-
#endif
29612914
if (NULL != btls) {
29622915
free(btls);
29632916
}

opal/mca/btl/openib/btl_openib_mca.c

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -703,26 +703,19 @@ int btl_openib_register_mca_params(void)
703703
0, &mca_btl_openib_component.gid_index,
704704
REGINT_GE_ZERO));
705705

706-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
707-
CHECK(reg_int("memalign", NULL,
708-
"[64 | 32 | 0] - Enable (64bit or 32bit)/Disable(0) memory"
709-
"alignment for all malloc calls if btl openib is used.",
710-
32, &mca_btl_openib_component.use_memalign,
711-
REGINT_GE_ZERO));
706+
#if MEMORY_LINUX_MALLOC_ALIGN_ENABLED
707+
tmp = mca_base_var_find ("opal", "memory", "linux", "memalign");
708+
if (0 <= tmp) {
709+
(void) mca_base_var_register_synonym(tmp, "opal", "btl", "openib", "memalign",
710+
MCA_BASE_VAR_SYN_FLAG_DEPRECATED);
711+
}
712712

713-
mca_btl_openib_component.memalign_threshold =
714-
mca_btl_openib_module.super.btl_eager_limit;
715-
tmp = mca_base_component_var_register(&mca_btl_openib_component.super.btl_version,
716-
"memalign_threshold",
717-
"Allocating memory more than btl_openib_memalign_threshhold"
718-
"bytes will automatically be algined to the value of btl_openib_memalign bytes."
719-
"memalign_threshhold defaults to the same value as mca_btl_openib_eager_limit.",
720-
MCA_BASE_VAR_TYPE_SIZE_T, NULL, 0, 0,
721-
OPAL_INFO_LVL_9,
722-
MCA_BASE_VAR_SCOPE_READONLY,
723-
&mca_btl_openib_component.memalign_threshold);
724-
if (0 > tmp) ret = tmp;
725-
#endif
713+
tmp = mca_base_var_find ("opal", "memory", "linux", "memalign_threshold");
714+
if (0 <= tmp) {
715+
(void) mca_base_var_register_synonym(tmp, "opal", "btl", "openib", "memalign_threshold",
716+
MCA_BASE_VAR_SYN_FLAG_DEPRECATED);
717+
}
718+
#endif /* MEMORY_LINUX_MALLOC_ALIGN_ENABLED */
726719

727720
/* Register any MCA params for the connect pseudo-components */
728721
if (OPAL_SUCCESS == ret) {
@@ -823,16 +816,5 @@ int btl_openib_verify_mca_params (void)
823816
}
824817
#endif
825818

826-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
827-
if (mca_btl_openib_component.use_memalign != 32
828-
&& mca_btl_openib_component.use_memalign != 64
829-
&& mca_btl_openib_component.use_memalign != 0){
830-
opal_show_help("help-mpi-btl-openib.txt", "invalid mca param value",
831-
true, "Wrong btl_openib_memalign parameter value. Allowed values: 64, 32, 0.",
832-
"btl_openib_memalign is reset to 32");
833-
mca_btl_openib_component.use_memalign = 32;
834-
}
835-
#endif
836-
837819
return OPAL_SUCCESS;
838820
}

opal/mca/btl/openib/configure.m4

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -120,28 +120,6 @@ AC_DEFUN([MCA_opal_btl_openib_CONFIG],[
120120
[enable openib BTL failover])
121121
AM_CONDITIONAL([MCA_btl_openib_enable_failover], [test "x$btl_openib_failover_enabled" = "x1"])
122122

123-
# Check for __malloc_hook availability
124-
AC_ARG_ENABLE(btl-openib-malloc-alignment,
125-
AC_HELP_STRING([--enable-btl-openib-malloc-alignment], [Enable support for allocated memory alignment. Default: enabled if supported, disabled otherwise.]))
126-
127-
btl_openib_malloc_hooks_enabled=0
128-
AS_IF([test "$enable_btl_openib_malloc_alignment" != "no"],
129-
[AC_CHECK_HEADER([malloc.h],
130-
[AC_CHECK_FUNC([__malloc_hook],
131-
[AC_CHECK_FUNC([__realloc_hook],
132-
[AC_CHECK_FUNC([__free_hook],
133-
[btl_openib_malloc_hooks_enabled=1])])])])])
134-
135-
AS_IF([test "$enable_btl_openib_malloc_alignment" = "yes" && test "$btl_openib_malloc_hooks_enabled" = "0"],
136-
[AC_MSG_ERROR([openib malloc alignment is requested but __malloc_hook is not available])])
137-
AC_MSG_CHECKING([whether the openib BTL will use malloc hooks])
138-
AS_IF([test "$btl_openib_malloc_hooks_enabled" = "0"],
139-
[AC_MSG_RESULT([no])],
140-
[AC_MSG_RESULT([yes])])
141-
142-
AC_DEFINE_UNQUOTED(BTL_OPENIB_MALLOC_HOOKS_ENABLED, [$btl_openib_malloc_hooks_enabled],
143-
[Whether the openib BTL malloc hooks are enabled])
144-
145123
# make sure that CUDA-aware checks have been done
146124
AC_REQUIRE([OPAL_CHECK_CUDA])
147125

opal/mca/memory/base/empty.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/*
2-
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
2+
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
3+
* Copyright (c) 2016 Research Organization for Information Science
4+
* and Technology (RIST). All rights reserved.
35
* $COPYRIGHT$
46
*
57
* Additional copyrights may follow
@@ -51,6 +53,15 @@ OPAL_DECLSPEC int opal_memory_base_component_deregister_empty(void *start,
5153
size_t len,
5254
uint64_t cookie);
5355

56+
/**
57+
* Default (empty) implementation of the memoryc_set_alignment function
58+
*
59+
* See opal/mca/memory/memory.h for a description of the parameters.
60+
*/
61+
OPAL_DECLSPEC void opal_memory_base_component_set_alignment_empty(int use_memalign,
62+
size_t memalign_threshold);
63+
64+
5465
END_C_DECLS
5566

5667
#endif

opal/mca/memory/base/memory_base_empty.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* University of Stuttgart. All rights reserved.
1010
* Copyright (c) 2004-2005 The Regents of the University of California.
1111
* All rights reserved.
12+
* Copyright (c) 2016 Research Organization for Information Science
13+
* and Technology (RIST). All rights reserved.
1214
* $COPYRIGHT$
1315
*
1416
* Additional copyrights may follow
@@ -34,3 +36,9 @@ int opal_memory_base_component_deregister_empty(void *base, size_t len,
3436
{
3537
return OPAL_SUCCESS;
3638
}
39+
40+
void opal_memory_base_component_set_alignment_empty(int use_memalign,
41+
size_t memalign_threshold)
42+
{
43+
}
44+

opal/mca/memory/base/memory_base_open.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
* Copyright (c) 2004-2005 The Regents of the University of California.
1212
* All rights reserved.
1313
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
14+
* Copyright (c) 2016 Research Organization for Information Science
15+
* and Technology (RIST). All rights reserved.
1416
* $COPYRIGHT$
1517
*
1618
* Additional copyrights may follow
@@ -54,6 +56,7 @@ static opal_memory_base_component_2_0_0_t empty_component = {
5456
empty_process,
5557
opal_memory_base_component_register_empty,
5658
opal_memory_base_component_deregister_empty,
59+
opal_memory_base_component_set_alignment_empty,
5760
};
5861

5962

opal/mca/memory/linux/configure.m4

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,42 @@ AC_DEFUN([MCA_opal_memory_linux_CONFIG],[
6363
[memory_linux_ptmalloc2_happy=no
6464
memory_linux_ummu_happy=no])])
6565

66+
67+
######################################################################
68+
# if memory hook available
69+
######################################################################
70+
memory_hook_found=1
71+
AS_IF([test "$memory_hook_found" -eq 1],
72+
[memory_hook_found=0 AC_CHECK_HEADER([malloc.h],
73+
[AC_CHECK_FUNC([__malloc_initialize_hook],
74+
[AC_CHECK_FUNC([__malloc_hook],
75+
[AC_CHECK_FUNC([__realloc_hook],
76+
[AC_CHECK_FUNC([__free_hook],
77+
[memory_hook_found=1])])])])])])
78+
AC_MSG_CHECKING([whether the system can use malloc hooks])
79+
AS_IF([test "$memory_hook_found" = "0"],
80+
[AC_MSG_RESULT([no])],
81+
[AC_MSG_RESULT([yes])])
82+
AC_DEFINE_UNQUOTED([MEMORY_LINUX_HAVE_MALLOC_HOOK_SUPPORT], [$memory_hook_found],
83+
[Whether the system has Memory Allocation Hooks])
84+
85+
AC_ARG_ENABLE(memory-linux-malloc-alignment,
86+
AC_HELP_STRING([--enable-memory-linux-malloc-alignment], [Enable support for allocated memory alignment. Default: enabled if supported, disabled otherwise.]))
87+
88+
malloc_align_enabled=0
89+
AS_IF([test "$enable_memory_linux_malloc_alignment" != "no"],
90+
[malloc_align_enabled=$memory_hook_found])
91+
92+
AS_IF([test "$enable_memory_linux_malloc_alignment" = "yes" && test "$malloc_align_enabled" = "0"],
93+
[AC_MSG_ERROR([memory linux malloc alignment is requested but __malloc_hook is not available])])
94+
AC_MSG_CHECKING([whether the memory linux will use malloc alignment])
95+
AS_IF([test "$malloc_align_enabled" = "0"],
96+
[AC_MSG_RESULT([no])],
97+
[AC_MSG_RESULT([yes])])
98+
99+
AC_DEFINE_UNQUOTED(MEMORY_LINUX_MALLOC_ALIGN_ENABLED, [$malloc_align_enabled],
100+
[Whether the memory linux malloc alignment is enabled])
101+
66102
######################################################################
67103
# ptmalloc2
68104
######################################################################

opal/mca/memory/linux/help-opal-memory-linux.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,10 @@ alternate memory hook manager *may* be used instead (if available).
2727
Local host: %s
2828
UMMU device: %s
2929
Error: %s (%d)
30+
#
31+
[invalid mca param value]
32+
WARNING: An invalid MCA parameter value was found for memory/linux
33+
component.
34+
35+
Problem: %s
36+
Resolution: %s

0 commit comments

Comments
 (0)