// SPDX-License-Identifier: BSD-3-Clause /* * evhold.cu - deterministic event-holder / event-wait probe for the guest * event-delivery class (r577). Opens a CUDA context (so the driver * registers its RM events), runs one small op, records and synchronizes a * CUDA event (which exercises the client's wait path), then holds the * context open for N seconds so host-side experiments (rmpost rounds with * the gsp_rm_ev_* knobs, ev_post kprobe) have a live event table to post * into. * * Usage: evhold [hold_seconds] * Output lines: * EVHOLD ctx ok * EVHOLD event sync ok * EVHOLD hold done */ #include #include #include #include static void check(const char *what, cudaError_t e) { if (e != cudaSuccess) { printf("EVHOLD FAIL %s: %s\n", what, cudaGetErrorString(e)); fflush(stdout); exit(1); } } int main(int argc, char **argv) { int hold = (argc > 1) ? atoi(argv[1]) : 120; float *d = NULL; cudaEvent_t ev; check("freectx", cudaFree(0)); printf("EVHOLD ctx ok\n"); fflush(stdout); check("malloc", cudaMalloc(&d, 4096)); check("memset", cudaMemset(d, 0, 4096)); check("evcreate", cudaEventCreate(&ev)); check("evrecord", cudaEventRecord(ev, 0)); check("evsync", cudaEventSynchronize(ev)); printf("EVHOLD event sync ok\n"); fflush(stdout); for (int i = 0; i < hold; i++) sleep(1); cudaEventDestroy(ev); cudaFree(d); printf("EVHOLD hold done\n"); return 0; }