[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 0/2] Handle xen_platform_pci=0 case
> > [ 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@xxxxxxxxxx> 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 */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |