x86/proc: fix /proc/cpuinfo cpu offline bug
Impact: fix missing CPUs in /proc/cpuinfo after CPU hotunplug/hotreplug In my test, I found that if a cpu has been offline, the next cpus may not be shown in the /proc/cpuinfo. if one read() cannot consume the whole /proc/cpuinfo, c_start() will be called again in the next read() calls. And *pos has been increased by 1 by the caller(seq_read()). if this time the cpu#*pos is offline, c_start() will return NULL, and the next cpus can not be shown. this fix use next_cpu_nr(*pos - 1, cpu_online_map) to search the next unshown cpu. the most easy way to reproduce this bug: 1) offline cpu#1 (cpu#0 is online) 2) dd ibs=2 if=/proc/cpuinfo the result is that only cpu#0 is shown. cpu#2 and cpu#3 .... cannot be shown in /proc/cpuinfo it's bug. Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
35af28219e
commit
bc8bcc79ea
|
@ -160,14 +160,16 @@ static void *c_start(struct seq_file *m, loff_t *pos)
|
||||||
{
|
{
|
||||||
if (*pos == 0) /* just in case, cpu 0 is not the first */
|
if (*pos == 0) /* just in case, cpu 0 is not the first */
|
||||||
*pos = first_cpu(cpu_online_map);
|
*pos = first_cpu(cpu_online_map);
|
||||||
if ((*pos) < nr_cpu_ids && cpu_online(*pos))
|
else
|
||||||
|
*pos = next_cpu_nr(*pos - 1, cpu_online_map);
|
||||||
|
if ((*pos) < nr_cpu_ids)
|
||||||
return &cpu_data(*pos);
|
return &cpu_data(*pos);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||||
{
|
{
|
||||||
*pos = next_cpu(*pos, cpu_online_map);
|
(*pos)++;
|
||||||
return c_start(m, pos);
|
return c_start(m, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue