Guest ITIMER_REAL never fires in pause() or a spin loop
メンテナーはふだん 3 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 52/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- c
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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_ppollinsrc/syscall/poll.cwaits in hostpoll()slices and checkssignal_pending_interruption, but never callssignal_check_timer_real. glibc'spause()isppoll(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_realin thesys_ppollwait loop and size the slice to the next guest timer expiry, as the fd wait insrc/syscall/io.cdoes. - 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)thenpause(), andalarm(1)then a spin loop, each expected to die of SIGALRM.
- 主要言語
- C
- スター
- 278
- フォーク
- 31
- 平均マージ
- 2日 22時間
- マージ済み PR(30日)
- 17
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
sysprog21/elfuse のほかの issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
メンテナーはふだん 3 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 3 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 3 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
sysprog21/elfuse#476 · コメント 1 件 ·
メンテナーはふだん 3 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
メンテナーはふだん 3 日以内に返信
sysprog21/elfuse の issue をすべて見る
似ている issue
-
vim.filetype.match() prefixes a URL buffer name with the cwd before passing it to filetype functionsオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
メンテナーはふだん 1 日以内に返信
-
stream_curl: retry_count never resets after a successful reconnect, so long sequential streams die after 5 drops対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
mpv-player/mpv#18728 ·
メンテナーはふだん 1 日以内に返信
-
followup Prio 📌
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
cyrusimap/cyrus-imapd#6640 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 60/100
メンテナーはふだん 1 日以内に返信