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

Commit 43e860c

Browse files
committed
Merge pull request #967 from igor-ivanov/pr/issue-1336
opal/memory: Move Memory Allocation Hooks usage from openib
2 parents dff76be + 6780bb0 commit 43e860c

File tree

14 files changed

+246
-132
lines changed

14 files changed

+246
-132
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: 5 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* Copyright (c) 2011-2015 NVIDIA Corporation. All rights reserved.
2020
* Copyright (c) 2012 Oak Ridge National Laboratory. All rights reserved
2121
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
22-
* Copyright (c) 2014-2015 Research Organization for Information Science
22+
* Copyright (c) 2014-2016 Research Organization for Information Science
2323
* and Technology (RIST). All rights reserved.
2424
* Copyright (c) 2014 Bull SAS. All rights reserved.
2525
* $COPYRIGHT$
@@ -42,22 +42,8 @@
4242
#include <fcntl.h>
4343
#include <stdlib.h>
4444
#include <stddef.h>
45-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
46-
/*
47-
* The include of malloc.h below breaks abstractions in OMPI (by
48-
* directly including a header file from another component), but has
49-
* been ruled "ok" because the openib component is only supported on
50-
* Linux.
51-
*
52-
* The malloc hooks in newer glibc were deprecated, including stock
53-
* malloc.h causes compilation warnings. Instead, we use the internal
54-
* linux component malloc.h which does not cause these warnings.
55-
* Internally, OMPI uses the built-in ptmalloc from the linux memory
56-
* component anyway.
57-
*/
58-
#include "opal/mca/memory/linux/malloc.h"
59-
#endif
6045

46+
#include "opal/mca/memory/memory.h"
6147
#include "opal/mca/event/event.h"
6248
#include "opal/align.h"
6349
#include "opal/util/output.h"
@@ -123,7 +109,6 @@ static void btl_openib_handle_incoming_completion(mca_btl_base_module_t* btl,
123109
* Local variables
124110
*/
125111
static mca_btl_openib_device_t *receive_queues_device = NULL;
126-
static bool malloc_hook_set = false;
127112
static int num_devices_intentionally_ignored = 0;
128113

129114
mca_btl_openib_component_t mca_btl_openib_component = {
@@ -147,30 +132,6 @@ mca_btl_openib_component_t mca_btl_openib_component = {
147132
}
148133
};
149134

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-
174135
static int btl_openib_component_register(void)
175136
{
176137
int ret;
@@ -257,16 +218,6 @@ static int btl_openib_component_close(void)
257218
free(mca_btl_openib_component.default_recv_qps);
258219
}
259220

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-
270221
/* close memory registration debugging output */
271222
opal_output_close (mca_btl_openib_component.memory_registration_verbose);
272223

@@ -2538,19 +2489,12 @@ btl_openib_component_init(int *num_btl_modules,
25382489
*num_btl_modules = 0;
25392490
num_devs = 0;
25402491

2541-
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
25422492
/* If we got this far, then setup the memory alloc hook (because
25432493
we're most likely going to be using this component). The hook
25442494
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
2495+
want most of the allocated resources be aligned.
2496+
*/
2497+
opal_memory->memoryc_set_alignment(32, mca_btl_openib_module.super.btl_eager_limit);
25542498

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

29522896
mca_btl_openib_component.ib_num_btls = 0;
29532897
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
29612898
if (NULL != btls) {
29622899
free(btls);
29632900
}

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/hooks.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "opal/mca/mca.h"
3434
#include "opal/mca/memory/memory.h"
3535
#include "opal/constants.h"
36+
#include "opal/memoryhooks/memory.h"
3637

3738
#include "opal/mca/memory/linux/memory_linux.h"
3839

@@ -734,7 +735,10 @@ static check_result_t check(const char *name)
734735
}
735736
}
736737

737-
/* OMPI's init function */
738+
739+
/* This function is called on loading libmpi in case system has Memory Allocation Hooks
740+
* (see ompi/runtime/ompi_mpi_init.c for details)
741+
*/
738742
void opal_memory_linux_malloc_init_hook(void)
739743
{
740744
check_result_t r1, lp, lpp;

0 commit comments

Comments
 (0)