[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Question about apic ipi interface
On Wed, May 8, 2013 at 4:26 PM, Stefan Bader <stefan.bader@xxxxxxxxxxxxx> wrote: > On 23.04.2013 12:07, Stefan Bader wrote: >> I was looking at some older patch and there is one thing I do not understand. >> >> commit f447d56d36af18c5104ff29dcb1327c0c0ac3634 >> xen: implement apic ipi interface >> >> Specifically there the implementation of xen_send_IPI_mask_allbutself(). >> >> void xen_send_IPI_mask_allbutself(const struct cpumask *mask, >> int vector) >> { >> unsigned cpu; >> unsigned int this_cpu = smp_processor_id(); >> >> if (!(num_online_cpus() > 1)) >> return; >> >> for_each_cpu_and(cpu, mask, cpu_online_mask) { >> if (this_cpu == cpu) >> continue; >> >> xen_smp_send_call_function_single_ipi(cpu); >> } >> } >> >> Why is this using xen_smp_send_call_function_single_ipi()? This dumps the >> supplied vector and always uses XEN_CALL_FUNCTION_SINGLE_VECTOR. In contrast >> the >> xen_send_IPI_all() and xen_send_IPI_self() keep the (mapped) vector. >> >> Mildly wondering about whether call function would need special casing (just >> because xen_smp_send_call_function_ipi() is special). But I don't have the >> big >> picture there. >> > > This never got really answered, so lets try this: Does the following patch > seem > to make sense? I know, it has not caused any obvious regressions but at least > this would look more in agreement with the other code. It has not blown up on > a > normal boot either. > Ben, is there a simple way that I would trigger the problem you had? Stefan, As mentioned before, Ming Lin took my patches from a different context, and re-worked them for a different patch series I originally wrote the patch in question, trying to get kgdb to work with Xen, which I never completed: http://wiki.xen.org/wiki/Xen_Development_Projects#dom0_kgdb_support Lin Ming originally introduced this commit to fix "perf top" soft lockups: http://lists.xen.org/archives/html/xen-devel/2012-04/msg01024.html This commit was also a modification of the code that I originally wrote, so I don't really have the final say on it, since it was modified after I wrote it. Here is how I transferred the patch, and the context at the time: http://www.kernelhub.org/?p=2&msg=17979 IIRC, kgdb uses IPI to do the CPU roundup, to get into a single processor context. Without the xen IPI implementation, it would never round up the CPUs. That is my best recollection. I apologize that it is not better. I don't see anything wrong with your fix, as long as it does not reintroduce any regressions in the "perf top" problems that Lin Ming addressed. Ben > > -Stefan > > > From e13703426f367c618f2984d376289b197a8c0402 Mon Sep 17 00:00:00 2001 > From: Stefan Bader <stefan.bader@xxxxxxxxxxxxx> > Date: Wed, 8 May 2013 16:37:35 +0200 > Subject: [PATCH] xen: Clean up apic ipi interface > > Commit f447d56d36af18c5104ff29dcb1327c0c0ac3634 introduced the > implementation of the PV apic ipi interface. But there were some > odd things (it seems none of which cause really any issue but > maybe they should be cleaned up anyway): > - xen_send_IPI_mask_allbutself (and by that xen_send_IPI_allbutself) > ignore the passed in vector and only use the CALL_FUNCTION_SINGLE > vector. While xen_send_IPI_all and xen_send_IPI_mask use the vector. > - physflat_send_IPI_allbutself is declared unnecessarily. It is never > used. > > This patch tries to clean up those things. > > Signed-off-by: Stefan Bader <stefan.bader@xxxxxxxxxxxxx> > --- > arch/x86/xen/smp.c | 10 ++++------ > arch/x86/xen/smp.h | 1 - > 2 files changed, 4 insertions(+), 7 deletions(-) > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > index 8ff3799..fb44426 100644 > --- a/arch/x86/xen/smp.c > +++ b/arch/x86/xen/smp.c > @@ -576,24 +576,22 @@ void xen_send_IPI_mask_allbutself(const struct cpumask > *mask, > { > unsigned cpu; > unsigned int this_cpu = smp_processor_id(); > + int xen_vector = xen_map_vector(vector); > > - if (!(num_online_cpus() > 1)) > + if (!(num_online_cpus() > 1) || (xen_vector < 0)) > return; > > for_each_cpu_and(cpu, mask, cpu_online_mask) { > if (this_cpu == cpu) > continue; > > - xen_smp_send_call_function_single_ipi(cpu); > + xen_send_IPI_one(cpu, xen_vector); > } > } > > void xen_send_IPI_allbutself(int vector) > { > - int xen_vector = xen_map_vector(vector); > - > - if (xen_vector >= 0) > - xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); > + xen_send_IPI_mask_allbutself(cpu_online_mask, vector); > } > > static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) > diff --git a/arch/x86/xen/smp.h b/arch/x86/xen/smp.h > index 8981a76..c7c2d89 100644 > --- a/arch/x86/xen/smp.h > +++ b/arch/x86/xen/smp.h > @@ -5,7 +5,6 @@ extern void xen_send_IPI_mask(const struct cpumask *mask, > extern void xen_send_IPI_mask_allbutself(const struct cpumask *mask, > int vector); > extern void xen_send_IPI_allbutself(int vector); > -extern void physflat_send_IPI_allbutself(int vector); > extern void xen_send_IPI_all(int vector); > extern void xen_send_IPI_self(int vector); > > -- > 1.7.9.5 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |