死锁了,发生原因不明
自己写了一个CAN驱动。fops的read如下:
static ssize_t mcp251x_read(struct file *file, char __user *buf, size_t count, loff_t *ofs) { struct mcp251x *chip = file->private_data; struct can_frame *frame; if (count != sizeof(struct can_frame)) return -EINVAL; if (down_interruptible(&chip->rxblock)) return -ERESTARTSYS; while (chip->rxbin == chip->rxbout) { up(&chip->rxblock); if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (wait_event_interruptible(chip->wq, (chip->rxbin != chip->rxbout))) return -ERESTARTSYS; if (down_interruptible(&chip->rxblock)) return -ERESTARTSYS; } frame = &chip->rxb[chip->rxbout]; if (copy_to_user(buf, frame, sizeof(struct can_frame))) { up(&chip->rxblock); return -EFAULT; } chip->rxbout++; if(chip->rxbout >= MCP251X_BUF_LEN) chip->rxbout = 0; up(&chip->rxblock); return count; } |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
http://dev.yesky.com/336/2628336.shtml
即交换wait_event_interruptible(outq, flag != 0)和down_interruptible(&sem)的顺序,这个驱动程序将变得不可运行。实际上,当两个可能要阻塞的事件同时出现时,即两个wait_event或down摆在一起的时候,将变得非常危险,死锁的可能性很大,这个时候我们要特别留意它们的出现顺序。当然,我们应该尽可能地避免这种情况的发生!
学习中……