|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 3/6] x86: collect CQM information from all sockets
>>> On 26.03.14 at 07:35, <dongxiao.xu@xxxxxxxxx> wrote:
> +static int select_socket_cpu(cpumask_t *cpu_bitmap)
> +{
> + int i;
unsigned int
> + unsigned int cpu;
> + int socket, socket_curr = cpu_to_socket(smp_processor_id());
> + cpumask_var_t sockets;
> +
> + if ( !zalloc_cpumask_var(&sockets) )
> + return -ENOMEM;
> +
> + if ( socket_curr >= 0 )
> + set_bit(socket_curr, sockets);
> +
> + cpumask_clear(cpu_bitmap);
> + for ( i = 0; i < NR_CPUS; i++ )
> + {
> + socket = cpu_to_socket(i);
> + if ( socket < 0 || test_and_set_bit(socket, sockets) )
> + continue;
> + cpu = cpumask_any(per_cpu(cpu_core_mask, i));
Is cpu_to_socket() guaranteed to return negative values for all
offline CPUs at all times? If not, the per_cpu() access may end
up being invalid.
And of course the test_and_set_bit() above can corrupt memory
for sparse socket maps (remember in particular that
alloc_cpumask_var() allocates nr_cpumask_bits bits, not NR_CPUS
of them).
> + case XEN_SYSCTL_getcqminfo:
> + {
> + struct cpuinfo_x86 *c = &boot_cpu_data;
This variable appears to be used just once, i.e. is rather pointless.
> + cpumask_var_t cpu_cqmdata_map;
> +
> + if ( !system_supports_cqm() )
> + {
> + ret = -ENODEV;
> + break;
> + }
> +
> + if ( !zalloc_cpumask_var(&cpu_cqmdata_map) )
> + {
> + ret = -ENOMEM;
> + break;
> + }
> +
> + ret = select_socket_cpu(cpu_cqmdata_map);
> + if ( ret < 0 )
> + {
> + free_cpumask_var(cpu_cqmdata_map);
> + break;
> + }
> +
> + get_cqm_info(cpu_cqmdata_map);
> +
> + sysctl->u.getcqminfo.socket_l3c_mfn =
> virt_to_mfn(cqm->socket_l3c_mfn);
> + sysctl->u.getcqminfo.rmid_dom_mfn = virt_to_mfn(cqm->rmid_to_dom);
> + sysctl->u.getcqminfo.nr_rmids = cqm->rmid_max + 1;
> + sysctl->u.getcqminfo.nr_sockets = cpumask_weight(cpu_cqmdata_map) +
> 1;
> + sysctl->u.getcqminfo.l3c_total = c->x86_cache_size;
Is this really always the L3 size (i.e. zero if there are only L1 and L2
caches)? Or does system_supports_cqm() imply this?
> --- a/xen/include/asm-x86/pqos.h
> +++ b/xen/include/asm-x86/pqos.h
> @@ -17,6 +17,8 @@
> #ifndef ASM_PQOS_H
> #define ASM_PQOS_H
> #include <xen/sched.h>
> +#include <xen/cpumask.h>
> +#include <public/domctl.h>
What is this second #include doing here?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |