NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-xen/47057: Xen NetBSD DomU file system trash under Linux Dom0
On Tue, Oct 23, 2012 at 04:01:06PM +0200, Roger Pau Monné wrote:
> Found the problem, grants from 0 to 8 (both included), shouldn't be
> used, they are reserved for the tools. I guess thats xenstore,
> xenconsole and friends, so that's where the corruption came from, and
> that's why the problem seemed to be related to xengnt_more_entries,
> because it gets called when those low grants are used. The attached
> patch solves the problem for me.
I guess it's new behavior of the tools ? Otherwise I guess we should have hit
this sooner. I see messages saying the kernel grows the grant entries
pool on a regular basis.
Anyway, good catch. one comment about the patch below.
> >From b80f10a3c3d0b95d3cd2a60a4669a2118fdbb9ef Mon Sep 17 00:00:00 2001
> From: Roger Pau Monne <roger.pau%citrix.com@localhost>
> Date: Tue, 23 Oct 2012 15:21:18 +0200
> Subject: [PATCH] xen: don't use grants 0-9
>
> Not all grants from the first frame can be used, grants from 0 to 8
> (both included) are reserved for external tools. Using this grants
> caused system crashes and fs corruption.
> ---
> sys/arch/xen/xen/xengnt.c | 15 +++++++++++----
> 1 files changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/sys/arch/xen/xen/xengnt.c b/sys/arch/xen/xen/xengnt.c
> index 621d2dc..2de4fd3 100644
> --- a/sys/arch/xen/xen/xengnt.c
> +++ b/sys/arch/xen/xen/xengnt.c
> @@ -51,6 +51,9 @@ __KERNEL_RCSID(0, "$NetBSD: xengnt.c,v 1.24 2012/06/30
> 23:36:20 jym Exp $");
>
> #define NR_GRANT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof(grant_entry_t))
>
> +/* External tools reserve first few grant table entries. */
> +#define NR_RESERVED_ENTRIES 8
> +
> /* Current number of frames making up the grant table */
> int gnt_nr_grant_frames;
> /* Maximum number of frames that can make up the grant table */
> @@ -161,7 +164,7 @@ xengnt_more_entries(void)
> gnttab_setup_table_t setup;
> u_long *pages;
> int nframes_new = gnt_nr_grant_frames + 1;
> - int i;
> + int i, start_gnt;
> KASSERT(mutex_owned(&grant_lock));
>
> if (gnt_nr_grant_frames == gnt_max_grant_frames)
> @@ -204,9 +207,13 @@ xengnt_more_entries(void)
>
> /*
> * add the grant entries associated to the last grant table frame
> - * and mark them as free
> + * and mark them as free. Prevent using the first grants (from 0 to 8)
> + * since they are used by the tools.
> */
> - for (i = gnt_nr_grant_frames * NR_GRANT_ENTRIES_PER_PAGE;
> + start_gnt = (gnt_nr_grant_frames * NR_GRANT_ENTRIES_PER_PAGE) <
> + NR_RESERVED_ENTRIES + 1 ? NR_RESERVED_ENTRIES +
> 1 :
> + (gnt_nr_grant_frames *
> NR_GRANT_ENTRIES_PER_PAGE);
please rewrite with parenthesis:
+ start_gnt = (gnt_nr_grant_frames * NR_GRANT_ENTRIES_PER_PAGE) <
+ (NR_RESERVED_ENTRIES + 1) ?
(NR_RESERVED_ENTRIES + 1) :
+ (gnt_nr_grant_frames *
NR_GRANT_ENTRIES_PER_PAGE);
then please commit and request pullups for netbsd-5 and -6.
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Home |
Main Index |
Thread Index |
Old Index