Skip to content

Commit a9df0a5

Browse files
authored
Fix potential data race in bindings init functions (#2379)
1 parent f907e46 commit a9df0a5

15 files changed

Lines changed: 540 additions & 60 deletions

cuda_bindings/cuda/bindings/_internal/cudla_linux.pyx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,43 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# This code was automatically generated across versions from 1.5.0 to 13.3.0. Do not modify it directly.
5-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=a7e70bc7234821ae1f02306321604d7605aee20e0fde536def5edd52263be5de
5+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=052aecd587e459179f49158c93f43cde9e327476eedfb5be12e98520f7401d94
66

77

88
# <<<< PREAMBLE CONTENT >>>>
99

10+
cdef extern from * nogil:
11+
"""
12+
#if defined(_MSC_VER) && !defined(__clang__)
13+
#include <intrin.h>
14+
static __forceinline int atomic_int_load(int *p) {
15+
int v = *(int volatile *)p; _ReadBarrier(); return v;
16+
}
17+
static __forceinline void atomic_int_store(int *p, int v) {
18+
_WriteBarrier(); *(int volatile *)p = v;
19+
}
20+
#elif defined(__cplusplus)
21+
/* GCC/Clang __atomic builtins work in any C++ standard without headers */
22+
static inline int atomic_int_load(int *p) {
23+
return __atomic_load_n(p, __ATOMIC_ACQUIRE);
24+
}
25+
static inline void atomic_int_store(int *p, int v) {
26+
__atomic_store_n(p, v, __ATOMIC_RELEASE);
27+
}
28+
#else
29+
#include <stdatomic.h>
30+
static inline int atomic_int_load(int *p) {
31+
return (int)atomic_load_explicit((atomic_int *)p, memory_order_acquire);
32+
}
33+
static inline void atomic_int_store(int *p, int v) {
34+
atomic_store_explicit((atomic_int *)p, v, memory_order_release);
35+
}
36+
#endif
37+
38+
"""
39+
cdef int _cyb_atomic_int_load "atomic_int_load"(int *p) nogil
40+
cdef void _cyb_atomic_int_store "atomic_int_store"(int *p, int v) nogil
41+
1042
cdef extern from "<dlfcn.h>":
1143
void* _cyb_dlsym "dlsym"(void*, const char*) nogil
1244
const void * _cyb_RTLD_DEFAULT "RTLD_DEFAULT"
@@ -15,7 +47,7 @@ from libc.stdint cimport intptr_t as _cyb_intptr_t
1547

1648
import threading as _cyb_threading
1749

18-
cdef bint _cyb___py_cudla_init = False
50+
cdef int _cyb___py_cudla_init = 0
1951
cdef dict _cyb_func_ptrs = None
2052
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2153

@@ -142,11 +174,11 @@ cdef int _init_cudla() except -1 nogil:
142174
handle = load_library()
143175
__cudlaSetTaskTimeoutInMs = _cyb_dlsym(handle, 'cudlaSetTaskTimeoutInMs')
144176

145-
_cyb___py_cudla_init = True
177+
_cyb_atomic_int_store(<int *>&_cyb___py_cudla_init, 1)
146178
return 0
147179

148180
cdef inline int _check_or_init_cudla() except -1 nogil:
149-
if _cyb___py_cudla_init:
181+
if _cyb_atomic_int_load(<int *>&_cyb___py_cudla_init):
150182
return 0
151183

152184
return _init_cudla()

cuda_bindings/cuda/bindings/_internal/cudla_windows.pyx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,43 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# This code was automatically generated across versions from 1.5.0 to 13.3.0. Do not modify it directly.
5-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=2f2d196de722c29b044dff6aed4e22bd72347a0890d30c885d35780882c6800f
5+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=32765bada1ce206d4a0f4790d6c14563b07e79567fc4569c6a843ccb086ab620
66

77

88
# <<<< PREAMBLE CONTENT >>>>
99

10+
cdef extern from * nogil:
11+
"""
12+
#if defined(_MSC_VER) && !defined(__clang__)
13+
#include <intrin.h>
14+
static __forceinline int atomic_int_load(int *p) {
15+
int v = *(int volatile *)p; _ReadBarrier(); return v;
16+
}
17+
static __forceinline void atomic_int_store(int *p, int v) {
18+
_WriteBarrier(); *(int volatile *)p = v;
19+
}
20+
#elif defined(__cplusplus)
21+
/* GCC/Clang __atomic builtins work in any C++ standard without headers */
22+
static inline int atomic_int_load(int *p) {
23+
return __atomic_load_n(p, __ATOMIC_ACQUIRE);
24+
}
25+
static inline void atomic_int_store(int *p, int v) {
26+
__atomic_store_n(p, v, __ATOMIC_RELEASE);
27+
}
28+
#else
29+
#include <stdatomic.h>
30+
static inline int atomic_int_load(int *p) {
31+
return (int)atomic_load_explicit((atomic_int *)p, memory_order_acquire);
32+
}
33+
static inline void atomic_int_store(int *p, int v) {
34+
atomic_store_explicit((atomic_int *)p, v, memory_order_release);
35+
}
36+
#endif
37+
38+
"""
39+
cdef int _cyb_atomic_int_load "atomic_int_load"(int *p) nogil
40+
cdef void _cyb_atomic_int_store "atomic_int_store"(int *p, int v) nogil
41+
1042
cdef extern from "<windows.h>":
1143
ctypedef void* HMODULE
1244
void* _cyb_GetProcAddress "GetProcAddress"(HMODULE, const char*) nogil
@@ -15,7 +47,7 @@ from libc.stdint cimport intptr_t as _cyb_intptr_t
1547

1648
import threading as _cyb_threading
1749

18-
cdef bint _cyb___py_cudla_init = False
50+
cdef int _cyb___py_cudla_init = 0
1951
cdef dict _cyb_func_ptrs = None
2052
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2153

@@ -95,11 +127,11 @@ cdef int _init_cudla() except -1 nogil:
95127
global __cudlaSetTaskTimeoutInMs
96128
__cudlaSetTaskTimeoutInMs = _cyb_GetProcAddress(<HMODULE>handle, 'cudlaSetTaskTimeoutInMs')
97129

98-
_cyb___py_cudla_init = True
130+
_cyb_atomic_int_store(<int *>&_cyb___py_cudla_init, 1)
99131
return 0
100132

101133
cdef inline int _check_or_init_cudla() except -1 nogil:
102-
if _cyb___py_cudla_init:
134+
if _cyb_atomic_int_load(<int *>&_cyb___py_cudla_init):
103135
return 0
104136

105137
return _init_cudla()

cuda_bindings/cuda/bindings/_internal/cufile_linux.pyx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,43 @@
33
# SPDX-License-Identifier: Apache-2.0
44
#
55
# This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=ae15aefcbc4ccf2d415fb5d6436ae854690559f5561704523ba7d6f45abfc592
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=73d6889e33bb56f1e0e63be7a0ba1f176c5c09e6e1adf9c4360d23335e131260
77

88

99
# <<<< PREAMBLE CONTENT >>>>
1010

11+
cdef extern from * nogil:
12+
"""
13+
#if defined(_MSC_VER) && !defined(__clang__)
14+
#include <intrin.h>
15+
static __forceinline int atomic_int_load(int *p) {
16+
int v = *(int volatile *)p; _ReadBarrier(); return v;
17+
}
18+
static __forceinline void atomic_int_store(int *p, int v) {
19+
_WriteBarrier(); *(int volatile *)p = v;
20+
}
21+
#elif defined(__cplusplus)
22+
/* GCC/Clang __atomic builtins work in any C++ standard without headers */
23+
static inline int atomic_int_load(int *p) {
24+
return __atomic_load_n(p, __ATOMIC_ACQUIRE);
25+
}
26+
static inline void atomic_int_store(int *p, int v) {
27+
__atomic_store_n(p, v, __ATOMIC_RELEASE);
28+
}
29+
#else
30+
#include <stdatomic.h>
31+
static inline int atomic_int_load(int *p) {
32+
return (int)atomic_load_explicit((atomic_int *)p, memory_order_acquire);
33+
}
34+
static inline void atomic_int_store(int *p, int v) {
35+
atomic_store_explicit((atomic_int *)p, v, memory_order_release);
36+
}
37+
#endif
38+
39+
"""
40+
cdef int _cyb_atomic_int_load "atomic_int_load"(int *p) nogil
41+
cdef void _cyb_atomic_int_store "atomic_int_store"(int *p, int v) nogil
42+
1143
cdef extern from "<dlfcn.h>":
1244
void* _cyb_dlsym "dlsym"(void*, const char*) nogil
1345
const void * _cyb_RTLD_DEFAULT "RTLD_DEFAULT"
@@ -17,7 +49,7 @@ from libc.stdint cimport intptr_t as _cyb_intptr_t
1749

1850
import threading as _cyb_threading
1951

20-
cdef bint _cyb___py_cufile_init = False
52+
cdef int _cyb___py_cufile_init = 0
2153
cdef dict _cyb_func_ptrs = None
2254
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2355

@@ -385,11 +417,11 @@ cdef int _init_cufile() except -1 nogil:
385417
handle = load_library()
386418
__cuFileGetParameterPosixPoolSlabArray = _cyb_dlsym(handle, 'cuFileGetParameterPosixPoolSlabArray')
387419

388-
_cyb___py_cufile_init = True
420+
_cyb_atomic_int_store(<int *>&_cyb___py_cufile_init, 1)
389421
return 0
390422

391423
cdef inline int _check_or_init_cufile() except -1 nogil:
392-
if _cyb___py_cufile_init:
424+
if _cyb_atomic_int_load(<int *>&_cyb___py_cufile_init):
393425
return 0
394426

395427
return _init_cufile()

cuda_bindings/cuda/bindings/_internal/driver_linux.pyx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,43 @@
33
# SPDX-License-Identifier: Apache-2.0
44
#
55
# This code was automatically generated across versions from 12.9.0 to 13.3.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=644e8be3cdcaddb497db76bdc5912df43457a11696b5b7f710d46cba991d0d0b
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=93ad3ec4e08c2af84cb387a5321ad62c2ce683d690ad6865196771e4766eb127
77

88

99
# <<<< PREAMBLE CONTENT >>>>
1010

11+
cdef extern from * nogil:
12+
"""
13+
#if defined(_MSC_VER) && !defined(__clang__)
14+
#include <intrin.h>
15+
static __forceinline int atomic_int_load(int *p) {
16+
int v = *(int volatile *)p; _ReadBarrier(); return v;
17+
}
18+
static __forceinline void atomic_int_store(int *p, int v) {
19+
_WriteBarrier(); *(int volatile *)p = v;
20+
}
21+
#elif defined(__cplusplus)
22+
/* GCC/Clang __atomic builtins work in any C++ standard without headers */
23+
static inline int atomic_int_load(int *p) {
24+
return __atomic_load_n(p, __ATOMIC_ACQUIRE);
25+
}
26+
static inline void atomic_int_store(int *p, int v) {
27+
__atomic_store_n(p, v, __ATOMIC_RELEASE);
28+
}
29+
#else
30+
#include <stdatomic.h>
31+
static inline int atomic_int_load(int *p) {
32+
return (int)atomic_load_explicit((atomic_int *)p, memory_order_acquire);
33+
}
34+
static inline void atomic_int_store(int *p, int v) {
35+
atomic_store_explicit((atomic_int *)p, v, memory_order_release);
36+
}
37+
#endif
38+
39+
"""
40+
cdef int _cyb_atomic_int_load "atomic_int_load"(int *p) nogil
41+
cdef void _cyb_atomic_int_store "atomic_int_store"(int *p, int v) nogil
42+
1143
cdef extern from "<dlfcn.h>":
1244
void* _cyb_dlsym "dlsym"(void*, const char*) nogil
1345

@@ -18,7 +50,7 @@ import threading as _cyb_threading
1850

1951
ctypedef int (*_cyb_cuGetProcAddress_v2_T)(const char *, void **, int, cuuint64_t, CUdriverProcAddressQueryResult *)except?CUDA_ERROR_NOT_FOUND nogil
2052

21-
cdef bint _cyb___py_driver_init = False
53+
cdef int _cyb___py_driver_init = 0
2254
cdef dict _cyb_func_ptrs = None
2355
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2456

@@ -2123,11 +2155,11 @@ cdef int _init_driver() except -1 nogil:
21232155
global __cuStreamBeginRecaptureToGraph
21242156
cuGetProcAddress_v2('cuStreamBeginRecaptureToGraph', <void **>&__cuStreamBeginRecaptureToGraph, 13030, ptds_mode, NULL)
21252157

2126-
_cyb___py_driver_init = True
2158+
_cyb_atomic_int_store(<int *>&_cyb___py_driver_init, 1)
21272159
return 0
21282160

21292161
cdef inline int _check_or_init_driver() except -1 nogil:
2130-
if _cyb___py_driver_init:
2162+
if _cyb_atomic_int_load(<int *>&_cyb___py_driver_init):
21312163
return 0
21322164

21332165
return _init_driver()

cuda_bindings/cuda/bindings/_internal/driver_windows.pyx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,43 @@
33
# SPDX-License-Identifier: Apache-2.0
44
#
55
# This code was automatically generated across versions from 12.9.0 to 13.3.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=501497a3d88840c62eda1dfb0b72fe7494ff20a208230b1f45ad2f0c11bf47a5
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=86a420a34dae5d88ef57070872a942cba79608505c6d67a2a77366185afcf6c6
77

88

99
# <<<< PREAMBLE CONTENT >>>>
1010

11+
cdef extern from * nogil:
12+
"""
13+
#if defined(_MSC_VER) && !defined(__clang__)
14+
#include <intrin.h>
15+
static __forceinline int atomic_int_load(int *p) {
16+
int v = *(int volatile *)p; _ReadBarrier(); return v;
17+
}
18+
static __forceinline void atomic_int_store(int *p, int v) {
19+
_WriteBarrier(); *(int volatile *)p = v;
20+
}
21+
#elif defined(__cplusplus)
22+
/* GCC/Clang __atomic builtins work in any C++ standard without headers */
23+
static inline int atomic_int_load(int *p) {
24+
return __atomic_load_n(p, __ATOMIC_ACQUIRE);
25+
}
26+
static inline void atomic_int_store(int *p, int v) {
27+
__atomic_store_n(p, v, __ATOMIC_RELEASE);
28+
}
29+
#else
30+
#include <stdatomic.h>
31+
static inline int atomic_int_load(int *p) {
32+
return (int)atomic_load_explicit((atomic_int *)p, memory_order_acquire);
33+
}
34+
static inline void atomic_int_store(int *p, int v) {
35+
atomic_store_explicit((atomic_int *)p, v, memory_order_release);
36+
}
37+
#endif
38+
39+
"""
40+
cdef int _cyb_atomic_int_load "atomic_int_load"(int *p) nogil
41+
cdef void _cyb_atomic_int_store "atomic_int_store"(int *p, int v) nogil
42+
1143
cdef extern from "<windows.h>":
1244
ctypedef void* HMODULE
1345
void* _cyb_GetProcAddress "GetProcAddress"(HMODULE, const char*) nogil
@@ -19,7 +51,7 @@ import threading as _cyb_threading
1951

2052
ctypedef int (*_cyb_cuGetProcAddress_v2_T)(const char *, void **, int, cuuint64_t, CUdriverProcAddressQueryResult *)except?CUDA_ERROR_NOT_FOUND nogil
2153

22-
cdef bint _cyb___py_driver_init = False
54+
cdef int _cyb___py_driver_init = 0
2355
cdef dict _cyb_func_ptrs = None
2456
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2557

@@ -2126,11 +2158,11 @@ cdef int _init_driver() except -1 nogil:
21262158
global __cuStreamBeginRecaptureToGraph
21272159
cuGetProcAddress_v2('cuStreamBeginRecaptureToGraph', <void **>&__cuStreamBeginRecaptureToGraph, 13030, ptds_mode, NULL)
21282160

2129-
_cyb___py_driver_init = True
2161+
_cyb_atomic_int_store(<int *>&_cyb___py_driver_init, 1)
21302162
return 0
21312163

21322164
cdef inline int _check_or_init_driver() except -1 nogil:
2133-
if _cyb___py_driver_init:
2165+
if _cyb_atomic_int_load(<int *>&_cyb___py_driver_init):
21342166
return 0
21352167

21362168
return _init_driver()

0 commit comments

Comments
 (0)