Skip to content

Commit 886c2ae

Browse files
committed
Add proxy library for intercepting user allocation requests
UMF proxy library is a library for intercepting user allocation requests. It intercepts following APIs: - aligned_alloc() - calloc() - free() - malloc() - malloc_usable_size() - realloc() Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 9d6a776 commit 886c2ae

File tree

12 files changed

+511
-0
lines changed

12 files changed

+511
-0
lines changed

.github/workflows/codeql.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ jobs:
2222
- os: ubuntu-latest
2323
nproc: $(nproc)
2424
pool_scalable: 'ON'
25+
pool_jemalloc: 'ON'
2526
- os: windows-latest
2627
nproc: $Env:NUMBER_OF_PROCESSORS
2728
pool_scalable: 'OFF'
29+
pool_jemalloc: 'OFF'
2830
runs-on: ${{matrix.os}}
2931

3032
steps:
@@ -53,6 +55,7 @@ jobs:
5355
-DUMF_FORMAT_CODE_STYLE=ON
5456
-DUMF_DEVELOPER_MODE=ON
5557
-DUMF_ENABLE_POOL_TRACKING=ON
58+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=${{matrix.pool_jemalloc}}
5659
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=${{matrix.pool_scalable}}
5760
5861
- name: Build

.github/workflows/pr_push.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,6 @@ jobs:
9191
Benchmark:
9292
needs: [Build]
9393
uses: ./.github/workflows/benchmarks.yml
94+
Proxy_lib:
95+
needs: [Build]
96+
uses: ./.github/workflows/proxy_lib.yml

.github/workflows/proxy_lib.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Proxy library
2+
3+
on: workflow_call
4+
5+
permissions:
6+
contents: read
7+
8+
jobs:
9+
ubuntu-build:
10+
name: Build - Ubuntu
11+
12+
strategy:
13+
matrix:
14+
os: ['ubuntu-22.04']
15+
build_type: [Release, Debug]
16+
compiler: [{c: gcc, cxx: g++}]
17+
runs-on: ${{matrix.os}}
18+
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
22+
23+
- name: Install apt packages
24+
run: |
25+
sudo apt-get update
26+
sudo apt-get install -y cmake libhwloc-dev libjemalloc-dev libtbb-dev
27+
28+
- name: Configure build
29+
run: >
30+
cmake
31+
-B ${{github.workspace}}/build
32+
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
33+
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
34+
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
35+
-DUMF_BUILD_SHARED_LIBRARY=ON
36+
-DUMF_BUILD_BENCHMARKS=ON
37+
-DUMF_BUILD_TESTS=OFF
38+
-DUMF_FORMAT_CODE_STYLE=OFF
39+
-DUMF_DEVELOPER_MODE=OFF
40+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=ON
41+
-DUMF_BUILD_LIBUMF_POOL_DISJOINT=ON
42+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=OFF
43+
-DUMF_ENABLE_POOL_TRACKING=OFF
44+
45+
- name: Build UMF
46+
run: cmake --build ${{github.workspace}}/build -j $(nproc)
47+
48+
- name: Run benchmarks
49+
working-directory: ${{github.workspace}}/build
50+
run: |
51+
LD_PRELOAD=./lib/libumf_proxy.so /usr/bin/date
52+
LD_PRELOAD=./lib/libumf_proxy.so /usr/bin/ls
53+
LD_PRELOAD=./lib/libumf_proxy.so ./benchmark/ubench

src/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,12 @@ install(TARGETS umf
103103
)
104104

105105
add_subdirectory(pool)
106+
107+
# TODO: enable proxy_lib on Windows
108+
if(LINUX)
109+
if(UMF_BUILD_LIBUMF_POOL_JEMALLOC)
110+
add_subdirectory(proxy_lib)
111+
else()
112+
message(STATUS "The proxy library is disabled, because UMF_BUILD_LIBUMF_POOL_JEMALLOC is OFF")
113+
endif()
114+
endif()

src/proxy_lib/CMakeLists.txt

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Copyright (C) 2023-2024 Intel Corporation
2+
# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
3+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
5+
include(${UMF_CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
6+
7+
# set one of:
8+
# - PROXY_LIB_USES_JEMALLOC_POOL
9+
# - PROXY_LIB_USES_SCALABLE_POOL
10+
set(PROXY_LIB_USES_SCALABLE_POOL ON)
11+
12+
if(PROXY_LIB_USES_SCALABLE_POOL)
13+
set(PROXY_LIBS umf scalable_pool)
14+
elseif(PROXY_LIB_USES_JEMALLOC_POOL)
15+
set(PROXY_LIBS umf jemalloc_pool)
16+
else()
17+
message(FATAL_ERROR "Proxy library: pool manager not defined")
18+
endif()
19+
20+
set(PROXY_SOURCES
21+
proxy_lib.c
22+
)
23+
24+
set(PROXY_SOURCES_LINUX
25+
proxy_lib_linux.c
26+
)
27+
28+
set(PROXY_SOURCES_WINDOWS
29+
proxy_lib_windows.c
30+
)
31+
32+
set(PROXY_SOURCES_MACOSX
33+
proxy_lib_linux.c
34+
)
35+
36+
if(LINUX)
37+
set(PROXY_SOURCES ${PROXY_SOURCES} ${PROXY_SOURCES_LINUX})
38+
elseif(WINDOWS)
39+
set(PROXY_SOURCES ${PROXY_SOURCES} ${PROXY_SOURCES_WINDOWS})
40+
elseif(MACOSX)
41+
set(PROXY_SOURCES ${PROXY_SOURCES} ${PROXY_SOURCES_MACOSX})
42+
endif()
43+
44+
add_umf_library(NAME umf_proxy
45+
TYPE SHARED
46+
SRCS ${PROXY_SOURCES}
47+
LIBS ${PROXY_LIBS}
48+
LINUX_MAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/proxy_lib.map
49+
WINDOWS_DEF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/proxy_lib.def)
50+
51+
add_library(${PROJECT_NAME}::proxy ALIAS umf_proxy)
52+
53+
if(PROXY_LIB_USES_SCALABLE_POOL)
54+
target_compile_definitions(umf_proxy PRIVATE PROXY_LIB_USES_SCALABLE_POOL=1)
55+
elseif(PROXY_LIB_USES_JEMALLOC_POOL)
56+
target_compile_definitions(umf_proxy PRIVATE PROXY_LIB_USES_JEMALLOC_POOL=1)
57+
endif()
58+
59+
target_include_directories(umf_proxy PUBLIC
60+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
61+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/utils>
62+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
63+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
64+
)
65+
66+
install(TARGETS umf_proxy
67+
EXPORT ${PROJECT_NAME}-targets)

0 commit comments

Comments
 (0)