On Tue, Oct 01, 2019 at 10:25:00AM +0300, Denis Plotnikov wrote:
Some linux kernels has a performance flaw in virtio block device access. On some frequent disk access patterns, e.g. 1M read, the kernel produces more block requests than needed. This happens because of virtio seg_max parameter set to 126 (virtqueue_size - 2) which limits the maximum block request to 516096 (126 * 4096_PAGE_SIZE).
Setting seg_max > 126 fixes the issue, however, not all linux kernels allow that. The old ones have a restriction virtqueue_size >= seg_max. This restriction is hardcoded and the kernel crashes in case of violation. The restriction is relaxed in the recent kernels. Windows kernels don't have such a restriction.
To increse seg_max and not to break the restriction, one can increase the virtqueue size to 256 and seg_max to 254. To do that, seabios support of 256 virtqueue size is needed.
--verbose please. Do you talk about guest kernels? Or host kernels? Why does changing seabios fix the kernel bug? Is this just a performance issue (first paragraph sounds like it is, and that would not be that much of a problem IMO given that virtio-blk isn't tweaked for performance anyway)? Or something more serious?
cheers, Gerd