Did you try my latest patch from Friday that also frees memory?

On Sun, Oct 6, 2019 at 14:14 Henrique Fingler <[email protected]> wrote:

>  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 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/ae21cb99-1106-4dc9-bae4-55be207ae989%40googlegroups.com
> <https://groups.google.com/d/msgid/osv-dev/ae21cb99-1106-4dc9-bae4-55be207ae989%40googlegroups.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/CAL9cFfPTD-y-uop1gExnoz5sveYbawpnPNUKEQa5NC3wmpKObw%40mail.gmail.com.

Reply via email to