virt: kvm: arm: vgic: Return failure code '-EBUSY' when mutex_trylock() fails
PATCH 1/1 virt: kvm: arm: vgic: Return failure code '-EBUSY' when mutex_trylock() fails
When mutex_trylock() fails, kvm_vgic_create() will not create 'vgic', so it need return failure code '-EBUSY' instead of '0' to let outside know about it.
Also simplify the code within kvm_vgic_create():
- kvm_for_each_vcpu() scanning once is enough for current case.
- Remove redundant variable 'vcpu_lock_idx'.
--- virt/kvm/arm/vgic.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
virt/kvm/arm/vgic.c +7 -8
@@ -1933,7 +1933,7 @@ out:int kvm_vgic_create (struct kvm *kvm) { -int i, vcpu_lock_idx =-1 , ret =0 ; +int i, ret =0 ;struct kvm_vcpu *vcpu;mutex_lock (&kvm->lock);
@@ -1949,13 +1949,12 @@ int kvm_vgic_create(struct kvm *kvm)* that no other VCPUs are run while we create the vgic. */ kvm_for_each_vcpu (i, vcpu, kvm) { -if (!mutex_trylock (&vcpu->mutex)) +if (!mutex_trylock (&vcpu->mutex)) { + ret = -EBUSY ; goto out_unlock; - vcpu_lock_idx = i; - } - -kvm_for_each_vcpu (i, vcpu, kvm) { + }if (vcpu->arch.has_run_once) { +mutex_unlock (&vcpu->mutex); ret = -EBUSY ; goto out_unlock; }
@@ -1968,8 +1967,8 @@ int kvm_vgic_create(struct kvm *kvm) kvm->arch.vgic.vgic_cpu_base =VGIC_ADDR_UNDEF ; out_unlock: -for (; vcpu_lock_idx >=0 ; vcpu_lock_idx--) { - vcpu =kvm_get_vcpu (kvm, vcpu_lock_idx); +while (i-- >0 ) { + vcpu =kvm_get_vcpu (kvm, i);mutex_unlock (&vcpu->mutex); }
Signature · 1 line
1.9.3
Quoted 3 lines · Chen Gang
When
mutex_trylock()fails,kvm_vgic_create()will not create 'vgic', so it need return failure code '-EBUSY' instead of '0' to let outside know about it.
I already sent a patch for the -EBUSY:
https://lists.cs.columbia.edu/pipermail/kvmarm/2014-November/011936.html
Quoted 6 lines
Also simplify the code within
kvm_vgic_create():-
kvm_for_each_vcpu()scanning once is enough for current case.- Remove redundant variable '
vcpu_lock_idx'.
I don't like using the iterator variable for this kind of thing because it can really break in languages where i is out-of-scope after the loop and it is too easy to reuse the iterator variable in later versions of the code.
That being said, the scanning once is slightly prettier I guess, but I'd rather not introduce the churn unless others (Marc) think this is a big win.
-Christoffer
Quoted 51 lines
Signed-off-by Chen Gang <[email protected]>--- virt/kvm/arm/vgic.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)virt/kvm/arm/vgic.c +7
-8@@ -1933,7 +1933,7 @@ out:int kvm_vgic_create (struct kvm *kvm) { -int i, vcpu_lock_idx =-1 , ret =0 ; +int i, ret =0 ;struct kvm_vcpu *vcpu;mutex_lock (&kvm->lock);@@ -1949,13 +1949,12 @@ int kvm_vgic_create(struct kvm *kvm)* that no other VCPUs are run while we create the vgic. */ kvm_for_each_vcpu (i, vcpu, kvm) { -if (!mutex_trylock (&vcpu->mutex)) +if (!mutex_trylock (&vcpu->mutex)) { + ret = -EBUSY ; goto out_unlock; - vcpu_lock_idx = i; - } - -kvm_for_each_vcpu (i, vcpu, kvm) { + }if (vcpu->arch.has_run_once) { +mutex_unlock (&vcpu->mutex); ret = -EBUSY ; goto out_unlock; }@@ -1968,8 +1967,8 @@ int kvm_vgic_create(struct kvm *kvm) kvm->arch.vgic.vgic_cpu_base =VGIC_ADDR_UNDEF ; out_unlock: -for (; vcpu_lock_idx >=0 ; vcpu_lock_idx--) { - vcpu =kvm_get_vcpu (kvm, vcpu_lock_idx); +while (i-- >0 ) { + vcpu =kvm_get_vcpu (kvm, i);mutex_unlock (&vcpu->mutex); }Signature · 1 line
1.9.3
Quoted 8 lines · Christoffer Dall
Quoted 3 lines · Chen Gang
When
mutex_trylock()fails,kvm_vgic_create()will not create 'vgic', so it need return failure code '-EBUSY' instead of '0' to let outside know about it.I already sent a patch for the
-EBUSY:
https://lists.cs.columbia.edu/pipermail/kvmarm/2014-November/011936.html
Yeah, really it is.
Quoted 12 lines
Quoted 6 lines
Also simplify the code within
kvm_vgic_create():-
kvm_for_each_vcpu()scanning once is enough for current case.- Remove redundant variable '
vcpu_lock_idx'.I don't like using the iterator variable for this kind of thing because it can really break in languages where i is out-of-scope after the loop and it is too easy to reuse the iterator variable in later versions of the code.
For me, what you said is OK, we can still keep it no touch.
Quoted 4 lines
That being said, the scanning once is slightly prettier I guess, but I'd rather not introduce the churn unless others (Marc) think this is a big win.
If only merge the 2 scanning loops, it will not change much. And also can let code simpler and clearer for readers (both are for processing and checking '-EBUSY').
If possible, after your patch merges into linux next tree, I will send the related improving patch for it.
Thanks.
Quoted 53 lines
-Christoffer
Quoted 51 lines
Signed-off-by Chen Gang <[email protected]>--- virt/kvm/arm/vgic.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)virt/kvm/arm/vgic.c +7
-8@@ -1933,7 +1933,7 @@ out:int kvm_vgic_create (struct kvm *kvm) { -int i, vcpu_lock_idx =-1 , ret =0 ; +int i, ret =0 ;struct kvm_vcpu *vcpu;mutex_lock (&kvm->lock);@@ -1949,13 +1949,12 @@ int kvm_vgic_create(struct kvm *kvm)* that no other VCPUs are run while we create the vgic. */ kvm_for_each_vcpu (i, vcpu, kvm) { -if (!mutex_trylock (&vcpu->mutex)) +if (!mutex_trylock (&vcpu->mutex)) { + ret = -EBUSY ; goto out_unlock; - vcpu_lock_idx = i; - } - -kvm_for_each_vcpu (i, vcpu, kvm) { + }if (vcpu->arch.has_run_once) { +mutex_unlock (&vcpu->mutex); ret = -EBUSY ; goto out_unlock; }@@ -1968,8 +1967,8 @@ int kvm_vgic_create(struct kvm *kvm) kvm->arch.vgic.vgic_cpu_base =VGIC_ADDR_UNDEF ; out_unlock: -for (; vcpu_lock_idx >=0 ; vcpu_lock_idx--) { - vcpu =kvm_get_vcpu (kvm, vcpu_lock_idx); +while (i-- >0 ) { + vcpu =kvm_get_vcpu (kvm, i);mutex_unlock (&vcpu->mutex); }Signature · 1 line
1.9.3
Signature · 3 lines
Chen Gang Open, share, and attitude like air, water, and life which God blessed