raw_spin_lock_irqsave() flow

raw_spin_lock_irqsave() flow

include/linux/spinlock.h

#define raw_spin_lock_irqsave(lock, flags)            \
    do {                        \
        typecheck(unsigned long, flags);    \
        flags = _raw_spin_lock_irqsave(lock);    \
    } while (0)

static inline unsigned long __raw_spin_lock_irqsave(raw_spinlock_t *lock)

static inline void
do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock)
{
    __acquire(lock);
    arch_spin_lock_flags(&lock->raw_lock, *flags);
}

 

上面raw_lock是:

arch_spinlock_t raw_lock;

arch_spinlock_t为qspinlock:

复制代码
typedef struct qspinlock {
    union {
        atomic_t val;

        /*
         * By using the whole 2nd least significant byte for the
         * pending bit, we can allow better optimization of the lock
         * acquisition for the pending bit holder.
         */
#ifdef __LITTLE_ENDIAN
        struct {
            u8    locked;
            u8    pending;
        };
        struct {
            u16    locked_pending;
            u16    tail;
        };
#else
        struct {
            u16    tail;
            u16    locked_pending;
        };
        struct {
            u8    reserved[2];
            u8    pending;
            u8    locked;
        };
#endif
    };
} arch_spinlock_t;
复制代码

 

上面arch_spin_lock_flags define为arch_spin_lock(),这个define在qspinlock.h

#ifndef arch_spin_lock_flags
#define arch_spin_lock_flags(lock, flags)    arch_spin_lock(lock)
#endif

 

4.19\include\asm-generic\Qspinlock.h

#define arch_spin_lock(l)        queued_spin_lock(l)

 

posted @   aspirs  阅读(373)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2018-09-30 集合竞价的基本过程
点击右上角即可分享
微信分享提示