|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] 4.11.0 RC1 panic
>>> On 12.06.18 at 22:55, <bouyer@xxxxxxxxxxxxxxx> wrote:
> On Tue, Jun 12, 2018 at 05:38:45PM +0200, Manuel Bouyer wrote:
>> On Tue, Jun 12, 2018 at 01:39:05PM +0200, Manuel Bouyer wrote:
>> > I applied this patch to 4.11rc4 (let's not change too much things at the
>> > same time) and rebooted my test host. Hopefully I'll have some data to
>> > report
>> > soon
>>
>> Got the first panic (still from a i386 domU):
>
> I got another panic, possibly at domain shutdown.
Hmm, I can't identify the source of
(XEN) Assertion '!page->linear_pt_count' failed at mm.c:596
In fact, there's no assertion with that expression anywhere I could
see. Do you have any local patches in place? In any event, to take
care of the other assertion you've hit below an updated debugging
patch. I hope I didn't overlook any further (cascade) ones.
Jan
--- unstable.orig/xen/arch/x86/domain.c
+++ unstable/xen/arch/x86/domain.c
@@ -1872,6 +1872,7 @@ static int relinquish_memory(
while ( (page = page_list_remove_head(list)) )
{
+bool log = false;//temp
/* Grab a reference to the page so it won't disappear from under us. */
if ( unlikely(!get_page(page, d)) )
{
@@ -1880,6 +1881,10 @@ static int relinquish_memory(
continue;
}
+if(is_pv_32bit_domain(d) && PGT_type_equal(page->u.inuse.type_info,
PGT_l2_page_table)) {//temp
+ printk("d%d:%"PRI_mfn": %lx:%d\n", d->domain_id, mfn_x(page_to_mfn(page)),
page->u.inuse.type_info, page->linear_pt_count);
+ log = true;
+}
if ( test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
ret = put_page_and_type_preemptible(page);
switch ( ret )
@@ -1921,7 +1926,13 @@ static int relinquish_memory(
if ( likely(y == x) )
{
/* No need for atomic update of type_info here: noone else
updates it. */
- switch ( ret = free_page_type(page, x, 1) )
+//temp switch ( ret = free_page_type(page, x, 1) )
+ret = free_page_type(page, x, 1);//temp
+if(log) {//temp
+ printk("%"PRI_mfn" -> %lx:%d (%d,%d,%d)\n", mfn_x(page_to_mfn(page)),
page->u.inuse.type_info,
+ page->linear_pt_count, ret, page->nr_validated_ptes,
page->partial_pte);
+}
+switch(ret)//temp
{
case 0:
break;
--- unstable.orig/xen/arch/x86/mm.c
+++ unstable/xen/arch/x86/mm.c
@@ -705,12 +705,19 @@ static bool inc_linear_entries(struct pa
return true;
}
-static void dec_linear_entries(struct page_info *pg)
+//temp static void dec_linear_entries(struct page_info *pg)
+static struct domain*dec_linear_entries(struct page_info*pg)//temp
{
typeof(pg->linear_pt_count) oc;
oc = arch_fetch_and_add(&pg->linear_pt_count, -1);
+{//temp
+ struct domain*owner = page_get_owner(pg);
+ if(oc <= 0 && is_pv_32bit_domain(owner))
+ return owner;
+}
ASSERT(oc > 0);
+return NULL;//temp
}
static bool inc_linear_uses(struct page_info *pg)
@@ -2615,11 +2622,25 @@ static int _put_final_page_type(struct p
/* No need for atomic update of type_info here: noone else updates it. */
if ( rc == 0 )
{
+struct domain*d;//temp
if ( ptpg && PGT_type_equal(type, ptpg->u.inuse.type_info) )
{
dec_linear_uses(page);
+if((d = ({//temp
dec_linear_entries(ptpg);
+})) != NULL) {//temp
+ printk("d%d: %"PRI_mfn":%lx:%d -> %"PRI_mfn":%lx:%d\n", d->domain_id,
+ mfn_x(page_to_mfn(ptpg)), ptpg->u.inuse.type_info,
ptpg->linear_pt_count,
+ mfn_x(page_to_mfn(page)), page->u.inuse.type_info,
page->linear_pt_count);
+ domain_crash(d);
+}
}
+if(is_pv_32bit_domain(d = page_get_owner(page))) {//temp
+ if(page->linear_pt_count && !d->is_dying) {
+ printk("d%d:%"PRI_mfn": %lx:%d (%p)\n", d->domain_id,
mfn_x(page_to_mfn(page)), page->u.inuse.type_info, page->linear_pt_count, ptpg);
+ domain_crash(d);
+ }
+} else
ASSERT(!page->linear_pt_count || page_get_owner(page)->is_dying);
set_tlbflush_timestamp(page);
smp_wmb();
@@ -2704,8 +2725,16 @@ static int _put_page_type(struct page_in
if ( ptpg && PGT_type_equal(x, ptpg->u.inuse.type_info) )
{
+struct domain*d;//temp
dec_linear_uses(page);
+if((d = ({//temp
dec_linear_entries(ptpg);
+})) != NULL) {//temp
+ printk("d%d: %"PRI_mfn":%lx:%d => %"PRI_mfn":%lx:%d\n", d->domain_id,
+ mfn_x(page_to_mfn(ptpg)), ptpg->u.inuse.type_info,
ptpg->linear_pt_count,
+ mfn_x(page_to_mfn(page)), page->u.inuse.type_info,
page->linear_pt_count);
+ domain_crash(d);
+}
}
return 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |