[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merged.
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID dfb8362648982b51d80ef589eafd74688c09ccc3 # Parent 970cf1fff5f2b55f4f646950f5c7a747a6db92f9 # Parent fbf58585008a9a8d4bec2d47ac64166c77d5bf7f Merged. diff -r 970cf1fff5f2 -r dfb836264898 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Mon Jan 9 11:24:02 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Mon Jan 9 14:43:46 2006 @@ -109,7 +109,7 @@ size_t len, loff_t *ppos) { struct xenbus_dev_data *u = filp->private_data; - struct xenbus_dev_transaction *trans; + struct xenbus_dev_transaction *trans = NULL; void *reply; if ((len + u->len) > sizeof(u->u.buffer)) @@ -134,14 +134,19 @@ case XS_MKDIR: case XS_RM: case XS_SET_PERMS: - reply = xenbus_dev_request_and_reply(&u->u.msg); - if (IS_ERR(reply)) - return PTR_ERR(reply); - if (u->u.msg.type == XS_TRANSACTION_START) { trans = kmalloc(sizeof(*trans), GFP_KERNEL); if (!trans) return -ENOMEM; + } + + reply = xenbus_dev_request_and_reply(&u->u.msg); + if (IS_ERR(reply)) { + kfree(trans); + return PTR_ERR(reply); + } + + if (u->u.msg.type == XS_TRANSACTION_START) { trans->handle = (struct xenbus_transaction *) simple_strtoul(reply, NULL, 0); list_add(&trans->list, &u->transactions); diff -r 970cf1fff5f2 -r dfb836264898 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Mon Jan 9 11:24:02 2006 +++ b/xen/arch/x86/domain.c Mon Jan 9 14:43:46 2006 @@ -689,6 +689,9 @@ struct vcpu *p = percpu_ctxt[cpu].curr_vcpu; struct vcpu *n = current; + ASSERT(p != n); + ASSERT(cpus_empty(n->vcpu_dirty_cpumask)); + if ( !is_idle_domain(p->domain) ) { memcpy(&p->arch.guest_context.user_regs, @@ -748,24 +751,31 @@ void context_switch(struct vcpu *prev, struct vcpu *next) { unsigned int cpu = smp_processor_id(); + cpumask_t dirty_mask = next->vcpu_dirty_cpumask; ASSERT(local_irq_is_enabled()); + /* Allow at most one CPU at a time to be dirty. */ + ASSERT(cpus_weight(dirty_mask) <= 1); + if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) ) + { + /* Other cpus call __sync_lazy_execstate from flush ipi handler. */ + flush_tlb_mask(dirty_mask); + } + + local_irq_disable(); + set_current(next); - if ( (percpu_ctxt[cpu].curr_vcpu != next) && - !is_idle_domain(next->domain) ) - { - /* This may happen if next has been migrated by the scheduler. */ - if ( unlikely(!cpus_empty(next->vcpu_dirty_cpumask)) ) - { - ASSERT(!cpu_isset(cpu, next->vcpu_dirty_cpumask)); - sync_vcpu_execstate(next); - ASSERT(cpus_empty(next->vcpu_dirty_cpumask)); - } - - local_irq_disable(); + if ( (percpu_ctxt[cpu].curr_vcpu == next) || is_idle_domain(next->domain) ) + { + local_irq_enable(); + } + else + { __context_switch(); + + /* Re-enable interrupts before restoring state which may fault. */ local_irq_enable(); if ( VMX_DOMAIN(next) ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |