[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 4/7] x86: collect CQM information from all sockets
On 28/01/14 14:23, Xu, Dongxiao wrote: > >>> + case XEN_SYSCTL_getcqminfo: >>> + { >>> + struct xen_socket_cqmdata *info; >>> + uint32_t num_sockets; >>> + uint32_t num_rmids; >>> + cpumask_t cpu_cqmdata_map; >> Unless absolutely avoidable, not CPU masks on the stack please. > Okay, will allocate it by "xzalloc" function. cpumask_var_t mask; {z}alloc_cpumask_var(&mask); ... free_cpumask_var(mask); This will switch between a long on the stack and an allocated structure depending on whether Xen is compiled with fewer or more than 64 pcpu. > >>> + >>> + if ( !system_supports_cqm() ) >>> + { >>> + ret = -ENODEV; >>> + break; >>> + } >>> + >>> + select_socket_cpu(&cpu_cqmdata_map); >>> + >>> + num_sockets = min((unsigned >> int)cpumask_weight(&cpu_cqmdata_map) + 1, >>> + sysctl->u.getcqminfo.num_sockets); >>> + num_rmids = get_cqm_count(); >>> + info = xzalloc_array(struct xen_socket_cqmdata, >>> + num_rmids * num_sockets); >> While unlikely right now, you ought to consider the case of this >> multiplication overflowing. >> >> Also - how does the caller know how big the buffer needs to be? >> Only num_sockets can be restricted by it... >> >> And what's worse - you allow the caller to limit num_sockets and >> allocate info based on this limited value, but you don't restrict >> cpu_cqmdata_map to just the socket covered, i.e. if the caller >> specified a lower number, then you'll corrupt memory. > Currently the caller (libxc) sets big num_rmid and num_sockets which are the > maximum values that could be available inside the hypervisor. > If you think this approach is not enough to ensure the security, what about > the caller (libxc) issue an hypercall to get the two values from hypervisor, > then allocating the same size of num_rmid and num_sockets? > >> And finally, I think the total size of the buffer here can easily >> exceed a page, i.e. this then ends up being a non-order-0 >> allocation, which may _never_ succeed (i.e. the operation is >> then rendered useless). I guest it'd be better to e.g. vmap() >> the MFNs underlying the guest buffer. > Do you mean we check the size of the total size, and allocate MFNs one by > one, then vmap them? I still think this is barking mad as a method of getting this quantity of data from Xen to the toolstack in a repeated fashon. Xen should allocate a per-socket buffer at the start of day (or perhaps on first use of CQM), and the CQM monitoring tool gets to map those per-socket buffers read-only. This way, all processing of the CQM data happens in dom0 userspace, not in Xen in hypercall context; All Xen has to do is periodically dump the MSRs into the pages. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |