arch/um/kernel/smp.c

Source file repositories/reference/linux-study-clean/arch/um/kernel/smp.c

File Facts

System
Linux kernel
Corpus path
arch/um/kernel/smp.c
Extension
.c
Size
4929 bytes
Lines
243
Domain
Architecture Layer
Bucket
arch/um
Inferred role
Architecture Layer: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

if (err) {
			pr_crit("CPU#%d failed to start cpu thread, err = %d",
				cpu, err);
			continue;
		}

		deadline = jiffies + msecs_to_jiffies(1000);
		spin_until_cond(cpu_present(cpu) ||
				time_is_before_jiffies(deadline));

		if (!cpu_present(cpu))
			pr_crit("CPU#%d failed to boot\n", cpu);
	}
}

int __cpu_up(unsigned int cpu, struct task_struct *tidle)
{
	cpu_tasks[cpu] = tidle;
	smp_wmb(); /* paired with smp_rmb() in uml_start_secondary() */
	cpu_states[cpu] = UML_CPU_RUNNING;
	os_futex_wake(&cpu_states[cpu]);
	spin_until_cond(cpu_online(cpu));

	return 0;
}

void __init smp_cpus_done(unsigned int max_cpus)
{
}

/* Set in uml_ncpus_setup */
int uml_ncpus = 1;

void __init prefill_possible_map(void)
{
	int cpu;

	for (cpu = 0; cpu < uml_ncpus; cpu++)
		set_cpu_possible(cpu, true);
	for (; cpu < NR_CPUS; cpu++)
		set_cpu_possible(cpu, false);
}

static int __init uml_ncpus_setup(char *line, int *add)
{
	*add = 0;

	if (kstrtoint(line, 10, &uml_ncpus)) {
		os_warn("%s: Couldn't parse '%s'\n", __func__, line);
		return -1;
	}

	uml_ncpus = clamp(uml_ncpus, 1, NR_CPUS);

	return 0;
}

__uml_setup("ncpus=", uml_ncpus_setup,
"ncpus=<# of desired CPUs>\n"
"    This tells UML how many virtual processors to start. The maximum\n"
"    number of supported virtual processors can be obtained by querying\n"
"    the CONFIG_NR_CPUS option using --showconfig.\n\n"
);

EXPORT_SYMBOL(uml_curr_cpu);

Annotation

Implementation Notes