__mmc_claim_host

本文探讨了Linux内核中SD卡控制器的竞争机制,详细解释了__mmc_claim_host函数如何解决多个进程异步访问SD卡导致的问题。通过该机制确保临界资源的正确使用。
int __mmc_claim_host(struct mmc_host *host, atomic_t *abort)
{
    DECLARE_WAITQUEUE(wait, current);
    //初始化一个等待节点
    unsigned long flags;
    int stop;

    might_sleep();

    add_wait_queue(&host->wq, &wait);
    //当前进程进入等待队列
    spin_lock_irqsave(&host->lock, flags);
    while (1) {
        set_current_state(TASK_UNINTERRUPTIBLE);
        //wake_up才能唤醒
        stop = abort ? atomic_read(abort) : 0;
        //stop=0
        if (stop || !host->claimed || host->claimer == current)
            //分别为终止,host可用,拥有host的是当前线程,然后就不需要睡眠了
            break;
        spin_unlock_irqrestore(&host->lock, flags);
        schedule();
        //调度,因为没有获得控制器使用权
        //stop一直为0,因为只有一个卡,没有冲突
        spin_lock_irqsave(&host->lock, flags);
    }
    set_current_state(TASK_RUNNING);
    if (!stop) {
        host->claimed = 1;
        host->claimer = current;
        host->claim_cnt += 1;
    } else
        wake_up(&host->wq);
    //唤醒工作队列,这个放的位置是不是有点问题啊
    spin_unlock_irqrestore(&host->lock, flags);
    remove_wait_queue(&host->wq, &wait);
    //从等待队列中释放
    if (!stop)
        mmc_host_enable(host);
    //获取控制器使用权
    return stop;
}
这是请求占用sd卡控制器的函数,如果sd卡正在被使用,此进程就切换出去,如果没有就获得sd卡使用权。那么为什么会出现这样的问题呢?
按常理,sd卡作为临界资源,不会有两个进程同时访问的,在linux内核进程调度的时候已经考虑了,怎么还有这样的问题呢?
原因就是:使用sd卡的进程1在进入系统调用后就睡眠了,属于异步占用临界资源,进入系统调用后,控制sd卡,并使用dma搬运数据,此时cpu是空闲的,所以就睡眠,让其他进程运行,
提高使用率。此时控制着sd卡的进程还是进程1,属于进程1上下文。
问题是:如果这时候运行的进程2也进入了系统调用并且访问sd卡,怎么办?如果进程1一直在运行是没有这样的问题的。为了解决这样的问题,就有了上面的函数__mmc_claim_host
这说明了,在内核中进程上下文中是存在抢占的,临界资源的使用是可以异步的,所以要注意保护好临界资源。像一些字符设备,读的时候进程是不会睡眠的,属于同步,不会有上述的问题。
疑问:__mmc_claim_host可不可以做出自旋锁一样的效果,在进程1读取文件数据较少的时候,就不用切换进程了呢?

 

转载于:https://www.cnblogs.com/autum/archive/2013/03/15/mmc_claim_host.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值