1.外设异步通知CPU:外设发生了什么事情或者完成了什么任务或者有什么消息要告诉CPU,都可以异步给CPU发通知。例如,网卡收到了网络包,磁盘完成了IO任务,定时器的间隔时间到了,都可以给CPU发中断信号。 2.CPU之间发送消息:在SMP系统中,一个CPU想要给另一个CPU发送消息,可以给其发送IPI(处理器间中断)。 3.处理CPU异...
per_cpu(var, cpu) //获取per-cpu变量的值this_cpu_ptr(ptr) //获取当前per-cpu变量的地址 get_cpu_var(var) //获取当前per-cpu变量的值 get_cpu_ptr(var) //禁止抢占,并返回当前处理器变量的副本的地址 put_cpu_ptr(var) //开启抢占,这两个宏需要配对使用,以确保获取per-cpu变量时不会被其它进程...
___napi_schedule(this_cpu_ptr(&softnet_data), n); local_irq_restore(flags); } /* Called with irq disabled */ static inline void ___napi_schedule(struct softnet_data *sd, struct napi_struct *napi) { list_add_tail(&napi->poll_list, &sd->poll_list); __raise_softirq_irqoff(NET_R...
cpu)//获取per-cpu变量的值this_cpu_ptr(ptr)//获取当前per-cpu变量的地址get_cpu_var(var)//获取当前per-cpu变量的值get_cpu_ptr(var)//禁止抢占,并返回当前处理器变量的副本的地址put_cpu_ptr(var)//开启抢占,这两个宏需要配对使用,以确保获取per-cpu变量时不会被其它进程抢占get_cpu_var(var)//禁止...
考虑以下this_cpu操作: this_cpu_inc(x) 上述操作将产生以下单条指令(无lock前缀!): incgs:[x] 而不是如果没有段寄存器,则需要以下操作: int*y; intcpu; cpu = get_cpu(); y = per_cpu_ptr(&x, cpu); (*y)++; put_cpu(); 请注意,这些操作只能用于为特定处理器保留的per cpu数据。在周围代码...
8 local_lock_release(this_cpu_ptr(lock)); \ 9 migrate_enable(); \ 10 } while (0) 11 12 ... 13 #else 14 ... 15 #endif 16 17 #ifdef CONFIG_PREEMPT_RT 18 19 static inline void local_lock_release(local_lock_t *l) 20 { ...
!(gfp_flags & __GFP_COLD); again: if (likely(order == 0)) { struct per_cpu_pages *pcp; struct list_head *list; local_irq_save(flags); pcp = &this_cpu_ptr(zone->pageset)->pcp; list = &pcp->lists[migratetype]; if (list_empty(list)) { pcp->count += rmqueue_bulk(zone...
// __get_cpu_var 用于获取属于这个 CPU 的 structure softnet_data 变量 ___napi_schedule(this_cpu_ptr(&softnet_data), n); local_irq_restore(flags); } staticinlinevoid___napi_schedule(struct softnet_data *sd, struct napi_struct *napi) { ...
以qcom 8核armv8的SOC为例,把cpu本地定时器称为arch_timer,全局计数器System counter不需要专门的dts节点,配置如下: 1 2 3 4 5 6 7 8 9 arch_timer: timer { compatible = "arm,armv8-timer"; interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_LOW)>, ...
p->p_opptr=current; if(!(p->ptrace&PT_PTRACED)) p->p_pptr=current; } p->p_cptr=NULL; init_waitqueue_head(&p->wait_chldexit); p->vfork_sem=NULL; spin_lock_init(&p->alloc_lock); p->sigpending=0; init_sigpending(&p->pending); ...