免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1793 | 回复: 0

[其他] 请问一个infiniband驱动的逻辑问题,请教高手 [复制链接]

论坛徽章:
0
发表于 2012-06-04 15:18 |显示全部楼层
/**
* 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;
}
按正常说,这段代码执行应该没有什么问题,atomic_read和atomic_cmpxchg都能执行成功。
但是为什么要用do while语句来实现呢?说明确实存在循环的可能吗?会不会出现死循环呢?
因为我在中断上下文执行的时候,出了一次NMI的WATCHDOG复位,也就是在中断中执行时间太长了,
会不会是这里在某种情况下死循环呢?如果不是,为什么这里要写出do while呢,完全可以用if啊!
(当然也有可能是执行中断中的其他部分代码的时间太长导致NMI复位的)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP