[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] 4.11.0 RC1 panic
>>> On 25.06.18 at 10:33, <bouyer@xxxxxxxxxxxxxxx> wrote: > the dom0 has been running for a week now, running the daily NetBSD tests. > Attached is the console log. > I didn't notice anything suspect, exept a few domU crashes (crashing in > Xen, the problem is not reported back to the domU). But as this is > running NetBSD-HEAD tests it can also be a bug in the domU, that has > been fixed since then. > > It's possible that the printk changed timings in a way that prevents the > race condition from happening ... So instead of the debugging patch, could you give the one below a try? Jan x86: further avoid setting TLB flush time stamp NetBSD's use of linear page tables in 32-bit mode exposes an issue with us still storing TLB flush time stamps too early, corrupting the linear_pt_count field living in the same union. Since we go that path (for page tables) only when neither PGT_validated nor PGT_partial are set on a page, we don't really require a flush to happen (see also the code comment), yet we're also no concerned if one happens which isn't needed (which might occur when we never write the time stamp). Reported-by: Manuel Bouyer <bouyer@xxxxxxxxxxxxxxx> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- unstable.orig/xen/arch/x86/mm.c +++ unstable/xen/arch/x86/mm.c @@ -2541,8 +2541,17 @@ static int _put_page_type(struct page_in switch ( nx & (PGT_locked | PGT_count_mask) ) { case 0: - if ( unlikely((nx & PGT_type_mask) <= PGT_l4_page_table) && - likely(nx & (PGT_validated|PGT_partial)) ) + /* + * set_tlbflush_timestamp() accesses the same union linear_pt_count + * lives in. Pages (including page table ones), however, don't need + * their flush time stamp set except when the last reference is + * dropped. For PT pages this happens in _put_final_page_type(). PT + * pages which don't have PGT_validated set do not require flushing, + * as they would never have been installed into a PT hierarchy. + */ + if ( likely((nx & PGT_type_mask) > PGT_l4_page_table) ) + set_tlbflush_timestamp(page); + else if ( likely(nx & (PGT_validated|PGT_partial)) ) { int rc; @@ -2563,19 +2572,8 @@ static int _put_page_type(struct page_in return rc; } - if ( !ptpg || !PGT_type_equal(x, ptpg->u.inuse.type_info) ) - { - /* - * set_tlbflush_timestamp() accesses the same union - * linear_pt_count lives in. Pages (including page table ones), - * however, don't need their flush time stamp set except when - * the last reference is being dropped. For page table pages - * this happens in _put_final_page_type(). - */ - set_tlbflush_timestamp(page); - } - else - BUG_ON(!IS_ENABLED(CONFIG_PV_LINEAR_PT)); + BUG_ON(!IS_ENABLED(CONFIG_PV_LINEAR_PT) && ptpg && + PGT_type_equal(x, ptpg->u.inuse.type_info)); /* fall through */ default: _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |