Kernel panic pada Hannah Montana Linux v26 yang memengaruhi backend storage merupakan masalah kritis yang langsung berdampak pada stabilitas node produksi. Kamu akan menemukan penjelasan mengenai gejala awal, jejak log, analisis root cause, serta langkah perbaikan yang bisa diterapkan oleh tim backend ataupun pengembang kernel.
1. Gejala Awal dan Reproduksi
Masalah pertama terdeteksi setelah peningkatan konstanta I/O pada service storage: node otomatis reboot saat menulis snapshot pada volume yang sudah dipindah ke kelas storage baru. Gejala klien mencakup I/O timeout 5–7 detik, lalu tracing daemon mendeteksi panic dari kernel loop panic().
Langkah reproduksi cepatnya:
- Buat volume kustom dan kirim permintaan snapshot berulang melalui endpoint internal.
- Jalankan stress test dengan
fiomix write pada volume tersebut. - Tunggu log kernel panic di
/var/log/kern.logyang dipicu oleh prosesbackend-storage.
Temuan awal menunjukkan kernel panic selalu diawali dengan log panic: blk_mq_tag_clear_waiters.
2. Mengurai Log dan Crash Dump
Pertama, kumpulkan dmesg dan kernel crash dump dari /var/crash/vmcore. Fragmen penting:
blk_mq_tag_clear_waiters+0x135/0x1a0
panic: timer_leak
Call Trace:
blk_mq_complete_request
blk_mq_freeze_queue
blk_mq_rq_timeout
Traceroute kernel menunjukkan panic terjadi ketika layer blk-mq mencoba menyelesaikan request yang sudah diunblock, tetapi queue dipaksa freeze melalui implementasi handler storage.
Pasangan log dmesg:
[ 1234.567891] backend-storage: rx queue event: u64=0x0, state=0x1
[ 1234.569903] blk_mq_tag_clear_waiters+0x135/0x1a0
[ 1234.570111] panic: timer_leak
Tracer tambahan menggunakan perf probe pada fungsi blk_mq_start_request membantu mengonfirmasi panic dipicu ketika request dijadwalkan ulang saat queue sudah dibekukan.
3. Diagnosis Penyebab Utama
3.1. Menyisir Konfigurasi Queue dan Driver
Investigasi reveal bahwa Hannah Montana Linux v26 memperkenalkan patch kernel yang mengizinkan driver storage untuk memanipulasi queue freeze/unfreeze secara manual. Kombinasi beberapa request penghapusan snapshot menyebabkan proses backend memanggil blk_mq_freeze_queue bersamaan dengan blk_mq_unfreeze_queue dari callback berbeda tanpa sinkronisasi kuat.
Hal tersebut membuat blk_mq_tag_clear_waiters melihat waiter yang sudah dihapus, lalu memicu panic karena pointer waiter tidak lagi valid.
3.2. Tracing dan Observability untuk Memvalidasi
Mengaktifkan CONFIG_LOCKDEP dan menggunakan trace-cmd pada fungsi blk_mq_freeze_queue memperlihatkan urutan tak terduga:
- Request di-schedule ulang, callback memanggil
blk_mq_freeze_queue. - Queue masih memiliki
blk_mq_tag_clear_waitersyang belum selesai. - Thread lain memanggil
blk_mq_unfreeze_queuesebelum waiter terakhir selesai, mengosongkan state dan mengakibatkan panic saat waiter dibersihkan.
Tracing ini menegaskan bahwa race condition antara freeze/unfreeze tanpa mutex menyebabkan waiter dipanggil dua kali.
4. Langkah Perbaikan dan Implementasi
Perbaikan nyata membutuhkan tiga komponen utama:
- Sinkronisasi state queue: Tambahkan spinlock khusus yang membungkus panggilan
blk_mq_freeze_queuedanblk_mq_unfreeze_queue. - Validasi waiter: Cek flag sebelum memanggil
blk_mq_tag_clear_waitersagar tidak menghapus waiter ganda. - Rollback queue freeze: Pastikan setiap freeze memiliki pair unfreeze dan gunakan
WARN_ONjika terjadi imbalance.
Contoh patch singkat (disederhanakan):
static DEFINE_SPINLOCK(refreeze_lock);
void backend_freeze_queue(struct blk_mq_hw_ctx *hctx)
{
unsigned long flags;
spin_lock_irqsave(&refreeze_lock, flags);
if (!test_and_set_bit(BLK_MQ_HW_CTX_STATE_FROZEN, &hctx->state)) {
blk_mq_freeze_queue(hctx);
}
spin_unlock_irqrestore(&refreeze_lock, flags);
}
Dengan penguncian ini, hanya satu thread yang dapat memodifikasi state freeze sekaligus, mencegah waiter ganda.
5. Pencegahan Regresi dan Monitoring
Untuk menghindari regresi, terapkan langkah-langkah:
- Regression test: Buat suite automated yang menyalakan dan mematikan queue freeze dengan workload intensif (
fio+ simulated driver callbacks) untuk melihat responkmsg. - Monitoring: Tambahkan alert jika kernel log memunculkan
blk_mq_tag_clear_waitersatau panic trace serupa. - Tracing rutin: Gunakan eBPF metric probe pada handler queue freeze untuk memantau durasi freeze yang melebihi normal.
Dengan kombinasi observasi log runtime, regression test khusus, serta guard code di kernel, perbaikan ini bisa menjaga stabilitas backend storage di Hannah Montana Linux v26 sambil memberikan sinyal cepat bila ada perubahan perilaku.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!