[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.