Commit 7bb79775 authored by Ye Bin's avatar Ye Bin Committed by Will Deacon
Browse files

arm64/cpuinfo: only show one cpu's info in c_show()



Currently, when ARM64 displays CPU information, every call to c_show()
assembles all CPU information. However, as the number of CPUs increases,
this can lead to insufficient buffer space due to excessive assembly in
a single call, causing repeated expansion and multiple calls to c_show().

To prevent this invalid c_show() call, only one CPU's information is
assembled each time c_show() is called.

Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
Link: https://lore.kernel.org/r/20250421062947.4072855-1-yebin@huaweicloud.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 83a39ecc
Loading
Loading
Loading
Loading
+53 −54
Original line number Diff line number Diff line
@@ -209,11 +209,10 @@ static const char *const compat_hwcap2_str[] = {

static int c_show(struct seq_file *m, void *v)
{
	int i, j;
	int j;
	int cpu = m->index;
	bool compat = personality(current->personality) == PER_LINUX32;

	for_each_online_cpu(i) {
		struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
	struct cpuinfo_arm64 *cpuinfo = v;
	u32 midr = cpuinfo->reg_midr;

	/*
@@ -221,7 +220,7 @@ static int c_show(struct seq_file *m, void *v)
	 * online processors, looking for lines beginning with
	 * "processor".  Give glibc what it expects.
	 */
		seq_printf(m, "processor\t: %d\n", i);
	seq_printf(m, "processor\t: %d\n", cpu);
	if (compat)
		seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
			   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);
@@ -265,24 +264,24 @@ static int c_show(struct seq_file *m, void *v)

	seq_printf(m, "CPU implementer\t: 0x%02x\n",
		   MIDR_IMPLEMENTOR(midr));
		seq_printf(m, "CPU architecture: 8\n");
	seq_puts(m, "CPU architecture: 8\n");
	seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr));
	seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr));
	seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
	}

	return 0;
}

static void *c_start(struct seq_file *m, loff_t *pos)
{
	return *pos < 1 ? (void *)1 : NULL;
	*pos = cpumask_next(*pos - 1, cpu_online_mask);
	return *pos < nr_cpu_ids ? &per_cpu(cpu_data, *pos) : NULL;
}

static void *c_next(struct seq_file *m, void *v, loff_t *pos)
{
	++*pos;
	return NULL;
	return c_start(m, pos);
}

static void c_stop(struct seq_file *m, void *v)