That makes sense. I did try using the hugepage alloc that I had before but
it still crashed. Thank you for the response!
I'll try it out with *alloc_phys_contiguous_aligned.*
On Friday, October 4, 2019 at 2:28:01 PM UTC-5, Waldek Kozaczuk wrote:
>
> Hi,
>
> So there were a couple of issues with my and your patch:
> 1) We should NOT be using straight *malloc*() to allocate 17 pages of
> memory. It needs to be page-aligned, so *aligned_alloc()* is the correct
> choice.
> 2) I missed recognizing that we also need to *free()* instead of
> *free_page()* in the right place.
>
> Please see improved patch - better hack ;-). I still think we might be
> allocating 17-too many 17-pages large buffers. But at least we recognize
> VIRTIO_NET_F_MRG_RXBUF is off/on and choose correct page size accordingly
> (more/less).
>
> diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
> index e78fb3af..0df45dce 100644
> --- a/drivers/virtio-net.cc
> +++ b/drivers/virtio-net.cc
> @@ -63,6 +63,7 @@ extern int maxnic;
> namespace virtio {
>
> int net::_instance = 0;
> +bool net::use_large_buffer = false;
>
> #define net_tag "virtio-net"
> #define net_d(...) tprintf_d(net_tag, __VA_ARGS__)
> @@ -375,6 +376,9 @@ void net::read_config()
> net_i("Features: %s=%d,%s=%d", "Host TSO ECN", _host_tso_ecn, "CSUM",
> _csum);
> net_i("Features: %s=%d,%s=%d", "Guest_csum", _guest_csum, "guest
> tso4", _guest_tso4);
> net_i("Features: %s=%d", "host tso4", _host_tso4);
> +
> + printf("VIRTIO_NET_F_MRG_RXBUF: %d\n", _mergeable_bufs);
> + use_large_buffer = !_mergeable_bufs;
> }
>
> /**
> @@ -473,7 +477,10 @@ void net::receiver()
> // Bad packet/buffer - discard and continue to the next one
> if (len < _hdr_size + ETHER_HDR_LEN) {
> rx_drops++;
> - memory::free_page(page);
> + if (use_large_buffer)
> + free(page);
> + else
> + memory::free_page(page);
>
> continue;
> }
> @@ -581,7 +588,13 @@ void net::free_buffer_and_refcnt(void* buffer, void*
> refcnt)
> void net::do_free_buffer(void* buffer)
> {
> buffer = align_down(buffer, page_size);
> - memory::free_page(buffer);
> + if (use_large_buffer) {
> + printf("--> Freeing 17 pages: %p\n", buffer);
> + free(buffer);
> + } else {
> + printf("--> Freeing single page: %p\n", buffer);
> + memory::free_page(buffer);
> + }
> }
>
> void net::fill_rx_ring()
> @@ -591,12 +604,23 @@ void net::fill_rx_ring()
> vring* vq = _rxq.vqueue;
>
> while (vq->avail_ring_not_empty()) {
> - auto page = memory::alloc_page();
> + void *page;
> + int pages_num = use_large_buffer ? 17 : 1;
> + if (use_large_buffer) {
> + page = aligned_alloc(memory::page_size, pages_num *
> memory::page_size);
> + printf("--> Allocated 17 pages: %p\n", page);
> + } else {
> + page = memory::alloc_page();
> + printf("--> Allocated single page: %p\n", page);
> + }
>
> vq->init_sg();
> - vq->add_in_sg(page, memory::page_size);
> + vq->add_in_sg(page, pages_num * memory::page_size);
> if (!vq->add_buf(page)) {
> - memory::free_page(page);
> + if (use_large_buffer)
> + free(page);
> + else
> + memory::free_page(page);
> break;
> }
> added++;
> diff --git a/drivers/virtio-net.hh b/drivers/virtio-net.hh
> index adc93b39..e6725231 100644
> --- a/drivers/virtio-net.hh
> +++ b/drivers/virtio-net.hh
> @@ -220,6 +220,7 @@ public:
> static void free_buffer_and_refcnt(void* buffer, void* refcnt);
> static void free_buffer(iovec iov) { do_free_buffer(iov.iov_base); }
> static void do_free_buffer(void* buffer);
> + static bool use_large_buffer;
>
> bool ack_irq();
>
>
> I have tested it with your python example downloading 100 times 5MB large
> file and all seems to be working fine. Feel free to remove debug statements
> :-)
>
> Waldek
>
> On Thursday, September 26, 2019 at 6:12:27 PM UTC-4, Henrique Fingler
> wrote:
>>
>> Waldek, I'm getting a general protection fault when doing some HTTP
>> requests from OSv, do you think it might be related to the hack to make it
>> work on Firecracker?
>>
>> Here's the MWE, a few requests go through, then it faults.
>>
>> import urllib.request
>> for i in range (10):
>> response = urllib.request.urlopen("http://192.168.0.20:9999/1.bin")
>> response.read()
>>
>> Here's the trace:
>>
>> [registers]
>> RIP: 0x00000000403e9fd6 <memory::page_range_allocator::remove_huge(memory
>> ::page_range&)+38>
>> RFL: 0x0000000000010202 CS: 0x0000000000000008 SS: 0x0000000000000010
>> RAX: 0x000000000000000d RBX: 0xffff800003f2f000 RCX: 0x6d314e7578313731
>> RDX: 0x6270415369447065
>> RSI: 0xffff800003f2f000 RDI: 0xffff800003f2f008 RBP: 0xffff800000074e20
>> R8: 0x00000000000000fc
>> R9: 0xffff80000094d7e8 R10: 0x0000000000003f40 R11: 0x1144029210842110
>> R12: 0x0000000040911300
>> R13: 0xffff80000094d7e8 R14: 0x0000000000003f40 R15: 0x1144029210842110
>> RSP: 0xffff800000074e00
>> general protection fault
>>
>>
>> [backtrace]
>> 0x000000004039cabc <general_protection+140>
>> 0x0000000040399fa2 <???+1077518242>
>> 0x00000000403e4d66 <memory::page_range_allocator::free(memory::page_range
>> *)+166>
>> 0x00000000403e4ecb <memory::page_pool::l2::free_batch(memory::page_pool::
>> page_batch&)+91>
>> 0x00000000403e5118 <memory::page_pool::l2::unfill()+504>
>> 0x00000000403e6776 <memory::page_pool::l2::fill_thread()+358>
>> 0x00000000403ea7db <std::_Function_handler<void (), memory::page_pool::l2
>> ::l2()::{lambda()#1}>::_M_invoke(std::_Any_data const&)+11>
>> 0x00000000403f9746 <thread_main_c+38>
>> 0x000000004039af62 <???+1077522274>
>>
>>
>> The hack in virtio-net.cc is similar to yours:
>>
>> diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
>> index e78fb3af..0065e8d7 100644
>> --- a/drivers/virtio-net.cc
>> +++ b/drivers/virtio-net.cc
>> @@ -590,13 +590,31 @@ void net::fill_rx_ring()
>> int added = 0;
>> vring* vq = _rxq.vqueue;
>>
>> +#define HACKQ 1
>> +
>> while (vq->avail_ring_not_empty()) {
>> - auto page = memory::alloc_page();
>> +
>> + #if HACKQ
>> + auto page = malloc(17 * memory::page_size);
>> + #else
>> + auto page = memory::alloc_page();
>> + #endif
>>
>> vq->init_sg();
>> - vq->add_in_sg(page, memory::page_size);
>> +
>> + #if HACKQ
>> + vq->add_in_sg(page, 17 * memory::page_size);
>> + #else
>> + vq->add_in_sg(page, memory::page_size);
>> + #endif
>> +
>> if (!vq->add_buf(page)) {
>> - memory::free_page(page);
>> + #if HACKQ
>> + free(page);
>> + #else
>> + memory::free_page(page);
>> + #endif
>> +
>> break;
>> }
>> added++;
>>
>>
>> Maybe it's related to the size of the buffer allocated for virtio? I'll
>> try to force it to size one and see what happens.
>>
>> Best.
>>
>>
>> On Friday, September 20, 2019 at 4:01:45 PM UTC-5, Waldek Kozaczuk wrote:
>>>
>>> Yes quite substantial. On firecracker ZFS needs at least 50-60 ms to
>>> initialize on my machine. Whereas RoFS images takes 1 millisecond - the
>>> smallest native example takes 5-6 ms to boot including RoFS mount and ~10ms
>>> in total to execute (10 ms includes that 5-6 ms of boot time).
>>>
>>> Sent from my iPhone
>>>
>>> On Sep 20, 2019, at 15:53, zhiting zhu <[email protected]> wrote:
>>>
>>> Is there any difference on boot time between zfs and rofs?
>>>
>>> On Fri, Sep 20, 2019 at 2:45 PM Henrique Fingler <[email protected]>
>>> wrote:
>>>
>>>> I'll check that out.
>>>>
>>>> Instead of detecting what hypervisor we are dealing with, we should
>>>>> simply act accordingly based on what features have been negotiated and
>>>>> agreed
>>>>
>>>>
>>>> Yep, you're right. Five minutes after I hit Post I remembered what
>>>> "negotiate" means. Whoops.
>>>>
>>>> Also, I have noticed with my simple patch OSv ends up allocating 256
>>>>> buffers on Firecracker
>>>>
>>>>
>>>> That's why I was trying to force the size of the recv queue to one.
>>>> But this can be done in a smarter way in net::fill_rx_ring() as you said.
>>>> I'll hack around and see what comes up.
>>>> It also seems that Firecracker has the machinery to implement
>>>> VIRTIO_NET_F_MRG_RXBUF,
>>>> but I don't know how complicated it would be to finish it. I might check
>>>> that out in a few weeks when I have some free time.
>>>>
>>>> Thanks for all the pointers!
>>>>
>>>>
>>>> On Friday, September 20, 2019 at 1:58:42 PM UTC-5, Waldek Kozaczuk
>>>> wrote:
>>>>>
>>>>>
>>>>>
>>>>> On Friday, September 20, 2019 at 8:56:35 AM UTC-4, Waldek Kozaczuk
>>>>> wrote:
>>>>>>
>>>>>> See my answers below.
>>>>>>
>>>>>> On Thursday, September 19, 2019 at 11:34:56 PM UTC-4, Henrique
>>>>>> Fingler wrote:
>>>>>>>
>>>>>>> I agree that this is mostly a thing that should be done on
>>>>>>> Firecracker. For now, if there's a way to detect the hypervisor we can
>>>>>>> switch that. Personally I'm only using Firecracker so I'll leave this
>>>>>>> in.
>>>>>>>
>>>>>> Instead of detecting what hypervisor we are dealing with, we should
>>>>>> simply act accordingly based on what features have been negotiated and
>>>>>> agreed between OSv (driver) and hypervisor (device). We should simply
>>>>>> follow the VirtIo spec as it says here:
>>>>>> "5.1.6.3.1 Driver Requirements: Setting Up Receive Buffers
>>>>>>
>>>>>> - If VIRTIO_NET_F_MRG_RXBUF is not negotiated:
>>>>>> - If VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6 or
>>>>>> VIRTIO_NET_F_GUEST_UFO are negotiated, the driver SHOULD populate
>>>>>> the
>>>>>> receive queue(s) with buffers of at least 65562 bytes.
>>>>>> - Otherwise, the driver SHOULD populate the receive queue(s)
>>>>>> with buffers of at least 1526 bytes.
>>>>>> - If VIRTIO_NET_F_MRG_RXBUF is negotiated, each buffer MUST be at
>>>>>> greater than the size of the struct virtio_net_hdr."
>>>>>>
>>>>>> Something similar to what Linux does here -
>>>>>> https://github.com/torvalds/linux/blob/0445971000375859008414f87e7c72fa0d809cf8/drivers/net/virtio_net.c#L3075-L3080.
>>>>>>
>>>>>> So only use 17 pages long buffers when we have to. One outstanding
>>>>>> question
>>>>>> is this - shall we allocate and use a single contiguous block of 17
>>>>>> pages
>>>>>> of memory as a* single slot *in the vring or *chain of 17 single
>>>>>> page ones* like for single large buffer? (the latter is what Linux
>>>>>> seems to be doing). The slight advantage of chained one is that it will
>>>>>> be
>>>>>> easier to find 17 pages of memory than 68K contiguous one under
>>>>>> pressure.
>>>>>> But handling chained buffer is going to be more complicated. I think
>>>>>> memory
>>>>>> waste is the same.
>>>>>>
>>>>>> Pekka, Nadav,
>>>>>> What do you think we should do?
>>>>>>
>>>>>>
>>>>>>
>>>>>>> I wrote pretty much the same code but instead of *malloc *I used
>>>>>>> *memory::alloc_hugepage(
>>>>>>> *but it got stuck at compilation when qemu was started, do you
>>>>>>> happen to know the reason? I thought we also had to force the length of
>>>>>>> the
>>>>>>> receiving queue to one, maybe that part was the one breaking osv under
>>>>>>> qemu.
>>>>>>>
>>>>>>
>>>>>> Most likely you build the image with ZFS filesystem which at least
>>>>>> now requires OSv to boot so that files can be uploaded to. You can avoid
>>>>>> it
>>>>>> by using Read-Only FS (fs=rofs). Either way, we should use
>>>>>> VIRTIO_NET_F_MRG_RXBUF
>>>>>> if QEMU offers it (which happens right now) and you patch should not
>>>>>> affect
>>>>>> this.
>>>>>>
>>>>>
>>>>> Here is a capstan doc that should somewhat explain all 3 filesystems
>>>>> OSv offers -
>>>>> https://github.com/cloudius-systems/capstan/blob/master/Documentation/OsvFilesystem.md
>>>>> .
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>> And the size I was allocating was 17 pages because the spec says
>>>>>>> 65562, which is 16 pages plus 26 bytes.
>>>>>>>
>>>>>> You are right about 17 pages.
>>>>>>
>>>>>>> Did you also disable VIRTIO_NET_F_MRG_RXBUF in the feature mask or
>>>>>>> no, since Firecracker just ignores it?
>>>>>>>
>>>>>> Firecracker "ignores" it in an sense that it is part of how features
>>>>>> are negotiated,
>>>>>>
>>>>>>>
>>>>>>> I'll patch that in and test it out.
>>>>>>>
>>>>>>> Thanks!
>>>>>>>
>>>>>>>
>>>>>>> On Thursday, September 19, 2019 at 9:58:49 PM UTC-5, Waldek Kozaczuk
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> This patch seems to do the job:
>>>>>>>>
>>>>>>>> diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
>>>>>>>> index e78fb3af..fe5f1ae0 100644
>>>>>>>> --- a/drivers/virtio-net.cc
>>>>>>>> +++ b/drivers/virtio-net.cc
>>>>>>>> @@ -375,6 +375,8 @@ void net::read_config()
>>>>>>>> net_i("Features: %s=%d,%s=%d", "Host TSO ECN", _host_tso_ecn,
>>>>>>>> "CSUM", _csum);
>>>>>>>> net_i("Features: %s=%d,%s=%d", "Guest_csum", _guest_csum,
>>>>>>>> "guest tso4", _guest_tso4);
>>>>>>>> net_i("Features: %s=%d", "host tso4", _host_tso4);
>>>>>>>> +
>>>>>>>> + printf("VIRTIO_NET_F_MRG_RXBUF: %d\n", _mergeable_bufs);
>>>>>>>> }
>>>>>>>>
>>>>>>>> /**
>>>>>>>> @@ -591,16 +593,19 @@ void net::fill_rx_ring()
>>>>>>>> vring* vq = _rxq.vqueue;
>>>>>>>>
>>>>>>>> while (vq->avail_ring_not_empty()) {
>>>>>>>> - auto page = memory::alloc_page();
>>>>>>>> + //auto page = memory::alloc_page();
>>>>>>>> + auto page = malloc(16 * memory::page_size);
>>>>>>>>
>>>>>>>> vq->init_sg();
>>>>>>>> - vq->add_in_sg(page, memory::page_size);
>>>>>>>> + vq->add_in_sg(page, memory::page_size * 16);
>>>>>>>> if (!vq->add_buf(page)) {
>>>>>>>> - memory::free_page(page);
>>>>>>>> + //memory::free_page(page);
>>>>>>>> + free(page);
>>>>>>>> break;
>>>>>>>> }
>>>>>>>> added++;
>>>>>>>> }
>>>>>>>> + printf("net: Allocated %d pages\n", added * 16);
>>>>>>>>
>>>>>>>> trace_virtio_net_fill_rx_ring_added(_ifn->if_index, added);
>>>>>>>>
>>>>>>>>
>>>>>>>> But for sure it is just a hack. I am not sure if we should actually
>>>>>>>> allocate 16 pages in one shot (which I am doing here) vs create single
>>>>>>>> chained buffer made of 16 pages. Not sure how we should extract data
>>>>>>>> if
>>>>>>>> chained.
>>>>>>>>
>>>>>>>> I have also found this (based on a comment in firecracker code) -
>>>>>>>> https://bugs.chromium.org/p/chromium/issues/detail?id=753630. As
>>>>>>>> you can see VIRTIO_NET_F_MRG_RXBUF is much more memory efficient and
>>>>>>>> flexible which is what QEMU implements.
>>>>>>>>
>>>>>>>> I am interested in what others think how we should handle this
>>>>>>>> properly.
>>>>>>>>
>>>>>>>> Either way I think it would not hurt creating an issue against
>>>>>>>> Firecracker to ask supporting VIRTIO_NET_F_MRG_RXBUF.
>>>>>>>>
>>>>>>>> Waldek
>>>>>>>>
>>>>>>>> On Thursday, September 19, 2019 at 6:59:22 PM UTC-4, Henrique
>>>>>>>> Fingler wrote:
>>>>>>>>>
>>>>>>>>> I'm trying to check if it works on qemu, but scripts/run and
>>>>>>>>> capstan run set the network differently than Firecracker's script.
>>>>>>>>> With the regular user networking (no "-n") it works. When I try
>>>>>>>>> running it with with "-n -b br0" or just "-n" the execution hangs
>>>>>>>>> after
>>>>>>>>> printing OSv version.
>>>>>>>>>
>>>>>>>>> I'm trying to manually hack the allocation of a single but larger
>>>>>>>>> size for the receive queue and disabling VIRTIO_NET_F_MRG_RXBUF
>>>>>>>>> on the driver just to check what Firecracker does, but it seems that
>>>>>>>>> during
>>>>>>>>> compilation a qemu instance of the unikernel is launched. Is this a
>>>>>>>>> test?
>>>>>>>>> Can this be disabled?
>>>>>>>>>
>>>>>>>>> Also, is there a way to find which hypervisor OSv is running on
>>>>>>>>> top of? This would help switching between feature sets in virtio-net.
>>>>>>>>>
>>>>>>>>> Thanks!
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thursday, September 19, 2019 at 11:02:53 AM UTC-5, Waldek
>>>>>>>>> Kozaczuk wrote:
>>>>>>>>>>
>>>>>>>>>> Most likely it is a bug on OSv side. It could be in the
>>>>>>>>>> virtio-net features negotiation logic -
>>>>>>>>>> https://github.com/cloudius-systems/osv/blob/master/drivers/virtio-net.cc#L351-L378
>>>>>>>>>> or
>>>>>>>>>> https://github.com/cloudius-systems/osv/blob/master/drivers/virtio-net.cc#L283-L297
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>>> I also saw this comment in firecracker code -
>>>>>>>>>> https://github.com/firecracker-microvm/firecracker/blob/master/devices/src/virtio/net.rs#L153-L154
>>>>>>>>>> -
>>>>>>>>>> which seems to indicate that VIRTIO_NET_F_MRG_RXBUF is NOT
>>>>>>>>>> supported by firecracker -
>>>>>>>>>> https://github.com/firecracker-microvm/firecracker/blob/f123988affa8f25683a7c26f7a48dd76e839a796/devices/src/virtio/net.rs#L705-L711
>>>>>>>>>> ?
>>>>>>>>>>
>>>>>>>>>> This section of VirtIO spec would apply then:
>>>>>>>>>>
>>>>>>>>>> "5.1.6.3.1 Driver Requirements: Setting Up Receive Buffers
>>>>>>>>>>
>>>>>>>>>> - If VIRTIO_NET_F_MRG_RXBUF is not negotiated:
>>>>>>>>>> - If VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6 or
>>>>>>>>>> VIRTIO_NET_F_GUEST_UFO are negotiated, the driver SHOULD
>>>>>>>>>> populate the
>>>>>>>>>> receive queue(s) with buffers of at least 65562 bytes.
>>>>>>>>>> - Otherwise, the driver SHOULD populate the receive
>>>>>>>>>> queue(s) with buffers of at least 1526 bytes.
>>>>>>>>>> - If VIRTIO_NET_F_MRG_RXBUF is negotiated, each buffer MUST
>>>>>>>>>> be at greater than the size of the struct virtio_net_hdr."
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> This makes me think that our receive buffers are only 1 page
>>>>>>>>>> (4096 bytes) large so whenever Firecracker tries to send a buffer
>>>>>>>>>> bigger
>>>>>>>>>> than that OSv bounces. Think this OSv code applies -
>>>>>>>>>> https://github.com/cloudius-systems/osv/blob/master/drivers/virtio-net.cc#L587-L609.
>>>>>>>>>>
>>>>>>>>>> It seems the virtio ring buffers are alway 1 page big - see
>>>>>>>>>> alloc_page
>>>>>>>>>> call.
>>>>>>>>>>
>>>>>>>>>> So maybe on OSv side we need to allow for bigger buffers (64K)
>>>>>>>>>> when VIRTIO_NET_F_MRG_RXBUF is off which would require changes
>>>>>>>>>> to drivers/virtio-vring.cc. I wonder if on QEMU this feature is
>>>>>>>>>> on and that is why we never see this issue of QEMU, do we? It would
>>>>>>>>>> be nice
>>>>>>>>>> to run same Python program in qemu and see if VIRTIO_NET_F_MRG_RXBUF
>>>>>>>>>> is on or off.
>>>>>>>>>>
>>>>>>>>>> This is all my speculation and I might be off so maybe others can
>>>>>>>>>> shed more light on it.
>>>>>>>>>>
>>>>>>>>>> Waldek
>>>>>>>>>>
>>>>>>>>>> On Thursday, September 19, 2019 at 12:09:19 AM UTC-4, Henrique
>>>>>>>>>> Fingler wrote:
>>>>>>>>>>>
>>>>>>>>>>> How do I go about disabling GSO?
>>>>>>>>>>> I think I found how to disable TSO (diff below), but I can't
>>>>>>>>>>> find where to disable GSO. Disabling just TSO didn't fix it.
>>>>>>>>>>>
>>>>>>>>>>> The loop where Firecracker gets stuck (fn rx_single_frame)
>>>>>>>>>>> tries to write an entire frame (7318 bytes) and it notices it
>>>>>>>>>>> doesn't fit
>>>>>>>>>>> into all the descriptors of the guest.
>>>>>>>>>>> It seems that if it fails to write the entire frame, it marks
>>>>>>>>>>> descriptors as used, but retries to deliver the whole frame again.
>>>>>>>>>>> Maybe
>>>>>>>>>>> the OSv buffer isn't big enough and FC just loops forever?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> virtio-net.cc:
>>>>>>>>>>>
>>>>>>>>>>> | (1 << VIRTIO_NET_F_STATUS) \
>>>>>>>>>>> | (1 << VIRTIO_NET_F_CSUM) \
>>>>>>>>>>> | (1 << VIRTIO_NET_F_GUEST_CSUM) \
>>>>>>>>>>> - | (1 << VIRTIO_NET_F_GUEST_TSO4) \
>>>>>>>>>>> + | (0 << VIRTIO_NET_F_GUEST_TSO4) \
>>>>>>>>>>> | (1 << VIRTIO_NET_F_HOST_ECN) \
>>>>>>>>>>> - | (1 << VIRTIO_NET_F_HOST_TSO4) \
>>>>>>>>>>> + | (0 << VIRTIO_NET_F_HOST_TSO4) \
>>>>>>>>>>> | (1 << VIRTIO_NET_F_GUEST_ECN)
>>>>>>>>>>> | (1 << VIRTIO_NET_F_GUEST_UFO)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks!
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, September 18, 2019 at 8:23:21 PM UTC-5, Asias He
>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Sep 19, 2019 at 7:06 AM Henrique Fingler <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> First of all, thank you for being active and helping out
>>>>>>>>>>>>> users!
>>>>>>>>>>>>>
>>>>>>>>>>>>> Here's my setup: I'm building a python3 image, with a script
>>>>>>>>>>>>> that does
>>>>>>>>>>>>>
>>>>>>>>>>>>> * response = urllib.request.urlopen("http://<a 1mb file>")*
>>>>>>>>>>>>>
>>>>>>>>>>>>> The execution just hangs for a few seconds, then a storm of
>>>>>>>>>>>>> warnings from Firecracker show up:
>>>>>>>>>>>>>
>>>>>>>>>>>>> <A lot of the same warning>
>>>>>>>>>>>>> 2019-09-18T17:50:36.841517975
>>>>>>>>>>>>> [anonymous-instance:WARN:devices/src/virtio/net.rs:257]
>>>>>>>>>>>>> Receiving buffer is too small to hold frame of current size
>>>>>>>>>>>>> 2019-09-18T17:50:36.841529410
>>>>>>>>>>>>> [anonymous-instance:WARN:devices/src/virtio/net.rs:257]
>>>>>>>>>>>>> Receiving buffer is too small to hold frame of current size
>>>>>>>>>>>>> 2019-09-18T17:50:36.841569665
>>>>>>>>>>>>> [anonymous-instance:WARN:devices/src/virtio/net.rs:257]
>>>>>>>>>>>>> Receiving buffer is too small to hold frame of current size
>>>>>>>>>>>>> 2019-09-18T17:50:36.841584097
>>>>>>>>>>>>> [anonymous-instance:WARN:devices/src/virtio/net.rs:257]
>>>>>>>>>>>>> Receiving buffer is too small to hold frame of current size
>>>>>>>>>>>>> 2019-09-18T17:50:36.841656060
>>>>>>>>>>>>> [anonymous-instance:WARN:devices/src/virtio/net.rs:257]
>>>>>>>>>>>>> Receiving buffer is too small to hold frame of current size
>>>>>>>>>>>>>
>>>>>>>>>>>>> This is coming from here:
>>>>>>>>>>>>> https://github.com/firecracker-microvm/firecracker/blob/master/devices/src/virtio/net.rs
>>>>>>>>>>>>>
>>>>>>>>>>>>> If the file is smaller, let's say 256B, it works fine
>>>>>>>>>>>>>
>>>>>>>>>>>>> Could this be a bug in the virtio implementation of OSv or is
>>>>>>>>>>>>> it a Firecraker thing?
>>>>>>>>>>>>> I'll start to investigate the issue. I'm asking because you
>>>>>>>>>>>>> might have seen this problem.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Try disable gso/tso in osv viriot-net driver.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks!
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>>>>> Google Groups "OSv Development" group.
>>>>>>>>>>>>> To unsubscribe from this group and stop receiving emails from
>>>>>>>>>>>>> it, send an email to [email protected].
>>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>> https://groups.google.com/d/msgid/osv-dev/965f0cad-d074-4b18-b998-ffe5777851a2%40googlegroups.com
>>>>>>>>>>>>>
>>>>>>>>>>>>> <https://groups.google.com/d/msgid/osv-dev/965f0cad-d074-4b18-b998-ffe5777851a2%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>> .
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Asias
>>>>>>>>>>>>
>>>>>>>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "OSv Development" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/osv-dev/64ae1bcf-9506-4a52-8ca6-4b0921981f9f%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/osv-dev/64ae1bcf-9506-4a52-8ca6-4b0921981f9f%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "OSv Development" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/osv-dev/InlSKnJAfMQ/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/osv-dev/CA%2B3q14xYSikYznw1iCkxtO0%2BRqmcrUirShVU-e1_Pwpp3Zd1yw%40mail.gmail.com
>>>
>>> <https://groups.google.com/d/msgid/osv-dev/CA%2B3q14xYSikYznw1iCkxtO0%2BRqmcrUirShVU-e1_Pwpp3Zd1yw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
--
You received this message because you are subscribed to the Google Groups "OSv
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/osv-dev/ae21cb99-1106-4dc9-bae4-55be207ae989%40googlegroups.com.