From 9398d200bb0058f818a088a9ccacdab082395bb3 Mon Sep 17 00:00:00 2001 From: "kaf24@freefall.cl.cam.ac.uk" Date: Sat, 16 Oct 2004 01:39:42 +0000 Subject: [PATCH 1/6] bitkeeper revision 1.1159.113.1 (41707bdeJOc1nGZ4m2BKGia9VqochA) Sync pagetables when migrating a domain betwene CPUs. --- xen/common/dom0_ops.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index 829eb1de2e..09b9d5d2d5 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -271,7 +271,8 @@ long do_dom0_op(dom0_op_t *u_dom0_op) else { domain_pause(d); - if(d->processor != cpu % smp_num_cpus) + synchronise_pagetables(~0UL); + if ( d->processor != (cpu % smp_num_cpus) ) set_bit(DF_MIGRATED, &d->flags); set_bit(DF_CPUPINNED, &d->flags); d->processor = cpu % smp_num_cpus; From 2acc4cfee703ce6277d28c715553a0071d1ff0df Mon Sep 17 00:00:00 2001 From: "kaf24@freefall.cl.cam.ac.uk" Date: Sat, 16 Oct 2004 23:31:39 +0000 Subject: [PATCH 2/6] bitkeeper revision 1.1159.113.2 (4171af5bkubQeHmeCV0gipUrBqdltA) Fix TLB coherency bug in map_domain_mem, as pointed out by Michael Fetterman. --- xen/arch/x86/x86_32/domain_page.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/x86_32/domain_page.c b/xen/arch/x86/x86_32/domain_page.c index 23b29a0c6c..e261d4cb40 100644 --- a/xen/arch/x86/x86_32/domain_page.c +++ b/xen/arch/x86/x86_32/domain_page.c @@ -19,7 +19,7 @@ #include unsigned long *mapcache; -static unsigned int map_idx, shadow_map_idx[NR_CPUS]; +static unsigned int map_idx, epoch, shadow_epoch[NR_CPUS]; static spinlock_t map_lock = SPIN_LOCK_UNLOCKED; /* Use a spare PTE bit to mark entries ready for recycling. */ @@ -30,11 +30,11 @@ static void flush_all_ready_maps(void) unsigned long *cache = mapcache; /* A bit skanky -- depends on having an aligned PAGE_SIZE set of PTEs. */ - do { if ( (*cache & READY_FOR_TLB_FLUSH) ) *cache = 0; } + do { + if ( (*cache & READY_FOR_TLB_FLUSH) ) + *cache = 0; + } while ( ((unsigned long)(++cache) & ~PAGE_MASK) != 0 ); - - perfc_incrc(domain_page_tlb_flush); - local_flush_tlb(); } @@ -50,25 +50,29 @@ void *map_domain_mem(unsigned long pa) spin_lock_irqsave(&map_lock, flags); /* Has some other CPU caused a wrap? We must flush if so. */ - if ( map_idx < shadow_map_idx[cpu] ) + if ( epoch != shadow_epoch[cpu] ) { perfc_incrc(domain_page_tlb_flush); local_flush_tlb(); + shadow_epoch[cpu] = epoch; } - for ( ; ; ) - { + do { idx = map_idx = (map_idx + 1) & (MAPCACHE_ENTRIES - 1); - if ( idx == 0 ) flush_all_ready_maps(); - if ( cache[idx] == 0 ) break; + if ( unlikely(idx == 0) ) + { + flush_all_ready_maps(); + perfc_incrc(domain_page_tlb_flush); + local_flush_tlb(); + shadow_epoch[cpu] = ++epoch; + } } + while ( cache[idx] != 0 ); cache[idx] = (pa & PAGE_MASK) | __PAGE_HYPERVISOR; spin_unlock_irqrestore(&map_lock, flags); - shadow_map_idx[cpu] = idx; - va = MAPCACHE_VIRT_START + (idx << PAGE_SHIFT) + (pa & ~PAGE_MASK); return (void *)va; } From bf174cbbf46fde0a57ba03f64f46cbbd7be9c014 Mon Sep 17 00:00:00 2001 From: "kaf24@freefall.cl.cam.ac.uk" Date: Sun, 17 Oct 2004 09:46:39 +0000 Subject: [PATCH 3/6] bitkeeper revision 1.1159.113.3 (41723f7fO8wKQjhPjoowbDHAwaKf-g) Always check shadow time values are up to date in time interrupt. --- linux-2.4.27-xen-sparse/arch/xen/kernel/time.c | 15 +++++++++------ .../arch/xen/i386/kernel/time.c | 17 +++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/linux-2.4.27-xen-sparse/arch/xen/kernel/time.c b/linux-2.4.27-xen-sparse/arch/xen/kernel/time.c index 01584bda33..9ff844d70e 100644 --- a/linux-2.4.27-xen-sparse/arch/xen/kernel/time.c +++ b/linux-2.4.27-xen-sparse/arch/xen/kernel/time.c @@ -393,14 +393,17 @@ static inline void do_timer_interrupt(int irq, void *dev_id, unsigned long ticks = 0; long sec_diff; - retry: - __get_time_values_from_xen(); + do { + __get_time_values_from_xen(); + + delta = (s64)(shadow_system_time + + (__get_time_delta_usecs() * 1000) - + processed_system_time); + } + while ( !TIME_VALUES_UP_TO_DATE ); - if ( (delta = (s64)(shadow_system_time + __get_time_delta_usecs() * 1000 - - processed_system_time)) < 0 ) + if ( unlikely(delta < 0) ) { - if (!TIME_VALUES_UP_TO_DATE) - goto retry; printk("Timer ISR: Time went backwards: %lld\n", delta); return; } diff --git a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c index 9b5c862892..15b68ba45d 100644 --- a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c +++ b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c @@ -367,15 +367,16 @@ static inline void do_timer_interrupt(int irq, void *dev_id, s64 delta, nsec; long sec_diff, wtm_nsec; - retry: - __get_time_values_from_xen(); + do { + __get_time_values_from_xen(); - delta = (s64)(shadow_system_time + - (cur_timer->get_offset() * NSEC_PER_USEC) - - processed_system_time); - if (delta < 0) { - if (!TIME_VALUES_UP_TO_DATE) - goto retry; + delta = (s64)(shadow_system_time + + (cur_timer->get_offset() * NSEC_PER_USEC) - + processed_system_time); + } + while (!TIME_VALUES_UP_TO_DATE); + + if (unlikely(delta < 0)) { printk("Timer ISR: Time went backwards: %lld %lld %ld %lld\n", delta, shadow_system_time, (cur_timer->get_offset() * NSEC_PER_USEC), From be5ce10e35062dbabc8ca86f1721c1194474cdb1 Mon Sep 17 00:00:00 2001 From: "kaf24@freefall.cl.cam.ac.uk" Date: Mon, 18 Oct 2004 14:38:09 +0000 Subject: [PATCH 4/6] bitkeeper revision 1.1159.113.4 (4173d55104oPexLYuOD8RSBysshM9w) Fix stupid shadow table bug that I introduced. --- xen/arch/x86/shadow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index bd9a796db3..545eff74cb 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -431,7 +431,7 @@ unsigned long shadow_l2_table( perfc_incrc(shadow_l2_table_count); - if ( (spfn_info = alloc_shadow_page(m)) != NULL ) + if ( (spfn_info = alloc_shadow_page(m)) == NULL ) BUG(); /* XXX Deal gracefully with failure. */ spfn_info->u.inuse.type_info = PGT_l2_page_table; From f79513ddb7b6f5c08dcc36666bda99f7583e83b7 Mon Sep 17 00:00:00 2001 From: "cwc22@centipede.cl.cam.ac.uk" Date: Mon, 18 Oct 2004 15:13:54 +0000 Subject: [PATCH 5/6] bitkeeper revision 1.1159.113.5 (4173ddb2BchxLpqw2qoKi9rPhxXElA) added error checking for copying dirty bitmap in PEEK and CLEAN shadow ops --- BitKeeper/etc/logging_ok | 1 + xen/arch/x86/shadow.c | 27 ++++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 65cb94b67b..c3c6bd3ef7 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -11,6 +11,7 @@ br260@labyrinth.cl.cam.ac.uk br260@laudney.cl.cam.ac.uk cl349@freefall.cl.cam.ac.uk cl349@labyrinth.cl.cam.ac.uk +cwc22@centipede.cl.cam.ac.uk djm@kirby.fc.hp.com gm281@boulderdash.cl.cam.ac.uk gm281@tetrapod.cl.cam.ac.uk diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 545eff74cb..4c0512ade8 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -295,11 +295,20 @@ static int shadow_mode_table_op( int bytes = ((((d->max_pages - i) > chunk) ? chunk : (d->max_pages - i)) + 7) / 8; - copy_to_user( - sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), - m->shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), - bytes); - + if (copy_to_user( + sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), + m->shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), + bytes)) + { + // copy_to_user can fail when copying to guest app memory. + // app should zero buffer after mallocing, and pin it + rc = -EINVAL; + memset( + m->shadow_dirty_bitmap + (i/(8*sizeof(unsigned long))), + 0, (d->max_pages/8) - (i/(8*sizeof(unsigned long)))); + break; + } + memset( m->shadow_dirty_bitmap + (i/(8*sizeof(unsigned long))), 0, bytes); @@ -322,8 +331,12 @@ static int shadow_mode_table_op( } sc->pages = d->max_pages; - copy_to_user( - sc->dirty_bitmap, m->shadow_dirty_bitmap, (d->max_pages+7)/8); + if (copy_to_user( + sc->dirty_bitmap, m->shadow_dirty_bitmap, (d->max_pages+7)/8)) + { + rc = -EINVAL; + break; + } break; From 6248496e29b1af29182a4d581e6d54dea3104dd0 Mon Sep 17 00:00:00 2001 From: "cl349@freefall.cl.cam.ac.uk" Date: Mon, 18 Oct 2004 23:54:45 +0000 Subject: [PATCH 6/6] bitkeeper revision 1.1159.115.1 (417457c52HnHChOJGxHncu97gsa5cg) Atropos scheduler set takes 5 arguments. As noted by Diwaker Gupta. --- tools/python/xen/xm/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index d8c70e75fe..797be02ae3 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -579,9 +579,9 @@ class ProgAtropos(Prog): print "\nSet atropos parameters." def main(self, args): - if len(args) != 5: self.err("%s: Invalid argument(s)" % args[0]) + if len(args) != 6: self.err("%s: Invalid argument(s)" % args[0]) dom = args[1] - v = map(int, args[2:5]) + v = map(int, args[2:6]) server.xend_domain_cpu_atropos_set(dom, *v) xm.prog(ProgAtropos)