From: Ian Campbell on
Looks good to me, thanks Yinghai.

On Sat, 2010-03-20 at 06:38 +0000, Yinghai Lu wrote:
> From: Ian Campbell <ian.campbell(a)citrix.com>
>
> This avoids an infinite loop in free_early_partial().
>
> Add a warning to free_early_partial to catch future problems.
>
> -v5: put back start > end back into WARN_ONCE()
> -v6: use one line for if according to linus
>
> Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
> Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
> Cc: Peter Zijlstra <peterz(a)infradead.org>
> Cc: Ingo Molnar <mingo(a)elte.hu>
> ---
> kernel/early_res.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> Index: linux-2.6/kernel/early_res.c
> ===================================================================
> --- linux-2.6.orig/kernel/early_res.c
> +++ linux-2.6/kernel/early_res.c
> @@ -333,6 +333,12 @@ void __init free_early_partial(u64 start
> struct early_res *r;
> int i;
>
> + if (start == end)
> + return;
> +
> + if (WARN_ONCE(start > end, "free_early_partial: wrong range [%#llx, %#llx]\n", start, end))
> + return;
> +
> try_next:
> i = find_overlapped_early(start, end);
> if (i >= max_early_res)


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Joel Becker on
On Wed, Mar 24, 2010 at 03:37:02AM -0700, Yinghai Lu wrote:
> From: Ian Campbell <ian.campbell(a)citrix.com>
>
> This avoids an infinite loop in free_early_partial().
>
> Add a warning to free_early_partial to catch future problems.
>
> -v5: put back start > end back into WARN_ONCE()
> -v6: use one line for if according to linus
>
> Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
> Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
> Cc: Peter Zijlstra <peterz(a)infradead.org>
> Cc: Ingo Molnar <mingo(a)elte.hu>

Tested-by: Joel Becker <joel.becker(a)oracle.com>

I ran into this when moving my paravirt_ops PVMs to 2.6.34-rc1.
I turned on CONFIG_NO_BOOTMEM to try it because it was the default. I
had to put earlyprintk=xen on the command line to debug the problem.
My boots hung after:

....
(early) Local APIC disabled by BIOS -- you can enable it with "lapic"
(early) APIC: disable apic facility
(early) APIC: switched to apic NOOP
(early) Allocating PCI resources starting at 78000000 (gap: 78000000:88000000)
(early) Booting paravirtualized kernel on Xen
(early) Xen version: 3.1.3-rc3
(early) setup_percpu: NR_CPUS:8 nr_cpumask_bits:8 nr_cpu_ids:2 nr_node_ids:1

Bisecting narrowed the problem to fb90ef [early_res: Add
free_early_partial()]. Turning off CONFIG_NO_BOOTMEM allowed me to
boot. I then hunted up references to this function, which found me this
patch.
This patch successfully resolved the problem.

Joel

--

"The nice thing about egotists is that they don't talk about other
people."
- Lucille S. Harper

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker(a)oracle.com
Phone: (650) 506-8127
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Johannes Weiner on
On Fri, Mar 26, 2010 at 03:21:33PM -0700, Yinghai Lu wrote:
> From: Ian Campbell <ian.campbell(a)citrix.com>
>
> This avoids an infinite loop in free_early_partial().
>
> Add a warning to free_early_partial to catch future problems.
>
> -v5: put back start > end back into WARN_ONCE()
> -v6: use one line for warning according to linus
> -v7: more test by
>
> Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
> Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
> Tested-by: Konrad Rzeszutek Wilk <konrad.wilk(a)oracle.com>
> Tested-by: Joel Becker <joel.becker(a)oracle.com>
> Tested-by: Stanislaw Gruszka <sgruszka(a)redhat.com>
> Cc: Peter Zijlstra <peterz(a)infradead.org>
> Cc: Ingo Molnar <mingo(a)elte.hu>
> ---
> kernel/early_res.c | 6 ++++++
> 1 files changed, 6 insertions(+), 0 deletions(-)
>
> diff --git a/kernel/early_res.c b/kernel/early_res.c
> index 3cb2c66..69bed5b 100644
> --- a/kernel/early_res.c
> +++ b/kernel/early_res.c
> @@ -333,6 +333,12 @@ void __init free_early_partial(u64 start, u64 end)
> struct early_res *r;
> int i;
>
> + if (start == end)
> + return;
> +
> + if (WARN_ONCE(start > end, "free_early_partial: wrong range [%#llx, %#llx]\n", start, end))
> + return;

I think you can drop the function name, it will be in the stack dump
anyway. And that would get the line back into bounds :)

Other than that,
Acked-by: Johannes Weiner <hannes(a)cmpxchg.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Yinghai Lu on
On 03/26/2010 04:54 PM, Johannes Weiner wrote:
> On Fri, Mar 26, 2010 at 04:49:10PM -0700, Yinghai Lu wrote:
>>
>> is there any chance that dump stack only print out address instead of function name ?
>
> I suppose so, lacking frame pointers, but you still have
> filename + linenumber + 'wrong range'.

ok, will remove that function name.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Johannes Weiner on
On Fri, Mar 26, 2010 at 04:49:10PM -0700, Yinghai Lu wrote:
> On 03/26/2010 04:42 PM, Johannes Weiner wrote:
> > On Fri, Mar 26, 2010 at 03:21:33PM -0700, Yinghai Lu wrote:
> >> From: Ian Campbell <ian.campbell(a)citrix.com>
> >>
> >> This avoids an infinite loop in free_early_partial().
> >>
> >> Add a warning to free_early_partial to catch future problems.
> >>
> >> -v5: put back start > end back into WARN_ONCE()
> >> -v6: use one line for warning according to linus
> >> -v7: more test by
> >>
> >> Signed-off-by: Ian Campbell <ian.campbell(a)citrix.com>
> >> Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
> >> Tested-by: Konrad Rzeszutek Wilk <konrad.wilk(a)oracle.com>
> >> Tested-by: Joel Becker <joel.becker(a)oracle.com>
> >> Tested-by: Stanislaw Gruszka <sgruszka(a)redhat.com>
> >> Cc: Peter Zijlstra <peterz(a)infradead.org>
> >> Cc: Ingo Molnar <mingo(a)elte.hu>
> >> ---
> >> kernel/early_res.c | 6 ++++++
> >> 1 files changed, 6 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/kernel/early_res.c b/kernel/early_res.c
> >> index 3cb2c66..69bed5b 100644
> >> --- a/kernel/early_res.c
> >> +++ b/kernel/early_res.c
> >> @@ -333,6 +333,12 @@ void __init free_early_partial(u64 start, u64 end)
> >> struct early_res *r;
> >> int i;
> >>
> >> + if (start == end)
> >> + return;
> >> +
> >> + if (WARN_ONCE(start > end, "free_early_partial: wrong range [%#llx, %#llx]\n", start, end))
> >> + return;
> >
> > I think you can drop the function name, it will be in the stack dump
> > anyway. And that would get the line back into bounds :)
> >
> > Other than that,
> > Acked-by: Johannes Weiner <hannes(a)cmpxchg.org>
>
> Thanks.
>
> is there any chance that dump stack only print out address instead of function name ?

I suppose so, lacking frame pointers, but you still have
filename + linenumber + 'wrong range'.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/