Skip to content

fix NMR usage patterns: detach routines can run at dispatch IRQL (#720) #1900

fix NMR usage patterns: detach routines can run at dispatch IRQL (#720)

fix NMR usage patterns: detach routines can run at dispatch IRQL (#720) #1900

Workflow file for this run

name: CI
on:
push:
branches:
- main
- release/*
- prerelease/*
pull_request:
branches:
- main
- release/*
- prerelease/*
schedule:
- cron: '37 12 * * 2'
concurrency:
# Cancel any workflow currently in progress for the same PR.
# Allow running concurrently with any other commits.
group: ci-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
permissions: read-all
jobs:
build:
name: Build
permissions:
security-events: write # For CodeQL
uses: ./.github/workflows/build_matrix.yml
resolve_base:
name: Resolve base commit reference
runs-on: windows-2022
outputs:
base_ref: ${{ steps.resolve_base_ref.outputs.base_ref }}
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
repository: microsoft/xdp-for-windows
fetch-depth: 2
- name: Resolve base commit reference
id: resolve_base_ref
shell: PowerShell
# For PR runs, this returns essentially returns "main", or the target branch.
# For non-PR runs, this returns the first parent of the current commit.
run: |
$BaseRef = "${{ github.base_ref }}"
if ([string]::IsNullOrEmpty($BaseRef)) {
$BaseRef = git log --pretty=%P -n 1 ${{ github.sha }}
}
if (($BaseRef -split " ").Count -gt 1) {
Write-Warning "BaseRef has multiple parents. Choosing first of $BaseRef"
$BaseRef = ($BaseRef -split " ")[0]
}
Write-Output "base_ref=$BaseRef"
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "base_ref=$BaseRef"
build_base:
name: Build (Base Ref)
needs: resolve_base
permissions:
security-events: write # For CodeQL (even though it is not enabled)
uses: ./.github/workflows/build_matrix.yml
with:
ref: ${{ needs.resolve_base.outputs.base_ref }}
id: "baseref"
codeql: false
build_allpackage:
name: Build AllPackage
needs: build
strategy:
fail-fast: false
matrix:
config: [Release, Debug]
permissions:
actions: read
contents: read
runs-on: windows-2022
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
repository: microsoft/xdp-for-windows
submodules: recursive
- name: Download x64 Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.config }}_x64
path: artifacts/bin
- name: Download arm64 Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.config }}_arm64
path: artifacts/bin
- name: Setup MSBuild.exe
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce
- name: Nuget Restore
run: msbuild.exe xdp.sln /t:restore /p:RestoreConfigFile=src/nuget.config /p:Configuration=${{ matrix.config }} /p:Platform=x64
- name: Build AllPackage
run: msbuild xdp.sln /m /t:onebranch /p:Configuration=${{ matrix.config }} /p:Platform=x64 /p:IsAdmin=true /p:BuildStage=AllPackage /p:NugetPlatforms=x64%2carm64
- name: Upload Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
with:
name: bin_allpackage_${{ matrix.config }}
path: |
artifacts/bin/${{ matrix.config }}
!artifacts/bin/**/*.ilk
!artifacts/bin/**/*.exp
!artifacts/bin/**/*.lastcodeanalysissucceeded
onebranch_build_validation:
name: OneBranch Build Validation
strategy:
fail-fast: false
matrix:
config: [Release, Debug]
platform: [x64]
permissions:
actions: read
contents: read
runs-on: windows-2022
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
repository: microsoft/xdp-for-windows
submodules: recursive
ref: ${{ inputs.ref }}
- name: Setup MSBuild.exe
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce
- name: Nuget Restore
run: msbuild.exe xdp.sln /t:restore /p:RestoreConfigFile=src/nuget.config /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }}
- name: Build Binary
run: msbuild xdp.sln /m /t:onebranch /p:configuration=${{ matrix.config }} /p:platform=${{ matrix.platform }} /p:SignMode=Off /p:IsAdmin=true /p:BuildStage=Binary
- name: Build Catalog
run: msbuild xdp.sln /m /t:onebranch /p:configuration=${{ matrix.config }} /p:platform=${{ matrix.platform }} /p:SignMode=Off /p:IsAdmin=true /p:BuildStage=Catalog
- name: Build Package
run: msbuild xdp.sln /m /t:onebranch /p:configuration=${{ matrix.config }} /p:platform=${{ matrix.platform }} /p:SignMode=Off /p:IsAdmin=true /p:BuildStage=Package
- name: Build AllPackage
run: msbuild xdp.sln /m /t:onebranch /p:configuration=${{ matrix.config }} /p:platform=${{ matrix.platform }} /p:SignMode=Off /p:IsAdmin=true /p:BuildStage=AllPackage
- name: Upload Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
with:
name: onebranch_bin_${{ matrix.config }}_${{ matrix.platform }}
path: |
artifacts/bin
!artifacts/bin/**/*.ilk
!artifacts/bin/**/*.exp
!artifacts/bin/**/*.lastcodeanalysissucceeded
functional_tests:
name: Functional Tests
needs: build
env:
# For 'main' commits
fullRuntime: 250 # minutes. Update timeout-minutes with any changes.
fullIters: 10
# For PRs
prRuntime: 25 # minutes. Update timeout-minutes with any changes.
prIters: 1
strategy:
fail-fast: false
matrix:
windows: [2019, 2022, Prerelease]
configuration: [Release, Debug]
platform: [x64, arm64]
exclude:
- windows: 2019
platform: arm64
- windows: 2022
platform: arm64
runs-on:
- self-hosted
- "1ES.Pool=xdp-ci-functional${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}-gh"
- "1ES.ImageOverride=WS${{ matrix.windows }}${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}-Functional"
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
sparse-checkout: tools
- name: Check Drivers
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
- name: Prepare Machine
shell: PowerShell
run: tools/prepare-machine.ps1 -Platform ${{ matrix.platform }} -ForFunctionalTest -RequireNoReboot -Verbose
- name: Download Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/bin
- name: Run Tests (PR)
if: ${{ github.event_name == 'pull_request' }}
shell: PowerShell
timeout-minutes: 25
run: tools/functional.ps1 -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Iterations ${{ env.prIters }} -Timeout ${{ env.fullRuntime }}
- name: Run Tests (main)
if: ${{ github.event_name != 'pull_request' }}
shell: PowerShell
timeout-minutes: 250
run: tools/functional.ps1 -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Iterations ${{ env.fullIters }} -Timeout ${{ env.fullRuntime }}
- name: Convert Logs
if: ${{ always() }}
timeout-minutes: 15
shell: PowerShell
run: tools/log.ps1 -Convert -Name xdpfunc* -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }}
- name: Upload Logs
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
if: ${{ always() }}
with:
name: logs_func_win${{ matrix.windows }}_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/logs
- name: Check Drivers
if: ${{ always() }}
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
stress_tests:
name: Stress Tests
needs: build
env:
successThresholdPercent: 1
xdpmpPollProvider: 'FNDIS'
# For 'main' commits
fullRuntime: 60 # minutes. Update timeout-minutes with any changes.
# For PRs
prRuntime: 10 # minutes. Update timeout-minutes with any changes.
strategy:
fail-fast: false
matrix:
windows: [2019, 2022, Prerelease]
configuration: [Release, Debug]
platform: [x64, arm64]
exclude:
- windows: 2019
platform: arm64
- windows: 2022
platform: arm64
timeout-minutes: 75 # Ideally this would be only 25 min for PR runs, but GitHub Actions don't support that.
runs-on:
- self-hosted
- "1ES.Pool=xdp-ci-spinxsk${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}-gh"
- "1ES.ImageOverride=WS${{ matrix.windows }}${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}-Spinxsk"
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
sparse-checkout: tools
- name: Check Drivers
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
- name: Prepare Machine
shell: PowerShell
run: tools/prepare-machine.ps1 -ForSpinxskTest -Platform ${{ matrix.platform }} -RequireNoReboot -Verbose
- name: Download Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/bin
- name: Run spinxsk (PR)
if: ${{ github.event_name == 'pull_request' }}
shell: PowerShell
timeout-minutes: 20
run: tools/spinxsk.ps1 -Verbose -Stats -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Minutes ${{ env.prRuntime }} -XdpmpPollProvider ${{ env.xdpmpPollProvider }} -SuccessThresholdPercent ${{ env.successThresholdPercent }} -EnableEbpf
- name: Run spinxsk (main)
if: ${{ github.event_name != 'pull_request' }}
shell: PowerShell
timeout-minutes: 70
run: tools/spinxsk.ps1 -Verbose -Stats -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Minutes ${{ env.fullRuntime }} -XdpmpPollProvider ${{ env.xdpmpPollProvider }} -SuccessThresholdPercent ${{ env.successThresholdPercent }} -EnableEbpf
- name: Convert Logs
if: ${{ always() }}
timeout-minutes: 15
shell: PowerShell
run: tools/log.ps1 -Convert -Name spinxsk -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }}
- name: Upload Logs
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
if: ${{ always() }}
with:
name: logs_stress_win${{ matrix.windows }}_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/logs
- name: Check Drivers
if: ${{ always() }}
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
pktfuzz_tests:
name: Fuzz Packet Parsing
needs: build
strategy:
fail-fast: false
matrix:
windows: [2022] # ASAN is currently buggy on Prerelease and 2019.
configuration: [Release, Debug]
platform: [x64]
runs-on:
- self-hosted
- "1ES.Pool=xdp-ci-fuzz-gh"
- "1ES.ImageOverride=WS${{ matrix.windows }}"
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
sparse-checkout: tools
- name: Download Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/bin
- name: Run pktfuzz
shell: PowerShell
run: tools/pktfuzz.ps1 -Minutes 10 -Workers 8 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
- name: Upload Logs
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
if: ${{ always() }}
with:
name: logs_pktfuzz_win${{ matrix.windows }}_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/logs
if-no-files-found: ignore
perf_tests:
name: Perf Tests
needs: [build, build_base, resolve_base]
env:
ITERATIONS: ${{ (github.event_name != 'pull_request') && '8' || '3' }}
timeout-minutes: 90 # Ideally this would be only 30 min for PR runs, but GitHub Actions don't support that.
strategy:
fail-fast: false
matrix:
windows: [2019, 2022, Prerelease]
configuration: [Release]
platform: [x64, arm64]
exclude:
- windows: 2019
platform: arm64
- windows: 2022
platform: arm64
runs-on:
- self-hosted
- "1ES.Pool=xdp-ci-perf${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}-gh"
- "1ES.ImageOverride=WS${{ matrix.windows }}${{ matrix.platform != 'x64' && format('-{0}', matrix.platform) || '' }}"
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
sparse-checkout: |
.github
tools
- uses: ./.github/actions/perf
with:
config: ${{ matrix.configuration }}
os: ${{ matrix.windows }}
platform: ${{ matrix.platform }}
- uses: ./.github/actions/perf
with:
config: ${{ matrix.configuration }}
os: ${{ matrix.windows }}
platform: ${{ matrix.platform }}
ref: ${{ needs.resolve_base.outputs.base_ref }}
id: "baseref"
- name: Compare Results
shell: PowerShell
run: tools\xskperfcompare.ps1 -DataFile1 baseref/artifacts/logs/xskperfsuite.csv -DataFile2 artifacts/logs/xskperfsuite.csv
downlevel_functional_tests:
name: Downlevel Functional Tests
needs: build
env:
Runtime: 25 # minutes. Update timeout-minutes with any changes.
Iters: 1
strategy:
fail-fast: false
matrix:
downlevel_release: [1.0.2]
windows: [2019, 2022, Prerelease]
configuration: [Release]
platform: [x64]
runs-on:
- self-hosted
- "1ES.Pool=xdp-ci-functional-gh"
- "1ES.ImageOverride=WS${{ matrix.windows }}-Functional"
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
with:
sparse-checkout: tools
- name: Check Drivers
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
- name: Prepare Machine
shell: PowerShell
run: tools/prepare-machine.ps1 -ForFunctionalTest -Platform ${{ matrix.platform }} -RequireNoReboot -Verbose
- name: Download Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/bin
- name: Download Downlevel Tests
shell: PowerShell
run: |
Invoke-WebRequest -Uri "https://github.com/microsoft/xdp-for-windows/releases/download/v${{ matrix.downlevel_release }}/xdp-tests-${{ matrix.platform }}-${{ matrix.downlevel_release }}.zip" -OutFile "artifacts/downlevel-test.zip"
Expand-Archive -Path artifacts/downlevel-test.zip -DestinationPath artifacts/downlevel-test/${{ matrix.platform }}
tools/merge-artifacts.ps1 -SourcePath artifacts/downlevel-test/${{ matrix.platform }}/bin/* -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }}
- name: Run Tests
shell: PowerShell
timeout-minutes: 25
run: tools/functional.ps1 -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Iterations ${{ env.Iters }} -NoPrerelease -Timeout ${{ env.Runtime }}
- name: Convert Logs
if: ${{ always() }}
timeout-minutes: 15
shell: PowerShell
run: tools/log.ps1 -Convert -Name xdpfunc* -Verbose -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }}
- name: Upload Logs
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
if: ${{ always() }}
with:
name: logs_downlevel_${{ matrix.downlevel_release }}_win${{ matrix.windows }}_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/logs
- name: Check Drivers
if: ${{ always() }}
shell: PowerShell
run: tools/check-drivers.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }} -Verbose
create_artifacts:
name: Create Release Artifacts
needs: build
strategy:
fail-fast: false
matrix:
configuration: [Release]
platform: [x64, arm64]
runs-on: windows-2022
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
- name: Download Artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
with:
name: bin_${{ matrix.configuration }}_${{ matrix.platform }}
path: artifacts/bin
- name: Create Test Archive
shell: PowerShell
run: tools/create-test-archive.ps1 -Config ${{ matrix.configuration }} -Platform ${{ matrix.platform }}
- name: Upload Release Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
with:
name: release_artifacts_${{ matrix.configuration }}_${{ matrix.platform }}
path: |
artifacts/kit/**/*.zip
artifacts/testarchive/**/*.zip
etw:
name: ETW Plugin
needs: []
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
configuration: [Release, Debug]
permissions:
security-events: write # For CodeQL
steps:
- name: Checkout repository
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
- name: Initialize CodeQL
if: ${{ github.event_name == 'schedule' }}
uses: github/codeql-action/init@v3
with:
languages: csharp
- name: Setup .NET
uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee
with:
dotnet-version: 6.0.x
- name: Prepare Machine
shell: PowerShell
run: tools/prepare-machine.ps1 -ForBuild -Verbose
- name: Build
run: dotnet build src\xdpetwplugin\xdpetwplugin.sln -c ${{ matrix.configuration }}
- uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
with:
name: etw_${{ matrix.configuration }}
path: artifacts/bin
- name: Perform CodeQL Analysis
if: ${{ github.event_name == 'schedule' }}
uses: github/codeql-action/analyze@v3
with:
category: "/language:csharp"
# netperf:
# name: Run Perf
# needs: []
# runs-on: windows-latest
# steps:
# - name: Run NetPerf Workflow
# shell: pwsh
# run: |
# $url = "https://raw.githubusercontent.com/microsoft/netperf/main/run-workflow.ps1"
# if ('${{ secrets.NET_PERF_TRIGGER }}' -eq '') {
# Write-Host "Not able to run because no secrets are available!"
# return
# }
# iex "& { $(irm $url) } ${{ secrets.NET_PERF_TRIGGER }} xdp ${{ github.sha }} ${{ github.ref }} ${{ github.event.pull_request.number }}"
Complete:
name: Complete
if: always()
needs: [build, build_allpackage, onebranch_build_validation, functional_tests, stress_tests, pktfuzz_tests, perf_tests, downlevel_functional_tests, create_artifacts, etw]
runs-on: ubuntu-latest
permissions: {} # No need for any permissions.
steps:
- name: Decide whether the needed jobs succeeded or failed
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe
with:
jobs: ${{ toJSON(needs) }}