Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Guest ITIMER_REAL never fires in pause() or a spin loop

Abierto
#477 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 3 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
52/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
c

Línea de trabajo

Start with sys_ppoll in src/syscall/poll.c and the timer checks in src/syscall/io.c, then trace how the vCPU watchdog and RLIMIT_CPU sampler kick a guest vCPU in src/syscall/proc.c and issue #475. Add coverage for the reported alarm(1) cases: pause() and a spin loop. Done means both guest processes terminate from SIGALRM near the timer expiry.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

A guest alarm() or setitimer(ITIMER_REAL) does not deliver SIGALRM while the guest sleeps in pause() or runs a loop with no syscalls. On Linux both end with SIGALRM when the timer expires.

elfuse keeps the guest ITIMER_REAL in guest_itimer (src/syscall/signal.c) instead of the host timer, since its own vCPU watchdog uses the host setitimer(ITIMER_REAL). The guest timer becomes a pending SIGALRM only when signal_check_timer or signal_check_timer_real runs: after a vCPU exit in src/syscall/proc.c, and inside the fd, futex and retry waits in src/syscall/io.c and src/runtime/futex.c. Two paths reach neither:

  • sys_ppoll in src/syscall/poll.c waits in host poll() slices and checks signal_pending_interruption, but never calls signal_check_timer_real. glibc's pause() is ppoll(NULL, 0, NULL, NULL), so it waits forever.
  • A guest spinning at EL0 takes no exit, so nothing checks the timer until the 10 s vCPU watchdog ends the process with a TIMEOUT crash report.

Reproduction, static aarch64 glibc:

#include <unistd.h>

int main(int argc, char **argv)
{
    alarm(2);
    if (argc > 1)
        for (volatile unsigned long n = 0;; n++)
            ;
    for (;;)
        pause();
}

On Linux both ./a.out and ./a.out spin die of SIGALRM after 2 s. Under elfuse on main at e9fdbbb, both were still running when killed at 12 s, with the pause() case parked in sys_ppoll. The result is the same in a fork child and with a second thread that spins or sleeps.

Follow-ups

  • Call signal_check_timer_real in the sys_ppoll wait loop and size the slice to the next guest timer expiry, as the fd wait in src/syscall/io.c does.
  • Have the guest timer kick a spinning vCPU when it expires, the way the RLIMIT_CPU sampler in #475 raises attention, so a compute loop sees SIGALRM on time.
  • Add a test: alarm(1) then pause(), and alarm(1) then a spin loop, each expected to die of SIGALRM.
Lenguaje dominante
C
Estrellas
278
Forks
31
Merge medio
2 d 22 h
PR fusionados (30 d)
17

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de sysprog21/elfuse

Todos los issues de sysprog21/elfuse

Issues similares

Más issues de C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.