Using for_each_domain() with out holding the domlist_read_lock is fragile, so add the lock in the keyhandlers it is missing.
Signed-off-by: Juergen Gross <jgr...@suse.com> --- xen/arch/x86/mm/p2m-ept.c | 4 ++++ xen/arch/x86/time.c | 5 +++++ xen/common/grant_table.c | 7 +++++++ xen/drivers/passthrough/iommu.c | 5 +++++ 4 files changed, 21 insertions(+) diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c index d4defa01c2..eb0f0edfef 100644 --- a/xen/arch/x86/mm/p2m-ept.c +++ b/xen/arch/x86/mm/p2m-ept.c @@ -1297,6 +1297,8 @@ static void ept_dump_p2m_table(unsigned char key) struct p2m_domain *p2m; struct ept_data *ept; + rcu_read_lock(&domlist_read_lock); + for_each_domain(d) { if ( !hap_enabled(d) ) @@ -1347,6 +1349,8 @@ static void ept_dump_p2m_table(unsigned char key) unmap_domain_page(table); } } + + rcu_read_unlock(&domlist_read_lock); } void setup_ept_dump(void) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index cf3e51fb5e..509679235d 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -2401,6 +2401,9 @@ static void dump_softtsc(unsigned char key) } else printk("TSC not marked as either constant or reliable, " "warp=%lu (count=%lu)\n", tsc_max_warp, tsc_check_count); + + rcu_read_lock(&domlist_read_lock); + for_each_domain ( d ) { if ( is_hardware_domain(d) && d->arch.tsc_mode == TSC_MODE_DEFAULT ) @@ -2417,6 +2420,8 @@ static void dump_softtsc(unsigned char key) domcnt++; } + rcu_read_unlock(&domlist_read_lock); + if ( !domcnt ) printk("No domains have emulated TSC\n"); } diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 2ecf38dfbe..c793927cd6 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -4104,9 +4104,16 @@ static void gnttab_usage_print(struct domain *rd) static void gnttab_usage_print_all(unsigned char key) { struct domain *d; + printk("%s [ key '%c' pressed\n", __func__, key); + + rcu_read_lock(&domlist_read_lock); + for_each_domain ( d ) gnttab_usage_print(d); + + rcu_read_unlock(&domlist_read_lock); + printk("%s ] done\n", __func__); } diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 9d421e06de..cab7a068aa 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -591,6 +591,9 @@ static void iommu_dump_p2m_table(unsigned char key) } ops = iommu_get_ops(); + + rcu_read_lock(&domlist_read_lock); + for_each_domain(d) { if ( is_hardware_domain(d) || !is_iommu_enabled(d) ) @@ -605,6 +608,8 @@ static void iommu_dump_p2m_table(unsigned char key) printk("\ndomain%d IOMMU p2m table: \n", d->domain_id); ops->dump_p2m_table(d); } + + rcu_read_unlock(&domlist_read_lock); } /* -- 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel