Skip to content

Commit 5499580

Browse files
committed
Merge remote-tracking branch 'upstream/main' into nvlink-max-links-dynamic
2 parents a74767a + 339d7c7 commit 5499580

67 files changed

Lines changed: 1488 additions & 775 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/dependabot.yml

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,51 @@
1-
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

55
version: 2
66
updates:
7+
# Python test-dependency updates for cuda_bindings
8+
- package-ecosystem: pip
9+
directory: /cuda_bindings
10+
schedule:
11+
interval: "monthly"
12+
time: "09:00"
13+
timezone: "America/Los_Angeles"
14+
open-pull-requests-limit: 5
15+
groups:
16+
test-deps:
17+
applies-to: version-updates
18+
patterns: ["*"]
19+
update-types: ["major", "minor", "patch"]
20+
21+
# Python test-dependency updates for cuda_core
22+
- package-ecosystem: pip
23+
directory: /cuda_core
24+
schedule:
25+
interval: "monthly"
26+
time: "09:00"
27+
timezone: "America/Los_Angeles"
28+
open-pull-requests-limit: 5
29+
groups:
30+
test-deps:
31+
applies-to: version-updates
32+
patterns: ["*"]
33+
update-types: ["major", "minor", "patch"]
34+
35+
# Python test-dependency updates for cuda_pathfinder
36+
- package-ecosystem: pip
37+
directory: /cuda_pathfinder
38+
schedule:
39+
interval: "monthly"
40+
time: "09:00"
41+
timezone: "America/Los_Angeles"
42+
open-pull-requests-limit: 5
43+
groups:
44+
test-deps:
45+
applies-to: version-updates
46+
patterns: ["*"]
47+
update-types: ["major", "minor", "patch"]
48+
749
# GitHub Actions updates targeting the default branch (main)
850
- package-ecosystem: github-actions
951
directory: /

.github/workflows/build-wheel.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ jobs:
5555
curl -fsSL "https://github.com/rapidsai/sccache/releases/latest/download/sccache-$(uname -m)-unknown-linux-musl.tar.gz" \
5656
| sudo tar -C /usr/local/bin -xvzf - --wildcards --strip-components=1 -x '*/sccache'
5757
echo "SCCACHE_PATH=/usr/local/bin/sccache" >> "$GITHUB_ENV"
58-
echo "SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE=true" >> "$GITHUB_ENV"
5958
6059
# xref: https://github.com/orgs/community/discussions/42856#discussioncomment-7678867
6160
- name: Adding addtional GHA cache-related env vars
@@ -190,7 +189,6 @@ jobs:
190189
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
191190
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
192191
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
193-
SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE=${{ env.SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE }}
194192
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
195193
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
196194
CIBW_ENVIRONMENT_WINDOWS: >
@@ -261,7 +259,6 @@ jobs:
261259
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
262260
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
263261
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
264-
SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE=${{ env.SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE }}
265262
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
266263
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
267264
CIBW_ENVIRONMENT_WINDOWS: >
@@ -518,7 +515,6 @@ jobs:
518515
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
519516
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
520517
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
521-
SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE=${{ env.SCCACHE_GHA_USE_PREPROCESSOR_CACHE_MODE }}
522518
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
523519
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
524520
CIBW_ENVIRONMENT_WINDOWS: >

.github/workflows/ci.yml

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -432,52 +432,42 @@ jobs:
432432
steps:
433433
- name: Exit
434434
run: |
435-
# if any dependencies were cancelled or failed, that's a failure
436-
#
437-
# see https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#always
438-
# and https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks
439-
# for why this cannot be encoded in the job-level `if:` field
440-
#
441-
# TL; DR: `$REASONS`
442-
#
443-
# The intersection of skipped-as-success and required status checks
444-
# creates a scenario where if you DON'T `always()` run this job, the
445-
# status check UI will block merging and if you DO `always()` run and
446-
# a dependency is _cancelled_ (due to a critical failure, which is
447-
# somehow not considered a failure ¯\_(ツ)_/¯) then the critically
448-
# failing job(s) will timeout causing a cancellation here and the
449-
# build to succeed which we don't want (originally this was just
450-
# 'exit 0')
451-
#
452-
# Note: When [doc-only] is in PR title, test jobs are intentionally
453-
# skipped and should not cause failure.
454-
#
455-
# detect-changes gates whether heavy test matrices run at all; if it
456-
# does not succeed, downstream test jobs are skipped rather than
457-
# failed, which would otherwise go unnoticed here. Require its
458-
# success explicitly so a broken gating step cannot masquerade as a
459-
# green CI run.
460-
doc_only=${{ needs.should-skip.outputs.doc-only }}
461-
if ${{ needs.detect-changes.result != 'success' }}; then
462-
exit 1
463-
fi
464-
if ${{ needs.doc.result == 'cancelled' || needs.doc.result == 'failure' }}; then
465-
exit 1
435+
# GitHub treats `result == 'skipped'` as success for required
436+
# status checks (see CCCL gate comment + cccl#605). The previous
437+
# `cancelled || failure` predicate let upstream build failures
438+
# propagate as `skipped` on downstream test jobs and silently
439+
# pass this aggregator. Adopt CCCL's `check_result` pattern:
440+
# require an explicit `expected` status per dependency, where
441+
# anything else (including `skipped` from a failed upstream)
442+
# fails the gate. `if: always()` on the job still ensures this
443+
# step runs even when needs are skipped.
444+
if [[ "${{ needs.should-skip.outputs.skip }}" == "true" ]]; then
445+
echo "[no-ci] - skipping aggregator checks"
446+
exit 0
466447
fi
467-
if ${{ needs.test-sdist-linux.result == 'cancelled' ||
468-
needs.test-sdist-linux.result == 'failure' ||
469-
needs.test-sdist-windows.result == 'cancelled' ||
470-
needs.test-sdist-windows.result == 'failure' }}; then
471-
exit 1
472-
fi
473-
if [[ "${doc_only}" != "true" ]]; then
474-
if ${{ needs.test-linux-64.result == 'cancelled' ||
475-
needs.test-linux-64.result == 'failure' ||
476-
needs.test-linux-aarch64.result == 'cancelled' ||
477-
needs.test-linux-aarch64.result == 'failure' ||
478-
needs.test-windows.result == 'cancelled' ||
479-
needs.test-windows.result == 'failure' }}; then
480-
exit 1
448+
449+
doc_only="${{ needs.should-skip.outputs.doc-only }}"
450+
status="success"
451+
check_result() {
452+
name=$1; expected=$2; result=$3
453+
echo "Checking $name: result='$result' (expected '$expected')"
454+
if [[ "$result" != "$expected" ]]; then
455+
echo "::error::$name did not match expected result"
456+
status="failed"
481457
fi
482-
fi
483-
exit 0
458+
}
459+
460+
# always expected to succeed (even in [doc-only] mode)
461+
check_result "should-skip" "success" "${{ needs.should-skip.result }}"
462+
check_result "detect-changes" "success" "${{ needs.detect-changes.result }}"
463+
check_result "doc" "success" "${{ needs.doc.result }}"
464+
465+
# [doc-only] flips these from 'success' to 'skipped'
466+
if [[ "$doc_only" == "true" ]]; then expected="skipped"; else expected="success"; fi
467+
check_result "test-sdist-linux" "$expected" "${{ needs.test-sdist-linux.result }}"
468+
check_result "test-sdist-windows" "$expected" "${{ needs.test-sdist-windows.result }}"
469+
check_result "test-linux-64" "$expected" "${{ needs.test-linux-64.result }}"
470+
check_result "test-linux-aarch64" "$expected" "${{ needs.test-linux-aarch64.result }}"
471+
check_result "test-windows" "$expected" "${{ needs.test-windows.result }}"
472+
473+
[[ "$status" == "success" ]]

SECURITY.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ disclosure policy. Please visit our [Product Security Incident Response Team
2929
(PSIRT)](https://www.nvidia.com/en-us/security/psirt-policies/) policies page for more
3030
information.
3131

32+
## CUDA IPC and Python serialization
33+
34+
`cuda.core.Buffer` objects allocated from IPC-enabled memory resources can be
35+
pickled for transfer between same-host processes. Unpickling performs an IPC
36+
memory import using the embedded `IPCBufferDescriptor`. Only unpickle buffers
37+
(and call `Buffer.from_ipc_descriptor`) with descriptors from trusted peers;
38+
malicious descriptors can trigger invalid memory operations.
39+
40+
When sharing CUDA objects across processes, use `multiprocessing` with the
41+
`spawn` start method.
42+
3243
## NVIDIA Product Security
3344

3445
For all security-related concerns, please visit NVIDIA's Product Security portal at

cuda_bindings/cuda/bindings/_internal/nvjitlink.pxd

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
44
#
5-
# This code was automatically generated across versions from 12.0.1 to 13.2.0, generator version 0.3.1.dev1422+gf4812259e.d20260318. Do not modify it directly.
5+
# This code was automatically generated across versions from 12.0.1 to 13.3.0, generator version 0.3.1.dev1752+g89e531539. Do not modify it directly.
66

77
from ..cynvjitlink cimport *
88

@@ -25,3 +25,5 @@ cdef nvJitLinkResult _nvJitLinkGetErrorLog(nvJitLinkHandle handle, char* log) ex
2525
cdef nvJitLinkResult _nvJitLinkGetInfoLogSize(nvJitLinkHandle handle, size_t* size) except?_NVJITLINKRESULT_INTERNAL_LOADING_ERROR nogil
2626
cdef nvJitLinkResult _nvJitLinkGetInfoLog(nvJitLinkHandle handle, char* log) except?_NVJITLINKRESULT_INTERNAL_LOADING_ERROR nogil
2727
cdef nvJitLinkResult _nvJitLinkVersion(unsigned int* major, unsigned int* minor) except?_NVJITLINKRESULT_INTERNAL_LOADING_ERROR nogil
28+
cdef nvJitLinkResult _nvJitLinkGetLinkedLTOIRSize(nvJitLinkHandle handle, size_t* size) except?_NVJITLINKRESULT_INTERNAL_LOADING_ERROR nogil
29+
cdef nvJitLinkResult _nvJitLinkGetLinkedLTOIR(nvJitLinkHandle handle, void* ltoir) except?_NVJITLINKRESULT_INTERNAL_LOADING_ERROR nogil

cuda_bindings/cuda/bindings/cudla.pyx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
33

4-
# This code was automatically generated across versions from 1.5.0 to 13.3.0, generator version 0.3.1.dev1719+g565f73f4e. Do not modify it directly.
4+
# This code was automatically generated across versions from 1.5.0 to 13.3.0, generator version 0.3.1.dev1752+g89e531539. Do not modify it directly.
55

66
cimport cython # NOQA
77
from libc.stdint cimport intptr_t, uintptr_t
@@ -67,7 +67,7 @@ cdef __getbuffer(object self, cpython.Py_buffer *buffer, void *ptr, int size, bi
6767
###############################################################################
6868

6969
cdef _get_external_memory_handle_desc_dtype_offsets():
70-
cdef cudlaExternalMemoryHandleDesc_t pod = cudlaExternalMemoryHandleDesc_t()
70+
cdef cudlaExternalMemoryHandleDesc_t pod
7171
return _numpy.dtype({
7272
'names': ['ext_buf_object', 'size_'],
7373
'formats': [_numpy.intp, _numpy.uint64],
@@ -210,7 +210,7 @@ cdef class ExternalMemoryHandleDesc:
210210

211211

212212
cdef _get_external_semaphore_handle_desc_dtype_offsets():
213-
cdef cudlaExternalSemaphoreHandleDesc_t pod = cudlaExternalSemaphoreHandleDesc_t()
213+
cdef cudlaExternalSemaphoreHandleDesc_t pod
214214
return _numpy.dtype({
215215
'names': ['ext_sync_object'],
216216
'formats': [_numpy.intp],
@@ -341,7 +341,7 @@ cdef class ExternalSemaphoreHandleDesc:
341341

342342

343343
cdef _get_module_tensor_descriptor_dtype_offsets():
344-
cdef cudlaModuleTensorDescriptor pod = cudlaModuleTensorDescriptor()
344+
cdef cudlaModuleTensorDescriptor pod
345345
return _numpy.dtype({
346346
'names': ['name', 'size_', 'n', 'c', 'h', 'w', 'data_format', 'data_type', 'data_category', 'pixel_format', 'pixel_mapping', 'stride'],
347347
'formats': [(_numpy.int8, 81), _numpy.uint64, _numpy.uint64, _numpy.uint64, _numpy.uint64, _numpy.uint64, _numpy.uint8, _numpy.uint8, _numpy.uint8, _numpy.uint8, _numpy.uint8, (_numpy.uint32, 8)],
@@ -614,7 +614,7 @@ cdef class ModuleTensorDescriptor:
614614

615615

616616
cdef _get_fence_dtype_offsets():
617-
cdef CudlaFence pod = CudlaFence()
617+
cdef CudlaFence pod
618618
return _numpy.dtype({
619619
'names': ['fence', 'type'],
620620
'formats': [_numpy.intp, _numpy.int32],
@@ -1055,7 +1055,7 @@ cdef class ModuleAttribute:
10551055

10561056

10571057
cdef _get_wait_events_dtype_offsets():
1058-
cdef cudlaWaitEvents pod = cudlaWaitEvents()
1058+
cdef cudlaWaitEvents pod
10591059
return _numpy.dtype({
10601060
'names': ['pre_fences', 'num_events'],
10611061
'formats': [_numpy.intp, _numpy.uint32],
@@ -1195,7 +1195,7 @@ cdef class WaitEvents:
11951195

11961196

11971197
cdef _get_signal_events_dtype_offsets():
1198-
cdef cudlaSignalEvents pod = cudlaSignalEvents()
1198+
cdef cudlaSignalEvents pod
11991199
return _numpy.dtype({
12001200
'names': ['dev_ptrs', 'eof_fences', 'num_events'],
12011201
'formats': [_numpy.intp, _numpy.intp, _numpy.uint32],
@@ -1361,7 +1361,7 @@ cdef class SignalEvents:
13611361

13621362

13631363
cdef _get_task_dtype_offsets():
1364-
cdef cudlaTask pod = cudlaTask()
1364+
cdef cudlaTask pod
13651365
return _numpy.dtype({
13661366
'names': ['module_handle', 'output_tensor', 'num_output_tensors', 'num_input_tensors', 'input_tensor', 'wait_events', 'signal_events'],
13671367
'formats': [_numpy.intp, _numpy.intp, _numpy.uint32, _numpy.uint32, _numpy.intp, _numpy.intp, _numpy.intp],

0 commit comments

Comments
 (0)