On 10/29/2015 01:33 AM, Lan Tianyu wrote:
On 2015年10月29日 14:58, Alexander Duyck wrote:
Your code was having to do a bunch of shuffling in order to get things
set up so that you could bring the interface back up.  I would argue
that it may actually be faster at least on the bring-up to just drop the
old rings and start over since it greatly reduced the complexity and the
amount of device related data that has to be moved.
If give up the old ring after migration and keep DMA running before
stopping VCPU, it seems we don't need to track Tx/Rx descriptor ring and
just make sure that all Rx buffers delivered to stack has been migrated.

1) Dummy write Rx buffer before checking Rx descriptor to ensure packet
migrated first.

Don't dummy write the Rx descriptor. You should only really need to dummy write the Rx buffer and you would do so after checking the descriptor, not before. Otherwise you risk corrupting the Rx buffer because it is possible for you to read the Rx buffer, DMA occurs, and then you write back the Rx buffer and now you have corrupted the memory.

2) Make a copy of Rx descriptor and then use the copied data to check
buffer status. Not use the original descriptor because it won't be
migrated and migration may happen between two access of the Rx descriptor.

Do not just blindly copy the Rx descriptor ring. That is a recipe for disaster. The problem is DMA has to happen in a very specific order for things to function correctly. The Rx buffer has to be written and then the Rx descriptor. The problem is you will end up getting a read-ahead on the Rx descriptor ring regardless of which order you dirty things in.

The descriptor is only 16 bytes, you can fit 256 of them in a single page. There is a good chance you probably wouldn't be able to migrate if you were under heavy network stress, however you could still have several buffers written in the time it takes for you to halt the VM and migrate the remaining pages. Those buffers wouldn't be marked as dirty but odds are the page the descriptors are in would be. As such you will end up with the descriptors but not the buffers.

The only way you could possibly migrate the descriptors rings cleanly would be to have enough knowledge about the layout of things to force the descriptor rings to be migrated first followed by all of the currently mapped Rx buffers. In addition you would need to have some means of tracking all of the Rx buffers such as an emulated IOMMU as you would need to migrate all of them, not just part. By doing it this way you would get the Rx descriptor rings in the earliest state possible and would be essentially emulating the Rx buffer writes occurring before the Rx descriptor writes. You would likely have several Rx buffer writes that would be discarded in the process as there would be no descriptor for them but at least the state of the system would be consistent.

- Alex

To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to