Skip to content

Commit e4208ed

Browse files
authored
Use atomic flag for buffer memory-attribute initialization (NVIDIA#2216)
Store and read Buffer._mem_attrs_inited via std::atomic using acquire/release semantics to avoid races during lazy pointer memory- attribute initialization under free-threaded execution. Signed-off-by: Sebastian Berg <sebastianb@nvidia.com>
1 parent 75e6960 commit e4208ed

2 files changed

Lines changed: 14 additions & 12 deletions

File tree

cuda_core/cuda/core/_memory/_buffer.pxd

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
# SPDX-License-Identifier: Apache-2.0
44

55
from libc.stdint cimport uintptr_t
6+
from libcpp cimport bool as cpp_bool
7+
from libcpp.atomic cimport atomic as std_atomic, memory_order_acquire, memory_order_release
68

79
from cuda.bindings cimport cydriver
810
from cuda.core._resource_handles cimport DevicePtrHandle
@@ -18,13 +20,13 @@ cdef struct _MemAttrs:
1820

1921
cdef class Buffer:
2022
cdef:
21-
DevicePtrHandle _h_ptr
22-
MemoryResource _memory_resource
23-
object _ipc_data
24-
object _owner
25-
_MemAttrs _mem_attrs
26-
bint _mem_attrs_inited
27-
object __weakref__
23+
DevicePtrHandle _h_ptr
24+
MemoryResource _memory_resource
25+
object _ipc_data
26+
object _owner
27+
_MemAttrs _mem_attrs
28+
std_atomic[cpp_bool] _mem_attrs_inited
29+
object __weakref__
2830
cdef public:
2931
# Python code in _memory/_virtual_memory_resource.py needs to update
3032
# this value, though it is technically private.

cuda_core/cuda/core/_memory/_buffer.pyx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ cdef class Buffer:
103103
self._memory_resource = None
104104
self._ipc_data = None
105105
self._owner = None
106-
self._mem_attrs_inited = False
106+
self._mem_attrs_inited.store(False)
107107

108108
def __init__(self, *args, **kwargs) -> None:
109109
raise RuntimeError("Buffer objects cannot be instantiated directly. "
@@ -133,7 +133,7 @@ cdef class Buffer:
133133
self._memory_resource = mr
134134
self._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None
135135
self._owner = owner
136-
self._mem_attrs_inited = False
136+
self._mem_attrs_inited.store(False)
137137
return self
138138

139139
@staticmethod
@@ -462,9 +462,9 @@ cdef class Buffer:
462462
# ------------------------------
463463
cdef inline void _init_mem_attrs(Buffer self):
464464
"""Initialize memory attributes by querying the pointer."""
465-
if not self._mem_attrs_inited:
465+
if not self._mem_attrs_inited.load(memory_order_acquire):
466466
_query_memory_attrs(self._mem_attrs, as_cu(self._h_ptr))
467-
self._mem_attrs_inited = True
467+
self._mem_attrs_inited.store(True, memory_order_release)
468468

469469

470470
cdef inline int _query_memory_attrs(
@@ -612,7 +612,7 @@ cdef Buffer Buffer_from_deviceptr_handle(
612612
buf._memory_resource = mr
613613
buf._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None
614614
buf._owner = None
615-
buf._mem_attrs_inited = False
615+
buf._mem_attrs_inited.store(False)
616616
return buf
617617

618618

0 commit comments

Comments
 (0)