linux怎么安装smp系统,linux SMP系统学习笔记

本文详细解析了smp_call_function_single函数的工作原理,该函数用于在一个特定的CPU上执行指定函数。通过分析源码,介绍了如何将任务挂载到call_single_queue队列并触发IPI中断以执行目标函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,一个cpu在另外一个cpu上运行指定的函数

int smp_call_function_single(int cpu, smp_call_func_t func, void *info, int wait)

smp_call_function_single()函数,在一个指导的cpu上运行一个函数。

} else {

if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {

struct call_single_data *csd = &d; //系统中每个CPU都有一个struct call_single_data结构

if (!wait)

csd = &__get_cpu_var(csd_data);

csd_lock(csd);

csd->func = func;

csd->info = info;

generic_exec_single(cpu, csd, wait); //挂到每cpu队列call_single_queue中,并向指定cpu发送IPI中断

} else {

err = -ENXIO; /* CPU not online */

}

}

void generic_exec_single(int cpu, struct call_single_data *csd, int wait)

{

//找到要运行该func的cpu的每cpu变量call_single_queue队列

struct call_single_queue *dst = &per_cpu(call_single_queue, cpu);

unsigned long flags;

int ipi;

raw_spin_lock_irqsave(&dst->lock, flags);

ipi = list_empty(&dst->list);//if empty return 1

//把该csd结构挂入每cpu变量call_single_queue队列尾部

list_add_tail(&csd->list, &dst->list);

raw_spin_unlock_irqrestore(&dst->lock, flags);

//队列为空,就向该cpu发送IPI中断,让其读取其每cpu队列call_single_queue上的csd结构,进而去执行func函数

if (ipi)

arch_send_call_function_single_ipi(cpu);

//若设置了等待标志,则进行等待

if (wait)

csd_lock_wait(csd);

}

static void csd_lock_wait(struct call_single_data *csd)

{

//若csd标志设置了CSD_FLAG_LOCK位,则在这里循环等待。前边并没有设置该标志

while (csd->flags & CSD_FLAG_LOCK)

cpu_relax();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值