自己调试的系统偶有死机,跟同事们一起琢磨的结果如下:在evdev.c文件中存在一个隐患的BUG。
static int evdev_open(struct inode *inode, struct file *file)
{
struct evdev *evdev;
struct evdev_client *client;
int i = iminor(inode) - EVDEV_MINOR_BASE;
int error;
if (i >= EVDEV_MINORS)
return -ENODEV;
error = mutex_lock_interruptible(&evdev_table_mutex);
if (error)
return error;
evdev = evdev_table[i];
if (evdev)
get_device(&evdev->dev);
mutex_unlock(&evdev_table_mutex);
if (!evdev)
return -ENODEV;
error = evdev_open_device(evdev);
if (error)
goto err_put_evdev;
client = kzalloc(sizeof(struct evdev_client), GFP_KERNEL);
if (!client) {
error = -ENOMEM;
goto err_put_evdev;
}
spin_lock_init(&client->buffer_lock);
wake_lock_init(&client->wake_lock, WAKE_LOCK_SUSPEND, evdev->name);
client->evdev = evdev;
evdev_attach_client(evdev, client);
error = evdev_open_device(evdev);
if (error)
goto err_put_evdev;
file->private_data = client;
return 0;
err_free_client:
evdev_detach_client(evdev, client);
kfree(client);
err_put_evdev:
put_device(&evdev->dev);
return error;
}
可能的问题在于:在wake_lock_init(&client->wake_lock, WAKE_LOCK_SUSPEND, evdev->name);中会把wake_lock插入到唤醒锁的链表中,如果在这个语句后面蓝色处还有导致err_free_client的发生,其里面有kfree(client)会把刚插入的那个wake_lock空间也释放,造成链表断裂,引起系统不稳定。所以要将可能导致goto err_put_evdev的evdev_open_device放在插入wake_lock之前,即红色处。
mark:以后测试机器有用
分享到:
相关推荐
Python库evdev是一个用于Linux设备输入事件的模块,它提供了对Linux输入子系统广泛的低级访问。这个0.3.3版本的库是为Python开发者设计的,让他们能够轻松地与各种输入设备交互,如键盘、鼠标、触摸屏等。在Linux...
资源分类:Python库 所属语言:Python 资源全名:evdev_prepared-0.2.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题中的"PyPI 官网下载 | evdev_prepared-0.2.2.tar.gz"表明这是一个在Python Package Index (PyPI)上发布的软件包,名为`evdev_prepared`,版本为0.2.2,且以tar.gz格式提供。PyPI是Python开发者发布和分享他们...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
`lua-evdev` 是一个专为Lua编程语言设计的模块,它允许程序员方便地与Linux系统的`/dev/input/event*`设备节点交互,用于处理来自各种输入设备(如键盘、鼠标、触摸屏等)的事件。`evdev`是Linux内核提供的一种接口...
官方离线安装包,亲测可用
官方离线安装包,亲测可用
The Xorg Evdev Driver package contains Generic Linux input driver for the Xorg X server. It handles keyboard, mouse, touchpads and wacom devices, though for touchpad and wacom advanced handling, ...
官方离线安装包,亲测可用
Vigilem::Evdev::Stat 确定evdev是否在这个系统上的状态安装 $ gem install vigilem-evdev-stat用法 require 'vigilem/evdev/stat' Vigilem :: Evdev :: Stat . default . available?
evdev 该软件包提供了对Linux中通用输入事件接口的绑定。 evdev接口用于将内核中生成的事件通过通常位于/dev/input/字符设备直接传递到用户空间。 该软件包还带有对uspace的绑定, uinput是用户空间输入子系统。 ...
对于其他平台,有一个后端将SDL2用于游戏手柄支持。 该模块提供的类可以: 从C ++和Qt Quick(QML)读取游戏控制器的输入事件(按钮和轴事件) 提供可查询的输入状态(通过处理事件) 提供按键绑定
戈朗·埃夫杰夫该软件包将Go语言绑定提供给Linux中的通用输入事件接口。 evdev接口用于将内核中生成的事件通过通常位于/ dev / input /中的字符设备直接传递到用户空间。 说明文件: 发展:
活动,从 evdev 输入设备读取事件并发布到路线。 版权所有 (C) 2015 Google Inc. 版权所有 (C) 2015 End Point Corporation 根据 Apache 许可,版本 2.0(“许可”)获得许可; 除非遵守许可,否则您不得使用此文件...
Liquid Galaxy Interactive Spaces 活动,可创建虚拟 evdev 输入设备并从路线合成输入事件。 版权所有 (C) 2015 Google Inc. 版权所有 (C) 2015 End Point Corporation 根据 Apache 许可,版本 2.0(“许可”)...
Linux输入子系统的流程结构图,给你一个对于Linux下的输入子系统一个清晰地认识。
Java包:com.endpoint.lg.evdev.demuxer Liquid Galaxy Interactive Spaces 活动,用于分离和聚合不同类型的输入事件。 版权所有 (C) 2015 Google Inc. 版权所有 (C) 2015 End Point Corporation 根据 Apache ...
EvDev:功能齐全的Dockerized开发环境
聊天板驱动程序 用纯 Python 编写的 Xbox 360 Chatpad 驱动程序,支持 USB-UART。 需要 python-evdev,目前只有 Py2。 包含一个键码-编码映射创建实用程序。
在这个层面上,系统通过`input_init`函数初始化,注册一个sysfs类,并创建`proc`虚拟文件系统中的相关目录,如"bus/input/devices"和"bus/input/handlers",便于管理和监控输入子系统。此外,核心层还会注册一个字符...