WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Merge

# HG changeset patch
# User Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
# Date 1281704151 -3600
# Node ID 85bd0f6e8fedf7816883e3b568dbe26c164d63c3
# Parent  ddb9f47ef2e2848e795a56496ff09a0ff06935f0
# Parent  1f8a2d0243798c3683d5786078fd62190bd497c0
Merge
---
 buildconfigs/mk.linux-2.6-common      |    2 +-
 xen/arch/x86/hvm/svm/emulate.c        |    4 +++-
 xen/arch/x86/hvm/svm/svm.c            |   23 +++++++++++++++++------
 xen/arch/x86/traps.c                  |    9 +++++++++
 xen/common/event_channel.c            |   11 ++++-------
 xen/common/sched_credit.c             |   27 +++++++++++++++++----------
 xen/include/asm-x86/hvm/svm/emulate.h |    1 +
 7 files changed, 52 insertions(+), 25 deletions(-)

diff -r ddb9f47ef2e2 -r 85bd0f6e8fed buildconfigs/mk.linux-2.6-common
--- a/buildconfigs/mk.linux-2.6-common  Thu Aug 12 18:56:20 2010 +0100
+++ b/buildconfigs/mk.linux-2.6-common  Fri Aug 13 13:55:51 2010 +0100
@@ -75,7 +75,7 @@ endif
        # tree. Finally attempt to use make defconfig.
        set -e ; \
        CONFIG_VERSION=$$(sed -ne 's/$$(XENGUEST)//; s/^EXTRAVERSION = //p' 
$(LINUX_SRCDIR)/Makefile); \
-       if [ ! -z "$(XEN_LINUX_CONFIG)" -a -r $(XEN_LINUX_CONFIG) ]; then \
+       if [ ! -z "$(XEN_LINUX_CONFIG)" -a -r "$(XEN_LINUX_CONFIG)" ]; then \
          cp $(XEN_LINUX_CONFIG) $(CONFIG_FILE); \
        elif [ -r 
$(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION$(EXTRAVERSION) ] ; then \
          cp 
$(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION$(EXTRAVERSION) 
$(CONFIG_FILE) ; \
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/arch/x86/hvm/svm/emulate.c
--- a/xen/arch/x86/hvm/svm/emulate.c    Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/arch/x86/hvm/svm/emulate.c    Fri Aug 13 13:55:51 2010 +0100
@@ -100,6 +100,7 @@ MAKE_INSTR(HLT,    1, 0xf4);
 MAKE_INSTR(HLT,    1, 0xf4);
 MAKE_INSTR(INT3,   1, 0xcc);
 MAKE_INSTR(RDTSC,  2, 0x0f, 0x31);
+MAKE_INSTR(PAUSE,  1, 0x90);
 
 static const u8 *opc_bytes[INSTR_MAX_COUNT] = 
 {
@@ -111,7 +112,8 @@ static const u8 *opc_bytes[INSTR_MAX_COU
     [INSTR_VMCALL] = OPCODE_VMCALL,
     [INSTR_HLT]    = OPCODE_HLT,
     [INSTR_INT3]   = OPCODE_INT3,
-    [INSTR_RDTSC]  = OPCODE_RDTSC
+    [INSTR_RDTSC]  = OPCODE_RDTSC,
+    [INSTR_PAUSE]  = OPCODE_PAUSE,
 };
 
 static int fetch(struct vcpu *v, u8 *buf, unsigned long addr, int len)
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Aug 13 13:55:51 2010 +0100
@@ -1261,6 +1261,22 @@ static void svm_vmexit_do_rdtsc(struct c
     hvm_rdtsc_intercept(regs);
 }
 
+static void svm_vmexit_do_pause(struct cpu_user_regs *regs)
+{
+    unsigned int inst_len;
+
+    if ( (inst_len = __get_instruction_length(current, INSTR_PAUSE)) == 0 )
+        return;
+    __update_guest_eip(regs, inst_len);
+
+    /*
+     * The guest is running a contended spinlock and we've detected it.
+     * Do something useful, like reschedule the guest
+     */
+    perfc_incr(pauseloop_exits);
+    do_sched_op_compat(SCHEDOP_yield, 0);
+}
+
 static void svm_vmexit_ud_intercept(struct cpu_user_regs *regs)
 {
     struct hvm_emulate_ctxt ctxt;
@@ -1655,12 +1671,7 @@ asmlinkage void svm_vmexit_handler(struc
         break;
 
     case VMEXIT_PAUSE:
-        /*
-         * The guest is running a contended spinlock and we've detected it.
-         * Do something useful, like reschedule the guest
-         */
-        perfc_incr(pauseloop_exits);
-        do_sched_op_compat(SCHEDOP_yield, 0);
+        svm_vmexit_do_pause(regs);
         break;
 
     default:
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/arch/x86/traps.c      Fri Aug 13 13:55:51 2010 +0100
@@ -2228,6 +2228,7 @@ static int emulate_privileged_op(struct 
         case MSR_K8_PSTATE5:
         case MSR_K8_PSTATE6:
         case MSR_K8_PSTATE7:
+        case MSR_K8_HWCR:
             if ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD )
                 goto fail;
             if ( !is_cpufreq_controller(v->domain) )
@@ -2267,6 +2268,14 @@ static int emulate_privileged_op(struct 
             break;
         case MSR_IA32_MPERF:
         case MSR_IA32_APERF:
+            if (( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) &&
+                ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD ) )
+                goto fail;
+            if ( !is_cpufreq_controller(v->domain) )
+                break;
+            if ( wrmsr_safe(regs->ecx, msr_content ) != 0 )
+                goto fail;
+            break;
         case MSR_IA32_PERF_CTL:
             if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
                 goto fail;
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/common/event_channel.c
--- a/xen/common/event_channel.c        Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/common/event_channel.c        Fri Aug 13 13:55:51 2010 +0100
@@ -1123,14 +1123,11 @@ static void domain_dump_evtchn_info(stru
 
     bitmap_scnlistprintf(keyhandler_scratch, sizeof(keyhandler_scratch),
                          d->poll_mask, d->max_vcpus);
-    printk("Domain %d polling vCPUs: {%s}\n",
-           d->domain_id, keyhandler_scratch);
-
-    if ( !spin_trylock(&d->event_lock) )
-        return;
-
     printk("Event channel information for domain %d:\n"
-           "    port [p/m]\n", d->domain_id);
+           "Polling vCPUs: {%s}\n"
+           "    port [p/m]\n", d->domain_id, keyhandler_scratch);
+
+    spin_lock(&d->event_lock);
 
     for ( port = 1; port < MAX_EVTCHNS(d); ++port )
     {
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/common/sched_credit.c Fri Aug 13 13:55:51 2010 +0100
@@ -555,10 +555,11 @@ __csched_vcpu_acct_start(struct csched_p
 
         sdom->active_vcpu_count++;
         list_add(&svc->active_vcpu_elem, &sdom->active_vcpu);
+        /* Make weight per-vcpu */
+        prv->weight += sdom->weight;
         if ( list_empty(&sdom->active_sdom_elem) )
         {
             list_add(&sdom->active_sdom_elem, &prv->active_sdom);
-            prv->weight += sdom->weight;
         }
     }
 
@@ -576,13 +577,13 @@ __csched_vcpu_acct_stop_locked(struct cs
     CSCHED_VCPU_STAT_CRANK(svc, state_idle);
     CSCHED_STAT_CRANK(acct_vcpu_idle);
 
+    BUG_ON( prv->weight < sdom->weight );
     sdom->active_vcpu_count--;
     list_del_init(&svc->active_vcpu_elem);
+    prv->weight -= sdom->weight;
     if ( list_empty(&sdom->active_vcpu) )
     {
-        BUG_ON( prv->weight < sdom->weight );
         list_del_init(&sdom->active_sdom_elem);
-        prv->weight -= sdom->weight;
     }
 }
 
@@ -804,8 +805,8 @@ csched_dom_cntl(
         {
             if ( !list_empty(&sdom->active_sdom_elem) )
             {
-                prv->weight -= sdom->weight;
-                prv->weight += op->u.credit.weight;
+                prv->weight -= sdom->weight * sdom->active_vcpu_count;
+                prv->weight += op->u.credit.weight * sdom->active_vcpu_count;
             }
             sdom->weight = op->u.credit.weight;
         }
@@ -976,9 +977,9 @@ csched_acct(void* dummy)
         BUG_ON( is_idle_domain(sdom->dom) );
         BUG_ON( sdom->active_vcpu_count == 0 );
         BUG_ON( sdom->weight == 0 );
-        BUG_ON( sdom->weight > weight_left );
-
-        weight_left -= sdom->weight;
+        BUG_ON( (sdom->weight * sdom->active_vcpu_count) > weight_left );
+
+        weight_left -= ( sdom->weight * sdom->active_vcpu_count );
 
         /*
          * A domain's fair share is computed using its weight in competition
@@ -991,7 +992,9 @@ csched_acct(void* dummy)
         credit_peak = sdom->active_vcpu_count * CSCHED_CREDITS_PER_ACCT;
         if ( prv->credit_balance < 0 )
         {
-            credit_peak += ( ( -prv->credit_balance * sdom->weight) +
+            credit_peak += ( ( -prv->credit_balance
+                               * sdom->weight
+                               * sdom->active_vcpu_count) +
                              (weight_total - 1)
                            ) / weight_total;
         }
@@ -1002,11 +1005,15 @@ csched_acct(void* dummy)
             if ( credit_cap < credit_peak )
                 credit_peak = credit_cap;
 
+            /* FIXME -- set cap per-vcpu as well...? */
             credit_cap = ( credit_cap + ( sdom->active_vcpu_count - 1 )
                          ) / sdom->active_vcpu_count;
         }
 
-        credit_fair = ( ( credit_total * sdom->weight) + (weight_total - 1)
+        credit_fair = ( ( credit_total
+                          * sdom->weight
+                          * sdom->active_vcpu_count )
+                        + (weight_total - 1)
                       ) / weight_total;
 
         if ( credit_fair < credit_peak )
diff -r ddb9f47ef2e2 -r 85bd0f6e8fed xen/include/asm-x86/hvm/svm/emulate.h
--- a/xen/include/asm-x86/hvm/svm/emulate.h     Thu Aug 12 18:56:20 2010 +0100
+++ b/xen/include/asm-x86/hvm/svm/emulate.h     Fri Aug 13 13:55:51 2010 +0100
@@ -31,6 +31,7 @@ enum instruction_index {
     INSTR_HLT,
     INSTR_INT3,
     INSTR_RDTSC,
+    INSTR_PAUSE,
     INSTR_MAX_COUNT /* Must be last - Number of instructions supported */
 };
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>