Skip to content

Commit a4d338b

Browse files
authored
Fix potential data race in initialization (#2382)
1 parent 1781cad commit a4d338b

15 files changed

Lines changed: 474 additions & 58 deletions

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 with version 12.9.1. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=024982f0bae1e5b410017fc993255a308efb8b4811b34b2b1e90a44e54c27247
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f82fe2e4ea86565b1f096aad374d6d4578d37de77db0518cd7e2c73332dfb78f
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

@@ -289,11 +321,11 @@ cdef int _init_cufile() except -1 nogil:
289321
handle = load_library()
290322
__cuFileSetParameterString = _cyb_dlsym(handle, 'cuFileSetParameterString')
291323

292-
_cyb___py_cufile_init = True
324+
_cyb_atomic_int_store(<int *>&_cyb___py_cufile_init, 1)
293325
return 0
294326

295327
cdef inline int _check_or_init_cufile() except -1 nogil:
296-
if _cyb___py_cufile_init:
328+
if _cyb_atomic_int_load(<int *>&_cyb___py_cufile_init):
297329
return 0
298330

299331
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 with version 12.9.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=ee0d1bcca022f6bf920320a877e2441f3548016a7cbad6d48ed95aebc70cea2e
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f37bf970f8f822c8b606546584bdfde2530c1e2cd8aa36a359b8b960aff79186
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

@@ -1987,11 +2019,11 @@ cdef int _init_driver() except -1 nogil:
19872019
global __cuGraphicsVDPAURegisterOutputSurface
19882020
cuGetProcAddress_v2('cuGraphicsVDPAURegisterOutputSurface', <void **>&__cuGraphicsVDPAURegisterOutputSurface, 3010, ptds_mode, NULL)
19892021

1990-
_cyb___py_driver_init = True
2022+
_cyb_atomic_int_store(<int *>&_cyb___py_driver_init, 1)
19912023
return 0
19922024

19932025
cdef inline int _check_or_init_driver() except -1 nogil:
1994-
if _cyb___py_driver_init:
2026+
if _cyb_atomic_int_load(<int *>&_cyb___py_driver_init):
19952027
return 0
19962028

19972029
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 with version 12.9.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=5748bf3321e7720f794cdbace9342c322bfbdfe48eb66758556a9ca55f0f2c89
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=b101459d496c90e392500d4a36a0b5d567ad8097b4a8f727af2177ac6c6e1dd3
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

@@ -1990,11 +2022,11 @@ cdef int _init_driver() except -1 nogil:
19902022
global __cuGraphicsVDPAURegisterOutputSurface
19912023
cuGetProcAddress_v2('cuGraphicsVDPAURegisterOutputSurface', <void **>&__cuGraphicsVDPAURegisterOutputSurface, 3010, ptds_mode, NULL)
19922024

1993-
_cyb___py_driver_init = True
2025+
_cyb_atomic_int_store(<int *>&_cyb___py_driver_init, 1)
19942026
return 0
19952027

19962028
cdef inline int _check_or_init_driver() except -1 nogil:
1997-
if _cyb___py_driver_init:
2029+
if _cyb_atomic_int_load(<int *>&_cyb___py_driver_init):
19982030
return 0
19992031

20002032
return _init_driver()

cuda_bindings/cuda/bindings/_internal/nvfatbin_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.4.1 to 13.3.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=8a025fac12ad4fa9dc651c68c1ab7948f78cbb4b9450935db8f930c9d44988f4
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f86a7f7527aad594d7b2e67742165454729ecca3810c00e6786f772099b17850
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"
@@ -16,7 +48,7 @@ from libc.stdint cimport intptr_t as _cyb_intptr_t
1648

1749
import threading as _cyb_threading
1850

19-
cdef bint _cyb___py_nvfatbin_init = False
51+
cdef int _cyb___py_nvfatbin_init = 0
2052
cdef dict _cyb_func_ptrs = None
2153
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2254

@@ -135,11 +167,11 @@ cdef int _init_nvfatbin() except -1 nogil:
135167
handle = load_library()
136168
__nvFatbinAddTileIR = _cyb_dlsym(handle, 'nvFatbinAddTileIR')
137169

138-
_cyb___py_nvfatbin_init = True
170+
_cyb_atomic_int_store(<int *>&_cyb___py_nvfatbin_init, 1)
139171
return 0
140172

141173
cdef inline int _check_or_init_nvfatbin() except -1 nogil:
142-
if _cyb___py_nvfatbin_init:
174+
if _cyb_atomic_int_load(<int *>&_cyb___py_nvfatbin_init):
143175
return 0
144176

145177
return _init_nvfatbin()

cuda_bindings/cuda/bindings/_internal/nvfatbin_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.4.1 to 13.3.0. Do not modify it directly.
6-
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=c44272bf506dcc20b5771a20fb6efc77f920c9b9bb21a89b53e3a9e7d69ce1ef
6+
# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=3b89f4c5e0a102d65950a485dab14517cb67887864d22152311d76341701e667
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
@@ -16,7 +48,7 @@ from libc.stdint cimport intptr_t as _cyb_intptr_t
1648

1749
import threading as _cyb_threading
1850

19-
cdef bint _cyb___py_nvfatbin_init = False
51+
cdef int _cyb___py_nvfatbin_init = 0
2052
cdef dict _cyb_func_ptrs = None
2153
cdef object _cyb_symbol_lock = _cyb_threading.Lock()
2254

@@ -87,11 +119,11 @@ cdef int _init_nvfatbin() except -1 nogil:
87119
global __nvFatbinAddTileIR
88120
__nvFatbinAddTileIR = _cyb_GetProcAddress(<HMODULE>handle, 'nvFatbinAddTileIR')
89121

90-
_cyb___py_nvfatbin_init = True
122+
_cyb_atomic_int_store(<int *>&_cyb___py_nvfatbin_init, 1)
91123
return 0
92124

93125
cdef inline int _check_or_init_nvfatbin() except -1 nogil:
94-
if _cyb___py_nvfatbin_init:
126+
if _cyb_atomic_int_load(<int *>&_cyb___py_nvfatbin_init):
95127
return 0
96128

97129
return _init_nvfatbin()

0 commit comments

Comments
 (0)