mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xentrace: handle sparse cpu ids correctly in xen trace buffer handling
The per-cpu buffers for Xentrace are addressed by cpu-id, but the info array for the buffers is sized only by number of online cpus. This might lead to crashes when using Xentrace with smt=0. The t_info structure has to be sized based on nr_cpu_ids. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
1 parent
28a936790c
commit
74584a3670
2 files changed
+5
-5
No files matched your search
@@ -600,7 +600,7 @@ static unsigned int get_num_cpus(void)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return physinfo.nr_cpus;
|
||||
return physinfo.max_cpu_id + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+4
-4
@@ -113,7 +113,7 @@ static int calculate_tbuf_size(unsigned int pages, uint16_t t_info_first_offset)
|
||||
struct t_info dummy_pages;
|
||||
typeof(dummy_pages.tbuf_size) max_pages;
|
||||
typeof(dummy_pages.mfn_offset[0]) max_mfn_offset;
|
||||
unsigned int max_cpus = num_online_cpus();
|
||||
unsigned int max_cpus = nr_cpu_ids;
|
||||
unsigned int t_info_words;
|
||||
|
||||
/* force maximum value for an unsigned type */
|
||||
@@ -149,13 +149,13 @@ static int calculate_tbuf_size(unsigned int pages, uint16_t t_info_first_offset)
|
||||
|
||||
/*
|
||||
* NB this calculation is correct, because t_info_first_offset is
|
||||
* in words, not bytes, not bytes
|
||||
* in words, not bytes
|
||||
*/
|
||||
t_info_words = num_online_cpus() * pages + t_info_first_offset;
|
||||
t_info_words = nr_cpu_ids * pages + t_info_first_offset;
|
||||
t_info_pages = PFN_UP(t_info_words * sizeof(uint32_t));
|
||||
printk(XENLOG_INFO "xentrace: requesting %u t_info pages "
|
||||
"for %u trace pages on %u cpus\n",
|
||||
t_info_pages, pages, num_online_cpus());
|
||||
t_info_pages, pages, nr_cpu_ids);
|
||||
return pages;
|
||||
}
|
||||
|
||||
|
||||