From: Chao Peng <chao.p.peng@linux.intel.com>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: keir@xen.org, Ian.Campbell@citrix.com,
stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com,
dario.faggioli@citrix.com, Ian.Jackson@eu.citrix.com,
xen-devel@lists.xen.org, will.auld@intel.com, JBeulich@suse.com,
wei.liu2@citrix.com, dgdegra@tycho.nsa.gov
Subject: Re: [PATCH v10 01/13] x86: add socket_cpumask
Date: Wed, 8 Jul 2015 10:43:48 +0800 [thread overview]
Message-ID: <20150708024348.GB3333@pengc-linux.bj.intel.com> (raw)
In-Reply-To: <559C5397.4090606@oracle.com>
On Tue, Jul 07, 2015 at 06:32:55PM -0400, Boris Ostrovsky wrote:
> On 06/26/2015 04:43 AM, Chao Peng wrote:
> >Maintain socket_cpumask which contains all the HT and core siblings
> >in the same socket.
> >
> >Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com>
> >Acked-by: Jan Beulich <jbeulich@suse.com>
> >---
> >Changes in v9:
> >* Add comments for set_nr_sockets.
> >* Move set_nr_sockets() invocation from __start_xen() to smp_prepare_cpus().
> >Changes in v8:
> >* Remove total_cpus and retrofit the algorithm for calculating nr_sockets.
> >* Change per-socket cpumask allocation as on demand.
> >* socket_to_cpumask => socket_cpumask.
> >Changes in v7:
> >* Introduce total_cpus to calculate nr_sockets.
> >* Minor code sequence improvement in set_cpu_sibling_map.
> >* Improve comments for nr_sockets.
> >---
> > xen/arch/x86/mpparse.c | 17 +++++++++++++++++
> > xen/arch/x86/smpboot.c | 26 +++++++++++++++++++++++++-
> > xen/include/asm-x86/smp.h | 11 +++++++++++
> > 3 files changed, 53 insertions(+), 1 deletion(-)
> >
> >diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c
> >index 003c56e..8609f4a 100644
> >--- a/xen/arch/x86/mpparse.c
> >+++ b/xen/arch/x86/mpparse.c
> >@@ -87,6 +87,23 @@ void __init set_nr_cpu_ids(unsigned int max_cpus)
> > #endif
> > }
> >+void __init set_nr_sockets(void)
> >+{
> >+ /*
> >+ * Count the actual cpus in the socket 0 and use it to calculate nr_sockets
> >+ * so that the latter will be always >= the actual socket number in the
> >+ * system even when APIC IDs from MP table are too sparse.
> >+ */
> >+ unsigned int cpus = bitmap_weight(phys_cpu_present_map.mask,
> >+ boot_cpu_data.x86_max_cores *
> >+ boot_cpu_data.x86_num_siblings);
> >+
> >+ if ( cpus == 0 )
> >+ cpus = 1;
> >+
> >+ nr_sockets = DIV_ROUND_UP(num_processors + disabled_cpus, cpus);
> >+}
> >+
> > /*
> > * Intel MP BIOS table parsing routines:
> > */
> >diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
> >index 2289284..e75bbd3 100644
> >--- a/xen/arch/x86/smpboot.c
> >+++ b/xen/arch/x86/smpboot.c
> >@@ -60,6 +60,9 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_mask);
> > cpumask_t cpu_online_map __read_mostly;
> > EXPORT_SYMBOL(cpu_online_map);
> >+unsigned int __read_mostly nr_sockets;
> >+cpumask_var_t *__read_mostly socket_cpumask;
> >+
> > struct cpuinfo_x86 cpu_data[NR_CPUS];
> > u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
> >@@ -245,6 +248,8 @@ static void set_cpu_sibling_map(int cpu)
> > cpumask_set_cpu(cpu, &cpu_sibling_setup_map);
> >+ cpumask_set_cpu(cpu, socket_cpumask[cpu_to_socket(cpu)]);
>
> This patch crashes Xen on my 32-cpu Intel box here for cpu 16, which is the
> first CPU on the second socket (i.e. on socket 1).
>
> The reason appears to be that cpu_to_socket(16) is (correctly) 1 here, but
> ...
>
> >+
> > if ( c[cpu].x86_num_siblings > 1 )
> > {
> > for_each_cpu ( i, &cpu_sibling_setup_map )
> >@@ -649,7 +654,13 @@ void cpu_exit_clear(unsigned int cpu)
> > static void cpu_smpboot_free(unsigned int cpu)
> > {
> >- unsigned int order;
> >+ unsigned int order, socket = cpu_to_socket(cpu);
> >+
> >+ if ( cpumask_empty(socket_cpumask[socket]) )
> >+ {
> >+ free_cpumask_var(socket_cpumask[socket]);
> >+ socket_cpumask[socket] = NULL;
> >+ }
> > free_cpumask_var(per_cpu(cpu_sibling_mask, cpu));
> > free_cpumask_var(per_cpu(cpu_core_mask, cpu));
> >@@ -694,6 +705,7 @@ static int cpu_smpboot_alloc(unsigned int cpu)
> > nodeid_t node = cpu_to_node(cpu);
> > struct desc_struct *gdt;
> > unsigned long stub_page;
> >+ unsigned int socket = cpu_to_socket(cpu);
>
> ... is zero here, meaning that socket_cpumask[1] is NULL. I suspect that
> phys_proc_id is probably not set at this point but is by the time we get to
> set_cpu_sibling_map(). I haven't looked any further yet. I might do this
> tomorrow unless Chao does it before me.
Thanks for testing.
I think I have found the reason. For AP, phys_proc_id is set in:
start_secondary()=>smp_callin()=>smp_store_cpu_info()=>identify_cpu()
which is behind cpu_smpboot_alloc() called from CPU_PREPARE.
One way would move 'zalloc_cpumask_var(socket_cpumask + socket)' to
set_cpu_sibling_map() to fix it if Jan agrees that, otherwise other
solution needs to be found.
Chao
next prev parent reply other threads:[~2015-07-08 2:43 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-26 8:43 [PATCH v10 00/13] enable Cache Allocation Technology (CAT) for VMs Chao Peng
2015-06-26 8:43 ` [PATCH v10 01/13] x86: add socket_cpumask Chao Peng
2015-07-07 22:32 ` Boris Ostrovsky
2015-07-08 2:43 ` Chao Peng [this message]
2015-07-08 7:42 ` Jan Beulich
2015-06-26 8:43 ` [PATCH v10 02/13] x86: detect and initialize Intel CAT feature Chao Peng
2015-07-07 10:25 ` Jan Beulich
2015-07-08 2:24 ` Chao Peng
2015-06-26 8:43 ` [PATCH v10 03/13] x86: maintain COS to CBM mapping for each socket Chao Peng
2015-06-26 8:43 ` [PATCH v10 04/13] x86: add COS information for each domain Chao Peng
2015-06-26 8:43 ` [PATCH v10 05/13] x86: expose CBM length and COS number information Chao Peng
2015-06-26 8:43 ` [PATCH v10 06/13] x86: dynamically get/set CBM for a domain Chao Peng
2015-06-26 8:43 ` [PATCH v10 07/13] x86: add scheduling support for Intel CAT Chao Peng
2015-06-26 8:43 ` [PATCH v10 08/13] xsm: add CAT related xsm policies Chao Peng
2015-06-26 8:43 ` [PATCH v10 09/13] tools/libxl: minor name changes for CMT commands Chao Peng
2015-06-26 8:43 ` [PATCH v10 10/13] tools/libxl: add command to show PSR hardware info Chao Peng
2015-06-26 8:43 ` [PATCH v10 11/13] tools/libxl: introduce some socket helpers Chao Peng
2015-06-26 8:43 ` [PATCH v10 12/13] tools: add tools support for Intel CAT Chao Peng
2015-06-26 8:43 ` [PATCH v10 13/13] docs: add xl-psr.markdown Chao Peng
2015-07-07 14:46 ` [PATCH v10 00/13] enable Cache Allocation Technology (CAT) for VMs Ian Campbell
2015-07-08 9:40 ` Chao Peng
2015-07-08 10:02 ` Wei Liu
2015-07-09 1:29 ` Chao Peng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150708024348.GB3333@pengc-linux.bj.intel.com \
--to=chao.p.peng@linux.intel.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=dario.faggioli@citrix.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=keir@xen.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=will.auld@intel.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.