* Performance test result between virtio_pci MSI-X disable and enable
@ 2010-11-23 2:53 lidong chen
2010-11-23 6:20 ` Avi Kivity
2010-12-22 13:52 ` Michael S. Tsirkin
0 siblings, 2 replies; 22+ messages in thread
From: lidong chen @ 2010-11-23 2:53 UTC (permalink / raw)
To: Gleb Natapov, Avi Kivity, mst, aliguori, rusty, kvm
Test method:
Send the same traffic load between virtio_pci MSI-X disable and
enable,and compare the cpu rate of host os.
I used the same version of virtio driver, only modify the msi-x option.
the host os version is 2.6.32.
the virtio dirver is from rhel6.
the guest version os is 2.6.16.
Test result:
with msi-x disable, the cpu rate of host os is 110%.
with msi-x enable, the cpu rate of host os is 140%.
the /proc/interrupt with msi-x disable is below:
CPU0 CPU1
0: 12326706 0 IO-APIC-edge timer
1: 8 0 IO-APIC-edge i8042
8: 0 0 IO-APIC-edge rtc
9: 0 0 IO-APIC-level acpi
10: 4783008 0 IO-APIC-level virtio2, virtio3
11: 5363828 0 IO-APIC-level virtio1, virtio4, virtio5
12: 104 0 IO-APIC-edge i8042
NMI: 2857871 2650796
LOC: 12324952 12325609
ERR: 0
MIS: 0
the /proc/interrupt with msi-x enable is below:
CPU0 CPU1
0: 1896802 0 IO-APIC-edge timer
1: 8 0 IO-APIC-edge i8042
4: 14 0 IO-APIC-edge serial
8: 0 0 IO-APIC-edge rtc
9: 0 0 IO-APIC-level acpi
10: 0 0 IO-APIC-level virtio1, virtio2, virtio5
11: 1 0 IO-APIC-level virtio0, virtio3, virtio4
12: 104 0 IO-APIC-edge i8042
50: 1 0 PCI-MSI-X virtio2-output
58: 0 0 PCI-MSI-X virtio3-config
66: 2046985 0 PCI-MSI-X virtio3-input
74: 2 0 PCI-MSI-X virtio3-output
82: 0 0 PCI-MSI-X virtio4-config
90: 217 0 PCI-MSI-X virtio4-input
98: 0 0 PCI-MSI-X virtio4-output
177: 0 0 PCI-MSI-X virtio0-config
185: 341831 0 PCI-MSI-X virtio0-input
193: 1 0 PCI-MSI-X virtio0-output
201: 0 0 PCI-MSI-X virtio1-config
209: 188747 0 PCI-MSI-X virtio1-input
217: 1 0 PCI-MSI-X virtio1-output
225: 0 0 PCI-MSI-X virtio2-config
233: 2204149 0 PCI-MSI-X virtio2-input
NMI: 1455767 1426226
LOC: 1896099 1896637
ERR: 0
MIS: 0
Code difference:
I disalbe msi-x by modify the function vp_find_vqs like this:
static int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[],
vq_callback_t *callbacks[],
const char *names[])
{
#if 0
int err;
/* Try MSI-X with one vector per queue. */
err = vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names, true, true);
if (!err)
return 0;
/* Fallback: MSI-X with one vector for config, one shared for queues. */
err = vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names,
true, false);
if (!err)
return 0;
/* Finally fall back to regular interrupts. */
#endif
return vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names,
false, false);
}
Conclusion:
msi-x enable waste more cpu resource is caused by MSIX mask bit. In
older kernels program this bit twice
on every interrupt. and caused ept violation.
So I think we should add a param to control this.with older kernels,
we should disable MSIX.
And I think this should deal by qemu.
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 2:53 Performance test result between virtio_pci MSI-X disable and enable lidong chen @ 2010-11-23 6:20 ` Avi Kivity 2010-11-23 6:42 ` Gleb Natapov 2010-11-23 7:27 ` lidong chen 2010-12-22 13:52 ` Michael S. Tsirkin 1 sibling, 2 replies; 22+ messages in thread From: Avi Kivity @ 2010-11-23 6:20 UTC (permalink / raw) To: lidong chen; +Cc: Gleb Natapov, mst, aliguori, rusty, kvm On 11/23/2010 04:53 AM, lidong chen wrote: > Test method: > Send the same traffic load between virtio_pci MSI-X disable and > enable,and compare the cpu rate of host os. > I used the same version of virtio driver, only modify the msi-x option. > the host os version is 2.6.32. > the virtio dirver is from rhel6. > the guest version os is 2.6.16. > > Test result: > with msi-x disable, the cpu rate of host os is 110%. > with msi-x enable, the cpu rate of host os is 140%. > ... > Conclusion: > msi-x enable waste more cpu resource is caused by MSIX mask bit. In > older kernels program this bit twice > on every interrupt. and caused ept violation. > > So I think we should add a param to control this.with older kernels, > we should disable MSIX. > And I think this should deal by qemu. There is now work in progress (by Sheng Yang) to speed up mask bit emulation, which should improve things. Also, newer kernels don't hit the mask bit so hard. You might try to backport the mask bit patches to your 2.6.16 guest. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 6:20 ` Avi Kivity @ 2010-11-23 6:42 ` Gleb Natapov 2010-11-23 7:27 ` lidong chen 1 sibling, 0 replies; 22+ messages in thread From: Gleb Natapov @ 2010-11-23 6:42 UTC (permalink / raw) To: Avi Kivity; +Cc: lidong chen, mst, aliguori, rusty, kvm On Tue, Nov 23, 2010 at 08:20:19AM +0200, Avi Kivity wrote: > On 11/23/2010 04:53 AM, lidong chen wrote: > >Test method: > >Send the same traffic load between virtio_pci MSI-X disable and > >enable,and compare the cpu rate of host os. > >I used the same version of virtio driver, only modify the msi-x option. > >the host os version is 2.6.32. > >the virtio dirver is from rhel6. > >the guest version os is 2.6.16. > > > >Test result: > >with msi-x disable, the cpu rate of host os is 110%. > >with msi-x enable, the cpu rate of host os is 140%. > > > ... > > >Conclusion: > >msi-x enable waste more cpu resource is caused by MSIX mask bit. In > >older kernels program this bit twice > >on every interrupt. and caused ept violation. > > > >So I think we should add a param to control this.with older kernels, > >we should disable MSIX. > >And I think this should deal by qemu. > > There is now work in progress (by Sheng Yang) to speed up mask bit > emulation, which should improve things. Also, newer kernels don't > hit the mask bit so hard. You might try to backport the mask bit > patches to your 2.6.16 guest. > And IIRC we do have option to disable MSIX in qemu. I just don't remember how it looks. Michael? -- Gleb. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 6:20 ` Avi Kivity 2010-11-23 6:42 ` Gleb Natapov @ 2010-11-23 7:27 ` lidong chen 2010-11-23 7:39 ` Avi Kivity 1 sibling, 1 reply; 22+ messages in thread From: lidong chen @ 2010-11-23 7:27 UTC (permalink / raw) To: sheng.yang; +Cc: Gleb Natapov, mst, aliguori, rusty, kvm, Avi Kivity can you tell me something about this problem. thanks. 2010/11/23 Avi Kivity <avi@redhat.com>: > On 11/23/2010 04:53 AM, lidong chen wrote: >> >> Test method: >> Send the same traffic load between virtio_pci MSI-X disable and >> enable,and compare the cpu rate of host os. >> I used the same version of virtio driver, only modify the msi-x option. >> the host os version is 2.6.32. >> the virtio dirver is from rhel6. >> the guest version os is 2.6.16. >> >> Test result: >> with msi-x disable, the cpu rate of host os is 110%. >> with msi-x enable, the cpu rate of host os is 140%. >> > ... > >> Conclusion: >> msi-x enable waste more cpu resource is caused by MSIX mask bit. In >> older kernels program this bit twice >> on every interrupt. and caused ept violation. >> >> So I think we should add a param to control this.with older kernels, >> we should disable MSIX. >> And I think this should deal by qemu. > > There is now work in progress (by Sheng Yang) to speed up mask bit > emulation, which should improve things. Also, newer kernels don't hit the > mask bit so hard. You might try to backport the mask bit patches to your > 2.6.16 guest. > > -- > I have a truly marvellous patch that fixes the bug which this > signature is too narrow to contain. > > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 7:27 ` lidong chen @ 2010-11-23 7:39 ` Avi Kivity 2010-11-30 9:10 ` lidong chen 0 siblings, 1 reply; 22+ messages in thread From: Avi Kivity @ 2010-11-23 7:39 UTC (permalink / raw) To: lidong chen; +Cc: sheng.yang, Gleb Natapov, mst, aliguori, rusty, kvm On 11/23/2010 09:27 AM, lidong chen wrote: > can you tell me something about this problem. > thanks. Which problem? -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 7:39 ` Avi Kivity @ 2010-11-30 9:10 ` lidong chen 2010-11-30 9:24 ` Yang, Sheng 0 siblings, 1 reply; 22+ messages in thread From: lidong chen @ 2010-11-30 9:10 UTC (permalink / raw) To: Avi Kivity, sheng.yang; +Cc: Gleb Natapov, mst, aliguori, rusty, kvm sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. I test kvm with sriov, which the vf driver could not disable msix. so the host os waste a lot of cpu. cpu rate of host os is 90%. then I test xen with sriov, there ara also a lot of vm exits caused by MSIX mask. but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen and domain0 is 60%. without sr-iov, the cpu rate of xen and domain0 is higher than kvm. so i think the problem is kvm waste more cpu resource to deal with MSIX mask. and we can see how xen deal with MSIX mask. if this problem sloved, maybe with MSIX enabled, the performace is better. 2010/11/23 Avi Kivity <avi@redhat.com>: > On 11/23/2010 09:27 AM, lidong chen wrote: >> >> can you tell me something about this problem. >> thanks. > > Which problem? > > -- > I have a truly marvellous patch that fixes the bug which this > signature is too narrow to contain. > > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-30 9:10 ` lidong chen @ 2010-11-30 9:24 ` Yang, Sheng 2010-12-01 8:41 ` lidong chen 0 siblings, 1 reply; 22+ messages in thread From: Yang, Sheng @ 2010-11-30 9:24 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > > I test kvm with sriov, which the vf driver could not disable msix. > so the host os waste a lot of cpu. cpu rate of host os is 90%. > > then I test xen with sriov, there ara also a lot of vm exits caused by > MSIX mask. > but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > and domain0 is 60%. > > without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > > so i think the problem is kvm waste more cpu resource to deal with MSIX > mask. and we can see how xen deal with MSIX mask. > > if this problem sloved, maybe with MSIX enabled, the performace is better. Please refer to my posted patches for this issue. http://www.spinics.net/lists/kvm/msg44992.html -- regards Yang, Sheng > > 2010/11/23 Avi Kivity <avi@redhat.com>: > > On 11/23/2010 09:27 AM, lidong chen wrote: > >> can you tell me something about this problem. > >> thanks. > > > > Which problem? > > > > -- > > I have a truly marvellous patch that fixes the bug which this > > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-30 9:24 ` Yang, Sheng @ 2010-12-01 8:41 ` lidong chen 2010-12-01 8:49 ` Yang, Sheng ` (2 more replies) 0 siblings, 3 replies; 22+ messages in thread From: lidong chen @ 2010-12-01 8:41 UTC (permalink / raw) To: Yang, Sheng Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org I used sr-iov, give each vm 2 vf. after apply the patch, and i found performence is the same. the reason is in function msix_mmio_write, mostly addr is not in mmio range. static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, const void *val) { struct kvm_assigned_dev_kernel *adev = container_of(this, struct kvm_assigned_dev_kernel, msix_mmio_dev); int idx, r = 0; unsigned long new_val = *(unsigned long *)val; mutex_lock(&adev->kvm->lock); if (!msix_mmio_in_range(adev, addr, len)) { // return here. r = -EOPNOTSUPP; goto out; } i printk the value: addr start end len F004C00C F0044000 F0044030 4 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) Subsystem: Intel Corporation Unknown device 000c Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- Latency: 0 Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 Vector table: BAR=3 offset=00000000 PBA: BAR=3 offset=00002000 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) Subsystem: Intel Corporation Unknown device 000c Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- Latency: 0 Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 Vector table: BAR=3 offset=00000000 PBA: BAR=3 offset=00002000 +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, + gpa_t addr, int len) +{ + gpa_t start, end; + + BUG_ON(adev->msix_mmio_base == 0); + start = adev->msix_mmio_base; + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * + adev->msix_max_entries_nr; + if (addr >= start && addr + len <= end) + return true; + + return false; +} 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. >> >> I test kvm with sriov, which the vf driver could not disable msix. >> so the host os waste a lot of cpu. cpu rate of host os is 90%. >> >> then I test xen with sriov, there ara also a lot of vm exits caused by >> MSIX mask. >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen >> and domain0 is 60%. >> >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. >> >> so i think the problem is kvm waste more cpu resource to deal with MSIX >> mask. and we can see how xen deal with MSIX mask. >> >> if this problem sloved, maybe with MSIX enabled, the performace is better. > > Please refer to my posted patches for this issue. > > http://www.spinics.net/lists/kvm/msg44992.html > > -- > regards > Yang, Sheng > >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: >> > On 11/23/2010 09:27 AM, lidong chen wrote: >> >> can you tell me something about this problem. >> >> thanks. >> > >> > Which problem? >> > >> > -- >> > I have a truly marvellous patch that fixes the bug which this >> > signature is too narrow to contain. > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 8:41 ` lidong chen @ 2010-12-01 8:49 ` Yang, Sheng 2010-12-01 8:54 ` lidong chen 2010-12-01 8:56 ` Yang, Sheng 2010-12-01 14:03 ` Michael S. Tsirkin 2 siblings, 1 reply; 22+ messages in thread From: Yang, Sheng @ 2010-12-01 8:49 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 16:41:38 lidong chen wrote: > I used sr-iov, give each vm 2 vf. > after apply the patch, and i found performence is the same. > > the reason is in function msix_mmio_write, mostly addr is not in mmio > range. Did you patch qemu as well? You can see it's impossible for kernel part to work alone... http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html -- regards Yang, Sheng > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, > const void *val) > { > struct kvm_assigned_dev_kernel *adev = > container_of(this, struct kvm_assigned_dev_kernel, > msix_mmio_dev); > int idx, r = 0; > unsigned long new_val = *(unsigned long *)val; > > mutex_lock(&adev->kvm->lock); > if (!msix_mmio_in_range(adev, addr, len)) { > // return here. > r = -EOPNOTSUPP; > goto out; > } > > i printk the value: > addr start end len > F004C00C F0044000 F0044030 4 > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > + gpa_t addr, int len) > +{ > + gpa_t start, end; > + > + BUG_ON(adev->msix_mmio_base == 0); > + start = adev->msix_mmio_base; > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > + adev->msix_max_entries_nr; > + if (addr >= start && addr + len <= end) > + return true; > + > + return false; > +} > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > >> > >> I test kvm with sriov, which the vf driver could not disable msix. > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> > >> then I test xen with sriov, there ara also a lot of vm exits caused by > >> MSIX mask. > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > >> and domain0 is 60%. > >> > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > >> > >> so i think the problem is kvm waste more cpu resource to deal with MSIX > >> mask. and we can see how xen deal with MSIX mask. > >> > >> if this problem sloved, maybe with MSIX enabled, the performace is > >> better. > > > > Please refer to my posted patches for this issue. > > > > http://www.spinics.net/lists/kvm/msg44992.html > > > > -- > > regards > > Yang, Sheng > > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> >> can you tell me something about this problem. > >> >> thanks. > >> > > >> > Which problem? > >> > > >> > -- > >> > I have a truly marvellous patch that fixes the bug which this > >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 8:49 ` Yang, Sheng @ 2010-12-01 8:54 ` lidong chen 2010-12-01 9:02 ` Yang, Sheng 0 siblings, 1 reply; 22+ messages in thread From: lidong chen @ 2010-12-01 8:54 UTC (permalink / raw) To: Yang, Sheng Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org yes, i patch qemu as well. and i found the address of second vf is not in mmio range. the first one is fine. 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > On Wednesday 01 December 2010 16:41:38 lidong chen wrote: >> I used sr-iov, give each vm 2 vf. >> after apply the patch, and i found performence is the same. >> >> the reason is in function msix_mmio_write, mostly addr is not in mmio >> range. > > Did you patch qemu as well? You can see it's impossible for kernel part to work > alone... > > http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html > > -- > regards > Yang, Sheng > > >> >> static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, >> const void *val) >> { >> struct kvm_assigned_dev_kernel *adev = >> container_of(this, struct kvm_assigned_dev_kernel, >> msix_mmio_dev); >> int idx, r = 0; >> unsigned long new_val = *(unsigned long *)val; >> >> mutex_lock(&adev->kvm->lock); >> if (!msix_mmio_in_range(adev, addr, len)) { >> // return here. >> r = -EOPNOTSUPP; >> goto out; >> } >> >> i printk the value: >> addr start end len >> F004C00C F0044000 F0044030 4 >> >> 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) >> Subsystem: Intel Corporation Unknown device 000c >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> Stepping- SERR- FastB2B- >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> <TAbort- <MAbort- >SERR- <PERR- >> Latency: 0 >> Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] >> Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> Vector table: BAR=3 offset=00000000 >> PBA: BAR=3 offset=00002000 >> >> 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) >> Subsystem: Intel Corporation Unknown device 000c >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> Stepping- SERR- FastB2B- >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> <TAbort- <MAbort- >SERR- <PERR- >> Latency: 0 >> Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] >> Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> Vector table: BAR=3 offset=00000000 >> PBA: BAR=3 offset=00002000 >> >> >> >> +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, >> + gpa_t addr, int len) >> +{ >> + gpa_t start, end; >> + >> + BUG_ON(adev->msix_mmio_base == 0); >> + start = adev->msix_mmio_base; >> + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * >> + adev->msix_max_entries_nr; >> + if (addr >= start && addr + len <= end) >> + return true; >> + >> + return false; >> +} >> >> 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: >> > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: >> >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. >> >> >> >> I test kvm with sriov, which the vf driver could not disable msix. >> >> so the host os waste a lot of cpu. cpu rate of host os is 90%. >> >> >> >> then I test xen with sriov, there ara also a lot of vm exits caused by >> >> MSIX mask. >> >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen >> >> and domain0 is 60%. >> >> >> >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. >> >> >> >> so i think the problem is kvm waste more cpu resource to deal with MSIX >> >> mask. and we can see how xen deal with MSIX mask. >> >> >> >> if this problem sloved, maybe with MSIX enabled, the performace is >> >> better. >> > >> > Please refer to my posted patches for this issue. >> > >> > http://www.spinics.net/lists/kvm/msg44992.html >> > >> > -- >> > regards >> > Yang, Sheng >> > >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: >> >> > On 11/23/2010 09:27 AM, lidong chen wrote: >> >> >> can you tell me something about this problem. >> >> >> thanks. >> >> > >> >> > Which problem? >> >> > >> >> > -- >> >> > I have a truly marvellous patch that fixes the bug which this >> >> > signature is too narrow to contain. > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 8:54 ` lidong chen @ 2010-12-01 9:02 ` Yang, Sheng 2010-12-01 9:29 ` lidong chen 2010-12-01 9:34 ` Yang, Sheng 0 siblings, 2 replies; 22+ messages in thread From: Yang, Sheng @ 2010-12-01 9:02 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 16:54:16 lidong chen wrote: > yes, i patch qemu as well. > > and i found the address of second vf is not in mmio range. the first > one is fine. So looks like something wrong with MMIO register part. Could you check the registeration in assigned_dev_iomem_map() of the 4th patch for QEmu? I suppose something wrong with it. I would try to reproduce it here. And if you only use one vf, how about the gain? -- regards Yang, Sheng > > 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > > On Wednesday 01 December 2010 16:41:38 lidong chen wrote: > >> I used sr-iov, give each vm 2 vf. > >> after apply the patch, and i found performence is the same. > >> > >> the reason is in function msix_mmio_write, mostly addr is not in mmio > >> range. > > > > Did you patch qemu as well? You can see it's impossible for kernel part > > to work alone... > > > > http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html > > > > -- > > regards > > Yang, Sheng > > > >> static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int > >> len, const void *val) > >> { > >> struct kvm_assigned_dev_kernel *adev = > >> container_of(this, struct kvm_assigned_dev_kernel, > >> msix_mmio_dev); > >> int idx, r = 0; > >> unsigned long new_val = *(unsigned long *)val; > >> > >> mutex_lock(&adev->kvm->lock); > >> if (!msix_mmio_in_range(adev, addr, len)) { > >> // return here. > >> r = -EOPNOTSUPP; > >> goto out; > >> } > >> > >> i printk the value: > >> addr start end len > >> F004C00C F0044000 F0044030 4 > >> > >> 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > >> 01) Subsystem: Intel Corporation Unknown device 000c > >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > >> ParErr- Stepping- SERR- FastB2B- > >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> <TAbort- <MAbort- >SERR- <PERR- > >> Latency: 0 > >> Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > >> Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > >> Vector table: BAR=3 offset=00000000 > >> PBA: BAR=3 offset=00002000 > >> > >> 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > >> 01) Subsystem: Intel Corporation Unknown device 000c > >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > >> ParErr- Stepping- SERR- FastB2B- > >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> <TAbort- <MAbort- >SERR- <PERR- > >> Latency: 0 > >> Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > >> Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > >> Vector table: BAR=3 offset=00000000 > >> PBA: BAR=3 offset=00002000 > >> > >> > >> > >> +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > >> + gpa_t addr, int len) > >> +{ > >> + gpa_t start, end; > >> + > >> + BUG_ON(adev->msix_mmio_base == 0); > >> + start = adev->msix_mmio_base; > >> + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > >> + adev->msix_max_entries_nr; > >> + if (addr >= start && addr + len <= end) > >> + return true; > >> + > >> + return false; > >> +} > >> > >> 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > >> > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > >> >> > >> >> I test kvm with sriov, which the vf driver could not disable msix. > >> >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> >> > >> >> then I test xen with sriov, there ara also a lot of vm exits caused > >> >> by MSIX mask. > >> >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > >> >> and domain0 is 60%. > >> >> > >> >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > >> >> > >> >> so i think the problem is kvm waste more cpu resource to deal with > >> >> MSIX mask. and we can see how xen deal with MSIX mask. > >> >> > >> >> if this problem sloved, maybe with MSIX enabled, the performace is > >> >> better. > >> > > >> > Please refer to my posted patches for this issue. > >> > > >> > http://www.spinics.net/lists/kvm/msg44992.html > >> > > >> > -- > >> > regards > >> > Yang, Sheng > >> > > >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> >> >> can you tell me something about this problem. > >> >> >> thanks. > >> >> > > >> >> > Which problem? > >> >> > > >> >> > -- > >> >> > I have a truly marvellous patch that fixes the bug which this > >> >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 9:02 ` Yang, Sheng @ 2010-12-01 9:29 ` lidong chen 2010-12-01 9:37 ` Yang, Sheng 2010-12-01 9:34 ` Yang, Sheng 1 sibling, 1 reply; 22+ messages in thread From: lidong chen @ 2010-12-01 9:29 UTC (permalink / raw) To: Yang, Sheng Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org maybe because i modify the code in assigned_dev_iomem_map(). i used RHEL6, and calc_assigned_dev_id is below: static uint32_t calc_assigned_dev_id(uint8_t bus, uint8_t devfn) { return (uint32_t)bus << 8 | (uint32_t)devfn; } and in patch there are there param. + msix_mmio.id = calc_assigned_dev_id(r_dev->h_segnr, + r_dev->h_busnr, r_dev->h_devfn); #ifdef KVM_CAP_MSIX_MASK if (cap_mask) { memset(&msix_mmio, 0, sizeof msix_mmio); msix_mmio.id = calc_assigned_dev_id(r_dev->h_busnr, r_dev->h_devfn); msix_mmio.type = KVM_MSIX_TYPE_ASSIGNED_DEV; msix_mmio.base_addr = e_phys + offset; msix_mmio.max_entries_nr = r_dev->max_msix_entries_nr; msix_mmio.flags = KVM_MSIX_MMIO_FLAG_REGISTER; ret = kvm_update_msix_mmio(kvm_context, &msix_mmio); if (ret) fprintf(stderr, "fail to register in-kernel msix_mmio!\n"); } #endif 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > On Wednesday 01 December 2010 16:54:16 lidong chen wrote: >> yes, i patch qemu as well. >> >> and i found the address of second vf is not in mmio range. the first >> one is fine. > > So looks like something wrong with MMIO register part. Could you check the > registeration in assigned_dev_iomem_map() of the 4th patch for QEmu? I suppose > something wrong with it. I would try to reproduce it here. > > And if you only use one vf, how about the gain? > > -- > regards > Yang, Sheng > >> >> 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: >> > On Wednesday 01 December 2010 16:41:38 lidong chen wrote: >> >> I used sr-iov, give each vm 2 vf. >> >> after apply the patch, and i found performence is the same. >> >> >> >> the reason is in function msix_mmio_write, mostly addr is not in mmio >> >> range. >> > >> > Did you patch qemu as well? You can see it's impossible for kernel part >> > to work alone... >> > >> > http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html >> > >> > -- >> > regards >> > Yang, Sheng >> > >> >> static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int >> >> len, const void *val) >> >> { >> >> struct kvm_assigned_dev_kernel *adev = >> >> container_of(this, struct kvm_assigned_dev_kernel, >> >> msix_mmio_dev); >> >> int idx, r = 0; >> >> unsigned long new_val = *(unsigned long *)val; >> >> >> >> mutex_lock(&adev->kvm->lock); >> >> if (!msix_mmio_in_range(adev, addr, len)) { >> >> // return here. >> >> r = -EOPNOTSUPP; >> >> goto out; >> >> } >> >> >> >> i printk the value: >> >> addr start end len >> >> F004C00C F0044000 F0044030 4 >> >> >> >> 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> >> 01) Subsystem: Intel Corporation Unknown device 000c >> >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- >> >> ParErr- Stepping- SERR- FastB2B- >> >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> >> <TAbort- <MAbort- >SERR- <PERR- >> >> Latency: 0 >> >> Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] >> >> Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] >> >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> >> Vector table: BAR=3 offset=00000000 >> >> PBA: BAR=3 offset=00002000 >> >> >> >> 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> >> 01) Subsystem: Intel Corporation Unknown device 000c >> >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- >> >> ParErr- Stepping- SERR- FastB2B- >> >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> >> <TAbort- <MAbort- >SERR- <PERR- >> >> Latency: 0 >> >> Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] >> >> Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] >> >> Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> >> Vector table: BAR=3 offset=00000000 >> >> PBA: BAR=3 offset=00002000 >> >> >> >> >> >> >> >> +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, >> >> + gpa_t addr, int len) >> >> +{ >> >> + gpa_t start, end; >> >> + >> >> + BUG_ON(adev->msix_mmio_base == 0); >> >> + start = adev->msix_mmio_base; >> >> + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * >> >> + adev->msix_max_entries_nr; >> >> + if (addr >= start && addr + len <= end) >> >> + return true; >> >> + >> >> + return false; >> >> +} >> >> >> >> 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: >> >> > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: >> >> >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. >> >> >> >> >> >> I test kvm with sriov, which the vf driver could not disable msix. >> >> >> so the host os waste a lot of cpu. cpu rate of host os is 90%. >> >> >> >> >> >> then I test xen with sriov, there ara also a lot of vm exits caused >> >> >> by MSIX mask. >> >> >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen >> >> >> and domain0 is 60%. >> >> >> >> >> >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. >> >> >> >> >> >> so i think the problem is kvm waste more cpu resource to deal with >> >> >> MSIX mask. and we can see how xen deal with MSIX mask. >> >> >> >> >> >> if this problem sloved, maybe with MSIX enabled, the performace is >> >> >> better. >> >> > >> >> > Please refer to my posted patches for this issue. >> >> > >> >> > http://www.spinics.net/lists/kvm/msg44992.html >> >> > >> >> > -- >> >> > regards >> >> > Yang, Sheng >> >> > >> >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: >> >> >> > On 11/23/2010 09:27 AM, lidong chen wrote: >> >> >> >> can you tell me something about this problem. >> >> >> >> thanks. >> >> >> > >> >> >> > Which problem? >> >> >> > >> >> >> > -- >> >> >> > I have a truly marvellous patch that fixes the bug which this >> >> >> > signature is too narrow to contain. > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 9:29 ` lidong chen @ 2010-12-01 9:37 ` Yang, Sheng 0 siblings, 0 replies; 22+ messages in thread From: Yang, Sheng @ 2010-12-01 9:37 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 17:29:44 lidong chen wrote: > maybe because i modify the code in assigned_dev_iomem_map(). > > i used RHEL6, and calc_assigned_dev_id is below: > > static uint32_t calc_assigned_dev_id(uint8_t bus, uint8_t devfn) > { > return (uint32_t)bus << 8 | (uint32_t)devfn; > } > > and in patch there are there param. > + msix_mmio.id = calc_assigned_dev_id(r_dev->h_segnr, > + r_dev->h_busnr, r_dev->h_devfn); This one should be fine because h_segnr should be 0 here. But I strongly recommend you to use latest KVM and latest QEmu, we won't know what would happen during the rebase... (maybe my patch is a little old for the latest one, so my kvm base is 365bb670a44b217870c2ee1065f57bb43b57e166, qemu base is 420fe74769cc67baec6f3d962dc054e2972ca3ae). Things to be checked: 1. If two devices' MMIO have been registered successfully. 2. If you can see the mask bit accessing in kernel from both devices. -- regards Yang, Sheng > > > #ifdef KVM_CAP_MSIX_MASK > if (cap_mask) { > memset(&msix_mmio, 0, sizeof msix_mmio); > msix_mmio.id = calc_assigned_dev_id(r_dev->h_busnr, > r_dev->h_devfn); > msix_mmio.type = KVM_MSIX_TYPE_ASSIGNED_DEV; > msix_mmio.base_addr = e_phys + offset; > msix_mmio.max_entries_nr = r_dev->max_msix_entries_nr; > msix_mmio.flags = KVM_MSIX_MMIO_FLAG_REGISTER; > ret = kvm_update_msix_mmio(kvm_context, &msix_mmio); > if (ret) > fprintf(stderr, "fail to register in-kernel > msix_mmio!\n"); } > #endif > > 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > > On Wednesday 01 December 2010 16:54:16 lidong chen wrote: > >> yes, i patch qemu as well. > >> > >> and i found the address of second vf is not in mmio range. the first > >> one is fine. > > > > So looks like something wrong with MMIO register part. Could you check > > the registeration in assigned_dev_iomem_map() of the 4th patch for QEmu? > > I suppose something wrong with it. I would try to reproduce it here. > > > > And if you only use one vf, how about the gain? > > > > -- > > regards > > Yang, Sheng > > > >> 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > >> > On Wednesday 01 December 2010 16:41:38 lidong chen wrote: > >> >> I used sr-iov, give each vm 2 vf. > >> >> after apply the patch, and i found performence is the same. > >> >> > >> >> the reason is in function msix_mmio_write, mostly addr is not in mmio > >> >> range. > >> > > >> > Did you patch qemu as well? You can see it's impossible for kernel > >> > part to work alone... > >> > > >> > http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html > >> > > >> > -- > >> > regards > >> > Yang, Sheng > >> > > >> >> static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, > >> >> int len, const void *val) > >> >> { > >> >> > >> >> struct kvm_assigned_dev_kernel *adev = > >> >> > >> >> container_of(this, struct > >> >> kvm_assigned_dev_kernel, > >> >> > >> >> msix_mmio_dev); > >> >> > >> >> int idx, r = 0; > >> >> unsigned long new_val = *(unsigned long *)val; > >> >> > >> >> mutex_lock(&adev->kvm->lock); > >> >> if (!msix_mmio_in_range(adev, addr, len)) { > >> >> > >> >> // return here. > >> >> > >> >> r = -EOPNOTSUPP; > >> >> > >> >> goto out; > >> >> > >> >> } > >> >> > >> >> i printk the value: > >> >> addr start end len > >> >> F004C00C F0044000 F0044030 4 > >> >> > >> >> 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed > >> >> (rev 01) Subsystem: Intel Corporation Unknown device 000c > >> >> > >> >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > >> >> > >> >> ParErr- Stepping- SERR- FastB2B- > >> >> > >> >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> >> > >> >> <TAbort- <MAbort- >SERR- <PERR- > >> >> > >> >> Latency: 0 > >> >> Region 0: Memory at f0040000 (32-bit, non-prefetchable) > >> >> [size=16K] Region 3: Memory at f0044000 (32-bit, > >> >> non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ > >> >> Mask- TabSize=3 > >> >> > >> >> Vector table: BAR=3 offset=00000000 > >> >> PBA: BAR=3 offset=00002000 > >> >> > >> >> 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed > >> >> (rev 01) Subsystem: Intel Corporation Unknown device 000c > >> >> > >> >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > >> >> > >> >> ParErr- Stepping- SERR- FastB2B- > >> >> > >> >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> >> > >> >> <TAbort- <MAbort- >SERR- <PERR- > >> >> > >> >> Latency: 0 > >> >> Region 0: Memory at f0048000 (32-bit, non-prefetchable) > >> >> [size=16K] Region 3: Memory at f004c000 (32-bit, > >> >> non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ > >> >> Mask- TabSize=3 > >> >> > >> >> Vector table: BAR=3 offset=00000000 > >> >> PBA: BAR=3 offset=00002000 > >> >> > >> >> +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > >> >> + gpa_t addr, int len) > >> >> +{ > >> >> + gpa_t start, end; > >> >> + > >> >> + BUG_ON(adev->msix_mmio_base == 0); > >> >> + start = adev->msix_mmio_base; > >> >> + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > >> >> + adev->msix_max_entries_nr; > >> >> + if (addr >= start && addr + len <= end) > >> >> + return true; > >> >> + > >> >> + return false; > >> >> +} > >> >> > >> >> 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > >> >> > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> >> >> sr-iov also meet this problem, MSIX mask waste a lot of cpu > >> >> >> resource. > >> >> >> > >> >> >> I test kvm with sriov, which the vf driver could not disable msix. > >> >> >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> >> >> > >> >> >> then I test xen with sriov, there ara also a lot of vm exits > >> >> >> caused by MSIX mask. > >> >> >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of > >> >> >> xen and domain0 is 60%. > >> >> >> > >> >> >> without sr-iov, the cpu rate of xen and domain0 is higher than > >> >> >> kvm. > >> >> >> > >> >> >> so i think the problem is kvm waste more cpu resource to deal with > >> >> >> MSIX mask. and we can see how xen deal with MSIX mask. > >> >> >> > >> >> >> if this problem sloved, maybe with MSIX enabled, the performace is > >> >> >> better. > >> >> > > >> >> > Please refer to my posted patches for this issue. > >> >> > > >> >> > http://www.spinics.net/lists/kvm/msg44992.html > >> >> > > >> >> > -- > >> >> > regards > >> >> > Yang, Sheng > >> >> > > >> >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> >> >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> >> >> >> can you tell me something about this problem. > >> >> >> >> thanks. > >> >> >> > > >> >> >> > Which problem? > >> >> >> > > >> >> >> > -- > >> >> >> > I have a truly marvellous patch that fixes the bug which this > >> >> >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 9:02 ` Yang, Sheng 2010-12-01 9:29 ` lidong chen @ 2010-12-01 9:34 ` Yang, Sheng 1 sibling, 0 replies; 22+ messages in thread From: Yang, Sheng @ 2010-12-01 9:34 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 17:02:57 Yang, Sheng wrote: > On Wednesday 01 December 2010 16:54:16 lidong chen wrote: > > yes, i patch qemu as well. > > > > and i found the address of second vf is not in mmio range. the first > > one is fine. > > So looks like something wrong with MMIO register part. Could you check the > registeration in assigned_dev_iomem_map() of the 4th patch for QEmu? I > suppose something wrong with it. I would try to reproduce it here. > > And if you only use one vf, how about the gain? It's weird... I've tried assign two vfs to the guest, and two devices' MSI-X mask bit accessing both being intercepted by kernel as expected... So for msix_mmio_write/read, you can't see any mask bit accessing from the second device? Also the benefit of this patch would show only when mask bit operation intensity is high. So how about your interrupt intensity? -- regards Yang, Sheng > > -- > regards > Yang, Sheng > > > 2010/12/1 Yang, Sheng <sheng.yang@intel.com>: > > > On Wednesday 01 December 2010 16:41:38 lidong chen wrote: > > >> I used sr-iov, give each vm 2 vf. > > >> after apply the patch, and i found performence is the same. > > >> > > >> the reason is in function msix_mmio_write, mostly addr is not in mmio > > >> range. > > > > > > Did you patch qemu as well? You can see it's impossible for kernel part > > > to work alone... > > > > > > http://www.mail-archive.com/kvm@vger.kernel.org/msg44368.html > > > > > > -- > > > regards > > > Yang, Sheng > > > > > >> static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int > > >> len, const void *val) > > >> { > > >> > > >> struct kvm_assigned_dev_kernel *adev = > > >> > > >> container_of(this, struct > > >> kvm_assigned_dev_kernel, > > >> > > >> msix_mmio_dev); > > >> > > >> int idx, r = 0; > > >> unsigned long new_val = *(unsigned long *)val; > > >> > > >> mutex_lock(&adev->kvm->lock); > > >> if (!msix_mmio_in_range(adev, addr, len)) { > > >> > > >> // return here. > > >> > > >> r = -EOPNOTSUPP; > > >> > > >> goto out; > > >> > > >> } > > >> > > >> i printk the value: > > >> addr start end len > > >> F004C00C F0044000 F0044030 4 > > >> > > >> 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed > > >> (rev 01) Subsystem: Intel Corporation Unknown device 000c > > >> > > >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > > >> > > >> ParErr- Stepping- SERR- FastB2B- > > >> > > >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > >> > > >> <TAbort- <MAbort- >SERR- <PERR- > > >> > > >> Latency: 0 > > >> Region 0: Memory at f0040000 (32-bit, non-prefetchable) > > >> [size=16K] Region 3: Memory at f0044000 (32-bit, > > >> non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ > > >> Mask- TabSize=3 > > >> > > >> Vector table: BAR=3 offset=00000000 > > >> PBA: BAR=3 offset=00002000 > > >> > > >> 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed > > >> (rev 01) Subsystem: Intel Corporation Unknown device 000c > > >> > > >> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > > >> > > >> ParErr- Stepping- SERR- FastB2B- > > >> > > >> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > >> > > >> <TAbort- <MAbort- >SERR- <PERR- > > >> > > >> Latency: 0 > > >> Region 0: Memory at f0048000 (32-bit, non-prefetchable) > > >> [size=16K] Region 3: Memory at f004c000 (32-bit, > > >> non-prefetchable) [size=16K] Capabilities: [40] MSI-X: Enable+ > > >> Mask- TabSize=3 > > >> > > >> Vector table: BAR=3 offset=00000000 > > >> PBA: BAR=3 offset=00002000 > > >> > > >> +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > > >> + gpa_t addr, int len) > > >> +{ > > >> + gpa_t start, end; > > >> + > > >> + BUG_ON(adev->msix_mmio_base == 0); > > >> + start = adev->msix_mmio_base; > > >> + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > > >> + adev->msix_max_entries_nr; > > >> + if (addr >= start && addr + len <= end) > > >> + return true; > > >> + > > >> + return false; > > >> +} > > >> > > >> 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > >> > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > > >> >> sr-iov also meet this problem, MSIX mask waste a lot of cpu > > >> >> resource. > > >> >> > > >> >> I test kvm with sriov, which the vf driver could not disable msix. > > >> >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > > >> >> > > >> >> then I test xen with sriov, there ara also a lot of vm exits caused > > >> >> by MSIX mask. > > >> >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of > > >> >> xen and domain0 is 60%. > > >> >> > > >> >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > > >> >> > > >> >> so i think the problem is kvm waste more cpu resource to deal with > > >> >> MSIX mask. and we can see how xen deal with MSIX mask. > > >> >> > > >> >> if this problem sloved, maybe with MSIX enabled, the performace is > > >> >> better. > > >> > > > >> > Please refer to my posted patches for this issue. > > >> > > > >> > http://www.spinics.net/lists/kvm/msg44992.html > > >> > > > >> > -- > > >> > regards > > >> > Yang, Sheng > > >> > > > >> >> 2010/11/23 Avi Kivity <avi@redhat.com>: > > >> >> > On 11/23/2010 09:27 AM, lidong chen wrote: > > >> >> >> can you tell me something about this problem. > > >> >> >> thanks. > > >> >> > > > >> >> > Which problem? > > >> >> > > > >> >> > -- > > >> >> > I have a truly marvellous patch that fixes the bug which this > > >> >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 8:41 ` lidong chen 2010-12-01 8:49 ` Yang, Sheng @ 2010-12-01 8:56 ` Yang, Sheng 2010-12-01 14:03 ` Michael S. Tsirkin 2 siblings, 0 replies; 22+ messages in thread From: Yang, Sheng @ 2010-12-01 8:56 UTC (permalink / raw) To: lidong chen Cc: Avi Kivity, Gleb Natapov, mst@redhat.com, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 16:41:38 lidong chen wrote: > I used sr-iov, give each vm 2 vf. > after apply the patch, and i found performence is the same. > > the reason is in function msix_mmio_write, mostly addr is not in mmio > range. This url maybe more convenient. http://www.spinics.net/lists/kvm/msg44795.html -- regards Yang, Sheng > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, > const void *val) > { > struct kvm_assigned_dev_kernel *adev = > container_of(this, struct kvm_assigned_dev_kernel, > msix_mmio_dev); > int idx, r = 0; > unsigned long new_val = *(unsigned long *)val; > > mutex_lock(&adev->kvm->lock); > if (!msix_mmio_in_range(adev, addr, len)) { > // return here. > r = -EOPNOTSUPP; > goto out; > } > > i printk the value: > addr start end len > F004C00C F0044000 F0044030 4 > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > + gpa_t addr, int len) > +{ > + gpa_t start, end; > + > + BUG_ON(adev->msix_mmio_base == 0); > + start = adev->msix_mmio_base; > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > + adev->msix_max_entries_nr; > + if (addr >= start && addr + len <= end) > + return true; > + > + return false; > +} > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > >> > >> I test kvm with sriov, which the vf driver could not disable msix. > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> > >> then I test xen with sriov, there ara also a lot of vm exits caused by > >> MSIX mask. > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > >> and domain0 is 60%. > >> > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > >> > >> so i think the problem is kvm waste more cpu resource to deal with MSIX > >> mask. and we can see how xen deal with MSIX mask. > >> > >> if this problem sloved, maybe with MSIX enabled, the performace is > >> better. > > > > Please refer to my posted patches for this issue. > > > > http://www.spinics.net/lists/kvm/msg44992.html > > > > -- > > regards > > Yang, Sheng > > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> >> can you tell me something about this problem. > >> >> thanks. > >> > > >> > Which problem? > >> > > >> > -- > >> > I have a truly marvellous patch that fixes the bug which this > >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 8:41 ` lidong chen 2010-12-01 8:49 ` Yang, Sheng 2010-12-01 8:56 ` Yang, Sheng @ 2010-12-01 14:03 ` Michael S. Tsirkin 2010-12-02 1:13 ` Yang, Sheng 2 siblings, 1 reply; 22+ messages in thread From: Michael S. Tsirkin @ 2010-12-01 14:03 UTC (permalink / raw) To: lidong chen Cc: Yang, Sheng, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: > I used sr-iov, give each vm 2 vf. > after apply the patch, and i found performence is the same. > > the reason is in function msix_mmio_write, mostly addr is not in mmio range. > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, > const void *val) > { > struct kvm_assigned_dev_kernel *adev = > container_of(this, struct kvm_assigned_dev_kernel, > msix_mmio_dev); > int idx, r = 0; > unsigned long new_val = *(unsigned long *)val; > > mutex_lock(&adev->kvm->lock); > if (!msix_mmio_in_range(adev, addr, len)) { > // return here. > r = -EOPNOTSUPP; > goto out; > } > > i printk the value: > addr start end len > F004C00C F0044000 F0044030 4 > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev 01) > Subsystem: Intel Corporation Unknown device 000c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > Stepping- SERR- FastB2B- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > <TAbort- <MAbort- >SERR- <PERR- > Latency: 0 > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > Vector table: BAR=3 offset=00000000 > PBA: BAR=3 offset=00002000 > > > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > + gpa_t addr, int len) > +{ > + gpa_t start, end; > + > + BUG_ON(adev->msix_mmio_base == 0); > + start = adev->msix_mmio_base; > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > + adev->msix_max_entries_nr; > + if (addr >= start && addr + len <= end) > + return true; > + > + return false; > +} Hmm, this check looks wrong to me: there's no guarantee that guest uses the first N entries in the table. E.g. it could use a single entry, but only the last one. > > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > >> > >> I test kvm with sriov, which the vf driver could not disable msix. > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> > >> then I test xen with sriov, there ara also a lot of vm exits caused by > >> MSIX mask. > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > >> and domain0 is 60%. > >> > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > >> > >> so i think the problem is kvm waste more cpu resource to deal with MSIX > >> mask. and we can see how xen deal with MSIX mask. > >> > >> if this problem sloved, maybe with MSIX enabled, the performace is better. > > > > Please refer to my posted patches for this issue. > > > > http://www.spinics.net/lists/kvm/msg44992.html > > > > -- > > regards > > Yang, Sheng > > > >> > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> >> can you tell me something about this problem. > >> >> thanks. > >> > > >> > Which problem? > >> > > >> > -- > >> > I have a truly marvellous patch that fixes the bug which this > >> > signature is too narrow to contain. > > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-01 14:03 ` Michael S. Tsirkin @ 2010-12-02 1:13 ` Yang, Sheng 2010-12-02 9:49 ` Michael S. Tsirkin 0 siblings, 1 reply; 22+ messages in thread From: Yang, Sheng @ 2010-12-02 1:13 UTC (permalink / raw) To: Michael S. Tsirkin Cc: lidong chen, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Wednesday 01 December 2010 22:03:58 Michael S. Tsirkin wrote: > On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: > > I used sr-iov, give each vm 2 vf. > > after apply the patch, and i found performence is the same. > > > > the reason is in function msix_mmio_write, mostly addr is not in mmio > > range. > > > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int > > len, > > > > const void *val) > > > > { > > > > struct kvm_assigned_dev_kernel *adev = > > > > container_of(this, struct kvm_assigned_dev_kernel, > > > > msix_mmio_dev); > > > > int idx, r = 0; > > unsigned long new_val = *(unsigned long *)val; > > > > mutex_lock(&adev->kvm->lock); > > if (!msix_mmio_in_range(adev, addr, len)) { > > > > // return here. > > > > r = -EOPNOTSUPP; > > > > goto out; > > > > } > > > > i printk the value: > > addr start end len > > F004C00C F0044000 F0044030 4 > > > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > > 01) > > > > Subsystem: Intel Corporation Unknown device 000c > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > > > > Stepping- SERR- FastB2B- > > > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > > <TAbort- <MAbort- >SERR- <PERR- > > > > Latency: 0 > > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > > > > Vector table: BAR=3 offset=00000000 > > PBA: BAR=3 offset=00002000 > > > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > > 01) > > > > Subsystem: Intel Corporation Unknown device 000c > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > > > > Stepping- SERR- FastB2B- > > > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > > <TAbort- <MAbort- >SERR- <PERR- > > > > Latency: 0 > > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > > > > Vector table: BAR=3 offset=00000000 > > PBA: BAR=3 offset=00002000 > > > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > > + gpa_t addr, int len) > > +{ > > + gpa_t start, end; > > + > > + BUG_ON(adev->msix_mmio_base == 0); > > + start = adev->msix_mmio_base; > > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > > + adev->msix_max_entries_nr; > > + if (addr >= start && addr + len <= end) > > + return true; > > + > > + return false; > > +} > > Hmm, this check looks wrong to me: there's no guarantee > that guest uses the first N entries in the table. > E.g. it could use a single entry, but only the last one. Please check the PCI spec. -- regards Yang, Sheng > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > > >> > > >> I test kvm with sriov, which the vf driver could not disable msix. > > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > > >> > > >> then I test xen with sriov, there ara also a lot of vm exits caused by > > >> MSIX mask. > > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > > >> and domain0 is 60%. > > >> > > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > > >> > > >> so i think the problem is kvm waste more cpu resource to deal with > > >> MSIX mask. and we can see how xen deal with MSIX mask. > > >> > > >> if this problem sloved, maybe with MSIX enabled, the performace is > > >> better. > > > > > > Please refer to my posted patches for this issue. > > > > > > http://www.spinics.net/lists/kvm/msg44992.html > > > > > > -- > > > regards > > > Yang, Sheng > > > > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > > >> >> can you tell me something about this problem. > > >> >> thanks. > > >> > > > >> > Which problem? > > >> > > > >> > -- > > >> > I have a truly marvellous patch that fixes the bug which this > > >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-02 1:13 ` Yang, Sheng @ 2010-12-02 9:49 ` Michael S. Tsirkin 2010-12-02 11:52 ` Sheng Yang 0 siblings, 1 reply; 22+ messages in thread From: Michael S. Tsirkin @ 2010-12-02 9:49 UTC (permalink / raw) To: Yang, Sheng Cc: lidong chen, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Thu, Dec 02, 2010 at 09:13:28AM +0800, Yang, Sheng wrote: > On Wednesday 01 December 2010 22:03:58 Michael S. Tsirkin wrote: > > On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: > > > I used sr-iov, give each vm 2 vf. > > > after apply the patch, and i found performence is the same. > > > > > > the reason is in function msix_mmio_write, mostly addr is not in mmio > > > range. > > > > > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int > > > len, > > > > > > const void *val) > > > > > > { > > > > > > struct kvm_assigned_dev_kernel *adev = > > > > > > container_of(this, struct kvm_assigned_dev_kernel, > > > > > > msix_mmio_dev); > > > > > > int idx, r = 0; > > > unsigned long new_val = *(unsigned long *)val; > > > > > > mutex_lock(&adev->kvm->lock); > > > if (!msix_mmio_in_range(adev, addr, len)) { > > > > > > // return here. > > > > > > r = -EOPNOTSUPP; > > > > > > goto out; > > > > > > } > > > > > > i printk the value: > > > addr start end len > > > F004C00C F0044000 F0044030 4 > > > > > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > > > 01) > > > > > > Subsystem: Intel Corporation Unknown device 000c > > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > > > > > > Stepping- SERR- FastB2B- > > > > > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > > > > <TAbort- <MAbort- >SERR- <PERR- > > > > > > Latency: 0 > > > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > > > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > > > > > > Vector table: BAR=3 offset=00000000 > > > PBA: BAR=3 offset=00002000 > > > > > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > > > 01) > > > > > > Subsystem: Intel Corporation Unknown device 000c > > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > > > > > > Stepping- SERR- FastB2B- > > > > > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > > > > <TAbort- <MAbort- >SERR- <PERR- > > > > > > Latency: 0 > > > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > > > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > > > > > > Vector table: BAR=3 offset=00000000 > > > PBA: BAR=3 offset=00002000 > > > > > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > > > + gpa_t addr, int len) > > > +{ > > > + gpa_t start, end; > > > + > > > + BUG_ON(adev->msix_mmio_base == 0); > > > + start = adev->msix_mmio_base; > > > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > > > + adev->msix_max_entries_nr; > > > + if (addr >= start && addr + len <= end) > > > + return true; > > > + > > > + return false; > > > +} > > > > Hmm, this check looks wrong to me: there's no guarantee > > that guest uses the first N entries in the table. > > E.g. it could use a single entry, but only the last one. > > Please check the PCI spec. This is pretty explicit in the spec: the the last paragraph in the below: IMPLEMENTATION NOTE Handling MSI-X Vector Shortages Handling MSI-X Vector Shortages For the case where fewer vectors are allocated to a function than desired, software- controlled aliasing as enabled by MSI-X is one approach for handling the situation. For example, if a function supports five queues, each with an associated MSI-X table entry, but only three vectors are allocated, the function could be designed for software still to configure all five table entries, assigning one or more vectors to multiple table entries. Software could assign the three vectors {A,B,C} to the five entries as ABCCC, ABBCC, ABCBA, or other similar combinations. Alternatively, the function could be designed for software to configure it (using a device- specific mechanism) to use only three queues and three MSI-X table entries. Software could assign the three vectors {A,B,C} to the five entries as ABC--, A-B-C, A--CB, or other similar combinations. > -- > regards > Yang, Sheng > > > > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > > > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > > > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > > > >> > > > >> I test kvm with sriov, which the vf driver could not disable msix. > > > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > > > >> > > > >> then I test xen with sriov, there ara also a lot of vm exits caused by > > > >> MSIX mask. > > > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > > > >> and domain0 is 60%. > > > >> > > > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > > > >> > > > >> so i think the problem is kvm waste more cpu resource to deal with > > > >> MSIX mask. and we can see how xen deal with MSIX mask. > > > >> > > > >> if this problem sloved, maybe with MSIX enabled, the performace is > > > >> better. > > > > > > > > Please refer to my posted patches for this issue. > > > > > > > > http://www.spinics.net/lists/kvm/msg44992.html > > > > > > > > -- > > > > regards > > > > Yang, Sheng > > > > > > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > > > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > > > >> >> can you tell me something about this problem. > > > >> >> thanks. > > > >> > > > > >> > Which problem? > > > >> > > > > >> > -- > > > >> > I have a truly marvellous patch that fixes the bug which this > > > >> > signature is too narrow to contain. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-02 9:49 ` Michael S. Tsirkin @ 2010-12-02 11:52 ` Sheng Yang 2010-12-02 12:23 ` Michael S. Tsirkin 0 siblings, 1 reply; 22+ messages in thread From: Sheng Yang @ 2010-12-02 11:52 UTC (permalink / raw) To: Michael S. Tsirkin Cc: Yang, Sheng, lidong chen, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Thu, Dec 2, 2010 at 5:49 PM, Michael S. Tsirkin <mst@redhat.com> wrote: > On Thu, Dec 02, 2010 at 09:13:28AM +0800, Yang, Sheng wrote: >> On Wednesday 01 December 2010 22:03:58 Michael S. Tsirkin wrote: >> > On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: >> > > I used sr-iov, give each vm 2 vf. >> > > after apply the patch, and i found performence is the same. >> > > >> > > the reason is in function msix_mmio_write, mostly addr is not in mmio >> > > range. >> > > >> > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int >> > > len, >> > > >> > > const void *val) >> > > >> > > { >> > > >> > > struct kvm_assigned_dev_kernel *adev = >> > > >> > > container_of(this, struct kvm_assigned_dev_kernel, >> > > >> > > msix_mmio_dev); >> > > >> > > int idx, r = 0; >> > > unsigned long new_val = *(unsigned long *)val; >> > > >> > > mutex_lock(&adev->kvm->lock); >> > > if (!msix_mmio_in_range(adev, addr, len)) { >> > > >> > > // return here. >> > > >> > > r = -EOPNOTSUPP; >> > > >> > > goto out; >> > > >> > > } >> > > >> > > i printk the value: >> > > addr start end len >> > > F004C00C F0044000 F0044030 4 >> > > >> > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> > > 01) >> > > >> > > Subsystem: Intel Corporation Unknown device 000c >> > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> > > >> > > Stepping- SERR- FastB2B- >> > > >> > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> > > >> > > <TAbort- <MAbort- >SERR- <PERR- >> > > >> > > Latency: 0 >> > > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] >> > > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] >> > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> > > >> > > Vector table: BAR=3 offset=00000000 >> > > PBA: BAR=3 offset=00002000 >> > > >> > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> > > 01) >> > > >> > > Subsystem: Intel Corporation Unknown device 000c >> > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> > > >> > > Stepping- SERR- FastB2B- >> > > >> > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> > > >> > > <TAbort- <MAbort- >SERR- <PERR- >> > > >> > > Latency: 0 >> > > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] >> > > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] >> > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> > > >> > > Vector table: BAR=3 offset=00000000 >> > > PBA: BAR=3 offset=00002000 >> > > >> > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, >> > > + gpa_t addr, int len) >> > > +{ >> > > + gpa_t start, end; >> > > + >> > > + BUG_ON(adev->msix_mmio_base == 0); >> > > + start = adev->msix_mmio_base; >> > > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * >> > > + adev->msix_max_entries_nr; >> > > + if (addr >= start && addr + len <= end) >> > > + return true; >> > > + >> > > + return false; >> > > +} >> > >> > Hmm, this check looks wrong to me: there's no guarantee >> > that guest uses the first N entries in the table. >> > E.g. it could use a single entry, but only the last one. >> >> Please check the PCI spec. > > > This is pretty explicit in the spec: the the last paragraph in the below: > > IMPLEMENTATION NOTE > Handling MSI-X Vector Shortages > > Handling MSI-X Vector Shortages > For the case where fewer vectors are allocated to a function than desired, You may not notice the premise here. Also check for "Table Size" would help I think. -- regards, Yang, Sheng software- > controlled aliasing as enabled by MSI-X is one approach for handling the situation. For > example, if a function supports five queues, each with an associated MSI-X table entry, but > only three vectors are allocated, the function could be designed for software still to configure > all five table entries, assigning one or more vectors to multiple table entries. Software could > assign the three vectors {A,B,C} to the five entries as ABCCC, ABBCC, ABCBA, or other > similar combinations. > > > Alternatively, the function could be designed for software to configure it (using a device- > specific mechanism) to use only three queues and three MSI-X table entries. Software could > assign the three vectors {A,B,C} to the five entries as ABC--, A-B-C, A--CB, or other similar > combinations. > > > >> -- >> regards >> Yang, Sheng >> >> >> > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: >> > > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: >> > > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. >> > > >> >> > > >> I test kvm with sriov, which the vf driver could not disable msix. >> > > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. >> > > >> >> > > >> then I test xen with sriov, there ara also a lot of vm exits caused by >> > > >> MSIX mask. >> > > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen >> > > >> and domain0 is 60%. >> > > >> >> > > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. >> > > >> >> > > >> so i think the problem is kvm waste more cpu resource to deal with >> > > >> MSIX mask. and we can see how xen deal with MSIX mask. >> > > >> >> > > >> if this problem sloved, maybe with MSIX enabled, the performace is >> > > >> better. >> > > > >> > > > Please refer to my posted patches for this issue. >> > > > >> > > > http://www.spinics.net/lists/kvm/msg44992.html >> > > > >> > > > -- >> > > > regards >> > > > Yang, Sheng >> > > > >> > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: >> > > >> > On 11/23/2010 09:27 AM, lidong chen wrote: >> > > >> >> can you tell me something about this problem. >> > > >> >> thanks. >> > > >> > >> > > >> > Which problem? >> > > >> > >> > > >> > -- >> > > >> > I have a truly marvellous patch that fixes the bug which this >> > > >> > signature is too narrow to contain. > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-02 11:52 ` Sheng Yang @ 2010-12-02 12:23 ` Michael S. Tsirkin 2010-12-02 14:01 ` lidong chen 0 siblings, 1 reply; 22+ messages in thread From: Michael S. Tsirkin @ 2010-12-02 12:23 UTC (permalink / raw) To: Sheng Yang Cc: Yang, Sheng, lidong chen, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org On Thu, Dec 02, 2010 at 07:52:00PM +0800, Sheng Yang wrote: > On Thu, Dec 2, 2010 at 5:49 PM, Michael S. Tsirkin <mst@redhat.com> wrote: > > On Thu, Dec 02, 2010 at 09:13:28AM +0800, Yang, Sheng wrote: > >> On Wednesday 01 December 2010 22:03:58 Michael S. Tsirkin wrote: > >> > On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: > >> > > I used sr-iov, give each vm 2 vf. > >> > > after apply the patch, and i found performence is the same. > >> > > > >> > > the reason is in function msix_mmio_write, mostly addr is not in mmio > >> > > range. > >> > > > >> > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int > >> > > len, > >> > > > >> > > const void *val) > >> > > > >> > > { > >> > > > >> > > struct kvm_assigned_dev_kernel *adev = > >> > > > >> > > container_of(this, struct kvm_assigned_dev_kernel, > >> > > > >> > > msix_mmio_dev); > >> > > > >> > > int idx, r = 0; > >> > > unsigned long new_val = *(unsigned long *)val; > >> > > > >> > > mutex_lock(&adev->kvm->lock); > >> > > if (!msix_mmio_in_range(adev, addr, len)) { > >> > > > >> > > // return here. > >> > > > >> > > r = -EOPNOTSUPP; > >> > > > >> > > goto out; > >> > > > >> > > } > >> > > > >> > > i printk the value: > >> > > addr start end len > >> > > F004C00C F0044000 F0044030 4 > >> > > > >> > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > >> > > 01) > >> > > > >> > > Subsystem: Intel Corporation Unknown device 000c > >> > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > >> > > > >> > > Stepping- SERR- FastB2B- > >> > > > >> > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> > > > >> > > <TAbort- <MAbort- >SERR- <PERR- > >> > > > >> > > Latency: 0 > >> > > Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] > >> > > Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] > >> > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > >> > > > >> > > Vector table: BAR=3 offset=00000000 > >> > > PBA: BAR=3 offset=00002000 > >> > > > >> > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev > >> > > 01) > >> > > > >> > > Subsystem: Intel Corporation Unknown device 000c > >> > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- > >> > > > >> > > Stepping- SERR- FastB2B- > >> > > > >> > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > >> > > > >> > > <TAbort- <MAbort- >SERR- <PERR- > >> > > > >> > > Latency: 0 > >> > > Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] > >> > > Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] > >> > > Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 > >> > > > >> > > Vector table: BAR=3 offset=00000000 > >> > > PBA: BAR=3 offset=00002000 > >> > > > >> > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, > >> > > + gpa_t addr, int len) > >> > > +{ > >> > > + gpa_t start, end; > >> > > + > >> > > + BUG_ON(adev->msix_mmio_base == 0); > >> > > + start = adev->msix_mmio_base; > >> > > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * > >> > > + adev->msix_max_entries_nr; > >> > > + if (addr >= start && addr + len <= end) > >> > > + return true; > >> > > + > >> > > + return false; > >> > > +} > >> > > >> > Hmm, this check looks wrong to me: there's no guarantee > >> > that guest uses the first N entries in the table. > >> > E.g. it could use a single entry, but only the last one. > >> > >> Please check the PCI spec. > > > > > > This is pretty explicit in the spec: the the last paragraph in the below: > > > > IMPLEMENTATION NOTE > > Handling MSI-X Vector Shortages > > > > Handling MSI-X Vector Shortages > > For the case where fewer vectors are allocated to a function than desired, > > You may not notice the premise here. I noticed it. > Also check for "Table Size" would > help I think. It would help if msix_max_entries_nr was MSIX Table Size N (encoded in PCI config space as N - 1). Is this what it is? Maybe add this in some comment. > -- > regards, > Yang, Sheng > > software- > > controlled aliasing as enabled by MSI-X is one approach for handling the situation. For > > example, if a function supports five queues, each with an associated MSI-X table entry, but > > only three vectors are allocated, the function could be designed for software still to configure > > all five table entries, assigning one or more vectors to multiple table entries. Software could > > assign the three vectors {A,B,C} to the five entries as ABCCC, ABBCC, ABCBA, or other > > similar combinations. > > > > > > Alternatively, the function could be designed for software to configure it (using a device- > > specific mechanism) to use only three queues and three MSI-X table entries. Software could > > assign the three vectors {A,B,C} to the five entries as ABC--, A-B-C, A--CB, or other similar > > combinations. > > > > > > > >> -- > >> regards > >> Yang, Sheng > >> > >> > >> > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: > >> > > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: > >> > > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. > >> > > >> > >> > > >> I test kvm with sriov, which the vf driver could not disable msix. > >> > > >> so the host os waste a lot of cpu. cpu rate of host os is 90%. > >> > > >> > >> > > >> then I test xen with sriov, there ara also a lot of vm exits caused by > >> > > >> MSIX mask. > >> > > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen > >> > > >> and domain0 is 60%. > >> > > >> > >> > > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. > >> > > >> > >> > > >> so i think the problem is kvm waste more cpu resource to deal with > >> > > >> MSIX mask. and we can see how xen deal with MSIX mask. > >> > > >> > >> > > >> if this problem sloved, maybe with MSIX enabled, the performace is > >> > > >> better. > >> > > > > >> > > > Please refer to my posted patches for this issue. > >> > > > > >> > > > http://www.spinics.net/lists/kvm/msg44992.html > >> > > > > >> > > > -- > >> > > > regards > >> > > > Yang, Sheng > >> > > > > >> > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: > >> > > >> > On 11/23/2010 09:27 AM, lidong chen wrote: > >> > > >> >> can you tell me something about this problem. > >> > > >> >> thanks. > >> > > >> > > >> > > >> > Which problem? > >> > > >> > > >> > > >> > -- > >> > > >> > I have a truly marvellous patch that fixes the bug which this > >> > > >> > signature is too narrow to contain. > > -- > > To unsubscribe from this list: send the line "unsubscribe kvm" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-12-02 12:23 ` Michael S. Tsirkin @ 2010-12-02 14:01 ` lidong chen 0 siblings, 0 replies; 22+ messages in thread From: lidong chen @ 2010-12-02 14:01 UTC (permalink / raw) To: Michael S. Tsirkin Cc: Sheng Yang, Yang, Sheng, Avi Kivity, Gleb Natapov, aliguori@us.ibm.com, rusty@rustcorp.com.au, kvm@vger.kernel.org i apply patch correctly. the addr is not in mmio range because kvm_io_bus_write test the addr for each device. /* kvm_io_bus_write - called under kvm->slots_lock */ int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, const void *val) { int i; struct kvm_io_bus *bus = rcu_dereference(kvm->buses[bus_idx]); for (i = 0; i < bus->dev_count; i++) if (!kvm_iodevice_write(bus->devs[i], addr, len, val)) return 0; return -EOPNOTSUPP; } the test result(cpu rate) before apply patch: hostos guestos CPU0 15.85 58.05 CPU1 2.97 70.56 CPU2 3.25 69.00 CPU3 3.31 68.59 CPU4 5.11 47.46 CPU5 4.70 29.28 CPU6 6.00 5.96 CPU7 4.75 2.58 the test result(cpu rate) after apply patch: hostos guestos CPU0 11.89 60.92 CPU1 2.18 68.07 CPU2 2.61 66.18 CPU3 2.44 66.46 CPU4 2.67 44.98 CPU5 2.31 26.81 CPU6 1.93 5.65 CPU7 1.79 2.14 the total cpu rate reduce from 397% to 369%. i pin the vcpu below, and only vcpu0 handle msix interrupt. virsh vcpupin brd2vm1sriov 0 0 virsh vcpupin brd2vm1sriov 1 1 virsh vcpupin brd2vm1sriov 2 2 virsh vcpupin brd2vm1sriov 3 3 virsh vcpupin brd2vm1sriov 4 4 virsh vcpupin brd2vm1sriov 5 5 virsh vcpupin brd2vm1sriov 6 6 virsh vcpupin brd2vm1sriov 7 7 I will test virtio_net with msix enable later, and compare to it with msix disable. to see which is better? 2010/12/2 Michael S. Tsirkin <mst@redhat.com>: > On Thu, Dec 02, 2010 at 07:52:00PM +0800, Sheng Yang wrote: >> On Thu, Dec 2, 2010 at 5:49 PM, Michael S. Tsirkin <mst@redhat.com> wrote: >> > On Thu, Dec 02, 2010 at 09:13:28AM +0800, Yang, Sheng wrote: >> >> On Wednesday 01 December 2010 22:03:58 Michael S. Tsirkin wrote: >> >> > On Wed, Dec 01, 2010 at 04:41:38PM +0800, lidong chen wrote: >> >> > > I used sr-iov, give each vm 2 vf. >> >> > > after apply the patch, and i found performence is the same. >> >> > > >> >> > > the reason is in function msix_mmio_write, mostly addr is not in mmio >> >> > > range. >> >> > > >> >> > > static int msix_mmio_write(struct kvm_io_device *this, gpa_t addr, int >> >> > > len, >> >> > > >> >> > > á á á á á á á á á á áconst void *val) >> >> > > >> >> > > { >> >> > > >> >> > > á struct kvm_assigned_dev_kernel *adev = >> >> > > >> >> > > á á á á á á á á á container_of(this, struct kvm_assigned_dev_kernel, >> >> > > >> >> > > á á á á á á á á á á á á á á á ámsix_mmio_dev); >> >> > > >> >> > > á int idx, r = 0; >> >> > > á unsigned long new_val = *(unsigned long *)val; >> >> > > >> >> > > á mutex_lock(&adev->kvm->lock); >> >> > > á if (!msix_mmio_in_range(adev, addr, len)) { >> >> > > >> >> > > á á á á á // return here. >> >> > > >> >> > > á á á á á á á á ár = -EOPNOTSUPP; >> >> > > >> >> > > á á á á á goto out; >> >> > > >> >> > > á } >> >> > > >> >> > > i printk the value: >> >> > > addr á á á á á á start á á á á á end á á á á á len >> >> > > F004C00C á F0044000 áF0044030 á á 4 >> >> > > >> >> > > 00:06.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> >> > > 01) >> >> > > >> >> > > á Subsystem: Intel Corporation Unknown device 000c >> >> > > á Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> >> > > >> >> > > Stepping- SERR- FastB2B- >> >> > > >> >> > > á Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> >> > > >> >> > > <TAbort- <MAbort- >SERR- <PERR- >> >> > > >> >> > > á Latency: 0 >> >> > > á Region 0: Memory at f0040000 (32-bit, non-prefetchable) [size=16K] >> >> > > á Region 3: Memory at f0044000 (32-bit, non-prefetchable) [size=16K] >> >> > > á Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> >> > > >> >> > > á á á á á Vector table: BAR=3 offset=00000000 >> >> > > á á á á á PBA: BAR=3 offset=00002000 >> >> > > >> >> > > 00:07.0 Ethernet controller: Intel Corporation Unknown device 10ed (rev >> >> > > 01) >> >> > > >> >> > > á Subsystem: Intel Corporation Unknown device 000c >> >> > > á Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- >> >> > > >> >> > > Stepping- SERR- FastB2B- >> >> > > >> >> > > á Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- >> >> > > >> >> > > <TAbort- <MAbort- >SERR- <PERR- >> >> > > >> >> > > á Latency: 0 >> >> > > á Region 0: Memory at f0048000 (32-bit, non-prefetchable) [size=16K] >> >> > > á Region 3: Memory at f004c000 (32-bit, non-prefetchable) [size=16K] >> >> > > á Capabilities: [40] MSI-X: Enable+ Mask- TabSize=3 >> >> > > >> >> > > á á á á á Vector table: BAR=3 offset=00000000 >> >> > > á á á á á PBA: BAR=3 offset=00002000 >> >> > > >> >> > > +static bool msix_mmio_in_range(struct kvm_assigned_dev_kernel *adev, >> >> > > + á á á á á á á á á á á gpa_t addr, int len) >> >> > > +{ >> >> > > + gpa_t start, end; >> >> > > + >> >> > > + BUG_ON(adev->msix_mmio_base == 0); >> >> > > + start = adev->msix_mmio_base; >> >> > > + end = adev->msix_mmio_base + PCI_MSIX_ENTRY_SIZE * >> >> > > + á á á á adev->msix_max_entries_nr; >> >> > > + if (addr >= start && addr + len <= end) >> >> > > + á á á á return true; >> >> > > + >> >> > > + return false; >> >> > > +} >> >> > >> >> > Hmm, this check looks wrong to me: there's no guarantee >> >> > that guest uses the first N entries in the table. >> >> > E.g. it could use a single entry, but only the last one. >> >> >> >> Please check the PCI spec. >> > >> > >> > This is pretty explicit in the spec: the the last paragraph in the below: >> > >> > IMPLEMENTATION NOTE >> > Handling MSI-X Vector Shortages >> > >> > Handling MSI-X Vector Shortages >> > For the case where fewer vectors are allocated to a function than desired, >> >> You may not notice the premise here. > > I noticed it. > >> Also check for "Table Size" would >> help I think. > > It would help if msix_max_entries_nr was MSIX Table Size N > (encoded in PCI config space as N - 1). > Is this what it is? Maybe add this in some comment. > >> -- >> regards, >> Yang, Sheng >> >> software- >> > controlled aliasing as enabled by MSI-X is one approach for handling the situation. For >> > example, if a function supports five queues, each with an associated MSI-X table entry, but >> > only three vectors are allocated, the function could be designed for software still to configure >> > all five table entries, assigning one or more vectors to multiple table entries. Software could >> > assign the three vectors {A,B,C} to the five entries as ABCCC, ABBCC, ABCBA, or other >> > similar combinations. >> > >> > >> > Alternatively, the function could be designed for software to configure it (using a device- >> > specific mechanism) to use only three queues and three MSI-X table entries. Software could >> > assign the three vectors {A,B,C} to the five entries as ABC--, A-B-C, A--CB, or other similar >> > combinations. >> > >> > >> > >> >> -- >> >> regards >> >> Yang, Sheng >> >> >> >> >> >> > > 2010/11/30 Yang, Sheng <sheng.yang@intel.com>: >> >> > > > On Tuesday 30 November 2010 17:10:11 lidong chen wrote: >> >> > > >> sr-iov also meet this problem, MSIX mask waste a lot of cpu resource. >> >> > > >> >> >> > > >> I test kvm with sriov, which the vf driver could not disable msix. >> >> > > >> so the host os waste a lot of cpu. ácpu rate of host os is 90%. >> >> > > >> >> >> > > >> then I test xen with sriov, there ara also a lot of vm exits caused by >> >> > > >> MSIX mask. >> >> > > >> but the cpu rate of xen and domain0 is less than kvm. cpu rate of xen >> >> > > >> and domain0 is 60%. >> >> > > >> >> >> > > >> without sr-iov, the cpu rate of xen and domain0 is higher than kvm. >> >> > > >> >> >> > > >> so i think the problem is kvm waste more cpu resource to deal with >> >> > > >> MSIX mask. and we can see how xen deal with MSIX mask. >> >> > > >> >> >> > > >> if this problem sloved, maybe with MSIX enabled, the performace is >> >> > > >> better. >> >> > > > >> >> > > > Please refer to my posted patches for this issue. >> >> > > > >> >> > > > http://www.spinics.net/lists/kvm/msg44992.html >> >> > > > >> >> > > > -- >> >> > > > regards >> >> > > > Yang, Sheng >> >> > > > >> >> > > >> 2010/11/23 Avi Kivity <avi@redhat.com>: >> >> > > >> > On 11/23/2010 09:27 AM, lidong chen wrote: >> >> > > >> >> can you tell me something about this problem. >> >> > > >> >> thanks. >> >> > > >> > >> >> > > >> > Which problem? >> >> > > >> > >> >> > > >> > -- >> >> > > >> > I have a truly marvellous patch that fixes the bug which this >> >> > > >> > signature is too narrow to contain. >> > -- >> > To unsubscribe from this list: send the line "unsubscribe kvm" in >> > the body of a message to majordomo@vger.kernel.org >> > More majordomo info at áhttp://vger.kernel.org/majordomo-info.html >> > > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Performance test result between virtio_pci MSI-X disable and enable 2010-11-23 2:53 Performance test result between virtio_pci MSI-X disable and enable lidong chen 2010-11-23 6:20 ` Avi Kivity @ 2010-12-22 13:52 ` Michael S. Tsirkin 1 sibling, 0 replies; 22+ messages in thread From: Michael S. Tsirkin @ 2010-12-22 13:52 UTC (permalink / raw) To: lidong chen; +Cc: Gleb Natapov, Avi Kivity, aliguori, rusty, kvm On Tue, Nov 23, 2010 at 10:53:10AM +0800, lidong chen wrote: > Test method: > Send the same traffic load between virtio_pci MSI-X disable and > enable,and compare the cpu rate of host os. > I used the same version of virtio driver, only modify the msi-x option. > the host os version is 2.6.32. > the virtio dirver is from rhel6. > the guest version os is 2.6.16. > > Test result: > with msi-x disable, the cpu rate of host os is 110%. > with msi-x enable, the cpu rate of host os is 140%. > > the /proc/interrupt with msi-x disable is below: > CPU0 CPU1 > 0: 12326706 0 IO-APIC-edge timer > 1: 8 0 IO-APIC-edge i8042 > 8: 0 0 IO-APIC-edge rtc > 9: 0 0 IO-APIC-level acpi > 10: 4783008 0 IO-APIC-level virtio2, virtio3 > 11: 5363828 0 IO-APIC-level virtio1, virtio4, virtio5 > 12: 104 0 IO-APIC-edge i8042 > NMI: 2857871 2650796 > LOC: 12324952 12325609 > ERR: 0 > MIS: 0 > > the /proc/interrupt with msi-x enable is below: > CPU0 CPU1 > 0: 1896802 0 IO-APIC-edge timer > 1: 8 0 IO-APIC-edge i8042 > 4: 14 0 IO-APIC-edge serial > 8: 0 0 IO-APIC-edge rtc > 9: 0 0 IO-APIC-level acpi > 10: 0 0 IO-APIC-level virtio1, virtio2, virtio5 > 11: 1 0 IO-APIC-level virtio0, virtio3, virtio4 This one probably means there's a bug: when msix is enabled there should not be any level interrupts. > 12: 104 0 IO-APIC-edge i8042 > 50: 1 0 PCI-MSI-X virtio2-output > 58: 0 0 PCI-MSI-X virtio3-config > 66: 2046985 0 PCI-MSI-X virtio3-input > 74: 2 0 PCI-MSI-X virtio3-output > 82: 0 0 PCI-MSI-X virtio4-config > 90: 217 0 PCI-MSI-X virtio4-input > 98: 0 0 PCI-MSI-X virtio4-output > 177: 0 0 PCI-MSI-X virtio0-config > 185: 341831 0 PCI-MSI-X virtio0-input > 193: 1 0 PCI-MSI-X virtio0-output > 201: 0 0 PCI-MSI-X virtio1-config > 209: 188747 0 PCI-MSI-X virtio1-input > 217: 1 0 PCI-MSI-X virtio1-output > 225: 0 0 PCI-MSI-X virtio2-config > 233: 2204149 0 PCI-MSI-X virtio2-input > NMI: 1455767 1426226 > LOC: 1896099 1896637 > ERR: 0 > MIS: 0 I just noticed that above msi-x shows 4M interrupts and 1.5M NMI but non-MSI shows 10M and 3M. > Code difference: > I disalbe msi-x by modify the function vp_find_vqs like this: You can simply supply nvectors=0 in qemu. > static int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs, > struct virtqueue *vqs[], > vq_callback_t *callbacks[], > const char *names[]) > { > > #if 0 > int err; > > /* Try MSI-X with one vector per queue. */ > err = vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names, true, true); > if (!err) > return 0; > /* Fallback: MSI-X with one vector for config, one shared for queues. */ > err = vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names, > true, false); > if (!err) > return 0; > /* Finally fall back to regular interrupts. */ > #endif > > return vp_try_to_find_vqs(vdev, nvqs, vqs, callbacks, names, > false, false); > } > > Conclusion: > msi-x enable waste more cpu resource is caused by MSIX mask bit. In > older kernels program this bit twice > on every interrupt. and caused ept violation. Wait a second, older kernels don't have msix support in virtio, do they? > So I think we should add a param to control this.with older kernels, > we should disable MSIX. > And I think this should deal by qemu. I would like to see a comparison of msix enabled and disabled with a guest that supports msix natively. -- MST ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2010-12-22 13:53 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-11-23 2:53 Performance test result between virtio_pci MSI-X disable and enable lidong chen 2010-11-23 6:20 ` Avi Kivity 2010-11-23 6:42 ` Gleb Natapov 2010-11-23 7:27 ` lidong chen 2010-11-23 7:39 ` Avi Kivity 2010-11-30 9:10 ` lidong chen 2010-11-30 9:24 ` Yang, Sheng 2010-12-01 8:41 ` lidong chen 2010-12-01 8:49 ` Yang, Sheng 2010-12-01 8:54 ` lidong chen 2010-12-01 9:02 ` Yang, Sheng 2010-12-01 9:29 ` lidong chen 2010-12-01 9:37 ` Yang, Sheng 2010-12-01 9:34 ` Yang, Sheng 2010-12-01 8:56 ` Yang, Sheng 2010-12-01 14:03 ` Michael S. Tsirkin 2010-12-02 1:13 ` Yang, Sheng 2010-12-02 9:49 ` Michael S. Tsirkin 2010-12-02 11:52 ` Sheng Yang 2010-12-02 12:23 ` Michael S. Tsirkin 2010-12-02 14:01 ` lidong chen 2010-12-22 13:52 ` Michael S. Tsirkin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox