svn commit: r264324 - in head/sys/amd64/vmm: . intel io
Peter Grehan
grehan at FreeBSD.org
Thu Apr 10 19:15:59 UTC 2014
Author: grehan
Date: Thu Apr 10 19:15:58 2014
New Revision: 264324
URL: http://svnweb.freebsd.org/changeset/base/264324
Log:
Rework r264179.
- remove redundant code
- remove erroneous setting of the error return
in vmmdev_ioctl()
- use style(9) initialization
- in vmx_inject_pir(), document the race condition
that the final conditional statement was detecting,
Tested with both gcc and clang builds.
Reviewed by: neel
Modified:
head/sys/amd64/vmm/intel/vmx.c
head/sys/amd64/vmm/io/vatpic.c
head/sys/amd64/vmm/vmm_dev.c
Modified: head/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- head/sys/amd64/vmm/intel/vmx.c Thu Apr 10 18:43:02 2014 (r264323)
+++ head/sys/amd64/vmm/intel/vmx.c Thu Apr 10 19:15:58 2014 (r264324)
@@ -2755,6 +2755,7 @@ vmx_inject_pir(struct vlapic *vlapic)
}
pirval = 0;
+ pirbase = -1;
lapic = vlapic->apic_page;
val = atomic_readandclear_long(&pir_desc->pir[0]);
@@ -2788,16 +2789,29 @@ vmx_inject_pir(struct vlapic *vlapic)
pirbase = 192;
pirval = val;
}
- if (pirbase == -1) {
- VCPU_CTR0(vlapic->vm, vlapic->vcpuid, "vmx_inject_pir: "
- "no posted interrupt found");
- return;
- }
+
VLAPIC_CTR_IRR(vlapic, "vmx_inject_pir");
/*
* Update RVI so the processor can evaluate pending virtual
* interrupts on VM-entry.
+ *
+ * It is possible for pirval to be 0 here, even though the
+ * pending bit has been set. The scenario is:
+ * CPU-Y is sending a posted interrupt to CPU-X, which
+ * is running a guest and processing posted interrupts in h/w.
+ * CPU-X will eventually exit and the state seen in s/w is
+ * the pending bit set, but no PIR bits set.
+ *
+ * CPU-X CPU-Y
+ * (vm running) (host running)
+ * rx posted interrupt
+ * CLEAR pending bit
+ * SET PIR bit
+ * READ/CLEAR PIR bits
+ * SET pending bit
+ * (vm exit)
+ * pending bit set, PIR 0
*/
if (pirval != 0) {
rvi = pirbase + flsl(pirval) - 1;
Modified: head/sys/amd64/vmm/io/vatpic.c
==============================================================================
--- head/sys/amd64/vmm/io/vatpic.c Thu Apr 10 18:43:02 2014 (r264323)
+++ head/sys/amd64/vmm/io/vatpic.c Thu Apr 10 19:15:58 2014 (r264324)
@@ -473,9 +473,10 @@ vatpic_master_handler(void *vm, int vcpu
{
struct vatpic *vatpic;
struct atpic *atpic;
- int error = 0;;
+ int error;
uint8_t val;
+ error = 0;
vatpic = vm_atpic(vm);
atpic = &vatpic->atpic[0];
Modified: head/sys/amd64/vmm/vmm_dev.c
==============================================================================
--- head/sys/amd64/vmm/vmm_dev.c Thu Apr 10 18:43:02 2014 (r264323)
+++ head/sys/amd64/vmm/vmm_dev.c Thu Apr 10 19:15:58 2014 (r264324)
@@ -171,6 +171,7 @@ vmmdev_ioctl(struct cdev *cdev, u_long c
if (sc == NULL)
return (ENXIO);
+ error = 0;
vcpu = -1;
state_changed = 0;
@@ -231,7 +232,6 @@ vmmdev_ioctl(struct cdev *cdev, u_long c
break;
default:
- error = EINVAL;
break;
}
More information about the svn-src-all
mailing list