From fea20f6ad78f66767a38be844b8ae01788d0a632 Mon Sep 17 00:00:00 2001 From: Aryan Date: Mon, 10 Aug 2026 12:10:24 -0400 Subject: [PATCH] fix(core): reject IPC registration without IPC state --- cuda_core/cuda/core/_memory/_ipc.pyx | 2 ++ cuda_core/docs/source/release/1.2.0-notes.rst | 4 ++++ cuda_core/tests/test_memory.py | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/cuda_core/cuda/core/_memory/_ipc.pyx b/cuda_core/cuda/core/_memory/_ipc.pyx index f4194b22b0e..8afd5c4a636 100644 --- a/cuda_core/cuda/core/_memory/_ipc.pyx +++ b/cuda_core/cuda/core/_memory/_ipc.pyx @@ -268,6 +268,8 @@ cdef _MemPool MP_register(_MemPool self, uuid): existing = registry.get(uuid) if existing is not None: return existing + if self._ipc_data is None: + raise RuntimeError("Memory resource is not IPC-enabled") assert self.uuid is None or self.uuid == uuid registry[uuid] = self self._ipc_data._alloc_handle._uuid = uuid diff --git a/cuda_core/docs/source/release/1.2.0-notes.rst b/cuda_core/docs/source/release/1.2.0-notes.rst index 120d2c2a253..8d3b8fdc1ef 100644 --- a/cuda_core/docs/source/release/1.2.0-notes.rst +++ b/cuda_core/docs/source/release/1.2.0-notes.rst @@ -9,6 +9,10 @@ Fixes and enhancements ---------------------- +- ``DeviceMemoryResource.register()`` and ``PinnedMemoryResource.register()`` + now raise ``RuntimeError`` when called on a resource without IPC enabled, + instead of dereferencing missing IPC state. + - Graph node resources are now retained independently across graph clones, executable graphs, updates, node deletion, and in-flight launches. Previously, modifying a graph definition could release resources still used by an diff --git a/cuda_core/tests/test_memory.py b/cuda_core/tests/test_memory.py index 8d86fa32432..ef6d929a4b4 100644 --- a/cuda_core/tests/test_memory.py +++ b/cuda_core/tests/test_memory.py @@ -3,6 +3,7 @@ import ctypes import sys +import uuid from cuda.bindings import driver @@ -570,6 +571,24 @@ def test_memory_resource_and_owner_disallowed(): Buffer.from_handle(ptr, 20, mr=DummyDeviceMemoryResource(Device()), owner=a) +@pytest.mark.parametrize("resource_type", [DeviceMemoryResource, PinnedMemoryResource]) +def test_register_without_ipc_raises(init_cuda, resource_type): + device = Device() + device.set_current() + + if resource_type is DeviceMemoryResource: + mr = resource_type(device) + else: + skip_if_pinned_memory_unsupported(device) + mr = create_pinned_memory_resource_or_xfail(xfail_device=device) + + try: + with pytest.raises(RuntimeError, match="Memory resource is not IPC-enabled"): + mr.register(uuid.uuid4()) + finally: + mr.close() + + def test_owner_close(): a = (ctypes.c_byte * 20)() ptr = ctypes.addressof(a)