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.

Reply via email to