On Sun, Dec 4, 2011 at 6:23 PM, Avi Kivity <avi@xxxxxxxxxx> wrote: > On 12/02/2011 08:26 AM, Liu Ping Fan wrote: >> From: Liu Ping Fan <pingfank@xxxxxxxxxxxxxxxxxx> >> >> Currently, vcpu can be destructed only when kvm instance destroyed. >> Change this to vcpu's destruction taken when its refcnt is zero, >> and then vcpu MUST and CAN be destroyed before kvm's destroy. >> >> >> @@ -315,9 +315,17 @@ static void pit_do_work(struct work_struct *work) >> * LVT0 to NMI delivery. Other PIC interrupts are just sent to >> * VCPU0, and only if its LVT0 is in EXTINT mode. >> */ >> - if (kvm->arch.vapics_in_nmi_mode > 0) >> - kvm_for_each_vcpu(i, vcpu, kvm) >> + if (kvm->arch.vapics_in_nmi_mode > 0) { >> + rcu_read_lock(); >> + kvm_for_each_vcpu(i, cnt, vcpu, kvm) { >> + vcpu = kvm_get_vcpu(kvm, i); >> + if (vcpu == NULL) >> + continue; >> + cnt++; >> kvm_apic_nmi_wd_deliver(vcpu); >> + } >> + rcu_read_unlock(); >> + } >> } >> } > > This pattern keeps repeating, please fold it into kvm_for_each_vcpu(). > What about folding kvm_for_each_vcpu(i, cnt, vcpu, kvm) { vcpu = kvm_get_vcpu(kvm, i); if (vcpu == NULL) continue; cnt++; like this, #define kvm_for_each_vcpu(idx, cnt, vcpup, kvm) \ for (idx = 0, cnt = 0, vcpup = kvm_get_vcpu(kvm, idx); \ cnt < atomic_read(&kvm->online_vcpus) && \ idx < KVM_MAX_VCPUS; \ idx++, (vcpup == NULL)?:cnt++, vcpup = kvm_get_vcpu(kvm, idx)) \ if (vcpup == NULL) \ continue; \ else A little ugly, but have not thought a better way out :-) Thanks, ping fan > -- > error compiling committee.c: too many arguments to function > ��.n��������+%������w��{.n�����o�^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�