Skip to content

feat(liveness): make watchdog per-device via sysfs group#20

Closed
daeyeong-XCENA wants to merge 1 commit into
mainfrom
dylee/feat/per-device-liveness-sysfs
Closed

feat(liveness): make watchdog per-device via sysfs group#20
daeyeong-XCENA wants to merge 1 commit into
mainfrom
dylee/feat/per-device-liveness-sysfs

Conversation

@daeyeong-XCENA

@daeyeong-XCENA daeyeong-XCENA commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

배경 및 동기

현재 liveness watchdog 설정에 세 가지 문제가 있습니다.

  1. 전역 on/offliveness_enable이 전역 module_param이라 드라이버에 bound된 모든 device에 일괄 적용됩니다. device별로 켜고 끌 수 없습니다.
  2. FW 혼재 fleet에서 위험 — watchdog은 ping-capable FW에서만 동작하는데 FW version은 device마다 다릅니다. 전역으로 켜면 ping 못 하는 구형 FW device가 pong 무응답 → false DEAD 판정 → 정상 transfer를 -EIO로 실패시킵니다.
  3. timing도 전역stall_ms/dead_ms/max_mult가 전역이라 device별 FW 응답 특성 차이를 반영할 수 없고, state 조회는 MX_IOCTL_GET_LIVENESS ioctl로 따로 나가 있습니다.

이 PR은 liveness 설정·상태를 per-device sysfs group으로 재구성해, host 서비스가 device별 FW 판단(ping 지원 여부)에 따라 켜고 튜닝하도록 합니다.

설계 변경점

Before:  /sys/module/mx_dma/parameters/liveness_enable   (전역 1값, 전 device)
                                        liveness_stall_ms
                                        liveness_dead_ms
                                        liveness_max_mult
         ioctl MX_IOCTL_GET_LIVENESS                       (state 조회)

After:   /sys/class/mx_dma/mx_dma<N>_ioctl/liveness/       (device별)
             enable stall_ms dead_ms max_mult   (RW)
             health rtt_ns                       (RO)
  • config/state가 device별 liveness/ group 한 곳에 응집.
  • enablemx_pci_dev 필드로, hot-path reader는 q->mx_pdev 역포인터로 접근.
  • 기본 off, 기본값은 named const로 probe 시 seed.

상세 구현 내용

  • flag를 mx_pci_dev에 배치 (mx_queue 아님): sysfs store가 mx_pdev 수명에 묶여 io_queue 재init/teardown race를 피함.
  • ioctl 노드 + named group liveness/: device_create_with_groups로 uevent 전에 생성돼 udev가 인지. 아직 미release라 group화가 지금은 ABI 비용 0.
  • timing도 per-device: 기능 존재 이유 자체가 device별 FW 차이 → dead_ms/stall_ms/max_mult도 per-device가 일관적.
  • MX_IOCTL_GET_LIVENESS ioctl 제거: sysfs health/rtt_ns로 대체, 소비자 없음 → 단일 소스.
  • toggle 시 sq_lock 잡고 watchdog state 리셋: enable 시 stale DEAD 방지, disable 시 UNKNOWN.

테스트

  • 빌드: CXL 기본 + WO_CXL=1 두 config 클린 (경고 0).
  • 런타임(emulator) 검증: 별도.

변경 파일: init.c(sysfs group), core_common.c·transfer.c(per-device read), ioctl.c·trace.h(ioctl 제거), mx_dma.h(필드), core_v1.c·core_v2.c(역포인터).

소비 repo용 연동 가이드 docs/liveness.md / docs/liveness.ko.md를 작성했으나 이 PR엔 미포함(별도 전달).

📦 Release Note

-

Replace the global liveness_* module params with per-device fields on
mx_pci_dev, exposed under a liveness/ sysfs group on the ioctl node
(enable/stall_ms/dead_ms/max_mult RW, health/rtt_ns RO). A host service
enables and tunes the watchdog per device on ping-capable FW. Drop the
redundant MX_IOCTL_GET_LIVENESS ioctl; sysfs is the single source.
@daeyeong-XCENA daeyeong-XCENA deleted the dylee/feat/per-device-liveness-sysfs branch July 6, 2026 07:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant