并发、Grab、热插拔与电源管理

并发、Grab、热插拔与电源管理

1. Core locks

  • input_mutex:全局 devices/handlers注册匹配;
  • input_dev.mutex:open/close/flush、handles;
  • event_lock:事件状态、frame和grab,spinlock;
  • RCU grab pointer;
  • handler/client自身锁。

锁顺序不能随意反转,event callback不能睡眠。

2. IRQ路径

input_report_*() 可从 IRQ调用。Core在 event_lock下更新状态并调用 handler,因此 handler event/events/filter 必须快速且不可睡眠。evdev只入 ring并唤醒。

3. Filter

filter handler先看到事件,可消耗/修改分发决策。普通 handlers随后接收批量 values。filter不是用户态安全过滤机制,而是内核 handler语义。

4. Grab

grab使一个 handle成为唯一事件接收者。Core用 RCU访问 grab。释放、disconnect和close必须确保悬空引用不可发生。

5. 热拔

USB/HID或 I2C设备 remove:

  1. 停止 IRQ/URB/poll;
  2. 标记/注销 input device;
  3. Core释放仍按下 keys并 disconnect handlers;
  4. evdev clients唤醒并看到设备消失;
  5. 等待 refcount后释放。

用户打开 fd不会保证硬件永远存在。

6. Inhibit

sysfs inhibited 可停用 device:

  • close driver;
  • Core忽略新事件;
  • uninhibit时重新 open。

适合 temporarily disable设备,不等于解绑 driver。

7. Suspend

Input device PM根据 may_wakeup/inhibited/users切换:

  • non-wakeup device可 close;
  • wakeup key保留 IRQ;
  • resume恢复 open和状态;
  • freeze/poweroff路径不同。

具体 bus driver还要处理 regulator、reset、pinctrl和 IRQ wake。

8. 残留状态

disconnect/reset时 Core可释放按下 keys。触摸 driver还应清空所有 slots。否则 userspace可能保持 stuck key/contact。

9. Timer/work

常见:

  • key debounce timer;
  • ADC poller;
  • IR release timer/tasklet;
  • touch ESD work;
  • FF timer。

remove必须使用同步 cancel/delete,且不在持有回调所需锁时等待。

10. Latency

链路延迟来自采样周期、IRQ thread、bus transaction、Core、evdev wakeup和 userspace调度。仅提高应用优先级无法消除 100ms ADC poll周期。

文章互动

阅读 --

留言

0 条留言

正在加载留言…