[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] VMX: Add posted interrupt supporting
>>> On 09.04.13 at 08:01, Yang Zhang <yang.z.zhang@xxxxxxxxx> wrote: > +static void vmx_deliver_posted_intr(struct vcpu *v, u8 vector, u8 trig_mode) > +{ > + vlapic_set_tmr(vcpu_vlapic(v), vector, trig_mode); > + > + vmx_update_eoi_exit_bitmap(v, vector, trig_mode); > + > + if ( pi_test_and_set_pir(vector, &v->arch.hvm_vmx.pi_desc) ) > + return; > + > + if ( unlikely(v->arch.hvm_vmx.eoi_exitmap_changed) ) > + { > + /* If EOI exitbitmap needs to changed or notification vector > + * can't be allocated, interrupt will not be injected till > + * VMEntry as it used to be > + */ > + pi_test_and_set_on(&v->arch.hvm_vmx.pi_desc); Why is this a test-and-set when the result is unused? > + goto out; > + } > + > + if ( !pi_test_and_set_on(&v->arch.hvm_vmx.pi_desc) ) And if it's just because you don't want to have a simple "set" only operation, then the two instances should be folded, and the result stored in a local variable. > +static void vmx_sync_pir_to_irr(struct vcpu *v) > +{ > + struct vlapic *vlapic = vcpu_vlapic(v); > + u32 val; > + int offset, group; unsigned. > + > + if ( !pi_test_and_clear_on(&v->arch.hvm_vmx.pi_desc) ) > + return; > + > + for (group = 0; group < 8; group++ ) Formatting. > + { > + val = pi_get_pir(&v->arch.hvm_vmx.pi_desc, group); > + offset = APIC_IRR + 0x10 * group; > + *((uint32_t *)(&vlapic->regs->data[offset])) |= val; Can't you use vlapic_set_vector() here (even if that means looping over vectors individually rather than groups), to add the necessary atomicity (I don't see how you avoid races with other updates) and to avoid the ugly cast? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |