vmalloc_init()函数中的for_each_possible_cpu宏,代码仅在一个cpu中运行吗?还是每个cpu中?

陈金

这与编程无关,但是我在这里问..在linux start_kernel()函数中,在mm_init()函数中,我看到了vmalloc_init()函数。在函数内部,我看到这样的代码。

void __init vmalloc_init(void)
{
    struct vmap_area *va;
    struct vm_struct *tmp;
    int i;
        
    /*  
     * Create the cache for vmap_area objects.
     */
    vmap_area_cachep = KMEM_CACHE(vmap_area, SLAB_PANIC);

    for_each_possible_cpu(i) {
        struct vmap_block_queue *vbq;
        struct vfree_deferred *p;
                    
        vbq = &per_cpu(vmap_block_queue, i);
        spin_lock_init(&vbq->lock);
        INIT_LIST_HEAD(&vbq->free);
        p = &per_cpu(vfree_deferred, i);
        init_llist_head(&p->list);
        INIT_WORK(&p->wq, free_work);
    }

    /* Import existing vmlist entries. */
    for (tmp = vmlist; tmp; tmp = tmp->next) {
        va = kmem_cache_zalloc(vmap_area_cachep, GFP_NOWAIT);
        if (WARN_ON_ONCE(!va))
            continue;

        va->va_start = (unsigned long)tmp->addr;
        va->va_end = va->va_start + tmp->size;
        va->vm = tmp;
        insert_vmap_area(va, &vmap_area_root, &vmap_area_list);
    }

    /*
     * Now we can initialize a free vmap space.
     */
    vmap_init_free_space();
    vmap_initialized = true;
}

我不确定此代码是在每个cpu(core)上运行还是仅在第一个cpu上运行?
如果此代码在每个smp内核上运行,则for_each_possible_cpu循环中的此代码如何运行?
smp设置似乎在此功能之前完成。

伊恩·雅培(Ian Abbott)

start_kernel()通话mm_init()通话vmalloc_init()此时,只有第一个(引导)CPU处于活动状态。后来,start_kernel()呼叫arch_call_rest_init()该电话rest_init()

rest_init()使用入口点为init任务创建一个内核线程kernel_init()kernel_init()来电kernel_init_freeable()kernel_init_freeable()最终调用smp_init()以激活剩余的CPU。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档