From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>,
George Dunlap <George.Dunlap@eu.citrix.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Xen Devel <xen-devel@lists.xen.org>,
Fabio Fantoni <fabio.fantoni@m2r.biz>,
Stefano Stabellini <stefano.stabellini@citrix.com>
Subject: Re: [PATCH 0/2] Handle xen_platform_pci=0 case
Date: Tue, 26 Nov 2013 14:08:10 -0500 [thread overview]
Message-ID: <20131126190810.GB3350@phenom.dumpdata.com> (raw)
In-Reply-To: <20131122165450.GB10855@perard.uk.xensource.com>
> > [ 1.665373] ------------[ cut here ]------------
> > [ 1.665704] sd 0:0:0:0: [sda] Attached SCSI disk
> > [ 1.666342] kernel BUG at drivers/xen/grant-table.c:1189!
> > [ 1.666342] invalid opcode: 0000 [#1] SMP
> > [ 1.666342] Modules linked in:
> > [ 1.666342] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.11.6-200.fc19.x86_64
> > #1
> > [ 1.666342] Hardware name: Xen HVM domU, BIOS 4.4-unstable 11/22/2013
> > [ 1.666342] task: ffff88007a7b0000 ti: ffff88007a7b8000 task.ti: ffff88007a7
> > b8000
> > [ 1.666342] RIP: 0010:[<ffffffff813a0c0f>] [<ffffffff813a0c0f>] get_free_en
> > tries+0x2cf/0x2e0
> > [ 1.666342] RSP: 0000:ffff88007a7b9bd8 EFLAGS: 00010046
> > [ 1.666342] RAX: 0000000000000286 RBX: 0000000000000001 RCX: 000000000000000
> > 0
> > [ 1.666342] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffffff81fc7d7
> > 0
> > [ 1.666342] RBP: ffff88007a7b9c20 R08: 0000000000000000 R09: 000000000000fff
> > c
> > [ 1.666342] R10: 0000000000000000 R11: 0000000000000000 R12: 000000000000028
> > 6
> > [ 1.666342] R13: 0000000000037032 R14: 0000000000000000 R15: 000000000000000
> > 0
> > [ 1.666342] FS: 0000000000000000(0000) GS:ffff88007b600000(0000) knlGS:0000
> > 000000000000
> > [ 1.666342] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> > [ 1.666342] CR2: 0000000000000000 CR3: 0000000001c0c000 CR4: 00000000000006f
> > 0
> > [ 1.666342] Stack:
> > [ 1.666342] ffff8800370174b0 ffff880037017408 ffff88007a7b9c20 00000001814b
> > 68b6
> > [ 1.666342] ffff880037024600 0000000000000000 0000000000037032 000000000000
> > 0000
> > [ 1.666342] 0000000000000000 ffff88007a7b9c50 ffffffff813a0c43 ffff88003702
> > 4600
> > [ 1.666342] Call Trace:
> > [ 1.666342] [<ffffffff813a0c43>] gnttab_grant_foreign_access+0x23/0x60
> > [ 1.666342] [<ffffffff814c7e58>] xenkbd_connect_backend+0x58/0x2c0
> > [ 1.666342] [<ffffffff814c848a>] xenkbd_probe+0x2fa/0x340
> > [ 1.666342] [<ffffffff813a856e>] xenbus_dev_probe+0x8e/0x170
> > [ 1.666342] [<ffffffff813a9ba8>] xenbus_frontend_dev_probe+0x48/0x50
> > [ 1.666342] [<ffffffff813f21a7>] driver_probe_device+0x87/0x390
> > [ 1.666342] [<ffffffff813f2583>] __driver_attach+0x93/0xa0
> > [ 1.666342] [<ffffffff813f24f0>] ? __device_attach+0x40/0x40
> > [ 1.666342] [<ffffffff813f00e3>] bus_for_each_dev+0x63/0xa0
> > [ 1.666342] [<ffffffff813f1bfe>] driver_attach+0x1e/0x20
> > [ 1.666342] [<ffffffff813f1798>] bus_add_driver+0x1e8/0x2a0
> > [ 1.666342] [<ffffffff81d59578>] ? lifebook_module_init+0x1b/0x1b
> > [ 1.666342] [<ffffffff813f2bc4>] driver_register+0x74/0x150
> > [ 1.666342] [<ffffffff81d59578>] ? lifebook_module_init+0x1b/0x1b
> > [ 1.666342] [<ffffffff813a7daa>] xenbus_register_driver_common+0x1a/0x20
> > [ 1.666342] [<ffffffff813aa078>] xenbus_register_frontend+0x28/0x50
> > [ 1.666342] [<ffffffff81d595a3>] xenkbd_init+0x2b/0x34
> > [ 1.666342] [<ffffffff810020fa>] do_one_initcall+0xfa/0x1b0
> > [ 1.666342] [<ffffffff81086785>] ? parse_args+0x225/0x400
> > [ 1.666342] [<ffffffff81d0f078>] kernel_init_freeable+0x177/0x1ff
> > [ 1.666342] [<ffffffff81d0e898>] ? do_early_param+0x88/0x88
> > [ 1.666342] [<ffffffff8163df40>] ? rest_init+0x80/0x80
> > [ 1.666342] [<ffffffff8163df4e>] kernel_init+0xe/0x190
> > [ 1.666342] [<ffffffff81656dec>] ret_from_fork+0x7c/0xb0
> > [ 1.666342] [<ffffffff8163df40>] ? rest_init+0x80/0x80
> > [ 1.666342] Code: 8b 05 9e 71 c2 00 44 8b 2d 83 71 c2 00 e9 62 fe ff ff 66 2
> > e 0f 1f 84 00 00 00 00 00 b8 e4 ff ff ff e9 2a ff ff ff 44 89 c7 eb 84 <0f> 0b
> > 0f 0b 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 66 66 66 66
> > [ 1.666342] RIP [<ffffffff813a0c0f>] get_free_entries+0x2cf/0x2e0
> > [ 1.666342] RSP <ffff88007a7b9bd8>
> > [ 1.666342] ---[ end trace 6eb44b05748c7d42 ]---
> > [ 2.122137] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0
> > 000000b
>
> Looks like I have a similaire issue with the module xen_kbdfront, but
> later in the boot, an the guest is running fine. I think that could be
> an hidden bug which did not show up before, I'll try to understand the
> issue.
This looks familiar. I thought we had discussed it and it came out of this:
t d0b4d64aadb9f4a90669848de9ef3819050a98cd
Author: Matt Wilson <msw@amazon.com>
Date: Tue Jan 15 13:21:27 2013 +0000
xen/grant-table: correctly initialize grant table version 1
Commit 85ff6acb075a484780b3d763fdf41596d8fc0970 (xen/granttable: Grant
tables V2 implementation) changed the GREFS_PER_GRANT_FRAME macro from
a constant to a conditional expression. The expression depends on
grant_table_version being appropriately set. Unfortunately, at init
time grant_table_version will be 0. The GREFS_PER_GRANT_FRAME
conditional expression checks for "grant_table_version == 1", and
therefore returns the number of grant references per frame for v2.
This causes gnttab_init() to allocate fewer pages for gnttab_list, as
a frame can old half the number of v2 entries than v1 entries. After
gnttab_resume() is called, grant_table_version is appropriately
set. nr_init_grefs will then be miscalculated and gnttab_free_count
will hold a value larger than the actual number of free gref entries.
If a guest is heavily utilizing improperly initialized v1 grant
tables, memory corruption can occur. One common manifestation is
corruption of the vmalloc list, resulting in a poisoned pointer
derefrence when accessing /proc/meminfo or /proc/vmallocinfo:
And the reason is that since the xen-platform-pci is not called
we never called 'gnttab_setup' (or rather 'gnttab_init()').
I am not really sure how to fix this right - we don't want
to load any of the PV drivers, but at the same time the 'xen_domain()'
check is turned 'on' by:
xen_hvm_guest_init().
which is OK.
But if we add in the PV drivers a check for:
if (xen_domain()) {
if (xen_hvm_domain() && !xen-platform-pci-init-value))
return -ENODEV;
}
that means we won't be able to load the drivers in random order. Such
as xen-blkfront loaded before xen-platform-pci. But that is OK, those
modules have a dependency on that driver (I hope!).
Something like this? (Untested, not even compiled)
diff --git a/arch/x86/xen/platform-pci-unplug.c b/arch/x86/xen/platform-pci-unplug.c
index 0a78524..3e480f1 100644
--- a/arch/x86/xen/platform-pci-unplug.c
+++ b/arch/x86/xen/platform-pci-unplug.c
@@ -69,6 +69,22 @@ static int check_platform_magic(void)
return 0;
}
+bool xen_err_out(void)
+{
+ if (!xen_domain())
+ return true;
+
+ if (xen_hvm_domain()) {
+ if (xen_platform_pci_unplug & (XEN_UNPLUG_UNNECESSARY | XEN_UNPLUG_NEVER))
+ return true;
+ if (xen_platform_pci_unplug == 0)
+ return true;
+ }
+ return false;
+}
+EXPORT_SYMBOL_GPL(xen_err_out);
+
+}
void xen_unplug_emulated_devices(void)
{
int r;
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 432db1b..bcbaf0b 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -2074,7 +2074,7 @@ static int __init xlblk_init(void)
if (!xen_domain())
return -ENODEV;
- if (xen_hvm_domain() && !xen_platform_pci_unplug)
+ if (xen_err_out())
return -ENODEV;
if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) {
diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c
index e21c181..e3640d6 100644
--- a/drivers/input/misc/xen-kbdfront.c
+++ b/drivers/input/misc/xen-kbdfront.c
@@ -380,6 +380,9 @@ static int __init xenkbd_init(void)
if (xen_initial_domain())
return -ENODEV;
+ if (xen_err_out())
+ return -ENODEV;
+
return xenbus_register_frontend(&xenkbd_driver);
}
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index e59acb1..be2744b 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -2115,7 +2115,7 @@ static int __init netif_init(void)
if (!xen_domain())
return -ENODEV;
- if (xen_hvm_domain() && !xen_platform_pci_unplug)
+ if (xen_err_out())
return -ENODEV;
pr_info("Initialising Xen virtual ethernet driver\n");
diff --git a/drivers/xen/xenbus/xenbus_probe_frontend.c b/drivers/xen/xenbus/xenbus_probe_frontend.c
index 129bf84..b1c0f2a 100644
--- a/drivers/xen/xenbus/xenbus_probe_frontend.c
+++ b/drivers/xen/xenbus/xenbus_probe_frontend.c
@@ -496,7 +496,7 @@ subsys_initcall(xenbus_probe_frontend_init);
#ifndef MODULE
static int __init boot_wait_for_devices(void)
{
- if (xen_hvm_domain() && !xen_platform_pci_unplug)
+ if (xen_err_out())
return -ENODEV;
ready_to_wait_for_devices = 1;
diff --git a/include/xen/platform_pci.h b/include/xen/platform_pci.h
index 438c256..2120f90 100644
--- a/include/xen/platform_pci.h
+++ b/include/xen/platform_pci.h
@@ -47,5 +47,6 @@ static inline int xen_must_unplug_disks(void) {
}
extern int xen_platform_pci_unplug;
+extern bool xen_err_out(void);
#endif /* _XEN_PLATFORM_PCI_H */
next prev parent reply other threads:[~2013-11-26 19:08 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-22 15:13 [PATCH 0/2] Handle xen_platform_pci=0 case Anthony PERARD
2013-11-22 15:13 ` [PATCH 1/2] libxl: adding support to use -machine option of QEMU Anthony PERARD
2013-11-29 12:29 ` Stefano Stabellini
2013-11-22 15:13 ` [PATCH 2/2] libxl: Handle xen_platform_pci=0 case with qemu-xen Anthony PERARD
2013-11-29 12:31 ` Stefano Stabellini
2013-11-29 12:49 ` Fabio Fantoni
[not found] ` <20131122151838.GA10855@perard.uk.xensource.com>
2013-11-22 15:30 ` Processed: Re: [PATCH 0/2] Handle xen_platform_pci=0 case xen
2013-11-22 15:49 ` Fabio Fantoni
2013-11-22 16:54 ` Anthony PERARD
2013-11-25 9:04 ` Fabio Fantoni
2013-11-25 11:11 ` Anthony PERARD
2013-11-29 16:06 ` Fabio Fantoni
2013-11-29 16:20 ` Sander Eikelenboom
2013-11-26 19:08 ` Konrad Rzeszutek Wilk [this message]
2013-11-26 20:09 ` Konrad Rzeszutek Wilk
2013-11-28 16:14 ` Anthony PERARD
2013-11-22 15:56 ` Ian Campbell
2013-11-22 17:18 ` Anthony PERARD
2013-11-22 17:23 ` Ian Campbell
2013-11-22 17:31 ` Ian Campbell
2013-11-22 17:40 ` Anthony PERARD
2013-11-22 17:24 ` George Dunlap
2013-11-22 17:06 ` George Dunlap
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=20131126190810.GB3350@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=anthony.perard@citrix.com \
--cc=fabio.fantoni@m2r.biz \
--cc=ian.campbell@citrix.com \
--cc=stefano.stabellini@citrix.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.