[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [PATCH] xentrace: correct overflow check for number of per-cpu trace pages
Thanks Olaf. Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> On Thu, 2011-04-14 at 16:31 +0100, Olaf Hering wrote: > # HG changeset patch > # User Olaf Hering <olaf@xxxxxxxxx> > # Date 1302794855 -7200 > # Node ID ceb2bbced07a03d938ff2f38ee6a5b88fa3f26ef > # Parent b5165fb66b56d9438d77b475eaa9db67318d1ea1 > xentrace: correct overflow check for number of per-cpu trace pages > > The calculated number of per-cpu trace pages is stored in t_info and > shared with tools like xentrace. Since its an u16 the value may overflow > because the current check is based on u32. > Using the u16 means each cpu could in theory use up to 256MB as trace > buffer. However such a large allocation will currently fail on x86 due > to the MAX_ORDER limit. > Check both max theoretical number of pages per cpu and max number of > pages reachable by struct t_buf->prod/cons variables with requested > number of pages. > > Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> > > diff -r b5165fb66b56 -r ceb2bbced07a xen/common/trace.c > --- a/xen/common/trace.c Thu Apr 14 14:57:24 2011 +0100 > +++ b/xen/common/trace.c Thu Apr 14 17:27:35 2011 +0200 > @@ -104,25 +104,33 @@ static void calc_tinfo_first_offset(void > * calculate_tbuf_size - check to make sure that the proposed size will fit > * in the currently sized struct t_info and allows prod and cons to > * reach double the value without overflow. > + * The t_info layout is fixed and cant be changed without breaking xentrace. > * Initialize t_info_pages based on number of trace pages. > */ > static int calculate_tbuf_size(unsigned int pages) > { > - struct t_buf dummy; > - typeof(dummy.prod) size; > + struct t_buf dummy_size; > + typeof(dummy_size.prod) max_size; > + struct t_info dummy_pages; > + typeof(dummy_pages.tbuf_size) max_pages; > unsigned int t_info_words; > > /* force maximum value for an unsigned type */ > - size = -1; > + max_size = -1; > + max_pages = -1; > > /* max size holds up to n pages */ > - size /= PAGE_SIZE; > - if ( pages > size ) > + max_size /= PAGE_SIZE; > + > + if ( max_size < max_pages ) > + max_pages = max_size; > + > + if ( pages > max_pages ) > { > printk(XENLOG_INFO "xentrace: requested number of %u pages " > "reduced to %u\n", > - pages, (unsigned int)size); > - pages = size; > + pages, max_pages); > + pages = max_pages; > } > > t_info_words = num_online_cpus() * pages * sizeof(uint32_t); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |