首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在内核中使用读写锁的死锁

在内核中使用读写锁的死锁
EN

Stack Overflow用户
提问于 2015-05-20 05:23:13
回答 1查看 395关注 0票数 1

我试图用读写文件操作编写一个简单的调试器。代码如下。

代码语言:javascript
运行
复制
static ssize_t foo_read(struct file *fp, char __user *user,
                     size_t size, loff_t *loff)
{
    ssize_t retval;

    up_read(&foo_sem);
    retval = simple_read_from_buffer(user, size, loff, fooBuffer,
                                   fooBufferSize);
    down_read(&foo_sem);
    return retval;
}

static ssize_t foo_write(struct file *fp, const char __user *data,
                            size_t size, loff_t *loff)
{
    ssize_t retval;

    pr_debug("foo Write Funcion data %s=,size=%zu\n", data, size);
    up_write(&foo_sem);
    retval = simple_write_to_buffer(fooBuffer, sizeof(fooBuffer)-1, loff,
                                            data, size);
    if (retval > 0) {
            fooBufferSize = size + *loff;
            fooBuffer[fooBufferSize] = '\0';
    }   
    down_write(&foo_sem);
    return retval;
}

并将读写锁初始化为

代码语言:javascript
运行
复制
 static DECLARE_RWSEM(foo_sem);

当我编译代码并在没有锁的情况下运行时,它可以正常工作。

但是,当我使用锁运行时,程序似乎被调度程序杀死了。

代码语言:javascript
运行
复制
[ 8640.104388] INFO: task a.out:6387 blocked for more than 120 seconds.
[ 8640.104398]       Tainted: G           OE  3.17.0-rc5+ #1
[ 8640.104402] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 8640.104407] a.out           D ffff88007fc14580     0  6387      1 0x00000004
[ 8640.104415]  ffff880075497df0 0000000000000002 ffff88007a0e9900 ffff880075497fd8
[ 8640.104422]  0000000000014580 0000000000014580 ffffffff81c1d480 ffff88007a0e9900
[ 8640.104428]  ffff88007a0e9900 ffffffffa013b018 ffffffffa013b000 ffffffff00000000
[ 8640.104434] Call Trace:
[ 8640.104450]  [<ffffffff8174a8a9>] schedule+0x29/0x70
[ 8640.104460]  [<ffffffff8174d62d>] rwsem_down_write_failed+0x1ed/0x390
[ 8640.104472]  [<ffffffff81381d03>] call_rwsem_down_write_failed+0x13/0x20
[ 8640.104482]  [<ffffffff8174cf7d>] ? down_write+0x2d/0x40
[ 8640.104492]  [<ffffffffa013906e>] foo_write+0x6e/0xa0 [firstmodule]
[ 8640.104503]  [<ffffffff811d42f7>] vfs_write+0xb7/0x1f0
[ 8640.104513]  [<ffffffff811d4e96>] SyS_write+0x46/0xb0
[ 8640.104523]  [<ffffffff8174f47f>] tracesys+0xe1/0xe6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-20 05:43:33

您正在反向使用updown操作。当您想要访问资源时调用down,然后在访问完成后调用up

例如:

代码语言:javascript
运行
复制
down_read(&foo_sem);
retval = simple_read_from_buffer(user, size, loff, fooBuffer,
                               fooBufferSize);
up_read(&foo_sem);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30340881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档