vhost: disable host TSO for linear buffers without extbuf
Checks
Commit Message
If linear buffers requested and external buffers are not, vhost
will not be able to receive any buffer that doesn't fit in a
single mbuf. Moreover, if such a buffer will appear in a vring
it will never be dequeued and the whole vring will become dead
breaking the network connection.
Disable segmentation offloading from the host side to avoid
having such a big buffers.
Cc: Flavio Leitner <fbl@sysclose.org>
Fixes: 5005bcda7123 ("vhost: add support for large buffers")
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
---
There is still an assumption that users are sane enough to have
MTU sized mbufs in a memory pool and that guest will not change
MTU to higher values.
We, probably, still need to have a check on dequeue path and
drop oversized buffers in case of linear buffers to avoid stuck
of the virtqueue. Or simply drop support of '+linear -extbuf'
case.
Note: Only compile tested due to lack of HW.
lib/librte_vhost/socket.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
Comments
On 10/17/19 5:00 PM, Ilya Maximets wrote:
> If linear buffers requested and external buffers are not, vhost
> will not be able to receive any buffer that doesn't fit in a
> single mbuf. Moreover, if such a buffer will appear in a vring
> it will never be dequeued and the whole vring will become dead
> breaking the network connection.
>
> Disable segmentation offloading from the host side to avoid
> having such a big buffers.
>
> Cc: Flavio Leitner <fbl@sysclose.org>
>
> Fixes: 5005bcda7123 ("vhost: add support for large buffers")
> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
> ---
>
> There is still an assumption that users are sane enough to have
> MTU sized mbufs in a memory pool and that guest will not change
> MTU to higher values.
>
> We, probably, still need to have a check on dequeue path and
> drop oversized buffers in case of linear buffers to avoid stuck
> of the virtqueue. Or simply drop support of '+linear -extbuf'
> case.
>
> Note: Only compile tested due to lack of HW.
>
> lib/librte_vhost/socket.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks,
Maxime
On 10/24/19 11:38 AM, Maxime Coquelin wrote:
>
>
> On 10/17/19 5:00 PM, Ilya Maximets wrote:
>> If linear buffers requested and external buffers are not, vhost
>> will not be able to receive any buffer that doesn't fit in a
>> single mbuf. Moreover, if such a buffer will appear in a vring
>> it will never be dequeued and the whole vring will become dead
>> breaking the network connection.
>>
>> Disable segmentation offloading from the host side to avoid
>> having such a big buffers.
>>
>> Cc: Flavio Leitner <fbl@sysclose.org>
>>
>> Fixes: 5005bcda7123 ("vhost: add support for large buffers")
>> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
>> ---
>>
>> There is still an assumption that users are sane enough to have
>> MTU sized mbufs in a memory pool and that guest will not change
>> MTU to higher values.
>>
>> We, probably, still need to have a check on dequeue path and
>> drop oversized buffers in case of linear buffers to avoid stuck
>> of the virtqueue. Or simply drop support of '+linear -extbuf'
>> case.
>>
>> Note: Only compile tested due to lack of HW.
>>
>> lib/librte_vhost/socket.c | 18 ++++++++++++++++++
>> 1 file changed, 18 insertions(+)
>>
>
>
> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>
> Thanks,
> Maxime
>
Applied to dpdk-next-virtio/master.
Thanks,
Maxime
@@ -933,6 +933,24 @@ rte_vhost_driver_register(const char *path, uint64_t flags)
~(1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT);
}
+ /*
+ * We'll not be able to receive a buffer from guest in linear mode
+ * without external buffer if it will not fit in a single mbuf, which is
+ * likely if segmentation offloading enabled.
+ */
+ if (vsocket->linearbuf && !vsocket->extbuf) {
+ uint64_t seg_offload_features =
+ (1ULL << VIRTIO_NET_F_HOST_TSO4) |
+ (1ULL << VIRTIO_NET_F_HOST_TSO6) |
+ (1ULL << VIRTIO_NET_F_HOST_UFO);
+
+ RTE_LOG(INFO, VHOST_CONFIG,
+ "Linear buffers requested without external buffers, "
+ "disabling host segmentation offloading support\n");
+ vsocket->supported_features &= ~seg_offload_features;
+ vsocket->features &= ~seg_offload_features;
+ }
+
if (!(flags & RTE_VHOST_USER_IOMMU_SUPPORT)) {
vsocket->supported_features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM);
vsocket->features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM);