亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2038 | 回復(fù): 6
打印 上一主題 下一主題

請(qǐng)問一個(gè)驅(qū)動(dòng)代碼邏輯問題,高手請(qǐng)進(jìn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-06-04 15:16 |只看該作者 |倒序?yàn)g覽
/**
* srpt_set_cmd_state() - Set the state of a SCSI command.
* @new: New state to be set.
*
* Does not modify the state of aborted commands. Returns the previous command
* state.
*/
enum srpt_command_state srpt_set_cmd_state(struct srpt_ioctx *     ioctx,
                                                  enum srpt_command_state new)
{
    enum srpt_command_state previous;

    BUG_ON(!ioctx);
    WARN_ON(new == SRPT_STATE_NEW);

    do
    {
        previous = atomic_read(&ioctx->state);
    } while ((previous != SRPT_STATE_DONE)
             && atomic_cmpxchg(&ioctx->state, previous, new) != previous);

    return previous;
}
按正常說,這段代碼執(zhí)行應(yīng)該沒有什么問題,atomic_read和atomic_cmpxchg都能執(zhí)行成功。
但是為什么要用do while語句來實(shí)現(xiàn)呢?說明確實(shí)存在循環(huán)的可能嗎?會(huì)不會(huì)出現(xiàn)死循環(huán)呢?
因?yàn)槲以谥袛嗌舷挛膱?zhí)行的時(shí)候,出了一次NMI的WATCHDOG復(fù)位,也就是在中斷中執(zhí)行時(shí)間太長(zhǎng)了,
會(huì)不會(huì)是這里在某種情況下死循環(huán)呢?如果不是,為什么這里要寫出do while呢,完全可以用if啊!
(當(dāng)然也有可能是執(zhí)行中斷中的其他部分代碼的時(shí)間太長(zhǎng)導(dǎo)致NMI復(fù)位的)

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [報(bào)告]
發(fā)表于 2012-06-04 15:26 |只看該作者
看不懂,但 cmpxchg 和 循環(huán) 是一對(duì)好基友,達(dá)到非鎖原子操作

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-06-04 15:29 |只看該作者
謝謝樓上的回復(fù),但是這里貌似已經(jīng)調(diào)用的是atomic_cmpxchg!為什么還要循環(huán)呢,奇怪了

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-06-04 15:34 |只看該作者
(previous != SRPT_STATE_DONE)不用管它,這個(gè)表示如果讀出來是處于done的狀態(tài)的話,就直接退出了,不在去改變它的狀態(tài)
那就相當(dāng)于變成:
    do
    {
        previous = atomic_read(&ioctx->state);
    } while ( atomic_cmpxchg(&ioctx->state, previous, new) != previous);
先原子讀該狀態(tài),然后傳入atomic_cmpxchg函數(shù),該函數(shù)會(huì)重新讀ioctx->state得狀態(tài),然后和previous比較,如果相等,就修改
為新的狀態(tài)new,并且返回舊有的狀態(tài)(即previous)。
這樣看起來兩次都讀的同一個(gè)變量,肯定相等了,然后肯定就會(huì)修改為new的狀態(tài),并返回previous的狀態(tài),應(yīng)該是一次就可以執(zhí)行成功啊
為什么需要do while的循環(huán)呢?

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [報(bào)告]
發(fā)表于 2012-06-04 15:46 |只看該作者
仔細(xì)看了一下
關(guān)于你的問題,這正是需要atomic的地方,因?yàn)榭赡芏鄠(gè)進(jìn)程在同時(shí)操作,atomic_read 和 atomic_cmpxchg 之間,可能被別的進(jìn)程給 atomic_cmpxchg 了。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-06-04 15:53 |只看該作者
回復(fù) 5# bruceteen


    謝謝,我看內(nèi)核里面也有許多類似的應(yīng)用
/**
*        sysfs_get_active - get an active reference to sysfs_dirent
*        @sd: sysfs_dirent to get an active reference to
*
*        Get an active reference of @sd.  This function is noop if @sd
*        is NULL.
*
*        RETURNS:
*        Pointer to @sd on success, NULL on failure.
*/
static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
{
        if (unlikely(!sd))
                return NULL;

        while (1) {
                int v, t;

                v = atomic_read(&sd->s_active);
                if (unlikely(v < 0))
                        return NULL;

                t = atomic_cmpxchg(&sd->s_active, v, v + 1);
                if (likely(t == v))
                        return sd;
                if (t < 0)
                        return NULL;

                cpu_relax();
        }
}
可以看到if (likely(t == v)),既然都likely了,說明一般情況下應(yīng)該是都能成功的對(duì)吧!那應(yīng)該是不會(huì)出現(xiàn)死循環(huán)的,即使有兩個(gè)線程在操作這個(gè)原子變量,應(yīng)該
不可能剛好大家都在死循環(huán)來修改這個(gè)值吧!

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [報(bào)告]
發(fā)表于 2012-06-04 16:05 |只看該作者
不會(huì)死循環(huán)的,總會(huì)有一個(gè)進(jìn)程通過
就像一群人不排隊(duì)上廁所一樣,馬桶不可能空著,即需要上廁所的人數(shù)會(huì)一直減少,不會(huì)有人永遠(yuǎn)上不了廁所
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP