并发、Grab、热插拔与电源管理
1. Core locks
input_mutex:全局 devices/handlers注册匹配;input_dev.mutex:open/close/flush、handles;event_lock:事件状态、frame和grab,spinlock;- RCU
grabpointer; - 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:
- 停止 IRQ/URB/poll;
- 标记/注销 input device;
- Core释放仍按下 keys并 disconnect handlers;
- evdev clients唤醒并看到设备消失;
- 等待 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周期。
正在加载留言…