Am Montag, 13. August 2007 schrieb Laurent Vivier: > >> As guest accounting is hw dependent, I think we should add a hook in the > >> accounting functions. > >> > > > > Isn't PF_VM exactly such a hook? All the hypervisor needs to do is to > > set/unset it correctly? > > In fact, no. > > PF_VM is used to know we have entered a virtual CPU (the hypervisor set it, > the scheduler unset it on accounting)
Why not do something like the following. (This patch does not work as it relies on the no-existing var cputime_since_last_update, but it shows the idea) --- drivers/kvm/kvm.h | 13 +++++++++++++ drivers/kvm/svm.c | 3 ++- drivers/kvm/vmx.c | 3 ++- kernel/sched.c | 1 - 4 files changed, 17 insertions(+), 3 deletions(-) Index: kvm/drivers/kvm/kvm.h =================================================================== --- kvm.orig/drivers/kvm/kvm.h +++ kvm/drivers/kvm/kvm.h @@ -8,6 +8,7 @@ #include <linux/types.h> #include <linux/list.h> +#include <linux/kernel_stat.h> #include <linux/mutex.h> #include <linux/spinlock.h> #include <linux/signal.h> @@ -726,6 +727,18 @@ static inline u32 get_rdx_init_val(void) return 0x600; /* P6 family */ } +static inline guest_enter(void) +{ + account_system_time(current, 0, cputime_since_last_update); + current->flags |= PF_VCPU; +} + +static inline guest_exit(void) +{ + current->flags &= ~PF_VCPU; + account_system_time(current, 0, cputime_since_last_update); +} + #define ASM_VMX_VMCLEAR_RAX ".byte 0x66, 0x0f, 0xc7, 0x30" #define ASM_VMX_VMLAUNCH ".byte 0x0f, 0x01, 0xc2" #define ASM_VMX_VMRESUME ".byte 0x0f, 0x01, 0xc3" Index: kvm/kernel/sched.c =================================================================== --- kvm.orig/kernel/sched.c +++ kvm/kernel/sched.c @@ -3251,7 +3251,6 @@ void account_system_time(struct task_str p->utime = cputime_add(p->utime, cputime); cpustat->user = cputime64_add(cpustat->user, tmp); cpustat->guest = cputime64_add(cpustat->guest, tmp); - p->flags &= ~PF_VCPU; return; } Index: kvm/drivers/kvm/svm.c =================================================================== --- kvm.orig/drivers/kvm/svm.c +++ kvm/drivers/kvm/svm.c @@ -1404,7 +1404,7 @@ again: clgi(); vcpu->guest_mode = 1; - current->flags |= PF_VCPU; + guest_enter(); if (vcpu->requests) if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests)) svm_flush_tlb(vcpu); @@ -1537,6 +1537,7 @@ again: #endif : "cc", "memory" ); + guest_exit(); vcpu->guest_mode = 0; if (vcpu->fpu_active) { Index: kvm/drivers/kvm/vmx.c =================================================================== --- kvm.orig/drivers/kvm/vmx.c +++ kvm/drivers/kvm/vmx.c @@ -2078,7 +2078,7 @@ again: local_irq_disable(); vcpu->guest_mode = 1; - current->flags |= PF_VCPU; + guest_enter(); if (vcpu->requests) if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests)) vmx_flush_tlb(vcpu); @@ -2199,6 +2199,7 @@ again: [cr2]"i"(offsetof(struct kvm_vcpu, cr2)) : "cc", "memory" ); + guest_exit(); vcpu->guest_mode = 0; local_irq_enable(); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/