rte_atomic32_cmpse

技术文章 1年前 (2020) 完美者
360 0

标签:mic   div   基本概念   mem   一致性   队列   compare   临时   sign   

CAS
学习无锁队列前先看一个基本概念,CAS原子指令操作。

CAS(Compare and Swap,比较并替换)原子指令,用来保障数据的一致性。

指令有三个参数,当前内存值V、旧的预期值A、更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。

在DPDK中封装后的函数如下:

rte_atomic32_cmpset(&r->prod.head, *old_head, *new_head)
&r->prod.head指向当前内存值,*old_head为执行该操作前将r->prod.head存储到临时变量的值,*new_head为即将更新的值。

只有r->prod.head == *old_head才会将r->prod.head更新为*new_head

 

rte_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
{
        unsigned int ret = 0;

        asm volatile(
                        "\tlwsync\n"
                        "1:\tlwarx %[ret], 0, %[dst]\n"
                        "cmplw %[exp], %[ret]\n"
                        "bne 2f\n"
                        "stwcx. %[src], 0, %[dst]\n"
                        "bne- 1b\n"
                        "li %[ret], 1\n"
                        "b 3f\n"
                        "2:\n"
                        "stwcx. %[ret], 0, %[dst]\n"
                        "li %[ret], 0\n"
                        "3:\n"
                        "isync\n"
                        : [ret] "=&r" (ret), "=m" (*dst)
                        : [dst] "r" (dst),
                          [exp] "r" (exp),
                          [src] "r" (src),
                          "m" (*dst)
                        : "cc", "memory");

        return ret;
}

 

rte_atomic32_cmpse

标签:mic   div   基本概念   mem   一致性   队列   compare   临时   sign   

原文地址:https://www.cnblogs.com/dream397/p/13646492.html

版权声明:完美者 发表于 2020-09-17 20:57:35。
转载请注明:rte_atomic32_cmpse | 完美导航

暂无评论

暂无评论...